williamr@2: //----------------------------------------------------------------------------- williamr@2: // boost variant/recursive_wrapper.hpp header file williamr@2: // See http://www.boost.org for updates, documentation, and revision history. williamr@2: //----------------------------------------------------------------------------- williamr@2: // williamr@2: // Copyright (c) 2002-2003 williamr@2: // Eric Friedman, Itay Maman williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: #ifndef BOOST_VARIANT_RECURSIVE_WRAPPER_HPP williamr@2: #define BOOST_VARIANT_RECURSIVE_WRAPPER_HPP williamr@2: williamr@2: #include "boost/variant/recursive_wrapper_fwd.hpp" williamr@2: #include "boost/checked_delete.hpp" williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // class template recursive_wrapper williamr@2: // williamr@2: // See docs and recursive_wrapper_fwd.hpp for more information. williamr@2: // williamr@2: williamr@2: template williamr@2: class recursive_wrapper williamr@2: { williamr@2: public: // typedefs williamr@2: williamr@2: typedef T type; williamr@2: williamr@2: private: // representation williamr@2: williamr@2: T* p_; williamr@2: williamr@2: public: // structors williamr@2: williamr@2: ~recursive_wrapper(); williamr@2: recursive_wrapper(); williamr@2: williamr@2: recursive_wrapper(const recursive_wrapper& operand); williamr@2: recursive_wrapper(const T& operand); williamr@2: williamr@2: private: // helpers, for modifiers (below) williamr@2: williamr@2: void assign(const T& rhs); williamr@2: williamr@2: public: // modifiers williamr@2: williamr@2: recursive_wrapper& operator=(const recursive_wrapper& rhs) williamr@2: { williamr@2: assign( rhs.get() ); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: recursive_wrapper& operator=(const T& rhs) williamr@2: { williamr@2: assign( rhs ); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: void swap(recursive_wrapper& operand) williamr@2: { williamr@2: T* temp = operand.p_; williamr@2: operand.p_ = p_; williamr@2: p_ = temp; williamr@2: } williamr@2: williamr@2: public: // queries williamr@2: williamr@2: T& get() { return *get_pointer(); } williamr@2: const T& get() const { return *get_pointer(); } williamr@2: williamr@2: T* get_pointer() { return p_; } williamr@2: const T* get_pointer() const { return p_; } williamr@2: williamr@2: }; williamr@2: williamr@2: template williamr@2: recursive_wrapper::~recursive_wrapper() williamr@2: { williamr@2: boost::checked_delete(p_); williamr@2: } williamr@2: williamr@2: template williamr@2: recursive_wrapper::recursive_wrapper() williamr@2: : p_(new T) williamr@2: { williamr@2: } williamr@2: williamr@2: template williamr@2: recursive_wrapper::recursive_wrapper(const recursive_wrapper& operand) williamr@2: : p_(new T( operand.get() )) williamr@2: { williamr@2: } williamr@2: williamr@2: template williamr@2: recursive_wrapper::recursive_wrapper(const T& operand) williamr@2: : p_(new T(operand)) williamr@2: { williamr@2: } williamr@2: williamr@2: template williamr@2: void recursive_wrapper::assign(const T& rhs) williamr@2: { williamr@2: this->get() = rhs; williamr@2: } williamr@2: williamr@2: // function template swap williamr@2: // williamr@2: // Swaps two recursive_wrapper objects of the same type T. williamr@2: // williamr@2: template williamr@2: inline void swap(recursive_wrapper& lhs, recursive_wrapper& rhs) williamr@2: { williamr@2: lhs.swap(rhs); williamr@2: } williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_VARIANT_RECURSIVE_WRAPPER_HPP