Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r54049 - in sandbox/monotonic: boost/monotonic libs/monotonic/test
From: christian.schladetsch_at_[hidden]
Date: 2009-06-18 02:50:49


Author: cschladetsch
Date: 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
New Revision: 54049
URL: http://svn.boost.org/trac/boost/changeset/54049

Log:
added local<>, removed ability for containers to be constructed from storage<>

Added:
   sandbox/monotonic/boost/monotonic/local.hpp (contents, props changed)
Properties modified:
   sandbox/monotonic/libs/monotonic/test/ (props changed)
Text files modified:
   sandbox/monotonic/boost/monotonic/allocator.hpp | 8 +
   sandbox/monotonic/boost/monotonic/allocator_base.hpp | 6
   sandbox/monotonic/boost/monotonic/config.hpp | 4
   sandbox/monotonic/boost/monotonic/forward_declarations.hpp | 3
   sandbox/monotonic/boost/monotonic/shared_allocator.hpp | 4
   sandbox/monotonic/boost/monotonic/static_storage.hpp | 22 +++++
   sandbox/monotonic/boost/monotonic/storage.hpp | 1
   sandbox/monotonic/libs/monotonic/test/compare_memory_pool.cpp | 134 ++++++++++++++++++++++++----------
   sandbox/monotonic/libs/monotonic/test/main.cpp | 154 +++++++++++++++------------------------
   sandbox/monotonic/libs/monotonic/test/monotonic.vcproj | 22 +++++
   sandbox/monotonic/libs/monotonic/test/rope.cpp | 10 +-
   sandbox/monotonic/libs/monotonic/test/test_bubble_sort.cpp | 4
   sandbox/monotonic/libs/monotonic/test/test_chained_storage.cpp | 4
   sandbox/monotonic/libs/monotonic/test/test_dupe.cpp | 4
   sandbox/monotonic/libs/monotonic/test/test_map_list.cpp | 10 +-
   15 files changed, 231 insertions(+), 159 deletions(-)

Modified: sandbox/monotonic/boost/monotonic/allocator.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/allocator.hpp (original)
+++ sandbox/monotonic/boost/monotonic/allocator.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -26,6 +26,9 @@
                         };
                 };
 
+ storage_base &get_storage();
+ storage_base *set_storage(storage_base &);
+
                 template <class T>
                 struct allocator : allocator_base<T, allocator<T> >
                 {
@@ -45,11 +48,14 @@
                         };
 
                         allocator() throw()
- : Parent(static_storage) { }
+ : Parent(boost::monotonic::get_storage()) { }
 
+ private:
+ template <class T> struct local;
                         allocator(storage_base &store) throw()
                                 : Parent(store) { }
 
+ public:
                         allocator(const allocator& alloc) throw()
                                 : Parent(alloc) { }
 

Modified: sandbox/monotonic/boost/monotonic/allocator_base.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/allocator_base.hpp (original)
+++ sandbox/monotonic/boost/monotonic/allocator_base.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -66,7 +66,7 @@
                                 template <class Storage>
                                 static T Given(Storage &storage)
                                 {
- return T(storage);
+ return T();//storage);
                                 }
                         };
                 }
@@ -130,12 +130,12 @@
 
                         void construct(pointer ptr)
                         {
- detail::Construct<detail::is_monotonic<T>::value>::Given(ptr, static_cast<Derived *>(this));
+ new (ptr) T();//detail::Construct<detail::is_monotonic<T>::value>::Given(ptr, static_cast<Derived *>(this));
                         }
 
                         void construct(pointer ptr, const T& val)
                         {
- detail::Construct<detail::is_monotonic<T>::value>::Given(ptr, val, static_cast<Derived *>(this));
+ new (ptr) T(val);//detail::Construct<detail::is_monotonic<T>::value>::Given(ptr, val, static_cast<Derived *>(this));
                         }
 
                         void destroy(pointer ptr)

