1 /*         ______   ___    ___
2  *        /\  _  \ /\_ \  /\_ \
3  *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___
4  *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
5  *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
6  *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
7  *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
8  *                                           /\____/
9  *                                           \_/__/
10  *
11  *      C++ wrapper for fixed point math type.
12  *
13  *      By Shawn Hargreaves.
14  *
15  *      See readme.txt for copyright information.
16  */
17 
18 
19 #ifndef ALLEGRO_FIX_H
20 #define ALLEGRO_FIX_H
21 
22 #include "fixed.h"
23 #include "fmaths.h"
24 
25 #ifdef __cplusplus
26 
27 class fix      /* C++ wrapper for the fixed point routines */
28 {
29 public:
30    fixed v;
31 
fix()32    fix() : v(0)                                       {}
fix(const fix & x)33    fix(const fix &x) : v(x.v)                         {}
fix(const int x)34    explicit fix(const int x) : v(itofix(x))           {}
fix(const long x)35    explicit fix(const long x) : v(itofix(x))          {}
fix(const unsigned int x)36    explicit fix(const unsigned int x) : v(itofix(x))  {}
fix(const unsigned long x)37    explicit fix(const unsigned long x) : v(itofix(x)) {}
fix(const float x)38    explicit fix(const float x) : v(ftofix(x))         {}
fix(const double x)39    explicit fix(const double x) : v(ftofix(x))        {}
40 
41    operator int() const                      { return fixtoi(v); }
42    operator long() const                     { return fixtoi(v); }
43    operator unsigned int() const             { return fixtoi(v); }
44    operator unsigned long() const            { return fixtoi(v); }
45    operator float() const                    { return fixtof(v); }
46    operator double() const                   { return fixtof(v); }
47 
48    fix& operator = (const fix &x)            { v = x.v;           return *this; }
49    fix& operator = (const int x)             { v = itofix(x);     return *this; }
50    fix& operator = (const long x)            { v = itofix(x);     return *this; }
51    fix& operator = (const unsigned int x)    { v = itofix(x);     return *this; }
52    fix& operator = (const unsigned long x)   { v = itofix(x);     return *this; }
53    fix& operator = (const float x)           { v = ftofix(x);     return *this; }
54    fix& operator = (const double x)          { v = ftofix(x);     return *this; }
55 
56    fix& operator +=  (const fix x)           { v += x.v;          return *this; }
57    fix& operator +=  (const int x)           { v += itofix(x);    return *this; }
58    fix& operator +=  (const long x)          { v += itofix(x);    return *this; }
59    fix& operator +=  (const float x)         { v += ftofix(x);    return *this; }
60    fix& operator +=  (const double x)        { v += ftofix(x);    return *this; }
61 
62    fix& operator -=  (const fix x)           { v -= x.v;          return *this; }
63    fix& operator -=  (const int x)           { v -= itofix(x);    return *this; }
64    fix& operator -=  (const long x)          { v -= itofix(x);    return *this; }
65    fix& operator -=  (const float x)         { v -= ftofix(x);    return *this; }
66    fix& operator -=  (const double x)        { v -= ftofix(x);    return *this; }
67 
68    fix& operator *=  (const fix x)           { v = fixmul(v, x.v);         return *this; }
69    fix& operator *=  (const int x)           { v *= x;                     return *this; }
70    fix& operator *=  (const long x)          { v *= x;                     return *this; }
71    fix& operator *=  (const float x)         { v = ftofix(fixtof(v) * x);  return *this; }
72    fix& operator *=  (const double x)        { v = ftofix(fixtof(v) * x);  return *this; }
73 
74    fix& operator /=  (const fix x)           { v = fixdiv(v, x.v);         return *this; }
75    fix& operator /=  (const int x)           { v /= x;                     return *this; }
76    fix& operator /=  (const long x)          { v /= x;                     return *this; }
77    fix& operator /=  (const float x)         { v = ftofix(fixtof(v) / x);  return *this; }
78    fix& operator /=  (const double x)        { v = ftofix(fixtof(v) / x);  return *this; }
79 
80    fix& operator <<= (const int x)           { v <<= x;           return *this; }
81    fix& operator >>= (const int x)           { v >>= x;           return *this; }
82 
83    fix& operator ++ ()                       { v += itofix(1);    return *this; }
84    fix& operator -- ()                       { v -= itofix(1);    return *this; }
85 
86    fix operator ++ (int)                     { fix t;  t.v = v;   v += itofix(1);  return t; }
87    fix operator -- (int)                     { fix t;  t.v = v;   v -= itofix(1);  return t; }
88 
89    fix operator - () const                   { fix t;  t.v = -v;  return t; }
90 
91    inline friend fix operator +  (const fix x, const fix y);
92    inline friend fix operator +  (const fix x, const int y);
93    inline friend fix operator +  (const int x, const fix y);
94    inline friend fix operator +  (const fix x, const long y);
95    inline friend fix operator +  (const long x, const fix y);
96    inline friend fix operator +  (const fix x, const float y);
97    inline friend fix operator +  (const float x, const fix y);
98    inline friend fix operator +  (const fix x, const double y);
99    inline friend fix operator +  (const double x, const fix y);
100 
101    inline friend fix operator -  (const fix x, const fix y);
102    inline friend fix operator -  (const fix x, const int y);
103    inline friend fix operator -  (const int x, const fix y);
104    inline friend fix operator -  (const fix x, const long y);
105    inline friend fix operator -  (const long x, const fix y);
106    inline friend fix operator -  (const fix x, const float y);
107    inline friend fix operator -  (const float x, const fix y);
108    inline friend fix operator -  (const fix x, const double y);
109    inline friend fix operator -  (const double x, const fix y);
110 
111    inline friend fix operator *  (const fix x, const fix y);
112    inline friend fix operator *  (const fix x, const int y);
113    inline friend fix operator *  (const int x, const fix y);
114    inline friend fix operator *  (const fix x, const long y);
115    inline friend fix operator *  (const long x, const fix y);
116    inline friend fix operator *  (const fix x, const float y);
117    inline friend fix operator *  (const float x, const fix y);
118    inline friend fix operator *  (const fix x, const double y);
119    inline friend fix operator *  (const double x, const fix y);
120 
121    inline friend fix operator /  (const fix x, const fix y);
122    inline friend fix operator /  (const fix x, const int y);
123    inline friend fix operator /  (const int x, const fix y);
124    inline friend fix operator /  (const fix x, const long y);
125    inline friend fix operator /  (const long x, const fix y);
126    inline friend fix operator /  (const fix x, const float y);
127    inline friend fix operator /  (const float x, const fix y);
128    inline friend fix operator /  (const fix x, const double y);
129    inline friend fix operator /  (const double x, const fix y);
130 
131    inline friend fix operator << (const fix x, const int y);
132    inline friend fix operator >> (const fix x, const int y);
133 
134    inline friend int operator == (const fix x, const fix y);
135    inline friend int operator == (const fix x, const int y);
136    inline friend int operator == (const int x, const fix y);
137    inline friend int operator == (const fix x, const long y);
138    inline friend int operator == (const long x, const fix y);
139    inline friend int operator == (const fix x, const float y);
140    inline friend int operator == (const float x, const fix y);
141    inline friend int operator == (const fix x, const double y);
142    inline friend int operator == (const double x, const fix y);
143 
144    inline friend int operator != (const fix x, const fix y);
145    inline friend int operator != (const fix x, const int y);
146    inline friend int operator != (const int x, const fix y);
147    inline friend int operator != (const fix x, const long y);
148    inline friend int operator != (const long x, const fix y);
149    inline friend int operator != (const fix x, const float y);
150    inline friend int operator != (const float x, const fix y);
151    inline friend int operator != (const fix x, const double y);
152    inline friend int operator != (const double x, const fix y);
153 
154    inline friend int operator <  (const fix x, const fix y);
155    inline friend int operator <  (const fix x, const int y);
156    inline friend int operator <  (const int x, const fix y);
157    inline friend int operator <  (const fix x, const long y);
158    inline friend int operator <  (const long x, const fix y);
159    inline friend int operator <  (const fix x, const float y);
160    inline friend int operator <  (const float x, const fix y);
161    inline friend int operator <  (const fix x, const double y);
162    inline friend int operator <  (const double x, const fix y);
163 
164    inline friend int operator >  (const fix x, const fix y);
165    inline friend int operator >  (const fix x, const int y);
166    inline friend int operator >  (const int x, const fix y);
167    inline friend int operator >  (const fix x, const long y);
168    inline friend int operator >  (const long x, const fix y);
169    inline friend int operator >  (const fix x, const float y);
170    inline friend int operator >  (const float x, const fix y);
171    inline friend int operator >  (const fix x, const double y);
172    inline friend int operator >  (const double x, const fix y);
173 
174    inline friend int operator <= (const fix x, const fix y);
175    inline friend int operator <= (const fix x, const int y);
176    inline friend int operator <= (const int x, const fix y);
177    inline friend int operator <= (const fix x, const long y);
178    inline friend int operator <= (const long x, const fix y);
179    inline friend int operator <= (const fix x, const float y);
180    inline friend int operator <= (const float x, const fix y);
181    inline friend int operator <= (const fix x, const double y);
182    inline friend int operator <= (const double x, const fix y);
183 
184    inline friend int operator >= (const fix x, const fix y);
185    inline friend int operator >= (const fix x, const int y);
186    inline friend int operator >= (const int x, const fix y);
187    inline friend int operator >= (const fix x, const long y);
188    inline friend int operator >= (const long x, const fix y);
189    inline friend int operator >= (const fix x, const float y);
190    inline friend int operator >= (const float x, const fix y);
191    inline friend int operator >= (const fix x, const double y);
192    inline friend int operator >= (const double x, const fix y);
193 
194    inline friend fix sqrt(fix x);
195    inline friend fix cos(fix x);
196    inline friend fix sin(fix x);
197    inline friend fix tan(fix x);
198    inline friend fix acos(fix x);
199    inline friend fix asin(fix x);
200    inline friend fix atan(fix x);
201    inline friend fix atan2(fix x, fix y);
202 };
203 
204 #endif          /* ifdef __cplusplus */
205 
206 #include "inline/fix.inl"
207 
208 #endif          /* ifndef ALLEGRO_FIX_H */
209 
210 
211