1 #ifndef CPPAD_CG_COND_EXP_OP_INCLUDED 2 #define CPPAD_CG_COND_EXP_OP_INCLUDED 26 inline bool isSameExpression(
const cg::CG<Base>& trueCase,
27 const cg::CG<Base>& falseCase) {
28 return (trueCase.isParameter() && falseCase.isParameter() &&
29 trueCase.getValue() == falseCase.getValue()) ||
30 (trueCase.isVariable() && falseCase.isVariable() &&
31 trueCase.getOperationNode() == falseCase.getOperationNode());
40 inline cg::CodeHandler<Base>* findCodeHandler(
const cg::CG<Base>& left,
41 const cg::CG<Base>& right,
42 const cg::CG<Base>& trueCase,
43 const cg::CG<Base>& falseCase) {
44 cg::CodeHandler<Base>* handler;
46 cg::CodeHandler<Base>* lh = left.getCodeHandler();
47 cg::CodeHandler<Base>* rh = right.getCodeHandler();
48 cg::CodeHandler<Base>* th = trueCase.getCodeHandler();
49 cg::CodeHandler<Base>* fh = falseCase.getCodeHandler();
51 if (!left.isParameter()) {
53 }
else if (!right.isParameter()) {
55 }
else if (!trueCase.isParameter()) {
57 }
else if (!falseCase.isParameter()) {
60 CPPAD_ASSERT_UNKNOWN(0)
61 throw cg::CGException("Unexpected error!");
64 if ((!right.isParameter() && rh != handler)
65 || (!trueCase.isParameter() && th != handler)
66 || (!falseCase.isParameter() && fh != handler)) {
67 throw cg::CGException(
"Attempting to use different source code generation handlers in the same source code generation");
85 bool (*compare)(
const Base&,
const Base&)) {
95 }
else if (isSameExpression(trueCase, falseCase)) {
101 CG<Base> result(*handler->makeNode(op,{left.argument(), right.argument(), trueCase.argument(), falseCase.argument()}));
110 result.setValue(falseCase.
getValue());
128 bool (*compare)(
const Base&,
const Base&) = [](
const Base& l,
const Base & r) {
132 return CondExp(cg::CGOpCode::ComLt,
146 bool (*comp)(
const Base&,
const Base&) = [](
const Base& l,
const Base & r) {
150 return CondExp(cg::CGOpCode::ComLe,
164 bool (*comp)(
const Base&,
const Base&) = [](
const Base& l,
const Base & r) {
168 return CondExp(cg::CGOpCode::ComEq,
182 bool (*comp)(
const Base&,
const Base&) = [](
const Base& l,
const Base & r) {
186 return CondExp(cg::CGOpCode::ComGe,
200 bool (*comp)(
const Base&,
const Base&) = [](
const Base& l,
const Base & r) {
204 return CondExp(cg::CGOpCode::ComGt,
218 return CondExpLt(left, right, trueCase, falseCase);
221 return CondExpLe(left, right, trueCase, falseCase);
224 return CondExpEq(left, right, trueCase, falseCase);
227 return CondExpGe(left, right, trueCase, falseCase);
230 return CondExpGt(left, right, trueCase, falseCase);
233 CPPAD_ASSERT_UNKNOWN(0)
cg::CG< Base > CondExpGt(const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase)
const Base & getValue() const
cg::CG< Base > CondExp(cg::CGOpCode op, const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase, bool(*compare)(const Base &, const Base &))
void setValue(const Base &val)
cg::CG< Base > CondExpGe(const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase)
cg::CG< Base > CondExpLe(const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase)
cg::CG< Base > CondExpEq(const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase)
cg::CG< Base > CondExpLt(const cg::CG< Base > &left, const cg::CG< Base > &right, const cg::CG< Base > &trueCase, const cg::CG< Base > &falseCase)
bool isValueDefined() const