C++: Optimize PropertyProxy
authorPetri Lehtinen <petri@digip.org>
Mon, 8 Feb 2010 18:51:09 +0000 (20:51 +0200)
committerPetri Lehtinen <petri@digip.org>
Mon, 8 Feb 2010 18:51:09 +0000 (20:51 +0200)
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.

src/jansson.hpp
src/jansson.ipp

index ad6d177..efb4b52 100644 (file)
@@ -201,6 +201,9 @@ namespace json {
             // 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;
         };
index fd3a1bf..e965ef7 100644 (file)
@@ -338,14 +338,17 @@ namespace json {
         }
 
         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);
             json_incref(_object);
         }
 
             json_incref(_object);
         }
 
@@ -356,12 +359,18 @@ namespace json {
 
         // 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