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
|
#include <cassert>
#include <algorithm>
#include "imi_option_event.h"
COptionEvent::variant_::variant_(int v)
: type(VAL_INTEGER)
{
data.d_int = v;
}
COptionEvent::variant_::variant_(const std::string& v)
: type(VAL_STRING)
{
data.d_string = v;
}
COptionEvent::variant_::variant_(const std::vector<std::string>& v)
: type(VAL_STRING_LIST)
{
data.d_strings = v;
}
COptionEvent::variant_::variant_(const std::vector<string_pair>& v)
: type(VAL_STRING_PAIR_LIST)
{
data.d_string_pair_list = v;
}
COptionEvent::variant_::variant_(bool v)
: type(VAL_BOOL)
{
data.d_bool = v;
}
int
COptionEvent::get_int() const
{
return value.data.d_int;
}
bool
COptionEvent::get_bool() const
{
return value.data.d_bool;
}
std::string
COptionEvent::get_string() const
{
return value.data.d_string;
}
std::vector<std::string>
COptionEvent::get_string_list() const
{
return value.data.d_strings;
}
std::vector<string_pair>
COptionEvent::get_string_pair_list() const
{
return value.data.d_string_pair_list;
}
IConfigurable::IConfigurable()
{
AOptionEventBus::instance().registerAsListener(this);
}
IConfigurable::~IConfigurable()
{
AOptionEventBus::instance().unregisterAsListener(this);
}
void
COptionEventBus::registerAsListener(IConfigurable* listener)
{
Subscribers::iterator found = find(m_listeners.begin(),
m_listeners.end(),
listener);
if (found == m_listeners.end())
m_listeners.push_back(listener);
else
assert(false && "already subscribed");
}
void
COptionEventBus::unregisterAsListener(IConfigurable* listener)
{
Subscribers::iterator found = find(m_listeners.begin(),
m_listeners.end(),
listener);
if (found != m_listeners.end())
m_listeners.erase(found);
else
assert(false && "not yet subscribed");
}
void
COptionEventBus::publishEvent(const COptionEvent& event)
{
Subscribers::iterator end = m_listeners.end();
for (Subscribers::iterator it = m_listeners.begin();
it != end; ++it) {
if ((*it)->onConfigChanged(event))
break;
}
}
|