Vaucanson  1.4.1
bitset.hxx
Go to the documentation of this file.
1 // bitset.hxx: this file is part of the Vaucanson project.
2 //
3 // Vaucanson, a generic library for finite state machines.
4 //
5 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 The Vaucanson Group.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // The complete GNU General Public Licence Notice can be found as the
13 // `COPYING' file in the root directory.
14 //
15 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
16 //
17 #ifndef VCSN_MISC_BITSET_HXX
18 # define VCSN_MISC_BITSET_HXX
19 
27 # include <vaucanson/misc/bitset.hh>
29 
30 # include <cstring>
31 
32 namespace vcsn
33 {
34  namespace misc
35  {
36 
37  /*-------.
38  | Bitset |
39  `-------*/
40 
41  // Default contructors.
42  inline
43  Bitset::Bitset (size_type max) : data_size_ (get_data_size (max)),
44  data_ (new data_type[data_size_]),
45  max_size_ (max),
46  size_ (0),
47  end_ (bit_iterator (get_index (max_size_),
48  get_bitnum (max_size_)))
49  {
50  memset (data_, 0, data_size_ * sizeof (data_type));
51  }
52 
53  inline
54  Bitset::Bitset (size_type max, const data_type* data)
55  : data_size_ (get_data_size (max)),
56  data_ (new data_type[data_size_]),
57  max_size_ (max),
58  size_ (invalid_size),
59  end_ (bit_iterator (get_index (max_size_),
60  get_bitnum (max_size_)))
61  {
62  memcpy (data_, data, data_size_ * sizeof (data_type));
63  }
64 
65  // Copy constructor.
66  inline
67  Bitset::Bitset (const Bitset& bs) : data_size_ (bs.data_size_),
68  data_ (new data_type[data_size_]),
69  max_size_ (bs.max_size_),
70  size_ (bs.size_),
71  end_ (bs.end_)
72  {
73  memcpy (data_, bs.data_, data_size_ * sizeof (data_type));
74  }
75 
76  // Constructor from iterators.
77  template <class InputIterator>
78  Bitset::Bitset (InputIterator first, InputIterator last)
79  {
80  value_type max = 0;
81 
82  for (InputIterator i = first; i != last; ++i)
83  {
84  assertion (*i >= 0);
85  if (*i > max)
86  max = *i;
87  }
88  data_size_ = get_data_size (max + 1);
89  data_ = new data_type[data_size_];
90  bzero (data_, data_size_ * sizeof (data_type));
91  max_size_ = max + 1;
92  size_ = 0;
93  end_ = bit_iterator (get_index (max_size_), get_bitnum (max_size_));
94  insert (first, last);
95  }
96 
97  // Destructor.
98  inline
100  {
101  delete[] data_;
102  }
103 
104  // Assignment.
105  inline
106  Bitset&
108  {
109  if (this != &rhs)
110  {
111  data_size_ = rhs.data_size_;
112  delete[] data_;
113  data_ = new data_type[data_size_];
114  memcpy (data_, rhs.data_, data_size_ * sizeof (data_type));
115  max_size_ = rhs.max_size_;
116  size_ = rhs.size_;
117  end_ = rhs.end_;
118  }
119  postcondition (*this == rhs);
120  return *this;
121  }
122 
123  /*------------.
124  | Iterators. |
125  `------------*/
126 
127  // begin
128  inline
129  Bitset::iterator
131  {
132  return iterator (this);
133  }
134 
135  inline
136  Bitset::const_iterator
137  Bitset::begin () const
138  {
139  return const_iterator (this);
140  }
141 
142  // end
143  inline
144  Bitset::iterator
146  {
147  return iterator (this, end_);
148  }
149 
150  inline
151  Bitset::const_iterator
152  Bitset::end () const
153  {
154  return const_iterator (this, end_);
155  }
156 
157  /*--------------------.
158  | Reverse Iterators. |
159  `--------------------*/
160 
161  // rbegin
162  inline
163  Bitset::reverse_iterator
165  {
166  return reverse_iterator (end ());
167  }
168 
169  inline
170  Bitset::const_reverse_iterator
171  Bitset::rbegin () const
172  {
173  return const_reverse_iterator (end ());
174  }
175 
176  // rend
177  inline
178  Bitset::reverse_iterator
180  {
181  return reverse_iterator (begin ());
182  }
183 
184  inline
185  Bitset::const_reverse_iterator
186  Bitset::rend () const
187  {
188  return const_reverse_iterator (begin ());
189  }
190 
191  /*------------------.
192  | Misc. functions. |
193  `------------------*/
194 
195  // empty
196  inline
197  bool
198  Bitset::empty () const
199  {
200  return size_ == 0;
201  }
202 
203  // size
204  inline
205  Bitset::size_type
206  Bitset::size () const
207  {
208  return size_ == invalid_size ? compute_size () : size_;
209  }
210 
211  // max_size
212  inline
213  Bitset::size_type
214  Bitset::max_size () const
215  {
216  return max_size_;
217  }
218 
219  /*-------------.
220  | Insertions. |
221  `-------------*/
222 
223  inline
224  std::pair<Bitset::iterator, bool>
225  Bitset::insert (const value_type& x)
226  {
227  precondition (static_cast<size_type> (x) < max_size_);
228 
229  size_type idx = get_index (x);
230  size_type bnm = get_bitnum (x);
231 
232  if (get_bit (idx, bnm))
233  return std::make_pair (end (), false);
234  else
235  {
236  data_[idx] |= (1 << bnm);
237  if (size_ != invalid_size)
238  size_++;
239  return std::make_pair (iterator (this, bit_iterator (idx, bnm)), true);
240  }
241  }
242 
243  inline
244  Bitset::iterator
245  Bitset::insert (iterator, const value_type& x)
246  {
247  return insert (x).first;
248  }
249 
250  template <class InputIterator>
251  void
252  Bitset::insert (InputIterator first, InputIterator last)
253  {
254  while (first != last)
255  {
256  insert (*first);
257  ++first;
258  }
259  }
260 
261  /*------.
262  | Erase |
263  `------*/
264 
265  inline
266  void
267  Bitset::erase (iterator position)
268  {
269  precondition (static_cast<size_type> (*position) < max_size_);
270 
271  erase (*position);
272  }
273 
274  inline
275  Bitset::size_type
276  Bitset::erase (const key_type& x)
277  {
278  precondition (static_cast<size_type> (x) < max_size_);
279 
280  size_type idx = get_index (x);
281  size_type bnm = get_bitnum (x);
282 
283  if (get_bit (idx, bnm))
284  {
285  data_[idx] &= ~ (1 << bnm);
286  if (size_ != invalid_size)
287  --size_;
288  return 1;
289  }
290  else
291  return 0;
292  }
293 
294  inline
295  void
296  Bitset::erase (iterator first, iterator last)
297  {
298  while (first != last)
299  {
300  erase (*first);
301  ++first;
302  }
303  }
304 
305  /*------------------.
306  | Misc. functions. |
307  `------------------*/
308 
309  // swap
310  inline
311  void
313  {
314  std::swap (data_size_, other.data_size_);
315  std::swap (data_, other.data_);
316  std::swap (max_size_, other.max_size_);
317  std::swap (size_, other.size_);
318  std::swap (end_, other.end_);
319  }
320 
321  // clear
322  inline
323  void
325  {
326  bzero (data_, data_size_ * sizeof (data_type));
327  size_ = 0;
328  }
329 
330  // key_compare
331  inline
332  Bitset::key_compare
333  Bitset::key_comp () const
334  {
335  return key_compare ();
336  }
337 
338  // value_compare
339  inline
340  Bitset::value_compare
341  Bitset::value_comp () const
342  {
343  return value_compare ();
344  }
345 
346  // find
347  inline
348  Bitset::iterator
349  Bitset::find (const key_type& x) const
350  {
351  precondition (static_cast<size_type> (x) < max_size_);
352 
353  bit_iterator it (get_index (x), get_bitnum (x));
354  if (get_bit (it))
355  return iterator (this, it);
356  else
357  return iterator (this, end_);
358  }
359 
360  // count
361  inline
362  Bitset::size_type
363  Bitset::count (const key_type& x) const
364  {
365  precondition (static_cast<size_type> (x) < max_size_);
366 
367  return get_bit (get_index (x), get_bitnum (x)) ? 1 : 0;
368  }
369 
370  // lower_bound
371  inline
372  Bitset::iterator
373  Bitset::lower_bound (const key_type& x) const
374  {
375  precondition (static_cast<size_type> (x) < max_size_);
376 
377  bit_iterator it (get_index (x), get_bitnum (x));
378 
379  while ( (it != bit_end ()) && !get_bit (it))
380  ++it;
381  return iterator (this, it);
382  }
383 
384  // upper_bound
385  inline
386  Bitset::iterator
387  Bitset::upper_bound (const key_type& x) const
388  {
389  precondition (static_cast<size_type> (x) < max_size_);
390 
391  bit_iterator it (get_index (x), get_bitnum (x));
392 
393  if (it == bit_begin ())
394  return iterator (this, end_);
395  else
396  {
397  do
398  {
399  --it;
400  }
401  while ( (it != bit_begin ()) && !get_bit (it));
402  return iterator (this, get_bit (it) ? it : end_);
403  }
404  }
405 
406  // equal_range
407  inline
408  std::pair<Bitset::iterator, Bitset::iterator>
409  Bitset::equal_range (const key_type& x) const
410  {
411  // FIXME: Could be optimized.
412  return std::make_pair (lower_bound (x), upper_bound (x));
413  }
414 
415  /*------------.
416  | Operators. |
417  `------------*/
418 
419  inline
420  bool
421  Bitset::operator== (const Bitset& rhs) const
422  {
423  if (rhs.data_size_ < data_size_)
424  return rhs.operator== (*this);
425  else
426  {
427  for (size_type i = 0; i < data_size_; ++i)
428  if (data_[i] != rhs.data_[i])
429  return false;
430  for (size_type i = data_size_; i < rhs.data_size_; ++i)
431  if (rhs.data_[i])
432  return false;
433  return true;
434  }
435  }
436 
437  inline
438  bool
439  Bitset::operator< (const Bitset& rhs) const
440  {
441  // Case 1: rhs is longer than *this.
442  for (size_type i = rhs.data_size_ - 1; i >= data_size_; ++i)
443  if (rhs.data_[i])
444  return true;
445  // Case 2: *this is longer than rhs.
446  for (size_type i = data_size_ - 1; i >= rhs.data_size_; ++i)
447  if (data_[i])
448  return false;
449  // Common case: compare the bits rhs and *this have in common.
450  for (int i = std::min (data_size_, rhs.data_size_) - 1; i >= 0; ++i)
451  if (rhs.data_[i] != data_[i])
452  return rhs.data_[i] > data_[i];
453  // If we get out from the previous loop, then the bitsets are equals.
454  return false;
455  }
456 
457  inline
458  bool
459  Bitset::operator!= (const Bitset& rhs) const
460  {
461  return ! (*this == rhs);
462  }
463 
464  inline
465  bool
466  Bitset::operator> (const Bitset& rhs) const
467  {
468  return rhs < *this;
469  }
470 
471  inline
472  bool
473  Bitset::operator<= (const Bitset& rhs) const
474  {
475  return ! (*this > rhs);
476  }
477 
478  inline
479  bool
480  Bitset::operator>= (const Bitset& rhs) const
481  {
482  return ! (*this < rhs);
483  }
484 
485  inline
486  Bitset
487  Bitset::operator& (const Bitset& rhs) const
488  {
489  const size_type r_data_size = std::min (data_size_, rhs.data_size_);
490  const size_type r_max_size = std::min (max_size_, rhs.max_size_);
491  Bitset result (r_max_size);
492 
493  for (size_type i = 0; i < r_data_size; ++i)
494  {
495  result.data_[i] = data_[i] & rhs.data_[i];
496  if (result.data_[i])
497  result.size_ = invalid_size;
498  }
499  return result;
500  }
501 
502  inline
503  Bitset
504  Bitset::operator| (const Bitset& rhs) const
505  {
506  if (rhs.data_size_ < data_size_)
507  return rhs.operator| (*this);
508  else
509  {
510  Bitset result (rhs.max_size_);
511 
512  for (size_type i = 0; i < data_size_; ++i)
513  {
514  result.data_[i] = data_[i] | rhs.data_[i];
515  if (result.data_[i])
516  result.size_ = invalid_size;
517  }
518  for (size_type i = data_size_; i < rhs.data_size_; ++i)
519  {
520  result.data_[i] = rhs.data_[i];
521  if (result.data_[i])
522  result.size_ = invalid_size;
523  }
524  return result;
525  }
526  }
527 
528  inline
529  bool
530  Bitset::operator[] (const key_type& x) const
531  {
532  return count (x);
533  }
534 
535  /*------------------------------.
536  | Projection and Unprojection. |
537  `------------------------------*/
538 
539  inline
540  Bitset
541  Bitset::project (const Bitset& b) const
542  {
543  BitActionCount<int, -1, 1> bit_counter;
544  Bitset result (b.size ());
545 
546  for (bit_iterator it = bit_begin (), b_it = b.bit_begin ();
547  it != bit_end () && b_it != b.bit_end ();
548  ++it, ++b_it)
549  {
550  if (b.do_on_bit (bit_counter, b_it) && get_bit (it))
551  result.insert (bit_counter.value);
552  }
553  return result;
554  }
555 
556  inline
557  Bitset
558  Bitset::unproject (const Bitset& b) const
559  {
560  BitActionCount<int, 0, 1> bit_counter;
561  Bitset result (b.max_size ());
562  bit_iterator b_it = b.bit_begin ();
563 
564  while (b_it != b.bit_end ()
565  && !b.get_bit (b_it))
566  ++b_it;
567  for (bit_iterator it = bit_begin (); it != bit_end (); ++it)
568  if (get_bit (it))
569  {
570  while ( (b_it != b.bit_end ()) && (bit_counter.value < *it))
571  b.do_on_bit (bit_counter, ++b_it);
572  assertion (bit_counter.value == *it);
573  result.insert (*b_it);
574  }
575  return result;
576  }
577 
578  /*--------.
579  | Casts. |
580  `--------*/
581 
582  inline
583  unsigned
585  {
586  return cast<unsigned> ();
587  }
588 
589  template <class Type>
590  const Type
591  Bitset::cast () const
592  {
593  const Type* ptr = reinterpret_cast<const Type*> (data_);
594  return *ptr;
595  }
596 
597  /*--------.
598  | Print. |
599  `--------*/
600 
601  inline
602  std::ostream&
603  Bitset::print (std::ostream& ostr) const
604  {
605  ostr << "{ ";
606  for (Bitset::bit_iterator it = bit_begin (); it != bit_end (); ++it)
607  if (get_bit (it))
608  ostr << *it << ' ';
609  return ostr << "}";
610  }
611 
612  /*------------------.
613  | Protected stuff. |
614  `------------------*/
615 
616  // get_data_size
617  inline
618  Bitset::size_type
619  Bitset::get_data_size (size_type max)
620  {
621  precondition (max > 0);
622 
623  const size_type data_bits = sizeof (data_type) * 8;
624  return max / data_bits + (max % data_bits ? 1 : 0);
625  }
626 
627  // get_index
628  inline
629  Bitset::size_type
630  Bitset::get_index (const key_type& x)
631  {
632  return x / (sizeof (data_type) * 8);
633  }
634 
635  // get_bitnum
636  inline
637  Bitset::size_type
638  Bitset::get_bitnum (const key_type& x)
639  {
640  return x % (sizeof (data_type) * 8);
641  }
642 
643  // get_bit
644  inline
645  bool
646  Bitset::get_bit (size_type index, size_type bit) const
647  {
648  return (data_[index] & (1 << bit)) != 0;
649  }
650 
651  inline
652  bool
653  Bitset::get_bit (const bit_iterator& it) const
654  {
655  return get_bit (it.get_index (), it.get_bitnum ());
656  }
657 
658  // compute_size
659  inline
660  Bitset::size_type
662  {
663  BitActionCount<int, 0, 1> bc;
664  for (bit_iterator it = bit_begin (); it != bit_end (); ++it)
665  do_on_bit (bc, it);
666  return size_ = bc.value;
667  }
668 
669  /*---------------.
670  | Bit iterator. |
671  `---------------*/
672 
673  // constructors.
674  inline
675  Bitset::
676  bit_iterator::bit_iterator (size_type index, size_type bitnum) :
677  index_ (index),
678  bitnum_ (bitnum),
679  value_ (index_ * sizeof (data_type) * 8 + bitnum_)
680  {
681  }
682 
683  // operators.
684  inline
685  const Bitset::bit_iterator&
686  Bitset::bit_iterator::operator-- ()
687  {
688  --value_;
689  if (bitnum_)
690  --bitnum_;
691  else
692  {
693  bitnum_ = sizeof (data_type) * 8 - 1;
694  --index_;
695  }
696  return (*this);
697  }
698 
699  inline
700  const Bitset::bit_iterator&
701  Bitset::bit_iterator::operator++ ()
702  {
703  ++value_;
704  if (++bitnum_ >= sizeof (data_type) * 8)
705  {
706  bitnum_ = 0;
707  ++index_;
708  }
709  return *this;
710  }
711 
712  inline
713  Bitset::value_type
715  {
716  return value_;
717  }
718 
719  inline
720  bool
721  Bitset::bit_iterator::operator== (const bit_iterator& rhs) const
722  {
723  return rhs.value_ == value_;
724  }
725 
726  inline
727  bool
728  Bitset::bit_iterator::operator!= (const bit_iterator& rhs) const
729  {
730  return ! (*this == rhs);
731  }
732 
733  // get_index
734  inline
735  Bitset::size_type
737  {
738  return index_;
739  }
740 
741  // get_bitnum
742  inline
743  Bitset::size_type
745  {
746  return bitnum_;
747  }
748 
749  // bit_begin
750  inline
751  Bitset::bit_iterator
752  Bitset::bit_begin () const
753  {
754  return bit_iterator ();
755  }
756 
757  // bit_end
758  inline
759  const Bitset::bit_iterator&
760  Bitset::bit_end () const
761  {
762  return end_;
763  }
764 
765  /*--------------.
766  | Bit actions. |
767  `--------------*/
768 
769  // Count
770  template <typename CountType, CountType Start, CountType Step>
771  Bitset::
772  BitActionCount<CountType, Start, Step>::BitActionCount () : value (Start)
773  {
774  }
775 
776  template <typename CountType, CountType Start, CountType Step>
777  bool
778  Bitset::
779  BitActionCount<CountType, Start, Step>::operator() (const Bitset&,
780  size_type,
781  size_type,
782  bool val)
783  {
784  if (val)
785  value += Step;
786  return val;
787  }
788 
789  /*------------.
790  | do_on_bit. |
791  `------------*/
792 
793  // non-const
794  template <class BitAction>
795  bool
796  Bitset::do_on_bit (BitAction& action, const key_type& x)
797  {
798  precondition (x < max_size_);
799 
800  const size_type index = get_index (x);
801  const size_type bit = get_bitnum (x);
802  const bool value = get_bit (index, bit);
803  return action (*this, index, bit, value);
804  }
805 
806  template <class BitAction>
807  bool
808  Bitset::do_on_bit (BitAction& action, const bit_iterator& it)
809  {
810  return action (*this, it.get_index (), it.get_bitnum (), get_bit (it));
811  }
812 
813  // const
814  template <class ConstBitAction>
815  bool
816  Bitset::do_on_bit (ConstBitAction& action, const key_type& x) const
817  {
818  precondition (x < max_size_);
819 
820  const size_type index = get_index (x);
821  const size_type bit = get_bitnum (x);
822  const bool value = get_bit (index, bit);
823  return action (*this, index, bit, value);
824  }
825 
826  template <class ConstBitAction>
827  bool
828  Bitset::do_on_bit (ConstBitAction& action, const bit_iterator& it) const
829  {
830  return action (*this, it.get_index (), it.get_bitnum (), get_bit (it));
831  }
832 
833  /*---------------.
834  | const_iterator |
835  `---------------*/
836 
837  // Default constructors.
838  inline
839  Bitset::const_iterator::const_iterator () : bs_ (0), cbit_ ()
840  {
841  WARNING ("The constructor Bitset::const_iterator::const_iterator () "
842  "is dangerous and therefore should not be used.");
843  }
844 
845  inline
846  Bitset::const_iterator::const_iterator (const Bitset* bs) : bs_ (bs),
847  cbit_ ()
848  {
849  skip_zeros_forward ();
850  }
851 
852  inline
853  Bitset::const_iterator::const_iterator (const Bitset* bs,
854  const bit_iterator& cbit)
855  : bs_ (bs),
856  cbit_ (cbit)
857  {
858  skip_zeros_forward ();
859  }
860 
861  // Copy constructors.
862  inline
863  Bitset::const_iterator::const_iterator (const const_iterator& it)
864  : bs_ (it.bs_), cbit_ (it.cbit_)
865  {
866  }
867 
868  inline
869  Bitset::const_iterator::const_iterator (const iterator& it)
870  : bs_ (it.bs_), cbit_ (it.cbit_)
871  {
872  }
873 
874  // Operators.
875  inline
876  const Bitset::const_iterator&
877  Bitset::const_iterator::operator++ ()
878  {
879  ++cbit_;
880  skip_zeros_forward ();
881  return *this;
882  }
883 
884  inline
885  Bitset::const_iterator
886  Bitset::const_iterator::operator++ (int)
887  {
888  const_iterator ret (*this);
889 
890  operator++ ();
891  return ret;
892  }
893 
894  inline
895  const Bitset::const_iterator&
896  Bitset::const_iterator::operator-- ()
897  {
898  --cbit_;
899  skip_zeros_backward ();
900  return *this;
901  }
902 
903  inline
904  Bitset::const_iterator
905  Bitset::const_iterator::operator-- (int)
906  {
907  const_iterator ret (*this);
908 
909  operator-- ();
910  return ret;
911  }
912 
913  inline
914  bool
915  Bitset::const_iterator::operator== (const const_iterator& rhs) const
916  {
917  return * (*this) == *rhs;
918  }
919 
920  inline
921  bool
922  Bitset::const_iterator::operator== (const iterator& rhs) const
923  {
924  return * (*this) == *rhs;
925  }
926 
927  inline
928  bool
929  Bitset::const_iterator::operator!= (const const_iterator& rhs) const
930  {
931  return ! (*this == rhs);
932  }
933 
934  inline
935  bool
936  Bitset::const_iterator::operator!= (const iterator& rhs) const
937  {
938  return ! (*this == rhs);
939  }
940 
941  inline
942  Bitset::value_type
944  {
945  return *cbit_;
946  }
947 
948  inline
949  void
950  Bitset::const_iterator::skip_zeros_forward ()
951  {
952  precondition (bs_ != 0);
953 
954  while ( (cbit_ != bs_->bit_end ()) && !bs_->get_bit (cbit_))
955  ++cbit_;
956  }
957 
958  inline
959  void
960  Bitset::const_iterator::skip_zeros_backward ()
961  {
962  precondition (bs_ != 0);
963 
964  while ( (cbit_ != bs_->bit_begin ()) && !bs_->get_bit (cbit_))
965  --cbit_;
966  }
967 
968  /*---------.
969  | iterator |
970  `---------*/
971 
972  // Default constructors.
973  inline
974  Bitset::iterator::iterator () : bs_ (0), cbit_ ()
975  {
976  WARNING ("The constructor Bitset::iterator::iterator () is dangerous "
977  "and therefore should not be used.");
978  }
979 
980  inline
981  Bitset::iterator::iterator (const Bitset* bs)
982  : bs_ (bs),
983  cbit_ ()
984  {
985  skip_zeros_forward ();
986  }
987 
988  inline
989  Bitset::iterator::iterator (const Bitset* bs, const bit_iterator& cbit)
990  : bs_ (bs),
991  cbit_ (cbit)
992  {
993  skip_zeros_forward ();
994  }
995 
996  // Copy constructor.
997  inline
998  Bitset::iterator::iterator (const iterator& it) : bs_ (it.bs_), cbit_ (it.cbit_)
999  {
1000  }
1001 
1002  // Operators
1003  inline
1004  const Bitset::iterator&
1005  Bitset::iterator::operator++ ()
1006  {
1007  ++cbit_;
1008  skip_zeros_forward ();
1009  return *this;
1010  }
1011 
1012  inline
1013  Bitset::iterator
1014  Bitset::iterator::operator++ (int)
1015  {
1016  iterator res (*this);
1017 
1018  operator++ ();
1019  return res;
1020  }
1021 
1022  inline
1023  const Bitset::iterator&
1024  Bitset::iterator::operator-- ()
1025  {
1026  --cbit_;
1027  skip_zeros_backward ();
1028  return *this;
1029  }
1030 
1031  inline
1032  Bitset::iterator
1033  Bitset::iterator::operator-- (int)
1034  {
1035  iterator res (*this);
1036 
1037  operator-- ();
1038  return res;
1039  }
1040 
1041  inline
1042  bool
1043  Bitset::iterator::operator== (const iterator& rhs) const
1044  {
1045  return * (*this) == *rhs;
1046  }
1047 
1048  inline
1049  bool
1050  Bitset::iterator::operator== (const const_iterator& rhs) const
1051  {
1052  return * (*this) == *rhs;
1053  }
1054 
1055  inline
1056  bool
1057  Bitset::iterator::operator!= (const iterator& rhs) const
1058  {
1059  return ! (*this == rhs);
1060  }
1061 
1062  inline
1063  bool
1064  Bitset::iterator::operator!= (const const_iterator& rhs) const
1065  {
1066  return ! (*this == rhs);
1067  }
1068 
1069  inline
1070  Bitset::value_type
1072  {
1073  return *cbit_;
1074  }
1075 
1076  inline
1077  void
1078  Bitset::iterator::skip_zeros_forward ()
1079  {
1080  precondition (bs_ != 0);
1081 
1082  while ( (cbit_ != bs_->bit_end ()) && !bs_->get_bit (cbit_))
1083  ++cbit_;
1084  }
1085 
1086  inline
1087  void
1088  Bitset::iterator::skip_zeros_backward ()
1089  {
1090  precondition (bs_ != 0);
1091 
1092  while ( (cbit_ != bs_->bit_begin ()) && !bs_->get_bit (cbit_))
1093  --cbit_;
1094  }
1095 
1096  inline
1097  std::ostream&
1098  operator<< (std::ostream& ostr, const Bitset& set)
1099  {
1100  return set.print (ostr);
1101  }
1102 
1103  } // namespace misc
1104 } // namespace vcsn
1105 
1106 namespace std
1107 {
1108  template <>
1109  inline
1111  {
1112  lhs.swap (rhs);
1113  }
1114 
1115  inline
1116  insert_iterator<vcsn::misc::Bitset>::
1117  insert_iterator (vcsn::misc::Bitset& x,
1118  vcsn::misc::Bitset::iterator)
1119  {
1120  container = &x;
1121  }
1122 
1123  inline
1124  insert_iterator<vcsn::misc::Bitset>&
1125  insert_iterator<vcsn::misc::Bitset>::operator= (vcsn::misc::Bitset::
1126  const_reference value)
1127  {
1128  container->insert (value);
1129  return *this;
1130  }
1131 
1132  inline
1133  insert_iterator<vcsn::misc::Bitset>&
1135  {
1136  return *this;
1137  }
1138 
1139  inline
1140  insert_iterator<vcsn::misc::Bitset>&
1141  insert_iterator<vcsn::misc::Bitset>::operator++ ()
1142  {
1143  return *this;
1144  }
1145 
1146  inline
1147  insert_iterator<vcsn::misc::Bitset>&
1148  insert_iterator<vcsn::misc::Bitset>::operator++ (int)
1149  {
1150  return *this;
1151  }
1152 }
1153 
1154 #endif // ! VCSN_MISC_BITSET_HXX