/*-----------------------------------------------------------------------------+ Author: Joachim Faulhaber Copyright (c) 2009-2009: Joachim Faulhaber +------------------------------------------------------------------------------+ Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENCE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +-----------------------------------------------------------------------------*/ #ifndef BOOST_LIBS_ICL_EXAMPLE_LARGE_BITSET_BITS_HPP_JOFA_091019 #define BOOST_LIBS_ICL_EXAMPLE_LARGE_BITSET_BITS_HPP_JOFA_091019 //[mini_bits_includes // These includes are needed ... #include <string> // for conversion to output and to #include <boost/icl/type_traits/has_set_semantics.hpp>//declare that bits has the // behavior of a set. //] namespace mini { //[mini_bits_class_bits template<class NaturalT> class bits { public: typedef NaturalT word_type; static const int digits = std::numeric_limits<NaturalT>::digits; static const word_type w1 = static_cast<NaturalT>(1) ; bits():_bits(){} explicit bits(word_type value):_bits(value){} word_type word()const{ return _bits; } bits& operator |= (const bits& value){_bits |= value._bits; return *this;} bits& operator &= (const bits& value){_bits &= value._bits; return *this;} bits& operator ^= (const bits& value){_bits ^= value._bits; return *this;} bits operator ~ ()const { return bits(~_bits); } bool operator < (const bits& value)const{return _bits < value._bits;} bool operator == (const bits& value)const{return _bits == value._bits;} bool contains(word_type element)const{ return ((w1 << element) & _bits) != 0; } std::string as_string(const char off_on[2] = " 1")const; private: word_type _bits; }; //] template<class NaturalT> std::string bits<NaturalT>::as_string(const char off_on[2])const { std::string sequence; for(int bit=0; bit < digits; bit++) sequence += contains(bit) ? off_on[1] : off_on[0]; return sequence; } } // mini //[mini_bits_is_set namespace boost { namespace icl { template<class NaturalT> struct is_set<mini::bits<NaturalT> > { typedef is_set<mini::bits<NaturalT> > type; BOOST_STATIC_CONSTANT(bool, value = true); }; template<class NaturalT> struct has_set_semantics<mini::bits<NaturalT> > { typedef has_set_semantics<mini::bits<NaturalT> > type; BOOST_STATIC_CONSTANT(bool, value = true); }; }} //] #endif