1 #ifndef SimTK_SIMMATRIX_NEGATOR_H_
2 #define SimTK_SIMMATRIX_NEGATOR_H_
63 template <
class T>
class CNT;
64 template <
class N>
class NTraits;
65 template <
class N>
class negator;
74 template <
class NUMBER>
155 SignInterpretation = -1
183 inline bool isNaN()
const;
186 inline bool isInf()
const;
228 template <
class P>
negator(
const std::complex<P>& t) {v = -N(t);}
236 {
return reinterpret_cast<const negator<N>&
>(val); }
242 operator N()
const {
return N(-v); }
244 template <
class P>
negator& operator =(
const P& t) { v = -t;
return *
this; }
255 { v = -t;
return *
this; }
257 { v += -t;
return *
this; }
259 { v -= -t;
return *
this; }
274 template <
class P>
inline bool
276 template <
class P>
inline bool
287 template <
class P>
inline bool
289 template <
class P>
inline bool
300 template <
class P>
inline bool
302 template <
class P>
inline bool
307 template <
class N>
inline bool
309 template <
class N>
inline bool
311 template <
class N>
inline bool
325 template <
class DEST,
class SRC>
static inline const DEST&
326 negRecast(
const SRC& s) {
return reinterpret_cast<const DEST&
>(s); }
329 template <
class A,
class B>
inline typename negator<A>::template Result<B>::Add
331 {
return negRecast<typename negator<A>::template Result<B>::Add>(r-(-l));}
332 template <
class A,
class B>
inline typename CNT<A>::template Result<negator<B> >::Add
334 {
return negRecast<typename CNT<A>::template Result<negator<B> >::Add>(l-(-r));}
336 template <
class A,
class B>
inline typename negator<A>::template Result<negator<B> >::Add
338 {
return negRecast<typename negator<A>::template Result<negator<B> >::Add>(r-(-l)); }
341 template <
class A,
class B>
inline typename negator<A>::template Result<B>::Sub
343 {
return negRecast<typename negator<A>::template Result<B>::Sub>(r+(-l));}
344 template <
class A,
class B>
inline typename CNT<A>::template Result<negator<B> >::Sub
346 {
return negRecast<typename CNT<A>::template Result<negator<B> >::Sub>(l+(-r));}
348 template <
class A,
class B>
inline typename negator<A>::template Result<negator<B> >::Sub
350 {
return negRecast<typename negator<A>::template Result<negator<B> >::Sub>(r+(-l));}
353 template <
class A,
class B>
inline typename negator<A>::template Result<B>::Mul
355 {
return negRecast<typename negator<A>::template Result<B>::Mul>((-l)*r);}
356 template <
class A,
class B>
inline typename CNT<A>::template Result<negator<B> >::Mul
358 {
return negRecast<typename CNT<A>::template Result<negator<B> >::Mul>(l*(-r));}
360 template <
class A,
class B>
inline typename negator<A>::template Result<negator<B> >::Mul
362 {
return negRecast<typename negator<A>::template Result<negator<B> >::Mul>((-l)*r);}
365 template <
class A,
class B>
inline typename negator<A>::template Result<B>::Dvd
367 {
return negRecast<typename negator<A>::template Result<B>::Dvd>((-l)/r);}
368 template <
class A,
class B>
inline typename CNT<A>::template Result<negator<B> >::Dvd
370 {
return negRecast<typename CNT<A>::template Result<negator<B> >::Dvd>(l/(-r));}
372 template <
class A,
class B>
inline typename negator<A>::template Result<negator<B> >::Dvd
374 {
return negRecast<typename negator<A>::template Result<negator<B> >::Dvd>((-l)/r);}
377 template <
class A,
class B>
inline bool
379 template <
class A,
class B>
inline bool
381 template <
class A,
class B>
inline bool
385 template <
class A,
class B>
inline bool
387 template <
class A,
class B>
inline bool
389 template <
class A,
class B>
inline bool
393 template <
class NUM,
class CHAR,
class TRAITS>
inline std::basic_istream<CHAR,TRAITS>&
395 NUM z; is >> z; nn=z;
398 template <
class NUM,
class CHAR,
class TRAITS>
inline std::basic_ostream<CHAR,TRAITS>&
399 operator<<(std::basic_ostream<CHAR,TRAITS>& os,
const negator<NUM>& nn) {
400 return os << NUM(nn);
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:224
Specialized information about Composite Numerical Types which allows us to define appropriate templat...
Definition: CompositeNumericalTypes.h:136
static bool isNumericallyEqual(const K &t1, const K2 &t2)
CNTs are expected to support an "==" operator for exact, bitwise equality.
Definition: CompositeNumericalTypes.h:264
K::TNeg TNeg
Definition: CompositeNumericalTypes.h:139
Definition: NTraits.h:436
SimTK::conjugate<R> should be instantiated only for float, double.
Definition: conjugate.h:178
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition: negator.h:75
negator< N > ULessScalar
Definition: negator.h:105
negator< N > TElement
Definition: negator.h:93
negator< N > TRow
Definition: negator.h:94
negator & operator-=(const negator< NN > &t)
Definition: negator.h:258
negator< N > TPosTrans
Definition: negator.h:90
bool isNumericallyEqual(const T2 &t2, double tol) const
This is the generic case (see above) but with an explicitly-provided tolerance.
Definition: negator.h:202
negator & operator-=(const P &t)
Definition: negator.h:246
negator< N > * updData()
Definition: negator.h:158
negator & operator+=(const negator< NN > &t)
Definition: negator.h:256
TSqrt sqrt() const
Definition: negator.h:166
N operator+() const
Definition: negator.h:240
CNT< NInvert >::TNeg TInvert
Definition: negator.h:100
CNT< NImag >::TNeg TImag
Definition: negator.h:87
negator()
Definition: negator.h:211
negator(const std::complex< P > &t)
Definition: negator.h:228
const N & operator-() const
Definition: negator.h:238
const negator< N > * getData() const
Definition: negator.h:157
CNT< NHerm >::TNeg THerm
Definition: negator.h:89
ScalarNormSq scalarNormSqr() const
Definition: negator.h:165
static negator< N > getInfinity()
Definition: negator.h:178
negator< N > Scalar
Definition: negator.h:104
negator & operator+=(const P &t)
Definition: negator.h:245
bool isFinite() const
Returns true if the negated value is finite (i.e., not NaN or Inf).
Definition: negator.h:308
NTraits< N >::TStandard TNormalize
Definition: negator.h:101
NTraits< N >::Precision Precision
Definition: negator.h:108
negator< N > T
Definition: negator.h:83
negator(const negator &n)
Definition: negator.h:216
bool isNaN() const
Returns true if the negated value contains a NaN.
Definition: negator.h:310
bool isNumericallyEqual(const negator< N2 > &t2, double tol) const
This is the partially specialized case again (see above) but with an explicitly-provided tolerance.
Definition: negator.h:207
NTraits< N >::TSqTHerm TSqTHerm
Definition: negator.h:92
negator & operator=(const negator &n)
Definition: negator.h:217
NTraits< N >::ScalarNormSq ScalarNormSq
Definition: negator.h:109
static negator< N > getNaN()
Definition: negator.h:177
TAbs abs() const
Definition: negator.h:167
static const negator< N > & recast(const N &val)
Definition: negator.h:235
negator(int t)
Definition: negator.h:222
TStandard standardize() const
Definition: negator.h:168
bool isInf() const
Returns true if the negated value contains an Inf or -Inf and does not contain a NaN.
Definition: negator.h:312
NTraits< N >::TSqrt TSqrt
Definition: negator.h:97
bool isNumericallyEqual(const T2 &t2) const
In the generic case we'll perform the negation here to get a number, and then delegate to the other t...
Definition: negator.h:192
negator< N > TCol
Definition: negator.h:95
negator & operator/=(const P &t)
Definition: negator.h:248
TInvert invert() const
Definition: negator.h:175
TNormalize normalize() const
Definition: negator.h:169
NUMBER TNeg
Definition: negator.h:84
TReal & real()
Definition: negator.h:161
NTraits< N >::TSqHermT TSqHermT
Definition: negator.h:91
CNT< NReal >::TNeg TReal
Definition: negator.h:86
static double getDefaultTolerance()
Definition: negator.h:188
negator(const float &t)
Definition: negator.h:223
TImag & imag()
Definition: negator.h:163
N & operator-()
Definition: negator.h:239
CNT< NComplex >::TNeg TComplex
Definition: negator.h:88
const TReal & real() const
Definition: negator.h:160
NUMBER TWithoutNegator
Definition: negator.h:85
negator(const conjugate< P > &t)
Definition: negator.h:229
const TImag & imag() const
Definition: negator.h:162
negator(const double &t)
Definition: negator.h:224
NTraits< N >::StdNumber StdNumber
Definition: negator.h:107
NUMBER Number
Definition: negator.h:106
NTraits< N >::TStandard TStandard
Definition: negator.h:99
negator & operator*=(const P &t)
Definition: negator.h:247
bool isNumericallyEqual(const negator< N2 > &t2) const
In this partial specialization we know that both types have negators so we can just compare the under...
Definition: negator.h:198
NTraits< N >::TAbs TAbs
Definition: negator.h:98
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
Matrix_< typename CNT< E1 >::template Result< E2 >::Sub > operator-(const MatrixBase< E1 > &l, const MatrixBase< E2 > &r)
Definition: BigMatrix.h:584
Matrix_< E > operator/(const MatrixBase< E > &l, const typename CNT< E >::StdNumber &r)
Definition: BigMatrix.h:613
bool isInf(const negator< float > &x)
Definition: negator.h:298
std::ostream & operator<<(std::ostream &o, const ContactForce &f)
Definition: CompliantContactSubsystem.h:387
std::basic_istream< CHAR, TRAITS > & operator>>(std::basic_istream< CHAR, TRAITS > &is, conjugate< R > &c)
Definition: conjugate.h:505
Matrix_< typename CNT< E1 >::template Result< E2 >::Add > operator+(const MatrixBase< E1 > &l, const MatrixBase< E2 > &r)
Definition: BigMatrix.h:568
static const DEST & negRecast(const SRC &s)
Definition: negator.h:326
RowVectorBase< typename CNT< ELEM >::TAbs > abs(const RowVectorBase< ELEM > &v)
Definition: VectorMath.h:120
@ SCALAR_DEPTH
Definition: CompositeNumericalTypes.h:116
bool isNumericallyEqual(const float &a, const float &b, double tol=RTraits< float >::getDefaultTolerance())
Compare two floats for approximate equality.
Definition: NTraits.h:293
bool isNaN(const negator< float > &x)
Definition: negator.h:272
bool isFinite(const negator< float > &x)
Definition: negator.h:285
const negator< float > & imag(const conjugate< float > &c)
Definition: conjugate.h:483
Matrix_< E > operator*(const MatrixBase< E > &l, const typename CNT< E >::StdNumber &r)
Definition: BigMatrix.h:605
bool operator==(const PhiMatrix &p1, const PhiMatrix &p2)
Definition: SpatialAlgebra.h:791
bool operator!=(const L &left, const R &right)
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:645
const float & real(const conjugate< float > &c)
Definition: conjugate.h:482
Definition: negator.h:119
CNT< PDvd >::TNeg Dvd
Definition: negator.h:129
CNT< PMul >::TNeg Mul
Definition: negator.h:128
CNT< PSub >::TNeg Sub
Definition: negator.h:131
PAdd Add
Definition: negator.h:130
Definition: negator.h:135
P Type
Definition: negator.h:136