Fix compiling with non doubles
[ipdf/code.git] / src / paranoidnumber.h
1 #ifndef _PARANOIDNUMBER_H
2 #define _PARANOIDNUMBER_H
3
4 #include <list>
5 #include <cfloat>
6 #include <map>
7 #include <string>
8
9 namespace IPDF
10 {
11         class ParanoidNumber
12         {
13                 public:
14                         typedef enum {ADD, SUBTRACT, MULTIPLY, DIVIDE} Optype;
15                         
16                         ParanoidNumber(float value=0, Optype type = ADD) : m_value(value), m_op(type), m_next(NULL)
17                         {
18                                 
19                         }
20                         
21                         ParanoidNumber(const ParanoidNumber & cpy) : m_value(cpy.m_value), m_op(cpy.m_op), m_next(NULL)
22                         {
23                                 if (cpy.m_next != NULL)
24                                 {
25                                         m_next = new ParanoidNumber(*(cpy.m_next));
26                                 }
27                         }
28                         
29                         ParanoidNumber(const ParanoidNumber & cpy, Optype type) : ParanoidNumber(cpy)
30                         {
31                                 m_op = type;
32                         }
33                         
34                         ParanoidNumber(const char * str);
35                         
36                         virtual ~ParanoidNumber()
37                         {
38                                 if (m_next != NULL)
39                                         delete m_next;
40                         }
41                         
42                         
43                         double ToDouble() const;
44                         
45                         ParanoidNumber & operator+=(const ParanoidNumber & a);
46                         ParanoidNumber & operator-=(const ParanoidNumber & a);
47                         ParanoidNumber & operator*=(const ParanoidNumber & a);
48                         ParanoidNumber & operator/=(const ParanoidNumber & a);
49                         ParanoidNumber & operator=(const ParanoidNumber & a);
50                         
51                         
52                         bool operator<(const ParanoidNumber & a) const {return ToDouble() < a.ToDouble();}
53                         bool operator<=(const ParanoidNumber & a) const {return this->operator<(a) || this->operator==(a);}
54                         bool operator>(const ParanoidNumber & a) const {return !(this->operator<=(a));}
55                         bool operator>=(const ParanoidNumber & a) const {return !(this->operator<(a));}
56                         bool operator==(const ParanoidNumber & a) const {return ToDouble() == a.ToDouble();}
57                         bool operator!=(const ParanoidNumber & a) const {return !(this->operator==(a));}
58                         
59                         ParanoidNumber operator+(const ParanoidNumber & a) const
60                         {
61                                 ParanoidNumber result(*this);
62                                 result += a;
63                                 return result;
64                         }
65                         ParanoidNumber operator-(const ParanoidNumber & a) const
66                         {
67                                 ParanoidNumber result(*this);
68                                 result -= a;
69                                 return result;
70                         }
71                         ParanoidNumber operator*(const ParanoidNumber & a) const
72                         {
73                                 ParanoidNumber result(*this);
74                                 result *= a;
75                                 return result;
76                         }
77                         ParanoidNumber operator/(const ParanoidNumber & a) const
78                         {
79                                 ParanoidNumber result(*this);
80                                 result /= a;
81                                 return result;
82                         }
83                         
84                         std::string Str() const;
85                 
86                 private:
87                         void Simplify();
88                         ParanoidNumber * InsertAfter(ParanoidNumber * insert);
89                         ParanoidNumber * InsertAfter(float value, Optype op);
90                         
91                         float m_value;
92                         Optype m_op;
93                         ParanoidNumber * m_next;
94
95                         
96                         
97
98         };
99
100
101 }
102
103 #endif //_PARANOIDNUMBER_H
104

UCC git Repository :: git.ucc.asn.au