96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // (C) Copyright Ion Gaztanaga  2014-2014
 | |
| //
 | |
| // 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)
 | |
| //
 | |
| // See http://www.boost.org/libs/intrusive for documentation.
 | |
| //
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
 | |
| #define BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
 | |
| 
 | |
| #ifndef BOOST_CONFIG_HPP
 | |
| #  include <boost/config.hpp>
 | |
| #endif
 | |
| 
 | |
| #if defined(BOOST_HAS_PRAGMA_ONCE)
 | |
| #  pragma once
 | |
| #endif
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/core/no_exceptions_support.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace intrusive {
 | |
| namespace detail {
 | |
| 
 | |
| //This is not standard, but should work with all compilers
 | |
| union max_align
 | |
| {
 | |
|    char        char_;
 | |
|    short       short_;
 | |
|    int         int_;
 | |
|    long        long_;
 | |
|    #ifdef BOOST_HAS_LONG_LONG
 | |
|    ::boost::long_long_type  long_long_;
 | |
|    #endif
 | |
|    float       float_;
 | |
|    double      double_;
 | |
|    long double long_double_;
 | |
|    void *      void_ptr_;
 | |
| };
 | |
| 
 | |
| template<class T, std::size_t N>
 | |
| class array_initializer
 | |
| {
 | |
|    public:
 | |
|    template<class CommonInitializer>
 | |
|    array_initializer(const CommonInitializer &init)
 | |
|    {
 | |
|       char *init_buf = (char*)rawbuf;
 | |
|       std::size_t i = 0;
 | |
|       BOOST_TRY{
 | |
|          for(; i != N; ++i){
 | |
|             new(init_buf)T(init);
 | |
|             init_buf += sizeof(T);
 | |
|          }
 | |
|       }
 | |
|       BOOST_CATCH(...){
 | |
|          while(i--){
 | |
|             init_buf -= sizeof(T);
 | |
|             ((T*)init_buf)->~T();
 | |
|          }
 | |
|          BOOST_RETHROW;
 | |
|       }
 | |
|       BOOST_CATCH_END
 | |
|    }
 | |
| 
 | |
|    operator T* ()
 | |
|    {  return (T*)(rawbuf);  }
 | |
| 
 | |
|    operator const T*() const
 | |
|    {  return (const T*)(rawbuf);  }
 | |
| 
 | |
|    ~array_initializer()
 | |
|    {
 | |
|       char *init_buf = (char*)rawbuf + N*sizeof(T);
 | |
|       for(std::size_t i = 0; i != N; ++i){
 | |
|          init_buf -= sizeof(T);
 | |
|          ((T*)init_buf)->~T();
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    private:
 | |
|    detail::max_align rawbuf[(N*sizeof(T)-1)/sizeof(detail::max_align)+1];
 | |
| };
 | |
| 
 | |
| }  //namespace detail{
 | |
| }  //namespace intrusive{
 | |
| }  //namespace boost{
 | |
| 
 | |
| #endif //BOOST_INTRUSIVE_DETAIL_ARRAY_INITIALIZER_HPP
 | 
