From bc47ebbc8141d127de4451b681c925fda9f110e8 Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Mon, 23 Feb 2015 21:02:22 +0100
Subject: [PATCH] Towards library-internal options for the cmdline parser

---
 ipaacalib/cpp/CMakeLists.txt                  |  1 +
 .../cpp/include/ipaaca/ipaaca-definitions.h   | 16 +++++-
 ipaacalib/cpp/include/ipaaca/ipaaca-payload.h |  4 +-
 ipaacalib/cpp/include/ipaaca/ipaaca.h         |  2 +
 ipaacalib/cpp/src/ipaaca-cmdline-parser.cc    | 53 ++++++++++++++++---
 ipaacalib/cpp/src/ipaaca-fake.cc              | 16 +++---
 ipaacalib/cpp/src/ipaaca-json.cc              | 37 +++++++++----
 ipaacalib/cpp/src/ipaaca-payload.cc           | 50 +++++------------
 8 files changed, 116 insertions(+), 63 deletions(-)

diff --git a/ipaacalib/cpp/CMakeLists.txt b/ipaacalib/cpp/CMakeLists.txt
index 63b940c..6e52a42 100644
--- a/ipaacalib/cpp/CMakeLists.txt
+++ b/ipaacalib/cpp/CMakeLists.txt
@@ -176,6 +176,7 @@ set (JSON_TEST_SOURCE
 	src/ipaaca-locking.cc
 	src/ipaaca-links.cc
 	src/ipaaca-payload.cc
+	src/ipaaca-cmdline-parser.cc
 	src/ipaaca-string-utils.cc
 	# more stuff going beyond the fake test case
 	src/ipaaca-ius.cc
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
index d5b8b24..89030df 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
@@ -251,7 +251,12 @@ IPAACA_HEADER_EXPORT class Initializer
 // additional misc classes ( Command line options )//{{{
 IPAACA_HEADER_EXPORT class CommandLineOptions {
 	public:
-		IPAACA_HEADER_EXPORT inline CommandLineOptions() { }
+		IPAACA_HEADER_EXPORT inline CommandLineOptions()
+		//: _unconsumed_argc(0), _unconsumed_argv(nullptr)
+		{ }
+		IPAACA_HEADER_EXPORT inline ~CommandLineOptions() {
+			//if (_unconsumed_argv) delete[] _unconsumed_argv;
+		}
 		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> param_opts;
 		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> param_set;
 	public:
@@ -259,6 +264,13 @@ IPAACA_HEADER_EXPORT class CommandLineOptions {
 		IPAACA_HEADER_EXPORT std::string get_param(const std::string& o);
 		IPAACA_HEADER_EXPORT bool is_set(const std::string& o);
 		IPAACA_HEADER_EXPORT void dump();
+	public:
+		//IPAACA_HEADER_EXPORT inline int unconsumed_argc() { return _unconsumed_argc; }
+		//IPAACA_HEADER_EXPORT inline char** unconsumed_argv() { return _unconsumed_argv; }
+	protected:
+		//IPAACA_MEMBER_VAR_EXPORT int _unconsumed_argc;
+		//IPAACA_MEMBER_VAR_EXPORT char** _unconsumed_argv;
+	public:
 	typedef boost::shared_ptr<CommandLineOptions> ptr;
 };
 
@@ -271,6 +283,8 @@ class CommandLineParser {
 		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, int> set_flag; // for paramless opts
 	protected:
 		IPAACA_HEADER_EXPORT CommandLineParser();
+		IPAACA_MEMBER_VAR_EXPORT bool library_options_handled;
+		IPAACA_HEADER_EXPORT bool consume_library_option(const std::string& name, bool expect, const char* optarg);
 	public:
 		IPAACA_HEADER_EXPORT inline ~CommandLineParser() { }
 		IPAACA_HEADER_EXPORT static inline boost::shared_ptr<CommandLineParser> create() {
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index ee88c26..f823a36 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -105,8 +105,8 @@ IPAACA_HEADER_EXPORT class PayloadDocumentEntry//{{{
 		IPAACA_MEMBER_VAR_EXPORT bool modified;
 		IPAACA_MEMBER_VAR_EXPORT std::string json_source;
 		IPAACA_MEMBER_VAR_EXPORT rapidjson::Document document;
-		IPAACA_HEADER_EXPORT inline PayloadDocumentEntry(): modified(false) { IPAACA_INFO("") }
-		IPAACA_HEADER_EXPORT inline ~PayloadDocumentEntry() { IPAACA_INFO("") }
+		IPAACA_HEADER_EXPORT inline PayloadDocumentEntry(): modified(false) { }
+		IPAACA_HEADER_EXPORT inline ~PayloadDocumentEntry() { }
 		//IPAACA_HEADER_EXPORT PayloadDocumentEntry(const std::string& source): modified(false), json_source(source), {};
 		IPAACA_HEADER_EXPORT std::string to_json_string_representation();
 		IPAACA_HEADER_EXPORT static std::shared_ptr<PayloadDocumentEntry> from_json_string_representation(const std::string& input);
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h
index 6a01f8a..35620e5 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -75,11 +75,13 @@
 #endif
 
 #ifdef IPAACA_DEBUG_MESSAGES
+#define IPAACA_DEBUG(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- " << i << std::endl;
 #define IPAACA_INFO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- " << i << std::endl;
 #define IPAACA_WARNING(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- WARNING: " << i << std::endl;
 #define IPAACA_IMPLEMENT_ME std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- IMPLEMENT ME" << std::endl;
 #define IPAACA_TODO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- TODO: " << i << std::endl;
 #else
+#define IPAACA_DEBUG(i) ;
 #define IPAACA_INFO(i) ;
 #define IPAACA_WARNING(i) ;
 #define IPAACA_IMPLEMENT_ME ;
diff --git a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
index 18035dc..0a50abf 100644
--- a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
+++ b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
@@ -75,6 +75,7 @@ void CommandLineOptions::dump() {
 //
 
 CommandLineParser::CommandLineParser()
+: library_options_handled(true)
 {
 	initialize_parser_defaults();
 }
@@ -85,6 +86,33 @@ void CommandLineParser::initialize_parser_defaults()
 	add_option("verbose",        'v', false, "");
 	add_option("character-name", 'c', true, "UnknownCharacter");
 	add_option("component-name", 'n', true, "UnknownComponent");
+	if (library_options_handled) {
+		add_option("ipaaca-payload-type", 0, true, "JSON");
+		add_option("ipaaca-default-channel", 0, true, "default");
+		add_option("ipaaca-enable-logging", 0, true, "WARNING");
+		add_option("rsb-enable-logging", 0, true, "ERROR");
+	}
+}
+
+bool CommandLineParser::consume_library_option(const std::string& name, bool expect, const char* optarg)
+{
+	IPAACA_DEBUG("Trying to consume " << name)
+	if (name=="ipaaca-payload-type") {
+		IPAACA_DEBUG("TODO: set default payload type to " << optarg)
+		IPAACA_IMPLEMENT_ME
+	} else if (name=="ipaaca-default-channel") {
+		IPAACA_DEBUG("TODO: set default channel to " << optarg)
+		IPAACA_IMPLEMENT_ME
+	} else if (name=="ipaaca-enable-logging") {
+		IPAACA_DEBUG("TODO: set ipaaca log level to " << optarg)
+		IPAACA_IMPLEMENT_ME
+	} else if (name=="rsb-enable-logging") {
+		IPAACA_DEBUG("TODO: set rsb log level to " << optarg)
+		IPAACA_IMPLEMENT_ME
+	} else {
+		return false;
+	}
+	return true;
 }
 
 void CommandLineParser::dump_options()
@@ -121,6 +149,7 @@ CommandLineOptions::ptr CommandLineParser::parse(int argc, char* const* argv)
 	LOG_IPAACA_CONSOLE("IMPLEMENT ME: command line parsing for Windows. (req'd: getopt)")
 	throw NotImplementedError();
 #else
+	IPAACA_DEBUG("")
 	int len = options.size();
 	struct option long_options[len+1];
 	int i=0;
@@ -155,19 +184,23 @@ CommandLineOptions::ptr CommandLineParser::parse(int argc, char* const* argv)
 		// Detect the end of the options. 
 		if (c == -1) break;
 		
+		bool do_set_option = false;
+		std::string longname;
+		std::string longoption;
+		bool expect;
 		switch (c)
 		{
 			case 0:
 				{
-				std::string longname = long_options[option_index].name;
+				longname = long_options[option_index].name;
 				if (longname == "help") {
 					std::cout << "Options:" << std::endl;
 					dump_options();
 					exit(0);
 				}
-				std::string longoption = long_options[option_index].name;
-				bool expect = options[longoption];
-				clo->set_option(longoption, expect, optarg);
+				longoption = long_options[option_index].name;
+				expect = options[longoption];
+				do_set_option = true;
 				}
 				break;
 
@@ -177,9 +210,17 @@ CommandLineOptions::ptr CommandLineParser::parse(int argc, char* const* argv)
 			default:
 				std::string s;
 				s += c;
-				std::string longoption = longopt[c];
-				bool expect = options[longoption];
+				longoption = longopt[c];
+				expect = options[longoption];
+				do_set_option = true;
+		}
+		if (do_set_option) {
+			if (library_options_handled) {
+				do_set_option = ! consume_library_option(longoption, expect, optarg );
+			}
+			if (do_set_option) {
 				clo->set_option(longoption, expect, optarg);
+			}
 		}
 	}
 	ensure_defaults_in( clo );
diff --git a/ipaacalib/cpp/src/ipaaca-fake.cc b/ipaacalib/cpp/src/ipaaca-fake.cc
index df0354c..c0d2797 100644
--- a/ipaacalib/cpp/src/ipaaca-fake.cc
+++ b/ipaacalib/cpp/src/ipaaca-fake.cc
@@ -49,16 +49,16 @@ IPAACA_EXPORT void FakeIU::add_fake_payload_item(const std::string& key, Payload
 {
 	_payload._remotely_enforced_setitem(key, entry);
 }
-IPAACA_EXPORT inline FakeIU::~FakeIU() { IPAACA_INFO("") }
+IPAACA_EXPORT inline FakeIU::~FakeIU() { }
 IPAACA_EXPORT inline Payload& FakeIU::payload() { return _payload; }
 IPAACA_EXPORT inline const Payload& FakeIU::const_payload() const { return _payload; }
-IPAACA_EXPORT inline void FakeIU::commit() { IPAACA_INFO("") }
-IPAACA_EXPORT inline void FakeIU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { IPAACA_INFO("") }
-IPAACA_EXPORT inline void FakeIU::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { IPAACA_INFO("")}
-IPAACA_EXPORT inline void FakeIU::_apply_update(IUPayloadUpdate::ptr update) { IPAACA_INFO("") }
-IPAACA_EXPORT inline void FakeIU::_apply_link_update(IULinkUpdate::ptr update) { IPAACA_INFO("") }
-IPAACA_EXPORT inline void FakeIU::_apply_commission() { IPAACA_INFO("") }
-IPAACA_EXPORT inline void FakeIU::_apply_retraction() { IPAACA_INFO("") }
+IPAACA_EXPORT inline void FakeIU::commit() { }
+IPAACA_EXPORT inline void FakeIU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { }
+IPAACA_EXPORT inline void FakeIU::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { }
+IPAACA_EXPORT inline void FakeIU::_apply_update(IUPayloadUpdate::ptr update) { }
+IPAACA_EXPORT inline void FakeIU::_apply_link_update(IULinkUpdate::ptr update) { }
+IPAACA_EXPORT inline void FakeIU::_apply_commission() { }
+IPAACA_EXPORT inline void FakeIU::_apply_retraction() { }
 
 } // of namespace ipaaca
 
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index 1992996..de82246 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -41,11 +41,15 @@ using namespace std;
 
 int fakeiu_main(int argc, char** argv)
 {
-	if (argc<2) {
-		std::cout << "Please provide json content as the first argument." << std::endl;
-		return 0;
-	}
-	std::string json_source(argv[1]);
+	//if (argc<2) {
+	//	std::cout << "Please provide json content as the first argument." << std::endl;
+	//	return 0;
+	//}
+	//
+	ipaaca::CommandLineParser::ptr parser = ipaaca::CommandLineParser::create();
+	ipaaca::CommandLineOptions::ptr options = parser->parse(argc, argv);
+
+	std::string json_source("[\"old\",2,3,4]");
 	ipaaca::PayloadDocumentEntry::ptr entry = ipaaca::PayloadDocumentEntry::from_json_string_representation(json_source);
 	
 	ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create();
@@ -134,12 +138,22 @@ int fakeiu_main(int argc, char** argv)
 	
 	std::cout << "Setting value [0] in the object:" << std::endl;
 	try {
-		iu->payload()["a"][0] = "set by pep::op=";
+		iu->payload()["a"][0] = "CHANGED_BY_USER";
 	} catch (ipaaca::PayloadAddressingError& e) {
 		std::cout << "  Error - the provided object was not a suitable array" << std::endl;
 	}
 	//iu->payload()["a"]["A"] = "set by pep::op=";
 	
+	
+	std::cout << "Appending two words to key 'b' the currently wrong way:" << std::endl;
+	auto proxy = iu->payload()["b"];
+	proxy = (std::string) proxy + " WORD1";
+	proxy = (std::string) proxy + " WORD2";
+	
+	std::cout << "Appending two words to key 'c' the compatible way:" << std::endl;
+	iu->payload()["c"] = (std::string) iu->payload()["c"] + " WORD1";
+	iu->payload()["c"] = (std::string) iu->payload()["c"] + " WORD2";
+	
 	std::cout << "Printing final payload using PayloadIterator:" << std::endl;
 	for (auto it = iu->payload().begin(); it != iu->payload().end(); ++it) {
 		std::cout << "  " << std::left << std::setw(15) << ((*it).first+": ") << (*it).second << std::endl;
@@ -172,7 +186,12 @@ int iu_main(int argc, char** argv)
 			std::cout << "Received a new IU, payload: " << iu->payload() << std::endl;
 			std::cout << "Will write something." << std::endl;
 			//iu->commit();
-			iu->payload()["list"][0] = "Overridden from C++";
+			try {
+				iu->payload()["list"][0] = "Overridden from C++";
+			} catch (ipaaca::PayloadAddressingError& e) {
+				iu->payload()["newKey"] = std::vector<long>{2,4,6,8};
+				std::cout << "  (item ['list'][0] could not be addressed, wrote new key)" << std::endl;
+			}
 		}
 	});
 	std::cout << "--- Waiting for IUs for 10s " << std::endl;
@@ -210,6 +229,6 @@ int iu_main(int argc, char** argv)
 
 int main(int argc, char** argv)
 {
-	//return fakeiu_main(argc, argv);
-	return 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 c82ab79..5c2f8bf 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -234,27 +234,18 @@ IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::create_null()
 }
 IPAACA_EXPORT PayloadDocumentEntry::ptr PayloadDocumentEntry::clone()
 {
-	IPAACA_INFO("Cloning from: " << this->json_source)
 	auto entry = PayloadDocumentEntry::from_json_string_representation(this->json_source);
-	IPAACA_INFO("Cloned entry contents: " << entry)
+	IPAACA_DEBUG("Cloned for copy-on-write, contents: " << entry)
 	return entry;
 }
 IPAACA_EXPORT rapidjson::Value& PayloadDocumentEntry::get_or_create_nested_value_from_proxy_path(PayloadEntryProxy* pep)
 {
 	if (!(pep->parent)) {
-		IPAACA_INFO("Reached top-most parent")
-		IPAACA_INFO("doc contents: " << document )
-		IPAACA_INFO("doc diag: " << value_diagnosis(&document))
 		return document;
 	}
-	IPAACA_INFO("(Check parent ...)")
 	rapidjson::Value& parent_value = get_or_create_nested_value_from_proxy_path(pep->parent);
-	IPAACA_INFO("(... back from parent)")
-	IPAACA_INFO("par contents: " << parent_value )
-	IPAACA_INFO("par diag: " << value_diagnosis(&parent_value))
-	IPAACA_INFO("Resolving address path")
 	if (pep->addressed_as_array) {
-		IPAACA_INFO("Addressed as array with index " << pep->addressed_index)
+		IPAACA_DEBUG("Addressed as array with index " << pep->addressed_index)
 		if (! parent_value.IsArray()) {
 			throw PayloadAddressingError();
 		} else {
@@ -291,14 +282,11 @@ IPAACA_EXPORT rapidjson::Value& PayloadDocumentEntry::get_or_create_nested_value
 			throw PayloadAddressingError();
 		}*/
 	} else {
-		IPAACA_INFO("Addressed as dict with key " << pep->addressed_key)
+		IPAACA_DEBUG("Addressed as dict with key " << pep->addressed_key)
 		// addressed as object (dict)
 		//rapidjson::Value& parent_value = *(pep->parent->json_value);
 		if (! parent_value.IsObject()) {
-			IPAACA_INFO("parent is not of type Object")
-			IPAACA_INFO("parent contents: " << *(pep->parent) )
-			IPAACA_INFO("parent_value contents: " << parent_value )
-			IPAACA_INFO("parent_value diag: " << value_diagnosis(&parent_value))
+			IPAACA_DEBUG("parent is not of type Object")
 			throw PayloadAddressingError();
 		} else {
 			rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
@@ -309,13 +297,10 @@ IPAACA_EXPORT rapidjson::Value& PayloadDocumentEntry::get_or_create_nested_value
 			key.SetString(pep->addressed_key, allocator);
 			auto it = parent_value.FindMember(key);
 			if (it != parent_value.MemberEnd()) {
-				IPAACA_INFO("Returning existing child Value")
 				return parent_value[key];
 			} else {
-				IPAACA_INFO("Creating new child Value")
 				rapidjson::Value val;
 				parent_value.AddMember(key, val, allocator);
-				IPAACA_INFO("Returning new child Value")
 				rapidjson::Value rkey;
 				rkey.SetString(pep->addressed_key, allocator);
 				return parent_value[rkey];
@@ -392,15 +377,12 @@ IPAACA_EXPORT void PayloadEntryProxy::connect_to_existing_parents()
 IPAACA_EXPORT PayloadEntryProxy::PayloadEntryProxy(Payload* payload, const std::string& key)
 : _payload(payload), _key(key), parent(nullptr)
 {
-	//IPAACA_INFO("PEP construction on parent document ...")
 	document_entry = _payload->get_entry(key);
 	json_value = &(document_entry->document);
-	//IPAACA_INFO("... parent done.")
 }
 IPAACA_EXPORT PayloadEntryProxy::PayloadEntryProxy(PayloadEntryProxy* parent_, const std::string& addr_key_)
 : parent(parent_), addressed_key(addr_key_), addressed_as_array(false)
 {
-	//IPAACA_INFO("PEP construction as dict child, addressed by " << addr_key_ << " ...")
 	_payload = parent->_payload;
 	_key = parent->_key;
 	document_entry = parent->document_entry;
@@ -412,18 +394,15 @@ IPAACA_EXPORT PayloadEntryProxy::PayloadEntryProxy(PayloadEntryProxy* parent_, c
 		json_value = nullptr; // avoid heap construction here
 		existent = false;
 	}
-	IPAACA_INFO("... dict child done.")
 }
 IPAACA_EXPORT PayloadEntryProxy::PayloadEntryProxy(PayloadEntryProxy* parent_, size_t addr_idx_)
 : parent(parent_), addressed_index(addr_idx_), addressed_as_array(true)
 {
-	//IPAACA_INFO("PEP construction as array child, addressed by " << addr_idx_ << " ...")
 	_payload = parent->_payload;
 	_key = parent->_key;
 	document_entry = parent->document_entry;
 	json_value = &(parent->json_value->operator[](addr_idx_));
 	existent = true;
-	IPAACA_INFO("... array child done.")
 }
 
 IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](const char* addr_key_)
@@ -433,11 +412,11 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](const char* addr_k
 IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](const std::string& addr_key_)
 {
 	if (!json_value) {
-		IPAACA_INFO("Invalid json_value!")
+		IPAACA_DEBUG("Invalid json_value!")
 		throw PayloadAddressingError();
 	}
 	if (! json_value->IsObject()) {
-		IPAACA_INFO("Expected Object for operator[](string)!")
+		IPAACA_DEBUG("Expected Object for operator[](string)!")
 		throw PayloadAddressingError();
 	}
 	return PayloadEntryProxy(this, addr_key_);
@@ -445,16 +424,16 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](const std::string&
 IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](size_t addr_idx_)
 {
 	if (!json_value) {
-		IPAACA_INFO("Invalid json_value!")
+		IPAACA_DEBUG("Invalid json_value!")
 		throw PayloadAddressingError();
 	}
 	if (! json_value->IsArray()) {
-		IPAACA_INFO("Expected Array for operator[](size_t)!")
+		IPAACA_DEBUG("Expected Array for operator[](size_t)!")
 		throw PayloadAddressingError();
 	}
 	long s = json_value->Size();
 	if (addr_idx_>=s) {
-		IPAACA_INFO("Array out of bounds!")
+		IPAACA_DEBUG("Array out of bounds!")
 		throw PayloadAddressingError();
 	}
 	return PayloadEntryProxy(this, addr_idx_);
@@ -462,7 +441,7 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](size_t addr_idx_)
 IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](int addr_idx_)
 {
 	if (addr_idx_ < 0) {
-		IPAACA_INFO("Negative index!")
+		IPAACA_DEBUG("Negative index!")
 		throw PayloadAddressingError();
 	}
 	return operator[]((size_t) addr_idx_);
@@ -619,17 +598,15 @@ IPAACA_EXPORT Payload::operator std::map<std::string, std::string>()
 }
 
 IPAACA_EXPORT void Payload::_internal_set(const std::string& k, PayloadDocumentEntry::ptr v, const std::string& writer_name) {
-	IPAACA_INFO("")
 	std::map<std::string, PayloadDocumentEntry::ptr> _new;
 	std::vector<std::string> _remove;
 	_new[k] = v;
 	_iu.lock()->_modify_payload(true, _new, _remove, writer_name );
-	IPAACA_INFO(" Setting local payload item \"" << k << "\" to " << v)
+	IPAACA_DEBUG(" Setting local payload item \"" << k << "\" to " << v)
 	_document_store[k] = v;
 	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::string& writer_name) {
-	IPAACA_INFO("")
 	std::map<std::string, PayloadDocumentEntry::ptr> _new;
 	std::vector<std::string> _remove;
 	_remove.push_back(k);
@@ -639,7 +616,6 @@ IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::st
 }
 IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, PayloadDocumentEntry::ptr>& new_contents, const std::string& writer_name)
 {
-	IPAACA_INFO("")
 	std::vector<std::string> _remove;
 	_iu.lock()->_modify_payload(false, new_contents, _remove, writer_name );
 	_document_store = new_contents;
@@ -647,7 +623,6 @@ IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, Pa
 }
 IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, PayloadDocumentEntry::ptr>& contents_to_merge, const std::string& writer_name)
 {
-	IPAACA_INFO("")
 	std::vector<std::string> _remove;
 	_iu.lock()->_modify_payload(true, contents_to_merge, _remove, writer_name );
 	for (auto& kv: contents_to_merge) {
@@ -679,7 +654,6 @@ IPAACA_EXPORT void Payload::_remotely_enforced_delitem(const std::string& k)
 }
 IPAACA_EXPORT void Payload::_remotely_enforced_setitem(const std::string& k, PayloadDocumentEntry::ptr entry)
 {
-	//IPAACA_INFO("Setting payload entry for \"" << k <<"\" to " << entry)
 	_document_store[k] = entry;
 	mark_revision_change();
 }
@@ -694,6 +668,7 @@ IPAACA_EXPORT PayloadIterator Payload::end()
 
 //}}}
 
+// PayloadIterator//{{{
 IPAACA_EXPORT PayloadIterator::PayloadIterator(Payload* payload, PayloadDocumentStore::iterator&& ref_it)
 : _payload(payload), reference_payload_revision(payload->internal_revision), raw_iterator(std::move(ref_it))
 {
@@ -727,5 +702,6 @@ IPAACA_EXPORT bool PayloadIterator::operator!=(const PayloadIterator& ref)
 	if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError();
 	return (raw_iterator!=ref.raw_iterator);
 }
+//}}}
 
 } // of namespace ipaaca
-- 
GitLab