Blaze  3.6
Classes | Namespaces | Functions
Proxy.h File Reference

Header file for the Proxy class. More...

#include <iosfwd>
#include <blaze/math/Aliases.h>
#include <blaze/math/Exception.h>
#include <blaze/math/InversionFlag.h>
#include <blaze/math/proxy/ComplexProxy.h>
#include <blaze/math/proxy/DefaultProxy.h>
#include <blaze/math/proxy/DenseMatrixProxy.h>
#include <blaze/math/proxy/DenseVectorProxy.h>
#include <blaze/math/proxy/SparseMatrixProxy.h>
#include <blaze/math/proxy/SparseVectorProxy.h>
#include <blaze/math/shims/Abs.h>
#include <blaze/math/shims/Acos.h>
#include <blaze/math/shims/Acosh.h>
#include <blaze/math/shims/Asin.h>
#include <blaze/math/shims/Asinh.h>
#include <blaze/math/shims/Atan.h>
#include <blaze/math/shims/Atan2.h>
#include <blaze/math/shims/Atanh.h>
#include <blaze/math/shims/Cbrt.h>
#include <blaze/math/shims/Ceil.h>
#include <blaze/math/shims/Conjugate.h>
#include <blaze/math/shims/Cos.h>
#include <blaze/math/shims/Cosh.h>
#include <blaze/math/shims/Erf.h>
#include <blaze/math/shims/Erfc.h>
#include <blaze/math/shims/Exp.h>
#include <blaze/math/shims/Exp2.h>
#include <blaze/math/shims/Exp10.h>
#include <blaze/math/shims/Floor.h>
#include <blaze/math/shims/Imaginary.h>
#include <blaze/math/shims/InvCbrt.h>
#include <blaze/math/shims/Invert.h>
#include <blaze/math/shims/InvSqrt.h>
#include <blaze/math/shims/IsNaN.h>
#include <blaze/math/shims/IsOne.h>
#include <blaze/math/shims/IsReal.h>
#include <blaze/math/shims/IsZero.h>
#include <blaze/math/shims/Log.h>
#include <blaze/math/shims/Log2.h>
#include <blaze/math/shims/Log10.h>
#include <blaze/math/shims/Pow.h>
#include <blaze/math/shims/Pow2.h>
#include <blaze/math/shims/Pow3.h>
#include <blaze/math/shims/Pow4.h>
#include <blaze/math/shims/Real.h>
#include <blaze/math/shims/Round.h>
#include <blaze/math/shims/Sign.h>
#include <blaze/math/shims/Sin.h>
#include <blaze/math/shims/Sinh.h>
#include <blaze/math/shims/Sqrt.h>
#include <blaze/math/shims/Tan.h>
#include <blaze/math/shims/Tanh.h>
#include <blaze/math/shims/Trunc.h>
#include <blaze/math/typetraits/IsDenseMatrix.h>
#include <blaze/math/typetraits/IsDenseVector.h>
#include <blaze/math/typetraits/IsMatrix.h>
#include <blaze/math/typetraits/IsProxy.h>
#include <blaze/math/typetraits/IsVector.h>
#include <blaze/util/algorithms/Max.h>
#include <blaze/util/algorithms/Min.h>
#include <blaze/util/DisableIf.h>
#include <blaze/util/mpl/If.h>
#include <blaze/util/typetraits/IsComplex.h>

Go to the source code of this file.

Classes

class  blaze::Proxy< PT, RT >
 Proxy base class.The Proxy class is a base class for all proxy classes within the Blaze library that may represent non-numeric data types (vectors, matrices, ...). It augments the interface of the deriving proxy class depending on the data type represented by the proxy. In addition, it provides an abstraction from the actual type of the proxy, but enables a type-safe conversion back to this type via the 'Curiously Recurring Template Pattern' (CRTP). More...
 

Namespaces

 blaze
 Namespace of the Blaze C++ math library.
 

Functions

template<typename PT , typename RT , typename ET >
decltype(auto) blaze::pow2 (const Proxy< PT, RT > &proxy)
 Computing the square value of the represented element. More...
 
template<typename PT , typename RT , typename ET >
decltype(auto) blaze::pow3 (const Proxy< PT, RT > &proxy)
 Computing the cube value of the represented element. More...
 
template<typename PT , typename RT , typename ET >
decltype(auto) blaze::pow4 (const Proxy< PT, RT > &proxy)
 Computing the quadruple value of the represented element. More...
 