Modified: sandbox/monotonic/boost/monotonic/config.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/config.hpp (original)
+++ sandbox/monotonic/boost/monotonic/config.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -15,9 +15,9 @@
                         enum
                         {
                                 InlineSize = 8*1024, ///< buffer that is inline with the storage
- MinHeapIncrement = 64*1024*1024, ///< the smallest new chunk-size for heap storage
+ MinHeapIncrement = 4*1024*1024, ///< the smallest new chunk-size for heap storage
                                 StaticInlineSize = 64*1024, ///< inline size for a global store. this goes into your BSS
- StaticMinHeapIncrement = 64*1024*1024,
+ StaticMinHeapIncrement = 4*1024*1024,
                         };
                 };
 

Modified: sandbox/monotonic/boost/monotonic/forward_declarations.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/forward_declarations.hpp (original)
+++ sandbox/monotonic/boost/monotonic/forward_declarations.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -32,6 +32,9 @@
                         , class Al = std::allocator<char> >
                 struct storage;
 
+ template <class Storage = storage<> >
+ struct local;
+
                 /// thread-safe storage
                 template <
                         size_t InlineSize = DefaultSizes::InlineSize

Added: sandbox/monotonic/boost/monotonic/local.hpp
==============================================================================
--- (empty file)
+++ sandbox/monotonic/boost/monotonic/local.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -0,0 +1,79 @@
+// Copyright (C) 2009 Christian Schladetsch
+//
+// 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)
+
+#ifndef BOOST_MONOTONIC_LOCAL_HPP
+#define BOOST_MONOTONIC_LOCAL_HPP
+
+#include <boost/monotonic/storage.hpp>
+
+namespace boost
+{
+ namespace monotonic
+ {
+ template <class Storage>
+ struct local : storage_base
+ {
+
+ private:
+ Storage store;
+ storage_base *old;
+
+ public:
+ local()
+ {
+ old = set_storage(store);
+ }
+ ~local()
+ {
+ if (old)
+ set_storage(*old);
+ else
+ default_storage();
+ }
+
+ void reset()
+ {
+ store.reset();
+ }
+ void release()
+ {
+ store.release();
+ }
+
+ template <class T>
+ allocator<T> make_allocator()
+ {
+ return allocator<T>(store);
+ }
+
+ // the number of bytes to allocate, and the alignment to use
+ void *allocate(size_t num_bytes, size_t alignment)
+ {
+ return store.allocate(num_bytes, alignment);
+ }
+
+ size_t max_size() const
+ {
+ return store.max_size();
+ }
+
+ size_t used() const
+ {
+ return store.used();
+ }
+
+ size_t remaining() const
+ {
+ return store.remaining();
+ }
+ };
+
+ } // namespace monotonic
+
+} // namespace boost
+
+#endif // BOOST_MONOTONIC_LOCAL_HPP
+
+//EOF

Modified: sandbox/monotonic/boost/monotonic/shared_allocator.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/shared_allocator.hpp (original)
+++ sandbox/monotonic/boost/monotonic/shared_allocator.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -50,8 +50,8 @@
                         shared_allocator() throw()
                                 : Parent(static_shared_storage) { }
 
- shared_allocator(shared_storage_base &store) throw()
- : Parent(store) { }
+ //shared_allocator(shared_storage_base &store) throw()
+ // : Parent(store) { }
 
                         shared_allocator(const shared_allocator& alloc) throw()
                                 : Parent(alloc) { }

Modified: sandbox/monotonic/boost/monotonic/static_storage.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/static_storage.hpp (original)
+++ sandbox/monotonic/boost/monotonic/static_storage.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -56,7 +56,27 @@
                 };
 
                 /// 'static_storage' will be used by a default-constructed monotonic::allocator
- extern static_storage_base<> static_storage;
+ extern static_storage_base<> default_static_storage;
+ extern storage_base *static_storage;
+
+ inline storage_base &get_storage()
+ {
+ return static_storage ? *static_storage : default_static_storage;
+ }
+ inline storage_base *set_storage(storage_base &store)
+ {
+ storage_base *old = static_storage;
+ static_storage = &store;
+ return old;
+ }
+ inline void reset_storage()
+ {
+ get_storage().reset();
+ }
+ inline void default_storage()
+ {
+ static_storage = &default_static_storage;
+ }
                 
                 /// TODO: this will be specialised for
                 /// static_storage_base<..., shared_storage>, but to avoid having to link against boost::thread

