Blame Imath/ImathShear.h

Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
//
Packit 8dc392
// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas
Packit 8dc392
// Digital Ltd. LLC
Packit 8dc392
// 
Packit 8dc392
// All rights reserved.
Packit 8dc392
// 
Packit 8dc392
// Redistribution and use in source and binary forms, with or without
Packit 8dc392
// modification, are permitted provided that the following conditions are
Packit 8dc392
// met:
Packit 8dc392
// *       Redistributions of source code must retain the above copyright
Packit 8dc392
// notice, this list of conditions and the following disclaimer.
Packit 8dc392
// *       Redistributions in binary form must reproduce the above
Packit 8dc392
// copyright notice, this list of conditions and the following disclaimer
Packit 8dc392
// in the documentation and/or other materials provided with the
Packit 8dc392
// distribution.
Packit 8dc392
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 8dc392
// its contributors may be used to endorse or promote products derived
Packit 8dc392
// from this software without specific prior written permission. 
Packit 8dc392
// 
Packit 8dc392
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 8dc392
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 8dc392
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 8dc392
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 8dc392
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 8dc392
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 8dc392
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 8dc392
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 8dc392
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 8dc392
//
Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
Packit 8dc392
Packit 8dc392
Packit 8dc392
#ifndef INCLUDED_IMATHSHEAR_H
Packit 8dc392
#define INCLUDED_IMATHSHEAR_H
Packit 8dc392
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
//
Packit 8dc392
//	Shear6 class template.
Packit 8dc392
//
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
Packit 8dc392
#include "ImathExc.h"
Packit 8dc392
#include "ImathLimits.h"
Packit 8dc392
#include "ImathMath.h"
Packit 8dc392
#include "ImathVec.h"
Packit 8dc392
#include "ImathNamespace.h"
Packit 8dc392
#include <iostream>
Packit 8dc392
Packit 8dc392
Packit 8dc392
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
Packit 8dc392
Packit 8dc392
template <class T> class Shear6
Packit 8dc392
{
Packit 8dc392
  public:
Packit 8dc392
Packit 8dc392
    //-------------------
Packit 8dc392
    // Access to elements
Packit 8dc392
    //-------------------
Packit 8dc392
Packit 8dc392
    T			xy, xz, yz, yx, zx, zy;
Packit 8dc392
Packit 8dc392
    T &			operator [] (int i);
Packit 8dc392
    const T &		operator [] (int i) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //-------------
Packit 8dc392
    // Constructors
Packit 8dc392
    //-------------
Packit 8dc392
Packit 8dc392
    Shear6 ();			   // (0 0 0 0 0 0)
Packit 8dc392
    Shear6 (T XY, T XZ, T YZ);	   // (XY XZ YZ 0 0 0)
Packit 8dc392
    Shear6 (const Vec3<T> &v);     // (v.x v.y v.z 0 0 0)
Packit 8dc392
    template <class S>             // (v.x v.y v.z 0 0 0)
Packit 8dc392
	Shear6 (const Vec3<S> &v);
Packit 8dc392
    Shear6 (T XY, T XZ, T YZ,      // (XY XZ YZ YX ZX ZY)
Packit 8dc392
	    T YX, T ZX, T ZY);	
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------------
Packit 8dc392
    // Copy constructors and assignment
Packit 8dc392
    //---------------------------------
Packit 8dc392
Packit 8dc392
    Shear6 (const Shear6 &h);
Packit 8dc392
    template <class S> Shear6 (const Shear6<S> &h);
Packit 8dc392
Packit 8dc392
    const Shear6 &	operator = (const Shear6 &h);
Packit 8dc392
    template <class S> 
Packit 8dc392
	const Shear6 &	operator = (const Vec3<S> &v);
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //----------------------
Packit 8dc392
    // Compatibility with Sb
Packit 8dc392
    //----------------------
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY);
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		setValue (const Shear6<S> &h);
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		getValue (S &XY, S &XZ, S &YZ, 
Packit 8dc392
				  S &YX, S &ZX, S &ZY) const;
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		getValue (Shear6<S> &h) const;
Packit 8dc392
Packit 8dc392
    T *			getValue();
