Skip to content
Snippets Groups Projects
Commit b6d855c1 authored by Ramin Yaghoubzadeh Torky's avatar Ramin Yaghoubzadeh Torky
Browse files

C++: added push_back() and extend() for proxy arguments

parent ff40685b
No related branches found
No related tags found
No related merge requests found
...@@ -505,8 +505,20 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ ...@@ -505,8 +505,20 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
list.PushBack(newval, new_entry->document.GetAllocator()); list.PushBack(newval, new_entry->document.GetAllocator());
_payload->set(_key, new_entry); _payload->set(_key, new_entry);
} }
/// Alias for push_back() (somewhat pythonic - since we also provide extend()) /// Append the value of another proxy (or a null value) to a list-type value
IPAACA_HEADER_EXPORT template<typename T> void append(T t) { push_back<T>(t); } IPAACA_HEADER_EXPORT void push_back(const PayloadEntryProxy& otherproxy)
{
if ((!json_value) || (!json_value->IsArray())) throw PayloadAddressingError();
PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
rapidjson::Value& list = new_entry->get_or_create_nested_value_from_proxy_path(this);
rapidjson::Value newval;
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());
}
list.PushBack(newval, new_entry->document.GetAllocator());
_payload->set(_key, new_entry);
}
/// Extend a list-type payload value with a vector containing items of a supported type /// Extend a list-type payload value with a vector containing items of a supported type
IPAACA_HEADER_EXPORT template<typename T> void extend(const std::vector<T>& ts) IPAACA_HEADER_EXPORT template<typename T> void extend(const std::vector<T>& ts)
{ {
...@@ -533,6 +545,21 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ ...@@ -533,6 +545,21 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
} }
_payload->set(_key, new_entry); _payload->set(_key, new_entry);
} }
/// Extend a list-type payload value with items (copies) from another list-type value
IPAACA_HEADER_EXPORT void extend(const PayloadEntryProxy& otherproxy)
{
if ((!json_value) || (!json_value->IsArray())) throw PayloadAddressingError();
if ((!otherproxy.json_value) || (!(otherproxy.json_value->IsArray()))) throw PayloadAddressingError();
PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
rapidjson::Value& list = new_entry->get_or_create_nested_value_from_proxy_path(this);
for (size_t i=0; i<otherproxy.json_value->Size(); ++i) {
rapidjson::Value newval;
rapidjson::Value& value = (*(otherproxy.json_value))[i];
newval.CopyFrom(value, new_entry->document.GetAllocator());
list.PushBack(newval, new_entry->document.GetAllocator());
}
_payload->set(_key, new_entry);
}
}; };
// Available interpretations of payload entries (or children thereof) below. // Available interpretations of payload entries (or children thereof) below.
// Usage of standard complex data structures (vector etc.) currently entails // Usage of standard complex data structures (vector etc.) currently entails
......
...@@ -66,6 +66,7 @@ int iterators_main(int argc, char** argv)//{{{ ...@@ -66,6 +66,7 @@ int iterators_main(int argc, char** argv)//{{{
iu->payload()["d"] = 100; iu->payload()["d"] = 100;
iu->payload()["e"] = 3l; iu->payload()["e"] = 3l;
iu->payload()["f"] = "12.5000"; iu->payload()["f"] = "12.5000";
iu->payload()["g"] = std::vector<std::string>{"g1", "g2"};
std::cout << std::endl << "Iterate over payload" << std::endl; std::cout << std::endl << "Iterate over payload" << std::endl;
for (auto it = iu->payload().begin(); it != iu->payload().end(); ++it) { for (auto it = iu->payload().begin(); it != iu->payload().end(); ++it) {
...@@ -166,6 +167,14 @@ int iterators_main(int argc, char** argv)//{{{ ...@@ -166,6 +167,14 @@ int iterators_main(int argc, char** argv)//{{{
std::cout << " " << v << std::endl; std::cout << " " << v << std::endl;
} }
std::cout << std::endl << "Extending payload['a'] by payload['g'] and appending payload['f']" << std::endl;
iu->payload()["a"].extend(iu->payload()["g"]);
iu->payload()["a"].push_back(iu->payload()["f"]);
std::cout << "Resulting entries in payload['a']:" << std::endl;
for (auto v: iu->payload()["a"].as_list()) {
std::cout << " " << v << std::endl;
}
return 0; return 0;
} }
//}}} //}}}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment