Chris@16: //----------------------------------------------------------------------------- Chris@16: // boost aligned_storage.hpp header file Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: //----------------------------------------------------------------------------- Chris@16: // Chris@16: // Copyright (c) 2002-2003 Chris@16: // Eric Friedman, Itay Maman Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_ALIGNED_STORAGE_HPP Chris@16: #define BOOST_ALIGNED_STORAGE_HPP Chris@16: Chris@16: #include // for std::size_t Chris@16: Chris@16: #include "boost/config.hpp" Chris@16: #include "boost/detail/workaround.hpp" Chris@16: #include "boost/type_traits/alignment_of.hpp" Chris@16: #include "boost/type_traits/type_with_alignment.hpp" Chris@16: #include "boost/type_traits/is_pod.hpp" Chris@16: Chris@16: #include "boost/mpl/eval_if.hpp" Chris@16: #include "boost/mpl/identity.hpp" Chris@16: Chris@16: #include "boost/type_traits/detail/bool_trait_def.hpp" Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace detail { namespace aligned_storage { Chris@16: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: std::size_t Chris@16: , alignment_of_max_align = ::boost::alignment_of::value Chris@16: ); Chris@16: Chris@16: // Chris@16: // To be TR1 conforming this must be a POD type: Chris@16: // Chris@16: template < Chris@16: std::size_t size_ Chris@16: , std::size_t alignment_ Chris@16: > Chris@16: struct aligned_storage_imp Chris@16: { Chris@16: union data_t Chris@16: { Chris@16: char buf[size_]; Chris@16: Chris@101: typename ::boost::mpl::eval_if_c< Chris@16: alignment_ == std::size_t(-1) Chris@101: , ::boost::mpl::identity< ::boost::detail::max_align > Chris@101: , ::boost::type_with_alignment Chris@16: >::type align_; Chris@16: } data_; Chris@16: void* address() const { return const_cast(this); } Chris@16: }; Chris@16: Chris@16: template< std::size_t alignment_ > Chris@16: struct aligned_storage_imp<0u,alignment_> Chris@16: { Chris@16: /* intentionally empty */ Chris@16: void* address() const { return 0; } Chris@16: }; Chris@16: Chris@16: }} // namespace detail::aligned_storage Chris@16: Chris@16: template < Chris@16: std::size_t size_ Chris@16: , std::size_t alignment_ = std::size_t(-1) Chris@16: > Chris@16: class aligned_storage : Chris@16: #ifndef __BORLANDC__ Chris@16: private Chris@16: #else Chris@16: public Chris@16: #endif Chris@101: ::boost::detail::aligned_storage::aligned_storage_imp Chris@16: { Chris@16: Chris@16: public: // constants Chris@16: Chris@101: typedef ::boost::detail::aligned_storage::aligned_storage_imp type; Chris@16: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: std::size_t Chris@16: , size = size_ Chris@16: ); Chris@16: BOOST_STATIC_CONSTANT( Chris@16: std::size_t Chris@16: , alignment = ( Chris@16: alignment_ == std::size_t(-1) Chris@16: ? ::boost::detail::aligned_storage::alignment_of_max_align Chris@16: : alignment_ Chris@16: ) Chris@16: ); Chris@16: Chris@16: private: // noncopyable Chris@16: Chris@16: aligned_storage(const aligned_storage&); Chris@16: aligned_storage& operator=(const aligned_storage&); Chris@16: Chris@16: public: // structors Chris@16: Chris@16: aligned_storage() Chris@16: { Chris@16: } Chris@16: Chris@16: ~aligned_storage() Chris@16: { Chris@16: } Chris@16: Chris@16: public: // accessors Chris@16: Chris@16: void* address() Chris@16: { Chris@16: return static_cast(this)->address(); Chris@16: } Chris@16: Chris@16: const void* address() const Chris@16: { Chris@16: return static_cast(this)->address(); Chris@16: } Chris@16: }; Chris@16: Chris@16: // Chris@16: // Make sure that is_pod recognises aligned_storage<>::type Chris@16: // as a POD (Note that aligned_storage<> itself is not a POD): Chris@16: // Chris@16: template Chris@101: struct is_pod< ::boost::detail::aligned_storage::aligned_storage_imp > Chris@16: BOOST_TT_AUX_BOOL_C_BASE(true) Chris@16: { Chris@16: BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(true) Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #include "boost/type_traits/detail/bool_trait_undef.hpp" Chris@16: Chris@16: #endif // BOOST_ALIGNED_STORAGE_HPP