https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Protected Attributes | List of all members
CompileTimeDerivatives::CTPow< L, R > Class Template Reference

Power operator where both base and exponent can be arbitrary operators. More...

#include <CompileTimeDerivatives.h>

Inheritance diagram for CompileTimeDerivatives::CTPow< L, R >:
[legend]

Public Types

typedef libMesh::CompareTypes< typenameL::ResultType, typenameR::ResultType >::supertype ResultType
 

Public Member Functions

 CTPow (L left, R right)
 
ResultType operator() () const
 
std::string print () const
 
template<CTTag dtag>
auto D () const
 
template<typename Self >
std::string printParens (const Self *, const std::string &op) const
 

Static Public Member Functions

static constexpr int precedence ()
 precedence should reflect C++ operator precedence exactly (higher is binding tighter)
 
static constexpr bool leftAssociative ()
 left/right associative property should reflect C++ operator properties exactly
 

Protected Attributes

const L _left
 
const R _right
 

Detailed Description

template<typename L, typename R>
class CompileTimeDerivatives::CTPow< L, R >

Power operator where both base and exponent can be arbitrary operators.

Definition at line 667 of file CompileTimeDerivatives.h.

Member Typedef Documentation

◆ ResultType

template<typename L , typename R >
typedef libMesh::CompareTypes<typenameL::ResultType,typenameR::ResultType>::supertype CompileTimeDerivatives::CTBinary< L, R >::ResultType
inherited

Definition at line 198 of file CompileTimeDerivatives.h.

Constructor & Destructor Documentation

◆ CTPow()

template<typename L , typename R >
CompileTimeDerivatives::CTPow< L, R >::CTPow ( left,
right 
)
inline

Definition at line 670 of file CompileTimeDerivatives.h.

670: CTBinary<L, R>(left, right) {}

Member Function Documentation

◆ D()

template<typename L , typename R >
template<CTTag dtag>
auto CompileTimeDerivatives::CTPow< L, R >::D ( ) const
inline

Definition at line 689 of file CompileTimeDerivatives.h.

690 {
691 if constexpr (std::is_base_of<CTNullBase, decltype(_left.template D<dtag>())>::value &&
692 std::is_base_of<CTNullBase, decltype(_right.template D<dtag>())>::value)
693 return CTNull<ResultType>();
694
695 else if constexpr (std::is_base_of<CTNullBase, decltype(_left.template D<dtag>())>::value)
696 return pow(_left, _right) * _right.template D<dtag>() * log(_left);
697
698 else if constexpr (std::is_base_of<CTNullBase, decltype(_right.template D<dtag>())>::value)
699 return pow(_left, _right) * _right * _left.template D<dtag>() / _left;
700
701 else
702 return pow(_left, _right) *
703 (_right.template D<dtag>() * log(_left) + _right * _left.template D<dtag>() / _left);
704 }
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template D< dtag >()/_arg) CT_SIMPLE_UNARY_FUNCTION(sin
auto pow(const B &base, const E &exp)
pow(base, exponent) function overload.
auto log(const T &)

◆ leftAssociative()

static constexpr bool CompileTimeDerivatives::CTBase::leftAssociative ( )
inlinestaticconstexprinherited

left/right associative property should reflect C++ operator properties exactly

Definition at line 31 of file CompileTimeDerivatives.h.

31{ return false; }

◆ operator()()

template<typename L , typename R >
ResultType CompileTimeDerivatives::CTPow< L, R >::operator() ( ) const
inline

Definition at line 673 of file CompileTimeDerivatives.h.

674 {
675 if constexpr (std::is_base_of<CTNullBase, L>::value)
676 return ResultType(0);
677
678 if constexpr (std::is_base_of<CTOneBase, L>::value || std::is_base_of<CTNullBase, R>::value)
679 return ResultType(1);
680
681 if constexpr (std::is_base_of<CTOneBase, R>::value)
682 return _left();
683
684 return std::pow(_left(), _right());
685 }
libMesh::CompareTypes< typenameL::ResultType, typenameR::ResultType >::supertype ResultType
MooseUnits pow(const MooseUnits &, int)
Definition Units.C:537

◆ precedence()

static constexpr int CompileTimeDerivatives::CTBase::precedence ( )
inlinestaticconstexprinherited

precedence should reflect C++ operator precedence exactly (higher is binding tighter)

Definition at line 29 of file CompileTimeDerivatives.h.

29{ return 0; }

◆ print()

template<typename L , typename R >
std::string CompileTimeDerivatives::CTPow< L, R >::print ( ) const
inline

Definition at line 686 of file CompileTimeDerivatives.h.

686{ return "pow(" + _left.print() + "," + _right.print() + ")"; }

◆ printParens()

template<typename L , typename R >
template<typename Self >
std::string CompileTimeDerivatives::CTBinary< L, R >::printParens ( const Self *  ,
const std::string &  op 
) const
inlineinherited

Definition at line 201 of file CompileTimeDerivatives.h.

202 {
203 std::string out;
204 if constexpr (L::precedence() > Self::precedence())
205 out = "(" + _left.print() + ")";
206 else
207 out = _left.print();
208
209 out += op;
210
211 if (R::precedence() > Self::precedence() ||
212 (R::precedence() == Self::precedence() && Self::leftAssociative()))
213 out += "(" + _right.print() + ")";
214 else
215 out += _right.print();
216
217 return out;
218 }
OStreamProxy out(std::cout)

Referenced by CompileTimeDerivatives::CTAdd< L, R >::print(), CompileTimeDerivatives::CTSub< L, R >::print(), CompileTimeDerivatives::CTMul< L, R >::print(), CompileTimeDerivatives::CTDiv< L, R >::print(), and CompileTimeDerivatives::CTCompare< C, L, R >::print().

Member Data Documentation

◆ _left

template<typename L , typename R >
const L CompileTimeDerivatives::CTBinary< L, R >::_left
protectedinherited

◆ _right

template<typename L , typename R >
const R CompileTimeDerivatives::CTBinary< L, R >::_right
protectedinherited

The documentation for this class was generated from the following file: