$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r54723 - in sandbox/monotonic: boost/monotonic libs/monotonic/test libs/monotonic/test/Tests
From: christian.schladetsch_at_[hidden]
Date: 2009-07-06 15:51:25
Author: cschladetsch
Date: 2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
New Revision: 54723
URL: http://svn.boost.org/trac/boost/changeset/54723
Log:
added monotonic::stack<>
Added:
   sandbox/monotonic/boost/monotonic/stack.hpp   (contents, props changed)
Text files modified: 
   sandbox/monotonic/boost/monotonic/fixed_storage.hpp      |    68 +++++++++++++++++++++++++++++++++++     
   sandbox/monotonic/boost/monotonic/storage.hpp            |    37 ++++++++++++++-----                     
   sandbox/monotonic/libs/monotonic/test/Tests/Tests.vcproj |    76 ++++++++++++++++++++++++++++++++++++++++
   sandbox/monotonic/libs/monotonic/test/Tests/tests.cpp    |    34 ++++++++++++++++-                       
   sandbox/monotonic/libs/monotonic/test/monotonic.sln      |     6 +--                                     
   sandbox/monotonic/libs/monotonic/test/monotonic.vcproj   |     4 ++                                      
   6 files changed, 209 insertions(+), 16 deletions(-)
Modified: sandbox/monotonic/boost/monotonic/fixed_storage.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/fixed_storage.hpp	(original)
+++ sandbox/monotonic/boost/monotonic/fixed_storage.hpp	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -142,6 +142,74 @@
                                 return num_allocations;
                         }
 #endif
+			//-----------------------------------------------------------------
+
+
+			template <class Ty>
+			Ty *uninitialised_create()
+			{
+				return reinterpret_cast<Ty *>(allocate_bytes<sizeof(Ty)>());
+			}
+
+			template <class Ty>
+			void construct(Ty *ptr, const boost::true_type& /*is_pod*/)
+			{
+				// do nothing
+			}
+
+			template <class Ty>
+			void construct(Ty *ptr, const boost::false_type&)
+			{
+				new (ptr) Ty();
+			}
+
+			template <class Ty>
+			Ty &create()
+			{
+				Ty *ptr = uninitialised_create<Ty>();
+				construct(ptr, boost::is_pod<Ty>());
+				return *ptr;
+			}
+
+			template <class Ty, class A0>
+			Ty &create(A0 a0)
+			{
+				Ty *ptr = uninitialised_create<Ty>();
+				new (ptr) Ty(a0);
+				return *ptr;
+			}
+
+			template <class Ty, class A0, class A1>
+			Ty &create(A0 a0, A1 a1)
+			{
+				Ty *ptr = uninitialised_create<Ty>();
+				new (ptr) Ty(a0, a1);
+				return *ptr;
+			}
+
+			template <class Ty>
+			void destroy(Ty &object)
+			{
+				object.~Ty();
+			}
+
+			template <class Ty>
+			void destroy(Ty const &object)
+			{
+				destroy(const_cast<Ty &>(object));
+			}
+
+			template <size_t N>
+			char *allocate_bytes()
+			{
+				return allocate_bytes(N, boost::aligned_storage<N>::alignment);
+			}
+
+			char *allocate_bytes(size_t num_bytes, size_t alignment = 1)
+			{
+				return reinterpret_cast<char *>(allocate(num_bytes, alignment));
+			}
+
                 };
         
         } // namespace monotonic
