00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxScalarDouble_h
00012 #define HxScalarDouble_h
00013
00014 #include "HxIoFwd.h"
00015 #include "HxMath.h"
00016 #include "HxString.h"
00017
00018 #undef min
00019 #undef max
00020
00021 class HxScalarInt;
00022 class HxVec2Int;
00023 class HxVec2Double;
00024 class HxVec3Int;
00025 class HxVec3Double;
00026 class HxComplex;
00027
00028
00032 class L_HXBASIS HxScalarDouble {
00033 public:
00034
00036
00038 HxScalarDouble();
00039
00041 HxScalarDouble(double v);
00042
00044 HxScalarDouble(const HxScalarDouble& rhs);
00046
00047 void* operator new(size_t, void* = 0);
00048
00049 HxScalarDouble& operator=(const double& v);
00050 HxScalarDouble& operator=(const HxScalarDouble& rhs);
00051
00053
00056 int dim() const;
00057
00059 double x() const;
00060
00062 double getValue(int dimension) const;
00063 void setValue(int dimension, double value);
00065
00067
00068
00069
00071 operator HxScalarInt() const;
00072
00074 operator HxVec2Int() const;
00075
00077 operator HxVec2Double() const;
00078
00080 operator HxVec3Int() const;
00081
00083 operator HxVec3Double() const;
00084
00086 operator HxComplex() const;
00088
00090
00094 int operator==(const HxScalarDouble& v) const;
00095
00097 int operator!=(const HxScalarDouble& v) const;
00098
00100 int operator< (const HxScalarDouble& v) const;
00101
00103 int operator<=(const HxScalarDouble& v) const;
00104
00106 int operator> (const HxScalarDouble& v) const;
00107
00109 int operator>=(const HxScalarDouble& v) const;
00110
00115 static const HxScalarDouble SMALL_VAL;
00116
00121 static const HxScalarDouble LARGE_VAL;
00123
00125
00129 HxScalarDouble operator-() const;
00130
00132 HxScalarDouble complement() const;
00133
00135 HxScalarDouble abs() const;
00136
00138 HxScalarDouble ceil() const;
00139
00141 HxScalarDouble floor() const;
00142
00144 HxScalarDouble round() const;
00145
00147 HxScalarDouble sum() const;
00148
00150 HxScalarDouble product() const;
00151
00153 HxScalarDouble min() const;
00154
00156 HxScalarDouble max() const;
00157
00159 HxScalarDouble norm1() const;
00160
00162 HxScalarDouble norm2() const;
00163
00165 HxScalarDouble normInf() const;
00166
00168 HxScalarDouble sqrt() const;
00169
00171 HxScalarDouble sin() const;
00172
00174 HxScalarDouble cos() const;
00175
00177 HxScalarDouble tan() const;
00178
00180 HxScalarDouble asin() const;
00181
00183 HxScalarDouble acos() const;
00184
00186 HxScalarDouble atan() const;
00187
00189 HxScalarDouble atan2() const;
00190
00192 HxScalarDouble sinh() const;
00193
00195 HxScalarDouble cosh() const;
00196
00198 HxScalarDouble tanh() const;
00199
00201 HxScalarDouble exp() const;
00202
00204 HxScalarDouble log() const;
00205
00207 HxScalarDouble log10() const;
00209
00211
00215 HxScalarDouble& operator+=(const HxScalarDouble& v);
00216
00218 HxScalarDouble& operator-=(const HxScalarDouble& v);
00219
00221 HxScalarDouble& operator*=(const HxScalarDouble& v);
00222
00224 HxScalarDouble& operator/=(const HxScalarDouble& v);
00225
00226
00228 friend HxScalarDouble operator+(const HxScalarDouble& v1,
00229 const HxScalarDouble& v2);
00230
00232 friend HxScalarDouble operator-(const HxScalarDouble& v1,
00233 const HxScalarDouble& v2);
00234
00236 friend HxScalarDouble operator*(const HxScalarDouble& v1,
00237 const HxScalarDouble& v2);
00238
00240 friend HxScalarDouble operator/(const HxScalarDouble& v1,
00241 const HxScalarDouble& v2);
00242
00243
00245 HxScalarDouble min(const HxScalarDouble& v) const;
00246
00248 HxScalarDouble& minAssign(const HxScalarDouble& v);
00249
00251 HxScalarDouble max(const HxScalarDouble& v) const;
00252
00254 HxScalarDouble& maxAssign(const HxScalarDouble& v);
00255
00257 HxScalarDouble inf(const HxScalarDouble& v) const;
00258
00260 HxScalarDouble& infAssign(const HxScalarDouble& v);
00261
00263 HxScalarDouble sup(const HxScalarDouble& v) const;
00264
00266 HxScalarDouble& supAssign(const HxScalarDouble& v);
00267
00269 HxScalarDouble pow(const HxScalarDouble& v) const;
00270
00272 HxScalarDouble mod(const HxScalarDouble& v) const;
00273
00275 HxScalarDouble and(const HxScalarDouble& v) const;
00276
00278 HxScalarDouble or(const HxScalarDouble& v) const;
00279
00281 HxScalarDouble xor(const HxScalarDouble& v) const;
00282
00284 HxScalarDouble leftShift(const HxScalarDouble& v) const;
00285
00287 HxScalarDouble rightShift(const HxScalarDouble& v) const;
00288
00290 HxScalarDouble dot(const HxScalarDouble& v) const;
00291
00293 HxScalarDouble cross(const HxScalarDouble& v) const;
00295
00297
00299 STD_OSTREAM& put(STD_OSTREAM& os) const;
00300
00302 HxString toString() const;
00304
00305 private:
00306 double _value;
00307 };
00308
00309 typedef HxScalarDouble (*HxUpoScalarDouble)(const HxScalarDouble& a);
00310 typedef HxScalarDouble (*HxBpoScalarDouble)(const HxScalarDouble& a1, const HxScalarDouble& a2);
00311
00312 inline STD_OSTREAM&
00313 operator<<(STD_OSTREAM& os, const HxScalarDouble v)
00314 {
00315 return v.put(os);
00316 }
00317
00318 inline
00319 HxScalarDouble::HxScalarDouble()
00320 {
00321 }
00322
00323 inline
00324 HxScalarDouble::HxScalarDouble(double v)
00325 : _value(v)
00326 {
00327 }
00328
00329 inline
00330 HxScalarDouble::HxScalarDouble(const HxScalarDouble& rhs)
00331 : _value(rhs._value)
00332 {
00333 }
00334
00335 inline void*
00336 HxScalarDouble::operator new(size_t size, void *m)
00337 {
00338 return m ? m : new char[size];
00339 }
00340
00341 inline HxScalarDouble&
00342 HxScalarDouble::operator=(const double& v)
00343 {
00344 _value = v;
00345 return *this;
00346 }
00347
00348 inline HxScalarDouble&
00349 HxScalarDouble::operator=(const HxScalarDouble& rhs)
00350 {
00351 _value = rhs._value;
00352 return *this;
00353 }
00354
00355 inline int
00356 HxScalarDouble::dim() const
00357 {
00358 return 1;
00359 }
00360
00361 inline double
00362 HxScalarDouble::x() const
00363 {
00364 return _value;
00365 }
00366
00367 inline double
00368 HxScalarDouble::getValue(int) const
00369 {
00370 return _value;
00371 }
00372
00373 inline void
00374 HxScalarDouble::setValue(int, double value)
00375 {
00376 _value = value;
00377 }
00378
00379
00380
00381
00382
00383
00384
00385 inline int
00386 HxScalarDouble::operator==(const HxScalarDouble& v) const
00387 {
00388 return (_value == v._value);
00389 }
00390
00391 inline int
00392 HxScalarDouble::operator!=(const HxScalarDouble& v) const
00393 {
00394 return (_value != v._value);
00395 }
00396
00397 inline int
00398 HxScalarDouble::operator<(const HxScalarDouble& v) const
00399 {
00400 return (_value < v._value);
00401 }
00402
00403 inline int
00404 HxScalarDouble::operator<=(const HxScalarDouble& v) const
00405 {
00406 return (_value <= v._value);
00407 }
00408
00409 inline int
00410 HxScalarDouble::operator>(const HxScalarDouble& v) const
00411 {
00412 return (_value > v._value);
00413 }
00414
00415 inline int
00416 HxScalarDouble::operator>=(const HxScalarDouble& v) const
00417 {
00418 return (_value >= v._value);
00419 }
00420
00421 inline HxScalarDouble
00422 HxScalarDouble::operator-() const
00423 {
00424 return HxScalarDouble(-_value);
00425 }
00426
00427 inline HxScalarDouble
00428 HxScalarDouble::complement() const
00429 {
00430 return HxScalarDouble(-_value);
00431 }
00432
00433 inline HxScalarDouble
00434 HxScalarDouble::abs() const
00435 {
00436 return HxScalarDouble(fabs(_value));
00437 }
00438
00439 inline HxScalarDouble
00440 HxScalarDouble::ceil() const
00441 {
00442 return HxScalarDouble(::ceil(_value));
00443 }
00444
00445 inline HxScalarDouble
00446 HxScalarDouble::floor() const
00447 {
00448 return HxScalarDouble(::floor(_value));
00449 }
00450
00451 inline HxScalarDouble
00452 HxScalarDouble::round() const
00453 {
00454 return HxScalarDouble((int) (_value + ((_value >= 0) ? 0.5 : -0.5)));
00455 }
00456
00457 inline HxScalarDouble
00458 HxScalarDouble::sum() const
00459 {
00460 return *this;
00461 }
00462
00463 inline HxScalarDouble
00464 HxScalarDouble::product() const
00465 {
00466 return *this;
00467 }
00468
00469 inline HxScalarDouble
00470 HxScalarDouble::min() const
00471 {
00472 return *this;
00473 }
00474
00475 inline HxScalarDouble
00476 HxScalarDouble::max() const
00477 {
00478 return *this;
00479 }
00480
00481 inline HxScalarDouble
00482 HxScalarDouble::norm1() const
00483 {
00484 return HxScalarDouble(fabs(_value));
00485 }
00486
00487 inline HxScalarDouble
00488 HxScalarDouble::normInf() const
00489 {
00490 return HxScalarDouble(fabs(_value));
00491 }
00492
00493 inline HxScalarDouble
00494 HxScalarDouble::sqrt() const
00495 {
00496 return HxScalarDouble(::sqrt(_value));
00497 }
00498
00499 inline HxScalarDouble
00500 HxScalarDouble::sin() const
00501 {
00502 return HxScalarDouble(::sin(_value));
00503 }
00504
00505 inline HxScalarDouble
00506 HxScalarDouble::cos() const
00507 {
00508 return HxScalarDouble(::cos(_value));
00509 }
00510
00511 inline HxScalarDouble
00512 HxScalarDouble::tan() const
00513 {
00514 return HxScalarDouble(::tan(_value));
00515 }
00516
00517 inline HxScalarDouble
00518 HxScalarDouble::asin() const
00519 {
00520 return HxScalarDouble(::asin(_value));
00521 }
00522
00523 inline HxScalarDouble
00524 HxScalarDouble::acos() const
00525 {
00526 return HxScalarDouble(::acos(_value));
00527 }
00528
00529 inline HxScalarDouble
00530 HxScalarDouble::atan() const
00531 {
00532 return HxScalarDouble(::atan(_value));
00533 }
00534
00535 inline HxScalarDouble
00536 HxScalarDouble::sinh() const
00537 {
00538 return HxScalarDouble(::sinh(_value));
00539 }
00540
00541 inline HxScalarDouble
00542 HxScalarDouble::cosh() const
00543 {
00544 return HxScalarDouble(::cosh(_value));
00545 }
00546
00547 inline HxScalarDouble
00548 HxScalarDouble::tanh() const
00549 {
00550 return HxScalarDouble(::tanh(_value));
00551 }
00552
00553 inline HxScalarDouble
00554 HxScalarDouble::exp() const
00555 {
00556 return HxScalarDouble(::exp(_value));
00557 }
00558
00559 inline HxScalarDouble
00560 HxScalarDouble::log() const
00561 {
00562 return HxScalarDouble(::log(_value));
00563 }
00564
00565 inline HxScalarDouble
00566 HxScalarDouble::log10() const
00567 {
00568 return HxScalarDouble(::log10(_value));
00569 }
00570
00571 inline HxScalarDouble&
00572 HxScalarDouble::operator+=(const HxScalarDouble& v)
00573 {
00574 _value += v._value;
00575 return *this;
00576 }
00577
00578 inline HxScalarDouble&
00579 HxScalarDouble::operator-=(const HxScalarDouble& v)
00580 {
00581 _value -= v._value;
00582 return *this;
00583 }
00584
00585 inline HxScalarDouble&
00586 HxScalarDouble::operator*=(const HxScalarDouble& v)
00587 {
00588 _value *= v._value;
00589 return *this;
00590 }
00591
00592 inline HxScalarDouble&
00593 HxScalarDouble::operator/=(const HxScalarDouble& v)
00594 {
00595 _value /= v._value;
00596 return *this;
00597 }
00598
00599 inline HxScalarDouble
00600 operator+(const HxScalarDouble& v1, const HxScalarDouble& v2)
00601 {
00602 return HxScalarDouble(v1._value + v2._value);
00603 }
00604
00605 inline HxScalarDouble
00606 operator-(const HxScalarDouble& v1, const HxScalarDouble& v2)
00607 {
00608 return HxScalarDouble(v1._value - v2._value);
00609 }
00610
00611 inline HxScalarDouble
00612 operator*(const HxScalarDouble& v1, const HxScalarDouble& v2)
00613 {
00614 return HxScalarDouble(v1._value * v2._value);
00615 }
00616
00617 inline HxScalarDouble
00618 operator/(const HxScalarDouble& v1, const HxScalarDouble& v2)
00619 {
00620 return HxScalarDouble(v1._value / v2._value);
00621 }
00622
00623 inline HxScalarDouble
00624 HxScalarDouble::min(const HxScalarDouble& v) const
00625 {
00626 return (operator<(v)) ? (*this) : v;
00627 }
00628
00629 inline HxScalarDouble&
00630 HxScalarDouble::minAssign(const HxScalarDouble& v)
00631 {
00632 if (operator<(v))
00633 return *this;
00634 operator=(v);
00635 return *this;
00636 }
00637
00638 inline HxScalarDouble
00639 HxScalarDouble::max(const HxScalarDouble& v) const
00640 {
00641 return (operator>(v)) ? (*this) : v;
00642 }
00643
00644 inline HxScalarDouble&
00645 HxScalarDouble::maxAssign(const HxScalarDouble& v)
00646 {
00647 if (operator>(v))
00648 return *this;
00649 operator=(v);
00650 return *this;
00651 }
00652
00653 inline HxScalarDouble
00654 HxScalarDouble::inf(const HxScalarDouble& v) const
00655 {
00656 return (operator<(v)) ? (*this) : v;
00657 }
00658
00659 inline HxScalarDouble&
00660 HxScalarDouble::infAssign(const HxScalarDouble& v)
00661 {
00662 _value = (_value < v._value) ? _value : v._value;
00663 return *this;
00664 }
00665
00666 inline HxScalarDouble
00667 HxScalarDouble::sup(const HxScalarDouble& v) const
00668 {
00669 return (operator>(v)) ? (*this) : v;
00670 }
00671
00672 inline HxScalarDouble&
00673 HxScalarDouble::supAssign(const HxScalarDouble& v)
00674 {
00675 _value = (_value > v._value) ? _value : v._value;
00676 return *this;
00677 }
00678
00679 inline HxScalarDouble
00680 HxScalarDouble::pow(const HxScalarDouble& v) const
00681 {
00682 return HxScalarDouble(::pow(_value, v._value));
00683 }
00684
00685 inline HxScalarDouble
00686 HxScalarDouble::mod(const HxScalarDouble&) const
00687 {
00688 return (*this);
00689 }
00690
00691 inline HxScalarDouble
00692 HxScalarDouble::and(const HxScalarDouble&) const
00693 {
00694 return (*this);
00695 }
00696
00697 inline HxScalarDouble
00698 HxScalarDouble::or(const HxScalarDouble&) const
00699 {
00700 return (*this);
00701 }
00702
00703 inline HxScalarDouble
00704 HxScalarDouble::xor(const HxScalarDouble&) const
00705 {
00706 return (*this);
00707 }
00708
00709 inline HxScalarDouble
00710 HxScalarDouble::leftShift(const HxScalarDouble&) const
00711 {
00712 return (*this);
00713 }
00714
00715 inline HxScalarDouble
00716 HxScalarDouble::rightShift(const HxScalarDouble&) const
00717 {
00718 return (*this);
00719 }
00720
00721 inline HxScalarDouble
00722 HxScalarDouble::cross(const HxScalarDouble&) const
00723 {
00724 return HxScalarDouble(0.0);
00725 }
00726
00727 inline HxString
00728 HxScalarDouble::toString() const
00729 {
00730 return makeString(_value);
00731 }
00732
00733 #endif