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