Modified: sandbox/monotonic/boost/monotonic/storage.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/storage.hpp (original)
+++ sandbox/monotonic/boost/monotonic/storage.hpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -172,6 +172,7 @@
                         }
                 };
 
+
         } // namespace monotonic
 
 } // namespace boost

Modified: sandbox/monotonic/libs/monotonic/test/compare_memory_pool.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/compare_memory_pool.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/compare_memory_pool.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -2,37 +2,55 @@
 #include <boost/pool/pool.hpp>
 #include <boost/pool/pool_alloc.hpp>
 
-template <class Pool>
-int thrash_pool(size_t length, Pool &pool)
+struct thrash_pool
 {
- generate_n(back_inserter(pool), length, rand);
- int total = 0;
- BOOST_FOREACH(int n, pool)
+ template <class Pool>
+ void operator()(size_t length, Pool &pool) const
         {
- total += n;
+ fill_n(back_inserter(pool), length, 42);
         }
- return total;
-}
+};
+
+struct thrash_pool_sort
+{
+ template <class Pool>
+ int operator()(size_t length, Pool &pool) const
+ {
+ srand(42);
+ generate_n(back_inserter(pool), length, rand);
+ pool.sort();
+ int total = 0;
+ BOOST_FOREACH(int n, pool)
+ {
+ total += n;
+ }
+ return total;
+ }
+};
 
 struct PoolResult
 {
         double pool_elapsed;
         double fast_pool_elapsed;
         double mono_elapsed;
+ double local_mono_elapsed;
         double std_elapsed;
+ PoolResult()
+ {
+ pool_elapsed = fast_pool_elapsed = mono_elapsed = local_mono_elapsed = std_elapsed = 0;
+ }
 };
 
-PoolResult compare_memory_pool(size_t count, size_t length)
+template <class Fun>
+PoolResult compare_memory_pool(size_t count, size_t length, Fun fun)
 {
- typedef boost::fast_pool_allocator<int,
+ cout << "compare_memory_pool: " << count << ", " << length << endl;
+ typedef std::list<int, boost::pool_allocator<int,
                 boost::default_user_allocator_new_delete,
- boost::details::pool::null_mutex> fast_pool_alloc;
- typedef boost::pool_allocator<int,
+ boost::details::pool::null_mutex> > pool_v;
+ typedef std::list<int, boost::fast_pool_allocator<int,
                 boost::default_user_allocator_new_delete,
- boost::details::pool::null_mutex> pool_alloc;
-
- typedef std::list<int, pool_alloc > pool_v;
- typedef std::list<int, fast_pool_alloc > fast_pool_v;
+ boost::details::pool::null_mutex> > fast_pool_v;
         typedef std::list<int, boost::monotonic::allocator<int> > mono_v;
         typedef std::list<int > std_v;
 
@@ -43,28 +61,34 @@
                 boost::timer timer;
                 for (size_t n = 0; n < count; ++n)
                 {
+ srand(42);
                         {
                                 fast_pool_v pool;
- thrash_pool(length, pool);
+ fun(length, pool);
                         }
                         boost::singleton_pool<boost::fast_pool_allocator_tag, sizeof(int)>::release_memory();
                 }
                 result.fast_pool_elapsed = timer.elapsed();
         }
 
- // test boost::pool_allocator
+ // test boost::pool_allocator. dont bother for larger sizes as it is known to be slow
+ if (length < 3000)
         {
                 boost::timer timer;
                 for (size_t n = 0; n < count; ++n)
                 {
                         {
                                 pool_v pool;
- thrash_pool(length, pool);
+ fun(length, pool);
                         }
                         boost::singleton_pool<boost::pool_allocator_tag, sizeof(int)>::release_memory();
                 }
                 result.pool_elapsed = timer.elapsed();
         }
