00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_NODES_HH
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_NODES_HH
00019
00020 namespace vcsn {
00021
00022 namespace rat {
00023
00024
00025 template<typename M_, typename W_>
00026 class Node;
00027
00028
00029
00030
00031
00032 template<typename M_, typename W_>
00033 class ConstNodeVisitor
00034 {
00035 public:
00036 virtual ~ConstNodeVisitor() {}
00037 virtual void product(const Node<M_, W_>*, const Node<M_, W_>*) = 0;
00038 virtual void sum(const Node<M_, W_>*, const Node<M_, W_>*) = 0;
00039 virtual void star(const Node<M_, W_>*) = 0;
00040 virtual void left_weight(const W_&, const Node<M_, W_>*) = 0;
00041 virtual void right_weight(const W_&, const Node<M_, W_>*) = 0;
00042 virtual void constant(const M_&) = 0;
00043 virtual void zero() = 0;
00044 virtual void one() = 0;
00045 };
00046
00047 template<typename M_, typename W_>
00048 class DefaultMutableNodeVisitor : public ConstNodeVisitor<M_, W_>
00049 {
00050 public:
00051 virtual void product( Node<M_, W_>* lhs, Node<M_, W_>* rhs);
00052 virtual void sum( Node<M_, W_>* lhs, Node<M_, W_>* rhs);
00053 virtual void star( Node<M_, W_>* n);
00054 virtual void left_weight(W_&, Node<M_, W_>* n);
00055 virtual void right_weight( W_&, Node<M_, W_>* n);
00056 virtual void constant( M_&);
00057 virtual void zero();
00058 virtual void one();
00059 };
00060
00061
00062
00063
00064 template<typename M_, typename W_>
00065 class Node
00066 {
00067 public:
00068 enum type
00069 {
00070 constant,
00071 lweight,
00072 rweight,
00073 one,
00074 prod,
00075 star,
00076 sum,
00077 zero
00078 };
00079
00080
00081 virtual type what() const = 0;
00082 virtual Node<M_, W_>* clone() const = 0;
00083 virtual void accept(ConstNodeVisitor<M_, W_> &) const = 0;
00084 virtual bool operator!=(const Node<M_, W_>& other) const = 0;
00085 virtual bool operator<(const Node<M_, W_>& other) const = 0;
00086
00087
00088 virtual ~Node();
00089
00090 Node();
00091 };
00092
00093
00094
00095
00096
00097 template<typename M_, typename W_>
00098 class Zero : public Node<M_, W_>
00099 {
00100 public:
00101 Zero();
00102
00103 virtual
00104 typename Node<M_, W_>::type
00105 what() const;
00106
00107 virtual
00108 Node<M_, W_>* clone() const;
00109 virtual void accept(ConstNodeVisitor<M_, W_>& v) const;
00110 virtual bool operator!=(const Node<M_, W_>& other) const;
00111 virtual bool operator<(const Node<M_, W_>& other) const;
00112
00113 virtual ~Zero();
00114 };
00115
00116
00117
00118
00119 template<typename M_, typename W_>
00120 class One : public Node<M_, W_>
00121 {
00122 public:
00123 One();
00124 virtual typename Node<M_, W_>::type
00125 what() const;
00126 virtual Node<M_, W_>*
00127 clone() const;
00128 virtual void
00129 accept(ConstNodeVisitor<M_, W_>& v) const;
00130 virtual bool
00131 operator!=(const Node<M_, W_>& other) const;
00132 virtual bool
00133 operator<(const Node<M_, W_>& other) const;
00134 virtual
00135 ~One();
00136 };
00137
00138
00139
00140
00141
00142 template<typename M_, typename W_>
00143 class Constant : public Node<M_, W_>
00144 {
00145 public:
00146 Constant(const M_ &v);
00147 virtual typename Node<M_, W_>::type what() const;
00148 virtual Node<M_, W_>* clone() const;
00149 virtual void
00150 accept(ConstNodeVisitor<M_, W_>& v) const;
00151 virtual bool
00152 operator!=(const Node<M_, W_>& other) const;
00153 virtual bool
00154 operator<(const Node<M_, W_>& other) const;
00155 virtual
00156 ~Constant();
00157
00158 public:
00159 M_ value_;
00160 };
00161
00162
00163
00164
00165 template<typename M_, typename W_>
00166 class LeftWeighted : public Node<M_, W_>
00167 {
00168
00169 public:
00170
00171 LeftWeighted(const W_& w, const Node<M_, W_>& c);
00172 LeftWeighted(const W_& w, Node<M_, W_>* c);
00173 LeftWeighted(const W_& w);
00174 virtual typename Node<M_, W_>::type
00175 what() const;
00176 virtual Node<M_, W_>*
00177 clone() const;
00178 virtual void
00179 accept(ConstNodeVisitor<M_, W_>& v) const;
00180 virtual bool
00181 operator!=(const Node<M_, W_>& other) const;
00182 virtual bool
00183 operator<(const Node<M_, W_>& other) const;
00184 virtual
00185 ~LeftWeighted();
00186
00187 public:
00188 W_ weight_;
00189 Node<M_, W_>* child_;
00190 };
00191
00192
00193
00194
00195 template<typename M_, typename W_>
00196 class RightWeighted : public Node<M_, W_>
00197 {
00198 public:
00199
00200 RightWeighted(const W_& w, const Node<M_, W_>& c);
00201 RightWeighted(const W_& w, Node<M_, W_>* c);
00202 RightWeighted(const W_& w);
00203 virtual typename Node<M_, W_>::type
00204 what() const;
00205 virtual Node<M_, W_>*
00206 clone() const;
00207 virtual void
00208 accept(ConstNodeVisitor<M_, W_>& v) const;
00209 virtual bool
00210 operator!=(const Node<M_, W_>& other) const;
00211 virtual bool
00212 operator<(const Node<M_, W_>& other) const;
00213 virtual
00214 ~RightWeighted();
00215 public:
00216
00217 W_ weight_;
00218 Node<M_, W_>* child_;
00219 };
00220
00221
00222
00223
00224 template<typename M_, typename W_>
00225 class Star : public Node<M_, W_>
00226 {
00227
00228 public:
00229
00230 Star(const Node<M_, W_>& other);
00231 Star(Node<M_, W_>* other);
00232 virtual typename Node<M_, W_>::type
00233 what() const;
00234 virtual Node<M_, W_>*
00235 clone() const;
00236 virtual void
00237 accept(ConstNodeVisitor<M_, W_>& v) const;
00238 virtual bool
00239 operator!=(const Node<M_, W_>& other) const;
00240 virtual bool
00241 operator<(const Node<M_, W_>& other) const;
00242 virtual
00243 ~Star();
00244
00245 public:
00246
00247 Node<M_, W_>* child_;
00248 };
00249
00250
00251
00252
00253 template<typename M_, typename W_>
00254 class Product : public Node<M_, W_>
00255 {
00256
00257 public:
00258
00259 Product(const Node<M_, W_>& left, const Node<M_, W_>& right);
00260 Product(Node<M_, W_>* left, Node<M_, W_>* right);
00261 virtual typename Node<M_, W_>::type
00262 what() const;
00263 virtual Node<M_, W_>*
00264 clone() const;
00265 virtual void
00266 accept(ConstNodeVisitor<M_, W_>& v) const;
00267 virtual bool
00268 operator!=(const Node<M_, W_>& other) const;
00269 virtual bool
00270 operator<(const Node<M_, W_>& other) const;
00271 virtual
00272 ~Product();
00273
00274 public:
00275
00276 Node<M_, W_>* left_;
00277 Node<M_, W_>* right_;
00278 };
00279
00280
00281
00282
00283 template<typename M_, typename W_>
00284 class Sum : public Node<M_, W_>
00285 {
00286 public:
00287 Sum(const Node<M_, W_>& left, const Node<M_, W_>& right);
00288 Sum(Node<M_, W_>* left, Node<M_, W_>* right);
00289 virtual void
00290 accept(ConstNodeVisitor<M_, W_>& v) const;
00291 virtual typename Node<M_, W_>::type
00292 what() const;
00293 virtual Node<M_, W_>*
00294 clone() const;
00295 virtual bool
00296 operator!=(const Node<M_, W_>& other) const;
00297 virtual bool
00298 operator<(const Node<M_, W_>& other) const;
00299 virtual
00300 ~Sum();
00301 public:
00302
00303 Node<M_, W_> *left_;
00304 Node<M_, W_> *right_;
00305 };
00306
00307 }
00308
00309 }
00310
00311 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00312 # include <vaucanson/algebra/implementation/series/rat/nodes.hxx>
00313 # endif // VCSN_USE_INTERFACE_ONLY
00314
00315 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_NODES_HH