Added: sandbox/monotonic/boost/monotonic/stack.hpp
==============================================================================
--- (empty file)
+++ sandbox/monotonic/boost/monotonic/stack.hpp	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -0,0 +1,104 @@
+// 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_STACK_HPP
+#define BOOST_MONOTONIC_STACK_HPP
+
+#include <boost/monotonic/detail/prefix.hpp>
+#include <boost/monotonic/storage.hpp>
+#include <boost/monotonic/containers/vector.hpp>
+
+// warning C4345: behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
+#pragma warning(disable:4345)
+
+namespace boost
+{
+	namespace monotonic
+	{
+		template <size_t InlineSize = DefaultSizes::InlineSize>
+		struct stack
+		{
+			typedef stack<InlineSize> this_type;
+
+		private:
+			fixed_storage<InlineSize> store;
+
+			struct element_base
+			{
+				element_base *previous;
+				size_t cursor;
+				virtual ~element_base() { }
+			};
+			template <class T>
+			struct element : element_base
+			{
+				typedef T type;
+
+				type *val;
+				char value[sizeof(T)];
+				element()
+				{
+					val = reinterpret_cast<T *>(value);
+				}
+				~element()
+				{
+					val->~T();
+				}
+			};
+
+			element_base *previous;
+
+		public:
+			stack() : previous(0)
+			{
+			}
+
+			template <class T>
+			T &push()
+			{
+				size_t cursor = store.get_cursor();
+				element<T> &elem = store.create<element<T> >();
+				elem.previous = previous;
+				elem.cursor = cursor;
+				previous = &elem;
+				new (elem.val) T();
+				return *elem.val;
+			}
+
+			template <class T, class A0>
+			T &push(A0 a0)
+			{
+				size_t cursor = store.get_cursor();
+				element<T> &elem = store.create<element<T> >();
+				elem.previous = previous;
+				elem.cursor = cursor;
+				previous = &elem;
+				new (elem.val) T(a0);
+				return *elem.val;
+			}
+			void pop()
+			{
+				BOOST_ASSERT(previous);
+				element_base *elem = previous;
+				previous = elem->previous;
+				size_t cursor = elem->cursor;
+				elem->~element_base();
+				store.set_cursor(cursor);
+			}
+
+			size_t top() const
+			{
+				return store.get_cursor();
+			}
+		};
+	}
+}
+
+#include <boost/monotonic/detail/postfix.hpp>
+
+#endif // BOOST_MONOTONIC_STACK_HPP
+
+//EOF
+
Modified: sandbox/monotonic/boost/monotonic/storage.hpp
==============================================================================
--- sandbox/monotonic/boost/monotonic/storage.hpp	(original)
+++ sandbox/monotonic/boost/monotonic/storage.hpp	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -186,14 +186,6 @@
                         }
 
                         template <class Ty>
-			Ty &create()
-			{
-				Ty *ptr = uninitialised_create<Ty>();
-				construct(ptr, boost::is_pod<Ty>());
-				return *ptr;
-			}
-
-			template <class Ty>
                         void construct(Ty *ptr, const boost::true_type& /*is_pod*/)
                         {
                                 // do nothing
@@ -206,10 +198,26 @@
                         }
 
                         template <class Ty>
-			Ty &create(Ty const &X)
+			Ty &create()
                         {
                                 Ty *ptr = uninitialised_create<Ty>();
-				new (ptr) Ty(X);
+				construct(ptr, boost::is_pod<Ty>());
+				return *ptr;
+			}
+
+			template <class Ty, class A0>
+			Ty &create(A0 a0)
+			{
+				Ty *ptr = uninitialised_create<Ty>();
+				new (ptr) Ty(a0);
+				return *ptr;
+			}
+
+			template <class Ty, class A0, class A1>
+			Ty &create(A0 a0, A1 a1)
+			{
+				Ty *ptr = uninitialised_create<Ty>();
+				new (ptr) Ty(a0, a1);
                                 return *ptr;
                         }
 
@@ -236,6 +244,15 @@
                                 return reinterpret_cast<char *>(allocate(num_bytes, alignment));
                         }
 
