diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp index c99ee8e0a60d081dce2e9e74d889ff3cdb8cdd57..a6997c96a517ac22659e392353f817f2bfcfb060 100644 --- a/alib2data/src/Api.cpp +++ b/alib2data/src/Api.cpp @@ -47,6 +47,14 @@ std::list<sax::Token> api<container::ObjectsSet>::compose(const container::Objec return ToXMLComposers::containerComposer.compose(data); } +container::ObjectsVector api<container::ObjectsVector>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::containerParser.parseObjectsVector(input); +} + +std::list<sax::Token> api<container::ObjectsVector>::compose(const container::ObjectsVector& data) { + return ToXMLComposers::containerComposer.compose(data); +} + alib::Object api<alib::Object>::parse(std::list<sax::Token>& input) { return FromXMLParsers::objectParser.parseObject(input); } @@ -448,6 +456,10 @@ void ToXMLComposers::Visit(void* data, const container::ObjectsSet& container) c *((std::list<sax::Token>*) data) = std::move(api<container::ObjectsSet>::compose(container)); } +void ToXMLComposers::Visit(void* data, const container::ObjectsVector& container) const { + *((std::list<sax::Token>*) data) = std::move(api<container::ObjectsVector>::compose(container)); +} + void ToXMLComposers::Visit(void* data, const exception::AlibException& symbol) const { *((std::list<sax::Token>*) data) = std::move(api<exception::AlibException>::compose(symbol)); } diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp index 82a59480f339baa7ffbd387cfb90e54bbf1cfa76..c9a093098e91604ced590502b27e70cf9b781957 100644 --- a/alib2data/src/Api.hpp +++ b/alib2data/src/Api.hpp @@ -48,6 +48,18 @@ struct api<container::ObjectsSet> { static std::list<sax::Token> compose(const container::ObjectsSet& data); }; +template<typename T> +struct api<std::vector<T>> { + static std::vector<T> parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const std::vector<T>& data); +}; + +template<> +struct api<container::ObjectsVector> { + static container::ObjectsVector parse(std::list<sax::Token>& input); + static std::list<sax::Token> compose(const container::ObjectsVector& data); +}; + template<> struct api<Object> { @@ -433,6 +445,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type { void Visit(void*, const string::Epsilon& string) const; void Visit(void*, const container::ObjectsSet& set) const; + void Visit(void*, const container::ObjectsVector& set) const; public: static const label::LabelToXMLComposer labelComposer; @@ -458,6 +471,16 @@ std::list<sax::Token> api<std::set<T>>::compose(const std::set<T>& input) { return ToXMLComposers::containerComposer.compose<T>(input); } +template<typename T> +std::vector<T> api<std::vector<T>>::parse(std::list<sax::Token>& input) { + return FromXMLParsers::containerParser.parseVector<T>(input); +} + +template<typename T> +std::list<sax::Token> api<std::vector<T>>::compose(const std::vector<T>& input) { + return ToXMLComposers::containerComposer.compose<T>(input); +} + } /* namespace alib */ #endif /* FROM_XML_PARSERS_HPP_ */ diff --git a/alib2data/src/container/ContainerBase.h b/alib2data/src/container/ContainerBase.h index d3084c1e4be6ea1a00812f29230d4c26d239d6ff..f82d002ddb0524f0f42fb4c3131606d8b3986b80 100644 --- a/alib2data/src/container/ContainerBase.h +++ b/alib2data/src/container/ContainerBase.h @@ -14,7 +14,8 @@ namespace container { typedef std::acceptor_base< - container::ObjectsSet + container::ObjectsSet, + container::ObjectsVector > VisitableContainerBase; /** diff --git a/alib2data/src/container/ContainerFeatures.h b/alib2data/src/container/ContainerFeatures.h index 05e5cf6dc003776e1645fe7563857d6e84ee272c..dd827ed5abc79be8b38818093a159a922fe528be 100644 --- a/alib2data/src/container/ContainerFeatures.h +++ b/alib2data/src/container/ContainerFeatures.h @@ -11,7 +11,8 @@ namespace container { enum class FEATURES { - SET + SET, + VECTOR }; } /* namespace container */ diff --git a/alib2data/src/container/ContainerFromXMLParser.cpp b/alib2data/src/container/ContainerFromXMLParser.cpp index a5643ae6ef3052ee52e21c826702d2257bf9ddd2..e9245be4cdeed3ab819a895d8434b1cdb8526e24 100644 --- a/alib2data/src/container/ContainerFromXMLParser.cpp +++ b/alib2data/src/container/ContainerFromXMLParser.cpp @@ -11,7 +11,7 @@ namespace container { bool ContainerFromXMLParser::first(std::list<sax::Token>& input) const { - if(isToken(input, sax::Token::TokenType::START_ELEMENT, "set")) { + if(isToken(input, sax::Token::TokenType::START_ELEMENT, "set") || isToken(input, sax::Token::TokenType::START_ELEMENT, "vector")) { return true; } else { return false; @@ -19,15 +19,18 @@ bool ContainerFromXMLParser::first(std::list<sax::Token>& input) const { } Container ContainerFromXMLParser::parseContainer(std::list<sax::Token>& input) const { - return parseContainer(input, std::set<FEATURES>({FEATURES::SET})); + return parseContainer(input, std::set<FEATURES>({FEATURES::SET, FEATURES::VECTOR})); } Container ContainerFromXMLParser::parseContainer(std::list<sax::Token>& input, const std::set<FEATURES>& features) const { if(isToken(input, sax::Token::TokenType::START_ELEMENT, "set")) { if(!features.count(FEATURES::SET)) throw exception::AlibException(); return Container(parseObjectsSet(input)); + } else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "vector")) { + if(!features.count(FEATURES::VECTOR)) throw exception::AlibException(); + return Container(parseObjectsVector(input)); } else { - throw sax::ParserException(sax::Token("set", sax::Token::TokenType::START_ELEMENT), input.front()); + throw sax::ParserException(sax::Token("set / vector", sax::Token::TokenType::START_ELEMENT), input.front()); } } @@ -44,5 +47,18 @@ ObjectsSet ContainerFromXMLParser::parseObjectsSet(std::list<sax::Token>& input) return set; } +ObjectsVector ContainerFromXMLParser::parseObjectsVector(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "vector"); + + ObjectsVector vector; + + while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + vector.push_back(alib::api<alib::Object>::parse(input)); + } + + popToken(input, sax::Token::TokenType::END_ELEMENT, "vector"); + return vector; +} + } /* namespace container */ diff --git a/alib2data/src/container/ContainerFromXMLParser.hpp b/alib2data/src/container/ContainerFromXMLParser.hpp index c2277c9ad00190883b8467ce228bb483d63a318c..15da0d04fc1d165247ac2aacec07edb3947036a2 100644 --- a/alib2data/src/container/ContainerFromXMLParser.hpp +++ b/alib2data/src/container/ContainerFromXMLParser.hpp @@ -11,8 +11,8 @@ #include "../sax/FromXMLParserHelper.h" #include "ContainerFeatures.h" -#include <set> #include "ObjectsSet.h" +#include "ObjectsVector.h" #include "Container.h" @@ -37,6 +37,11 @@ class ContainerFromXMLParser : public sax::FromXMLParserHelper { ObjectsSet parseObjectsSet(std::list<sax::Token>& input) const; + template<typename T> + std::vector<T> parseVector(std::list<sax::Token>& input) const; + + ObjectsVector parseObjectsVector(std::list<sax::Token>& input) const; + template<typename T> friend class alib::api; public: @@ -63,6 +68,20 @@ std::set<T> ContainerFromXMLParser::parseSet(std::list<sax::Token>& input) const return set; } +template<typename T> +std::vector<T> ContainerFromXMLParser::parseVector(std::list<sax::Token>& input) const { + popToken(input, sax::Token::TokenType::START_ELEMENT, "vector"); + + std::vector<T> vector; + + while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) { + vector.push_back(alib::api<T>::parse(input)); + } + + popToken(input, sax::Token::TokenType::END_ELEMENT, "vector"); + return vector; +} + } /* namespace container */ #endif /* CONTAINER_FROM_XML_PARSER_H_ */ diff --git a/alib2data/src/container/ContainerToXMLComposer.cpp b/alib2data/src/container/ContainerToXMLComposer.cpp index 0f54aacce2373def3e04bf55664ceb9df28714e8..a3378f0c37a90d1c7c2b6a0cdd89005c92045783 100644 --- a/alib2data/src/container/ContainerToXMLComposer.cpp +++ b/alib2data/src/container/ContainerToXMLComposer.cpp @@ -33,5 +33,17 @@ std::list<sax::Token> ContainerToXMLComposer::compose(const ObjectsSet& containe return out; } +std::list<sax::Token> ContainerToXMLComposer::compose(const ObjectsVector& container) const { + std::list<sax::Token> out; + out.push_back(sax::Token("vector", sax::Token::TokenType::START_ELEMENT)); + + for(const alib::Object& item : container) { + out.splice(out.end(), alib::api<alib::Object>::compose(item)); + } + + out.push_back(sax::Token("vector", sax::Token::TokenType::END_ELEMENT)); + return out; +} + } /* namespace container */ diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp index 74eb8341f61df8616f1607b0914dde064767da13..7e0a5e31f8b7ab6d41a4876ed4bc5069299ef7f9 100644 --- a/alib2data/src/container/ContainerToXMLComposer.hpp +++ b/alib2data/src/container/ContainerToXMLComposer.hpp @@ -9,11 +9,11 @@ #define CONTAINER_TO_XML_COMPOSER_H_ #include <list> -#include <set> #include "../sax/Token.h" #include "Container.h" #include "ObjectsSet.h" +#include "ObjectsVector.h" namespace alib { @@ -47,6 +47,12 @@ class ContainerToXMLComposer { std::list<sax::Token> compose(const ObjectsSet& container) const; + + template<typename T> + std::list<sax::Token> compose(const std::vector<T>& container) const; + + std::list<sax::Token> compose(const ObjectsVector& container) const; + template<typename T> friend class alib::api; }; @@ -69,6 +75,19 @@ std::list<sax::Token> ContainerToXMLComposer::compose(const std::set<T>& contain return out; } +template<typename T> +std::list<sax::Token> ContainerToXMLComposer::compose(const std::vector<T>& container) const { + std::list<sax::Token> out; + out.push_back(sax::Token("vectort", sax::Token::TokenType::START_ELEMENT)); + + for(const T& item : container) { + out.splice(out.end(), alib::api<T>::compose(item)); + } + + out.push_back(sax::Token("vector", sax::Token::TokenType::END_ELEMENT)); + return out; +} + } /* namespace container */ #endif /* CONTAINER_TO_XML_COMPOSER_H_ */ diff --git a/alib2data/src/container/ObjectsSet.h b/alib2data/src/container/ObjectsSet.h index 54a67004d221aba69cc1240f3b78802c3964e5d0..7aadcb917a7c9817a3a5bae6b1653c956d8e0df7 100644 --- a/alib2data/src/container/ObjectsSet.h +++ b/alib2data/src/container/ObjectsSet.h @@ -5,8 +5,8 @@ * Author: Jan Travnicek */ -#ifndef SET_H_ -#define SET_H_ +#ifndef OBJECTS_SET_H_ +#define OBJECTS_SET_H_ #include <set> #include <string> @@ -44,4 +44,4 @@ public: } /* namespace container */ -#endif /* SET_H_ */ +#endif /* OBJECTS_SET_H_ */ diff --git a/alib2data/src/container/ObjectsVector.cpp b/alib2data/src/container/ObjectsVector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d8105a41d2f1885184cf6388b93828972ccd27e0 --- /dev/null +++ b/alib2data/src/container/ObjectsVector.cpp @@ -0,0 +1,55 @@ +/* + * Set.cpp + * + * Created on: Apr 1, 2013 + * Author: Jan Travnicek + */ + +#include "ObjectsVector.h" +#include "../std/vector.hpp" + +#include <cstdlib> +#include <iostream> +#include <sstream> + +namespace container { + +ContainerBase* ObjectsVector::clone() const { + return new ObjectsVector(*this); +} + +ContainerBase* ObjectsVector::plunder() && { + return new ObjectsVector(std::move(*this)); +} + +bool ObjectsVector::operator==(const ObjectBase& other) const { + return other == *this; +} + +bool ObjectsVector::operator<(const ObjectBase& other) const { + return other > *this; +} + +bool ObjectsVector::operator>(const ObjectBase& other) const { + return other < *this; +} + +bool ObjectsVector::operator==(const ObjectsVector& other) const { + return static_cast<const std::vector<alib::Object>>(*this) == static_cast<const std::vector<alib::Object>>(other); +} + +bool ObjectsVector::operator<(const ObjectsVector& other) const { + return static_cast<const std::vector<alib::Object>>(*this) < static_cast<const std::vector<alib::Object>>(other); +} + +void ObjectsVector::operator>>(std::ostream& os) const { + os << *this; +} + +ObjectsVector::operator std::string() const { + std::stringstream ss; + ss << *this; + return std::move(ss).str(); +} + +} /* namespace container */ diff --git a/alib2data/src/container/ObjectsVector.h b/alib2data/src/container/ObjectsVector.h new file mode 100644 index 0000000000000000000000000000000000000000..4396d458e6536ec3413f04437238c5cad49745b8 --- /dev/null +++ b/alib2data/src/container/ObjectsVector.h @@ -0,0 +1,47 @@ +/* + * Set.h + * + * Created on: Apr 1, 2013 + * Author: Jan Travnicek + */ + +#ifndef OBJECTS_VECTOR_H_ +#define OBJECTS_VECTOR_H_ + +#include <vector> +#include <string> + +#include "../object/Object.h" +#include "ContainerBase.h" + +namespace container { + +/** + * Basic container from which are derived all other containers. + * Contains reason why the container occured. + */ +class ObjectsVector : public std::vector<alib::Object>, public std::acceptor<ObjectsVector, VisitableContainerBase, std::acceptor<ObjectsVector, alib::VisitableObjectBase, ContainerBase> > { +public: + virtual ContainerBase* clone() const; + + virtual ContainerBase* plunder() &&; + + virtual bool operator>(const alib::ObjectBase& other) const; + virtual bool operator==(const alib::ObjectBase& other) const; + virtual bool operator<(const alib::ObjectBase& other) const; + + virtual bool operator==(const ObjectsVector& other) const; + virtual bool operator<(const ObjectsVector& other) const; + + virtual void operator>>(std::ostream& os) const; + + virtual operator std::string() const; + + virtual int selfTypeId() const { + return typeId(*this); + } +}; + +} /* namespace container */ + +#endif /* OBJECTS_VECTOR_H_ */ diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h index ceaf184d492374810931ea5efb237778096ab967..4e4b29d68707ea266c939a1d329dddc99a780388 100644 --- a/alib2data/src/object/ObjectBase.h +++ b/alib2data/src/object/ObjectBase.h @@ -91,6 +91,7 @@ class EndSymbol; namespace container { class ObjectsSet; +class ObjectsVector; } @@ -104,7 +105,7 @@ typedef std::acceptor_base< regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, - container::ObjectsSet + container::ObjectsSet, container::ObjectsVector > VisitableObjectBase; class ObjectBase : @@ -117,7 +118,7 @@ class ObjectBase : regexp::UnboundedRegExp, regexp::FormalRegExp, string::Epsilon, string::LinearString, string::CyclicString, alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, - container::ObjectsSet + container::ObjectsSet, container::ObjectsVector >, public VisitableObjectBase { };