simplify FOR cycles v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 05 Dec 2020 19:32:05 +0100
branchv_0
changeset 4 c176766462c5
parent 3 64f8f8792470
child 5 399380ea9750
simplify FOR cycles
src/YAMLCommand.h
--- a/src/YAMLCommand.h	Sat Dec 05 19:17:21 2020 +0100
+++ b/src/YAMLCommand.h	Sat Dec 05 19:32:05 2020 +0100
@@ -115,7 +115,7 @@
 	};
 
 	using YAMLEvent_p = std::shared_ptr<YAMLEvent>;
-	
+
 	YAMLParser parser;
 	std::shared_ptr<relpipe::writer::RelationalWriter> writer;
 
@@ -145,6 +145,11 @@
 		else throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected SCALAR, but got: " + event->getTypeName());
 	}
 
+	bool until(const yaml_event_type_t until, YAMLEvent_p& event) {
+		event = YAMLEvent_p(parser.next());
+		return event && event->getType() != until;
+	}
+
 	void processRelation() {
 		YAMLEvent_p event = YAMLEvent_p(parser.next());
 		if (event->getType() == YAML_MAPPING_START_EVENT) processRelationWithMetadata();
@@ -156,11 +161,11 @@
 		consumeEvent(YAML_SCALAR_EVENT, L"attribute-metadata");
 		consumeEvent(YAML_SEQUENCE_START_EVENT);
 
-		for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) {
+		for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) {
 			if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (attribute-metadata), but got: " + event->getTypeName());
 			relpipe::writer::string_t name;
 			relpipe::writer::string_t type = L"string";
-			for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+			for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
 				auto key = fetchScalarValue(event);
 				auto value = consumeScalarEvent();
 				if (key == L"name") name = value;
@@ -188,7 +193,7 @@
 		// First record:
 		consumeEvent(YAML_MAPPING_START_EVENT);
 		record.clear();
-		for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+		for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
 			auto name = fetchScalarValue(event);
 			auto value = consumeScalarEvent();
 			attributesMetadata.push_back({name, relpipe::writer::TypeId::STRING});
@@ -202,11 +207,11 @@
 	}
 
 	void processRecords() {
-		for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_SEQUENCE_END_EVENT; event = YAMLEvent_p(parser.next())) {
+		for (YAMLEvent_p event; until(YAML_SEQUENCE_END_EVENT, event);) {
 			if (event->getType() != YAML_MAPPING_START_EVENT) throw relpipe::writer::RelpipeWriterException(L"Invalid YAML structure: expected MAPPING (record), but got: " + event->getTypeName());
 			record.clear();
 			record.resize(attributesMetadata.size());
-			for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+			for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
 				auto name = fetchScalarValue(event);
 				auto value = consumeScalarEvent();
 				for (int i = 0; i < attributesMetadata.size(); i++) {
@@ -237,7 +242,7 @@
 		consumeEvent(YAML_DOCUMENT_START_EVENT);
 		consumeEvent(YAML_MAPPING_START_EVENT);
 
-		for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event && event->getType() != YAML_MAPPING_END_EVENT; event = YAMLEvent_p(parser.next())) {
+		for (YAMLEvent_p event; until(YAML_MAPPING_END_EVENT, event);) {
 			relationName = fetchScalarValue(event);
 			attributesMetadata.clear();
 			processRelation();