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.
// array object we wrap
json_t* _object;
// array object we wrap
json_t* _object;
+ // iterator pointing to property
+ void* _iter;
+
// key of property
char* _key;
};
// key of property
char* _key;
};
}
PropertyProxy::PropertyProxy(json_t* object, const char* key)
}
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)
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);
// assign value to proxied object property
PropertyProxy& PropertyProxy::operator=(const Value& value) {
// 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 *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
}
} // namespace json::detail