1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*-----------------------------------------------------------------------------+
- 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
|