//-----------------------------------------------------------------------------

// boost variant/detail/backup_holder.hpp header file

// See http://www.boost.org for updates, documentation, and revision history.

//-----------------------------------------------------------------------------

//

// Copyright (c) 2003

// Eric Friedman

//

// Distributed under 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_VARIANT_DETAIL_BACKUP_HOLDER_HPP

#define BOOST_VARIANT_DETAIL_BACKUP_HOLDER_HPP



#include "boost/assert.hpp"



namespace boost {

namespace detail { namespace variant {



template <typename T>

class backup_holder

{

private: // representation



    T* backup_;



public: // structors



    ~backup_holder()

    {

        delete backup_;

    }



    explicit backup_holder(T* backup)

        : backup_(backup)

    {

    }



    backup_holder(const backup_holder&);



public: // modifiers



    backup_holder& operator=(const backup_holder& rhs)

    {

        *backup_ = rhs.get();

        return *this;

    }



    backup_holder& operator=(const T& rhs)

    {

        *backup_ = rhs;

        return *this;

    }



    void swap(backup_holder& rhs)

    {

        T* tmp = rhs.backup_;

        rhs.backup_ = this->backup_;

        this->backup_ = tmp;

    }



public: // queries



    T& get()

    {

        return *backup_;

    }



    const T& get() const

    {

        return *backup_;

    }



};



template <typename T>

backup_holder<T>::backup_holder(const backup_holder&)

    : backup_(0)

{

    // not intended for copy, but do not want to prohibit syntactically

    BOOST_ASSERT(false);

}



template <typename T>

void swap(backup_holder<T>& lhs, backup_holder<T>& rhs)

{

    lhs.swap(rhs);

}



}} // namespace detail::variant

} // namespace boost



#endif // BOOST_VARIANT_DETAIL_BACKUP_HOLDER_HPP

