PRCYCoin  2.0.0.7rc1
P2P Digital Currency
univalue.h
Go to the documentation of this file.
1 // Copyright 2014 BitPay Inc.
2 // Copyright 2015 Bitcoin Core Developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef __UNIVALUE_H__
7 #define __UNIVALUE_H__
8 
9 #include <stdint.h>
10 
11 #include <string>
12 #include <vector>
13 #include <map>
14 #include <cassert>
15 
16 #include <sstream> // .get_int64()
17 #include <utility> // std::pair
18 
19 class UniValue {
20 public:
21  enum VType { VNULL, VOBJ, VARR, VSTR, VNUM, VBOOL, };
22 
23  UniValue() { typ = VNULL; }
24  UniValue(UniValue::VType initialType, const std::string& initialStr = "") {
25  typ = initialType;
26  val = initialStr;
27  }
28  UniValue(uint64_t val_) {
29  setInt(val_);
30  }
31  UniValue(int64_t val_) {
32  setInt(val_);
33  }
34  UniValue(bool val_) {
35  setBool(val_);
36  }
37  UniValue(int val_) {
38  setInt(val_);
39  }
40  UniValue(double val_) {
41  setFloat(val_);
42  }
43  UniValue(const std::string& val_) {
44  setStr(val_);
45  }
46  UniValue(const char *val_) {
47  std::string s(val_);
48  setStr(s);
49  }
50  ~UniValue() {}
51 
52  void clear();
53 
54  bool setNull();
55  bool setBool(bool val);
56  bool setNumStr(const std::string& val);
57  bool setInt(uint64_t val);
58  bool setInt(int64_t val);
59  bool setInt(int val_) { return setInt((int64_t)val_); }
60  bool setFloat(double val);
61  bool setStr(const std::string& val);
62  bool setArray();
63  bool setObject();
64 
65  enum VType getType() const { return typ; }
66  const std::string& getValStr() const { return val; }
67  bool empty() const { return (values.size() == 0); }
68 
69  size_t size() const { return values.size(); }
70 
71  bool getBool() const { return isTrue(); }
72  bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes);
73  const UniValue& operator[](const std::string& key) const;
74  const UniValue& operator[](size_t index) const;
75  bool exists(const std::string& key) const { size_t i; return findKey(key, i); }
76 
77  bool isNull() const { return (typ == VNULL); }
78  bool isTrue() const { return (typ == VBOOL) && (val == "1"); }
79  bool isFalse() const { return (typ == VBOOL) && (val != "1"); }
80  bool isBool() const { return (typ == VBOOL); }
81  bool isStr() const { return (typ == VSTR); }
82  bool isNum() const { return (typ == VNUM); }
83  bool isArray() const { return (typ == VARR); }
84  bool isObject() const { return (typ == VOBJ); }
85 
86  bool push_back(const UniValue& val);
87  bool push_back(const std::string& val_) {
88  UniValue tmpVal(VSTR, val_);
89  return push_back(tmpVal);
90  }
91  bool push_back(const char *val_) {
92  std::string s(val_);
93  return push_back(s);
94  }
95  bool push_back(uint64_t val_) {
96  UniValue tmpVal(val_);
97  return push_back(tmpVal);
98  }
99  bool push_back(int64_t val_) {
100  UniValue tmpVal(val_);
101  return push_back(tmpVal);
102  }
103  bool push_back(int val_) {
104  UniValue tmpVal(val_);
105  return push_back(tmpVal);
106  }
107  bool push_backV(const std::vector<UniValue>& vec);
108 
109  bool pushKV(const std::string& key, const UniValue& val);
110  bool pushKV(const std::string& key, const std::string& val_) {
111  UniValue tmpVal(VSTR, val_);
112  return pushKV(key, tmpVal);
113  }
114  bool pushKV(const std::string& key, const char *val_) {
115  std::string _val(val_);
116  return pushKV(key, _val);
117  }
118  bool pushKV(const std::string& key, int64_t val_) {
119  UniValue tmpVal(val_);
120  return pushKV(key, tmpVal);
121  }
122  bool pushKV(const std::string& key, uint64_t val_) {
123  UniValue tmpVal(val_);
124  return pushKV(key, tmpVal);
125  }
126  bool pushKV(const std::string& key, int val_) {
127  UniValue tmpVal((int64_t)val_);
128  return pushKV(key, tmpVal);
129  }
130  bool pushKV(const std::string& key, double val_) {
131  UniValue tmpVal(val_);
132  return pushKV(key, tmpVal);
133  }
134  bool pushKVs(const UniValue& obj);
135 
136  std::string write(unsigned int prettyIndent = 0,
137  unsigned int indentLevel = 0) const;
138 
139  bool read(const char *raw, size_t len);
140  bool read(const char *raw);
141  bool read(const std::string& rawStr) {
142  return read(rawStr.data(), rawStr.size());
143  }
144 
145 private:
147  std::string val; // numbers are stored as C++ strings
148  std::vector<std::string> keys;
149  std::vector<UniValue> values;
150 
151  bool findKey(const std::string& key, size_t& retIdx) const;
152  void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
153  void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
154 
155 public:
156  // Strict type-specific getters, these throw std::runtime_error if the
157  // value is of unexpected type
158  const std::vector<std::string>& getKeys() const;
159  const std::vector<UniValue>& getValues() const;
160  bool get_bool() const;
161  const std::string& get_str() const;
162  int get_int() const;
163  int64_t get_int64() const;
164  double get_real() const;
165  const UniValue& get_obj() const;
166  const UniValue& get_array() const;
167 
168  enum VType type() const { return getType(); }
169  bool push_back(std::pair<std::string,UniValue> pear) {
170  return pushKV(pear.first, pear.second);
171  }
172  friend const UniValue& find_value( const UniValue& obj, const std::string& name);
173 };
174 
175 //
176 // The following were added for compatibility with json_spirit.
177 // Most duplicate other methods, and should be removed.
178 //
179 static inline std::pair<std::string,UniValue> Pair(const char *cKey, const char *cVal)
180 {
181  std::string key(cKey);
182  UniValue uVal(cVal);
183  return std::make_pair(key, uVal);
184 }
185 
186 static inline std::pair<std::string,UniValue> Pair(const char *cKey, std::string strVal)
187 {
188  std::string key(cKey);
189  UniValue uVal(strVal);
190  return std::make_pair(key, uVal);
191 }
192 
193 static inline std::pair<std::string,UniValue> Pair(const char *cKey, uint64_t u64Val)
194 {
195  std::string key(cKey);
196  UniValue uVal(u64Val);
197  return std::make_pair(key, uVal);
198 }
199 
200 static inline std::pair<std::string,UniValue> Pair(const char *cKey, int64_t i64Val)
201 {
202  std::string key(cKey);
203  UniValue uVal(i64Val);
204  return std::make_pair(key, uVal);
205 }
206 
207 static inline std::pair<std::string,UniValue> Pair(const char *cKey, bool iVal)
208 {
209  std::string key(cKey);
210  UniValue uVal(iVal);
211  return std::make_pair(key, uVal);
212 }
213 
214 static inline std::pair<std::string,UniValue> Pair(const char *cKey, int iVal)
215 {
216  std::string key(cKey);
217  UniValue uVal(iVal);
218  return std::make_pair(key, uVal);
219 }
220 
221 static inline std::pair<std::string,UniValue> Pair(const char *cKey, double dVal)
222 {
223  std::string key(cKey);
224  UniValue uVal(dVal);
225  return std::make_pair(key, uVal);
226 }
227 
228 static inline std::pair<std::string,UniValue> Pair(const char *cKey, const UniValue& uVal)
229 {
230  std::string key(cKey);
231  return std::make_pair(key, uVal);
232 }
233 
234 static inline std::pair<std::string,UniValue> Pair(std::string key, const UniValue& uVal)
235 {
236  return std::make_pair(key, uVal);
237 }
238 
240  JTOK_ERR = -1,
241  JTOK_NONE = 0, // eof
253 };
254 
255 extern enum jtokentype getJsonToken(std::string& tokenVal,
256  unsigned int& consumed, const char *raw, const char *end);
257 extern const char *uvTypeName(UniValue::VType t);
258 
259 static inline bool jsonTokenIsValue(enum jtokentype jtt)
260 {
261  switch (jtt) {
262  case JTOK_KW_NULL:
263  case JTOK_KW_TRUE:
264  case JTOK_KW_FALSE:
265  case JTOK_NUMBER:
266  case JTOK_STRING:
267  return true;
268 
269  default:
270  return false;
271  }
272 
273  // not reached
274 }
275 
276 static inline bool json_isspace(int ch)
277 {
278  switch (ch) {
279  case 0x20:
280  case 0x09:
281  case 0x0a:
282  case 0x0d:
283  return true;
284 
285  default:
286  return false;
287  }
288 
289  // not reached
290 }
291 
292 extern const UniValue NullUniValue;
293 
294 const UniValue& find_value( const UniValue& obj, const std::string& name);
295 
296 #endif // __UNIVALUE_H__
JTOK_NONE
@ JTOK_NONE
Definition: univalue.h:241
UniValue::pushKV
bool pushKV(const std::string &key, int64_t val_)
Definition: univalue.h:118
getJsonToken
enum jtokentype getJsonToken(std::string &tokenVal, unsigned int &consumed, const char *raw, const char *end)
UniValue::checkObject
bool checkObject(const std::map< std::string, UniValue::VType > &memberTypes)
Definition: univalue.cpp:227
UniValue::isBool
bool isBool() const
Definition: univalue.h:80
UniValue::typ
UniValue::VType typ
Definition: univalue.h:146
JTOK_ARR_CLOSE
@ JTOK_ARR_CLOSE
Definition: univalue.h:245
UniValue::VOBJ
@ VOBJ
Definition: univalue.h:21
UniValue::writeObject
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
Definition: univalue_write.cpp:92
UniValue::get_bool
bool get_bool() const
Definition: univalue.cpp:302
JTOK_KW_TRUE
@ JTOK_KW_TRUE
Definition: univalue.h:249
UniValue::UniValue
UniValue(UniValue::VType initialType, const std::string &initialStr="")
Definition: univalue.h:24
UniValue::UniValue
UniValue(bool val_)
Definition: univalue.h:34
UniValue::pushKV
bool pushKV(const std::string &key, int val_)
Definition: univalue.h:126
UniValue::clear
void clear()
Definition: univalue.cpp:80
UniValue::pushKV
bool pushKV(const std::string &key, const char *val_)
Definition: univalue.h:114
JTOK_ARR_OPEN
@ JTOK_ARR_OPEN
Definition: univalue.h:244
UniValue::VType
VType
Definition: univalue.h:21
NullUniValue
const UniValue NullUniValue
Definition: univalue.cpp:78
UniValue::UniValue
UniValue(const std::string &val_)
Definition: univalue.h:43
UniValue::push_back
bool push_back(std::pair< std::string, UniValue > pear)
Definition: univalue.h:169
UniValue::values
std::vector< UniValue > values
Definition: univalue.h:149
UniValue::operator[]
const UniValue & operator[](const std::string &key) const
Definition: univalue.cpp:242
UniValue::read
bool read(const char *raw, size_t len)
Definition: univalue_read.cpp:253
UniValue::isNull
bool isNull() const
Definition: univalue.h:77
JTOK_OBJ_CLOSE
@ JTOK_OBJ_CLOSE
Definition: univalue.h:243
JTOK_COLON
@ JTOK_COLON
Definition: univalue.h:246
UniValue::isNum
bool isNum() const
Definition: univalue.h:82
UniValue::getType
enum VType getType() const
Definition: univalue.h:65
UniValue::val
std::string val
Definition: univalue.h:147
UniValue::getBool
bool getBool() const
Definition: univalue.h:71
UniValue::pushKV
bool pushKV(const std::string &key, const UniValue &val)
Definition: univalue.cpp:192
UniValue::read
bool read(const std::string &rawStr)
Definition: univalue.h:141
UniValue
Definition: univalue.h:19
UniValue::setNull
bool setNull()
Definition: univalue.cpp:88
UniValue::isFalse
bool isFalse() const
Definition: univalue.h:79
UniValue::type
enum VType type() const
Definition: univalue.h:168
UniValue::pushKV
bool pushKV(const std::string &key, uint64_t val_)
Definition: univalue.h:122
UniValue::get_str
const std::string & get_str() const
Definition: univalue.cpp:309
UniValue::UniValue
UniValue(double val_)
Definition: univalue.h:40
UniValue::isStr
bool isStr() const
Definition: univalue.h:81
UniValue::pushKV
bool pushKV(const std::string &key, const std::string &val_)
Definition: univalue.h:110
UniValue::get_int64
int64_t get_int64() const
Definition: univalue.cpp:326
JTOK_NUMBER
@ JTOK_NUMBER
Definition: univalue.h:251
UniValue::get_obj
const UniValue & get_obj() const
Definition: univalue.cpp:346
UniValue::pushKVs
bool pushKVs(const UniValue &obj)
Definition: univalue.cpp:202
UniValue::~UniValue
~UniValue()
Definition: univalue.h:50
UniValue::setInt
bool setInt(uint64_t val)
Definition: univalue.cpp:122
UniValue::push_back
bool push_back(int val_)
Definition: univalue.h:103
UniValue::push_back
bool push_back(uint64_t val_)
Definition: univalue.h:95
UniValue::setInt
bool setInt(int val_)
Definition: univalue.h:59
UniValue::UniValue
UniValue(uint64_t val_)
Definition: univalue.h:28
UniValue::exists
bool exists(const std::string &key) const
Definition: univalue.h:75
UniValue::VBOOL
@ VBOOL
Definition: univalue.h:21
UniValue::push_backV
bool push_backV(const std::vector< UniValue > &vec)
Definition: univalue.cpp:182
JTOK_OBJ_OPEN
@ JTOK_OBJ_OPEN
Definition: univalue.h:242
UniValue::UniValue
UniValue(const char *val_)
Definition: univalue.h:46
UniValue::getKeys
const std::vector< std::string > & getKeys() const
Definition: univalue.cpp:288
uvTypeName
const char * uvTypeName(UniValue::VType t)
Definition: univalue.cpp:264
UniValue::UniValue
UniValue()
Definition: univalue.h:23
UniValue::VNUM
@ VNUM
Definition: univalue.h:21
JTOK_COMMA
@ JTOK_COMMA
Definition: univalue.h:247
JTOK_KW_NULL
@ JTOK_KW_NULL
Definition: univalue.h:248
UniValue::isArray
bool isArray() const
Definition: univalue.h:83
UniValue::pushKV
bool pushKV(const std::string &key, double val_)
Definition: univalue.h:130
UniValue::push_back
bool push_back(int64_t val_)
Definition: univalue.h:99
name
const char * name
Definition: rest.cpp:34
UniValue::push_back
bool push_back(const std::string &val_)
Definition: univalue.h:87
JTOK_KW_FALSE
@ JTOK_KW_FALSE
Definition: univalue.h:250
UniValue::getValStr
const std::string & getValStr() const
Definition: univalue.h:66
UniValue::setNumStr
bool setNumStr(const std::string &val)
Definition: univalue.cpp:111
UniValue::writeArray
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string &s) const
Definition: univalue_write.cpp:70
UniValue::get_int
int get_int() const
Definition: univalue.cpp:316
UniValue::push_back
bool push_back(const char *val_)
Definition: univalue.h:91
UniValue::find_value
const friend UniValue & find_value(const UniValue &obj, const std::string &name)
Definition: univalue.cpp:279
UniValue::isTrue
bool isTrue() const
Definition: univalue.h:78
key
CKey key
Definition: bip38tooldialog.cpp:173
JTOK_STRING
@ JTOK_STRING
Definition: univalue.h:252
UniValue::keys
std::vector< std::string > keys
Definition: univalue.h:148
UniValue::push_back
bool push_back(const UniValue &val)
Definition: univalue.cpp:173
UniValue::UniValue
UniValue(int val_)
Definition: univalue.h:37
UniValue::empty
bool empty() const
Definition: univalue.h:67
JTOK_ERR
@ JTOK_ERR
Definition: univalue.h:240
UniValue::getValues
const std::vector< UniValue > & getValues() const
Definition: univalue.cpp:295
UniValue::get_real
double get_real() const
Definition: univalue.cpp:336
UniValue::setBool
bool setBool(bool val)
Definition: univalue.cpp:94
UniValue::size
size_t size() const
Definition: univalue.h:69
UniValue::findKey
bool findKey(const std::string &key, size_t &retIdx) const
Definition: univalue.cpp:215
UniValue::UniValue
UniValue(int64_t val_)
Definition: univalue.h:31
find_value
const UniValue & find_value(const UniValue &obj, const std::string &name)
Definition: univalue.cpp:279
jtokentype
jtokentype
Definition: univalue.h:239
UniValue::get_array
const UniValue & get_array() const
Definition: univalue.cpp:353
UniValue::VARR
@ VARR
Definition: univalue.h:21
UniValue::VNULL
@ VNULL
Definition: univalue.h:21
UniValue::VSTR
@ VSTR
Definition: univalue.h:21
UniValue::setObject
bool setObject()
Definition: univalue.cpp:166
UniValue::setFloat
bool setFloat(double val)
Definition: univalue.cpp:140
UniValue::setStr
bool setStr(const std::string &val)
Definition: univalue.cpp:151
UniValue::write
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
Definition: univalue_write.cpp:31
UniValue::setArray
bool setArray()
Definition: univalue.cpp:159
UniValue::isObject
bool isObject() const
Definition: univalue.h:84