$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63302 - in sandbox/SOC/2010/bit_masks: boost/integer boost/integer/details/bft boost/integer/details/bft/ext boost/integer/details/bft/ext/fusion lib/integer/test lib/integer/test/bft_testing
From: bbartmanboost_at_[hidden]
Date: 2010-06-24 22:01:04
Author: bbartman
Date: 2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
New Revision: 63302
URL: http://svn.boost.org/trac/boost/changeset/63302
Log:
Now currently down two one reference type and refactored, retested all functions related to the bitfield_tuple and its internal reference type
Removed:
   sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/ref_type_testing.cpp
Text files modified: 
   sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple.hpp                    |   273 +++------------------------------------ 
   sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/bitfield_iterator.hpp |    10                                         
   sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/fusion/at_impl.hpp    |    12 -                                       
   sandbox/SOC/2010/bit_masks/boost/integer/details/bft/reference_builder.hpp     |    99 ++++++++++++++                          
   sandbox/SOC/2010/bit_masks/lib/integer/test/Jamfile.v2                         |     1                                         
   5 files changed, 135 insertions(+), 260 deletions(-)
Modified: sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple.hpp	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
@@ -389,115 +389,6 @@
         field_type field_;
     };
 
-    
-    /** Proxy type returned by get functions.
-     *  This serves as the go between things within this class.
-     */
-    template <typename MaskInfo>
-    struct bitfield_ref {
-    private:
-        typedef bitfield_ref<MaskInfo>                               _self;
-    public:
-        typedef typename MaskInfo::return_type                  return_type;
-
-        /** Internals.
-         *  bitfield type for extracting individual fields from within the
-         *  storage_type.
-         */
-        typedef typename integer::bitfield<
-            storage_type,
-            MaskInfo::offset::value,
-            MaskInfo::offset::value + MaskInfo::field_width::value - 1,
-            return_type
-        >                                                       bitfield_type;
-
-
-        /** Reference constructor. */
-        explicit bitfield_ref(storage_type& ref)
-            :_ref( ref )
-        { }
-
-
-        /** copy constructor.
-         *  This is because references are copy constructible.
-         */
-        bitfield_ref( bitfield_ref<MaskInfo> const& x)
-           :_ref( x._ref)
-        { }
-        
-        /** Implicit conversion operator 
-         *  Returns the value retrieved from the mask.
-         */
-        operator return_type() const {
-            return static_cast< return_type >( _ref.get() );
-        }
-
-        /** Assignment Of return_type into reference.
-         *  This allows values to be assigned to the get function, as part of 
-         *  the tuple like interface.
-         */
-        _self const& operator=(return_type const& rhs) {
-            _ref.set( rhs );
-            return *this;
-        }
-        
-    private:
-        // storage reference.
-        bitfield_type _ref;
-
-        // not default constructible because this is a reference type
-        bitfield_ref();
-    };
-
-    /** Const reference type.
-     *  This class is used when the storage type is const so that mutability 
-     *  can be removed from the reference type. 
-     */
-    template <typename MaskInfo>
-    struct const_bitfield_ref {
-    private:
-        typedef bitfield_ref<MaskInfo>                               _self;
-    public:
-        typedef typename MaskInfo::return_type             return_type;   
-
-        /** Internals bitfield type for extracting individual fields from 
-         *  within the storage_type.
-         */
-        typedef typename integer::bitfield<
-            const storage_type,
-            MaskInfo::offset::value,
-            MaskInfo::offset::value + MaskInfo::field_width::value - 1,
-            return_type
-        >                                                   bitfield_type;
-
-
-        /** Reference constructor. */
-        explicit const_bitfield_ref(storage_type const& ref)
-            :_ref( ref ) 
-        { }
-
-        /** copy constructor.
-         *  This is because references are copy constructible.
-         */
-        const_bitfield_ref( bitfield_ref<MaskInfo> const& x)
-            :_ref( x.ref)
-        { }
-        
-        /** Implicit conversion operator 
-         *  Returns the value of the bit mask.
-         */
-        operator return_type() const {
-            return  _ref.get();
-        }
-       
-    private:
-        // storage reference.
-        bitfield_type _ref;
-
-        // not default constructible because this is a reference type
-        const_bitfield_ref();
-    };
-
     /** Value constructor.
      *  This sets the initial value of the internal data to x.
      *  Also functions as the default constructor.
@@ -542,29 +433,6 @@
     }
     //@}
 
-
-    /** Meta-member-function
-     *  searches within member for a bft_element with name_type the same as Name
-     *  and returns mpl::true_ if it found it and mpl::false_ if not.
-     */
-    template <typename Name>
-    struct name_exists {
-        typedef typename mpl::not_<
-            is_same <
-                typename ::boost::mpl::find_if<
-                    members,
-                    details::match_name<
-                        mpl::_1,
-                        Name
-                    >
-                >::type,
-                typename mpl::end<
-                    members
-                >::type
-            >
-        >::type         type;
-    };
-
     /** Get function interfaces.
      *  These provide access into the tuple via "reference".
      *  If an invalid index or name is provided then then the user will cause
@@ -572,139 +440,52 @@
      */
     //@{
     template <typename Name>
