// Copyright Oliver Kowalke 2009. // 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_CONTEXT_SIMPLE_STACK_ALLOCATOR_H #define BOOST_CONTEXT_SIMPLE_STACK_ALLOCATOR_H #include <cstddef> #include <cstdlib> #include <stdexcept> #include <boost/assert.hpp> #include <boost/config.hpp> #include <boost/context/detail/config.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace context { template< std::size_t Max, std::size_t Default, std::size_t Min > class simple_stack_allocator { public: static std::size_t maximum_stacksize() { return Max; } static std::size_t default_stacksize() { return Default; } static std::size_t minimum_stacksize() { return Min; } void * allocate( std::size_t size) const { BOOST_ASSERT( minimum_stacksize() <= size); BOOST_ASSERT( maximum_stacksize() >= size); void * limit = std::malloc( size); if ( ! limit) throw std::bad_alloc(); return static_cast< char * >( limit) + size; } void deallocate( void * vp, std::size_t size) const { BOOST_ASSERT( vp); BOOST_ASSERT( minimum_stacksize() <= size); BOOST_ASSERT( maximum_stacksize() >= size); void * limit = static_cast< char * >( vp) - size; std::free( limit); } }; }} #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #endif // BOOST_CONTEXT_SIMPLE_STACK_ALLOCATOR_H