1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 3 /* 4 Copyright (C) 2002, 2003 Ferdinando Ametrano 5 Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl 6 Copyright (C) 2007 StatPro Italia srl 7 8 This file is part of QuantLib, a free-software/open-source library 9 for financial quantitative analysts and developers - http://quantlib.org/ 10 11 QuantLib is free software: you can redistribute it and/or modify it 12 under the terms of the QuantLib license. You should have received a 13 copy of the license along with this program; if not, please email 14 <quantlib-dev@lists.sf.net>. The license is also available online at 15 <http://quantlib.org/license.shtml>. 16 17 This program is distributed in the hope that it will be useful, but WITHOUT 18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 19 FOR A PARTICULAR PURPOSE. See the license for more details. 20 */ 21 22 /*! \file pricingengine.hpp 23 \brief Base class for pricing engines 24 */ 25 26 #ifndef quantlib_pricing_engine_hpp 27 #define quantlib_pricing_engine_hpp 28 29 #include <ql/patterns/observable.hpp> 30 31 namespace QuantLib { 32 33 //! interface for pricing engines 34 class PricingEngine : public Observable { 35 public: 36 class arguments; 37 class results; ~PricingEngine()38 virtual ~PricingEngine() {} 39 virtual arguments* getArguments() const = 0; 40 virtual const results* getResults() const = 0; 41 virtual void reset() = 0; 42 virtual void calculate() const = 0; 43 }; 44 45 class PricingEngine::arguments { 46 public: ~arguments()47 virtual ~arguments() {} 48 virtual void validate() const = 0; 49 }; 50 51 class PricingEngine::results { 52 public: ~results()53 virtual ~results() {} 54 virtual void reset() = 0; 55 }; 56 57 58 //! template base class for option pricing engines 59 /*! Derived engines only need to implement 60 the <tt>calculate()</tt> method. 61 */ 62 template<class ArgumentsType, class ResultsType> 63 class GenericEngine : public PricingEngine, 64 public Observer { 65 public: getArguments() const66 PricingEngine::arguments* getArguments() const { return &arguments_; } getResults() const67 const PricingEngine::results* getResults() const { return &results_; } reset()68 void reset() { results_.reset(); } update()69 void update() { notifyObservers(); } 70 protected: 71 mutable ArgumentsType arguments_; 72 mutable ResultsType results_; 73 }; 74 75 } 76 77 78 #endif 79