/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2005, 2006 StatPro Italia 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 observablevalue.hpp \brief observable and assignable proxy to concrete value */ #ifndef quantlib_observable_value_hpp #define quantlib_observable_value_hpp #include namespace QuantLib { //! %observable and assignable proxy to concrete value /*! Observers can be registered with instances of this class so that they are notified when a different value is assigned to such instances. Client code can copy the contained value or pass it to functions via implicit conversion. \note it is not possible to call non-const method on the returned value. This is by design, as this possibility would necessarily bypass the notification code; client code should modify the value via re-assignment instead. */ template class ObservableValue { public: ObservableValue(); ObservableValue(const T&); ObservableValue(const ObservableValue&); //! \name controlled assignment //@{ ObservableValue& operator=(const T&); ObservableValue& operator=(const ObservableValue&); //@} //! implicit conversion operator T() const; operator boost::shared_ptr() const; //! explicit inspector const T& value() const; private: T value_; boost::shared_ptr observable_; }; // template definition template ObservableValue::ObservableValue() : value_(), observable_(new Observable) {} template ObservableValue::ObservableValue(const T& t) : value_(t), observable_(new Observable) {} template ObservableValue::ObservableValue(const ObservableValue& t) : value_(t.value_), observable_(new Observable) {} template ObservableValue& ObservableValue::operator=(const T& t) { value_ = t; observable_->notifyObservers(); return *this; } template ObservableValue& ObservableValue::operator=(const ObservableValue& t) { value_ = t.value_; observable_->notifyObservers(); return *this; } template ObservableValue::operator T() const { return value_; } template ObservableValue::operator boost::shared_ptr() const { return observable_; } template const T& ObservableValue::value() const { return value_; } } #endif