Skip to content
Snippets Groups Projects
Commit 72c2aae1 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

bitset extensions plus parsing and composing

parent 73e75c48
No related branches found
No related tags found
No related merge requests found
Pipeline #
/*
* 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_ */
#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_ */
/*
* 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_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment