- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

# bitset.hh

Go to the documentation of this file.

    00001 // bitset.hh: this file is part of the Vaucanson project.
    00002 //
    00003 // Vaucanson, a generic library for finite state machines.
    00004 //
    00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
    00006 //
    00007 // This program is free software; you can redistribute it and/or
    00008 // modify it under the terms of the GNU General Public License
    00009 // as published by the Free Software Foundation; either version 2
    00010 // of the License, or (at your option) any later version.
    00011 //
    00012 // The complete GNU General Public Licence Notice can be found as the
    00013 // `COPYING' file in the root directory.
    00014 //
    00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
    00016 //
    00017 #ifndef VCSN_MISC_BITSET_HH
    00018 # define VCSN_MISC_BITSET_HH
    00019
    00028 # include <iterator>
    00029 # include <iostream>
    00030 # include <functional>
    00031
    00032 namespace vcsn
    00033 {
    00034   namespace misc
    00035   {
    00036
    00045     struct Bitset
    00046     {
    00047         typedef int                     key_type;
    00048         typedef int                     value_type;
    00049         typedef std::less<key_type>     key_compare;
    00050         typedef key_compare             value_compare;
    00051         // FIXME: Missing to be std::set compliant: allocator_type.
    00052         // FIXME: reference and const_reference are not real references, because
    00053         // it would prevents a code using a reverse_iterator to compile.
    00054         typedef value_type              reference;
    00055         typedef const value_type        const_reference;
    00056         struct                          iterator;
    00057         struct                          const_iterator;
    00058         typedef unsigned int            size_type;
    00059         typedef int                     difference_type;
    00060         typedef value_type*             pointer;
    00061         typedef const value_type*       const_pointer;
    00062         typedef std::reverse_iterator<iterator>         reverse_iterator;
    00063         typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
    00064
    00065         // data_type is the type used for the bit field.
    00066         typedef unsigned int            data_type;
    00067
    00068         // FIXME: Constructors have almost nothing common to std::set.
    00069
    00075         Bitset (size_type max);
    00076
    00078         Bitset (size_type max, const data_type* data);
    00079
    00081         Bitset (const Bitset& bs);
    00082
    00084         template <class InputIterator>
    00085         Bitset (InputIterator first, InputIterator last);
    00086
    00088         ~Bitset ();
    00089
    00091         Bitset& operator= (const Bitset& rhs);
    00092
    00094
    00095         iterator        begin ();
    00096         const_iterator  begin () const;
    00097         iterator        end ();
    00098         const_iterator  end () const;
    00101
    00102
    00103         reverse_iterator                rbegin ();
    00104         const_reverse_iterator  rbegin () const;
    00105         reverse_iterator                rend ();
    00106         const_reverse_iterator  rend () const;
    00109         bool    empty () const;
    00110         size_type       size () const;
    00111         size_type       max_size () const;
    00112
    00114
    00115         std::pair<iterator, bool>       insert (const value_type& x);
    00116         iterator                        insert (iterator position, const value_type& x);
    00117         template <class InputIterator>
    00118         void                    insert (InputIterator first,
    00119                                         InputIterator last);
    00122
    00123
    00124         void    erase (iterator position);
    00125         size_type       erase (const key_type& x);
    00126         void    erase (iterator first, iterator last);
    00129
    00130         void    swap (Bitset& other);
    00131
    00133         void    clear ();
    00134
    00135         key_compare             key_comp () const;
    00136         value_compare   value_comp () const;
    00137
    00139         iterator        find (const key_type& x) const;
    00140
    00142         size_type       count (const key_type& x) const;
    00143
    00144         iterator                                lower_bound (const key_type& x) const;
    00145         iterator                                upper_bound (const key_type& x) const;
    00146         std::pair<iterator, iterator>   equal_range (const key_type& x) const;
    00147
    00148         bool    operator== (const Bitset& rhs) const;
    00149         bool    operator< (const Bitset& rhs) const;
    00150         bool    operator!= (const Bitset& rhs) const;
    00151         bool    operator> (const Bitset& rhs) const;
    00152         bool    operator>= (const Bitset& rhs) const;
    00153         bool    operator<= (const Bitset& rhs) const;
    00154
    00155         Bitset  operator& (const Bitset& rhs) const;
    00156         Bitset  operator| (const Bitset& rhs) const;
    00157
    00159         bool    operator[] (const key_type& x) const;
    00160
    00162         Bitset  project (const Bitset& b) const;
    00163
    00171         Bitset  unproject (const Bitset& b) const;
    00172
    00174         unsigned        to_unsigned () const;
    00175
    00177         template <typename Type>
    00178         const Type      cast () const;
    00179
    00181         std::ostream&   print (std::ostream& ostr) const;
    00182
    00183       protected:
    00185         static
    00186         size_type       get_data_size (size_type max);
    00187
    00189         static
    00190         size_type       get_index (const key_type& x);
    00191
    00193         static
    00194         size_type       get_bitnum (const key_type& x);
    00195
    00197         bool    get_bit (size_type index, size_type bit) const;
    00198
    00200         size_type       compute_size () const;
    00201
    00202     /*-------------------.
    00203     | Iterator on bits.  |
    00204     `-------------------*/
    00205         struct bit_iterator
    00206         {
    00207             bit_iterator (size_type index = 0, size_type bitnum = 0);
    00208             const bit_iterator& operator-- ();
    00209             const bit_iterator& operator++ ();
    00210             value_type          operator* () const;
    00211             bool                operator== (const bit_iterator& rhs) const;
    00212             bool                operator!= (const bit_iterator& rhs) const;
    00213             size_type           get_index () const;
    00214             size_type           get_bitnum () const;
    00215           protected:
    00216             size_type   index_;
    00217             size_type   bitnum_;
    00218             value_type  value_;
    00219         };
    00220
    00221         bit_iterator            bit_begin () const;
    00222         const bit_iterator&     bit_end () const;
    00223
    00225         bool get_bit (const bit_iterator& it) const;
    00226
    00227     /*------------------.
    00228     | Actions on bits.  |
    00229     `------------------*/
    00230
    00231         template <typename CountType, CountType Start, CountType Step>
    00232         struct BitActionCount
    00233         {
    00234             BitActionCount ();
    00235             CountType value;
    00236             bool operator() (const Bitset& bitset,
    00237                               size_type index,
    00238                               size_type bit,
    00239                               bool value);
    00240         };
    00241
    00242     /*--------------------------------.
    00243     | do_on_bit (BitAction, element_t) |
    00244     `--------------------------------*/
    00245
    00247
    00248         template <class BitAction>
    00249         bool    do_on_bit (BitAction& action, const key_type& x);
    00250         template <class BitAction>
    00251         bool    do_on_bit (BitAction& action, const bit_iterator& it);
    00254
    00255
    00256         template <class ConstBitAction>
    00257         bool    do_on_bit (ConstBitAction& action, const key_type& x) const;
    00258         template <class ConstBitAction>
    00259         bool    do_on_bit (ConstBitAction& action,
    00260                            const bit_iterator& it) const;
    00263     /*-------------------.
    00264     | Attributes, misc.  |
    00265     `-------------------*/
    00266
    00267         enum { invalid_size = static_cast <unsigned int> (-1) };
    00268
    00269         size_type               data_size_;
    00270         data_type*              data_;
    00271
    00272         size_type               max_size_;
    00273         mutable size_type       size_;
    00274         bit_iterator            end_;
    00275
    00276       public:
    00277
    00278     /*-----------------.
    00279     | const_iterator.  |
    00280     `-----------------*/
    00281
    00282         struct const_iterator
    00283         {
    00284             typedef std::bidirectional_iterator_tag iterator_category;
    00285             typedef Bitset::value_type              value_type;
    00286             typedef Bitset::difference_type         difference_type;
    00287             typedef Bitset::reference               reference;
    00288             typedef Bitset::pointer                 pointer;
    00289
    00290             const_iterator ();
    00291             const_iterator (const Bitset* bs);
    00292             const_iterator (const Bitset* bs, const bit_iterator& cbit);
    00293             const_iterator (const const_iterator& it);
    00294             const_iterator (const iterator& it);
    00295
    00296             const const_iterator& operator++ ();
    00297             const_iterator        operator++ (int);
    00298             const const_iterator& operator-- ();
    00299             const_iterator        operator-- (int);
    00300             bool                  operator== (const const_iterator& rhs) const;
    00301             bool                  operator== (const iterator& rhs) const;
    00302             bool                  operator!= (const const_iterator& rhs) const;
    00303             bool                  operator!= (const iterator& rhs) const;
    00304             value_type            operator* () const;
    00305
    00306           protected:
    00307             void                  skip_zeros_forward ();
    00308             void                  skip_zeros_backward ();
    00309
    00310             const Bitset* bs_;
    00311             bit_iterator  cbit_;
    00312         };
    00313
    00314     /*-----------.
    00315     | iterator.  |
    00316     `-----------*/
    00317
    00318         struct iterator
    00319         {
    00320             typedef std::bidirectional_iterator_tag     iterator_category;
    00321             typedef Bitset::value_type                  value_type;
    00322             typedef Bitset::difference_type             difference_type;
    00323             typedef Bitset::reference                   reference;
    00324             typedef Bitset::pointer                     pointer;
    00325
    00326             iterator ();
    00327             iterator (const Bitset* bs);
    00328             iterator (const Bitset* bs, const bit_iterator& cbit);
    00329             iterator (const iterator& it);
    00330
    00331             // Friend functions for const_iterator
    00332             friend const_iterator::const_iterator (const iterator& it);
    00333
    00334             const iterator&     operator++ ();
    00335             iterator            operator++ (int);
    00336             const iterator&     operator-- ();
    00337             iterator            operator-- (int);
    00338             bool                operator== (const iterator& rhs) const;
    00339             bool                operator== (const const_iterator& rhs) const;
    00340             bool                operator!= (const iterator& rhs) const;
    00341             bool                operator!= (const const_iterator& rhs) const;
    00342             value_type          operator* () const;
    00343
    00344           protected:
    00345             void                skip_zeros_forward ();
    00346             void                skip_zeros_backward ();
    00347
    00348             const Bitset* bs_;
    00349             bit_iterator  cbit_;
    00350         };
    00351     };
    00352
    00353
    00355     std::ostream&
    00356     operator<< (std::ostream& ostr, const Bitset& set);
    00357
    00358   } // end of namespace misc.
    00359 } // end of namespace vcsn.
    00360
    00361 namespace std
    00362 {
    00364   template <>
    00365   void swap (vcsn::misc::Bitset& lhs, vcsn::misc::Bitset& rhs);
    00366
    00368   template <>
    00369   class insert_iterator<vcsn::misc::Bitset> :
    00370       public iterator<output_iterator_tag, void, void, void, void>
    00371   {
    00372     public:
    00373       typedef vcsn::misc::Bitset container_type;
    00374
    00375       insert_iterator (vcsn::misc::Bitset& x, vcsn::misc::Bitset::iterator);
    00376       insert_iterator<vcsn::misc::Bitset>&
    00377       operator= (vcsn::misc::Bitset::const_reference value);
    00378       insert_iterator<vcsn::misc::Bitset>& operator* ();
    00379       insert_iterator<vcsn::misc::Bitset>& operator++ ();
    00380       insert_iterator<vcsn::misc::Bitset>& operator++ (int);
    00381     protected:
    00382       vcsn::misc::Bitset* container;
    00383   };
    00384 }
    00385
    00386
    00387 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
    00388 #  include <vaucanson/misc/bitset.hxx>
    00389 # endif // VCSN_USE_INTERFACE_ONLY
    00390
    00391
    00392 #endif // ! VCSN_MISC_BITSET_HH