C++: Optimize PropertyProxy
When the property already exists in the object, we can store an iterator pointing to that property, instead of duplicating the key. When the property (key) is not present in the object, we still have to duplicate the key.
This commit is contained in:
@@ -201,6 +201,9 @@ namespace json {
|
||||
// array object we wrap
|
||||
json_t* _object;
|
||||
|
||||
// iterator pointing to property
|
||||
void* _iter;
|
||||
|
||||
// key of property
|
||||
char* _key;
|
||||
};
|
||||
|
||||
@@ -338,14 +338,17 @@ namespace json {
|
||||
}
|
||||
|
||||
PropertyProxy::PropertyProxy(json_t* object, const char* key)
|
||||
: _object(object) {
|
||||
_key = strdup(key);
|
||||
: _object(object), _key(0) {
|
||||
_iter = json_object_iter_at(object, key);
|
||||
if(!_iter)
|
||||
_key = strdup(key);
|
||||
json_incref(_object);
|
||||
}
|
||||
|
||||
PropertyProxy::PropertyProxy(const PropertyProxy& other)
|
||||
: _object(other._object) {
|
||||
_key = strdup(other._key);
|
||||
: _object(other._object), _iter(other._iter), _key(0) {
|
||||
if(other._key)
|
||||
_key = strdup(other._key);
|
||||
json_incref(_object);
|
||||
}
|
||||
|
||||
@@ -356,12 +359,18 @@ namespace json {
|
||||
|
||||
// assign value to proxied object property
|
||||
PropertyProxy& PropertyProxy::operator=(const Value& value) {
|
||||
json_object_set(_object, _key, value.as_json());
|
||||
if(_iter)
|
||||
json_object_iter_set(_object, _iter, value.as_json());
|
||||
else
|
||||
json_object_set(_object, _key, value.as_json());
|
||||
return *this;
|
||||
}
|
||||
|
||||
json_t* PropertyProxy::as_json() const {
|
||||
return json_object_get(_object, _key);
|
||||
if(_iter)
|
||||
return json_object_iter_value(_iter);
|
||||
else
|
||||
return json_object_get(_object, _key);
|
||||
}
|
||||
|
||||
} // namespace json::detail
|
||||
|
||||
Reference in New Issue
Block a user