-
Notifications
You must be signed in to change notification settings - Fork 1
/
singleton.h
109 lines (90 loc) · 2.03 KB
/
singleton.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <boost/lexical_cast.hpp>
#include <vector>
class Database
{
public:
virtual int get_population(const std::string& name) = 0;
};
class SingletonDatabase : public Database
{
SingletonDatabase()
{
std::cout << "Initializing database" << std::endl;
std::ifstream ifs("capitals.txt");
std::string s, s2;
while (getline(ifs, s))
{
getline(ifs, s2);
int pop = boost::lexical_cast<int>(s2);
capitals[s] = pop;
}
//instance_count++;
}
std::map<std::string, int> capitals;
public:
//static int instance_count;
SingletonDatabase(SingletonDatabase const&) = delete;
void operator=(SingletonDatabase const&) = delete;
static SingletonDatabase& get()
{
static SingletonDatabase db;
return db;
}
int get_population(const std::string& name) override
{
return capitals[name];
}
/*
static SingletonDatabase* get_instance()
{
if (!instance)
instance = new SingletonDatabase;
return instance; // atexit
}
*/
};
//int SingletonDatabase::instance_count = 0;
class DummyDatabase : public Database
{
std::map<std::string, int> capitals;
public:
DummyDatabase()
{
capitals["alpha"] = 1;
capitals["beta"] = 2;
capitals["gamma"] = 3;
}
int get_population(const std::string& name) override {
return capitals[name];
}
};
struct SingletonRecordFinder
{
int total_population(std::vector<std::string> names)
{
int result = 0;
for (auto& name : names)
result += SingletonDatabase::get().get_population(name);
return result;
}
};
struct ConfigurableRecordFinder
{
explicit ConfigurableRecordFinder(Database& db)
: db{db}
{
}
int total_population(std::vector<std::string> names) const
{
int result = 0;
for (auto& name : names)
result += db.get_population(name);
return result;
}
Database& db;
};