00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxScalarInt_h
00012 #define HxScalarInt_h
00013
00014 #include "HxIoFwd.h"
00015 #include "HxMath.h"
00016 #include "HxString.h"
00017
00018 #undef min
00019 #undef max
00020
00021 class HxScalarDouble;
00022 class HxVec2Int;
00023 class HxVec2Double;
00024 class HxVec3Int;
00025 class HxVec3Double;
00026 class HxComplex;
00027
00028
00032 class L_HXBASIS HxScalarInt {
00033 public:
00034
00036
00038 HxScalarInt();
00039
00041 HxScalarInt(int v);
00042
00044 HxScalarInt(const HxScalarInt& v);
00046
00047 void* operator new(size_t, void * = 0);
00048
00050
00053 int dim() const;
00054
00056 int x() const;
00057
00059 int getValue(int dimension) const;
00060 void setValue(int dimension, int value);
00062
00064
00065
00066
00068 operator HxScalarDouble() const;
00069
00071 operator HxVec2Int() const;
00072
00074 operator HxVec2Double() const;
00075
00077 operator HxVec3Int() const;
00078
00080 operator HxVec3Double() const;
00081
00083 operator HxComplex() const;
00085
00087
00091 int operator==(const HxScalarInt& v) const;
00092
00094 int operator!=(const HxScalarInt& v) const;
00095
00097 int operator< (const HxScalarInt& v) const;
00098
00100 int operator<=(const HxScalarInt& v) const;
00101
00103 int operator> (const HxScalarInt& v) const;
00104
00106 int operator>=(const HxScalarInt& v) const;
00107
00112 static const HxScalarInt SMALL_VAL;
00113
00118 static const HxScalarInt LARGE_VAL;
00120
00122
00126 HxScalarInt operator-() const;
00127
00129 HxScalarInt complement() const;
00130
00132 HxScalarInt abs() const;
00133
00135 HxScalarInt ceil() const;
00136
00138 HxScalarInt floor() const;
00139
00141 HxScalarInt round() const;
00142
00144 HxScalarInt sum() const;
00145
00147 HxScalarInt product() const;
00148
00150 HxScalarInt min() const;
00151
00153 HxScalarInt max() const;
00154
00156 HxScalarInt norm1() const;
00157
00159 HxScalarDouble norm2() const;
00160
00162 HxScalarInt normInf() const;
00163
00165 HxScalarDouble sqrt() const;
00166
00168 HxScalarDouble sin() const;
00169
00171 HxScalarDouble cos() const;
00172
00174 HxScalarDouble tan() const;
00175
00177 HxScalarDouble asin() const;
00178
00180 HxScalarDouble acos() const;
00181
00183 HxScalarDouble atan() const;
00184
00186 HxScalarDouble atan2() const;
00187
00189 HxScalarDouble sinh() const;
00190
00192 HxScalarDouble cosh() const;
00193
00195 HxScalarDouble tanh() const;
00196
00198 HxScalarDouble exp() const;
00199
00201 HxScalarDouble log() const;
00202
00204 HxScalarDouble log10() const;
00206
00208
00212 HxScalarInt& operator+=(const HxScalarInt& v);
00213
00215 HxScalarInt& operator-=(const HxScalarInt& v);
00216
00218 HxScalarInt& operator*=(const HxScalarInt& v);
00219
00221 HxScalarInt& operator/=(const HxScalarInt& v);
00222
00223
00225 friend HxScalarInt operator+(const HxScalarInt& v1,
00226 const HxScalarInt& v2);
00227
00229 friend HxScalarInt operator-(const HxScalarInt& v1,
00230 const HxScalarInt& v2);
00231
00233 friend HxScalarInt operator*(const HxScalarInt& v1,
00234 const HxScalarInt& v2);
00235
00237 friend HxScalarInt operator/(const HxScalarInt& v1,
00238 const HxScalarInt& v2);
00239
00240
00242 HxScalarInt min(const HxScalarInt& v) const;
00243
00245 HxScalarInt& minAssign(const HxScalarInt& v);
00246
00248 HxScalarInt max(const HxScalarInt& v) const;
00249
00251 HxScalarInt& maxAssign(const HxScalarInt& v);
00252
00254 HxScalarInt inf(const HxScalarInt& v) const;
00255
00257 HxScalarInt& infAssign(const HxScalarInt& v);
00258
00260 HxScalarInt sup(const HxScalarInt& v) const;
00261
00263 HxScalarInt& supAssign(const HxScalarInt& v);
00264
00266 HxScalarInt pow(const HxScalarInt& v) const;
00267
00269 HxScalarInt mod(const HxScalarInt& v) const;
00270
00272 HxScalarInt and(const HxScalarInt& v) const;
00273
00275 HxScalarInt or(const HxScalarInt& v) const;
00276
00278 HxScalarInt xor(const HxScalarInt& v) const;
00279
00281 HxScalarInt leftShift(const HxScalarInt& v) const;
00282
00284 HxScalarInt rightShift(const HxScalarInt& v) const;
00285
00287 HxScalarInt dot(const HxScalarInt& v) const;
00288
00290 HxScalarInt cross(const HxScalarInt& v) const;
00292
00294
00296 STD_OSTREAM& put(STD_OSTREAM& os) const;
00297
00299 HxString toString() const;
00301
00302 private:
00303 int _value;
00304 };
00305
00306 typedef HxScalarInt (*HxUpoScalarInt)(const HxScalarInt& a);
00307 typedef HxScalarInt (*HxBpoScalarInt)(const HxScalarInt& a1, const HxScalarInt& a2);
00308
00309 inline STD_OSTREAM&
00310 operator<<(STD_OSTREAM& os, const HxScalarInt v)
00311 {
00312 return v.put(os);
00313 }
00314
00315 inline
00316 HxScalarInt::HxScalarInt()
00317 {
00318 }
00319
00320 inline
00321 HxScalarInt::HxScalarInt(int v)
00322 {
00323 _value = v;
00324 }
00325
00326 inline
00327 HxScalarInt::HxScalarInt(const HxScalarInt& v)
00328 {
00329 _value = v._value;
00330 }
00331
00332 inline void*
00333 HxScalarInt::operator new(size_t size, void *m)
00334 {
00335 return m ? m : new char[size];
00336 }
00337
00338 inline int
00339 HxScalarInt::dim() const
00340 {
00341 return 1;
00342 }
00343
00344 inline int
00345 HxScalarInt::x() const
00346 {
00347 return _value;
00348 }
00349
00350 inline int
00351 HxScalarInt::getValue(int) const
00352 {
00353 return _value;
00354 }
00355
00356 inline void
00357 HxScalarInt::setValue(int, int value)
00358 {
00359 _value = value;
00360 }
00361
00362
00363
00364
00365
00366
00367
00368 inline int
00369 HxScalarInt::operator==(const HxScalarInt& v) const
00370 {
00371 return (_value == v._value);
00372 }
00373
00374 inline int
00375 HxScalarInt::operator!=(const HxScalarInt& v) const
00376 {
00377 return (_value != v._value);
00378 }
00379
00380 inline int
00381 HxScalarInt::operator<(const HxScalarInt& v) const
00382 {
00383 return (_value < v._value);
00384 }
00385
00386 inline int
00387 HxScalarInt::operator<=(const HxScalarInt& v) const
00388 {
00389 return (_value <= v._value);
00390 }
00391
00392 inline int
00393 HxScalarInt::operator>(const HxScalarInt& v) const
00394 {
00395 return (_value > v._value);
00396 }
00397
00398 inline int
00399 HxScalarInt::operator>=(const HxScalarInt& v) const
00400 {
00401 return (_value >= v._value);
00402 }
00403
00404 inline HxScalarInt
00405 HxScalarInt::operator-() const
00406 {
00407 return HxScalarInt(-_value);
00408 }
00409
00410 inline HxScalarInt
00411 HxScalarInt::complement() const
00412 {
00413 return HxScalarInt(~_value);
00414 }
00415
00416 inline HxScalarInt
00417 HxScalarInt::abs() const
00418 {
00419 return HxScalarInt(::abs(_value));
00420 }
00421
00422 inline HxScalarInt
00423 HxScalarInt::ceil() const
00424 {
00425 return *this;
00426 }
00427
00428 inline HxScalarInt
00429 HxScalarInt::floor() const
00430 {
00431 return *this;
00432 }
00433
00434 inline HxScalarInt
00435 HxScalarInt::round() const
00436 {
00437 return *this;
00438 }
00439
00440 inline HxScalarInt
00441 HxScalarInt::sum() const
00442 {
00443 return *this;
00444 }
00445
00446 inline HxScalarInt
00447 HxScalarInt::product() const
00448 {
00449 return *this;
00450 }
00451
00452 inline HxScalarInt
00453 HxScalarInt::min() const
00454 {
00455 return *this;
00456 }
00457
00458 inline HxScalarInt
00459 HxScalarInt::max() const
00460 {
00461 return *this;
00462 }
00463
00464 inline HxScalarInt
00465 HxScalarInt::norm1() const
00466 {
00467 return HxScalarInt(::abs(_value));
00468 }
00469
00470 inline HxScalarInt
00471 HxScalarInt::normInf() const
00472 {
00473 return HxScalarInt(::abs(_value));
00474 }
00475
00476 inline HxScalarInt&
00477 HxScalarInt::operator+=(const HxScalarInt& v)
00478 {
00479 _value += v._value;
00480 return *this;
00481 }
00482
00483 inline HxScalarInt&
00484 HxScalarInt::operator-=(const HxScalarInt& v)
00485 {
00486 _value -= v._value;
00487 return *this;
00488 }
00489
00490 inline HxScalarInt&
00491 HxScalarInt::operator*=(const HxScalarInt& v)
00492 {
00493 _value *= v._value;
00494 return *this;
00495 }
00496
00497 inline HxScalarInt&
00498 HxScalarInt::operator/=(const HxScalarInt& v)
00499 {
00500 _value /= v._value;
00501 return *this;
00502 }
00503
00504 inline HxScalarInt
00505 operator+(const HxScalarInt& v1, const HxScalarInt& v2)
00506 {
00507 return HxScalarInt(v1._value + v2._value);
00508 }
00509
00510 inline HxScalarInt
00511 operator-(const HxScalarInt& v1, const HxScalarInt& v2)
00512 {
00513 return HxScalarInt(v1._value - v2._value);
00514 }
00515
00516 inline HxScalarInt
00517 operator*(const HxScalarInt& v1, const HxScalarInt& v2)
00518 {
00519 return HxScalarInt(v1._value * v2._value);
00520 }
00521
00522 inline HxScalarInt
00523 operator/(const HxScalarInt& v1, const HxScalarInt& v2)
00524 {
00525 return HxScalarInt(v1._value / v2._value);
00526 }
00527
00528 inline HxScalarInt
00529 HxScalarInt::min(const HxScalarInt& v) const
00530 {
00531 return (operator<(v)) ? (*this) : v;
00532 }
00533
00534 inline HxScalarInt&
00535 HxScalarInt::minAssign(const HxScalarInt& v)
00536 {
00537 if (operator<(v))
00538 return *this;
00539 operator=(v);
00540 return *this;
00541 }
00542
00543 inline HxScalarInt
00544 HxScalarInt::max(const HxScalarInt& v) const
00545 {
00546 return (operator>(v)) ? (*this) : v;
00547 }
00548
00549 inline HxScalarInt&
00550 HxScalarInt::maxAssign(const HxScalarInt& v)
00551 {
00552 if (operator>(v))
00553 return *this;
00554 operator=(v);
00555 return *this;
00556 }
00557
00558 inline HxScalarInt
00559 HxScalarInt::inf(const HxScalarInt& v) const
00560 {
00561 return (operator<(v)) ? (*this) : v;
00562 }
00563
00564 inline HxScalarInt&
00565 HxScalarInt::infAssign(const HxScalarInt& v)
00566 {
00567 _value = (_value < v._value) ? _value : v._value;
00568 return *this;
00569 }
00570
00571 inline HxScalarInt
00572 HxScalarInt::sup(const HxScalarInt& v) const
00573 {
00574 return (operator>(v)) ? (*this) : v;
00575 }
00576
00577 inline HxScalarInt&
00578 HxScalarInt::supAssign(const HxScalarInt& v)
00579 {
00580 _value = (_value > v._value) ? _value : v._value;
00581 return *this;
00582 }
00583
00584 inline HxScalarInt
00585 HxScalarInt::pow(const HxScalarInt& v) const
00586 {
00587 return HxScalarInt((int) (::pow(_value, v._value) + 0.5));
00588 }
00589
00590 inline HxScalarInt
00591 HxScalarInt::mod(const HxScalarInt& v) const
00592 {
00593 return HxScalarInt(_value % v._value);
00594 }
00595
00596 inline HxScalarInt
00597 HxScalarInt::and(const HxScalarInt& v) const
00598 {
00599 return HxScalarInt(_value & v._value);
00600 }
00601
00602 inline HxScalarInt
00603 HxScalarInt::or(const HxScalarInt& v) const
00604 {
00605 return HxScalarInt(_value | v._value);
00606 }
00607
00608 inline HxScalarInt
00609 HxScalarInt::xor(const HxScalarInt& v) const
00610 {
00611 return HxScalarInt(_value ^ v._value);
00612 }
00613
00614 inline HxScalarInt
00615 HxScalarInt::leftShift(const HxScalarInt& v) const
00616 {
00617 return HxScalarInt(_value << v._value);
00618 }
00619
00620 inline HxScalarInt
00621 HxScalarInt::rightShift(const HxScalarInt& v) const
00622 {
00623 return HxScalarInt(_value >> v._value);
00624 }
00625
00626 inline HxScalarInt
00627 HxScalarInt::cross(const HxScalarInt&) const
00628 {
00629 return 0;
00630 }
00631
00632 inline HxString
00633 HxScalarInt::toString() const
00634 {
00635 return makeString(_value);
00636 }
00637
00638 #endif