diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index bb6db4492319896ff0fc689e6cdc663c76dc6f9c..59bc6e0c43e4a57a685a3519e1e00be3ddf2a061 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -167,6 +167,15 @@ struct api<container::ObjectsMap> { static std::list<sax::Token> compose(const container::ObjectsMap& data); }; +/* TODO for gcc-4.9 uncomment +template<typename ... Ts> +struct api<std::variant<Ts...>> { + static std::variant<Ts...> parse(std::list<sax::Token>& input); + static bool first(const std::list<sax::Token>& input); + static std::list<sax::Token> compose(const std::variant<Ts...>& data); +}; +*/ + template<> struct api<Object> { @@ -806,6 +815,23 @@ std::list<sax::Token> api<std::map<T, R>>::compose(const std::map<T, R>& input) return ToXMLComposers::containerComposer.compose<T, R>(input); } +/* TODO For gcc-4.9 uncomment +template<typename ... Ts> +std::variant<Ts...> api<std::variant<Ts...>>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::containerParser.parseVariant<Ts...>(input); +} + +template<typename ... Ts> +bool api<std::variant<Ts...>>::first(const std::list<sax::Token>& input) { + return true; +} + +template<typename ... Ts> +std::list<sax::Token> api<std::variant<Ts...>>::compose(const std::variant<Ts...>& input) { + return ToXMLComposers::containerComposer.compose<Ts...>(input); +} +*/ + } /* namespace alib */ #endif /* FROM_XML_PARSERS_HPP_ */ diff --git a/alib2data/src/container/ContainerFromXMLParser.hpp b/alib2data/src/container/ContainerFromXMLParser.hpp index d59a7146b3c08b1e3193a5e8e69a809d39809d61..3c1c7b6433dc2fb9fb0c703338c9dcf9bee6fa8c 100644 --- a/alib2data/src/container/ContainerFromXMLParser.hpp +++ b/alib2data/src/container/ContainerFromXMLParser.hpp @@ -8,15 +8,18 @@ #ifndef CONTAINER_FROM_XML_PARSER_H_ #define CONTAINER_FROM_XML_PARSER_H_ +#include "../std/variant.hpp" #include "../sax/FromXMLParserHelper.h" #include "ContainerFeatures.h" +#include "../object/Object.h" #include "ObjectsSet.h" #include "ObjectsVector.h" #include "ObjectsPair.h" #include "ObjectsMap.h" #include "Container.h" +#include "../exception/AlibException.h" namespace alib { @@ -54,6 +57,9 @@ class ContainerFromXMLParser : public sax::FromXMLParserHelper { ObjectsMap parseObjectsMap(std::list<sax::Token>& input) const; + template<typename ... Ts> + std::variant<Ts...> parseVariant(std::list<sax::Token>& input) const; + template<typename T> friend class alib::api; public: @@ -119,6 +125,24 @@ std::map<T, R> ContainerFromXMLParser::parseMap(std::list<sax::Token>& input) co return map; } +/* TODO for gcc-4.9 uncoment this +template<typename T> +T parseVariantHelper(std::list<sax::Token>&) { + throw exception::AlibException("Can't parse variant type"); +} + +template<typename T, typename R, typename ... Ts> +T parseVariantHelper(std::list<sax::Token>& input) { + if(alib::api<R>::first(input)) return T(alib::api<R>::parse(input)); + return parseVariantHelper<T, Ts...>(input); +} + +template<typename ... Ts> +std::variant<Ts...> ContainerFromXMLParser::parseVariant(std::list<sax::Token>& input) const { + return parseVariantHelper<std::variant<Ts...>, Ts...>(input); +} +*/ + } /* namespace container */ #endif /* CONTAINER_FROM_XML_PARSER_H_ */ diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp index 34de226b2bf6b7eb258daac3feac9b0740bd2994..83bf6432bf31570b0e4cdca58879a16a27763e69 100644 --- a/alib2data/src/container/ContainerToXMLComposer.hpp +++ b/alib2data/src/container/ContainerToXMLComposer.hpp @@ -9,6 +9,7 @@ #define CONTAINER_TO_XML_COMPOSER_H_ #include <list> +#include "../std/variant.hpp" #include "../sax/Token.h" #include "Container.h" @@ -63,6 +64,9 @@ class ContainerToXMLComposer { std::list<sax::Token> compose(const ObjectsMap& container) const; + template<typename ... Ts> + std::list<sax::Token> compose(const std::variant<Ts...>& container) const; + template<typename T> friend class alib::api; }; @@ -123,6 +127,24 @@ std::list<sax::Token> ContainerToXMLComposer::compose(const std::map<T, R>& cont return out; } +/* TODO for gcc-4.9 uncomment +template<typename T> +std::list<sax::Token> composeVariantHelper(const T&) { + throw exception::AlibException("Can't compose variant type"); +} + +template<typename T, typename R, typename ... Ts> +std::list<sax::Token> composeVariantHelper(const T& container) { + if(container.template is<R>()) return alib::api<R>::compose(container.template get<R>()); + return composeVariantHelper<T, Ts...>(container); +} + +template<typename ... Ts> +std::list<sax::Token> ContainerToXMLComposer::compose(const std::variant<Ts...>& container) const { + return composeVariantHelper<std::variant<Ts...>, Ts...>(container); +} +*/ + } /* namespace container */ #endif /* CONTAINER_TO_XML_COMPOSER_H_ */ diff --git a/alib2data/test-src/container/ContainerTest.cpp b/alib2data/test-src/container/ContainerTest.cpp index 3058921fb712da6f5ee7e2285cd0a76f406288f5..5ee70520698da5748a9306a9de8f53a356b3ba22 100644 --- a/alib2data/test-src/container/ContainerTest.cpp +++ b/alib2data/test-src/container/ContainerTest.cpp @@ -43,3 +43,19 @@ void ContainerTest::testXMLParser() { } } +/* TODO for gcc-4.9 uncomment +void ContainerTest::testVariantParsing() { + { + std::string string = "<String>aaa</String>"; + std::variant<int, std::string> object = alib::DataFactory::fromString<std::variant<int, std::string>>(string); + + CPPUNIT_ASSERT( "aaa" == object.get<std::string>()); + + std::string string2 = alib::DataFactory::toString(object); + + std::variant<int, std::string> object2 = alib::DataFactory::fromString<std::variant<int, std::string>>(string2); + + CPPUNIT_ASSERT( object == object2 ); + } +} +*/ diff --git a/alib2data/test-src/container/ContainerTest.h b/alib2data/test-src/container/ContainerTest.h index 4a210d5c5f17a25772a13fbc88dc6076c401e867..84e68b835a69d463dd464a0411c43f7e58356902 100644 --- a/alib2data/test-src/container/ContainerTest.h +++ b/alib2data/test-src/container/ContainerTest.h @@ -7,6 +7,9 @@ class ContainerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( ContainerTest ); CPPUNIT_TEST( testXMLParser ); +/* TODO for gcc-4.9 uncomment + CPPUNIT_TEST( testVariantParsing ); +*/ CPPUNIT_TEST_SUITE_END(); public: @@ -14,6 +17,9 @@ public: void tearDown(); void testXMLParser(); +/* TODO for gcc-4.9 uncomment + void testVariantParsing(); +*/ }; #endif // CONTAINER_TEST_H_