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 void add_ref(); 00031 void del_ref(); 00032 00033 private: 00034 node_impl(node_impl const& n); 00035 node_impl& operator=(node_impl const& n); 00036 00037 virtual void print_node(std::ostream& stream, int indent) const = 0; 00038 virtual double evaluate_node() const = 0; 00039 virtual std::string evaluate_string() const; 00040 00041 std::size_t refcount_; 00042 }; 00043 00047 class node_void : public node_impl { 00048 public: 00049 node_void(); 00050 private: 00051 virtual void print_node(std::ostream& stream, int indent) const; 00052 virtual double evaluate_node() const; 00053 virtual std::string evaluate_string() const; 00054 }; 00055 00059 class node_number : public node_impl { 00060 public: 00061 node_number(double value); 00062 double value() const; 00063 private: 00064 virtual void print_node(std::ostream& stream, int indent) const; 00065 virtual double evaluate_node() const; 00066 00067 double value_; 00068 }; 00069 00073 class node_identifier : public node_impl { 00074 public: 00075 node_identifier(std::string const& identifier); 00076 std::string identifier() const; 00077 private: 00078 virtual void print_node(std::ostream& stream, int indent) const; 00079 virtual double evaluate_node() const; 00080 virtual std::string evaluate_string() const; 00081 00082 std::string identifier_; 00083 }; 00084 00088 class node_assign : public node_impl { 00089 public: 00090 node_assign(node identifier, node value); 00091 node identifier() const; 00092 node value() const; 00093 private: 00094 std::string get_identifier() const; 00095 double evaluate_value() const; 00096 00097 virtual void print_node(std::ostream& stream, int indent) const; 00098 virtual double evaluate_node() const; 00099 00100 node identifier_; 00101 node value_; 00102 }; 00103 00105 class node_unary : public node_impl { 00106 public: 00107 node_unary(node operand); 00108 node operand() const; 00109 protected: 00110 double evaluate_operand() const; 00111 private: 00112 virtual void print_node(std::ostream& stream, int indent) const = 0; 00113 virtual double evaluate_node() const = 0; 00114 00115 node operand_; 00116 }; 00117 00119 class node_binary : public node_impl { 00120 public: 00121 node_binary(node left, node right); 00122 node left() const; 00123 node right() const; 00124 protected: 00125 double evaluate_left() const; 00126 double evaluate_right() const; 00127 private: 00128 virtual void print_node(std::ostream& stream, int indent) const = 0; 00129 virtual double evaluate_node() const = 0; 00130 00131 node left_; 00132 node right_; 00133 }; 00134 00136 class node_negate : public node_unary { 00137 public: 00138 node_negate(node operand); 00139 private: 00140 virtual void print_node(std::ostream& stream, int indent) const; 00141 virtual double evaluate_node() const; 00142 }; 00143 00145 class node_add : public node_binary { 00146 public: 00147 node_add(node left, node right); 00148 private: 00149 virtual void print_node(std::ostream& stream, int indent) const; 00150 virtual double evaluate_node() const; 00151 }; 00152 00154 class node_subtract : public node_binary { 00155 public: 00156 node_subtract(node left, node right); 00157 private: 00158 virtual void print_node(std::ostream& stream, int indent) const; 00159 virtual double evaluate_node() const; 00160 }; 00161 00163 class node_multiply : public node_binary { 00164 public: 00165 node_multiply(node left, node right); 00166 private: 00167 virtual void print_node(std::ostream& stream, int indent) const; 00168 virtual double evaluate_node() const; 00169 }; 00170 00172 class node_divide : public node_binary { 00173 public: 00174 node_divide(node left, node right); 00175 private: 00176 virtual void print_node(std::ostream& stream, int indent) const; 00177 virtual double evaluate_node() const; 00178 }; 00179 00180 #endif