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