From 54da0a4c0cceae947afbde586a97d1cc60c50ed8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 16 Aug 2013 10:40:42 +0200
Subject: Added EnumParser.

Change-Id: I00b8a052d9d7f761b7bbbaeba7e06990ac5c2087

diff --git a/Swiften/Parser/EnumParser.h b/Swiften/Parser/EnumParser.h
new file mode 100644
index 0000000..d7bdbbc
--- /dev/null
+++ b/Swiften/Parser/EnumParser.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2013 Remko Tronçon
+ * Licensed under the GNU General Public License.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <string>
+#include <map>
+#include <cassert>
+#include <boost/optional.hpp>
+
+#include <Swiften/Base/Override.h>
+#include <Swiften/Base/API.h>
+
+namespace Swift {
+	template<typename T>
+	class SWIFTEN_API EnumParser {
+		public:
+			EnumParser() {
+			}
+
+			EnumParser& operator()(T value, const std::string& text) {
+				values[text] = value;
+				return *this;
+			}
+
+			boost::optional<T> parse(const std::string& value) {
+				typename std::map<std::string, T>::const_iterator i = values.find(value);
+				return i == values.end() ? boost::optional<T>() : i->second;
+			}
+
+		private:
+			std::map<std::string, T> values;
+	};
+}
diff --git a/Swiften/Parser/UnitTest/EnumParserTest.cpp b/Swiften/Parser/UnitTest/EnumParserTest.cpp
new file mode 100644
index 0000000..44a30c0
--- /dev/null
+++ b/Swiften/Parser/UnitTest/EnumParserTest.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2013 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#include <Swiften/Parser/EnumParser.h>
+
+using namespace Swift;
+
+class EnumParserTest : public CppUnit::TestFixture {
+		CPPUNIT_TEST_SUITE(EnumParserTest);
+		CPPUNIT_TEST(testParse);
+		CPPUNIT_TEST(testParse_NoValue);
+		CPPUNIT_TEST_SUITE_END();
+
+	public:
+		enum MyEnum {
+			MyValue1,
+			MyValue2,
+			MyValue3
+		};
+
+		void testParse() {
+			CPPUNIT_ASSERT(MyValue2 == EnumParser<MyEnum>()(MyValue1, "my-value-1")(MyValue2, "my-value-2")(MyValue3, "my-value-3").parse("my-value-2"));
+		}
+
+		void testParse_NoValue() {
+			CPPUNIT_ASSERT(!EnumParser<MyEnum>()(MyValue1, "my-value-1")(MyValue2, "my-value-2")(MyValue3, "my-value-3").parse("my-value-4"));
+		}
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(EnumParserTest);
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 9da1858..b2c47f1 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -374,6 +374,7 @@ if env["SCONS_STAGE"] == "build" :
 			File("Parser/PayloadParsers/UnitTest/IdleParserTest.cpp"),
 			File("Parser/UnitTest/BOSHBodyExtractorTest.cpp"),
 			File("Parser/UnitTest/AttributeMapTest.cpp"),
+			File("Parser/UnitTest/EnumParserTest.cpp"),
 			File("Parser/UnitTest/IQParserTest.cpp"),
 			File("Parser/UnitTest/GenericPayloadTreeParserTest.cpp"),
 			File("Parser/UnitTest/MessageParserTest.cpp"),
-- 
cgit v0.10.2-6-g49f6