rippled
json_value.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_JSON_JSON_VALUE_H_INCLUDED
21 #define RIPPLE_JSON_JSON_VALUE_H_INCLUDED
22 
23 #include <ripple/json/json_forwards.h>
24 #include <cstring>
25 #include <map>
26 #include <string>
27 #include <vector>
28 
31 namespace Json {
32 
35 enum ValueType {
36  nullValue = 0,
44 };
45 
61 {
62 public:
63  constexpr explicit StaticString(const char* czstring) : str_(czstring)
64  {
65  }
66 
67  constexpr operator const char*() const
68  {
69  return str_;
70  }
71 
72  constexpr const char*
73  c_str() const
74  {
75  return str_;
76  }
77 
78 private:
79  const char* str_;
80 };
81 
82 inline bool
84 {
85  return strcmp(x.c_str(), y.c_str()) == 0;
86 }
87 
88 inline bool
90 {
91  return !(x == y);
92 }
93 
94 inline bool
96 {
97  return strcmp(x.c_str(), y.c_str()) == 0;
98 }
99 
100 inline bool
102 {
103  return !(x == y);
104 }
105 
106 inline bool
108 {
109  return y == x;
110 }
111 
112 inline bool
114 {
115  return !(y == x);
116 }
117 
145 class Value
146 {
147  friend class ValueIteratorBase;
148 
149 public:
153  using UInt = Json::UInt;
154  using Int = Json::Int;
155  using ArrayIndex = UInt;
156 
157  static const Value null;
158  static const Int minInt;
159  static const Int maxInt;
160  static const UInt maxUInt;
161 
162 private:
163  class CZString
164  {
165  public:
170  };
171  CZString(int index);
172  CZString(const char* cstr, DuplicationPolicy allocate);
173  CZString(const CZString& other);
174  ~CZString();
175  CZString&
176  operator=(const CZString& other) = delete;
177  bool
178  operator<(const CZString& other) const;
179  bool
180  operator==(const CZString& other) const;
181  int
182  index() const;
183  const char*
184  c_str() const;
185  bool
186  isStaticString() const;
187 
188  private:
189  const char* cstr_;
190  int index_;
191  };
192 
193 public:
195 
196 public:
213  Value(Int value);
214  Value(UInt value);
215  Value(double value);
216  Value(const char* value);
228  Value(const StaticString& value);
229  Value(std::string const& value);
230  Value(bool value);
231  Value(const Value& other);
232  ~Value();
233 
234  Value&
235  operator=(Value const& other);
236  Value&
237  operator=(Value&& other);
238 
239  Value(Value&& other) noexcept;
240 
242  void
243  swap(Value& other) noexcept;
244 
245  ValueType
246  type() const;
247 
248  const char*
249  asCString() const;
252  asString() const;
253  Int
254  asInt() const;
255  UInt
256  asUInt() const;
257  double
258  asDouble() const;
259  bool
260  asBool() const;
261 
262  // TODO: What is the "empty()" method this docstring mentions?
265  bool
266  isNull() const;
267  bool
268  isBool() const;
269  bool
270  isInt() const;
271  bool
272  isUInt() const;
273  bool
274  isIntegral() const;
275  bool
276  isDouble() const;
277  bool
278  isNumeric() const;
279  bool
280  isString() const;
281  bool
282  isArray() const;
283  bool
284  isArrayOrNull() const;
285  bool
286  isObject() const;
287  bool
288  isObjectOrNull() const;
289 
290  bool
291  isConvertibleTo(ValueType other) const;
292 
294  UInt
295  size() const;
296 
299  explicit operator bool() const;
300 
304  void
305  clear();
306 
312  Value&
313  operator[](UInt index);
317  const Value&
318  operator[](UInt index) const;
321  Value
322  get(UInt index, const Value& defaultValue) const;
324  bool
325  isValidIndex(UInt index) const;
329  Value&
330  append(const Value& value);
331  Value&
332  append(Value&& value);
333 
336  Value&
337  operator[](const char* key);
340  const Value&
341  operator[](const char* key) const;
344  Value&
345  operator[](std::string const& key);
348  const Value&
349  operator[](std::string const& key) const;
363  Value&
364  operator[](const StaticString& key);
365 
367  Value
368  get(const char* key, const Value& defaultValue) const;
370  Value
371  get(std::string const& key, const Value& defaultValue) const;
372 
379  Value
380  removeMember(const char* key);
382  Value
383  removeMember(std::string const& key);
384 
386  bool
387  isMember(const char* key) const;
389  bool
390  isMember(std::string const& key) const;
391 
397  Members
398  getMemberNames() const;
399 
401  toStyledString() const;
402 
404  begin() const;
406  end() const;
407 
408  iterator
409  begin();
410  iterator
411  end();
412 
413  friend bool
414  operator==(const Value&, const Value&);
415  friend bool
416  operator<(const Value&, const Value&);
417 
418 private:
419  Value&
420  resolveReference(const char* key, bool isStatic);
421 
422 private:
424  {
427  double real_;
428  bool bool_;
429  char* string_;
430  ObjectValues* map_{nullptr};
431  } value_;
433  int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
434 };
435 
436 bool
437 operator==(const Value&, const Value&);
438 
439 inline bool
440 operator!=(const Value& x, const Value& y)
441 {
442  return !(x == y);
443 }
444 
445 bool
446 operator<(const Value&, const Value&);
447 
448 inline bool
449 operator<=(const Value& x, const Value& y)
450 {
451  return !(y < x);
452 }
453 
454 inline bool
455 operator>(const Value& x, const Value& y)
456 {
457  return y < x;
458 }
459 
460 inline bool
461 operator>=(const Value& x, const Value& y)
462 {
463  return !(x < y);
464 }
465 
475 {
476 public:
477  enum { unknown = (unsigned)-1 };
478 
479  virtual ~ValueAllocator() = default;
480 
481  virtual char*
482  makeMemberName(const char* memberName) = 0;
483  virtual void
484  releaseMemberName(char* memberName) = 0;
485  virtual char*
486  duplicateStringValue(const char* value, unsigned int length = unknown) = 0;
487  virtual void
488  releaseStringValue(char* value) = 0;
489 };
490 
495 {
496 public:
497  using size_t = unsigned int;
498  using difference_type = int;
500 
502 
503  explicit ValueIteratorBase(const Value::ObjectValues::iterator& current);
504 
505  bool
506  operator==(const SelfType& other) const
507  {
508  return isEqual(other);
509  }
510 
511  bool
512  operator!=(const SelfType& other) const
513  {
514  return !isEqual(other);
515  }
516 
519  Value
520  key() const;
521 
523  UInt
524  index() const;
525 
528  const char*
529  memberName() const;
530 
531 protected:
532  Value&
533  deref() const;
534 
535  void
536  increment();
537 
538  void
539  decrement();
540 
542  computeDistance(const SelfType& other) const;
543 
544  bool
545  isEqual(const SelfType& other) const;
546 
547  void
548  copy(const SelfType& other);
549 
550 private:
551  Value::ObjectValues::iterator current_;
552  // Indicates that iterator is for a null value.
553  bool isNull_;
554 };
555 
560 {
561  friend class Value;
562 
563 public:
564  using size_t = unsigned int;
565  using difference_type = int;
566  using reference = const Value&;
567  using pointer = const Value*;
569 
570  ValueConstIterator() = default;
571 
572 private:
575  explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
576 
577 public:
578  SelfType&
579  operator=(const ValueIteratorBase& other);
580 
581  SelfType
583  {
584  SelfType temp(*this);
585  ++*this;
586  return temp;
587  }
588 
589  SelfType
591  {
592  SelfType temp(*this);
593  --*this;
594  return temp;
595  }
596 
597  SelfType&
599  {
600  decrement();
601  return *this;
602  }
603 
604  SelfType&
606  {
607  increment();
608  return *this;
609  }
610 
611  reference
612  operator*() const
613  {
614  return deref();
615  }
616 };
617 
621 {
622  friend class Value;
623 
624 public:
625  using size_t = unsigned int;
626  using difference_type = int;
627  using reference = Value&;
628  using pointer = Value*;
630 
631  ValueIterator() = default;
632  ValueIterator(const ValueConstIterator& other);
633  ValueIterator(const ValueIterator& other);
634 
635 private:
638  explicit ValueIterator(const Value::ObjectValues::iterator& current);
639 
640 public:
641  SelfType&
642  operator=(const SelfType& other);
643 
644  SelfType
646  {
647  SelfType temp(*this);
648  ++*this;
649  return temp;
650  }
651 
652  SelfType
654  {
655  SelfType temp(*this);
656  --*this;
657  return temp;
658  }
659 
660  SelfType&
662  {
663  decrement();
664  return *this;
665  }
666 
667  SelfType&
669  {
670  increment();
671  return *this;
672  }
673 
674  reference
675  operator*() const
676  {
677  return deref();
678  }
679 };
680 
681 } // namespace Json
682 
683 #endif // CPPTL_JSON_H_INCLUDED
Json::Value::isInt
bool isInt() const
Definition: json_value.cpp:979
Json::ValueConstIterator::operator++
SelfType & operator++()
Definition: json_value.h:605
Json::Value::Int
Json::Int Int
Definition: json_value.h:154
Json::ValueIterator
Iterator for object and array value.
Definition: json_value.h:620
Json::operator<
bool operator<(const Value &x, const Value &y)
Definition: json_value.cpp:367
Json::ValueIteratorBase::copy
void copy(const SelfType &other)
Definition: json_valueiterator.cpp:102
Json::Value::isObject
bool isObject() const
Definition: json_value.cpp:1027
std::string
STL class.
Json::Value::isString
bool isString() const
Definition: json_value.cpp:1009
Json::Value::isValidIndex
bool isValidIndex(UInt index) const
Return true if index < size().
Definition: json_value.cpp:841
Json::ValueConstIterator::SelfType
ValueConstIterator SelfType
Definition: json_value.h:568
cstring
Json::ValueIterator::SelfType
ValueIterator SelfType
Definition: json_value.h:629
Json::Value::allocated_
int allocated_
Definition: json_value.h:433
Json::ValueIterator::operator++
SelfType operator++(int)
Definition: json_value.h:645
Json::Value::type_
ValueType type_
Definition: json_value.h:432
Json::arrayValue
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
Json::Value::CZString::index
int index() const
Definition: json_value.cpp:151
Json::booleanValue
@ booleanValue
bool value
Definition: json_value.h:41
Json::StaticString::StaticString
constexpr StaticString(const char *czstring)
Definition: json_value.h:63
Json::ValueConstIterator::operator=
SelfType & operator=(const ValueIteratorBase &other)
Definition: json_valueiterator.cpp:156
Json::UInt
unsigned int UInt
Definition: json_forwards.h:27
Json::Value::get
Value get(UInt index, const Value &defaultValue) const
If the array contains at least index+1 elements, returns the element value, otherwise returns default...
Definition: json_value.cpp:834
vector
Json::ValueIteratorBase::ValueIteratorBase
ValueIteratorBase()
Definition: json_valueiterator.cpp:34
Json::Value::swap
void swap(Value &other) noexcept
Swap values.
Definition: json_value.cpp:336
Json::Value::isDouble
bool isDouble() const
Definition: json_value.cpp:997
Json::ValueIteratorBase::operator==
bool operator==(const SelfType &other) const
Definition: json_value.h:506
Json::realValue
@ realValue
double value
Definition: json_value.h:39
Json::Value::CZString::c_str
const char * c_str() const
Definition: json_value.cpp:157
Json::ValueIteratorBase::index
UInt index() const
Return the index of the referenced Value. -1 if it is not an arrayValue.
Definition: json_valueiterator.cpp:124
Json::Value::isNull
bool isNull() const
isNull() tests to see if this field is null.
Definition: json_value.cpp:967
Json::Value::CZString::duplicate
@ duplicate
Definition: json_value.h:168
Json::Value::toStyledString
std::string toStyledString() const
Definition: json_value.cpp:1039
Json::Value::end
const_iterator end() const
Definition: json_value.cpp:1064
Json::ValueIteratorBase::decrement
void decrement()
Definition: json_valueiterator.cpp:57
Json::ValueIteratorBase::SelfType
ValueIteratorBase SelfType
Definition: json_value.h:499
Json::ValueIteratorBase::isEqual
bool isEqual(const SelfType &other) const
Definition: json_valueiterator.cpp:91
Json::StaticString::c_str
constexpr const char * c_str() const
Definition: json_value.h:73
Json::ValueConstIterator::reference
const Value & reference
Definition: json_value.h:566
Json::ValueIteratorBase::key
Value key() const
Return either the index or the member name of the referenced value as a Value.
Definition: json_valueiterator.cpp:108
Json::ValueIteratorBase::current_
Value::ObjectValues::iterator current_
Definition: json_value.h:551
Json::ValueAllocator
Experimental do not use: Allocator to customize member name and string value memory management done b...
Definition: json_value.h:474
Json::Value::asBool
bool asBool() const
Definition: json_value.cpp:619
Json::ValueConstIterator::operator--
SelfType operator--(int)
Definition: json_value.h:590
Json::ValueAllocator::~ValueAllocator
virtual ~ValueAllocator()=default
Json::Value::ValueHolder::map_
ObjectValues * map_
Definition: json_value.h:430
Json::uintValue
@ uintValue
unsigned integer value
Definition: json_value.h:38
Json::Value::operator<
friend bool operator<(const Value &, const Value &)
Definition: json_value.cpp:367
Json::ValueIteratorBase::isNull_
bool isNull_
Definition: json_value.h:553
Json::Value::maxInt
static const Int maxInt
Definition: json_value.h:159
Json
JSON (JavaScript Object Notation).
Definition: json_reader.cpp:27
Json::Value::append
Value & append(const Value &value)
Append value to array at the end.
Definition: json_value.cpp:882
Json::Value::resolveReference
Value & resolveReference(const char *key, bool isStatic)
Definition: json_value.cpp:813
Json::Value::CZString::cstr_
const char * cstr_
Definition: json_value.h:189
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
Json::ValueIterator::operator++
SelfType & operator++()
Definition: json_value.h:668
Json::ValueIterator::operator*
reference operator*() const
Definition: json_value.h:675
Json::ValueIteratorBase::operator!=
bool operator!=(const SelfType &other) const
Definition: json_value.h:512
Json::Value::value_
union Json::Value::ValueHolder value_
Json::Value::isConvertibleTo
bool isConvertibleTo(ValueType other) const
Definition: json_value.cpp:651
Json::Value::isArrayOrNull
bool isArrayOrNull() const
Definition: json_value.cpp:1021
Json::ValueConstIterator
const iterator for object and array value.
Definition: json_value.h:559
std::string::c_str
T c_str(T... args)
Json::ValueIteratorBase
base class for Value iterators.
Definition: json_value.h:494
Json::operator>
bool operator>(const Value &x, const Value &y)
Definition: json_value.h:455
Json::Value::ValueHolder::real_
double real_
Definition: json_value.h:427
Json::operator==
bool operator==(const Value &x, const Value &y)
Definition: json_value.cpp:416
Json::ValueAllocator::releaseStringValue
virtual void releaseStringValue(char *value)=0
Json::Value::size
UInt size() const
Number of values in array or object.
Definition: json_value.cpp:706
Json::Value::minInt
static const Int minInt
Definition: json_value.h:158
Json::StaticString::str_
const char * str_
Definition: json_value.h:79
Json::Value::isMember
bool isMember(const char *key) const
Return true if the object has a member named key.
Definition: json_value.cpp:932
Json::operator<=
bool operator<=(const Value &x, const Value &y)
Definition: json_value.h:449
Json::stringValue
@ stringValue
UTF-8 string value.
Definition: json_value.h:40
Json::ValueType
ValueType
Type of the value held by a Value object.
Definition: json_value.h:35
Json::Value::asCString
const char * asCString() const
Definition: json_value.cpp:462
Json::ValueIterator::operator--
SelfType & operator--()
Definition: json_value.h:661
Json::ValueConstIterator::operator*
reference operator*() const
Definition: json_value.h:612
map
Json::operator!=
bool operator!=(StaticString x, StaticString y)
Definition: json_value.h:89
Json::Int
int Int
Definition: json_forwards.h:26
Json::ValueIterator::ValueIterator
ValueIterator()=default
Json::Value::CZString::operator<
bool operator<(const CZString &other) const
Definition: json_value.cpp:133
Json::ValueIterator::operator--
SelfType operator--(int)
Definition: json_value.h:653
Json::Value::UInt
Json::UInt UInt
Definition: json_value.h:153
Json::Value::CZString::CZString
CZString(int index)
Definition: json_value.cpp:103
Json::Value::isArray
bool isArray() const
Definition: json_value.cpp:1015
Json::Value::CZString::operator==
bool operator==(const CZString &other) const
Definition: json_value.cpp:142
Json::ValueAllocator::duplicateStringValue
virtual char * duplicateStringValue(const char *value, unsigned int length=unknown)=0
Json::Value::getMemberNames
Members getMemberNames() const
Return a list of the member names.
Definition: json_value.cpp:948
Json::ValueIteratorBase::computeDistance
difference_type computeDistance(const SelfType &other) const
Definition: json_valueiterator.cpp:63
Json::ValueIterator::operator=
SelfType & operator=(const SelfType &other)
Definition: json_valueiterator.cpp:186
Json::Value::CZString::~CZString
~CZString()
Definition: json_value.cpp:126
Json::Value::operator=
Value & operator=(Value const &other)
Definition: json_value.cpp:313
Json::ValueAllocator::unknown
@ unknown
Definition: json_value.h:477
Json::Value::maxUInt
static const UInt maxUInt
Definition: json_value.h:160
Json::Value::removeMember
Value removeMember(const char *key)
Remove and return the named member.
Definition: json_value.cpp:907
Json::Value::isNumeric
bool isNumeric() const
Definition: json_value.cpp:1003
Json::ValueAllocator::releaseMemberName
virtual void releaseMemberName(char *memberName)=0
Json::Value::CZString::DuplicationPolicy
DuplicationPolicy
Definition: json_value.h:166
Json::Value::clear
void clear()
Remove all object members and array elements.
Definition: json_value.cpp:753
Json::Value::CZString
Definition: json_value.h:163
Json::Value::CZString::noDuplication
@ noDuplication
Definition: json_value.h:167
Json::Value::CZString::index_
int index_
Definition: json_value.h:190
Json::ValueConstIterator::operator--
SelfType & operator--()
Definition: json_value.h:598
Json::ValueConstIterator::operator++
SelfType operator++(int)
Definition: json_value.h:582
Json::StaticString
Lightweight wrapper to tag static string.
Definition: json_value.h:60
Json::intValue
@ intValue
signed integer value
Definition: json_value.h:37
Json::Value::asUInt
UInt asUInt() const
Definition: json_value.cpp:545
Json::Value::isUInt
bool isUInt() const
Definition: json_value.cpp:985
Json::Value::operator==
friend bool operator==(const Value &, const Value &)
Definition: json_value.cpp:416
Json::Value::isIntegral
bool isIntegral() const
Definition: json_value.cpp:991
Json::Value::CZString::duplicateOnCopy
@ duplicateOnCopy
Definition: json_value.h:169
Json::nullValue
@ nullValue
'null' value
Definition: json_value.h:36
Json::operator>=
bool operator>=(const Value &x, const Value &y)
Definition: json_value.h:461
Json::Value::operator[]
Value & operator[](UInt index)
Access an array element (zero based index ).
Definition: json_value.cpp:771
Json::Value::ValueHolder::bool_
bool bool_
Definition: json_value.h:428
Json::Value::ValueHolder::string_
char * string_
Definition: json_value.h:429
Json::Value::Value
Value(ValueType type=nullValue)
Create a default Value of the given type.
Definition: json_value.cpp:180
Json::Value::isBool
bool isBool() const
Definition: json_value.cpp:973
Json::Value::~Value
~Value()
Definition: json_value.cpp:284
Json::Value::asInt
Int asInt() const
Definition: json_value.cpp:503
Json::Value::ValueHolder
Definition: json_value.h:423
Json::Value::CZString::operator=
CZString & operator=(const CZString &other)=delete
Json::Value::begin
const_iterator begin() const
Definition: json_value.cpp:1046
Json::Value::asDouble
double asDouble() const
Definition: json_value.cpp:587
Json::Value::type
ValueType type() const
Definition: json_value.cpp:350
Json::ValueIteratorBase::increment
void increment()
Definition: json_valueiterator.cpp:51
Json::Value::CZString::isStaticString
bool isStaticString() const
Definition: json_value.cpp:163
Json::ValueIterator::reference
Value & reference
Definition: json_value.h:627
Json::ValueIteratorBase::difference_type
int difference_type
Definition: json_value.h:498
Json::Value::ValueHolder::uint_
UInt uint_
Definition: json_value.h:426
Json::Value::isObjectOrNull
bool isObjectOrNull() const
Definition: json_value.cpp:1033
Json::Value
Represents a JSON value.
Definition: json_value.h:145
Json::ValueIteratorBase::deref
Value & deref() const
Definition: json_valueiterator.cpp:45
Json::Value::ValueHolder::int_
Int int_
Definition: json_value.h:425
Json::ValueAllocator::makeMemberName
virtual char * makeMemberName(const char *memberName)=0
Json::ValueConstIterator::ValueConstIterator
ValueConstIterator()=default
Json::ValueIteratorBase::memberName
const char * memberName() const
Return the member name of the referenced Value.
Definition: json_valueiterator.cpp:135
Json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469
Json::Value::ArrayIndex
UInt ArrayIndex
Definition: json_value.h:155
string