Chris@102: /* Copyright 2006-2014 Joaquin M Lopez Munoz. 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/flyweight for library home page. Chris@102: */ Chris@102: Chris@102: #ifndef BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP Chris@102: #define BOOST_FLYWEIGHT_DETAIL_ARCHIVE_CONSTRUCTED_HPP Chris@102: Chris@102: #if defined(_MSC_VER)&&(_MSC_VER>=1200) Chris@102: #pragma once Chris@102: #endif Chris@102: Chris@102: #include /* keep it first to prevent nasty warns in MSVC */ Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost{ Chris@102: Chris@102: namespace flyweights{ Chris@102: Chris@102: namespace detail{ Chris@102: Chris@102: /* constructs a stack-based object from a serialization archive */ Chris@102: Chris@102: template Chris@102: struct archive_constructed:private noncopyable Chris@102: { Chris@102: template Chris@102: archive_constructed(Archive& ar,const unsigned int version) Chris@102: { Chris@102: serialization::load_construct_data_adl(ar,&get(),version); Chris@102: BOOST_TRY{ Chris@102: ar>>get(); Chris@102: } Chris@102: BOOST_CATCH(...){ Chris@102: (&get())->~T(); Chris@102: BOOST_RETHROW; Chris@102: } Chris@102: BOOST_CATCH_END Chris@102: } Chris@102: Chris@102: template Chris@102: archive_constructed(const char* name,Archive& ar,const unsigned int version) Chris@102: { Chris@102: serialization::load_construct_data_adl(ar,&get(),version); Chris@102: BOOST_TRY{ Chris@102: ar>>serialization::make_nvp(name,get()); Chris@102: } Chris@102: BOOST_CATCH(...){ Chris@102: (&get())->~T(); Chris@102: BOOST_RETHROW; Chris@102: } Chris@102: BOOST_CATCH_END Chris@102: } Chris@102: Chris@102: ~archive_constructed() Chris@102: { Chris@102: (&get())->~T(); Chris@102: } Chris@102: Chris@102: T& get(){return *static_cast(static_cast(&space));} Chris@102: Chris@102: private: Chris@102: typename aligned_storage::value>::type space; Chris@102: }; Chris@102: Chris@102: } /* namespace flyweights::detail */ Chris@102: Chris@102: } /* namespace flyweights */ Chris@102: Chris@102: } /* namespace boost */ Chris@102: Chris@102: #endif