$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53857 - in sandbox/monotonic: boost/monotonic libs/monotonic/doc libs/monotonic/test
From: christian.schladetsch_at_[hidden]
Date: 2009-06-13 02:36:10
Author: cschladetsch
Date: 2009-06-13 02:36:09 EDT (Sat, 13 Jun 2009)
New Revision: 53857
URL: http://svn.boost.org/trac/boost/changeset/53857
Log:
added failed attempt to use boost::auto_buffer for inline_storage
Text files modified: 
   sandbox/monotonic/boost/monotonic/inline_storage.h |    24 +++++++++++++++++++-----                
   sandbox/monotonic/libs/monotonic/doc/index.html    |     3 ++-                                     
   sandbox/monotonic/libs/monotonic/test/main.cpp     |    27 +++++++++++++++++++++++++++             
   3 files changed, 48 insertions(+), 6 deletions(-)
Modified: sandbox/monotonic/boost/monotonic/inline_storage.h
==============================================================================
--- sandbox/monotonic/boost/monotonic/inline_storage.h	(original)
+++ sandbox/monotonic/boost/monotonic/inline_storage.h	2009-06-13 02:36:09 EDT (Sat, 13 Jun 2009)
@@ -8,6 +8,15 @@
 #include <cassert>
 #include <boost/array.hpp>
 
+// define this to use boost::auto_buffer<> rather than boost::array for monotonic::inline_storage
+//#define BOOST_MONOTONIC_USE_AUTOBUFFER
+// this currently does not work, because resizing the underlying buffer breaks
+// containers that may reference the previously used memory
+
+#ifdef BOOST_MONOTONIC_USE_AUTOBUFFER
+#	include <boost/auto_buffer.hpp>
+#endif
+
 namespace boost
 {
         namespace monotonic
@@ -16,12 +25,15 @@
                 template <size_t N>
                 struct inline_storage : storage_base
                 {
-			// how to determine alignment requirements?
-			BOOST_STATIC_CONSTANT(size_t, Alignment = 16);
+#ifdef BOOST_MONOTONIC_USE_AUTOBUFFER
+			typedef boost::auto_buffer<char, boost::store_n_bytes<N> > buffer_type;
+#else
+			typedef boost::array<char, N> buffer_type;
+#endif
 
                 private:
-			boost::array<char, N> buffer;	///< the storage
-			size_t cursor;					///< pointer to current index within storage for next allocation
+			buffer_type buffer;			///< the storage
+			size_t cursor;				///< pointer to current index within storage for next allocation
 
                 public:
                         inline_storage() : cursor(0)
@@ -47,9 +59,11 @@
                         void *allocate(size_t num_bytes, void const * = 0)
                         {
                                 // ensure we return a point on an aligned boundary
-				//size_t extra = num_bytes % Alignment;
                                 size_t extra = num_bytes & 15;
                                 size_t required = num_bytes + extra;
+#ifdef BOOST_MONOTONIC_USE_AUTOBUFFER
+				buffer.uninitialized_resize(buffer.size() + required);
+#endif
                                 char *ptr = &buffer[cursor];
                                 cursor += required;
                                 return ptr + extra;
Modified: sandbox/monotonic/libs/monotonic/doc/index.html
==============================================================================
--- sandbox/monotonic/libs/monotonic/doc/index.html	(original)
+++ sandbox/monotonic/libs/monotonic/doc/index.html	2009-06-13 02:36:09 EDT (Sat, 13 Jun 2009)
@@ -315,7 +315,8 @@
                     References</h2>
                 <ul class="simple">
                     <li>Boost.AlignedMemory</li>
-                    <li>Boost.AutoBuffer (Proposed)</li>
+                    <li>Boost.AutoBuffer. A related service. Attempts to integrate this with STL has so 
+                        far been unsuccessful. See libs/monotonic/test/main.cpp#test_auto_buffer</li>
                     <li>Boost.IntrusiveContainer, for an alternative means of creating efficient 
                         containers.</li>
                 </ul>
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-13 02:36:09 EDT (Sat, 13 Jun 2009)
@@ -5,6 +5,7 @@
 #include <boost/monotonic/list.h>
 #include <boost/monotonic/map.h>
 #include <boost/monotonic/set.h>
+#include <boost/auto_buffer.hpp>
 
 #include <boost/timer.hpp>
 #include <boost/foreach.hpp>
@@ -13,6 +14,31 @@
 using namespace std;
 using namespace boost;
 
+// #define BOOST_MONOTONIC_USE_AUTOBUFFER before including <boost/monotonic/inline_storage.h> to
+// try this at home.
+void test_auto_buffer()
+{
+	monotonic::inline_storage<10> storage;
+
+	// this fails because the storage that the vector uses
+	// will be moved when the buffer resizes...
+	//monotonic::vector<int> vec(storage);
+	//for (size_t n = 0; n < 100; ++n)
+	//{
+	//	vec.push_back(n);
+	//}
+
+	// this fails because at the end of the buffer, just before
+	// it may be resized and possibly put onto heap, the following asserts
+	// on MSVC in <xtree>:
+	//		if (max_size() - 1 <= _Mysize)
+	//			_THROW(length_error, "map/set<T> too long");
+	//
+	//monotonic::map<int, int> map(storage);
+	//for (int n = 0; n < 100; ++n)
+	//	map[n] = n;
+}
+
 void test_basic()
 {
         monotonic::inline_storage<1000*sizeof(int)> storage1;   // create local storage on the stack
@@ -359,6 +385,7 @@
 
 int main()
 {
+	test_auto_buffer();
         test_alignment();
         test_speed();
         test_speed_heap();