From da4a3b00889ceb46318552acb513bb4e1cf914f5 Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Wed, 25 Feb 2015 14:04:57 +0100
Subject: [PATCH] C++: optimization: found CopyFrom -> used in lieu of repeated
 parse

---
 ipaacalib/cpp/include/ipaaca/ipaaca-payload.h |  6 +++---
 ipaacalib/cpp/src/ipaaca-json.cc              |  1 +
 ipaacalib/cpp/src/ipaaca-payload.cc           | 17 ++++++++++-------
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index 0189f07..2bbde14 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -103,7 +103,7 @@ IPAACA_HEADER_EXPORT class PayloadDocumentEntry//{{{
 	public:
 		IPAACA_MEMBER_VAR_EXPORT ipaaca::Lock lock;
 		IPAACA_MEMBER_VAR_EXPORT bool modified;
-		IPAACA_MEMBER_VAR_EXPORT std::string json_source;
+		//IPAACA_MEMBER_VAR_EXPORT std::string json_source;
 		IPAACA_MEMBER_VAR_EXPORT rapidjson::Document document;
 		IPAACA_HEADER_EXPORT inline PayloadDocumentEntry(): modified(false) { }
 		IPAACA_HEADER_EXPORT inline ~PayloadDocumentEntry() { }
@@ -114,7 +114,7 @@ IPAACA_HEADER_EXPORT class PayloadDocumentEntry//{{{
 		IPAACA_HEADER_EXPORT static std::shared_ptr<PayloadDocumentEntry> create_null();
 		IPAACA_HEADER_EXPORT std::shared_ptr<PayloadDocumentEntry> clone();
 		IPAACA_HEADER_EXPORT rapidjson::Value& get_or_create_nested_value_from_proxy_path(PayloadEntryProxy* pep);
-		IPAACA_HEADER_EXPORT void update_json_source();
+		//IPAACA_HEADER_EXPORT void update_json_source();
 	typedef std::shared_ptr<PayloadDocumentEntry> ptr;
 };
 //}}}
@@ -296,7 +296,7 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
 			PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
 			rapidjson::Value& newval = new_entry->get_or_create_nested_value_from_proxy_path(this);
 			pack_into_json_value(newval, new_entry->document.GetAllocator(), t);
-			new_entry->update_json_source();
+			//new_entry->update_json_source();
 			_payload->set(_key, new_entry);
 			return *this;
 		}
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index f328cbc..f7fe00e 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -50,6 +50,7 @@ int json_testbed_main(int argc, char** argv)
 	ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create();
 	iu->add_fake_payload_item("a", entry);
 	iu->add_fake_payload_item("b", entrynew);
+	iu->payload()["c"] = "simpleString";
 	
 	auto proxy = iu->payload()["a"][3];
 	std::cout << proxy << std::endl;
diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc
index bb9e5a1..8f22279 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -83,7 +83,7 @@ IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{
 	bool first = true;
 	for (auto& kv: obj._document_store) {
 		if (first) { first=false; } else { os << ", "; }
-		os << "'" << kv.first << "':'" << kv.second->json_source << "'";
+		os << "\"" << kv.first << "\":" << kv.second->to_json_string_representation() << "";
 	}
 	os << "}";
 	return os;
@@ -215,33 +215,36 @@ IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::from_json_string_r
 	if (entry->document.Parse(json_str.c_str()).HasParseError()) {
 		throw JsonParsingError();
 	}
-	entry->json_source = json_str;
+	//entry->json_source = json_str;
 	return entry;
 }
 IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::from_unquoted_string_value(const std::string& str)
 {
 	PayloadDocumentEntry::ptr entry = std::make_shared<ipaaca::PayloadDocumentEntry>();
 	entry->document.SetString(str.c_str(), entry->document.GetAllocator());
-	entry->update_json_source();
+	//entry->update_json_source();
 	return entry;
 }
 
 /// update json_source after a write operation (on newly cloned entries)
+/*
 IPAACA_EXPORT void PayloadDocumentEntry::update_json_source()
 {
 	json_source = to_json_string_representation();
 }
-
+*/
 
 IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::create_null()
 {
 	PayloadDocumentEntry::ptr entry = std::make_shared<ipaaca::PayloadDocumentEntry>();
-	entry->json_source = "null"; // rapidjson::Document value is also null implicitly
+	//entry->json_source = "null"; // rapidjson::Document value is also null implicitly
 	return entry;
 }
 IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::clone()
 {
-	auto entry = PayloadDocumentEntry::from_json_string_representation(this->json_source);
+	//auto entry = PayloadDocumentEntry::from_json_string_representation(this->json_source);
+	auto entry = PayloadDocumentEntry::create_null();
+	entry->document.CopyFrom(this->document, entry->document.GetAllocator());
 	IPAACA_DEBUG("Cloned for copy-on-write, contents: " << entry)
 	return entry;
 }
@@ -462,7 +465,7 @@ IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const PayloadEntry
 	if (valueptr) { // only set if value is valid, keep default null value otherwise
 		newval.CopyFrom(*valueptr, new_entry->document.GetAllocator());
 	}
-	new_entry->update_json_source();
+	//new_entry->update_json_source();
 	_payload->set(_key, new_entry);
 	return *this;
 }
-- 
GitLab