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
00031 #ifndef _API_DELTABASE_H_
00032 #define _API_DELTABASE_H_
00033
00034 #include <coconut_config.h>
00035 #include <string>
00036 #include <database>
00037 #include <api_certbase.h>
00038 #include <api_debug.h>
00039
00040 namespace coco {
00041
00042 class work_node;
00043
00044 class delta_base;
00045
00046 class undelta_base;
00047
00049
00054 typedef vdbl::rowid delta_id;
00055
00057
00064 class delta
00065 {
00066 private:
00068 delta_base* _d;
00069
00070 public:
00072 delta() : _d(NULL) {}
00073 private:
00077 delta(delta_base* __d) : _d(__d) {}
00078 public:
00082 delta(const delta_base& __d);
00087 delta(const delta& __d);
00088
00090 ~delta();
00091
00094 const std::string& get_action() const;
00096 const delta_base* get_base() const;
00097
00099 bool apply(work_node& _x, const delta_id& _d) const;
00102 bool apply3(work_node& _x, const work_node& _y, const delta_id& _d) const;
00106 void convert(work_node& _x);
00110 void unkeep();
00111
00115 delta_id store(work_node& _x, const certificate& _c);
00116
00120 delta& operator=(const delta& _d);
00121
00123 bool operator==(const delta& _c) const;
00124 bool operator!=(const delta& _c) const;
00125
00126 friend std::ostream& operator<< (std::ostream& o, const delta& t);
00127 friend class delta_base;
00128 friend class ie_return_type;
00129 };
00130
00132
00137 inline std::ostream& operator<< (std::ostream& o, const delta& t)
00138 {
00139 o << "Don't know how to print a delta of type " << t.get_action() << "!"
00140 << std::endl;
00141 return o;
00142 }
00143
00145
00150 class delta_base
00151 {
00152 protected:
00154 std::string _action;
00155
00156 public:
00158 delta_base() : _action() {}
00160 delta_base(const std::string& a) : _action(a) {}
00162 delta_base(const char* a) : _action(std::string(a)) {}
00164 delta_base(const delta_base& __d) : _action(__d._action) {}
00165
00167 virtual delta_base* new_copy() const PURE_VIRTUAL
00169 virtual void destroy_copy(delta_base* __d) const PURE_VIRTUAL
00170
00172 virtual ~delta_base() {}
00173
00175 delta make_delta(const std::string& a)
00176 {
00177 delta_base* __tmp = this->new_copy();
00178 __tmp->_action = a;
00179 return delta(__tmp);
00180 }
00181
00184 const std::string& get_action() const { return _action; }
00185
00189 virtual void convert(work_node& _x, delta_base*& _d)
00190 { _d = this; }
00191
00194 virtual void unkeep() {}
00195
00198 virtual bool apply(work_node& _x, undelta_base*& _u, const delta_id& _d) const
00199 { _u = NULL; return false; }
00200
00208 virtual bool apply3(work_node& _x, const work_node& _y, undelta_base*& _u,
00209 const delta_id& _d) const;
00210
00212 virtual bool operator==(const delta_base& _c) const PURE_VIRTUAL
00213 virtual bool operator!=(const delta_base& _c) const PURE_VIRTUAL
00214 };
00215
00217
00223 class undelta
00224 {
00225 private:
00227 undelta_base* _d;
00228
00229 public:
00231 undelta() : _d(NULL) {}
00235 undelta(undelta_base* __d) : _d(__d) {}
00240 undelta(const undelta& __d);
00241
00243 ~undelta();
00244
00246 const undelta_base* get_base() const;
00247
00249 bool unapply(work_node& _x, const delta_id& _i) const;
00252 bool unapply3(work_node& _x, const work_node& _y, const delta_id& _i) const;
00253
00257 undelta& operator=(const undelta& _u);
00258 };
00259
00261
00266 class undelta_base
00267 {
00268 public:
00270 undelta_base() {}
00272 undelta_base(const undelta_base& __d) {}
00273
00275 virtual undelta_base* new_copy() const PURE_VIRTUAL
00277 virtual void destroy_copy(undelta_base* __d) const PURE_VIRTUAL
00278
00280 virtual ~undelta_base() {}
00281
00283 undelta make_undelta()
00284 {
00285 undelta_base* __tmp = this->new_copy();
00286 return undelta(__tmp);
00287 }
00288
00290 virtual bool unapply(work_node& _x, const delta_id& _d) const
00291 { return false; }
00292
00299 virtual bool unapply3(work_node& _x, const work_node& _y,
00300 const delta_id& _d) const;
00301 };
00302
00303 }
00304
00305 #endif