-    inline typename disable_if<
-        is_same <
-            typename mpl::find_if<
-                members,
-                details::match_name<
-                    mpl::_1,
-                    Name
-                >
-            >::type,
-            typename mpl::end<
-                members
-            >::type
-        >,
-        bitfield_ref<
-            typename mpl::deref<
-                typename mpl::find_if<
-                    members,
-                    details::match_name<
-                        mpl::_1,
-                        Name
-                    >
-                >::type
-            >::type
-        >
-    >::type
+    inline typename details::disable_if_reference_type_by_name<_self,Name>::type
     get() {
-         typedef bitfield_ref< 
-            typename mpl::deref<
-                typename mpl::find_if<
-                    members,
-                     details::match_name<
-                        mpl::_1,
-                        Name
-                    >
-                >::type
-            >::type 
-        >                                   reference_info;
+        typedef typename details::disable_if_reference_type_by_name<
+            _self,
+            Name
+        >::type reference_info;
         return reference_info( _data );
     }
 
 
     template <typename Name>
-    inline typename disable_if<
-        is_same <
-            typename mpl::find_if<
-                members,
-                details::match_name<
-                    mpl::_1,
-                    Name
-                >
-            >::type,
-            typename mpl::end<
-                members
-            >::type
-        >,
-        const_bitfield_ref<
-            typename mpl::deref<
-                typename mpl::find_if<
-                    members,
-                    details::match_name<
-                        mpl::_1,
-                        Name
-                    >
-                >::type
-            >::type
-        > 
-    >::type const
+    inline typename details::disable_if_reference_type_by_name<
+        const _self,
+        Name
+    >::type
     get() const {
-         typedef const_bitfield_ref< 
-            typename mpl::deref<
-                typename mpl::find_if<
-                    members,
-                     details::match_name<
-                        mpl::_1,
-                        Name
-                    >
-                >::type
-            >::type 
-        > const                             reference_info;
+        typedef typename details::disable_if_reference_type_by_name<
+            const _self,
+            Name
+        >::type         reference_info;
         return reference_info( _data );
     }
 
     template <std::size_t Index>
-    inline typename enable_if< 
-        typename mpl::less<
-            mpl::size_t<
-                Index
-            >,
-            mpl::size<
-                members
-            >
-        >,
-        bitfield_ref<
-            typename mpl::at_c<
-                members,
-                Index
-            >::type
-        >
+    inline typename details::enable_if_reference_type_by_index<
+        _self,
+        Index
     >::type
     get() {
-        typedef bitfield_ref<
-            typename mpl::at_c<
-                members,
-                Index
-            >::type
-        >                         reference_info;
+        typedef typename details::enable_if_reference_type_by_index<
+            _self,
+            Index
+        >::type             reference_info;
         return reference_info(_data);
     }
 
     template <std::size_t Index>
-    inline typename enable_if< 
-            typename mpl::less<
-                mpl::size_t<
-                    Index
-                >,
-                mpl::size<
-                    members
-                >
-            >,
-            const_bitfield_ref<
-                typename mpl::at_c<
-                    members,
-                    Index
-                >::type
-            >
+    inline typename details::enable_if_reference_type_by_index<
+        const _self,
+        Index
     >::type
     get() const {
-        typedef const_bitfield_ref<
-            typename mpl::at_c<
-                members,
-                Index
-            >::type
-        > const                         reference_info;
+        typedef typename details::enable_if_reference_type_by_index<
+            const _self,
+            Index
+        >::type                  reference_info;
         return reference_info( _data );
     }
     //@}
