KSeExpr  4.0.4.0
ExprPatterns.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2011-2019 Disney Enterprises, Inc.
2 // SPDX-License-Identifier: LicenseRef-Apache-2.0
3 // SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 
6 #pragma once
7 
8 #include "ExprNode.h"
9 
10 namespace KSeExpr
11 {
12 inline const ExprVarNode *isVariable(const ExprNode *testee)
13 {
14  return dynamic_cast<const ExprVarNode *>(testee);
15 }
16 
17 inline const ExprNumNode *isScalar(const ExprNode *testee)
18 {
19  return dynamic_cast<const ExprNumNode *>(testee);
20 }
21 
22 inline const ExprVecNode *isVector(const ExprNode *testee)
23 {
24  return dynamic_cast<const ExprVecNode *>(testee);
25 }
26 
27 inline const ExprVecNode *isLitVec(const ExprNode *testee)
28 {
29  if (const ExprVecNode *vec = isVector(testee))
30  if (isScalar(vec->child(0)) && isScalar(vec->child(1)) && isScalar(vec->child(2)))
31  return vec;
32 
33  return nullptr;
34 }
35 
36 inline const ExprStrNode *isString(const ExprNode *testee)
37 {
38  return dynamic_cast<const ExprStrNode *>(testee);
39 }
40 
41 inline const ExprAssignNode *isAssign(const ExprNode *testee)
42 {
43  return dynamic_cast<const ExprAssignNode *>(testee);
44 }
45 
46 inline const ExprFuncNode *isFunc(const ExprNode *testee)
47 {
48  return dynamic_cast<const ExprFuncNode *>(testee);
49 }
50 
51 inline const ExprFuncNode *isNamedFunc(const ExprNode *testee, const std::string &name)
52 {
53  if (const ExprFuncNode *func = isFunc(testee))
54  if (name == func->name())
55  return func;
56 
57  return nullptr;
58 }
59 
60 inline const ExprFuncNode *isStrFunc(const ExprNode *testee)
61 {
62  if (const ExprFuncNode *func = isFunc(testee)) {
63  int max = testee->numChildren();
64  for (int i = 0; i < max; ++i)
65  if (isString(testee->child(i)))
66  return func;
67  }
68 
69  return nullptr;
70 }
71 
72 inline bool hasCurveNumArgs(const ExprFuncNode *testee)
73 {
75  return !((testee->numChildren() - 1) % 3);
76 }
77 
78 inline const ExprFuncNode *isCurveFunc(const ExprNode *testee)
79 {
80  const ExprFuncNode *curveFunc = isNamedFunc(testee, "curve");
81 
82  if (curveFunc && hasCurveNumArgs(curveFunc)) {
83  int numChildren = curveFunc->numChildren() - 2;
84  for (int i = 1; i < numChildren && curveFunc; i += 3) {
85  if (!isScalar(curveFunc->child(i)) || !isScalar(curveFunc->child(i + 1)) || !isScalar(curveFunc->child(i + 2)))
86  curveFunc = nullptr;
87  }
88  }
89 
90  return curveFunc;
91 }
92 
93 inline const ExprFuncNode *isCcurveFunc(const ExprNode *testee)
94 {
95  const ExprFuncNode *ccurveFunc = isNamedFunc(testee, "ccurve");
96 
97  if (ccurveFunc && hasCurveNumArgs(ccurveFunc)) {
98  int numChildren = ccurveFunc->numChildren() - 2;
99  for (int i = 1; i < numChildren && ccurveFunc; i += 3) {
100  if (!isScalar(ccurveFunc->child(i)) || (!isScalar(ccurveFunc->child(i + 1)) && !isLitVec(ccurveFunc->child(i + 1))) || !isScalar(ccurveFunc->child(i + 2)))
101  ccurveFunc = nullptr;
102  }
103  }
104 
105  return ccurveFunc;
106 }
107 
108 inline const ExprAssignNode *isScalarAssign(const ExprNode *testee)
109 {
111  if (const ExprAssignNode *assign = isAssign(testee))
112  if (isScalar(assign->child(0)))
113  return assign;
114 
115  return nullptr;
116 }
117 
118 inline const ExprAssignNode *isVectorAssign(const ExprNode *testee)
119 {
121  if (const ExprAssignNode *assign = isAssign(testee))
122  if (isLitVec(assign->child(0)))
123  return assign;
124 
125  return nullptr;
126 }
127 
128 inline const ExprAssignNode *isStrFuncAssign(const ExprNode *testee)
129 {
131  if (const ExprAssignNode *assign = isAssign(testee))
132  if (isStrFunc(assign->child(0)))
133  return assign;
134 
135  return nullptr;
136 }
137 
138 inline const ExprAssignNode *isCurveAssign(const ExprNode *testee)
139 {
141  if (const ExprAssignNode *assign = isAssign(testee))
142  if (isCurveFunc(assign->child(0)))
143  return assign;
144 
145  return nullptr;
146 }
147 
148 inline const ExprAssignNode *isCcurveAssign(const ExprNode *testee)
149 {
151  if (const ExprAssignNode *assign = isAssign(testee))
152  if (isCcurveFunc(assign->child(0)))
153  return assign;
154 
155  return nullptr;
156 }
157 } // namespace KSeExpr
Node that compute a local variable assignment.
Definition: ExprNode.h:414
Node that calls a function.
Definition: ExprNode.h:654
int numChildren() const
Number of children.
Definition: ExprNode.h:108
const ExprNode * child(size_t i) const
Get 0 indexed child.
Definition: ExprNode.h:114
Node that stores a numeric constant.
Definition: ExprNode.h:610
Node that stores a string.
Definition: ExprNode.h:632
Node that references a variable.
Definition: ExprNode.h:572
Node that constructs a vector from three scalars.
Definition: ExprNode.h:449
double max(double x, double y)
Definition: ExprBuiltins.h:74
const ExprFuncNode * isCcurveFunc(const ExprNode *testee)
Definition: ExprPatterns.h:93
const ExprNumNode * isScalar(const ExprNode *testee)
Definition: ExprPatterns.h:17
const ExprAssignNode * isCurveAssign(const ExprNode *testee)
Definition: ExprPatterns.h:138
const ExprFuncNode * isStrFunc(const ExprNode *testee)
Definition: ExprPatterns.h:60
const ExprAssignNode * isAssign(const ExprNode *testee)
Definition: ExprPatterns.h:41
const ExprAssignNode * isVectorAssign(const ExprNode *testee)
Definition: ExprPatterns.h:118
const ExprAssignNode * isStrFuncAssign(const ExprNode *testee)
Definition: ExprPatterns.h:128
const ExprFuncNode * isNamedFunc(const ExprNode *testee, const std::string &name)
Definition: ExprPatterns.h:51
const ExprVecNode * isLitVec(const ExprNode *testee)
Definition: ExprPatterns.h:27
const ExprAssignNode * isCcurveAssign(const ExprNode *testee)
Definition: ExprPatterns.h:148
const ExprVecNode * isVector(const ExprNode *testee)
Definition: ExprPatterns.h:22
const ExprVarNode * isVariable(const ExprNode *testee)
Definition: ExprPatterns.h:12
const ExprStrNode * isString(const ExprNode *testee)
Definition: ExprPatterns.h:36
bool hasCurveNumArgs(const ExprFuncNode *testee)
Definition: ExprPatterns.h:72
const ExprFuncNode * isFunc(const ExprNode *testee)
Definition: ExprPatterns.h:46
const ExprFuncNode * isCurveFunc(const ExprNode *testee)
Definition: ExprPatterns.h:78
const ExprAssignNode * isScalarAssign(const ExprNode *testee)
Definition: ExprPatterns.h:108