json_value.h
1 /*
2 ** UICore
3 ** Copyright (c) 1997-2015 The UICore Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries UICore may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Magnus Norddahl
27 */
28 
29 #pragma once
30 
31 #include <map>
32 #include <vector>
33 
34 namespace uicore
35 {
36  enum class JsonType
37  {
38  undefined,
39  null,
40  object,
41  array,
42  number,
43  boolean,
44  string
45  };
46 
47  class JsonValue
48  {
49  public:
50  static JsonValue undefined() { JsonValue v; v._type = JsonType::undefined; return v; }
51  static JsonValue null() { JsonValue v; v._type = JsonType::null; return v; }
52  static JsonValue object() { JsonValue v; v._type = JsonType::object; return v; }
53  static JsonValue array() { JsonValue v; v._type = JsonType::array; return v; }
54  static JsonValue number(double value) { JsonValue v; v._type = JsonType::number; v._number = value; return v; }
55  static JsonValue number(float value) { return JsonValue::number(static_cast<double>(value)); }
56  static JsonValue number(int value) { return JsonValue::number(static_cast<double>(value)); }
57  static JsonValue number(unsigned int value) { return JsonValue::number(static_cast<double>(value)); }
58  static JsonValue number(short value) { return JsonValue::number(static_cast<double>(value)); }
59  static JsonValue number(unsigned short value) { return JsonValue::number(static_cast<double>(value)); }
60  static JsonValue number(char value) { return JsonValue::number(static_cast<double>(value)); }
61  static JsonValue number(unsigned char value) { return JsonValue::number(static_cast<double>(value)); }
62  static JsonValue boolean(bool value) { JsonValue v; v._type = JsonType::boolean; v._boolean = value; return v; }
63  static JsonValue string(const std::string &value) { JsonValue v; v._type = JsonType::string; v._string = value; return v; }
64 
65  static JsonValue parse(const std::string &json);
66  std::string to_json() const;
67 
68  const JsonValue &prop(const std::string &name) const { auto it = _properties.find(name); if (it != _properties.end()) return it->second; static JsonValue undef; return undef; }
69  const JsonValue &prop(const char *name) const { auto it = _properties.find(name); if (it != _properties.end()) return it->second; static JsonValue undef; return undef; }
70  JsonValue &prop(const std::string &name) { return _properties[name]; }
71  JsonValue &prop(const char *name) { return _properties[name]; }
72 
73  void remove(const std::string &name) { auto it = _properties.find(name); if (it != _properties.end()) _properties.erase(it); }
74  void remove(const char *name) { auto it = _properties.find(name); if (it != _properties.end()) _properties.erase(it); }
75 
76  size_t size() const { return _items.size(); }
77  JsonValue &at(size_t index) { return _items.at(index); }
78  const JsonValue &at(size_t index) const { return _items.at(index); }
79  void erase(size_t offset, size_t length) { _items.erase(_items.begin() + offset, _items.begin() + offset + length); }
80 
81  void clear() { _items.clear(); _properties.clear(); }
82 
83  JsonType type() const { return _type; }
84  bool is_undefined() const { return type() == JsonType::undefined; }
85  bool is_null() const { return type() == JsonType::null; }
86  bool is_object() const { return type() == JsonType::object; }
87  bool is_array() const { return type() == JsonType::array; }
88  bool is_number() const { return type() == JsonType::number; }
89  bool is_boolean() const { return type() == JsonType::boolean; }
90 
91  std::map<std::string, JsonValue> &properties() { return _properties; }
92  const std::map<std::string, JsonValue> &properties() const { return _properties; }
93 
94  std::vector<JsonValue> &items() { return _items; }
95  const std::vector<JsonValue> &items() const { return _items; }
96 
97  double to_number() const { return _number; }
98  bool to_boolean() const { return _boolean; }
99  const std::string &to_string() const { return _string; }
100 
101  double to_double() const { return to_number(); }
102  float to_float() const { return static_cast<float>(to_number()); }
103  int to_int() const { return static_cast<int>(to_number()); }
104  unsigned int to_uint() const { return static_cast<unsigned int>(to_number()); }
105  short to_short() const { return static_cast<short>(to_number()); }
106  unsigned short to_ushort() const { return static_cast<unsigned short>(to_number()); }
107  char to_char() const { return static_cast<char>(to_number()); }
108  unsigned char to_uchar() const { return static_cast<unsigned char>(to_number()); }
109 
110  void set_undefined() { *this = JsonValue::undefined(); }
111  void set_null() { *this = JsonValue::null(); }
112  void set_object() { *this = JsonValue::object(); }
113  void set_array() { *this = JsonValue::array(); }
114  void set_string(const std::string &v) { *this = JsonValue::string(v); }
115  void set_string(const char *v) { *this = JsonValue::string(v); }
116  void set_number(double v) { *this = JsonValue::number(v); }
117  void set_number(float v) { *this = JsonValue::number(v); }
118  void set_number(int v) { *this = JsonValue::number(v); }
119  void set_number(unsigned int v) { *this = JsonValue::number(v); }
120  void set_number(short v) { *this = JsonValue::number(v); }
121  void set_number(unsigned short v) { *this = JsonValue::number(v); }
122  void set_number(char v) { *this = JsonValue::number(v); }
123  void set_number(unsigned char v) { *this = JsonValue::number(v); }
124  void set_boolean(bool v) { *this = JsonValue::boolean(v); }
125 
126  JsonValue &operator[](const std::string &name) { return prop(name); }
127  JsonValue &operator[](const char *name) { return prop(name); }
128  const JsonValue &operator[](const std::string &name) const { return prop(name); }
129  const JsonValue &operator[](const char *name) const { return prop(name); }
130 
131  JsonValue &operator[](size_t index) { return at(index); }
132  const JsonValue &operator[](size_t index) const { return at(index); }
133 
134  private:
136  std::vector<JsonValue> _items;
137  std::map<std::string, JsonValue> _properties;
138  std::string _string;
139  double _number = 0.0;
140  bool _boolean = false;
141  };
142 }
static JsonValue array()
Definition: json_value.h:53
const JsonValue & prop(const std::string &name) const
Definition: json_value.h:68
JsonValue & prop(const std::string &name)
Definition: json_value.h:70
const JsonValue & operator[](size_t index) const
Definition: json_value.h:132
static JsonValue number(int value)
Definition: json_value.h:56
static JsonValue object()
Definition: json_value.h:52
static JsonValue number(double value)
Definition: json_value.h:54
bool is_array() const
Definition: json_value.h:87
void clear()
Definition: json_value.h:81
size_t size() const
Definition: json_value.h:76
const JsonValue & operator[](const char *name) const
Definition: json_value.h:129
const JsonValue & operator[](const std::string &name) const
Definition: json_value.h:128
void set_number(double v)
Definition: json_value.h:116
void set_object()
Definition: json_value.h:112
unsigned int to_uint() const
Definition: json_value.h:104
unsigned char to_uchar() const
Definition: json_value.h:108
int to_int() const
Definition: json_value.h:103
bool is_number() const
Definition: json_value.h:88
Definition: json_value.h:47
static JsonValue undefined()
Definition: json_value.h:50
JsonValue & prop(const char *name)
Definition: json_value.h:71
float to_float() const
Definition: json_value.h:102
double to_number() const
Definition: json_value.h:97
void set_number(unsigned short v)
Definition: json_value.h:121
static JsonValue number(short value)
Definition: json_value.h:58
void set_number(char v)
Definition: json_value.h:122
void set_number(float v)
Definition: json_value.h:117
unsigned short to_ushort() const
Definition: json_value.h:106
std::vector< JsonValue > & items()
Definition: json_value.h:94
void set_number(unsigned int v)
Definition: json_value.h:119
static JsonValue null()
Definition: json_value.h:51
void set_number(unsigned char v)
Definition: json_value.h:123
void set_string(const std::string &v)
Definition: json_value.h:114
static JsonValue number(unsigned char value)
Definition: json_value.h:61
bool is_undefined() const
Definition: json_value.h:84
static JsonValue string(const std::string &value)
Definition: json_value.h:63
JsonValue & operator[](const std::string &name)
Definition: json_value.h:126
bool is_object() const
Definition: json_value.h:86
bool is_boolean() const
Definition: json_value.h:89
bool is_null() const
Definition: json_value.h:85
void set_array()
Definition: json_value.h:113
JsonType
Definition: json_value.h:36
void set_number(int v)
Definition: json_value.h:118
void set_string(const char *v)
Definition: json_value.h:115
short to_short() const
Definition: json_value.h:105
static JsonValue boolean(bool value)
Definition: json_value.h:62
const std::string & to_string() const
Definition: json_value.h:99
static JsonValue number(char value)
Definition: json_value.h:60
double to_double() const
Definition: json_value.h:101
const JsonValue & prop(const char *name) const
Definition: json_value.h:69
JsonValue & at(size_t index)
Definition: json_value.h:77
const std::map< std::string, JsonValue > & properties() const
Definition: json_value.h:92
std::string to_json() const
static JsonValue parse(const std::string &json)
void set_undefined()
Definition: json_value.h:110
void erase(size_t offset, size_t length)
Definition: json_value.h:79
bool to_boolean() const
Definition: json_value.h:98
void set_null()
Definition: json_value.h:111
JsonType type() const
Definition: json_value.h:83
static JsonValue number(unsigned int value)
Definition: json_value.h:57
static JsonValue number(unsigned short value)
Definition: json_value.h:59
const std::vector< JsonValue > & items() const
Definition: json_value.h:95
char to_char() const
Definition: json_value.h:107
void set_boolean(bool v)
Definition: json_value.h:124
static JsonValue number(float value)
Definition: json_value.h:55
const JsonValue & at(size_t index) const
Definition: json_value.h:78
Definition: Application/application.h:35
std::map< std::string, JsonValue > & properties()
Definition: json_value.h:91
JsonValue & operator[](const char *name)
Definition: json_value.h:127
JsonValue & operator[](size_t index)
Definition: json_value.h:131
void set_number(short v)
Definition: json_value.h:120