Packit 8dc392
    const T *		getValue() const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------
Packit 8dc392
    // Equality
Packit 8dc392
    //---------
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    bool		operator == (const Shear6<S> &h) const;
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    bool		operator != (const Shear6<S> &h) const;
Packit 8dc392
Packit 8dc392
    //-----------------------------------------------------------------------
Packit 8dc392
    // Compare two shears and test if they are "approximately equal":
Packit 8dc392
    //
Packit 8dc392
    // equalWithAbsError (h, e)
Packit 8dc392
    //
Packit 8dc392
    //	    Returns true if the coefficients of this and h are the same with
Packit 8dc392
    //	    an absolute error of no more than e, i.e., for all i
Packit 8dc392
    //
Packit 8dc392
    //      abs (this[i] - h[i]) <= e
Packit 8dc392
    //
Packit 8dc392
    // equalWithRelError (h, e)
Packit 8dc392
    //
Packit 8dc392
    //	    Returns true if the coefficients of this and h are the same with
Packit 8dc392
    //	    a relative error of no more than e, i.e., for all i
Packit 8dc392
    //
Packit 8dc392
    //      abs (this[i] - h[i]) <= e * abs (this[i])
Packit 8dc392
    //-----------------------------------------------------------------------
Packit 8dc392
Packit 8dc392
    bool		equalWithAbsError (const Shear6<T> &h, T e) const;
Packit 8dc392
    bool		equalWithRelError (const Shear6<T> &h, T e) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise addition
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Shear6 &	operator += (const Shear6 &h);
Packit 8dc392
    Shear6		operator + (const Shear6 &h) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------
Packit 8dc392
    // Component-wise subtraction
Packit 8dc392
    //---------------------------
Packit 8dc392
Packit 8dc392
    const Shear6 &	operator -= (const Shear6 &h);
Packit 8dc392
    Shear6		operator - (const Shear6 &h) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------------
Packit 8dc392
    // Component-wise multiplication by -1
Packit 8dc392
    //------------------------------------
Packit 8dc392
Packit 8dc392
    Shear6		operator - () const;
Packit 8dc392
    const Shear6 &	negate ();
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------
Packit 8dc392
    // Component-wise multiplication
Packit 8dc392
    //------------------------------
Packit 8dc392
Packit 8dc392
    const Shear6 &	operator *= (const Shear6 &h);
Packit 8dc392
    const Shear6 &	operator *= (T a);
Packit 8dc392
    Shear6		operator * (const Shear6 &h) const;
Packit 8dc392
    Shear6		operator * (T a) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise division
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Shear6 &	operator /= (const Shear6 &h);
Packit 8dc392
    const Shear6 &	operator /= (T a);
Packit 8dc392
    Shear6		operator / (const Shear6 &h) const;
Packit 8dc392
    Shear6		operator / (T a) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //----------------------------------------------------------
Packit 8dc392
    // Number of dimensions, i.e. number of elements in a Shear6
Packit 8dc392
    //----------------------------------------------------------
Packit 8dc392
Packit 8dc392
    static unsigned int	dimensions() {return 6;}
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //-------------------------------------------------
Packit 8dc392
    // Limitations of type T (see also class limits<T>)
Packit 8dc392
    //-------------------------------------------------
Packit 8dc392
Packit 8dc392
    static T		baseTypeMin()		{return limits<T>::min();}
Packit 8dc392
    static T		baseTypeMax()		{return limits<T>::max();}
Packit 8dc392
    static T		baseTypeSmallest()	{return limits<T>::smallest();}
Packit 8dc392
    static T		baseTypeEpsilon()	{return limits<T>::epsilon();}
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //--------------------------------------------------------------
Packit 8dc392
    // Base type -- in templates, which accept a parameter, V, which
Packit 8dc392
    // could be either a Vec2<T> or a Shear6<T>, you can refer to T as
Packit 8dc392
    // V::BaseType
Packit 8dc392
    //--------------------------------------------------------------
