瀏覽代碼

Added a persistent string list.

David Piuva 5 年之前
父節點
當前提交
816bc336a1

+ 80 - 0
Source/DFPSR/persistent/atomic/PersistentStringList.cpp

@@ -0,0 +1,80 @@
+// zlib open source license
+//
+// Copyright (c) 2020 David Forsgren Piuva
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+//    1. The origin of this software must not be misrepresented; you must not
+//    claim that you wrote the original software. If you use this software
+//    in a product, an acknowledgment in the product documentation would be
+//    appreciated but is not required.
+//
+//    2. Altered source versions must be plainly marked as such, and must not be
+//    misrepresented as being the original software.
+//
+//    3. This notice may not be removed or altered from any source
+//    distribution.
+
+#include "PersistentStringList.h"
+#include "../../collection/List.h"
+
+using namespace dsr;
+
+PERSISTENT_DEFINITION(PersistentStringList)
+
+bool PersistentStringList::assignValue(const ReadableString &text) {
+	bool quoted = false;
+	bool hadComma = true;
+	int start = 0;
+	for (int i = 0; i < text.length(); i++) {
+		DsrChar c = text[i];
+		if (quoted) {
+			if (c == U'\\') { // Escape sequence
+				i++; // Skip the following character as content
+			} else if (c == U'\"') { // Quote sign
+				// End the quote
+				String content = string_unmangleQuote(string_removeOuterWhiteSpace(text.inclusiveRange(start, i)));
+				this->value.push(content);
+				hadComma = false;
+				quoted = false;
+			}
+		} else {
+			if (c == U',') {
+				// Assert correct use of comma separation
+				if (hadComma) {
+					throwError(U"Comma separated lists must have quotes around all individual elements to distinguish an empty list from an empty string!\n");
+				} else {
+					hadComma = true;
+				}
+			} else if (c == U'\"') { // Quote sign
+				// Start the quote
+				if (!hadComma) {
+					throwError(U"String lists must be separated by commas!\n");
+				}
+				quoted = true;
+				start = i;
+			}
+		}
+	}
+	if (hadComma) {
+		throwError(U"String lists may not end with a comma!\n");
+	}
+	return true;
+}
+
+String& PersistentStringList::toStreamIndented(String& out, const ReadableString& indentation) const {
+	string_append(out, indentation);
+	for (int i = 0; i < this->value.length(); i++) {
+		if (i > 0) {
+			string_append(out, ", ");
+		}
+		string_append(out, string_mangleQuote(this->value[i]));
+	}
+	return out;
+}

+ 44 - 0
Source/DFPSR/persistent/atomic/PersistentStringList.h

@@ -0,0 +1,44 @@
+// zlib open source license
+//
+// Copyright (c) 2020 David Forsgren Piuva
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+//    1. The origin of this software must not be misrepresented; you must not
+//    claim that you wrote the original software. If you use this software
+//    in a product, an acknowledgment in the product documentation would be
+//    appreciated but is not required.
+//
+//    2. Altered source versions must be plainly marked as such, and must not be
+//    misrepresented as being the original software.
+//
+//    3. This notice may not be removed or altered from any source
+//    distribution.
+
+#ifndef DFPSR_GUI_PERSISTENTSTRINGLIST
+#define DFPSR_GUI_PERSISTENTSTRINGLIST
+
+#include "../ClassFactory.h"
+
+namespace dsr {
+
+class PersistentStringList : public Persistent {
+public:
+	PERSISTENT_DECLARATION(PersistentStringList)
+	List<String> value;
+public:
+	PersistentStringList() : value() {}
+public:
+	virtual bool assignValue(const ReadableString &text) override;
+	virtual String& toStreamIndented(String& out, const ReadableString& indentation) const override;
+};
+
+}
+
+#endif

+ 1 - 0
Source/DFPSR/persistent/includePersistent.h

@@ -5,5 +5,6 @@
 #include "atomic/PersistentBoolean.h"
 #include "atomic/PersistentInteger.h"
 #include "atomic/PersistentString.h"
+#include "atomic/PersistentStringList.h"
 #include "atomic/PersistentColor.h"
 

+ 12 - 1
Source/test/tests/PersistentTest.cpp

@@ -158,5 +158,16 @@ START_TEST(Persistent)
 	// Tree structure from text
 	std::shared_ptr<Persistent> treeCopy = createPersistentClassFromText(exampleThree);
 	ASSERT_MATCH(treeCopy->toString(), exampleThree);
-END_TEST
 
+	PersistentStringList myList = PersistentStringList();
+	ASSERT_EQUAL(myList.value.length(), 0);
+	ASSERT_MATCH(myList.toString(), U"");
+
+	myList = PersistentStringList(U"\"Zero 0\", \"One 1\", \"Two 2\", \"Three 3\"");
+	ASSERT_EQUAL(myList.value.length(), 4);
+	ASSERT_MATCH(myList.value[0], U"Zero 0");
+	ASSERT_MATCH(myList.value[1], U"One 1");
+	ASSERT_MATCH(myList.value[2], U"Two 2");
+	ASSERT_MATCH(myList.value[3], U"Three 3");
+	ASSERT_MATCH(myList.toString(), U"\"Zero 0\", \"One 1\", \"Two 2\", \"Three 3\"");
+END_TEST