Calculator  Step 6
number_impl.hpp
Go to the documentation of this file.
1 #ifndef NUMBER_IMPL_HPP_
2 #define NUMBER_IMPL_HPP_
3 
4 #include <iosfwd>
5 #include <memory>
6 #include <string>
7 
8 #include "rational.hpp"
9 
10 class number_impl : public std::enable_shared_from_this<number_impl>
11 {
12 public:
13  virtual ~number_impl();
14 
16  void print(std::ostream& stream) const;
18  std::string to_string() const;
19 
21  void save(std::ostream& stream) const;
23  static std::shared_ptr<number_impl> read_library(std::istream& stream);
24 
25  bool equals(number_impl const& rhs) const;
26  bool less(number_impl const& rhs) const;
27 
28  std::shared_ptr<number_impl> add(number_impl const& rhs);
29  std::shared_ptr<number_impl> subtract(number_impl const& rhs);
30  std::shared_ptr<number_impl> multiply(number_impl const& rhs);
31  std::shared_ptr<number_impl> divide(number_impl const& rhs);
32 
33  void add_ref();
34  void del_ref();
35 
46  std::shared_ptr<number_impl> promote(number_impl& rhs) const;
47 
48  virtual std::shared_ptr<number_impl> promote_to_void();
49  virtual std::shared_ptr<number_impl> promote_to_long();
50  virtual std::shared_ptr<number_impl> promote_to_rational();
51  virtual std::shared_ptr<number_impl> promote_to_double();
52 
53 protected:
55 
56 private:
57  number_impl(number_impl const& n);
58  number_impl& operator=(number_impl const& n);
59 
60  virtual std::string do_to_string() const = 0;
61  virtual void do_save(std::ostream& stream) const = 0;
62 
63  virtual bool do_equals(number_impl const& rhs) const = 0;
64  virtual bool do_less(number_impl const& rhs) const = 0;
65 
66  virtual std::shared_ptr<number_impl> do_add(number_impl const& rhs) = 0;
67  virtual std::shared_ptr<number_impl> do_subtract(number_impl const& rhs) = 0;
68  virtual std::shared_ptr<number_impl> do_multiply(number_impl const& rhs) = 0;
69  virtual std::shared_ptr<number_impl> do_divide(number_impl const& rhs) = 0;
70 
71  virtual std::shared_ptr<number_impl> do_promote(number_impl& rhs) const = 0;
72 
73  std::size_t refcount_;
74 };
75 
80 class number_void : public number_impl {
81 public:
83 private:
84  virtual std::string do_to_string() const;
85  virtual void do_save(std::ostream& stream) const;
86  virtual bool do_equals(number_impl const& rhs) const;
87  virtual bool do_less(number_impl const& rhs) const;
88  virtual std::shared_ptr<number_impl> do_add(number_impl const& rhs);
89  virtual std::shared_ptr<number_impl> do_subtract(number_impl const& rhs);
90  virtual std::shared_ptr<number_impl> do_multiply(number_impl const& rhs);
91  virtual std::shared_ptr<number_impl> do_divide(number_impl const& rhs);
92  virtual std::shared_ptr<number_impl> do_promote(number_impl& rhs) const;
93 };
94 
98 class number_long : public number_impl {
99 public:
100  number_long(long long value) : number_impl(), value_(value) {}
101  long long value() const { return value_; }
102  virtual std::shared_ptr<number_impl> promote_to_void();
103  virtual std::shared_ptr<number_impl> promote_to_rational();
104  virtual std::shared_ptr<number_impl> promote_to_double();
105 private:
106  virtual std::string do_to_string() const;
107  virtual void do_save(std::ostream& stream) const;
108  virtual bool do_equals(number_impl const& rhs) const;
109  virtual bool do_less(number_impl const& rhs) const;
110  virtual std::shared_ptr<number_impl> do_add(number_impl const& rhs);
111  virtual std::shared_ptr<number_impl> do_subtract(number_impl const& rhs);
112  virtual std::shared_ptr<number_impl> do_multiply(number_impl const& rhs);
113  virtual std::shared_ptr<number_impl> do_divide(number_impl const& rhs);
114  virtual std::shared_ptr<number_impl> do_promote(number_impl& rhs) const;
115 
116  long long value_;
117 };
118 
123 public:
125  number_rational(long long num) : number_impl(), value_(num) {}
126  number_rational(long long num, long long den) : number_impl(), value_(num, den) {}
127  rational<long long> value() const { return value_; }
128  virtual std::shared_ptr<number_impl> promote_to_void();
129  virtual std::shared_ptr<number_impl> promote_to_double();
130 private:
131  virtual std::string do_to_string() const;
132  virtual void do_save(std::ostream& stream) const;
133  virtual bool do_equals(number_impl const& rhs) const;
134  virtual bool do_less(number_impl const& rhs) const;
135  virtual std::shared_ptr<number_impl> do_add(number_impl const& rhs);
136  virtual std::shared_ptr<number_impl> do_subtract(number_impl const& rhs);
137  virtual std::shared_ptr<number_impl> do_multiply(number_impl const& rhs);
138  virtual std::shared_ptr<number_impl> do_divide(number_impl const& rhs);
139  virtual std::shared_ptr<number_impl> do_promote(number_impl& rhs) const;
140 
142 };
143 
147 class number_double : public number_impl {
148 public:
149  number_double(double value) : number_impl(), value_(value) {}
150  double value() const { return value_; }
151  virtual std::shared_ptr<number_impl> promote_to_void();
152 private:
153  virtual std::string do_to_string() const;
154  virtual void do_save(std::ostream& stream) const;
155  virtual bool do_equals(number_impl const& rhs) const;
156  virtual bool do_less(number_impl const& rhs) const;
157  virtual std::shared_ptr<number_impl> do_add(number_impl const& rhs);
158  virtual std::shared_ptr<number_impl> do_subtract(number_impl const& rhs);
159  virtual std::shared_ptr<number_impl> do_multiply(number_impl const& rhs);
160  virtual std::shared_ptr<number_impl> do_divide(number_impl const& rhs);
161  virtual std::shared_ptr<number_impl> do_promote(number_impl& rhs) const;
162 
163  double value_;
164 };
165 
166 #endif
virtual bool do_less(number_impl const &rhs) const
virtual void do_save(std::ostream &stream) const
virtual void do_save(std::ostream &stream) const
virtual bool do_less(number_impl const &rhs) const =0
virtual std::shared_ptr< number_impl > do_multiply(number_impl const &rhs)
number_double(double value)
long long value() const
virtual std::shared_ptr< number_impl > do_multiply(number_impl const &rhs)
void save(std::ostream &stream) const
Definition: number_impl.cpp:12
virtual std::shared_ptr< number_impl > do_add(number_impl const &rhs)
void del_ref()
virtual std::shared_ptr< number_impl > promote_to_double()
virtual std::shared_ptr< number_impl > do_subtract(number_impl const &rhs)=0
virtual std::shared_ptr< number_impl > do_add(number_impl const &rhs)
virtual std::shared_ptr< number_impl > promote_to_void()
bool less(number_impl const &rhs) const
Definition: number_impl.cpp:68
long long value_
std::shared_ptr< number_impl > promote(number_impl &rhs) const
Definition: number_impl.cpp:56
virtual std::shared_ptr< number_impl > do_subtract(number_impl const &rhs)
virtual bool do_less(number_impl const &rhs) const
virtual ~number_impl()
Definition: number_impl.cpp:9
virtual std::shared_ptr< number_impl > do_add(number_impl const &rhs)
virtual bool do_equals(number_impl const &rhs) const
number_impl & operator=(number_impl const &n)
not implemented
number_rational(long long num, long long den)
virtual std::shared_ptr< number_impl > promote_to_double()
virtual std::shared_ptr< number_impl > do_subtract(number_impl const &rhs)
virtual std::shared_ptr< number_impl > do_divide(number_impl const &rhs)
number_rational(long long num)
void print(std::ostream &stream) const
Definition: number_impl.cpp:44
virtual std::shared_ptr< number_impl > promote_to_rational()
std::shared_ptr< number_impl > add(number_impl const &rhs)
Definition: number_impl.cpp:74
virtual void do_save(std::ostream &stream) const
virtual std::shared_ptr< number_impl > do_add(number_impl const &rhs)=0
number_rational(rational< long long > value)
virtual std::shared_ptr< number_impl > do_promote(number_impl &rhs) const
virtual void do_save(std::ostream &stream) const =0
virtual std::shared_ptr< number_impl > do_promote(number_impl &rhs) const =0
void add_ref()
virtual bool do_less(number_impl const &rhs) const
std::shared_ptr< number_impl > subtract(number_impl const &rhs)
Definition: number_impl.cpp:79
virtual std::shared_ptr< number_impl > do_promote(number_impl &rhs) const
virtual std::shared_ptr< number_impl > do_divide(number_impl const &rhs)=0
virtual std::string do_to_string() const
virtual std::shared_ptr< number_impl > do_subtract(number_impl const &rhs)
rational< long long > value() const
virtual bool do_equals(number_impl const &rhs) const
virtual std::string do_to_string() const =0
static std::shared_ptr< number_impl > read_library(std::istream &stream)
Definition: number_impl.cpp:18
virtual std::shared_ptr< number_impl > promote_to_rational()
std::string to_string() const
Definition: number_impl.cpp:50
virtual std::string do_to_string() const
virtual std::shared_ptr< number_impl > do_multiply(number_impl const &rhs)
virtual std::shared_ptr< number_impl > do_multiply(number_impl const &rhs)=0
std::shared_ptr< number_impl > multiply(number_impl const &rhs)
Definition: number_impl.cpp:84
std::size_t refcount_
Definition: number_impl.hpp:73
virtual bool do_equals(number_impl const &rhs) const
virtual std::shared_ptr< number_impl > promote_to_void()
Definition: number_impl.cpp:97
virtual std::shared_ptr< number_impl > do_divide(number_impl const &rhs)
virtual std::shared_ptr< number_impl > do_promote(number_impl &rhs) const
virtual std::shared_ptr< number_impl > promote_to_void()
virtual std::shared_ptr< number_impl > do_subtract(number_impl const &rhs)
virtual std::shared_ptr< number_impl > do_divide(number_impl const &rhs)
virtual std::string do_to_string() const
virtual void do_save(std::ostream &stream) const
virtual bool do_less(number_impl const &rhs) const
virtual std::shared_ptr< number_impl > promote_to_void()
virtual std::shared_ptr< number_impl > promote_to_long()
virtual bool do_equals(number_impl const &rhs) const
virtual bool do_equals(number_impl const &rhs) const =0
double value() const
virtual std::shared_ptr< number_impl > do_add(number_impl const &rhs)
virtual std::string do_to_string() const
virtual std::shared_ptr< number_impl > do_promote(number_impl &rhs) const
bool equals(number_impl const &rhs) const
Definition: number_impl.cpp:62
rational< long long > value_
std::shared_ptr< number_impl > divide(number_impl const &rhs)
Definition: number_impl.cpp:89
virtual std::shared_ptr< number_impl > promote_to_double()
virtual std::shared_ptr< number_impl > do_multiply(number_impl const &rhs)
virtual std::shared_ptr< number_impl > do_divide(number_impl const &rhs)
number_long(long long value)