You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
72 lines
2.0 KiB
72 lines
2.0 KiB
#ifndef BOOST_STATECHART_DETAIL_MEMORY_HPP_INCLUDED |
|
#define BOOST_STATECHART_DETAIL_MEMORY_HPP_INCLUDED |
|
////////////////////////////////////////////////////////////////////////////// |
|
// Copyright 2005-2006 Andreas Huber Doenni |
|
// Distributed under the Boost Software License, Version 1.0. (See accompany- |
|
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
#include <boost/statechart/detail/avoid_unused_warning.hpp> |
|
|
|
#include <boost/assert.hpp> |
|
#include <boost/detail/allocator_utilities.hpp> |
|
|
|
#include <cstddef> // std::size_t |
|
|
|
|
|
|
|
namespace boost |
|
{ |
|
namespace statechart |
|
{ |
|
namespace detail |
|
{ |
|
|
|
|
|
|
|
template< class MostDerived, class Allocator > |
|
void * allocate( std::size_t size ) |
|
{ |
|
avoid_unused_warning( size ); |
|
// The assert below fails when memory is allocated for an event<>, |
|
// simple_state<> or state<> subtype object, *and* the first template |
|
// parameter passed to one of these templates is not equal to the most- |
|
// derived object being constructed. |
|
// The following examples apply to all these subtypes: |
|
// // Example 1 |
|
// struct A {}; |
|
// struct B : sc::simple_state< A, /* ... */ > |
|
// // Above, the first template parameter must be equal to the most- |
|
// // derived type |
|
// |
|
// // Example 2 |
|
// struct A : sc::event< A > |
|
// struct B : A { /* ... */ }; |
|
// void f() { delete new B(); } |
|
// // Above the most-derived type being constructed is B, but A was passed |
|
// // as the most-derived type to event<>. |
|
BOOST_ASSERT( size == sizeof( MostDerived ) ); |
|
return typename boost::detail::allocator::rebind_to< |
|
Allocator, MostDerived |
|
>::type().allocate( 1, static_cast< MostDerived * >( 0 ) ); |
|
} |
|
|
|
template< class MostDerived, class Allocator > |
|
void deallocate( void * pObject ) |
|
{ |
|
return typename boost::detail::allocator::rebind_to< |
|
Allocator, MostDerived |
|
>::type().deallocate( static_cast< MostDerived * >( pObject ), 1 ); |
|
} |
|
|
|
|
|
|
|
} // namespace detail |
|
} // namespace statechart |
|
} // namespace boost |
|
|
|
|
|
|
|
#endif
|
|
|