+ else
+ {
+ result.pool_elapsed = -1;
+ }
 
         // test monotonic
         {
@@ -73,52 +97,84 @@
                 {
                         {
                                 mono_v pool;
- thrash_pool(length, pool);
+ fun(length, pool);
                         }
- monotonic::static_storage.reset();
+ boost::monotonic::get_storage().reset();
                 }
                 result.mono_elapsed = timer.elapsed();
         }
 
+
+ // test local monotonic
+ {
+ monotonic::local<monotonic::storage<100000> > storage;
+ boost::timer timer;
+ for (size_t n = 0; n < count; ++n)
+ {
+ {
+ mono_v pool;
+ fun(length, pool);
+ }
+ storage.reset();
+ }
+ result.local_mono_elapsed = timer.elapsed();
+ }
+
         // test std
+ if (0)
         {
                 boost::timer timer;
                 for (size_t n = 0; n < count; ++n)
                 {
                         {
                                 std_v pool;
- thrash_pool(length, pool);
+ fun(length, pool);
                         }
- monotonic::static_storage.reset();
                 }
                 result.std_elapsed = timer.elapsed();
         }
 
- cout << length << ": fast_pool, pool, std, mono: " << result.fast_pool_elapsed << ", " << result.pool_elapsed << ", " << result.std_elapsed << ", " << result.mono_elapsed << endl;
+ cout << length << ": fast_pool, pool, std, mono, local: " << result.fast_pool_elapsed << ", " << result.pool_elapsed << ", " << result.std_elapsed << ", " << result.mono_elapsed << ", " << result.local_mono_elapsed << endl;
         return result;
 }
 
-void compare_memory_pool()
+typedef std::map<size_t, PoolResult> PoolResults;
+
+template <class Fun>
+PoolResults compare_memory_pool(size_t count, size_t max_length, size_t num_iterations, Fun fun)
 {
- const size_t count = 10000;
- const size_t max_length = 10000;
-
- typedef std::map<size_t, PoolResult> Results;
- Results results;
- results[5] = compare_memory_pool(count*10, 5);
- results[20] = compare_memory_pool(count*10, 20);
- results[50] = compare_memory_pool(count*10, 50);
- results[100] = compare_memory_pool(count*10, 100);
+ PoolResults results;
+ //results[5] = compare_memory_pool(count*100, 5, fun);
+ //results[20] = compare_memory_pool(count*100, 20, fun);
+ //results[50] = compare_memory_pool(count*100, 50, fun);
+ //results[100] = compare_memory_pool(count*100, 100, fun);
 
- for (size_t length = 10; length < max_length; length += 1000)
+ for (size_t length = 10; length < max_length; length += max_length/num_iterations)
         {
- results[length] = compare_memory_pool(count, length);
+ results[length] = compare_memory_pool(count, length, fun);
         }
- cout << "count\t" << "fast_pool\t" << "pool\t" << "std\t" << "mono\n" << "fast_pool/mono" << endl;
- BOOST_FOREACH(Results::value_type const &iter, results)
+ return results;
+}
+
+void compare_memory_pool()
+{
+ size_t num_outter_loops = 1000;
+ PoolResults r0 = compare_memory_pool(num_outter_loops, 10000, 10, thrash_pool());
+ cout << "thrash_pool" << endl;
+ cout << "count\t" << "fast_p\t" << "pool\t" << "std\t" << "local\t" << "mono\t" << "fp/mono\t" << "fp/local" << endl;
+ BOOST_FOREACH(PoolResults::value_type const &iter, r0)
+ {
+ PoolResult const &result = iter.second;
+ cout << iter.first << '\t' << result.fast_pool_elapsed << '\t' << result.pool_elapsed << "\t" << result.std_elapsed << '\t' << result.local_mono_elapsed << '\t' << result.mono_elapsed << '\t' << 100.*result.fast_pool_elapsed/result.mono_elapsed << "%\t" << '\t' << 100.*result.fast_pool_elapsed/result.local_mono_elapsed << endl;
+ }
+
+ PoolResults r1 = compare_memory_pool(num_outter_loops, 1000, 10, thrash_pool_sort());
+ cout << "thrash_pool_sort" << endl;
+ cout << "count\t" << "fast_p\t" << "pool\t" << "std\t" << "local\t" << "mono\t" << "fp/mono\t" << "fp/local" << endl;
+ BOOST_FOREACH(PoolResults::value_type const &iter, r1)
         {
                 PoolResult const &result = iter.second;
- cout << iter.first << '\t' << result.fast_pool_elapsed << '\t' << result.pool_elapsed << "\t\t" << result.std_elapsed << '\t' << result.mono_elapsed << '\t' << 100.*result.fast_pool_elapsed/result.mono_elapsed << "%" << endl;
+ cout << iter.first << '\t' << result.fast_pool_elapsed << '\t' << result.pool_elapsed << "\t" << result.std_elapsed << '\t' << result.local_mono_elapsed << '\t' << result.mono_elapsed << '\t' << 100.*result.fast_pool_elapsed/result.mono_elapsed << "%\t" << '\t' << 100.*result.fast_pool_elapsed/result.local_mono_elapsed << endl;
         }
 }
 

