diff --git a/alib2common/src/container/ObjectsBitset.h b/alib2common/src/container/ObjectsBitset.h new file mode 100644 index 0000000000000000000000000000000000000000..dc5d599ea1d0d907969414a08a84dbb2a36c45ca --- /dev/null +++ b/alib2common/src/container/ObjectsBitset.h @@ -0,0 +1,97 @@ +/* + * Tuple.h + * + * Created on: May 4, 2017 + * Author: Jan Travnicek + */ + +#ifndef OBJECTS_BITSET_H_ +#define OBJECTS_BITSET_H_ + +#include <bitset> +#include <string> + +#include <core/xmlApi.hpp> +#include <exception/CommonException.h> + +#include <primitive/Bool.h> + +namespace container { + +/** + * Basic container from which are derived all other containers. + * Contains reason why the container occurred. + */ +class ObjectsBitset { +private: + explicit ObjectsBitset ( ); + +public: + static const std::string & getXmlTagName() { + static std::string xmlTagName = "Bitset"; + + return xmlTagName; + } + + template < size_t N > + static std::bitset < N > parseRaw ( std::deque < sax::Token >::iterator & input ); + + template < size_t N > + static void compose ( std::deque < sax::Token > & out, const std::bitset < N > & input ); +}; + + + +template < size_t N > +std::bitset < N > ObjectsBitset::parseRaw ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, ObjectsBitset::getXmlTagName() ); + + std::bitset < N > res; + + for ( size_t i = 0; i < N; ++i ) + res [ i ] = alib::xmlApi < bool >::parse ( input ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, ObjectsBitset::getXmlTagName() ); + + return res; +} + +template < size_t N > +void ObjectsBitset::compose ( std::deque < sax::Token > & out, const std::bitset < N > & container ) { + out.emplace_back ( ObjectsBitset::getXmlTagName(), sax::Token::TokenType::START_ELEMENT ); + + for ( size_t i = 0; i < N; ++i ) + alib::xmlApi < bool >::compose ( out, container [ i ] ); + + out.emplace_back ( ObjectsBitset::getXmlTagName(), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace container */ + +namespace alib { + +template < size_t N > +struct xmlApi < std::bitset < N > > { + static std::bitset < N > parse ( std::deque < sax::Token >::iterator & input ); + static bool first ( const std::deque < sax::Token >::const_iterator & input ); + static void compose ( std::deque < sax::Token > & output, const std::bitset < N > & data ); +}; + +template < size_t N > +std::bitset < N > xmlApi < std::bitset < N > >::parse ( std::deque < sax::Token >::iterator & input ) { + return container::ObjectsBitset::parseRaw < N > ( input ); +} + +template < size_t N > +bool xmlApi < std::bitset < N > >::first ( const std::deque < sax::Token >::const_iterator & input ) { + return sax::FromXMLParserHelper::isToken ( input, sax::Token::TokenType::START_ELEMENT, container::ObjectsBitset::getXmlTagName() ); +} + +template < size_t N > +void xmlApi < std::bitset < N > >::compose ( std::deque < sax::Token > & output, const std::bitset < N > & input ) { + return container::ObjectsBitset::compose < N > ( output, input ); +} + +} /* namespace alib */ + +#endif /* OBJECTS_BITSET_H_ */ diff --git a/alib2std/src/bitset b/alib2std/src/bitset new file mode 100644 index 0000000000000000000000000000000000000000..4e8b735ab4eb10a5011048bf1a5615df6d9950b1 --- /dev/null +++ b/alib2std/src/bitset @@ -0,0 +1,12 @@ +#ifndef __BITSET_HEADER_WRAPPER_ +#define __BITSET_HEADER_WRAPPER_ + +#include <bits/../bitset> +#include <ostream> +#include "compare" +#include "string" +#include "sstream" +#include "extensions/bitset.hpp" + +#endif /* __BITSET_HEADER_WRAPPER_ */ + diff --git a/alib2std/src/extensions/bitset.hpp b/alib2std/src/extensions/bitset.hpp new file mode 100644 index 0000000000000000000000000000000000000000..40102b33a1544839f28ddf757e50f828ed24c558 --- /dev/null +++ b/alib2std/src/extensions/bitset.hpp @@ -0,0 +1,47 @@ +/* + * bitset.hpp + * + * Created on: May 04, 2017 + * Author: Jan Travnicek + */ + +#ifndef __BITSET_HPP_ +#define __BITSET_HPP_ + +namespace std { + +template < size_t N > +std::ostream & operator << ( std::ostream & out, const std::bitset < N > & bitset ) { + out << "["; + + for ( size_t i = 0; i < N; ++i ) { + if ( i != 0 ) out << ", "; + out << bitset [ i ]; + } + + out << "]"; + return out; +} + +template < size_t N > +struct compare < bitset < N > > { + int operator ( ) ( const bitset < N > & first, const bitset < N > & second ) const { + for ( size_t i = 0; i < N; ++i ) { + int res = first [ i ] != second [ i ]; + if ( res != 0 ) + return res; + } + return 0; + } +}; + +template < size_t N > +string to_string ( const std::bitset < N > & value ) { + std::stringstream ss; + ss << value; + return ss.str ( ); +} + +} /* namespace std */ + +#endif /* __BITSET_HPP_ */