$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r64269 - in sandbox/SOC/2010/bit_masks: . boost/integer/bitfield_tuple boost/integer/detail/bft lib/integer/test/bft_testing
From: bbartmanboost_at_[hidden]
Date: 2010-07-22 16:12:21
Author: bbartman
Date: 2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
New Revision: 64269
URL: http://svn.boost.org/trac/boost/changeset/64269
Log:
pointer member completed and tested
Text files modified: 
   sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple/pointer.hpp                |     4                                         
   sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parse_impl.hpp             |    48 +++++++-----                            
   sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parsing_meta_functions.hpp |    24 +----                                   
   sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/pointer_packing_policy.hpp     |   153 ++++++++++++++++++++++++++++++++------- 
   sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/pointer_member_test.cpp    |    99 +++++++++++++++++++++++++               
   sandbox/SOC/2010/bit_masks/notes.txt                                               |    30 +------                                 
   6 files changed, 262 insertions(+), 96 deletions(-)
Modified: sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple/pointer.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple/pointer.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/bitfield_tuple/pointer.hpp	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -27,8 +27,8 @@
     typename ReturnType,
     typename Name,
     typename Mask = high_bits_mask<
-        typename ::boost::detail::pointer_member::get_mask_type<ReturnType>::type,
-        bit_width< typename ::boost::detail::pointer_member::get_mask_type<ReturnType>::type >::value - 2
+        typename ::boost::detail::ptr_mask_type,
+        bit_width< typename ::boost::detail::ptr_mask_type >::value - 2
     >
 >
 struct pointer;
Modified: sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parse_impl.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parse_impl.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parse_impl.hpp	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -430,32 +430,38 @@
     typedef typename mpl::if_c<back_storage_space::value == 0,
     mpl::false_,mpl::true_>::type                  uses_back_storage;
 
-    // getting starting position of pointer for storage inside of 
-    // bitfield_tuples storage.
+    // calculating mask offset, data offset and the offset for the next field.
     typedef typename mpl::if_<
         uses_front_storage,
+        // calculate offset
         typename mpl::if_<
-            typename mpl::less<
-                front_storage_space,
-                Offset
-            >::type,
-            // the pointer has been pushed because the user has added leading 
-            // members to the bitfield_tuple greater then the number of bits
-            // the mask allows for them to store directly directly within the
-            // pointer. This may need to be a precondition that causes failure.
-
-            // TODO: REMOVE THIS LATER ITS ONLY HERE FOR THE MOMENT TO CAUSE
-            // FAILURE because I don't know how I should implement this part
-            // just yet and thinking about it is hurting my head.
-            mpl::size_t<sizeof(mpl::void_)>::type,
-            typename mpl::minus<front_storage_space, Offset>::type
+            mpl::less_equal<
+                Offset,
+                front_storage_space
+            >,
+            mpl::size_t<0>,
+            mpl::minus<Offset, front_storage_space>
+        >::type,
+        Offset
+    >::type                             mask_offset;
+
+
+    // calculating the offset of the value bits inside of the masks.
+    typedef typename mpl::if_<
+        uses_front_storage,
+        typename mpl::if_<
+            mpl::less_equal<
+                Offset,
+                front_storage_space
+            >,
+            front_storage_space,
+            typename mpl::minus<Offset, front_storage_space>::type
         >::type,
         Offset
-    >::type                                 data_offset;
+    >::type                             data_offset;
+
+    typedef typename mpl::plus< Offset, size_of_storage>::type offset;
 
-    // calculating next offset/width for the next field.
-    typedef typename mpl::plus< size_of_storage, data_offset >::type offset;
- 
     typedef bitfields::pointer< ReturnType, Name, Mask > param;
 
     // if the offset is greater then then number of storage bits
@@ -484,7 +490,7 @@
     //
     typedef typename mpl::if_<is_aligned,
         bit_shift::none,