Modified: sandbox/monotonic/libs/monotonic/test/main.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/main.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/main.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -9,6 +9,7 @@
 //#include <boost/monotonic/shared_storage.hpp>
 //#include <boost/monotonic/shared_allocator.hpp>
 
+#include <boost/monotonic/local.hpp>
 #include <boost/monotonic/static_storage.hpp>
 
 #include <boost/monotonic/vector.hpp>
@@ -49,37 +50,37 @@
 
 void test_deque()
 {
- monotonic::storage<4000> storage;
+ monotonic::local<> storage;
         {
                 {
- std::list<int, boost::monotonic::allocator<int> > list(storage);
+ std::list<int, boost::monotonic::allocator<int> > list;
                         fill_n(back_inserter(list), 100, 42);
                         cout << "list: " << storage.used() << endl;
                 }
                 storage.reset();
                 {
- std::deque<int, boost::monotonic::allocator<int> > deque(storage);
+ std::deque<int, boost::monotonic::allocator<int> > deque;
                         fill_n(back_inserter(deque), 100, 42);
                         cout << "deque: " << storage.used() << endl;
                 }
                 storage.reset();
 
                 {
- std::vector<int, boost::monotonic::allocator<int> > vector(storage);
+ std::vector<int, boost::monotonic::allocator<int> > vector;
                         fill_n(back_inserter(vector), 100, 42);
                         cout << "vector: " << storage.used() << endl;
                 }
                 storage.reset();
 
                 {
- monotonic::chain<int> chain(storage);
+ monotonic::chain<int> chain;
                         fill_n(back_inserter(chain), 100, 42);
                         cout << "default chain: " << storage.used() << endl;
                 }
                 storage.reset();
 
                 {
- monotonic::chain<int, 100> chain(storage);
+ monotonic::chain<int, 100> chain;
                         fill_n(back_inserter(chain), 100, 42);
                         cout << "chain<100>: " << storage.used() << endl;
                 }
@@ -89,83 +90,41 @@
 
 void test_speed()
 {
+ monotonic::local<monotonic::storage<1000000> > storage;
         typedef monotonic::map<int, monotonic::list<int> > map_with_list;
- monotonic::storage<1000000> storage;
- map_with_list m(storage);
- size_t count = 10000;
- boost::timer timer;
- for (size_t i = 0; i < count; ++i)
         {
- int random = rand() % 100;
- map_with_list::iterator iter = m.find(random);
- if (iter == m.end())
- m.insert(make_pair(random, monotonic::list<int>(storage)));
- else
- iter->second.push_back(i);
- }
- double elapsed = timer.elapsed();
- cout << "monotonic: " << elapsed << endl;
-
- // do the same thing, with std::containers
- {
- typedef std::map<int, std::list<int> > map_with_list;
                 map_with_list m;
+ size_t count = 10000;
                 boost::timer timer;
                 for (size_t i = 0; i < count; ++i)
                 {
                         int random = rand() % 100;
                         map_with_list::iterator iter = m.find(random);
                         if (iter == m.end())
- m[random] = std::list<int>();
- else
- iter->second.push_back(i);
- }
- double elapsed = timer.elapsed();
- cout << "std: " << elapsed << endl;
- }
-}
-
-void test_speed_heap()
-{
- size_t num_iterations = 100000;
-
- typedef monotonic::map<int, monotonic::list<int> > map_with_list;
- monotonic::storage<1000000> *storage = new monotonic::storage<1000000>;
-
- // do the test with monotonic containers and heap-based storage
- {
- map_with_list m(*storage);
- boost::timer timer;
- for (size_t i = 0; i < num_iterations; ++i)
- {
- int random = rand() % 100;
- map_with_list::iterator iter = m.find(random);
- if (iter == m.end())
- m.insert(make_pair(random, monotonic::list<int>(*storage)));
+ m.insert(make_pair(random, monotonic::list<int>()));
                         else
                                 iter->second.push_back(i);
                 }
                 double elapsed = timer.elapsed();
                 cout << "monotonic: " << elapsed << endl;
- }
- delete storage;
 
- // do the same thing, with std::containers
- {
- typedef std::map<int, std::list<int> > map_with_list;
- map_with_list m;
- boost::timer timer;
- for (size_t i = 0; i < num_iterations; ++i)
+ // do the same thing, with std::containers
                 {
- int random = rand() % 100;
- map_with_list::iterator iter = m.find(random);
- if (iter == m.end())
- m[random] = std::list<int>();
- else
- iter->second.push_back(i);
+ typedef std::map<int, std::list<int> > map_with_list;
+ map_with_list m;
+ boost::timer timer;
+ for (size_t i = 0; i < count; ++i)
+ {
+ int random = rand() % 100;
+ map_with_list::iterator iter = m.find(random);
+ if (iter == m.end())
+ m[random] = std::list<int>();
+ else
+ iter->second.push_back(i);
+ }
+ double elapsed = timer.elapsed();
+ cout << "std: " << elapsed << endl;
                 }
- double elapsed = timer.elapsed();
- cout << "std: " << elapsed << endl;
         }
 }
 
@@ -184,8 +143,8 @@
         template<typename C>
         void test_loop_monotonic()
         {
- boost::monotonic::storage<100000> storage;
- std::vector<Foo<C>, monotonic::allocator<Foo<C> > > vec(storage);
+ monotonic::local<> storage;
+ std::vector<Foo<C>, monotonic::allocator<Foo<C> > > vec;
                 Foo<C> orig = { 'A', 65 };
                 vec.assign(ELEM_COUNT, orig);
                 boost::timer timer;
@@ -236,13 +195,13 @@
         typedef boost::array<char, 57> c5;
         typedef boost::array<char, 111> c6;
 
- monotonic::vector<c0> v0(storage);
- monotonic::vector<c1> v1(storage);
- monotonic::vector<c2> v2(storage);
- monotonic::vector<c3> v3(storage);
- monotonic::vector<c4> v4(storage);
- monotonic::vector<c5> v5(storage);
- monotonic::vector<c6> v6(storage);
+ monotonic::vector<c0> v0;
+ monotonic::vector<c1> v1;
+ monotonic::vector<c2> v2;
+ monotonic::vector<c3> v3;
+ monotonic::vector<c4> v4;
+ monotonic::vector<c5> v5;
+ monotonic::vector<c6> v6;
 
         v0.resize(5);
         v1.resize(5);
@@ -295,7 +254,9 @@
 {
         namespace monotonic
         {
- static_storage_base<> static_storage;
+ static_storage_base<> default_static_storage;
+ storage_base *static_storage = &default_static_storage;
+
                 //storage<> static_storage_base<storage<> >::global;
         }
 }
@@ -303,7 +264,7 @@
 void test_static_storage()
 {
         // reset the global static storage to zero use
- monotonic::static_storage.reset();
+ boost::monotonic::get_storage().reset();
 
         typedef std::list<int, monotonic::allocator<int> > List;
         typedef std::map<int, List, std::less<int>, monotonic::allocator<int> > Map;
@@ -316,8 +277,8 @@
                 map[42] = list0;
                 map[123] = list1;
         }
- cout << monotonic::static_storage.used() << endl;
- monotonic::static_storage.reset();
+ cout << monotonic::get_storage().used() << endl;
+ boost::monotonic::get_storage().reset();
 }
 
 void run_all_tests()
@@ -338,7 +299,7 @@
 
 void test_mono_map()
 {
- monotonic::storage<> store;
+ monotonic::local<> store;
 /*
 // commented out till i add the required libraries for boost::mutex :/
 
@@ -358,31 +319,33 @@
         }
 */
 
- {
- typedef std::list<int, monotonic::allocator<int> > List;
- BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<List>::value);
- typedef std::map<int, List, std::less<int>, monotonic::allocator<int> > Map;
- BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<Map>::value);
- Map map(less<int>(), store);
- //map[42].push_back(123);
- map.insert(make_pair(42, List(store)));
- map[42].push_back(123);
- BOOST_ASSERT(map[42].get_allocator().get_storage() == map.get_allocator().get_storage());
- }
+ // this can't work in general:
+ //{
+ // typedef std::list<int, monotonic::allocator<int> > List;
+ // BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<List>::value);
+ // typedef std::map<int, List, std::less<int>, monotonic::allocator<int> > Map;
+ // BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<Map>::value);
+ // Map map(less<int>(), store);
+ // //map[42].push_back(123);
+ // map.insert(make_pair(42, List(store)));
+ // map[42].push_back(123);
+ // BOOST_ASSERT(map[42].get_allocator().get_storage() == map.get_allocator().get_storage());
+ //}
 
+ // but this can:
         {
                 typedef monotonic::list<int> List;
                 BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<List>::value);
                 typedef monotonic::map<int, List > Map;
                 BOOST_STATIC_ASSERT(monotonic::detail::is_monotonic<Map>::value);
- Map map(store);
+ Map map;
                 map[42].push_back(123);
                 BOOST_ASSERT(map[42].get_allocator().get_storage() == map.get_allocator().get_storage());
         }
 
         {
                 typedef monotonic::map<int, monotonic::map<int, monotonic::list<int> > > Map;
- Map map(store);
+ Map map;
                 map[42][64].push_back(13);
                 BOOST_ASSERT(map[42][64].get_allocator().get_storage() == map.get_allocator().get_storage());
         }
