librime 1.2
Rime Input Method Engine, the core library
config_types.h
Go to the documentation of this file.
1//
2// Copyright RIME Developers
3// Distributed under the BSD License
4//
5// 2011-4-6 Zou xu <zouivex@gmail.com>
6//
7#ifndef RIME_CONFIG_TYPES_H_
8#define RIME_CONFIG_TYPES_H_
9
10#include <type_traits>
11#include <rime_api.h>
12#include <rime/common.h>
13
14namespace rime {
15
16// config item base class
18 public:
20
21 ConfigItem() = default; // null
22 virtual ~ConfigItem() = default;
23
24 ValueType type() const { return type_; }
25
26 virtual bool empty() const { return type_ == kNull; }
27
28 protected:
30
32};
33
34class ConfigValue : public ConfigItem {
35 public:
37 RIME_DLL ConfigValue(bool value);
38 RIME_DLL ConfigValue(int value);
39 RIME_DLL ConfigValue(double value);
40 RIME_DLL ConfigValue(const char* value);
41 RIME_DLL ConfigValue(const string& value);
42
43 // schalar value accessors
44 bool GetBool(bool* value) const;
45 RIME_DLL bool GetInt(int* value) const;
46 bool GetDouble(double* value) const;
47 RIME_DLL bool GetString(string* value) const;
48 bool SetBool(bool value);
49 bool SetInt(int value);
50 bool SetDouble(double value);
51 bool SetString(const char* value);
52 bool SetString(const string& value);
53
54 const string& str() const { return value_; }
55
56 bool empty() const override { return value_.empty(); }
57
58 protected:
59 string value_;
60};
61
62class ConfigList : public ConfigItem {
63 public:
64 using Sequence = vector<of<ConfigItem>>;
65 using Iterator = Sequence::iterator;
66
68 RIME_DLL an<ConfigItem> GetAt(size_t i) const;
69 RIME_DLL an<ConfigValue> GetValueAt(size_t i) const;
70 RIME_DLL bool SetAt(size_t i, an<ConfigItem> element);
71 bool Insert(size_t i, an<ConfigItem> element);
72 RIME_DLL bool Append(an<ConfigItem> element);
73 bool Resize(size_t size);
74 RIME_DLL bool Clear();
75 RIME_DLL size_t size() const;
76
78 Iterator end();
79
80 bool empty() const override { return seq_.empty(); }
81
82 protected:
84};
85
86// limitation: map keys have to be strings, preferably alphanumeric
87class ConfigMap : public ConfigItem {
88 public:
89 using Map = map<string, an<ConfigItem>>;
90 using Iterator = Map::iterator;
91
93 RIME_DLL bool HasKey(const string& key) const;
94 RIME_DLL an<ConfigItem> Get(const string& key) const;
95 RIME_DLL an<ConfigValue> GetValue(const string& key) const;
96 RIME_DLL bool Set(const string& key, an<ConfigItem> element);
97 bool Clear();
98
100 Iterator end();
101
102 bool empty() const override { return map_.empty(); }
103
104 protected:
106};
107
108namespace {
109
110template <class T>
111an<ConfigItem> AsConfigItem(const T& x, const std::false_type&) {
112 return New<ConfigValue>(x);
113};
114
115template <class T>
116an<ConfigItem> AsConfigItem(const T& x, const std::true_type&) {
117 return x;
118};
119
120} // namespace
121
122class ConfigData;
125
127 public:
129 virtual ~ConfigItemRef() = default;
130 operator an<ConfigItem>() const { return GetItem(); }
131 an<ConfigItem> operator*() const { return GetItem(); }
132 template <class T>
134 SetItem(AsConfigItem(x, std::is_convertible<T, an<ConfigItem>>()));
135 return *this;
136 }
137 ConfigListEntryRef operator[](size_t index);
138 ConfigMapEntryRef operator[](const string& key);
139
140 RIME_DLL bool IsNull() const;
141 bool IsValue() const;
142 RIME_DLL bool IsList() const;
143 bool IsMap() const;
144
145 RIME_DLL bool ToBool() const;
146 RIME_DLL int ToInt() const;
147 double ToDouble() const;
148 RIME_DLL string ToString() const;
149
152 RIME_DLL void Clear();
153
154 // list
155 RIME_DLL bool Append(an<ConfigItem> item);
156 RIME_DLL size_t size() const;
157 // map
158 RIME_DLL bool HasKey(const string& key) const;
159
160 RIME_DLL bool modified() const;
161 RIME_DLL void set_modified();
162
163 protected:
164 virtual an<ConfigItem> GetItem() const = 0;
165 virtual void SetItem(an<ConfigItem> item) = 0;
166
168};
169
171 public:
173 : ConfigItemRef(data), list_(list), index_(index) {}
174 using ConfigItemRef::operator=;
175
176 protected:
177 an<ConfigItem> GetItem() const { return list_->GetAt(index_); }
179 list_->SetAt(index_, item);
180 set_modified();
181 }
182
183 private:
184 an<ConfigList> list_;
185 size_t index_;
186};
187
189 public:
190 ConfigMapEntryRef(ConfigData* data, an<ConfigMap> map, const string& key)
191 : ConfigItemRef(data), map_(map), key_(key) {}
192 using ConfigItemRef::operator=;
193
194 protected:
195 an<ConfigItem> GetItem() const { return map_->Get(key_); }
197 map_->Set(key_, item);
198 set_modified();
199 }
200
201 private:
202 an<ConfigMap> map_;
203 string key_;
204};
205
207 return ConfigListEntryRef(data_, AsList(), index);
208}
209
211 return ConfigMapEntryRef(data_, AsMap(), key);
212}
213
214} // namespace rime
215
216#endif // RIME_CONFIG_TYPES_H_
#define RIME_DLL
Definition rime_api.h:33
Definition algebra.cc:12
std::shared_ptr< T > an
Definition common.h:60
an< T > New(Args &&... args)
Definition common.h:77
Definition config_data.h:17
ValueType type() const
Definition config_types.h:24
virtual bool empty() const
Definition config_types.h:26
ValueType
Definition config_types.h:19
@ kMap
Definition config_types.h:19
@ kList
Definition config_types.h:19
@ kNull
Definition config_types.h:19
@ kScalar
Definition config_types.h:19
ValueType type_
Definition config_types.h:31
ConfigItem(ValueType type)
Definition config_types.h:29
virtual ~ConfigItem()=default
ConfigItem()=default
bool SetBool(bool value)
Definition config_types.cc:88
RIME_DLL bool GetInt(int *value) const
Definition config_types.cc:49
bool GetDouble(double *value) const
Definition config_types.cc:70
bool SetInt(int value)
Definition config_types.cc:93
bool GetBool(bool *value) const
Definition config_types.cc:34
const string & str() const
Definition config_types.h:54
RIME_DLL bool GetString(string *value) const
Definition config_types.cc:81
bool SetString(const char *value)
Definition config_types.cc:103
ConfigValue()
Definition config_types.h:36
bool empty() const override
Definition config_types.h:56
bool SetDouble(double value)
Definition config_types.cc:98
string value_
Definition config_types.h:59
RIME_DLL an< ConfigValue > GetValueAt(size_t i) const
Definition config_types.cc:122
Iterator begin()
Definition config_types.cc:160
RIME_DLL bool Append(an< ConfigItem > element)
Definition config_types.cc:141
bool Insert(size_t i, an< ConfigItem > element)
Definition config_types.cc:133
Sequence seq_
Definition config_types.h:83
RIME_DLL size_t size() const
Definition config_types.cc:156
bool empty() const override
Definition config_types.h:80
RIME_DLL bool Clear()
Definition config_types.cc:151
vector< of< ConfigItem > > Sequence
Definition config_types.h:64
Iterator end()
Definition config_types.cc:164
ConfigList()
Definition config_types.h:67
Sequence::iterator Iterator
Definition config_types.h:65
RIME_DLL bool SetAt(size_t i, an< ConfigItem > element)
Definition config_types.cc:126
bool Resize(size_t size)
Definition config_types.cc:146
RIME_DLL an< ConfigItem > GetAt(size_t i) const
Definition config_types.cc:115
Iterator end()
Definition config_types.cc:200
Iterator begin()
Definition config_types.cc:196
map< string, an< ConfigItem > > Map
Definition config_types.h:89
Map::iterator Iterator
Definition config_types.h:90
bool Clear()
Definition config_types.cc:191
Map map_
Definition config_types.h:105
bool empty() const override
Definition config_types.h:102
RIME_DLL an< ConfigValue > GetValue(const string &key) const
Definition config_types.cc:182
ConfigMap()
Definition config_types.h:92
RIME_DLL bool HasKey(const string &key) const
Definition config_types.cc:170
RIME_DLL an< ConfigItem > Get(const string &key) const
Definition config_types.cc:174
RIME_DLL bool Set(const string &key, an< ConfigItem > element)
Definition config_types.cc:186
virtual ~ConfigItemRef()=default
ConfigItemRef & operator=(const T &x)
Definition config_types.h:133
RIME_DLL void Clear()
Definition config_types.cc:272
ConfigListEntryRef operator[](size_t index)
Definition config_types.h:206
virtual an< ConfigItem > GetItem() const =0
RIME_DLL bool HasKey(const string &key) const
Definition config_types.cc:289
an< ConfigItem > operator*() const
Definition config_types.h:131
RIME_DLL void set_modified()
Definition config_types.cc:298
RIME_DLL an< ConfigList > AsList()
Definition config_types.cc:258
RIME_DLL bool Append(an< ConfigItem > item)
Definition config_types.cc:276
RIME_DLL bool IsNull() const
Definition config_types.cc:206
double ToDouble() const
Definition config_types.cc:242
RIME_DLL an< ConfigMap > AsMap()
Definition config_types.cc:265
bool IsMap() const
Definition config_types.cc:221
bool IsValue() const
Definition config_types.cc:211
RIME_DLL string ToString() const
Definition config_types.cc:250
RIME_DLL bool modified() const
Definition config_types.cc:294
RIME_DLL size_t size() const
Definition config_types.cc:284
ConfigItemRef(ConfigData *data)
Definition config_types.h:128
ConfigData * data_
Definition config_types.h:167
RIME_DLL bool IsList() const
Definition config_types.cc:216
virtual void SetItem(an< ConfigItem > item)=0
RIME_DLL int ToInt() const
Definition config_types.cc:234
RIME_DLL bool ToBool() const
Definition config_types.cc:226
Definition config_types.h:170
ConfigListEntryRef(ConfigData *data, an< ConfigList > list, size_t index)
Definition config_types.h:172
an< ConfigItem > GetItem() const
Definition config_types.h:177
void SetItem(an< ConfigItem > item)
Definition config_types.h:178
Definition config_types.h:188
ConfigMapEntryRef(ConfigData *data, an< ConfigMap > map, const string &key)
Definition config_types.h:190
an< ConfigItem > GetItem() const
Definition config_types.h:195
void SetItem(an< ConfigItem > item)
Definition config_types.h:196