AM Daemon ライブラリリファレンス
JsonTree.h
[詳解]
1 /// @file
2 /// @brief JSONツリーを作成するためのクラス JsonTree のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_JSONTREE_H
7 #define AMDAEMON_UTIL_JSONTREE_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <type_traits>
12 #include <functional>
13 #include <memory>
14 #include <string>
15 #include <locale>
16 #include <sstream>
17 #include <cstdint>
18 
19 namespace amdaemon
20 {
21 namespace util
22 {
23  // 前方宣言
24  struct JsonValue;
25  class JsonArrayAdder;
26  class JsonObjectAdder;
27 
28  /// @brief JSON配列への要素追加処理を提供する抽象クラス。
29  /// @ingroup g_util g_dump
31  {
32  public:
33  /// コンストラクタ。
35 
36  /// デストラクタ。
37  virtual ‾JsonArrayAdder() { }
38 
39  /// @brief 文字列値を追加する。
40  /// @param[in] value 文字列値。
41  void addValue(const wchar_t* value);
42 
43  /// @brief 文字列値を追加する。
44  /// @tparam Traits 文字特性型。
45  /// @tparam Alloc アロケータ型。
46  /// @param[in] value 文字列値。
47  template<class Traits, class Alloc>
48  void addValue(const std::basic_string<wchar_t, Traits, Alloc>& value)
49  {
50  addValue(value.c_str());
51  }
52 
53  /// @brief 文字列値を追加する。
54  /// @param[in] value 文字列値。
55  /// @param[in] loc ロケール。
56  void addValue(const char* value, const std::locale& loc = std::locale());
57 
58  /// @brief 文字列値を追加する。
59  /// @tparam Traits 文字特性型。
60  /// @tparam Alloc アロケータ型。
61  /// @param[in] value 文字列値。
62  /// @param[in] loc ロケール。
63  template<class Traits, class Alloc>
64  void addValue(
65  const std::basic_string<char, Traits, Alloc>& value,
66  const std::locale& loc = std::locale())
67  {
68  addValue(value.c_str(), loc);
69  }
70 
71  /// @brief 真偽値を追加する。
72  /// @param[in] value 真偽値。
73  void addValue(bool value);
74 
75  /// nullptr 値を追加する。
76  void addValue(std::nullptr_t);
77 
78  /// @brief 整数値を追加する。
79  /// @tparam T 整数型。
80  /// @param[in] value 整数値。
81  template<class T>
82  auto addValue(const T& value)
83  -> typename std::enable_if<std::is_integral<T>::value>::type
84  {
85  addDirectValue(std::to_wstring(value).c_str());
86  }
87 
88  /// @brief float 値を追加する。
89  /// @param[in] value float 値。
90  ///
91  /// value が非数値の場合は、その値を表す文字列値が追加される。
92  void addValue(float value);
93 
94  /// @brief double 値を追加する。
95  /// @param[in] value double 値。
96  ///
97  /// value が非数値の場合は、その値を表す文字列値が追加される。
98  void addValue(double value);
99 
100  /// @brief 任意の値を文字列化して追加する。
101  /// @tparam T 値型。
102  /// @param[in] value 値。
103  template<class T>
104  auto addValue(const T& value)
105  -> typename std::enable_if<!std::is_arithmetic<T>::value>::type
106  {
107  std::wostringstream ss;
108  ss << value;
109  addValue(ss.str().c_str());
110  }
111 
112  /// @brief 配列値を追加する。
113  /// @param[in] addFunc 配列要素の追加を行う関数。
114  void addArray(std::function<void (JsonArrayAdder&)> addFunc);
115 
116  /// @brief オブジェクト値を追加する。
117  /// @param[in] addFunc オブジェクト要素の追加を行う関数。
118  void addObject(std::function<void (JsonObjectAdder&)> addFunc);
119 
120  protected:
121  /// @brief JSON値を追加する。
122  /// @param[in] value JSON値。
123  virtual void addValue(JsonValue value) = 0;
124 
125  private:
126  /// @brief 直値を追加する。
127  /// @param[in] value 直値。
128  void addDirectValue(const wchar_t* value);
129  };
130 
131  /// @brief JSONオブジェクトへの要素追加処理を提供する抽象クラス。
132  /// @ingroup g_util g_dump
134  {
135  public:
136  /// コンストラクタ。
138 
139  /// デストラクタ。
140  virtual ‾JsonObjectAdder() { }
141 
142  /// @brief 文字列値を追加する。
143  /// @param[in] name 要素名。
144  /// @param[in] value 文字列値。
145  void addValue(const wchar_t* name, const wchar_t* value);
146 
147  /// @brief 文字列値を追加する。
148  /// @tparam Traits 文字特性型。
149  /// @tparam Alloc アロケータ型。
150  /// @param[in] name 要素名。
151  /// @param[in] value 文字列値。
152  template<class Traits, class Alloc>
153  void addValue(
154  const wchar_t* name,
155  const std::basic_string<wchar_t, Traits, Alloc>& value)
156  {
157  addValue(name, value.c_str());
158  }
159 
160  /// @brief 文字列値を追加する。
161  /// @param[in] name 要素名。
162  /// @param[in] value 文字列値。
163  /// @param[in] loc ロケール。
164  void addValue(
165  const wchar_t* name,
166  const char* value,
167  const std::locale& loc = std::locale());
168 
169  /// @brief 文字列値を追加する。
170  /// @tparam Traits 文字特性型。
171  /// @tparam Alloc アロケータ型。
172  /// @param[in] name 要素名。
173  /// @param[in] value 文字列値。
174  /// @param[in] loc ロケール。
175  template<class Traits, class Alloc>
176  void addValue(
177  const wchar_t* name,
178  const std::basic_string<char, Traits, Alloc>& value,
179  const std::locale& loc = std::locale())
180  {
181  addValue(name, value.c_str(), loc);
182  }
183 
184  /// @brief 真偽値を追加する。
185  /// @param[in] name 要素名。
186  /// @param[in] value 真偽値。
187  void addValue(const wchar_t* name, bool value);
188 
189  /// @brief nullptr 値を追加する。
190  /// @param[in] name 要素名。
191  void addValue(const wchar_t* name, std::nullptr_t);
192 
193  /// @brief 整数値を追加する。
194  /// @tparam T 整数型。
195  /// @param[in] name 要素名。
196  /// @param[in] value 整数値。
197  template<class T>
198  auto addValue(const wchar_t* name, const T& value)
199  -> typename std::enable_if<std::is_integral<T>::value>::type
200  {
201  addDirectValue(name, std::to_wstring(value).c_str());
202  }
203 
204  /// @brief float 値を追加する。
205  /// @param[in] name 要素名。
206  /// @param[in] value float 値。
207  ///
208  /// value が非数値の場合は、その値を表す文字列値が追加される。
209  void addValue(const wchar_t* name, float value);
210 
211  /// @brief double 値を追加する。
212  /// @param[in] name 要素名。
213  /// @param[in] value double 値。
214  ///
215  /// value が非数値の場合は、その値を表す文字列値が追加される。
216  void addValue(const wchar_t* name, double value);
217 
218  /// @brief 任意の値を文字列化して追加する。
219  /// @tparam T 値型。
220  /// @param[in] name 要素名。
221  /// @param[in] value 値。
222  template<class T>
223  auto addValue(const wchar_t* name, const T& value)
224  -> typename std::enable_if<!std::is_arithmetic<T>::value>::type
225  {
226  std::wostringstream ss;
227  ss << value;
228  addValue(name, ss.str().c_str());
229  }
230 
231  /// @brief 配列値を追加する。
232  /// @param[in] name 要素名。
233  /// @param[in] addFunc 配列要素の追加を行う関数。
234  void addArray(const wchar_t* name, std::function<void (JsonArrayAdder&)> addFunc);
235 
236  /// @brief オブジェクト値を追加する。
237  /// @param[in] name 要素名。
238  /// @param[in] addFunc オブジェクト要素の追加を行う関数。
239  void addObject(const wchar_t* name, std::function<void (JsonObjectAdder&)> addFunc);
240 
241  protected:
242  /// @brief JSON値を追加する。
243  /// @param[in] name 要素名。
244  /// @param[in] value JSON値。
245  virtual void addValue(const wchar_t* name, JsonValue value) = 0;
246 
247  private:
248  /// @brief 直値を追加する。
249  /// @param[in] name 要素名。
250  /// @param[in] value 直値。
251  void addDirectValue(const wchar_t* name, const wchar_t* value);
252  };
253 
254  /// @brief JSONツリーを作成するためのクラス。
255  /// @ingroup g_util g_dump
256  class JsonTree : public JsonObjectAdder
257  {
258  public:
259  /// コンストラクタ。
260  JsonTree();
261 
262  /// @brief コピーコンストラクタ。
263  /// @param[in] src コピー元。
264  JsonTree(const JsonTree& src);
265 
266  /// @brief ムーブコンストラクタ。
267  /// @param[in] src ムーブ元。
268  JsonTree(JsonTree&& src);
269 
270  /// デストラクタ。
271 JsonTree();
272 
273  /// @brief コピー代入演算子のオーバロード。
274  /// @param[in] r 右辺値。
275  /// @return 自身の参照。
276  JsonTree& operator=(const JsonTree& r);
277 
278  /// @brief ムーブ代入演算子のオーバロード。
279  /// @param[in] r 右辺値。
280  /// @return 自身の参照。
281  JsonTree& operator=(JsonTree&& r);
282 
283  /// @brief 他のJSONツリーをぶら下げる。
284  /// @param[in] name 要素名。
285  /// @param[in] tree ぶら下げるJSONツリー。
286  /// @attention
287  /// あくまで現時点でのJSONツリーのコピーをぶら下げるのみであり、
288  /// 第2引数に渡したJSONツリーを変更しても追加先には反映されない。
289  void addTree(const wchar_t* name, const JsonTree& tree);
290 
291  /// @brief 他のJSONツリーをぶら下げる。
292  /// @param[in] name 要素名。
293  /// @param[in] tree ぶら下げるJSONツリー。
294  /// @attention
295  /// あくまで現時点でのJSONツリーのコピーをぶら下げるのみであり、
296  /// 第2引数に渡したJSONツリーを変更しても追加先には反映されない。
297  void addTree(const wchar_t* name, JsonTree&& tree);
298 
299  /// @brief JSON形式文字列を作成して追加する。
300  /// @param[in,out] str JSON形式文字列の追加先。
301  /// @param[in] indent インデントレベル。負数ならば整形しない。
302  void toString(std::wstring& str, std::int32_t indent = 0) const;
303 
304  /// @brief JSON形式文字列を作成して返す。
305  /// @param[in] indent インデントレベル。負数ならば整形しない。
306  /// @return JSON形式文字列。
307  std::wstring toString(std::int32_t indent = 0) const
308  {
309  std::wstring str;
310  toString(str, indent);
311  return str;
312  }
313 
314  private:
315  /// @brief JSON値を追加する。
316  /// @param[in] name 要素名。
317  /// @param[in] value JSON値。
318  void addValue(const wchar_t* name, JsonValue value) override;
319 
320  private:
321  struct Data;
322 
323  /// 内部データ。
324  std::unique_ptr<Data> _data;
325  };
326 } // namespace util
327 } // namespace amdaemon
328 
329 #endif // AMDAEMON_UTIL_JSONTREE_H
void addArray(std::function< void(JsonArrayAdder &)> addFunc)
配列値を追加する。
virtual ‾JsonObjectAdder()
デストラクタ。
Definition: JsonTree.h:140
void addValue(const std::basic_string< char, Traits, Alloc > &value, const std::locale &loc=std::locale())
文字列値を追加する。
Definition: JsonTree.h:64
JSONオブジェクトへの要素追加処理を提供する抽象クラス。
Definition: JsonTree.h:133
auto addValue(const wchar_t *name, const T &value) -> typename std::enable_if<!std::is_arithmetic< T >::value >::type
任意の値を文字列化して追加する。
Definition: JsonTree.h:223
std::wstring toString(std::int32_t indent=0) const
JSON形式文字列を作成して返す。
Definition: JsonTree.h:307
Daemonライブラリの環境定義を行うヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
JsonObjectAdder()
コンストラクタ。
Definition: JsonTree.h:137
const wchar_t * toString(AimeCommand command)
AimeCommand 列挙値の文字列表現値を取得する。
void addObject(std::function< void(JsonObjectAdder &)> addFunc)
オブジェクト値を追加する。
auto addValue(const wchar_t *name, const T &value) -> typename std::enable_if< std::is_integral< T >::value >::type
整数値を追加する。
Definition: JsonTree.h:198
void addValue(const wchar_t *name, const std::basic_string< wchar_t, Traits, Alloc > &value)
文字列値を追加する。
Definition: JsonTree.h:153
virtual ‾JsonArrayAdder()
デストラクタ。
Definition: JsonTree.h:37
JSON配列への要素追加処理を提供する抽象クラス。
Definition: JsonTree.h:30
auto addValue(const T &value) -> typename std::enable_if<!std::is_arithmetic< T >::value >::type
任意の値を文字列化して追加する。
Definition: JsonTree.h:104
JsonArrayAdder()
コンストラクタ。
Definition: JsonTree.h:34
JSONツリーを作成するためのクラス。
Definition: JsonTree.h:256
auto addValue(const T &value) -> typename std::enable_if< std::is_integral< T >::value >::type
整数値を追加する。
Definition: JsonTree.h:82
void addValue(const wchar_t *value)
文字列値を追加する。
void addValue(const wchar_t *name, const std::basic_string< char, Traits, Alloc > &value, const std::locale &loc=std::locale())
文字列値を追加する。
Definition: JsonTree.h:176
void addValue(const std::basic_string< wchar_t, Traits, Alloc > &value)
文字列値を追加する。
Definition: JsonTree.h:48