00001 // Copyright 2007-2010 Baptiste Lepilleur 00002 // Distributed under MIT license, or public domain if desired and 00003 // recognized in your jurisdiction. 00004 // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 00005 00006 #ifndef CPPTL_JSON_H_INCLUDED 00007 # define CPPTL_JSON_H_INCLUDED 00008 00009 #if !defined(JSON_IS_AMALGAMATION) 00010 # include "forwards.h" 00011 #endif // if !defined(JSON_IS_AMALGAMATION) 00012 # include <string> 00013 # include <vector> 00014 00015 # ifndef JSON_USE_CPPTL_SMALLMAP 00016 # include <map> 00017 # else 00018 # include <cpptl/smallmap.h> 00019 # endif 00020 # ifdef JSON_USE_CPPTL 00021 # include <cpptl/forwards.h> 00022 # endif 00023 00026 namespace Json { 00027 00030 enum ValueType 00031 { 00032 nullValue = 0, 00033 intValue, 00034 uintValue, 00035 realValue, 00036 stringValue, 00037 booleanValue, 00038 arrayValue, 00039 objectValue 00040 }; 00041 00042 enum CommentPlacement 00043 { 00044 commentBefore = 0, 00045 commentAfterOnSameLine, 00046 commentAfter, 00047 numberOfCommentPlacement 00048 }; 00049 00050 //# ifdef JSON_USE_CPPTL 00051 // typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; 00052 // typedef CppTL::AnyEnumerator<const Value &> EnumValues; 00053 //# endif 00054 00069 class JSON_API StaticString 00070 { 00071 public: 00072 explicit StaticString( const char *czstring ) 00073 : str_( czstring ) 00074 { 00075 } 00076 00077 operator const char *() const 00078 { 00079 return str_; 00080 } 00081 00082 const char *c_str() const 00083 { 00084 return str_; 00085 } 00086 00087 private: 00088 const char *str_; 00089 }; 00090 00118 class JSON_API Value 00119 { 00120 friend class ValueIteratorBase; 00121 # ifdef JSON_VALUE_USE_INTERNAL_MAP 00122 friend class ValueInternalLink; 00123 friend class ValueInternalMap; 00124 # endif 00125 public: 00126 typedef std::vector<std::string> Members; 00127 typedef ValueIterator iterator; 00128 typedef ValueConstIterator const_iterator; 00129 typedef Json::UInt UInt; 00130 typedef Json::Int Int; 00131 # if defined(JSON_HAS_INT64) 00132 typedef Json::UInt64 UInt64; 00133 typedef Json::Int64 Int64; 00134 #endif // defined(JSON_HAS_INT64) 00135 typedef Json::LargestInt LargestInt; 00136 typedef Json::LargestUInt LargestUInt; 00137 typedef Json::ArrayIndex ArrayIndex; 00138 00139 static const Value null; 00141 static const LargestInt minLargestInt; 00143 static const LargestInt maxLargestInt; 00145 static const LargestUInt maxLargestUInt; 00146 00148 static const Int minInt; 00150 static const Int maxInt; 00152 static const UInt maxUInt; 00153 00155 static const Int64 minInt64; 00157 static const Int64 maxInt64; 00159 static const UInt64 maxUInt64; 00160 00161 private: 00162 #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00163 # ifndef JSON_VALUE_USE_INTERNAL_MAP 00164 class CZString 00165 { 00166 public: 00167 enum DuplicationPolicy 00168 { 00169 noDuplication = 0, 00170 duplicate, 00171 duplicateOnCopy 00172 }; 00173 CZString( ArrayIndex index ); 00174 CZString( const char *cstr, DuplicationPolicy allocate ); 00175 CZString( const CZString &other ); 00176 ~CZString(); 00177 CZString &operator =( const CZString &other ); 00178 bool operator<( const CZString &other ) const; 00179 bool operator==( const CZString &other ) const; 00180 ArrayIndex index() const; 00181 const char *c_str() const; 00182 bool isStaticString() const; 00183 private: 00184 void swap( CZString &other ); 00185 const char *cstr_; 00186 ArrayIndex index_; 00187 }; 00188 00189 public: 00190 # ifndef JSON_USE_CPPTL_SMALLMAP 00191 typedef std::map<CZString, Value> ObjectValues; 00192 # else 00193 typedef CppTL::SmallMap<CZString, Value> ObjectValues; 00194 # endif // ifndef JSON_USE_CPPTL_SMALLMAP 00195 # endif // ifndef JSON_VALUE_USE_INTERNAL_MAP 00196 #endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00197 00198 public: 00214 Value( ValueType type = nullValue ); 00215 Value( Int value ); 00216 Value( UInt value ); 00217 #if defined(JSON_HAS_INT64) 00218 Value( Int64 value ); 00219 Value( UInt64 value ); 00220 #endif // if defined(JSON_HAS_INT64) 00221 Value( double value ); 00222 Value( const char *value ); 00223 Value( const char *beginValue, const char *endValue ); 00234 Value( const StaticString &value ); 00235 Value( const std::string &value ); 00236 # ifdef JSON_USE_CPPTL 00237 Value( const CppTL::ConstString &value ); 00238 # endif 00239 Value( bool value ); 00240 Value( const Value &other ); 00241 ~Value(); 00242 00243 Value &operator=( const Value &other ); 00247 void swap( Value &other ); 00248 00249 ValueType type() const; 00250 00251 bool operator <( const Value &other ) const; 00252 bool operator <=( const Value &other ) const; 00253 bool operator >=( const Value &other ) const; 00254 bool operator >( const Value &other ) const; 00255 00256 bool operator ==( const Value &other ) const; 00257 bool operator !=( const Value &other ) const; 00258 00259 int compare( const Value &other ) const; 00260 00261 const char *asCString() const; 00262 std::string asString() const; 00263 # ifdef JSON_USE_CPPTL 00264 CppTL::ConstString asConstString() const; 00265 # endif 00266 Int asInt() const; 00267 UInt asUInt() const; 00268 Int64 asInt64() const; 00269 UInt64 asUInt64() const; 00270 LargestInt asLargestInt() const; 00271 LargestUInt asLargestUInt() const; 00272 float asFloat() const; 00273 double asDouble() const; 00274 bool asBool() const; 00275 00276 bool isNull() const; 00277 bool isBool() const; 00278 bool isInt() const; 00279 bool isUInt() const; 00280 bool isIntegral() const; 00281 bool isDouble() const; 00282 bool isNumeric() const; 00283 bool isString() const; 00284 bool isArray() const; 00285 bool isObject() const; 00286 00287 bool isConvertibleTo( ValueType other ) const; 00288 00290 ArrayIndex size() const; 00291 00294 bool empty() const; 00295 00297 bool operator!() const; 00298 00302 void clear(); 00303 00309 void resize( ArrayIndex size ); 00310 00316 Value &operator[]( ArrayIndex index ); 00317 00323 Value &operator[]( int index ); 00324 00328 const Value &operator[]( ArrayIndex index ) const; 00329 00333 const Value &operator[]( int index ) const; 00334 00337 Value get( ArrayIndex index, 00338 const Value &defaultValue ) const; 00340 bool isValidIndex( ArrayIndex index ) const; 00344 Value &append( const Value &value ); 00345 00347 Value &operator[]( const char *key ); 00349 const Value &operator[]( const char *key ) const; 00351 Value &operator[]( const std::string &key ); 00353 const Value &operator[]( const std::string &key ) const; 00365 Value &operator[]( const StaticString &key ); 00366 # ifdef JSON_USE_CPPTL 00367 00368 Value &operator[]( const CppTL::ConstString &key ); 00370 const Value &operator[]( const CppTL::ConstString &key ) const; 00371 # endif 00372 00373 Value get( const char *key, 00374 const Value &defaultValue ) const; 00376 Value get( const std::string &key, 00377 const Value &defaultValue ) const; 00378 # ifdef JSON_USE_CPPTL 00379 00380 Value get( const CppTL::ConstString &key, 00381 const Value &defaultValue ) const; 00382 # endif 00383 00384 00385 00386 00387 00388 00389 Value removeMember( const char* key ); 00391 Value removeMember( const std::string &key ); 00392 00394 bool isMember( const char *key ) const; 00396 bool isMember( const std::string &key ) const; 00397 # ifdef JSON_USE_CPPTL 00398 00399 bool isMember( const CppTL::ConstString &key ) const; 00400 # endif 00401 00407 Members getMemberNames() const; 00408 00409 //# ifdef JSON_USE_CPPTL 00410 // EnumMemberNames enumMemberNames() const; 00411 // EnumValues enumValues() const; 00412 //# endif 00413 00415 void setComment( const char *comment, 00416 CommentPlacement placement ); 00418 void setComment( const std::string &comment, 00419 CommentPlacement placement ); 00420 bool hasComment( CommentPlacement placement ) const; 00422 std::string getComment( CommentPlacement placement ) const; 00423 00424 std::string toStyledString() const; 00425 00426 const_iterator begin() const; 00427 const_iterator end() const; 00428 00429 iterator begin(); 00430 iterator end(); 00431 00432 private: 00433 Value &resolveReference( const char *key, 00434 bool isStatic ); 00435 00436 # ifdef JSON_VALUE_USE_INTERNAL_MAP 00437 inline bool isItemAvailable() const 00438 { 00439 return itemIsUsed_ == 0; 00440 } 00441 00442 inline void setItemUsed( bool isUsed = true ) 00443 { 00444 itemIsUsed_ = isUsed ? 1 : 0; 00445 } 00446 00447 inline bool isMemberNameStatic() const 00448 { 00449 return memberNameIsStatic_ == 0; 00450 } 00451 00452 inline void setMemberNameIsStatic( bool isStatic ) 00453 { 00454 memberNameIsStatic_ = isStatic ? 1 : 0; 00455 } 00456 # endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP 00457 00458 private: 00459 struct CommentInfo 00460 { 00461 CommentInfo(); 00462 ~CommentInfo(); 00463 00464 void setComment( const char *text ); 00465 00466 char *comment_; 00467 }; 00468 00469 //struct MemberNamesTransform 00470 //{ 00471 // typedef const char *result_type; 00472 // const char *operator()( const CZString &name ) const 00473 // { 00474 // return name.c_str(); 00475 // } 00476 //}; 00477 00478 union ValueHolder 00479 { 00480 LargestInt int_; 00481 LargestUInt uint_; 00482 double real_; 00483 bool bool_; 00484 char *string_; 00485 # ifdef JSON_VALUE_USE_INTERNAL_MAP 00486 ValueInternalArray *array_; 00487 ValueInternalMap *map_; 00488 #else 00489 ObjectValues *map_; 00490 # endif 00491 } value_; 00492 ValueType type_ : 8; 00493 int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. 00494 # ifdef JSON_VALUE_USE_INTERNAL_MAP 00495 unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container. 00496 int memberNameIsStatic_ : 1; // used by the ValueInternalMap container. 00497 # endif 00498 CommentInfo *comments_; 00499 }; 00500 00501 00504 class PathArgument 00505 { 00506 public: 00507 friend class Path; 00508 00509 PathArgument(); 00510 PathArgument( ArrayIndex index ); 00511 PathArgument( const char *key ); 00512 PathArgument( const std::string &key ); 00513 00514 private: 00515 enum Kind 00516 { 00517 kindNone = 0, 00518 kindIndex, 00519 kindKey 00520 }; 00521 std::string key_; 00522 ArrayIndex index_; 00523 Kind kind_; 00524 }; 00525 00537 class Path 00538 { 00539 public: 00540 Path( const std::string &path, 00541 const PathArgument &a1 = PathArgument(), 00542 const PathArgument &a2 = PathArgument(), 00543 const PathArgument &a3 = PathArgument(), 00544 const PathArgument &a4 = PathArgument(), 00545 const PathArgument &a5 = PathArgument() ); 00546 00547 const Value &resolve( const Value &root ) const; 00548 Value resolve( const Value &root, 00549 const Value &defaultValue ) const; 00551 Value &make( Value &root ) const; 00552 00553 private: 00554 typedef std::vector<const PathArgument *> InArgs; 00555 typedef std::vector<PathArgument> Args; 00556 00557 void makePath( const std::string &path, 00558 const InArgs &in ); 00559 void addPathInArg( const std::string &path, 00560 const InArgs &in, 00561 InArgs::const_iterator &itInArg, 00562 PathArgument::Kind kind ); 00563 void invalidPath( const std::string &path, 00564 int location ); 00565 00566 Args args_; 00567 }; 00568 00569 00570 00571 #ifdef JSON_VALUE_USE_INTERNAL_MAP 00572 00616 class JSON_API ValueMapAllocator 00617 { 00618 public: 00619 virtual ~ValueMapAllocator(); 00620 virtual ValueInternalMap *newMap() = 0; 00621 virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0; 00622 virtual void destructMap( ValueInternalMap *map ) = 0; 00623 virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0; 00624 virtual void releaseMapBuckets( ValueInternalLink *links ) = 0; 00625 virtual ValueInternalLink *allocateMapLink() = 0; 00626 virtual void releaseMapLink( ValueInternalLink *link ) = 0; 00627 }; 00628 00632 class JSON_API ValueInternalLink 00633 { 00634 public: 00635 enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture. 00636 enum InternalFlags { 00637 flagAvailable = 0, 00638 flagUsed = 1 00639 }; 00640 00641 ValueInternalLink(); 00642 00643 ~ValueInternalLink(); 00644 00645 Value items_[itemPerLink]; 00646 char *keys_[itemPerLink]; 00647 ValueInternalLink *previous_; 00648 ValueInternalLink *next_; 00649 }; 00650 00651 00664 class JSON_API ValueInternalMap 00665 { 00666 friend class ValueIteratorBase; 00667 friend class Value; 00668 public: 00669 typedef unsigned int HashKey; 00670 typedef unsigned int BucketIndex; 00671 00672 # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00673 struct IteratorState 00674 { 00675 IteratorState() 00676 : map_(0) 00677 , link_(0) 00678 , itemIndex_(0) 00679 , bucketIndex_(0) 00680 { 00681 } 00682 ValueInternalMap *map_; 00683 ValueInternalLink *link_; 00684 BucketIndex itemIndex_; 00685 BucketIndex bucketIndex_; 00686 }; 00687 # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00688 00689 ValueInternalMap(); 00690 ValueInternalMap( const ValueInternalMap &other ); 00691 ValueInternalMap &operator =( const ValueInternalMap &other ); 00692 ~ValueInternalMap(); 00693 00694 void swap( ValueInternalMap &other ); 00695 00696 BucketIndex size() const; 00697 00698 void clear(); 00699 00700 bool reserveDelta( BucketIndex growth ); 00701 00702 bool reserve( BucketIndex newItemCount ); 00703 00704 const Value *find( const char *key ) const; 00705 00706 Value *find( const char *key ); 00707 00708 Value &resolveReference( const char *key, 00709 bool isStatic ); 00710 00711 void remove( const char *key ); 00712 00713 void doActualRemove( ValueInternalLink *link, 00714 BucketIndex index, 00715 BucketIndex bucketIndex ); 00716 00717 ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex ); 00718 00719 Value &setNewItem( const char *key, 00720 bool isStatic, 00721 ValueInternalLink *link, 00722 BucketIndex index ); 00723 00724 Value &unsafeAdd( const char *key, 00725 bool isStatic, 00726 HashKey hashedKey ); 00727 00728 HashKey hash( const char *key ) const; 00729 00730 int compare( const ValueInternalMap &other ) const; 00731 00732 private: 00733 void makeBeginIterator( IteratorState &it ) const; 00734 void makeEndIterator( IteratorState &it ) const; 00735 static bool equals( const IteratorState &x, const IteratorState &other ); 00736 static void increment( IteratorState &iterator ); 00737 static void incrementBucket( IteratorState &iterator ); 00738 static void decrement( IteratorState &iterator ); 00739 static const char *key( const IteratorState &iterator ); 00740 static const char *key( const IteratorState &iterator, bool &isStatic ); 00741 static Value &value( const IteratorState &iterator ); 00742 static int distance( const IteratorState &x, const IteratorState &y ); 00743 00744 private: 00745 ValueInternalLink *buckets_; 00746 ValueInternalLink *tailLink_; 00747 BucketIndex bucketsSize_; 00748 BucketIndex itemCount_; 00749 }; 00750 00762 class JSON_API ValueInternalArray 00763 { 00764 friend class Value; 00765 friend class ValueIteratorBase; 00766 public: 00767 enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo. 00768 typedef Value::ArrayIndex ArrayIndex; 00769 typedef unsigned int PageIndex; 00770 00771 # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00772 struct IteratorState // Must be a POD 00773 { 00774 IteratorState() 00775 : array_(0) 00776 , currentPageIndex_(0) 00777 , currentItemIndex_(0) 00778 { 00779 } 00780 ValueInternalArray *array_; 00781 Value **currentPageIndex_; 00782 unsigned int currentItemIndex_; 00783 }; 00784 # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION 00785 00786 ValueInternalArray(); 00787 ValueInternalArray( const ValueInternalArray &other ); 00788 ValueInternalArray &operator =( const ValueInternalArray &other ); 00789 ~ValueInternalArray(); 00790 void swap( ValueInternalArray &other ); 00791 00792 void clear(); 00793 void resize( ArrayIndex newSize ); 00794 00795 Value &resolveReference( ArrayIndex index ); 00796 00797 Value *find( ArrayIndex index ) const; 00798 00799 ArrayIndex size() const; 00800 00801 int compare( const ValueInternalArray &other ) const; 00802 00803 private: 00804 static bool equals( const IteratorState &x, const IteratorState &other ); 00805 static void increment( IteratorState &iterator ); 00806 static void decrement( IteratorState &iterator ); 00807 static Value &dereference( const IteratorState &iterator ); 00808 static Value &unsafeDereference( const IteratorState &iterator ); 00809 static int distance( const IteratorState &x, const IteratorState &y ); 00810 static ArrayIndex indexOf( const IteratorState &iterator ); 00811 void makeBeginIterator( IteratorState &it ) const; 00812 void makeEndIterator( IteratorState &it ) const; 00813 void makeIterator( IteratorState &it, ArrayIndex index ) const; 00814 00815 void makeIndexValid( ArrayIndex index ); 00816 00817 Value **pages_; 00818 ArrayIndex size_; 00819 PageIndex pageCount_; 00820 }; 00821 00881 class JSON_API ValueArrayAllocator 00882 { 00883 public: 00884 virtual ~ValueArrayAllocator(); 00885 virtual ValueInternalArray *newArray() = 0; 00886 virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0; 00887 virtual void destructArray( ValueInternalArray *array ) = 0; 00899 virtual void reallocateArrayPageIndex( Value **&indexes, 00900 ValueInternalArray::PageIndex &indexCount, 00901 ValueInternalArray::PageIndex minNewIndexCount ) = 0; 00902 virtual void releaseArrayPageIndex( Value **indexes, 00903 ValueInternalArray::PageIndex indexCount ) = 0; 00904 virtual Value *allocateArrayPage() = 0; 00905 virtual void releaseArrayPage( Value *value ) = 0; 00906 }; 00907 #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP 00908 00909 00913 class ValueIteratorBase 00914 { 00915 public: 00916 typedef unsigned int size_t; 00917 typedef int difference_type; 00918 typedef ValueIteratorBase SelfType; 00919 00920 ValueIteratorBase(); 00921 #ifndef JSON_VALUE_USE_INTERNAL_MAP 00922 explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t ); 00923 #else 00924 ValueIteratorBase( const ValueInternalArray::IteratorState &state ); 00925 ValueIteratorBase( const ValueInternalMap::IteratorState &state ); 00926 #endif 00927 00928 bool operator ==( const SelfType &other ) const 00929 { 00930 return isEqual( other ); 00931 } 00932 00933 bool operator !=( const SelfType &other ) const 00934 { 00935 return !isEqual( other ); 00936 } 00937 00938 difference_type operator -( const SelfType &other ) const 00939 { 00940 return computeDistance( other ); 00941 } 00942 00944 Value key() const; 00945 00947 UInt index() const; 00948 00950 const char *memberName() const; 00951 00952 protected: 00953 Value &deref() const; 00954 00955 void increment(); 00956 00957 void decrement(); 00958 00959 difference_type computeDistance( const SelfType &other ) const; 00960 00961 bool isEqual( const SelfType &other ) const; 00962 00963 void copy( const SelfType &other ); 00964 00965 private: 00966 #ifndef JSON_VALUE_USE_INTERNAL_MAP 00967 Value::ObjectValues::iterator current_; 00968 // Indicates that iterator is for a null value. 00969 bool isNull_; 00970 #else 00971 union 00972 { 00973 ValueInternalArray::IteratorState array_; 00974 ValueInternalMap::IteratorState map_; 00975 } iterator_; 00976 bool isArray_; 00977 #endif 00978 }; 00979 00983 class ValueConstIterator : public ValueIteratorBase 00984 { 00985 friend class Value; 00986 public: 00987 typedef unsigned int size_t; 00988 typedef int difference_type; 00989 typedef const Value &reference; 00990 typedef const Value *pointer; 00991 typedef ValueConstIterator SelfType; 00992 00993 ValueConstIterator(); 00994 private: 00997 #ifndef JSON_VALUE_USE_INTERNAL_MAP 00998 explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t ); 00999 #else 01000 ValueConstIterator( const ValueInternalArray::IteratorState &state ); 01001 ValueConstIterator( const ValueInternalMap::IteratorState &state ); 01002 #endif 01003 public: 01004 SelfType &operator =( const ValueIteratorBase &other ); 01005 01006 SelfType operator++( int ) 01007 { 01008 SelfType temp( *this ); 01009 ++*this; 01010 return temp; 01011 } 01012 01013 SelfType operator--( int ) 01014 { 01015 SelfType temp( *this ); 01016 --*this; 01017 return temp; 01018 } 01019 01020 SelfType &operator--() 01021 { 01022 decrement(); 01023 return *this; 01024 } 01025 01026 SelfType &operator++() 01027 { 01028 increment(); 01029 return *this; 01030 } 01031 01032 reference operator *() const 01033 { 01034 return deref(); 01035 } 01036 }; 01037 01038 01041 class ValueIterator : public ValueIteratorBase 01042 { 01043 friend class Value; 01044 public: 01045 typedef unsigned int size_t; 01046 typedef int difference_type; 01047 typedef Value &reference; 01048 typedef Value *pointer; 01049 typedef ValueIterator SelfType; 01050 01051 ValueIterator(); 01052 ValueIterator( const ValueConstIterator &other ); 01053 ValueIterator( const ValueIterator &other ); 01054 private: 01057 #ifndef JSON_VALUE_USE_INTERNAL_MAP 01058 explicit ValueIterator( const Value::ObjectValues::iterator ¤t ); 01059 #else 01060 ValueIterator( const ValueInternalArray::IteratorState &state ); 01061 ValueIterator( const ValueInternalMap::IteratorState &state ); 01062 #endif 01063 public: 01064 01065 SelfType &operator =( const SelfType &other ); 01066 01067 SelfType operator++( int ) 01068 { 01069 SelfType temp( *this ); 01070 ++*this; 01071 return temp; 01072 } 01073 01074 SelfType operator--( int ) 01075 { 01076 SelfType temp( *this ); 01077 --*this; 01078 return temp; 01079 } 01080 01081 SelfType &operator--() 01082 { 01083 decrement(); 01084 return *this; 01085 } 01086 01087 SelfType &operator++() 01088 { 01089 increment(); 01090 return *this; 01091 } 01092 01093 reference operator *() const 01094 { 01095 return deref(); 01096 } 01097 }; 01098 01099 01100 } // namespace Json 01101 01102 01103 #endif // CPPTL_JSON_H_INCLUDED