node.cpp

Go to the documentation of this file.
00001 #include <stdexcept>
00002 
00003 #include "node.hpp"
00004 #include "node_impl.hpp"
00005 
00006 node_impl* node::make_binary_operator(node left, char op, node right)
00007 {
00008   if (op == '+')
00009     return new node_add(left, right);
00010   else if (op == '-')
00011     return new node_subtract(left, right);
00012   else if (op == '*')
00013     return new node_multiply(left, right);
00014   else if (op == '/')
00015     return new node_divide(left, right);
00016   else
00017     throw std::logic_error("fatal error in make_binary_opreator: unknown operator: " + op);
00018 }
00019 
00020 node::node()
00021 : pimpl_(new node_void())
00022 {}
00023 
00024 node::node(node const& n)
00025 : pimpl_(n.pimpl_)
00026 {
00027   pimpl_->add_ref();
00028 }
00029 
00030 node::node(double number)
00031 : pimpl_(new node_number(number))
00032 {}
00033 
00034 node::node(std::string const& identifier)
00035   : pimpl_(new node_identifier(identifier))
00036   {}
00037 
00038 node::node(char op, node operand)
00039 : pimpl_(new node_negate(operand))
00040 {}
00041 
00042 node::node(node left, char op, node right)
00043 : pimpl_(make_binary_operator(left, op, right))
00044 {}
00045 
00046 node::node(identifier_list const& parameters, node definition)
00047 : pimpl_(new node_function(parameters, definition))
00048 {}
00049 
00050 node::node(std::string const& name, node_list const& arguments)
00051 : pimpl_(new node_function_call(name, arguments))
00052 {}
00053 
00054 node::~node()
00055 {
00056   pimpl_->del_ref();
00057 }
00058 
00059 node& node::operator=(node const& n)
00060 {
00061   n.pimpl_->add_ref();
00062   pimpl_->del_ref();
00063   pimpl_ = n.pimpl_;
00064 
00065   return *this;
00066 }
00067 
00068 void node::print(std::ostream& stream, int indent)
00069 const
00070 {
00071   pimpl_->print(stream, indent);
00072 }
00073 
00074 double node::evaluate()
00075 const
00076 {
00077   return pimpl_->evaluate();
00078 }
00079 
00080 std::string node::to_string()
00081 const
00082 {
00083   return pimpl_->to_string();
00084 }
00085 
00086 identifier_list const& node::get_parameters()
00087 const
00088 {
00089   return pimpl_->get_parameters();
00090 }

Generated on Sun Nov 30 10:05:26 2008 for Calculator by  doxygen 1.5.3