From 82a89e69e97b483441437bcfa92b0c00235963a4 Mon Sep 17 00:00:00 2001 From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de> Date: Mon, 16 Feb 2015 22:59:42 +0100 Subject: [PATCH] added operator[](int) to catch the literal zero address situation --- ipaacalib/cpp/include/ipaaca/ipaaca-payload.h | 8 +++++++- ipaacalib/cpp/src/ipaaca-json.cc | 4 ++-- ipaacalib/cpp/src/ipaaca-payload.cc | 8 ++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h index bd128c9..28f8024 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h @@ -239,7 +239,13 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ IPAACA_HEADER_EXPORT PayloadEntryProxy(PayloadEntryProxy* parent, size_t addressed_index); public: IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](size_t index); // array-style navigation - IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key); + IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](int index); // int is UNFORTUNATELY required to catch + // [0] (addressing using literal zero) + // because ambiguity with const char* + // arises if only [](size_t) is provided. + // size_t is obviously superior ... + // TODO: remove if better solution known + IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key); // dict-style navigation IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const char* key); // IPAACA_HEADER_EXPORT template<typename T> PayloadEntryProxy& operator=(T t) diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc index 83ac873..fc41425 100644 --- a/ipaacalib/cpp/src/ipaaca-json.cc +++ b/ipaacalib/cpp/src/ipaaca-json.cc @@ -136,8 +136,8 @@ int main(int argc, char** argv) { //std::map<std::string, double> vs = { {"A", 10}, {"B", 20}, {"C", 30}, {"D", 40} }; //ipaaca::pack_into_json_value(entry->document, entry->document.GetAllocator(), vs); std::cout << "Setting a value deep in the object:" << std::endl; - //iu->payload()["a"][(int)0] = "set by pep::op="; - iu->payload()["a"]["A"] = "set by pep::op="; + iu->payload()["a"][0] = "set by pep::op="; + //iu->payload()["a"]["A"] = "set by pep::op="; std::cout << "Final payload (printed as strings):" << std::endl; std::map<std::string, std::string> pl_flat = iu->payload(); diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc index 58ea2e3..f7b5e79 100644 --- a/ipaacalib/cpp/src/ipaaca-payload.cc +++ b/ipaacalib/cpp/src/ipaaca-payload.cc @@ -405,6 +405,14 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](size_t addr_idx_) } return PayloadEntryProxy(this, addr_idx_); } +IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](int addr_idx_) +{ + if (addr_idx_ < 0) { + IPAACA_INFO("Negative index!") + throw PayloadAddressingError(); + } + return operator[]((size_t) addr_idx_); +} /* IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value) -- GitLab