diff --git a/alib2common/src/container/ContainerFeatures.h b/alib2common/src/container/ContainerFeatures.h index 3a62620ac3f5d0f84c12d6da08712d1f30729661..5e00491d5319e0af8b8b6377406dec99bbc459e2 100644 --- a/alib2common/src/container/ContainerFeatures.h +++ b/alib2common/src/container/ContainerFeatures.h @@ -24,6 +24,7 @@ class ContainerBase; template < class ElementType = alib::Object > class ObjectsDeque; +template < class ElementType = alib::Object > class ObjectsList; class ObjectsMap; class ObjectsPair; diff --git a/alib2common/src/container/ObjectsList.cpp b/alib2common/src/container/ObjectsList.cpp index 01f88d81048030d2c73e49a9ddf77a5fa21c6cda..03444089e9263940c32dd9a076e5e0884e1a4d6f 100644 --- a/alib2common/src/container/ObjectsList.cpp +++ b/alib2common/src/container/ObjectsList.cpp @@ -8,54 +8,10 @@ #include "ObjectsList.h" #include "Container.h" -#include <object/Object.h> -#include <sstream> - -namespace container { - -ObjectsList::ObjectsList ( std::list < alib::Object > list ) : std::list < alib::Object > ( std::move ( list ) ) { -} - -ObjectsList::ObjectsList ( ) : std::list < alib::Object > ( ) { -} - -ContainerBase * ObjectsList::clone ( ) const { - return new ObjectsList ( * this ); -} - -ContainerBase * ObjectsList::plunder ( ) && { - return new ObjectsList ( std::move ( * this ) ); -} - -int ObjectsList::compare ( const ObjectsList & other ) const { - std::compare < std::list < alib::Object > > comp; - - return comp ( static_cast < const std::list < alib::Object > > ( * this ), static_cast < const std::list < alib::Object > > ( other ) ); -} - -void ObjectsList::operator >>( std::ostream & os ) const { - os << "(ObjectsList " << static_cast < const std::list < alib::Object > > ( * this ) << ")"; -} - -ObjectsList::operator std::string ( ) const { - std::stringstream ss; - ss << * this; - return std::move ( ss ).str ( ); -} - -ObjectsList ObjectsList::parse ( std::deque < sax::Token >::iterator & input ) { - return ObjectsList ( parseRaw < alib::Object > ( input ) ); -} - -void ObjectsList::compose ( std::deque < sax::Token > & out ) const { - compose ( out, * this ); -} - -} /* namespace container */ namespace alib { -auto objectsListParserRegister = xmlApi < container::Container >::ParserRegister < container::ObjectsList > (); -auto objectsListParserRegister2 = xmlApi < alib::Object >::ParserRegister < container::ObjectsList > (); +auto objectsListParserRegister = xmlApi < container::Container >::ParserRegister < container::ObjectsList < > > (); +auto objectsListParserRegister2 = xmlApi < alib::Object >::ParserRegister < container::ObjectsList < > > (); } /* namespace alib */ diff --git a/alib2common/src/container/ObjectsList.h b/alib2common/src/container/ObjectsList.h index d482e683d85c5a1f6d935f6ea94637fa21384d9e..c6f555ee13aa02b21272bcb1f9c33c7dd14fdd68 100644 --- a/alib2common/src/container/ObjectsList.h +++ b/alib2common/src/container/ObjectsList.h @@ -10,9 +10,10 @@ #include <list> #include <string> +#include <sstream> -#include <object/Object.h> #include "ContainerBase.h" +#include "ContainerFeatures.h" #include <core/xmlApi.hpp> @@ -22,9 +23,10 @@ namespace container { * Basic container from which are derived all other containers. * Contains reason why the container occured. */ -class ObjectsList : public std::list < alib::Object >, public ContainerBase { +template < class ElementType > +class ObjectsList : public std::list < ElementType >, public ContainerBase { public: - explicit ObjectsList ( std::list < alib::Object > ); + explicit ObjectsList ( std::list < ElementType > ); explicit ObjectsList ( ); virtual ContainerBase * clone ( ) const; @@ -50,35 +52,80 @@ public: } static ObjectsList parse ( std::deque < sax::Token >::iterator & input ); - template < class T > - static std::list < T > parseRaw ( std::deque < sax::Token >::iterator & input ); + static std::list < ElementType > parseRaw ( std::deque < sax::Token >::iterator & input ); void compose ( std::deque < sax::Token > & out ) const; - template < class T > - static void compose ( std::deque < sax::Token > & out, const std::list < T > & input ); + static void compose ( std::deque < sax::Token > & out, const std::list < ElementType > & input ); }; -template < class T > -std::list < T > ObjectsList::parseRaw ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ObjectsList::getXmlTagName() ); +template < class ElementType > +ObjectsList < ElementType >::ObjectsList ( std::list < ElementType > list ) : std::list < ElementType > ( std::move ( list ) ) { +} + +template < class ElementType > +ObjectsList < ElementType >::ObjectsList ( ) : std::list < ElementType > ( ) { +} + +template < class ElementType > +ContainerBase * ObjectsList < ElementType >::clone ( ) const { + return new ObjectsList ( * this ); +} + +template < class ElementType > +ContainerBase * ObjectsList < ElementType >::plunder ( ) && { + return new ObjectsList ( std::move ( * this ) ); +} + +template < class ElementType > +int ObjectsList < ElementType >::compare ( const ObjectsList & other ) const { + std::compare < std::list < ElementType > > comp; + + return comp ( static_cast < const std::list < ElementType > > ( * this ), static_cast < const std::list < ElementType > > ( other ) ); +} + +template < class ElementType > +void ObjectsList < ElementType >::operator >>( std::ostream & os ) const { + os << "(ObjectsList " << static_cast < const std::list < ElementType > > ( * this ) << ")"; +} + +template < class ElementType > +ObjectsList < ElementType >::operator std::string ( ) const { + std::stringstream ss; + ss << * this; + return std::move ( ss ).str ( ); +} + +template < class ElementType > +ObjectsList < ElementType > ObjectsList < ElementType >::parse ( std::deque < sax::Token >::iterator & input ) { + return ObjectsList < ElementType > ( parseRaw ( input ) ); +} + +template < class ElementType > +void ObjectsList < ElementType >::compose ( std::deque < sax::Token > & out ) const { + compose ( out, * this ); +} + +template < class ElementType > +std::list < ElementType > ObjectsList < ElementType >::parseRaw ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ObjectsList < >::getXmlTagName() ); - std::list < T > list; + std::list < ElementType > list; while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) - list.push_back ( alib::xmlApi < T >::parse ( input ) ); + list.push_back ( alib::xmlApi < ElementType >::parse ( input ) ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ObjectsList::getXmlTagName() ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ObjectsList < >::getXmlTagName() ); return list; } -template < class T > -void ObjectsList::compose ( std::deque < sax::Token > & out, const std::list < T > & input ) { - out.emplace_back ( ObjectsList::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); +template < class ElementType > +void ObjectsList < ElementType >::compose ( std::deque < sax::Token > & out, const std::list < ElementType > & input ) { + out.emplace_back ( ObjectsList < >::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); - for ( const T & item : input ) - alib::xmlApi < T >::compose ( out, item ); + for ( const ElementType & item : input ) + alib::xmlApi < ElementType >::compose ( out, item ); - out.emplace_back ( ObjectsList::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); + out.emplace_back ( ObjectsList < >::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); } } /* namespace container */ @@ -94,17 +141,17 @@ struct xmlApi < std::list < T > > { template < typename T > std::list < T > xmlApi < std::list < T > >::parse ( std::deque < sax::Token >::iterator & input ) { - return container::ObjectsList::parseRaw < T > ( input ); + return container::ObjectsList < T >::parseRaw ( input ); } template < typename T > bool xmlApi < std::list < T > >::first ( const std::deque < sax::Token >::const_iterator & input ) { - return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, container::ObjectsList::getXmlTagName() ); + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, container::ObjectsList < >::getXmlTagName() ); } template < typename T > void xmlApi < std::list < T > >::compose ( std::deque < sax::Token > & output, const std::list < T > & input ) { - return container::ObjectsList::compose < T > ( output, input ); + return container::ObjectsList < T >::compose ( output, input ); } } /* namespace alib */