+			size_t get_cursor() const
+			{
+				return fixed.get_cursor();
+			}
+			void set_cursor(size_t n)
+			{
+				fixed.set_cursor(n);
+			}
+
                 private:
                         void AddLink(size_t size)
                         {
Modified: sandbox/monotonic/libs/monotonic/test/Tests/Tests.vcproj
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/Tests/Tests.vcproj	(original)
+++ sandbox/monotonic/libs/monotonic/test/Tests/Tests.vcproj	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -174,6 +174,82 @@
                                 Name="VCPostBuildEventTool"
                         />
                 </Configuration>
+		<Configuration
+			Name="ReleaseSym|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			CharacterSet="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="3"
+				AdditionalIncludeDirectories="$(ProjectDir)/../../../..;C:\Lib\tbb21_20080605oss\include;c:/source/boost/sandbox/cloneable;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				LinkIncremental="2"
+				AdditionalLibraryDirectories="C:\Program Files\boost\boost_1_38\lib"
+				GenerateDebugInformation="true"
+				SubSystem="1"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+				Description="Running tests"
+				CommandLine="$(OutDir)\$(ProjectName).exe"
+				ExcludedFromBuild="true"
+			/>
+		</Configuration>
         </Configurations>
         <References>
         </References>
Modified: sandbox/monotonic/libs/monotonic/test/Tests/tests.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/Tests/tests.cpp	(original)
+++ sandbox/monotonic/libs/monotonic/test/Tests/tests.cpp	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -20,6 +20,7 @@
 #include <boost/monotonic/allocator.hpp>
 #include <boost/interprocess/containers/list.hpp>
 #include <boost/monotonic/reclaimable_storage.hpp>
+#include <boost/monotonic/stack.hpp>
 #include <boost/iterator.hpp>
 
 #define BOOST_TEST_MODULE basic_test test
@@ -61,27 +62,56 @@
 struct Tracked
 {
         static int count;
-	Tracked(Tracked const &) 
+	Tracked() 
         { 
                 ++count; 
+		std::cout << "T::T(): " << count << endl;
         }
-	Tracked() 
+	Tracked(Tracked const &) 
         { 
                 ++count; 
+		std::cout << "T::T(T const &): " << count << endl;
         }
         Tracked &operator=(Tracked const &)
         {
                 ++count; 
+		std::cout << "T &operator=(T const &): " << count << endl;
                 return *this;
         }
         ~Tracked()
         {
                 --count;
+		std::cout << "T::~T(): " << count << endl;
         }
 };
 
 int Tracked::count = 0;
 
+BOOST_AUTO_TEST_CASE(test_stack)
+{
+	monotonic::stack<> stack;
+	{
+		size_t top = stack.top();
+		int &n = stack.push<int>();
+		stack.pop();
+		size_t top2 = stack.top();
+		BOOST_ASSERT(top2 == top);
+
+		int &n2 = stack.push<int>();
+		int &n3 = stack.push<int>();
+		Tracked &tracked = stack.push<Tracked>();
+		boost::array<int, 42> &a = stack.push<boost::array<int, 42> >();
+		size_t peak = stack.top();
+		stack.pop();
+		stack.pop();
+		stack.pop();
+		stack.pop();
+		top2 = stack.top();
+		BOOST_ASSERT(top2 == top);
+		BOOST_ASSERT(Tracked::count == 0);
+	}
+}
+
 template <class Number>
 Number work(size_t iterations, std::vector<Number> const &data)
 {
Modified: sandbox/monotonic/libs/monotonic/test/monotonic.sln
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/monotonic.sln	(original)
+++ sandbox/monotonic/libs/monotonic/test/monotonic.sln	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -21,18 +21,16 @@
                 {5688980A-015B-4C7D-8D8D-F5894205FACE}.Release|Win32.ActiveCfg = Release|Win32
                 {5688980A-015B-4C7D-8D8D-F5894205FACE}.Release|Win32.Build.0 = Release|Win32
                 {5688980A-015B-4C7D-8D8D-F5894205FACE}.ReleaseSym|Win32.ActiveCfg = ReleaseSym|Win32
-		{5688980A-015B-4C7D-8D8D-F5894205FACE}.ReleaseSym|Win32.Build.0 = ReleaseSym|Win32
                 {D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.Debug|Win32.ActiveCfg = Debug|Win32
                 {D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.Debug|Win32.Build.0 = Debug|Win32
                 {D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.Release|Win32.ActiveCfg = Release|Win32
-		{D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.ReleaseSym|Win32.ActiveCfg = Release|Win32
-		{D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.ReleaseSym|Win32.Build.0 = Release|Win32
+		{D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.ReleaseSym|Win32.ActiveCfg = ReleaseSym|Win32
+		{D4779B0F-266B-46D3-8BCF-0E14EF8B817B}.ReleaseSym|Win32.Build.0 = ReleaseSym|Win32
                 {E557E90C-C695-4A7B-B5A6-2F133AF88563}.Debug|Win32.ActiveCfg = Debug|Win32
                 {E557E90C-C695-4A7B-B5A6-2F133AF88563}.Debug|Win32.Build.0 = Debug|Win32
                 {E557E90C-C695-4A7B-B5A6-2F133AF88563}.Release|Win32.ActiveCfg = Release|Win32
                 {E557E90C-C695-4A7B-B5A6-2F133AF88563}.Release|Win32.Build.0 = Release|Win32
                 {E557E90C-C695-4A7B-B5A6-2F133AF88563}.ReleaseSym|Win32.ActiveCfg = ReleaseSym|Win32
-		{E557E90C-C695-4A7B-B5A6-2F133AF88563}.ReleaseSym|Win32.Build.0 = ReleaseSym|Win32
                 {5FF650E3-53E2-447F-8D2D-A85B76B214D3}.Debug|Win32.ActiveCfg = Debug|Win32
                 {5FF650E3-53E2-447F-8D2D-A85B76B214D3}.Debug|Win32.Build.0 = Debug|Win32
                 {5FF650E3-53E2-447F-8D2D-A85B76B214D3}.Release|Win32.ActiveCfg = Release|Win32
Modified: sandbox/monotonic/libs/monotonic/test/monotonic.vcproj
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/monotonic.vcproj	(original)
+++ sandbox/monotonic/libs/monotonic/test/monotonic.vcproj	2009-07-06 15:51:24 EDT (Mon, 06 Jul 2009)
@@ -307,6 +307,10 @@
 					>
                                 </File>
                                 <File
+					RelativePath="..\..\..\boost\monotonic\stack.hpp"
+					>
+				</File>
+				<File
                                         RelativePath="..\..\..\boost\monotonic\static_storage.hpp"
 					>
                                 </File>