@@ -399,6 +362,7 @@
 }
 #endif
 
+
 int main()
 {
 #ifdef WIN32
@@ -406,10 +370,10 @@
 #endif
 
         //test_chained_storage();
- compare_memory_pool();
+ test_map_list_heap_stack();
+ //compare_memory_pool();
         //test_mono_map();
         //test_mono_map();
- //test_map_list_heap_stack();
         //test_static_storage();
         //run_all_tests();
 }

Modified: sandbox/monotonic/libs/monotonic/test/monotonic.vcproj
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/monotonic.vcproj (original)
+++ sandbox/monotonic/libs/monotonic/test/monotonic.vcproj 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -123,7 +123,7 @@
                                 EnableFunctionLevelLinking="true"
                                 UsePrecompiledHeader="0"
                                 WarningLevel="3"
- DebugInformationFormat="0"
+ DebugInformationFormat="3"
                         />
                         <Tool
                                 Name="VCManagedResourceCompilerTool"
@@ -216,6 +216,10 @@
>
                                 </File>
                                 <File
+ RelativePath="..\..\..\boost\monotonic\local.hpp"
+ >
+ </File>
+ <File
                                         RelativePath="..\..\..\boost\monotonic\map.hpp"
>
                                 </File>
@@ -352,6 +356,22 @@
                 <File
                         RelativePath=".\rope.cpp"
