Chris@16: //----------------------------------------------------------------------------- Chris@16: // boost variant/recursive_wrapper.hpp header file Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: //----------------------------------------------------------------------------- Chris@16: // Chris@16: // Copyright (c) 2002-2003 Chris@16: // Eric Friedman, Itay Maman 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_VARIANT_RECURSIVE_WRAPPER_HPP Chris@16: #define BOOST_VARIANT_RECURSIVE_WRAPPER_HPP Chris@16: Chris@16: #include "boost/variant/recursive_wrapper_fwd.hpp" Chris@16: #include "boost/variant/detail/move.hpp" Chris@16: #include "boost/checked_delete.hpp" Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: // class template recursive_wrapper Chris@16: // Chris@16: // See docs and recursive_wrapper_fwd.hpp for more information. Chris@16: // Chris@16: Chris@16: template Chris@16: class recursive_wrapper Chris@16: { Chris@16: public: // typedefs Chris@16: Chris@16: typedef T type; Chris@16: Chris@16: private: // representation Chris@16: Chris@16: T* p_; Chris@16: Chris@16: public: // structors Chris@16: Chris@16: ~recursive_wrapper(); Chris@16: recursive_wrapper(); Chris@16: Chris@16: recursive_wrapper(const recursive_wrapper& operand); Chris@16: recursive_wrapper(const T& operand); Chris@16: Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: recursive_wrapper(recursive_wrapper&& operand); Chris@16: recursive_wrapper(T&& operand); Chris@16: #endif Chris@16: Chris@16: private: // helpers, for modifiers (below) Chris@16: Chris@16: void assign(const T& rhs); Chris@16: Chris@16: public: // modifiers Chris@16: Chris@16: recursive_wrapper& operator=(const recursive_wrapper& rhs) Chris@16: { Chris@16: assign( rhs.get() ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: recursive_wrapper& operator=(const T& rhs) Chris@16: { Chris@16: assign( rhs ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: void swap(recursive_wrapper& operand) BOOST_NOEXCEPT Chris@16: { Chris@16: T* temp = operand.p_; Chris@16: operand.p_ = p_; Chris@16: p_ = temp; Chris@16: } Chris@16: Chris@16: Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: recursive_wrapper& operator=(recursive_wrapper&& rhs) BOOST_NOEXCEPT Chris@16: { Chris@16: swap(rhs); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: recursive_wrapper& operator=(T&& rhs) Chris@16: { Chris@16: get() = detail::variant::move(rhs); Chris@16: return *this; Chris@16: } Chris@16: #endif Chris@16: Chris@16: public: // queries Chris@16: Chris@16: T& get() { return *get_pointer(); } Chris@16: const T& get() const { return *get_pointer(); } Chris@16: Chris@16: T* get_pointer() { return p_; } Chris@16: const T* get_pointer() const { return p_; } Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: recursive_wrapper::~recursive_wrapper() Chris@16: { Chris@16: boost::checked_delete(p_); Chris@16: } Chris@16: Chris@16: template Chris@16: recursive_wrapper::recursive_wrapper() Chris@16: : p_(new T) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: recursive_wrapper::recursive_wrapper(const recursive_wrapper& operand) Chris@16: : p_(new T( operand.get() )) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: recursive_wrapper::recursive_wrapper(const T& operand) Chris@16: : p_(new T(operand)) Chris@16: { Chris@16: } Chris@16: Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: template Chris@16: recursive_wrapper::recursive_wrapper(recursive_wrapper&& operand) Chris@16: : p_(new T( detail::variant::move(operand.get()) )) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: recursive_wrapper::recursive_wrapper(T&& operand) Chris@16: : p_(new T( detail::variant::move(operand) )) Chris@16: { Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: void recursive_wrapper::assign(const T& rhs) Chris@16: { Chris@16: this->get() = rhs; Chris@16: } Chris@16: Chris@16: // function template swap Chris@16: // Chris@16: // Swaps two recursive_wrapper objects of the same type T. Chris@16: // Chris@16: template Chris@16: inline void swap(recursive_wrapper& lhs, recursive_wrapper& rhs) BOOST_NOEXCEPT Chris@16: { Chris@16: lhs.swap(rhs); Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_VARIANT_RECURSIVE_WRAPPER_HPP