/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2003 RiskMap srl This file is part of QuantLib, a free-software/open-source library for financial quantitative analysts and developers - http://quantlib.org/ QuantLib is free software: you can redistribute it and/or modify it under the terms of the QuantLib license. You should have received a copy of the license along with this program; if not, please email . The license is also available online at . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the license for more details. */ /*! \file disposable.hpp \brief generic disposable object with move semantics */ #ifndef quantlib_disposable_hpp #define quantlib_disposable_hpp #include namespace QuantLib { //! generic disposable object with move semantics /*! This class can be used for returning a value by copy. It relies on the returned object exposing a swap(T\&) method through which the copy constructor and assignment operator are implemented, thus resulting in actual move semantics. Typical use of this class is along the following lines: \code Disposable bar(Integer i) { Foo f(i*2); return f; } \endcode \warning In order to avoid copies in code such as shown above, the conversion from T to Disposable\ is destructive, i.e., it does not preserve the state of the original object. Therefore, it is necessary for the developer to avoid code such as \code Disposable bar(Foo& f) { return f; } \endcode which would likely render the passed object unusable. The correct way to obtain the desired behavior would be: \code Disposable bar(Foo& f) { Foo temp = f; return temp; } \endcode */ template class Disposable : public T { public: Disposable(T& t); Disposable(const Disposable& t); Disposable& operator=(const Disposable& t); }; // inline definitions template inline Disposable::Disposable(T& t) { this->swap(t); } template inline Disposable::Disposable(const Disposable& t) : T() { this->swap(const_cast&>(t)); } template inline Disposable& Disposable::operator=(const Disposable& t) { this->swap(const_cast&>(t)); return *this; } } #endif