#include <number_impl.hpp>
Public Member Functions | |
number_impl () | |
virtual | ~number_impl () |
void | print (std::ostream &stream) const |
std::string | to_string () const |
void | save (std::ostream &stream) const |
bool | equals (number_impl const &rhs) const |
bool | less (number_impl const &rhs) const |
number_impl * | add (number_impl const &rhs) |
number_impl * | subtract (number_impl const &rhs) |
number_impl * | multiply (number_impl const &rhs) |
number_impl * | divide (number_impl const &rhs) |
void | add_ref () |
void | del_ref () |
number_impl * | promote (number_impl &rhs) const |
virtual number_impl * | promote_to_void () |
virtual number_impl * | promote_to_long () |
virtual number_impl * | promote_to_rational () |
virtual number_impl * | promote_to_double () |
Static Public Member Functions | |
static number_impl * | read_library (std::istream &stream) |
Private Member Functions | |
number_impl (number_impl const &n) | |
not implemented | |
number_impl & | operator= (number_impl const &n) |
not implemented | |
virtual std::string | do_to_string () const =0 |
virtual void | do_save (std::ostream &stream) const =0 |
virtual bool | do_equals (number_impl const &rhs) const =0 |
virtual bool | do_less (number_impl const &rhs) const =0 |
virtual number_impl * | do_add (number_impl const &rhs)=0 |
virtual number_impl * | do_subtract (number_impl const &rhs)=0 |
virtual number_impl * | do_multiply (number_impl const &rhs)=0 |
virtual number_impl * | do_divide (number_impl const &rhs)=0 |
virtual number_impl * | do_promote (number_impl &rhs) const =0 |
Private Attributes | |
std::size_t | refcount_ |
Definition at line 9 of file number_impl.hpp.
number_impl::number_impl | ( | ) | [inline] |
number_impl::~number_impl | ( | ) | [virtual] |
number_impl::number_impl | ( | number_impl const & | n | ) | [private] |
not implemented
void number_impl::print | ( | std::ostream & | stream | ) | const |
Print in a human-readable form.
Definition at line 55 of file number_impl.cpp.
References to_string().
Referenced by number::print().
00057 { 00058 stream << to_string(); 00059 }
std::string number_impl::to_string | ( | ) | const |
Convert to a string.
Definition at line 61 of file number_impl.cpp.
References do_to_string().
Referenced by print(), and number::to_string().
00063 { 00064 return do_to_string(); 00065 }
void number_impl::save | ( | std::ostream & | stream | ) | const |
Save a number to a library file.
Definition at line 23 of file number_impl.cpp.
References do_save().
Referenced by number::save().
00025 { 00026 do_save(stream); 00027 }
number_impl * number_impl::read_library | ( | std::istream & | stream | ) | [static] |
Read the number type from a library file, then create the proper kind of number.
Definition at line 29 of file number_impl.cpp.
00030 { 00031 std::string type; 00032 if (not (stream >> type)) 00033 throw calc_error("malformed library, missing number type"); 00034 00035 if (type == "void") 00036 return new number_void(); 00037 00038 if (type == "long") { 00039 long x; 00040 if (not (stream >> x)) 00041 throw calc_error("malformed library, missing long value"); 00042 return new number_long(x); 00043 } 00044 00045 if (type == "double") { 00046 double x; 00047 if (not (stream >> x)) 00048 throw calc_error("malformed library, missing double value"); 00049 return new number_long(x); 00050 } 00051 00052 throw calc_error("malformed library, unknown number type: " + type); 00053 }
bool number_impl::equals | ( | number_impl const & | rhs | ) | const |
Definition at line 73 of file number_impl.cpp.
References do_equals().
Referenced by number::equals().
00075 { 00076 return do_equals(rhs); 00077 }
bool number_impl::less | ( | number_impl const & | rhs | ) | const |
Definition at line 79 of file number_impl.cpp.
References do_less().
Referenced by number::less().
00081 { 00082 return do_less(rhs); 00083 }
number_impl * number_impl::add | ( | number_impl const & | rhs | ) |
Definition at line 85 of file number_impl.cpp.
References do_add().
Referenced by number::operator+().
00086 { 00087 return do_add(rhs); 00088 }
number_impl * number_impl::subtract | ( | number_impl const & | rhs | ) |
Definition at line 90 of file number_impl.cpp.
References do_subtract().
Referenced by number::operator-().
00091 { 00092 return do_subtract(rhs); 00093 }
number_impl * number_impl::multiply | ( | number_impl const & | rhs | ) |
Definition at line 95 of file number_impl.cpp.
References do_multiply().
Referenced by number::operator *().
00096 { 00097 return do_multiply(rhs); 00098 }
number_impl * number_impl::divide | ( | number_impl const & | rhs | ) |
Definition at line 100 of file number_impl.cpp.
References do_divide().
Referenced by number::operator/().
00101 { 00102 return do_divide(rhs); 00103 }
void number_impl::add_ref | ( | ) |
Definition at line 11 of file number_impl.cpp.
References refcount_.
Referenced by number_void::do_add(), number_void::do_divide(), number_void::do_multiply(), number_void::do_subtract(), number::number(), number::operator=(), promote_to_double(), promote_to_long(), promote_to_rational(), and promote_to_void().
00012 { 00013 ++refcount_; 00014 }
void number_impl::del_ref | ( | ) |
Definition at line 16 of file number_impl.cpp.
References refcount_.
Referenced by number::operator=(), and number::~number().
number_impl * number_impl::promote | ( | number_impl & | rhs | ) | const |
Promote rhs
to match the type of this
number. This function uses double-dispatch, so this number calls a virtual promote_to_*() function that notifies rhs
of the desired type. If the desired type is "larger" than the type of rhs
, the promote_to_*() function returns a new number_impl of the desired type. Otherwise, the function returns rhs
.
rhs | The right-hand operand of an arithmetic expression. |
Definition at line 67 of file number_impl.cpp.
References do_promote().
Referenced by number::coerce().
00069 { 00070 return do_promote(rhs); 00071 }
number_impl * number_impl::promote_to_void | ( | ) | [virtual] |
Reimplemented in number_long, number_rational, and number_double.
Definition at line 109 of file number_impl.cpp.
References add_ref().
Referenced by number_void::do_promote().
00110 { 00111 add_ref(); 00112 return this; 00113 }
number_impl * number_impl::promote_to_long | ( | ) | [virtual] |
Definition at line 115 of file number_impl.cpp.
References add_ref().
Referenced by number_long::do_promote().
00116 { 00117 add_ref(); 00118 return this; 00119 }
number_impl * number_impl::promote_to_rational | ( | ) | [virtual] |
Reimplemented in number_long.
Definition at line 121 of file number_impl.cpp.
References add_ref().
Referenced by number_rational::do_promote().
00122 { 00123 add_ref(); 00124 return this; 00125 }
number_impl * number_impl::promote_to_double | ( | ) | [virtual] |
Reimplemented in number_long, and number_rational.
Definition at line 127 of file number_impl.cpp.
References add_ref().
Referenced by number_double::do_promote().
00128 { 00129 add_ref(); 00130 return this; 00131 }
number_impl& number_impl::operator= | ( | number_impl const & | n | ) | [private] |
not implemented
virtual std::string number_impl::do_to_string | ( | ) | const [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by to_string().
virtual void number_impl::do_save | ( | std::ostream & | stream | ) | const [private, pure virtual] |
virtual bool number_impl::do_equals | ( | number_impl const & | rhs | ) | const [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by equals().
virtual bool number_impl::do_less | ( | number_impl const & | rhs | ) | const [private, pure virtual] |
virtual number_impl* number_impl::do_add | ( | number_impl const & | rhs | ) | [private, pure virtual] |
virtual number_impl* number_impl::do_subtract | ( | number_impl const & | rhs | ) | [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by subtract().
virtual number_impl* number_impl::do_multiply | ( | number_impl const & | rhs | ) | [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by multiply().
virtual number_impl* number_impl::do_divide | ( | number_impl const & | rhs | ) | [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by divide().
virtual number_impl* number_impl::do_promote | ( | number_impl & | rhs | ) | const [private, pure virtual] |
Implemented in number_void, number_long, number_rational, and number_double.
Referenced by promote().
std::size_t number_impl::refcount_ [private] |