$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: phil_at_[hidden]
Date: 2008-06-04 12:36:38
Author: pbouchard
Date: 2008-06-04 12:36:38 EDT (Wed, 04 Jun 2008)
New Revision: 46125
URL: http://svn.boost.org/trac/boost/changeset/46125
Log:
Finalized pointer by adding generalized allocator.
Text files modified: 
   sandbox/shifted_ptr/boost/detail/sh_owned_base_nt.hpp            |   101 +++++++++++++++++---------------------- 
   sandbox/shifted_ptr/boost/shifted_ptr.hpp                        |    31 +++++-------                            
   sandbox/shifted_ptr/libs/smart_ptr/example/shifted_ptr_test2.cpp |    39 +++++++++++++++                         
   3 files changed, 96 insertions(+), 75 deletions(-)
Modified: sandbox/shifted_ptr/boost/detail/sh_owned_base_nt.hpp
==============================================================================
--- sandbox/shifted_ptr/boost/detail/sh_owned_base_nt.hpp	(original)
+++ sandbox/shifted_ptr/boost/detail/sh_owned_base_nt.hpp	2008-06-04 12:36:38 EDT (Wed, 04 Jun 2008)
@@ -32,6 +32,7 @@
 #include <boost/thread.hpp>
 #include <boost/thread/tss.hpp>
 #include <boost/pool/pool.hpp>
+#include <boost/numeric/interval.hpp>
 #include <boost/type_traits/is_array.hpp>
 #include <boost/type_traits/remove_extent.hpp>
 #include <boost/type_traits/has_trivial_destructor.hpp>
@@ -55,58 +56,59 @@
 class owned_base;
 
 
-#ifndef BOOST_SH_DISABLE_THREADS
-struct thread_specific_stack : thread_specific_ptr< std::stack<owned_base *> >
-{
-    thread_specific_stack()
-    {
-        reset(new std::stack<owned_base *>());
-    }
-};
-#endif
-
-
 /**
-	Segment boundaries.
+    Allocator wrapper tracking allocations.
 */
 
-struct segment : std::pair<const void *, const void *>
+struct pool : boost::pool<>,
+#ifndef BOOST_SH_DISABLE_THREADS
+    thread_specific_ptr< std::list< numeric::interval<int> > >
+#else
+    std::auto_ptr< std::list< numeric::interval<int> > >
+#endif
 {
-    typedef std::pair<const void *, const void *> base;
+    typedef std::list< numeric::interval<int> > li;
 
-    segment(const void * p = (const void *)(std::numeric_limits<unsigned>::max)(), const void * q = (const void *)(std::numeric_limits<unsigned>::min)()) : base((const void *)(p), (const void *)(q))
+    pool() : boost::pool<>(1)
     {
+        reset(new std::list< numeric::interval<int> >());
     }
-
-    void include(const void * p)
+    
+    owned_base * top(void * p)
     {
-        if (p < static_cast<const void *>(first)) first = p;
-        if (p > static_cast<const void *>(second)) second = p;
+        li::reverse_iterator i;
+        
+        for (i = get()->rbegin(); i != get()->rend(); i ++)
+            if (in((int)(p), * i))
+            {
+                get()->erase(i.base(), get()->end());
+                break;
+            }
+            
+        return (owned_base *)(i->lower());
     }
-
-    bool is_from(const void * p)
+    
+    void * allocate(std::size_t s)
     {
-        return ! (static_cast<char const *>(p) < first || static_cast<char const *>(p) > second);
+        void * p = ordered_malloc(s);
+        
+        get()->push_back(numeric::interval<int>((int) p, int((char *)(p) + s)));
+        
+        return p;
     }
-};
-
-
-/**
-	Auto stack boundaries.
-*/
 
-struct stack_segment : segment
-{
-    bool is_from(const void * p)
+    void deallocate(void * p)
     {
-#if defined(__GNUC__)
-        include(__builtin_frame_address(0));
-        include(__builtin_frame_address(5));
-#else
-#error Compiler not yet supported.
-#endif
+        li::reverse_iterator i;
         
-        return segment::is_from(p);
+        for (i = get()->rbegin(); i != get()->rend(); i ++)
+            if (in((int)(p), * i))
+            {
+                get()->erase(i.base(), get()->end());
+                break;
+            }
+            
+        free(p, i->upper() - i->lower());
     }
 };
 
@@ -134,25 +136,11 @@
     intrusive_list::node * set_tag() 				{ return & set_tag_; }
     intrusive_list::node * init_tag() 				{ return & init_tag_; }
 
-    static pool<> pool_;
-    static stack_segment stack_;
-	
-#ifndef BOOST_SH_DISABLE_THREADS
-    static thread_specific_stack last;
-#else
-    static std::stack<owned_base *> * last;
-#endif
+    static pool pool_;
 };
 
 