Modified: sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/bitfield_iterator.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/bitfield_iterator.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/bitfield_iterator.hpp	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
@@ -54,12 +54,10 @@
     /** Fusion Extension: value_of */
     template<typename Iter>
     struct value_of {
-        typedef typename Iter::bitfield_tuple_type::template bitfield_ref<
-            typename mpl::at<
-                typename Iter::bitfield_tuple_type::members,
-                typename Iter::index
-            >::type
-        >                                       type;
+        typedef typename details::get_reference_type_by_index<
+            BitfieldTuple,
+            Iter::index::value
+        >::type type;
     };
 
     /** Fusion Extension: deref */
Modified: sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/fusion/at_impl.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/fusion/at_impl.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/details/bft/ext/fusion/at_impl.hpp	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
@@ -21,13 +21,11 @@
 
     template <typename BitfieldTuple, typename N>
     struct apply {
-        typedef typename BitfieldTuple::
-            template bitfield_ref<
-                typename mpl::at<
-                    typename BitfieldTuple::members,
-                    N
-                >::type
-            >                             type;
+        typedef typename details::get_reference_type_by_index<
+            BitfieldTuple,
+            N::value
+        >::type                            type;
+
         // non-const at function.
         static type call(BitfieldTuple& bft) {
             return type( bft.template get<N::value>() );
Modified: sandbox/SOC/2010/bit_masks/boost/integer/details/bft/reference_builder.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/details/bft/reference_builder.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/details/bft/reference_builder.hpp	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
@@ -148,6 +148,105 @@
     >::type                             type;
 };
 
+
+template <typename BitfieldTuple, std::size_t Index>
+struct enable_if_reference_type_by_index {
+    // check to make sure index is valid
+    typedef typename mpl::less<
+        mpl::size_t<
+            Index
+        >,
+        mpl::size<
+            typename BitfieldTuple::members
+        >
+    >                   is_valid_index;
+
+    // get the bitfield_element from members.
+    typedef typename mpl::at_c<
+        typename BitfieldTuple::members,
+        Index
+    >::type                     bft_element_t;
+
+    // create the reference type
+    typedef typename BitfieldTuple::template bitfield_reference<
+        typename mpl::if_<
+            is_const<BitfieldTuple>,
+            typename add_const<bft_element_t>::type,
+            bft_element_t
+        >::type
+    >                   reference_type;
+
+    // return the reference type if its valid.
+    typedef typename enable_if<
+        is_valid_index,
+        reference_type
+    >::type                 type;
+};
+
+
+template <typename BitfieldTuple, typename Name>
+struct get_reference_type_by_name {
+    // search for the name,
+    typedef typename mpl::find_if<
+        typename BitfieldTuple::members,
+        details::match_name<
+            mpl::_1,
+            Name
+        >
+    >::type                             element_iter;
+
+    // get the end iterator from members.
+    typedef typename mpl::end<
+        typename BitfieldTuple::members
+    >::type                             member_end;
+
+    // create the bitfield_reference type that will be returned if
+    // disable_if is enabled.
+    typedef typename BitfieldTuple::template bitfield_reference<
+            typename mpl::if_<
+                is_const<BitfieldTuple>,
+                typename add_const<
+                    typename mpl::deref<
+                        element_iter
+                    >::type
+                >::type,
+                typename mpl::deref<
+                    element_iter
+                >::type
+            >::type
+        >                               type;
+
+};
+
+template <typename BitfieldTuple, std::size_t Index>
+struct get_reference_type_by_index {
+    // check to make sure index is valid
+    typedef typename mpl::less<
+        mpl::size_t<
+            Index
+        >,
+        mpl::size<
+            typename BitfieldTuple::members
+        >
+    >                   is_valid_index;
+
+    // get the bitfield_element from members.
+    typedef typename mpl::at_c<
+        typename BitfieldTuple::members,
+        Index
+    >::type                     bft_element_t;
+
+    // create the reference type
+    typedef typename BitfieldTuple::template bitfield_reference<
+        typename mpl::if_<
+            is_const<BitfieldTuple>,
+            typename add_const<bft_element_t>::type,
+            bft_element_t
+        >::type
+    >                           type;
+};
+
+
 }} // end boost::details
 
 #endif
