00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_misc_compute_h
00033 #define _util_misc_compute_h
00034
00035 #include <set>
00036
00037 #include <util/state/state.h>
00038 #include <util/state/stateio.h>
00039
00040 namespace sc {
00041
00042 class ResultInfo;
00043 class StateIn;
00044 class StateOut;
00045
00046 typedef ResultInfo* ResultInfoP;
00047
00055 class Compute
00056 {
00057 friend class ResultInfo;
00058 friend class AccResultInfo;
00059 private:
00060 std::set<ResultInfoP> _results;
00061 void add(ResultInfo*);
00062
00063
00064 Compute(const Compute&) {};
00065
00066 protected:
00070 virtual void compute() = 0;
00071 public:
00072 Compute();
00073 virtual ~Compute();
00074
00077 virtual void obsolete();
00078 };
00079
00084 class ResultInfo
00085 {
00086 protected:
00087 int _compute;
00088 int _computed;
00089 Compute* _c;
00090
00091
00092 virtual void update();
00093 protected:
00094 ResultInfo(StateIn&,Compute*);
00095 ResultInfo(const ResultInfo&,Compute*);
00096 virtual void save_data_state(StateOut&);
00097 virtual void restore_state(StateIn&);
00098 ResultInfo& operator=(const ResultInfo&);
00099 public:
00100 ResultInfo(Compute*c);
00101 virtual ~ResultInfo();
00102 int& compute() { return _compute; }
00103 const int& compute() const { return _compute; }
00104 int compute(int c) { int r = _compute; _compute = c; return r; }
00105 int& computed() { return _computed; }
00106 const int& computed() const { return _computed; }
00107 virtual int needed() const;
00108 };
00109
00112 class AccResultInfo: public ResultInfo
00113 {
00114 private:
00115 double _actual_accuracy;
00116 double _desired_accuracy;
00117 protected:
00118 AccResultInfo(StateIn&,Compute*);
00119 AccResultInfo(const AccResultInfo&,Compute*);
00120 virtual void save_data_state(StateOut&);
00121 virtual void restore_state(StateIn&);
00122 AccResultInfo& operator=(const AccResultInfo&);
00123 void update();
00124 public:
00125 AccResultInfo(Compute*c);
00126 ~AccResultInfo();
00127 double actual_accuracy() const;
00128 double desired_accuracy() const;
00129 void set_desired_accuracy(double);
00130 void set_actual_accuracy(double);
00131 int computed_to_desired_accuracy() const
00132 { return computed() && _actual_accuracy <= _desired_accuracy; }
00133 int needed() const;
00134 };
00135
00136 }
00137
00138 #include <util/misc/comptmpl.h>
00139
00140 namespace sc {
00141
00142 typedef NCResult<int> Resultint;
00143 typedef NCResult<double> Resultdouble;
00144 typedef NCAccResult<double> AccResultdouble;
00145
00146 }
00147
00148 #endif
00149
00150
00151
00152
00153