@@ -867,78 +867,101 @@ Value Value::get(ArrayIndex index, const Value& defaultValue) const {
867867
868868bool Value::isValidIndex (ArrayIndex index) const { return index < size (); }
869869
870- const Value& Value::operator [](const char * key) const {
870+ Value const * Value::find (char const * key, char const * end) const
871+ {
871872 JSON_ASSERT_MESSAGE (
872873 type_ == nullValue || type_ == objectValue,
873- " in Json::Value::operator[](char const*)const: requires objectValue" );
874- if (type_ == nullValue)
875- return null;
876- CZString actualKey (key, strlen (key), CZString::noDuplication);
874+ " in Json::Value::find(key, end, found): requires objectValue or nullValue" );
875+ if (type_ == nullValue) return NULL ;
876+ CZString actualKey (key, end-key, CZString::noDuplication);
877877 ObjectValues::const_iterator it = value_.map_ ->find (actualKey);
878- if (it == value_.map_ ->end ())
879- return null;
880- return (*it).second ;
878+ if (it == value_.map_ ->end ()) return NULL ;
879+ return &(*it).second ;
881880}
882-
883- Value& Value::operator [](const std::string& key) {
884- return (*this )[key.c_str ()];
881+ const Value& Value::operator [](const char * key) const
882+ {
883+ Value const * found = find (key, key + strlen (key));
884+ if (!found) return null;
885+ return *found;
885886}
886-
887- const Value& Value:: operator []( const std::string& key) const {
887+ Value& Value:: operator []( const std::string& key)
888+ {
888889 return (*this )[key.c_str ()];
889890}
890-
891- Value& Value::operator [](const StaticString& key) {
891+ Value const & Value::operator [](std::string const & key) const
892+ {
893+ Value const * found = find (key.data (), key.data () + key.length ());
894+ if (!found) return null;
895+ return *found;
896+ }
897+ Value& Value::operator [](const StaticString& key)
898+ {
892899 return resolveReference (key, true );
893900}
894901
895902#ifdef JSON_USE_CPPTL
896903Value& Value::operator [](const CppTL::ConstString& key) {
897904 return (*this )[key.c_str ()];
898905}
899-
900- const Value& Value::operator [](const CppTL::ConstString& key) const {
901- return (*this )[key.c_str ()];
906+ Value const & Value::operator [](CppTL::ConstString const & key) const
907+ {
908+ Value const * found = find (key.c_str (), key.end_c_str ());
909+ if (!found) return null;
910+ return *found;
902911}
903912#endif
904913
905914Value& Value::append (const Value& value) { return (*this )[size ()] = value; }
906915
907- Value Value::get (const char * key, const Value& defaultValue) const {
916+ Value Value::get (char const * key, char const * end, Value const & defaultValue) const
917+ {
908918 const Value* value = &((*this )[key]);
909919 return value == &null ? defaultValue : *value;
910920}
911-
912- Value Value::get (const std::string& key, const Value& defaultValue) const {
921+ Value Value::get (char const * key, Value const & defaultValue) const
922+ {
923+ return get (key, key + strlen (key), defaultValue);
924+ }
925+ Value Value::get (std::string const & key, Value const & defaultValue) const
926+ {
913927 return get (key.c_str (), defaultValue);
914928}
915929
916930
917- bool Value::removeMember (const char * key, Value* removed) {
931+ bool Value::removeMember (const char * key, const char * end, Value* removed)
932+ {
918933 if (type_ != objectValue) {
919934 return false ;
920935 }
921- CZString actualKey (key, strlen ( key) , CZString::noDuplication);
936+ CZString actualKey (key, end- key, CZString::noDuplication);
922937 ObjectValues::iterator it = value_.map_ ->find (actualKey);
923938 if (it == value_.map_ ->end ())
924939 return false ;
925940 *removed = it->second ;
926941 value_.map_ ->erase (it);
927942 return true ;
928943}
929-
930- Value Value::removeMember (const char * key) {
944+ bool Value::removeMember (const char * key, Value* removed)
945+ {
946+ return removeMember (key, key + strlen (key), removed);
947+ }
948+ bool Value::removeMember (std::string const & key, Value* removed)
949+ {
950+ return removeMember (key.data (), key.data () + key.length (), removed);
951+ }
952+ Value Value::removeMember (const char * key)
953+ {
931954 JSON_ASSERT_MESSAGE (type_ == nullValue || type_ == objectValue,
932955 " in Json::Value::removeMember(): requires objectValue" );
933956 if (type_ == nullValue)
934957 return null;
935958
936959 Value removed; // null
937- removeMember (key, &removed);
960+ removeMember (key, key + strlen (key), &removed);
938961 return removed; // still null if removeMember() did nothing
939962}
940-
941- Value Value::removeMember ( const std::string& key) {
963+ Value Value::removeMember ( const std::string& key)
964+ {
942965 return removeMember (key.c_str ());
943966}
944967
@@ -972,13 +995,18 @@ Value Value::get(const CppTL::ConstString& key,
972995}
973996#endif
974997
975- bool Value::isMember (const char * key) const {
976- const Value* value = &((*this )[key]);
977- return value != &null;
998+ bool Value::isMember (char const * key, char const * end) const
999+ {
1000+ Value const * value = find (key, end);
1001+ return NULL != value;
9781002}
979-
980- bool Value::isMember (const std::string& key) const {
981- return isMember (key.c_str ());
1003+ bool Value::isMember (const char * key) const
1004+ {
1005+ return isMember (key, key + strlen (key));
1006+ }
1007+ bool Value::isMember (const std::string& key) const
1008+ {
1009+ return isMember (key.data (), key.data () + key.length ());
9821010}
9831011
9841012#ifdef JSON_USE_CPPTL
0 commit comments