From bef9e36f4ac0dd2aa2074d3e2f35191f10f7aa71 Mon Sep 17 00:00:00 2001 From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de> Date: Wed, 25 Feb 2015 13:53:45 +0100 Subject: [PATCH] C++: proxy.operator=(proxy) --- ipaacalib/cpp/include/ipaaca/ipaaca-payload.h | 1 + ipaacalib/cpp/src/ipaaca-json.cc | 39 ++++++++++++++++++- ipaacalib/cpp/src/ipaaca-payload.cc | 13 +++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h index 11107c4..0189f07 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h @@ -300,6 +300,7 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ _payload->set(_key, new_entry); return *this; } + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const PayloadEntryProxy& otherproxy); //IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const std::string& value); //IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const char* value); diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc index 3ffcebc..f328cbc 100644 --- a/ipaacalib/cpp/src/ipaaca-json.cc +++ b/ipaacalib/cpp/src/ipaaca-json.cc @@ -39,6 +39,42 @@ using namespace rapidjson; using namespace std; +int json_testbed_main(int argc, char** argv) +{ + std::string json_source("[\"old\",2,3,4]"); + ipaaca::PayloadDocumentEntry::ptr entry = ipaaca::PayloadDocumentEntry::from_json_string_representation(json_source); + + std::string newinner("{\"K\":\"V\"}"); + ipaaca::PayloadDocumentEntry::ptr entrynew = ipaaca::PayloadDocumentEntry::from_json_string_representation(newinner); + + ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create(); + iu->add_fake_payload_item("a", entry); + iu->add_fake_payload_item("b", entrynew); + + auto proxy = iu->payload()["a"][3]; + std::cout << proxy << std::endl; + + std::cout << "IU payload before: " << iu->payload() << std::endl; + std::cout << "Entry before: " << entry << std::endl; + std::cout << "EntryNew before: " << entrynew << std::endl; + + /* + proxy.json_value->CopyFrom(entrynew->document, proxy.document_entry->document.GetAllocator()); + proxy.document_entry->update_json_source(); + */ + proxy = iu->payload()["b"]; + + std::cout << "Newly written part: " << iu->payload()["a"][3] << std::endl; + iu->payload()["a"][3]["addkey"] = "addvalue"; + + std::cout << "IU payload after: " << iu->payload() << std::endl; + std::cout << "Entry after: " << entry << std::endl; + std::cout << "EntryNew after: " << entrynew << std::endl; + + return 0; +} + + int fakeiu_main(int argc, char** argv) { //if (argc<2) { @@ -254,7 +290,8 @@ int main(int argc, char** argv) ipaaca::CommandLineParser::ptr parser = ipaaca::CommandLineParser::create(); ipaaca::CommandLineOptions::ptr options = parser->parse(argc, argv); - return legacy_iu_main(argc, argv); + return json_testbed_main(argc, argv); + //return legacy_iu_main(argc, argv); //return fakeiu_main(argc, argv); //return iu_main(argc, argv); } diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc index fb45141..bb9e5a1 100644 --- a/ipaacalib/cpp/src/ipaaca-payload.cc +++ b/ipaacalib/cpp/src/ipaaca-payload.cc @@ -454,6 +454,19 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](int addr_idx_) return operator[]((size_t) addr_idx_); } +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const PayloadEntryProxy& otherproxy) +{ + 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); + auto valueptr = otherproxy.json_value; + 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(); + _payload->set(_key, new_entry); + return *this; +} + /* IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value) { -- GitLab