>
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
                 </File>
                 <File
                         RelativePath=".\test_bubble_sort.cpp"

Modified: sandbox/monotonic/libs/monotonic/test/rope.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/rope.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/rope.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -47,9 +47,9 @@
 void test_chain()
 {
         {
- monotonic::storage<> storage;
+ monotonic::local<> storage;
                 {
- monotonic::chain<int, 100> rope(storage);
+ monotonic::chain<int, 100> rope;
                         for (int n = 0; n < 200; ++n)
                         {
                                 rope.push_back(n);
@@ -58,13 +58,13 @@
         }
 
 
- monotonic::storage<> storage;
+ monotonic::local<> storage;
         {
                 typedef monotonic::chain<Foo, 2> Rope2;
- Rope2 foo(4, storage);
+ Rope2 foo(4);
 
                 typedef monotonic::chain<int, 2> Rope;
- Rope rope(storage);
+ Rope rope;
                 rope.push_back(0);
                 rope.push_back(1);
                 rope.push_back(2);

Modified: sandbox/monotonic/libs/monotonic/test/test_bubble_sort.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/test_bubble_sort.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/test_bubble_sort.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -25,12 +25,12 @@
 
 pair<double,double> test_bubble_sort(size_t count = 50*1000, size_t length = 20)
 {
- monotonic::storage<> storage;
+ monotonic::local<> storage;
         boost::timer mono_timer;
         for (size_t n = 0; n < count; ++n)
         {
                 {
- std::list<int, monotonic::allocator<int> > list(storage);
+ std::list<int, monotonic::allocator<int> > list;
                         test_bubble_sort_impl(length, list);
                 }
                 storage.reset();

Modified: sandbox/monotonic/libs/monotonic/test/test_chained_storage.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/test_chained_storage.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/test_chained_storage.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -3,10 +3,10 @@
 
 void test_chained_storage()
 {
- monotonic::storage<0, 16> store;
+ monotonic::local<monotonic::storage<0, 16> > store;
         {
                 typedef std::vector<char, monotonic::allocator<char> > Vector;
- Vector vec(store);
+ Vector vec;
                 vec.resize(5); // still on the stack
                 vec.resize(32); // now on the heap
                 vec.resize(500); // now on the heap

Modified: sandbox/monotonic/libs/monotonic/test/test_dupe.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/test_dupe.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/test_dupe.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -14,12 +14,12 @@
 
 pair<double,double> test_dupe(size_t num_tests, size_t count, size_t size)
 {
- monotonic::storage<1000000> storage;
+ monotonic::local<> storage;
 
         boost::timer mono_timer;
         for (size_t n = 0; n < num_tests; ++n)
         {
- std::list<int, monotonic::allocator<int> > list(storage);
+ std::list<int, monotonic::allocator<int> > list;
                 test_dupe_impl(count, size, list);
                 storage.reset();
         }

Modified: sandbox/monotonic/libs/monotonic/test/test_map_list.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/test_map_list.cpp (original)
+++ sandbox/monotonic/libs/monotonic/test/test_map_list.cpp 2009-06-18 02:50:46 EDT (Thu, 18 Jun 2009)
@@ -40,7 +40,7 @@
                 for (size_t n = 0; n < outter_loops; ++n)
                 {
                         {
- MonoMap map(std::less<int>(), storage);
+ MonoMap map;
                                 test_map_list_impl(inner_loops, map);
                         }
                         storage.reset();
@@ -64,15 +64,17 @@
         // use static monotonic allocator
         {
                 boost::timer timer;
- monotonic::static_storage.reset();
+ boost::monotonic::storage_base *current = &monotonic::get_storage();
+ boost::monotonic::default_storage();
                 for (size_t n = 0; n < outter_loops; ++n)
                 {
                         {
                                 MonoMap map;
                                 test_map_list_impl(inner_loops, map);
                         }
- monotonic::static_storage.reset();
+ boost::monotonic::reset_storage();
                 }
+ boost::monotonic::set_storage(*current);
                 result.static_monotonic = timer.elapsed();
         }
 
@@ -89,7 +91,7 @@
         typedef std::map<size_t, Result > Results;
         Results results;
 
- monotonic::storage<> storage;
+ monotonic::local<> storage;
         for (size_t inner = 100; inner < inner_loops; inner += 1000)
         {
                 results[inner] = test_map_list(outter_loops, inner, storage);


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