Proxy operators
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::operator+ (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Addition between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator+ (const Proxy< PT, RT > &lhs, const T &rhs)
 Addition between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator+ (const T &lhs, const Proxy< PT, RT > &rhs)
 Addition between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::operator- (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Subtraction between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator- (const Proxy< PT, RT > &lhs, const T &rhs)
 Subtraction between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator- (const T &lhs, const Proxy< PT, RT > &rhs)
 Subtraction between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::operator * (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Multiplication between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator * (const Proxy< PT, RT > &lhs, const T &rhs)
 Multiplication between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator * (const T &lhs, const Proxy< PT, RT > &rhs)
 Multiplication between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::operator/ (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Division between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator/ (const Proxy< PT, RT > &lhs, const T &rhs)
 Division between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::operator/ (const T &lhs, const Proxy< PT, RT > &rhs)
 Division between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator== (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Equality comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator== (const Proxy< PT, RT > &lhs, const T &rhs)
 Equality comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator== (const T &lhs, const Proxy< PT, RT > &rhs)
 Equality comparison between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator!= (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Inequality comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator!= (const Proxy< PT, RT > &lhs, const T &rhs)
 Inequality comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator!= (const T &lhs, const Proxy< PT, RT > &rhs)
 Inquality comparison between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator< (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Less-than comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator< (const Proxy< PT, RT > &lhs, const T &rhs)
 Less-than comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator< (const T &lhs, const Proxy< PT, RT > &rhs)
 Less-than comparison between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator> (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Greater-than comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator> (const Proxy< PT, RT > &lhs, const T &rhs)
 Greater-than comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator> (const T &lhs, const Proxy< PT, RT > &rhs)
 Greater-than comparison between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator<= (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Less-or-equal-than comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator<= (const Proxy< PT, RT > &lhs, const T &rhs)
 Less-or-equal-than comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator<= (const T &lhs, const Proxy< PT, RT > &rhs)
 Less-or-equal-than comparison between an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::operator>= (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Greater-or-equal-than comparison between two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator>= (const Proxy< PT, RT > &lhs, const T &rhs)
 Greater-or-equal-than comparison between a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::operator>= (const T &lhs, const Proxy< PT, RT > &rhs)
 Greater-or-equal-than comparison between an object of different type and a Proxy object. More...
 
template<typename PT , typename RT >
std::ostream & blaze::operator<< (std::ostream &os, const Proxy< PT, RT > &proxy)
 Global output operator for the Proxy class template. More...
 
Proxy global functions
template<typename PT , typename RT >
decltype(auto) blaze::abs (const Proxy< PT, RT > &proxy)
 Computing the absolute value of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::sign (const Proxy< PT, RT > &proxy)
 Evaluating the sign of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::floor (const Proxy< PT, RT > &proxy)
 Computes the largest integral value that is not greater than the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::ceil (const Proxy< PT, RT > &proxy)
 Computes the smallest integral value that is not less than the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::trunc (const Proxy< PT, RT > &proxy)
 Computes the nearest integral value that is not greater than the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::round (const Proxy< PT, RT > &proxy)
 Computes the nearest integral value to the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::conj (const Proxy< PT, RT > &proxy)
 Computing the complex conjugate of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::trans (const Proxy< PT, RT > &proxy)
 Computing the transpose of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::ctrans (const Proxy< PT, RT > &proxy)
 Computing the conjugate transpose of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::real (const Proxy< PT, RT > &proxy)
 Computing the real part of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::imag (const Proxy< PT, RT > &proxy)
 Computing the imaginary part of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::sqrt (const Proxy< PT, RT > &proxy)
 Computing the square root of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::invsqrt (const Proxy< PT, RT > &proxy)
 Computing the inverse square root of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::cbrt (const Proxy< PT, RT > &proxy)
 Computing the cubic root of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::invcbrt (const Proxy< PT, RT > &proxy)
 Computing the inverse cubic root of the represented element. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::hypot (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Computes the hypotenous of the two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::hypot (const Proxy< PT, RT > &lhs, const T &rhs)
 Computes the hypotenous of a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::hypot (const T &lhs, const Proxy< PT, RT > &rhs)
 Computes the hypotenous of an object of different type and a Proxy object. More...
 
template<typename PT , typename RT , typename ET >
decltype(auto) blaze::pow (const Proxy< PT, RT > &proxy, const ET &exp)
 Computing the exponential value of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::pow2 (const Proxy< PT, RT > &proxy)
 Computing the square value of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::pow3 (const Proxy< PT, RT > &proxy)
 Computing the cube value of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::pow4 (const Proxy< PT, RT > &proxy)
 Computing the quadruple value of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::exp (const Proxy< PT, RT > &proxy)
 Computing the base-e exponential of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::exp2 (const Proxy< PT, RT > &proxy)
 Computing the base-2 exponential of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::exp10 (const Proxy< PT, RT > &proxy)
 Computing the base-10 exponential of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::log (const Proxy< PT, RT > &proxy)
 Computing the natural logarithm of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::log2 (const Proxy< PT, RT > &proxy)
 Computing the binary logarithm of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::log10 (const Proxy< PT, RT > &proxy)
 Computing the common logarithm of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::sin (const Proxy< PT, RT > &proxy)
 Computing the sine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::asin (const Proxy< PT, RT > &proxy)
 Computing the inverse sine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::sinh (const Proxy< PT, RT > &proxy)
 Computing the hyperbolic sine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::asinh (const Proxy< PT, RT > &proxy)
 Computing the inverse hyperbolic sine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::cos (const Proxy< PT, RT > &proxy)
 Computing the cosine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::acos (const Proxy< PT, RT > &proxy)
 Computing the inverse cosine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::cosh (const Proxy< PT, RT > &proxy)
 Computing the hyperbolic cosine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::acosh (const Proxy< PT, RT > &proxy)
 Computing the inverse hyperbolic cosine of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::tan (const Proxy< PT, RT > &proxy)
 Computing the tangent of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::atan (const Proxy< PT, RT > &proxy)
 Computing the inverse tangent of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::tanh (const Proxy< PT, RT > &proxy)
 Computing the hyperbolic tangent of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::atanh (const Proxy< PT, RT > &proxy)
 Computing the inverse hyperbolic tangent of the represented element. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::atan2 (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Computes the multi-valued inverse tangent of two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::atan2 (const Proxy< PT, RT > &lhs, const T &rhs)
 Computes the multi-valued inverse tangent of a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::atan2 (const T &lhs, const Proxy< PT, RT > &rhs)
 Computes the multi-valued inverse tangent of an object of different type and a Proxy object. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::erf (const Proxy< PT, RT > &proxy)
 Computing the error function of the represented element. More...
 
template<typename PT , typename RT >
decltype(auto) blaze::erfc (const Proxy< PT, RT > &proxy)
 Computing the complementary error function of the represented element. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::min (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Minimum of two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::min (const Proxy< PT, RT > &lhs, const T &rhs)
 Minimum of a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::min (const T &lhs, const Proxy< PT, RT > &rhs)
 Minimum of an object of different type and a Proxy object. More...
 
template<typename PT1 , typename RT1 , typename PT2 , typename RT2 >
decltype(auto) blaze::max (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Maximum of two Proxy objects. More...
 
template<typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::max (const Proxy< PT, RT > &lhs, const T &rhs)
 Maximum of a Proxy object and an object of different type. More...
 
template<typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
decltype(auto) blaze::max (const T &lhs, const Proxy< PT, RT > &rhs)
 Maximum of an object of different type and a Proxy object. More...
 
template<typename PT , typename RT >
void blaze::transpose (const Proxy< PT, RT > &proxy)
 In-place transpose of the represented matrix element. More...
 
template<typename PT , typename RT >
void blaze::ctranspose (const Proxy< PT, RT > &proxy)
 In-place conjugate transpose of the represented matrix element. More...
 
template<typename PT , typename RT >
void blaze::invert (const Proxy< PT, RT > &proxy)
 In-place inversion of the represented element. More...
 
template<InversionFlag IF, typename PT , typename RT >
void blaze::invert (const Proxy< PT, RT > &proxy)
 In-place inversion of the represented element. More...
 
template<bool RF, typename PT , typename RT >
bool blaze::isReal (const Proxy< PT, RT > &proxy)
 Returns whether the element represents a real number. More...
 
template<bool RF, typename PT , typename RT >
bool blaze::isZero (const Proxy< PT, RT > &proxy)
 Returns whether the represented element is 0. More...
 
template<bool RF, typename PT , typename RT >
bool blaze::isOne (const Proxy< PT, RT > &proxy)
 Returns whether the represented element is 1. More...
 
template<typename PT , typename RT >
bool blaze::isnan (const Proxy< PT, RT > &proxy)
 Returns whether the represented element is not a number. More...
 
template<bool RF, typename PT1 , typename RT1 , typename PT2 , typename RT2 >
bool blaze::equal (const Proxy< PT1, RT1 > &lhs, const Proxy< PT2, RT2 > &rhs)
 Equality comparison between two Proxy objects. More...
 
template<bool RF, typename PT , typename RT , typename T , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::equal (const Proxy< PT, RT > &lhs, const T &rhs)
 Equality comparison between a Proxy object and an object of different type. More...
 
template<bool RF, typename T , typename PT , typename RT , typename = DisableIf_t< IsProxy_v<T> >>
bool blaze::equal (const T &lhs, const Proxy< PT, RT > &rhs)
 Equality comparison between an object of different type and a Proxy object. More...
 

Detailed Description

Header file for the Proxy class.

Copyright (C) 2012-2019 Klaus Iglberger - All Rights Reserved

This file is part of the Blaze library. You can redistribute it and/or modify it under the terms of the New (Revised) BSD License. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the names of the Blaze development group nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.