00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00030 #ifndef _API_DELTABASE_H_
00031 #define _API_DELTABASE_H_
00032
00033 #include <coconut_config.h>
00034 #include <string>
00035 #include <database>
00036
00037 #define DEBUG_DELTA 0
00038
00039 class work_node;
00040
00041 class delta_base;
00042
00043 class undelta_base;
00044
00045 typedef vdbl::rowid delta_id;
00046
00047 class delta
00048 {
00049 private:
00050 delta_base* _d;
00051
00052 public:
00053 delta() : _d(NULL) {}
00054 private:
00055 delta(delta_base* __d) : _d(__d) {}
00056 public:
00057 delta(const delta_base& __d);
00058 delta(const delta& __d);
00059
00060 ~delta();
00061
00062 const std::string& get_action() const;
00063 const delta_base* get_base() const;
00064
00065 bool apply(work_node& _x, const delta_id& _d) const;
00066 bool apply3(work_node& _x, const work_node& _y, const delta_id& _d) const;
00067 void convert(work_node& _x);
00068 delta_id store(work_node& _x);
00069
00070 delta& operator=(const delta& _d);
00071
00072 friend std::ostream& operator<< (std::ostream& o, const delta& t);
00073 friend class delta_base;
00074 friend class ie_return_type;
00075 };
00076
00077 inline std::ostream& operator<< (std::ostream& o, const delta& t)
00078 {
00079 o << "Don't know how to print a delta!";
00080 return o;
00081 }
00082
00083 class delta_base
00084 {
00085 protected:
00086 std::string _action;
00087
00088 public:
00089 delta_base() : _action() {}
00090 delta_base(const std::string& a) : _action(a) {}
00091 delta_base(const char* a) : _action(std::string(a)) {}
00092 delta_base(const delta_base& __d) : _action(__d._action) {}
00093
00094 virtual delta_base* new_copy() const { return new delta_base(*this); }
00095 virtual void destroy_copy(delta_base* __d) { delete __d; }
00096
00097 virtual ~delta_base() {}
00098
00099 delta make_delta(const std::string& a)
00100 {
00101 delta_base* __tmp = new delta_base(a);
00102 return delta(__tmp);
00103 }
00104
00105 const std::string& get_action() const { return _action; }
00106
00107 virtual void convert(work_node& _x, delta_base*& _d)
00108 { _d = this; }
00109
00110 virtual bool apply(work_node& _x, undelta_base*& _u) const
00111 { _u = NULL; return false; }
00112
00113
00114
00115 virtual bool apply3(work_node& _x, const work_node& _y, undelta_base*& _u)
00116 const;
00117 };
00118
00119 class undelta
00120 {
00121 private:
00122 undelta_base* _d;
00123
00124 public:
00125 undelta() : _d(NULL) {}
00126 undelta(undelta_base* __d) : _d(__d) {}
00127 undelta(const undelta& __d);
00128
00129 ~undelta();
00130
00131 const undelta_base* get_base() const;
00132
00133 bool unapply(work_node& _x) const;
00134 bool unapply3(work_node& _x, const work_node& _y) const;
00135
00136 undelta& operator=(const undelta& _u);
00137 };
00138
00139 class undelta_base
00140 {
00141 public:
00142 undelta_base() {}
00143 undelta_base(const undelta_base& __d) {}
00144
00145 virtual undelta_base* new_copy() const { return new undelta_base(*this); }
00146 virtual void destroy_copy(undelta_base* __d) { delete __d; }
00147
00148 virtual ~undelta_base() {}
00149
00150 undelta make_undelta()
00151 {
00152 undelta_base* __tmp = new undelta_base();
00153 return undelta(__tmp);
00154 }
00155
00156 virtual bool unapply(work_node& _x) const { return false; }
00157
00158
00159
00160 virtual bool unapply3(work_node& _x, const work_node& _y) const;
00161 };
00162
00163 #endif