Modified: sandbox/SOC/2010/bit_masks/lib/integer/test/Jamfile.v2
==============================================================================
--- sandbox/SOC/2010/bit_masks/lib/integer/test/Jamfile.v2	(original)
+++ sandbox/SOC/2010/bit_masks/lib/integer/test/Jamfile.v2	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
@@ -33,7 +33,6 @@
         [ compile-fail bft_testing/compile_fail/one_name_two_members.cpp ]
         [ compile bft_testing/compile_pass/bft_member_max_out.cpp ]
         [ run bitfield_tuple_test.cpp ]
-        [ run bft_testing/ref_type_testing.cpp ]
         [ run bft_testing/name_accessor_test.cpp ]
         [ run bft_testing/get_interface_test.cpp ]
         [ run bft_testing/compile_pass/fusion_includes.cpp ]
Deleted: sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/ref_type_testing.cpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/ref_type_testing.cpp	2010-06-24 22:01:01 EDT (Thu, 24 Jun 2010)
+++ (empty file)
@@ -1,103 +0,0 @@
-//  Copyright 2010 Brian Bartman.
-//  Distributed under the Boost Software License, Version 1.0.
-//  (See accompanying file LICENSE_1_0.txt or copy at 
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-
-#include <boost/integer/bitfield_tuple.hpp>
-#include <boost/assert.hpp>
-using namespace boost;
-struct red { };
-struct blue { };
-
-
-typedef bitfield_tuple<
-    storage<int>,
-    member<int, red, 15u>,
-    member<int, blue, 17u>
->       bft;
-
-
-typedef details::bitfield_element< char,
-red,mpl::size_t<9>,mpl::size_t<8> >             element_1;
-
-typedef details::bitfield_element< char, 
-red, mpl::size_t<0>, mpl::size_t<8> >           element_2;
-
-typedef details::bitfield_element< char, 
-red, mpl::size_t<8>, mpl::size_t<8> >           element_3;
-
-typedef details::bitfield_element< char, 
-red, mpl::size_t<16>, mpl::size_t<8> >          element_4;
-
-typedef details::bitfield_element< char, 
-red, mpl::size_t<24>, mpl::size_t<8> >          element_5;
-
-int main() {
-
-    int data_storage(0);
-
-    // simple test entery and retreval.
-    {
-    typedef bft::bitfield_ref<element_1> ref_type_1;
-
-    ref_type_1 test_1( data_storage );
-
-    char temp = 'a';
-    test_1 = temp;
-    BOOST_ASSERT(( test_1 == temp ));
-    }
-    
-    data_storage = 0;
-
-    // slightly more complex.
-    // multiple fields which arn't next to one another.
-    {
-        typedef bft::bitfield_ref<element_2> ref_type_1;
-        typedef bft::bitfield_ref<element_4> ref_type_2;
-
-        // constructing reference types.
-        ref_type_1 ref_1(data_storage);
-        ref_type_2 ref_2(data_storage);
-        ref_1 = 'q';
-        ref_2 = 'p';
-
-        BOOST_ASSERT(( ref_1 == 'q' ));
-        BOOST_ASSERT(( ref_2 == 'p' ));
-    }
-
-    data_storage = 0;
-
-    // case the integer storage type is completely filled with fields.
-    {
-        // create fake reference type to test..
-        typedef bft::bitfield_ref<element_2> ref_type_1;
-        typedef bft::bitfield_ref<element_3> ref_type_2;
-        typedef bft::bitfield_ref<element_4> ref_type_3;
-        typedef bft::bitfield_ref<element_5> ref_type_4;
-        //
-        ref_type_1 ref_1(data_storage);
-        ref_type_2 ref_2(data_storage);
-        ref_type_3 ref_3(data_storage);
-        ref_type_4 ref_4(data_storage);
-
-        ref_1 = 'p';
-        ref_2 = 'q';
-        ref_3 = 'r';
-        ref_4 = 's';
-
-        BOOST_ASSERT(( ref_1 == 'p' )); 
-        BOOST_ASSERT(( ref_2 == 'q' )); 
-        BOOST_ASSERT(( ref_3 == 'r' )); 
-        BOOST_ASSERT(( ref_4 == 's' )); 
-
-        // testing copy constructor
-        // ref_type_1 copy_of_ref_1( ref_1 );
-        // BOOST_ASSERT(( copy_of_ref_1 == ref_1 ));
-        // BOOST_ASSERT(( copy_of_ref_1 == 'p' ));
-        
-    }
-    
-    
-    return 0;
-}