-        bit_shift::right< mpl::minus<Offset, front_storage_space>::type::value >
+        bit_shift::right< mpl::minus<Offset,front_storage_space>::type::value>
     >::type                     alignment_shift;
 
     typedef StoragePolicy   storage_policy;
Modified: sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parsing_meta_functions.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parsing_meta_functions.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/arg_parsing_meta_functions.hpp	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -17,18 +17,14 @@
 /** This file contains metafunctions which are used to do complex operations
  *  on the Mask provided by the user.
  */
-namespace boost { namespace detail { namespace pointer_member {
-
-template <typename T>
-struct get_mask_type {
-    typedef typename mpl::if_c<
-        (4 < sizeof(T*)),
-        uint64_t,
-        uint32_t
-    >::type                 type;
-};
+namespace boost { namespace detail {
 
+/** This is an integral type which is the same size as a pointer on a 32 or 64
+ *  bit system
+ */ 
+typedef mpl::if_c<(4<sizeof(void*)),uint64_t,uint32_t>::type ptr_mask_type;
 
+namespace pointer_member {
 
 // this is ugly but I would like it for organizational purposes.
 namespace ptr_detail {
@@ -136,14 +132,6 @@
     typedef typename ptr_detail::ctz_helper<Mask>::type type;
 };
 
-
-template <typename Mask, typename Policy>
-struct pointer_member_info {
-    typedef Mask mask;
-    typedef Policy policy;
-};
-
-
 }}} // end boost::detail::pointer_member
 
 #endif
Modified: sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/pointer_packing_policy.hpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/pointer_packing_policy.hpp	(original)
+++ sandbox/SOC/2010/bit_masks/boost/integer/detail/bft/pointer_packing_policy.hpp	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -29,14 +29,14 @@
     typename StorageType,
     bool
 >
-struct apply_impl_no_shift;
+struct apply_impl;
 
 
 /** Specialization where for the storage type and the size of the mask being
  *  the same.
  */
 template <typename Mask, typename Offset, typename ValueType, typename StorageType>
-struct apply_impl_no_shift < Mask, Offset, ValueType, StorageType, true > {
+struct apply_impl < Mask, Offset, ValueType, StorageType, true > {
 
     typedef Mask        get_mask;
     typedef integral_constant<
@@ -65,10 +65,11 @@
  *  then the type of the mask.
  */
 template <typename Mask, typename Offset, typename ValueType, typename StorageType>
-struct apply_impl_no_shift < Mask, Offset, ValueType, StorageType, false > {
+struct apply_impl < Mask, Offset, ValueType, StorageType, false > {
     typedef ValueType   value_type;
     typedef StorageType storage_type;
     typedef Mask        mask;
+
     // this is going to be for computers with integral types LARGER then 
     // the size of their pointer type.
     typedef mpl::size_t<
@@ -88,7 +89,7 @@
         ~get_mask::value
     >                               set_mask;
 
-    static value_type get(storage_type storage ) {
+    static value_type get(storage_type storage) {
         return value_type((storage & get_mask::value) >> shift_amount::value) ;
     }
 
@@ -109,7 +110,7 @@
  *  of steps as a 32 bit pointer which is stored within int sized type.
  */
 template <typename Mask, typename ValueType>
-struct apply_impl_no_shift < Mask, mpl::size_t<32>, ValueType, long long, false > {
+struct apply_impl < Mask, mpl::size_t<32>, ValueType, long long, false > {
 
     typedef integral_constant<unsigned long long, Mask::value> get_mask;
     typedef integral_constant<
@@ -139,7 +140,7 @@
  *  of steps as a 32 bit pointer which is stored within int sized type.
  */
 template <typename Mask, typename ValueType>
-struct apply_impl_no_shift <
+struct apply_impl <
     Mask,
     mpl::size_t<32>,
     ValueType,
@@ -154,7 +155,7 @@
     typedef ValueType           value_type;
     typedef unsigned long long  storage_type;
 
-    static value_type get(storage_type storage ) {
+    static value_type get(storage_type storage) {
         return value_type(storage & get_mask::value);
     }
 
@@ -167,6 +168,109 @@
     }
 };
 
+template <
+    typename Mask,
+    typename Offset,
+    typename ValueType,
+    typename StorageType,
+    typename MaskShift,
+    bool
+>
+struct apply_shift_impl {
+    typedef Mask        mask;
+    typedef Offset      offset;
+    typedef ValueType   value_type;
+    typedef StorageType storage_type;
+    typedef MaskShift   mask_shift_amount;
+
+    typedef typename mpl::shift_right<
+        mask,
+        mask_shift_amount
+    >::type                             get_mask;
+
+    typedef integral_constant<
+        typename get_mask::value_type,
+        ~get_mask::value
+    >                                   set_mask;
+         
+    static value_type get(storage_type storage) {
+        return value_type(
+            (storage & get_mask::value)
+              <<
+            mask_shift_amount::value
+        );
+    }
+
+    static storage_type set(storage_type storage, value_type ptr) {
+        return storage_type(
+            ((typename get_mask::value_type(ptr) & get_mask::value)
+                  >>
+            mask_shift_amount::value)
+              |
+            (set_mask::value & storage)
+        );
+    }
+};
+
+template <
+    typename Mask,
+    typename Offset,
+    typename ValueType,
+    typename StorageType,
+    typename MaskShift
+>
+struct apply_shift_impl<Mask,Offset,ValueType,StorageType,MaskShift,false>{
+    typedef Mask        mask;
+    typedef Offset      offset;
+    typedef ValueType   value_type;
+    typedef StorageType storage_type;
+    typedef MaskShift   mask_shift_amount;
+
+    // calculating shift for correctly aligning mask
+    // with storage type.
+    typedef typename mpl::minus<
+        typename mpl::minus<
+            bit_width<storage_type>,
+            mask_shift_amount
+        >::type,
+        bit_width<
+            typename mask::value_type
+        >
+    >::type                     correction_shift_amount;
+
+    typedef typename mpl::shift_left<
+        integral_constant<storage_type, storage_type(mask::value)>,
+        correction_shift_amount
+    >::type                     get_mask;
+
+    typedef integral_constant<
+        typename get_mask::value_type, 
+        typename get_mask::value_type(~get_mask::value)
+    >                           set_mask;
+
+    static value_type get(storage_type storage ) {
+        return value_type(
+            (storage & get_mask::value)
+              >>
+            correction_shift_amount::value
+        );
+    }
+
+    static storage_type set(storage_type storage, value_type ptr) {
+        
+        return storage_type(
+            (storage_type(typename mask::value_type(ptr))
+              <<
+            correction_shift_amount::value)
+              |
+            (set_mask::value & storage)
+        );
+    }
+
+
+};
+
+
 } // end policy_detail
 
 /** Only specilization exist for no shift and shift right however
@@ -198,14 +302,12 @@
     mpl::true_,
     bit_shift::none
 > {
-
-
     typedef Mask                mask;
     typedef ValueType           value_type;
 
     template <typename StorageType>
     struct apply
-        :policy_detail::apply_impl_no_shift<
+        :policy_detail::apply_impl<
             Mask,
             Offset,
             ValueType,
@@ -215,9 +317,7 @@
 };
 
 
-
-
-/** Specilization for when the pointer is shifted left. */
+/** Specilization for when the pointer is shifted right. */
 template <
     typename Mask,
     typename ValueType,
@@ -232,25 +332,20 @@
     Width,
     mpl::false_,
     bit_shift::right<ShiftAmount>
->
-{
+> {
     typedef Mask                mask;
-    typedef Offset              offset;
-    typedef Width               width;
     typedef ValueType           value_type;
-
+    
     template <typename StorageType>
-    struct apply {
-        typedef StorageType         storage_type;
-
-        static value_type get(storage_type storage ) {
-            return value_type();
-        }
-
-        static storage_type set(storage_type storage, value_type ptr) {
-            return storage_type();
-        }
-    };
+    struct apply
+        :policy_detail::apply_shift_impl<
+            Mask,
+            Offset,
+            ValueType,
+            StorageType,
+            mpl::size_t<ShiftAmount>,
+            sizeof(StorageType) == sizeof(typename Mask::value_type)
+        > { };
 
 };
 
Modified: sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/pointer_member_test.cpp
==============================================================================
--- sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/pointer_member_test.cpp	(original)
+++ sandbox/SOC/2010/bit_masks/lib/integer/test/bft_testing/pointer_member_test.cpp	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -6,6 +6,8 @@
 #include <boost/integer/bitfield_tuple.hpp>
 #include <boost/detail/lightweight_test.hpp>
 #include <boost/type_traits/is_same.hpp>
+#include <iostream>
+#include <iomanip>
 
 using namespace boost;
 using namespace boost::bitfields;
@@ -44,6 +46,38 @@
     flag<b2>
 >                   test_type_5;
 #endif
+
+typedef bitfield_tuple<
+    storage<unsigned long long>,
+    filler<2>,
+    pointer<int, rd,
+        bits_mask<
+            detail::ptr_mask_type,
+            2,
+            bit_width<
+                detail::ptr_mask_type
+            >::value - 4
+        >
+    >,
+    flag<b1>,
+    flag<b2>
+>                   test_type_6;
+
+typedef bitfield_tuple<
+    storage<unsigned long long>,
+    filler<3>,
+    pointer<int, rd,
+        bits_mask<
+            detail::ptr_mask_type,
+            2,
+            bit_width<
+                detail::ptr_mask_type
+            >::value - 4
+        >
+    >,
+    flag<b1>,
+    flag<b2>
+>                   test_type_7;
 int main() {
     {
     test_type_1 t1;
@@ -76,7 +110,7 @@
     // NOTE this test may fail on 64 bit machines but I need to test it
     // either way.
 #if( _LP64 != 1)
-    if(sizeof(void*) == 4) {
+    {
         
         test_type_3 t3;
         int i = 30;
@@ -85,7 +119,7 @@
     }
 
     // this test will also fail on 64 bit machines.
-    if(sizeof(void*) == 4) {
+    {
         test_type_4 t4;
         int i = 70;
         t4.get<rd>() = &i;
@@ -93,12 +127,71 @@
     }
 
     // this test will also fail on 64 bit machines.
-    if(sizeof(void*) == 4) {
+    {
         test_type_5 t5;
         int i = 70;
         t5.get<rd>() = &i;
         BOOST_TEST( *t5.get<rd>() == 70 );
     }
 #endif
+    {
+        test_type_6 t6;
+        int i = 70;
+        
+        detail::ptr_mask_type ptr = high_bits_mask<
+            detail::ptr_mask_type,
+            2
+        >::value
+          &
+        detail::ptr_mask_type(&i);
+
+        std::cout<< "value of &i: " << std::hex << &i << std::endl;
+        std::cout<< "2 bits of &i: " << std::hex << ptr << std::endl;
+
+        t6.get<rd>() = &i;
+
+        int* temp_ptr = t6.get<rd>();
+        std::cout<< "Value of temp_ptr: " << std::hex << temp_ptr << std::endl;
+        detail::ptr_mask_type temp_int = detail::ptr_mask_type(temp_ptr); 
+        temp_int |= detail::ptr_mask_type( ptr );
+        typedef int* intptr_t;
+        temp_ptr = intptr_t(temp_int);
+
+        std::cout<< "Value of temp_int: " << std::hex<< temp_int << std::endl;
+        std::cout<< "Value returned from t6.get<rd>(): " << std::hex <<
+            temp_ptr << std::endl;
+
+        BOOST_TEST( * temp_ptr == 70 );
+    }
+    {
+        test_type_7 t7;
+        int i = 70;
+        
+        detail::ptr_mask_type ptr = high_bits_mask<
+            detail::ptr_mask_type,
+            2
+        >::value
+          &
+        detail::ptr_mask_type(&i);
+
+        std::cout<< "value of &i: " << std::hex << &i << std::endl;
+        std::cout<< "2 bits of &i: " << std::hex << ptr << std::endl;
+
+        t7.get<rd>() = &i;
+
+        int* temp_ptr = t7.get<rd>();
+        std::cout<< "Value of temp_ptr: " << std::hex << temp_ptr << std::endl;
+        detail::ptr_mask_type temp_int = detail::ptr_mask_type(temp_ptr); 
+        temp_int |= detail::ptr_mask_type( ptr );
+        typedef int* intptr_t;
+        temp_ptr = intptr_t(temp_int);
+
+        std::cout<< "Value of temp_int: " << std::hex<< temp_int << std::endl;
+        std::cout<< "Value returned from t6.get<rd>(): " << std::hex <<
+            temp_ptr << std::endl;
+
+        BOOST_TEST( *temp_ptr == 70 );
+    }
+
     return boost::report_errors();
 }
Modified: sandbox/SOC/2010/bit_masks/notes.txt
==============================================================================
--- sandbox/SOC/2010/bit_masks/notes.txt	(original)
+++ sandbox/SOC/2010/bit_masks/notes.txt	2010-07-22 16:12:20 EDT (Thu, 22 Jul 2010)
@@ -13,30 +13,16 @@
     b)  Create documentation for how to create your own policy.
     c)  This may need additional documentation however it looks good currently.
 
+
 4)  pointer_parsing_meta_functions.hpp
-    a)  think of a better name for this file.
-    b)  template <typename Mask, typename Policy>
-        struct pointer_member_info;
-        I   )   Do impact analysis for the removal of this structure.
-                I don't believe its used or needed any more.
-
-    c)  template <typename T>
-        struct get_mask_type;
-        I   )   This type needs a new name something like uintptr_t or 
-                something simple like that.
-        II  )   This "could" be removed IF there is an unsigned integral type 
-                which is always the same size as a pointer. There may be
-                however I don't know where or what it is currently.
-        III )   Consider making this also do short or 16 bit pointers.
-        IV  )   Why is this a template? I should fix this as a pointer to one
-                type is always the same size as another.
+    a) typedef mpl::if_c<(4<sizeof(void*)),uint64_t,uint32_t>::type ptr_mask_type
+        I   )   Add support for 16 bit systems. Eventually.
 
-    d)  Create additional tests for count leading and trailing zero
-        meta-functions.
 
 5)  pointer_packing_policy.hpp
     a)  Adjust the alignment check to check alignment against the 0 bit in stead
         of based on the offset.
+
     b)  Change the following specialization so that this isn't needed
         basically this requires a shift from the pointer, when there shouldn't
         be.
@@ -58,17 +44,14 @@
         be all. Unless there there is some issue.
 
 6)  name_lookup.hpp
-    a)  everything is fine here.
-
 7)  make_bitfield_tuple.hpp
-    a)  Everything here has already been fixed.
-
 8)  bitfield_tuple_impl.hpp
-    a) Everything looks OK here.
+
 
 9)  bft_element.hpp
     a) change name to bitfield_element.hpp - eventually.
 
+
 10) arg_parse_impl.hpp
     a)  Finish the pointer parsing stuff.
         I   )   This includes the pointer shifting stuff as well.
@@ -217,6 +200,7 @@
 --------------------------------------------------------------------------------
 1)  !DONE! Add interface test for the interface macros. !DONE!
 2)  interface meta-function test suite.
+3)  Create additional tests for count leading and trailing zero meta-functions.
 
 --------------------------------------------------------------------------------