Packit 8dc392
Packit 8dc392
    typedef T		BaseType;
Packit 8dc392
};
Packit 8dc392
Packit 8dc392
Packit 8dc392
//--------------
Packit 8dc392
// Stream output
Packit 8dc392
//--------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
std::ostream &	operator << (std::ostream &s, const Shear6<T> &h);
Packit 8dc392
Packit 8dc392
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
// Reverse multiplication: scalar * Shear6<T>
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
Packit 8dc392
template <class S, class T> Shear6<T>	operator * (S a, const Shear6<T> &h);
Packit 8dc392
Packit 8dc392
Packit 8dc392
//-------------------------
Packit 8dc392
// Typedefs for convenience
Packit 8dc392
//-------------------------
Packit 8dc392
Packit 8dc392
typedef Vec3   <float>  Shear3f;
Packit 8dc392
typedef Vec3   <double> Shear3d;
Packit 8dc392
typedef Shear6 <float>  Shear6f;
Packit 8dc392
typedef Shear6 <double> Shear6d;
Packit 8dc392
Packit 8dc392
Packit 8dc392
Packit 8dc392
Packit 8dc392
//-----------------------
Packit 8dc392
// Implementation of Shear6
Packit 8dc392
//-----------------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline T &
Packit 8dc392
Shear6<T>::operator [] (int i)
Packit 8dc392
{
Packit 8dc392
    return (&xy)[i];
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const T &
Packit 8dc392
Shear6<T>::operator [] (int i) const
Packit 8dc392
{
Packit 8dc392
    return (&xy)[i];
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 ()
Packit 8dc392
{
Packit 8dc392
    xy = xz = yz = yx = zx = zy = 0;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (T XY, T XZ, T YZ)
Packit 8dc392
{
Packit 8dc392
    xy = XY;
Packit 8dc392
    xz = XZ;
Packit 8dc392
    yz = YZ;
Packit 8dc392
    yx = 0;
Packit 8dc392
    zx = 0;
Packit 8dc392
    zy = 0;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (const Vec3<T> &v)
Packit 8dc392
{
Packit 8dc392
    xy = v.x;
Packit 8dc392
    xz = v.y;
Packit 8dc392
    yz = v.z;
Packit 8dc392
    yx = 0;
Packit 8dc392
    zx = 0;
Packit 8dc392
    zy = 0;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (const Vec3<S> &v)
Packit 8dc392
{
Packit 8dc392
    xy = T (v.x);
Packit 8dc392
    xz = T (v.y);
Packit 8dc392
    yz = T (v.z);
Packit 8dc392
    yx = 0;
Packit 8dc392
    zx = 0;
Packit 8dc392
    zy = 0;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY)
Packit 8dc392
{
Packit 8dc392
    xy = XY;
Packit 8dc392
    xz = XZ;
Packit 8dc392
    yz = YZ;
Packit 8dc392
    yx = YX;
Packit 8dc392
    zx = ZX;
Packit 8dc392
    zy = ZY;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy = h.xy;
Packit 8dc392
    xz = h.xz;
Packit 8dc392
    yz = h.yz;
Packit 8dc392
    yx = h.yx;
Packit 8dc392
    zx = h.zx;
Packit 8dc392
    zy = h.zy;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline
Packit 8dc392
Shear6<T>::Shear6 (const Shear6<S> &h)
Packit 8dc392
{
Packit 8dc392
    xy = T (h.xy);
Packit 8dc392
    xz = T (h.xz);
Packit 8dc392
    yz = T (h.yz);
Packit 8dc392
    yx = T (h.yx);
Packit 8dc392
    zx = T (h.zx);
Packit 8dc392
    zy = T (h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator = (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy = h.xy;
Packit 8dc392
    xz = h.xz;
Packit 8dc392
    yz = h.yz;
Packit 8dc392
    yx = h.yx;
Packit 8dc392
    zx = h.zx;
Packit 8dc392
    zy = h.zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator = (const Vec3<S> &v)
Packit 8dc392
{
Packit 8dc392
    xy = T (v.x);
Packit 8dc392
    xz = T (v.y);
Packit 8dc392
    yz = T (v.z);
Packit 8dc392
    yx = 0;
Packit 8dc392
    zx = 0;
Packit 8dc392
    zy = 0;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Shear6<T>::setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY)
Packit 8dc392
{
Packit 8dc392
    xy = T (XY);
Packit 8dc392
    xz = T (XZ);
Packit 8dc392
    yz = T (YZ);
Packit 8dc392
    yx = T (YX);
Packit 8dc392
    zx = T (ZX);
Packit 8dc392
    zy = T (ZY);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Shear6<T>::setValue (const Shear6<S> &h)
Packit 8dc392
{
Packit 8dc392
    xy = T (h.xy);
Packit 8dc392
    xz = T (h.xz);
Packit 8dc392
    yz = T (h.yz);
Packit 8dc392
    yx = T (h.yx);
Packit 8dc392
    zx = T (h.zx);
Packit 8dc392
    zy = T (h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Shear6<T>::getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const
Packit 8dc392
{
Packit 8dc392
    XY = S (xy);
Packit 8dc392
    XZ = S (xz);
Packit 8dc392
    YZ = S (yz);
Packit 8dc392
    YX = S (yx);
Packit 8dc392
    ZX = S (zx);
Packit 8dc392
    ZY = S (zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Shear6<T>::getValue (Shear6<S> &h) const
Packit 8dc392
{
Packit 8dc392
    h.xy = S (xy);
Packit 8dc392
    h.xz = S (xz);
Packit 8dc392
    h.yz = S (yz);
Packit 8dc392
    h.yx = S (yx);
Packit 8dc392
    h.zx = S (zx);
Packit 8dc392
    h.zy = S (zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline T *
Packit 8dc392
Shear6<T>::getValue()
Packit 8dc392
{
Packit 8dc392
    return (T *) &xy;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const T *
Packit 8dc392
Shear6<T>::getValue() const
Packit 8dc392
{
Packit 8dc392
    return (const T *) &xy;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline bool
Packit 8dc392
Shear6<T>::operator == (const Shear6<S> &h) const
Packit 8dc392
{
Packit 8dc392
    return xy == h.xy  &&  xz == h.xz  &&  yz == h.yz  &&  
Packit 8dc392
	   yx == h.yx  &&  zx == h.zx  &&  zy == h.zy;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline bool
Packit 8dc392
Shear6<T>::operator != (const Shear6<S> &h) const
Packit 8dc392
{
Packit 8dc392
    return xy != h.xy  ||  xz != h.xz  ||  yz != h.yz  ||
Packit 8dc392
	   yx != h.yx  ||  zx != h.zx  ||  zy != h.zy;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
bool
Packit 8dc392
Shear6<T>::equalWithAbsError (const Shear6<T> &h, T e) const
Packit 8dc392
{
Packit 8dc392
    for (int i = 0; i < 6; i++)
Packit 8dc392
	if (!IMATH_INTERNAL_NAMESPACE::equalWithAbsError ((*this)[i], h[i], e))
Packit 8dc392
	    return false;
Packit 8dc392
Packit 8dc392
    return true;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
bool
Packit 8dc392
Shear6<T>::equalWithRelError (const Shear6<T> &h, T e) const
Packit 8dc392
{
Packit 8dc392
    for (int i = 0; i < 6; i++)
Packit 8dc392
	if (!IMATH_INTERNAL_NAMESPACE::equalWithRelError ((*this)[i], h[i], e))
Packit 8dc392
	    return false;
Packit 8dc392
Packit 8dc392
    return true;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator += (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy += h.xy;
Packit 8dc392
    xz += h.xz;
Packit 8dc392
    yz += h.yz;
Packit 8dc392
    yx += h.yx;
Packit 8dc392
    zx += h.zx;
Packit 8dc392
    zy += h.zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator + (const Shear6 &h) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy + h.xy, xz + h.xz, yz + h.yz,
Packit 8dc392
		   yx + h.yx, zx + h.zx, zy + h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator -= (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy -= h.xy;
Packit 8dc392
    xz -= h.xz;
Packit 8dc392
    yz -= h.yz;
Packit 8dc392
    yx -= h.yx;
Packit 8dc392
    zx -= h.zx;
Packit 8dc392
    zy -= h.zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator - (const Shear6 &h) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy - h.xy, xz - h.xz, yz - h.yz,
Packit 8dc392
		   yx - h.yx, zx - h.zx, zy - h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator - () const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (-xy, -xz, -yz, -yx, -zx, -zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::negate ()
Packit 8dc392
{
Packit 8dc392
    xy = -xy;
Packit 8dc392
    xz = -xz;
Packit 8dc392
    yz = -yz;
Packit 8dc392
    yx = -yx;
Packit 8dc392
    zx = -zx;
Packit 8dc392
    zy = -zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator *= (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy *= h.xy;
Packit 8dc392
    xz *= h.xz;
Packit 8dc392
    yz *= h.yz;
Packit 8dc392
    yx *= h.yx;
Packit 8dc392
    zx *= h.zx;
Packit 8dc392
    zy *= h.zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator *= (T a)
Packit 8dc392
{
Packit 8dc392
    xy *= a;
Packit 8dc392
    xz *= a;
Packit 8dc392
    yz *= a;
Packit 8dc392
    yx *= a;
Packit 8dc392
    zx *= a;
Packit 8dc392
    zy *= a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator * (const Shear6 &h) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy * h.xy, xz * h.xz, yz * h.yz, 
Packit 8dc392
		   yx * h.yx, zx * h.zx, zy * h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator * (T a) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy * a, xz * a, yz * a,
Packit 8dc392
		   yx * a, zx * a, zy * a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator /= (const Shear6 &h)
Packit 8dc392
{
Packit 8dc392
    xy /= h.xy;
Packit 8dc392
    xz /= h.xz;
Packit 8dc392
    yz /= h.yz;
Packit 8dc392
    yx /= h.yx;
Packit 8dc392
    zx /= h.zx;
Packit 8dc392
    zy /= h.zy;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Shear6<T> &
Packit 8dc392
Shear6<T>::operator /= (T a)
Packit 8dc392
{
Packit 8dc392
    xy /= a;
Packit 8dc392
    xz /= a;
Packit 8dc392
    yz /= a;
Packit 8dc392
    yx /= a;
Packit 8dc392
    zx /= a;
Packit 8dc392
    zy /= a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator / (const Shear6 &h) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy / h.xy, xz / h.xz, yz / h.yz,
Packit 8dc392
		   yx / h.yx, zx / h.zx, zy / h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
Shear6<T>::operator / (T a) const
Packit 8dc392
{
Packit 8dc392
    return Shear6 (xy / a, xz / a, yz / a,
Packit 8dc392
		   yx / a, zx / a, zy / a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
//-----------------------------
Packit 8dc392
// Stream output implementation
Packit 8dc392
//-----------------------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
std::ostream &
Packit 8dc392
operator << (std::ostream &s, const Shear6<T> &h)
Packit 8dc392
{
Packit 8dc392
    return s << '(' 
Packit 8dc392
	     << h.xy << ' ' << h.xz << ' ' << h.yz 
Packit 8dc392
	     << h.yx << ' ' << h.zx << ' ' << h.zy 
Packit 8dc392
	     << ')';
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
//-----------------------------------------
Packit 8dc392
// Implementation of reverse multiplication
Packit 8dc392
//-----------------------------------------
Packit 8dc392
Packit 8dc392
template <class S, class T>
Packit 8dc392
inline Shear6<T>
Packit 8dc392
operator * (S a, const Shear6<T> &h)
Packit 8dc392
{
Packit 8dc392
    return Shear6<T> (a * h.xy, a * h.xz, a * h.yz,
Packit 8dc392
		      a * h.yx, a * h.zx, a * h.zy);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
Packit 8dc392
Packit 8dc392
#endif // INCLUDED_IMATHSHEAR_H