- Main Page
- Classes
- Files

# 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 }