-pool<> owned_base::pool_(1);
-stack_segment owned_base::stack_;
-
-#ifndef BOOST_SH_DISABLE_THREADS
-thread_specific_stack owned_base::last;
-#else
-std::stack<owned_base *> * owned_base::last = new std::stack<owned_base *>;
-#endif
+pool owned_base::pool_;
 
 
 /**
@@ -194,13 +182,12 @@
         
         void * operator new (size_t s)
         {
-            return pool_.ordered_malloc(s);
+            return pool_.allocate(s);
         }
         
         void operator delete (void * p)
         {
-            //!FIXME
-            pool_.free(p, sizeof(owned));
+            pool_.deallocate(p);
         }
 
     private:
Modified: sandbox/shifted_ptr/boost/shifted_ptr.hpp
==============================================================================
--- sandbox/shifted_ptr/boost/shifted_ptr.hpp	(original)
+++ sandbox/shifted_ptr/boost/shifted_ptr.hpp	2008-06-04 12:36:38 EDT (Wed, 04 Jun 2008)
@@ -74,11 +74,11 @@
         includes_.push_back(& tag_);
     }
 
-    bool release(bool b)
+    bool release()
     {
         set * p = redir();
 
-        if (! b && -- p->count_ == 0)
+        if (-- p->count_ == 0)
         {
             for (intrusive_list::iterator<owned_base, & owned_base::set_tag_> i; i = p->elements_.begin(), i != p->elements_.end(); )
             {
@@ -105,17 +105,14 @@
         else return redir_ = redir_->redir();
     }
 
-    void redir(set * p, bool b)
+    void redir(set * p)
     {
         if (redir_ != p->redir())
         {
             redir_ = p->redir();
             redir_->includes_.merge(includes_);
             redir_->elements_.merge(elements_);
-
-            // tie only if both from stack
-            if (! b)
-                redir_->count_ += count_;
+            redir_->count_ += count_;
         }
     }
 
@@ -155,7 +152,7 @@
             if (! owned_base::pool_.is_from(this))
                 ps_ = new set();
             else
-                owned_base::last->top()->ptrs()->push(& pn_);
+                owned_base::pool_.top(this)->ptrs()->push(& pn_);
         }
 
         template <typename V>
@@ -169,8 +166,8 @@
                 }
                 else
                 {
-                    owned_base::last->top()->ptrs()->push(& pn_);
-                    owned_base::last->top()->inits()->merge(* p->inits());
+                    owned_base::pool_.top(this)->ptrs()->push(& pn_);
+                    owned_base::pool_.top(this)->inits()->merge(* p->inits());
                 }
             }
 
@@ -180,9 +177,9 @@
                 if (! owned_base::pool_.is_from(this))
                     ps_ = new set();
                 else
-                    owned_base::last->top()->ptrs()->push(& pn_);
+                    owned_base::pool_.top(this)->ptrs()->push(& pn_);
 
-                ps_->redir(p.ps_, ! owned_base::stack_.is_from(this));
+                ps_->redir(p.ps_);
             }
 
             shifted_ptr(shifted_ptr<T> const & p) : U<T>(p)
@@ -190,9 +187,9 @@
                 if (! owned_base::pool_.is_from(this))
                     ps_ = new set();
                 else
-                    owned_base::last->top()->ptrs()->push(& pn_);
+                    owned_base::pool_.top(this)->ptrs()->push(& pn_);
 
-                ps_->redir(p.ps_, ! owned_base::stack_.is_from(this));
+                ps_->redir(p.ps_);
             }
 
         template <typename V>
@@ -213,7 +210,7 @@
                     if (ps_->redir() != p.ps_->redir())
                     {
                         release();
-                        ps_->redir(p.ps_, ! owned_base::stack_.is_from(this));
+                        ps_->redir(p.ps_);
                     }
                     U<T>::operator = (p);
                 }
@@ -240,7 +237,7 @@
         {
             if (! owned_base::pool_.is_from(this))
             {
-                if (ps_->release(! owned_base::stack_.is_from(this)))
+                if (ps_->release())
                 {
                     U<T>::po_ = 0;
 
@@ -286,9 +283,7 @@
                         typedef typename remove_const<typename remove_volatile<T>::type>::type unqualified_type;			\
                                                                                                                                                                                                                                 \
                         owned<T> * p = new owned<T>();																		\
-			owned_base::last->push(p);																			\
                         pointer_type q = reinterpret_cast<pointer_type>(new (const_cast<unqualified_type *>(p->element())) T(BOOST_PP_REPEAT(n, PARAMETER_DECL, 0)));	\
-			owned_base::last->pop();																			\
                                                                                                                                                                                                                                 \
                         return (owned<T> *) (typename owned<T>::roofof) q;													\
                 }
Modified: sandbox/shifted_ptr/libs/smart_ptr/example/shifted_ptr_test2.cpp
==============================================================================
--- sandbox/shifted_ptr/libs/smart_ptr/example/shifted_ptr_test2.cpp	(original)
+++ sandbox/shifted_ptr/libs/smart_ptr/example/shifted_ptr_test2.cpp	2008-06-04 12:36:38 EDT (Wed, 04 Jun 2008)
@@ -11,6 +11,10 @@
 #include <vector>
 #include <iostream>
 
+#include <boost/mpl/range_c.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/array.hpp>
+
 
 static int count;
 
@@ -59,6 +63,13 @@
     std::vector<shifted_ptr<vector> > elements;
 };
 
+struct create_type {
+    template<class T>
+    void operator()(T) const {
+        new_sh<boost::array<char, T::value> >();
+    }
+};
+
 int main() {
     count = 0;
         {
@@ -78,4 +89,32 @@
         v->elements.push_back(v);
     }
     std::cout << count << std::endl;
+
+    count = 0;
+    {
+        shifted_ptr<vector> v = new_sh<vector>();
+        v->elements.push_back(v);
+    }
+    std::cout << count << std::endl;
+
+    {
+        vector v;
+        v.elements.push_back(new_sh<vector>());
+    }
+    std::cout << count << std::endl;
+
+    count = 0;
+    {
+        shifted_ptr<int> test = new_sh<int>(5);
+        test = test;
+        
+        std::cout << "test = " << * test << std::endl;
+    }
+    std::cout << count << std::endl;
+
+    count = 0;
+    for(int i = 0; i < 500; ++i) {
+        boost::mpl::for_each<boost::mpl::range_c<int, 1, 100> >(create_type());
+    }
+    std::cout << count << std::endl;
 }