Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2014-2014 Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/intrusive for documentation. Chris@102: // Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP Chris@102: #define BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace intrusive { Chris@102: namespace detail { Chris@102: Chris@102: //This is not standard, but should work with all compilers Chris@102: union max_align Chris@102: { Chris@102: char char_; Chris@102: short short_; Chris@102: int int_; Chris@102: long long_; Chris@102: #ifdef BOOST_HAS_LONG_LONG Chris@102: ::boost::long_long_type long_long_; Chris@102: #endif Chris@102: float float_; Chris@102: double double_; Chris@102: long double long_double_; Chris@102: void * void_ptr_; Chris@102: }; Chris@102: Chris@102: template Chris@102: class array_initializer Chris@102: { Chris@102: public: Chris@102: template Chris@102: array_initializer(const CommonInitializer &init) Chris@102: { Chris@102: char *init_buf = (char*)rawbuf; Chris@102: std::size_t i = 0; Chris@102: BOOST_TRY{ Chris@102: for(; i != N; ++i){ Chris@102: new(init_buf)T(init); Chris@102: init_buf += sizeof(T); Chris@102: } Chris@102: } Chris@102: BOOST_CATCH(...){ Chris@102: while(i--){ Chris@102: init_buf -= sizeof(T); Chris@102: ((T*)init_buf)->~T(); Chris@102: } Chris@102: BOOST_RETHROW; Chris@102: } Chris@102: BOOST_CATCH_END Chris@102: } Chris@102: Chris@102: operator T* () Chris@102: { return (T*)(rawbuf); } Chris@102: Chris@102: operator const T*() const Chris@102: { return (const T*)(rawbuf); } Chris@102: Chris@102: ~array_initializer() Chris@102: { Chris@102: char *init_buf = (char*)rawbuf + N*sizeof(T); Chris@102: for(std::size_t i = 0; i != N; ++i){ Chris@102: init_buf -= sizeof(T); Chris@102: ((T*)init_buf)->~T(); Chris@102: } Chris@102: } Chris@102: Chris@102: private: Chris@102: detail::max_align rawbuf[(N*sizeof(T)-1)/sizeof(detail::max_align)+1]; Chris@102: }; Chris@102: Chris@102: } //namespace detail{ Chris@102: } //namespace intrusive{ Chris@102: } //namespace boost{ Chris@102: Chris@102: #endif //BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP