--- boost/parameter/aux_/maybe.hpp 2008-03-22 21:45:55.000000000 +0000 +++ boost/parameter/aux_/maybe.hpp.new 2009-10-22 03:55:24.000000000 +0000 @@ -2,20 +2,41 @@ // subject to 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) -#ifndef BOOST_PARAMETER_MAYBE_060211_HPP -# define BOOST_PARAMETER_MAYBE_060211_HPP +// +// 2009.10.21 TDS remove depenency on boost::python::detail::referent_storage +// +#ifndef BOOST_PARAMETER_MAYBE_091021_HPP +# define BOOST_PARAMETER_MAYBE_091021_HPP # include # include # include # include # include -# include +# include # include # include namespace boost { namespace parameter { namespace aux { +template struct referent_size; + +template +struct referent_size +{ + BOOST_STATIC_CONSTANT(std::size_t, value = sizeof(T)); +}; + +// A metafunction returning a POD type which can store U, where T == +// U&. If T is not a reference type, returns a POD which can store T. +template +struct referent_storage +{ + typedef typename boost::aligned_storage< + referent_size::value + >::type type; +}; + struct maybe_base {}; template @@ -33,8 +54,8 @@ BOOST_DEDUCED_TYPENAME remove_reference::type >::type non_cv_value; - explicit maybe(T value) - : value(value) + explicit maybe(T value_) + : value(value_) , constructed(false) {} @@ -48,28 +69,28 @@ this->destroy(); } - reference construct(reference value) const + reference construct(reference value_) const { - return value; + return value_; } template - reference construct2(U const& value) const + reference construct2(U const& value_) const { - new (m_storage.bytes) non_cv_value(value); + new (m_storage.address()) non_cv_value(value_); constructed = true; - return *(non_cv_value*)m_storage.bytes; + return *(non_cv_value*)m_storage.address(); } template - reference construct(U const& value) const + reference construct(U const& value_) const { - return this->construct2(value); + return this->construct2(value_); } void destroy() { - ((non_cv_value*)m_storage.bytes)->~non_cv_value(); + ((non_cv_value*)m_storage.address())->~non_cv_value(); } typedef reference(maybe::*safe_bool)() const; @@ -87,7 +108,9 @@ private: boost::optional value; mutable bool constructed; - mutable typename boost::python::detail::referent_storage< + + + mutable typename referent_storage< reference >::type m_storage; };