Boost logo

Boost-Commit :

From: gennaro.prota_at_[hidden]
Date: 2008-08-30 14:00:30


Author: gennaro_prota
Date: 2008-08-30 14:00:30 EDT (Sat, 30 Aug 2008)
New Revision: 48478
URL: http://svn.boost.org/trac/boost/changeset/48478

Log:
dynamic_bitset:
    * fixed form of some remaining copyright lines
    * using namespace detail::dynamic_bitset_impl for *all* implementation
      details (dynamic_bitset_*count*_impl removed) and consequently shortened
      some entity names
    * switched from enum to bools for "enum mode", to help several compilers
      which show problems with recognizing access_by_bytes and access_by_blocks
      as constant expressions
    * minor comment changes
    * implemented the do-the-right-thing dispatch for constructor from
      iterator-range, a la standard sequence containers (feature request #2172)
    * dropped now useless comparison with zero in reference constructor

NOTE:
    updated tests and documentation not committed yet; let's wait for the trunk
    results first

Text files modified:
   trunk/boost/detail/dynamic_bitset.hpp | 90 ++++++++++++++++++++++++++-------
   trunk/boost/dynamic_bitset/dynamic_bitset.hpp | 107 ++++++++++++++++++++++++++++-----------
   2 files changed, 146 insertions(+), 51 deletions(-)

Modified: trunk/boost/detail/dynamic_bitset.hpp
==============================================================================
--- trunk/boost/detail/dynamic_bitset.hpp (original)
+++ trunk/boost/detail/dynamic_bitset.hpp 2008-08-30 14:00:30 EDT (Sat, 30 Aug 2008)
@@ -1,7 +1,7 @@
-// --------------------------------------------------
+// -----------------------------------------------------------
 //
-// (C) Copyright Chuck Allison and Jeremy Siek 2001 - 2002.
-// (C) Copyright Gennaro Prota 2003 - 2006.
+// Copyright (c) 2001-2002 Chuck Allison and Jeremy Siek
+// Copyright (c) 2003-2006, 2008 Gennaro Prota
 //
 // Distributed under the Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt or copy at
@@ -9,14 +9,10 @@
 //
 // -----------------------------------------------------------
 
-// See http://www.boost.org/libs/dynamic_bitset/ for documentation.
-//
-// $Revision$ $Date$ - $Name$
-
 #ifndef BOOST_DETAIL_DYNAMIC_BITSET_HPP
 #define BOOST_DETAIL_DYNAMIC_BITSET_HPP
 
-#include <cstddef> // for std::size_t
+#include <cstddef>
 #include "boost/config.hpp"
 #include "boost/detail/workaround.hpp"
 
@@ -24,6 +20,7 @@
 namespace boost {
 
   namespace detail {
+ namespace dynamic_bitset_impl {
 
     // Gives (read-)access to the object representation
     // of an object of type T (3.9p4). CANNOT be used
@@ -46,13 +43,29 @@
 
     // ------- count function implementation --------------
 
- namespace dynamic_bitset_count_impl {
-
     typedef unsigned char byte_type;
 
- enum mode { access_by_bytes, access_by_blocks };
+ // This two entities
+ //
+ // enum mode { access_by_bytes, access_by_blocks };
+ // template <mode> struct mode_to_type {};
+ //
+ // were removed, since the regression logs (as of 24 Aug 2008) show
+ // that several compilers have troubles with recognizing
+ //
+ // const mode m = access_by_bytes
+ //
+ // as a constant expression
+ //
+ // *We'll use a bool, instead *.
+ //
+ template <bool value>
+ struct value_to_type
+ {
+ };
+ const bool access_by_bytes = true;
+ const bool access_by_blocks = false;
 
- template <mode> struct mode_to_type {};
 
     // the table: wrapped in a class template, so
     // that it is only instantiated if/when needed
@@ -87,7 +100,7 @@
      template <typename Iterator>
      inline std::size_t do_count(Iterator first, std::size_t length,
                                  int /*dummy param*/,
- mode_to_type<access_by_bytes>* )
+ value_to_type<access_by_bytes>* )
      {
          std::size_t num = 0;
          if (length)
@@ -111,7 +124,7 @@
      //
      template <typename Iterator, typename ValueType>
      inline std::size_t do_count(Iterator first, std::size_t length, ValueType,
- mode_to_type<access_by_blocks>*)
+ value_to_type<access_by_blocks>*)
      {
          std::size_t num = 0;
          while (length){
@@ -129,8 +142,6 @@
          return num;
      }
 
-
- } // dynamic_bitset_count_impl
     // -------------------------------------------------------
 
 
@@ -139,7 +150,7 @@
     //
     // size_type(-1) / sizeof(T)
     //
- // from vector<>::max_size. This tries to get out more
+ // from vector<>::max_size. This tries to get more
     // meaningful info.
     //
     template <typename T>
@@ -158,16 +169,57 @@
 
     // for static_asserts
     template <typename T>
- struct dynamic_bitset_allowed_block_type {
+ struct allowed_block_type {
         enum { value = T(-1) > 0 }; // ensure T has no sign
     };
 
     template <>
- struct dynamic_bitset_allowed_block_type<bool> {
+ struct allowed_block_type<bool> {
         enum { value = false };
     };
 
 
+ template <typename T>
+ struct is_numeric {
+ enum { value = false };
+ };
+
+# define BOOST_dynamic_bitset_is_numeric(x) \
+ template<> \
+ struct is_numeric<x> { \
+ enum { value = true }; \
+ } /**/
+
+ BOOST_dynamic_bitset_is_numeric(bool);
+ BOOST_dynamic_bitset_is_numeric(char);
+
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+ BOOST_dynamic_bitset_is_numeric(wchar_t);
+#endif
+
+ BOOST_dynamic_bitset_is_numeric(signed char);
+ BOOST_dynamic_bitset_is_numeric(short int);
+ BOOST_dynamic_bitset_is_numeric(int);
+ BOOST_dynamic_bitset_is_numeric(long int);
+
+ BOOST_dynamic_bitset_is_numeric(unsigned char);
+ BOOST_dynamic_bitset_is_numeric(unsigned short);
+ BOOST_dynamic_bitset_is_numeric(unsigned int);
+ BOOST_dynamic_bitset_is_numeric(unsigned long);
+
+#if defined(BOOST_HAS_LONG_LONG)
+ BOOST_dynamic_bitset_is_numeric(::boost::long_long_type);
+ BOOST_dynamic_bitset_is_numeric(::boost::ulong_long_type);
+#endif
+
+ // intentionally omitted
+ //BOOST_dynamic_bitset_is_numeric(float);
+ //BOOST_dynamic_bitset_is_numeric(double);
+ //BOOST_dynamic_bitset_is_numeric(long double);
+
+#undef BOOST_dynamic_bitset_is_numeric
+
+ } // dynamic_bitset_impl
   } // namespace detail
 
 } // namespace boost

Modified: trunk/boost/dynamic_bitset/dynamic_bitset.hpp
==============================================================================
--- trunk/boost/dynamic_bitset/dynamic_bitset.hpp (original)
+++ trunk/boost/dynamic_bitset/dynamic_bitset.hpp 2008-08-30 14:00:30 EDT (Sat, 30 Aug 2008)
@@ -58,7 +58,7 @@
   // this class definition to avoid problems with VC++. Similarly,
   // with the member functions of nested classes.
 
- BOOST_STATIC_ASSERT(detail::dynamic_bitset_allowed_block_type<Block>::value);
+ BOOST_STATIC_ASSERT(detail::dynamic_bitset_impl::allowed_block_type<Block>::value);
 
 public:
     typedef Block block_type;
@@ -82,7 +82,7 @@
         // the one and only non-copy ctor
         reference(block_type & b, block_type pos)
             :m_block(b), m_mask(block_type(1) << pos)
- { assert(pos >= 0 && pos < bits_per_block); }
+ { assert( pos < bits_per_block); }
 
         void operator&(); // left undefined
 
@@ -166,10 +166,39 @@
     dynamic_bitset(BlockInputIterator first, BlockInputIterator last,
                    const Allocator& alloc = Allocator())
 
- :m_bits(first, last, alloc),
- m_num_bits(m_bits.size() * bits_per_block)
- {}
+ :m_bits(alloc),
+ m_num_bits(0)
+ {
+ using boost::detail::dynamic_bitset_impl::value_to_type;
+ using boost::detail::dynamic_bitset_impl::is_numeric;
 
+ const value_to_type<
+ is_numeric<BlockInputIterator>::value> selector;
+
+ dispatch_init(first, last, selector);
+ }
+
+ template <typename T>
+ void dispatch_init(T num_bits, unsigned long value,
+ detail::dynamic_bitset_impl::value_to_type<true>)
+ {
+ init_from_unsigned_long(static_cast<size_type>(num_bits), value);
+ }
+
+ template <typename T>
+ void dispatch_init(T first, T last,
+ detail::dynamic_bitset_impl::value_to_type<false>)
+ {
+ init_from_block_range(first, last);
+ }
+
+ template <typename BlockIter>
+ void init_from_block_range(BlockIter first, BlockIter last)
+ {
+ assert(m_bits.size() == 0);
+ m_bits.insert(m_bits.end(), first, last);
+ m_num_bits = m_bits.size() * bits_per_block;
+ }
 
     // copy constructor
     dynamic_bitset(const dynamic_bitset& b);
@@ -350,6 +379,39 @@
 
     }
 
+ void init_from_unsigned_long(size_type num_bits,
+ unsigned long value/*,
+ const Allocator& alloc*/)
+ {
+
+ assert(m_bits.size() == 0);
+
+ m_bits.resize(calc_num_blocks(num_bits));
+ m_num_bits = num_bits;
+
+ typedef unsigned long num_type;
+ typedef boost::detail::dynamic_bitset_impl
+ ::shifter<num_type, bits_per_block, ulong_width> shifter;
+
+ //if (num_bits == 0)
+ // return;
+
+ // zero out all bits at pos >= num_bits, if any;
+ // note that: num_bits == 0 implies value == 0
+ if (num_bits < static_cast<size_type>(ulong_width)) {
+ const num_type mask = (num_type(1) << num_bits) - 1;
+ value &= mask;
+ }
+
+ typename buffer_type::iterator it = m_bits.begin();
+ for( ; value; shifter::left_shift(value), ++it) {
+ *it = static_cast<block_type>(value);
+ }
+
+ }
+
+
+
 BOOST_DYNAMIC_BITSET_PRIVATE:
 
     bool m_unchecked_test(size_type pos) const;
@@ -539,28 +601,10 @@
 template <typename Block, typename Allocator>
 dynamic_bitset<Block, Allocator>::
 dynamic_bitset(size_type num_bits, unsigned long value, const Allocator& alloc)
- : m_bits(calc_num_blocks(num_bits), Block(0), alloc),
- m_num_bits(num_bits)
+ : m_bits(alloc),
+ m_num_bits(0)
 {
-
- typedef unsigned long num_type;
- typedef boost::detail::shifter<num_type, bits_per_block, ulong_width> shifter;
-
- //if (num_bits == 0)
- // return;
-
- // zero out all bits at pos >= num_bits, if any;
- // note that: num_bits == 0 implies value == 0
- if (num_bits < static_cast<size_type>(ulong_width)) {
- const num_type mask = (num_type(1) << num_bits) - 1;
- value &= mask;
- }
-
- typename buffer_type::iterator it = m_bits.begin();
- for( ; value; shifter::left_shift(value), ++it) {
- *it = static_cast<block_type>(value);
- }
-
+ init_from_unsigned_long(num_bits, value);
 }
 
 // copy constructor
@@ -957,18 +1001,17 @@
 typename dynamic_bitset<Block, Allocator>::size_type
 dynamic_bitset<Block, Allocator>::count() const
 {
- using namespace detail::dynamic_bitset_count_impl;
+ using namespace detail::dynamic_bitset_impl;
 
     const bool no_padding = bits_per_block == CHAR_BIT * sizeof(Block);
     const bool enough_table_width = table_width >= CHAR_BIT;
- const mode m = (no_padding && enough_table_width)
- ? access_by_bytes
- : access_by_blocks;
 
- typedef mode_to_type<m> m_type;
+ const bool mode = (no_padding && enough_table_width)
+ ? access_by_bytes
+ : access_by_blocks;
 
     return do_count(m_bits.begin(), num_blocks(), Block(0),
- static_cast<m_type *>(0));
+ static_cast<value_to_type<mode> *>(0));
 }
 
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk