00001 #ifndef NODE_IMPL_HPP_
00002 #define NODE_IMPL_HPP_
00003
00004 #include <cstdlib>
00005 #include <string>
00006
00007 #include "node.hpp"
00008
00019 class node_impl {
00020 public:
00021 node_impl();
00022 virtual ~node_impl();
00023
00024 void print(std::ostream& stream, int indent) const;
00025
00026 double evaluate() const;
00027
00028 std::string to_string() const;
00029
00030 identifier_list const& get_parameters() const;
00031
00032 void add_ref();
00033 void del_ref();
00034
00035 private:
00036 node_impl(node_impl const& n);
00037 node_impl& operator=(node_impl const& n);
00038
00039 virtual void print_node(std::ostream& stream, int indent) const = 0;
00040 virtual double evaluate_node() const = 0;
00041 virtual std::string evaluate_string() const;
00042 virtual identifier_list const& evaluate_parameters() const;
00043
00044 std::size_t refcount_;
00045 };
00046
00050 class node_void : public node_impl {
00051 public:
00052 node_void();
00053 private:
00054 virtual void print_node(std::ostream& stream, int indent) const;
00055 virtual double evaluate_node() const;
00056 virtual std::string evaluate_string() const;
00057 };
00058
00062 class node_number : public node_impl {
00063 public:
00064 node_number(double value);
00065 double value() const;
00066 private:
00067 virtual void print_node(std::ostream& stream, int indent) const;
00068 virtual double evaluate_node() const;
00069
00070 double value_;
00071 };
00072
00076 class node_identifier : public node_impl {
00077 public:
00078 node_identifier(std::string const& name);
00079 std::string const& name() const;
00080 private:
00081 virtual void print_node(std::ostream& stream, int indent) const;
00082 virtual double evaluate_node() const;
00083 virtual std::string evaluate_string() const;
00084
00085 std::string name_;
00086 };
00087
00091 class node_function : public node_impl {
00092 public:
00093 node_function(identifier_list const& parameters, node definition);
00094 identifier_list const& parameters() const;
00095 node definition() const;
00096 private:
00097 virtual void print_node(std::ostream& stream, int indent) const;
00098 virtual double evaluate_node() const;
00099 virtual identifier_list const& evaluate_parameters() const;
00100
00101 identifier_list parameters_;
00102 node definition_;
00103 };
00104
00106 class node_function_call : public node_impl {
00107 public:
00108 node_function_call(std::string const& name, node_list const& arguments);
00109 std::string name() const;
00110 node_list const& arguments() const;
00111 private:
00112 virtual void print_node(std::ostream& stream, int indent) const;
00113 virtual double evaluate_node() const;
00114
00115 std::string name_;
00116 node_list arguments_;
00117 };
00118
00120 class node_unary : public node_impl {
00121 public:
00122 node_unary(node operand);
00123 node operand() const;
00124 protected:
00125 double evaluate_operand() const;
00126 private:
00127 virtual void print_node(std::ostream& stream, int indent) const = 0;
00128 virtual double evaluate_node() const = 0;
00129
00130 node operand_;
00131 };
00132
00134 class node_binary : public node_impl {
00135 public:
00136 node_binary(node left, node right);
00137 node left() const;
00138 node right() const;
00139 protected:
00140 double evaluate_left() const;
00141 double evaluate_right() const;
00142 private:
00143 virtual void print_node(std::ostream& stream, int indent) const = 0;
00144 virtual double evaluate_node() const = 0;
00145
00146 node left_;
00147 node right_;
00148 };
00149
00151 class node_negate : public node_unary {
00152 public:
00153 node_negate(node operand);
00154 private:
00155 virtual void print_node(std::ostream& stream, int indent) const;
00156 virtual double evaluate_node() const;
00157 };
00158
00160 class node_add : public node_binary {
00161 public:
00162 node_add(node left, node right);
00163 private:
00164 virtual void print_node(std::ostream& stream, int indent) const;
00165 virtual double evaluate_node() const;
00166 };
00167
00169 class node_subtract : public node_binary {
00170 public:
00171 node_subtract(node left, node right);
00172 private:
00173 virtual void print_node(std::ostream& stream, int indent) const;
00174 virtual double evaluate_node() const;
00175 };
00176
00178 class node_multiply : public node_binary {
00179 public:
00180 node_multiply(node left, node right);
00181 private:
00182 virtual void print_node(std::ostream& stream, int indent) const;
00183 virtual double evaluate_node() const;
00184 };
00185
00187 class node_divide : public node_binary {
00188 public:
00189 node_divide(node left, node right);
00190 private:
00191 virtual void print_node(std::ostream& stream, int indent) const;
00192 virtual double evaluate_node() const;
00193 };
00194
00195 #endif