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:
Petri Lehtinen
2010-02-08 20:51:09 +02:00
parent acec2559a5
commit 7e8b128740
2 changed files with 18 additions and 6 deletions

View File

@@ -201,6 +201,9 @@ namespace json {
// array object we wrap
json_t* _object;
// iterator pointing to property
void* _iter;
// key of property
char* _key;
};

View File

@@ -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