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 <typename T>
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 <typename T>
williamr@2: recursive_wrapper<T>::~recursive_wrapper()
williamr@2: {
williamr@2:     boost::checked_delete(p_);
williamr@2: }
williamr@2: 
williamr@2: template <typename T>
williamr@2: recursive_wrapper<T>::recursive_wrapper()
williamr@2:     : p_(new T)
williamr@2: {
williamr@2: }
williamr@2: 
williamr@2: template <typename T>
williamr@2: recursive_wrapper<T>::recursive_wrapper(const recursive_wrapper& operand)
williamr@2:     : p_(new T( operand.get() ))
williamr@2: {
williamr@2: }
williamr@2: 
williamr@2: template <typename T>
williamr@2: recursive_wrapper<T>::recursive_wrapper(const T& operand)
williamr@2:     : p_(new T(operand))
williamr@2: {
williamr@2: }
williamr@2: 
williamr@2: template <typename T>
williamr@2: void recursive_wrapper<T>::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<T> objects of the same type T.
williamr@2: //
williamr@2: template <typename T>
williamr@2: inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& 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