Chris@16: //----------------------------------------------------------------------------- Chris@16: // boost detail/reference_content.hpp header file Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: //----------------------------------------------------------------------------- Chris@16: // Chris@16: // Copyright (c) 2003 Chris@16: // Eric Friedman 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_DETAIL_REFERENCE_CONTENT_HPP Chris@16: #define BOOST_DETAIL_REFERENCE_CONTENT_HPP Chris@16: Chris@16: #include "boost/config.hpp" Chris@16: Chris@16: # include "boost/mpl/bool.hpp" Chris@16: # include "boost/type_traits/has_nothrow_copy.hpp" Chris@16: Chris@16: #include "boost/mpl/void.hpp" Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // (detail) class template reference_content Chris@16: // Chris@16: // Non-Assignable wrapper for references. Chris@16: // Chris@16: template Chris@16: class reference_content Chris@16: { Chris@16: private: // representation Chris@16: Chris@16: RefT content_; Chris@16: Chris@16: public: // structors Chris@16: Chris@16: ~reference_content() Chris@16: { Chris@16: } Chris@16: Chris@16: reference_content(RefT r) Chris@16: : content_( r ) Chris@16: { Chris@16: } Chris@16: Chris@16: reference_content(const reference_content& operand) Chris@16: : content_( operand.content_ ) Chris@16: { Chris@16: } Chris@16: Chris@16: private: // non-Assignable Chris@16: Chris@16: reference_content& operator=(const reference_content&); Chris@16: Chris@16: public: // queries Chris@16: Chris@16: RefT get() const Chris@16: { Chris@16: return content_; Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // (detail) metafunction make_reference_content Chris@16: // Chris@16: // Wraps with reference_content if specified type is reference. Chris@16: // Chris@16: Chris@16: template struct make_reference_content; Chris@16: Chris@16: Chris@16: template Chris@16: struct make_reference_content Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct make_reference_content< T& > Chris@16: { Chris@16: typedef reference_content type; Chris@16: }; Chris@16: Chris@16: Chris@16: template <> Chris@16: struct make_reference_content< mpl::void_ > Chris@16: { Chris@16: template Chris@16: struct apply Chris@16: : make_reference_content Chris@16: { Chris@16: }; Chris@16: Chris@16: typedef mpl::void_ type; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // reference_content type traits specializations Chris@16: // Chris@16: Chris@16: Chris@16: template Chris@16: struct has_nothrow_copy< Chris@16: ::boost::detail::reference_content< T& > Chris@16: > Chris@16: : mpl::true_ Chris@16: { Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_DETAIL_REFERENCE_CONTENT_HPP