KSeExpr 6.0.0.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
10namespace KSeExpr
11{
13{
14 return dynamic_cast<const ExprVarNode *>(testee);
15}
16
17inline const ExprNumNode *isScalar(const ExprNode *testee)
18{
19 return dynamic_cast<const ExprNumNode *>(testee);
20}
21
22inline const ExprVecNode *isVector(const ExprNode *testee)
23{
24 return dynamic_cast<const ExprVecNode *>(testee);
25}
26
27inline 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
36inline const ExprStrNode *isString(const ExprNode *testee)
37{
38 return dynamic_cast<const ExprStrNode *>(testee);
39}
40
42{
43 return dynamic_cast<const ExprAssignNode *>(testee);
44}
45
46inline const ExprFuncNode *isFunc(const ExprNode *testee)
47{
48 return dynamic_cast<const ExprFuncNode *>(testee);
49}
50
51inline 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
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
73{
75 return !((testee->numChildren() - 1) % 3);
76}
77
79{
80 const ExprFuncNode *curveFunc = isNamedFunc(testee, "curve");
81
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
94{
95 const ExprFuncNode *ccurveFunc = isNamedFunc(testee, "ccurve");
96
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
109{
111 if (const ExprAssignNode *assign = isAssign(testee))
112 if (isScalar(assign->child(0)))
113 return assign;
114
115 return nullptr;
116}
117
119{
121 if (const ExprAssignNode *assign = isAssign(testee))
122 if (isLitVec(assign->child(0)))
123 return assign;
124
125 return nullptr;
126}
127
129{
131 if (const ExprAssignNode *assign = isAssign(testee))
132 if (isStrFunc(assign->child(0)))
133 return assign;
134
135 return nullptr;
136}
137
139{
141 if (const ExprAssignNode *assign = isAssign(testee))
142 if (isCurveFunc(assign->child(0)))
143 return assign;
144
145 return nullptr;
146}
147
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
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
const ExprFuncNode * isNamedFunc(const ExprNode *testee, const std::string &name)
const ExprFuncNode * isCurveFunc(const ExprNode *testee)
double max(double x, double y)
const ExprAssignNode * isVectorAssign(const ExprNode *testee)
const ExprAssignNode * isAssign(const ExprNode *testee)
const ExprFuncNode * isStrFunc(const ExprNode *testee)
const ExprFuncNode * isCcurveFunc(const ExprNode *testee)
const ExprNumNode * isScalar(const ExprNode *testee)
const ExprAssignNode * isStrFuncAssign(const ExprNode *testee)
const ExprVecNode * isLitVec(const ExprNode *testee)
const ExprStrNode * isString(const ExprNode *testee)
const ExprAssignNode * isScalarAssign(const ExprNode *testee)
const ExprAssignNode * isCcurveAssign(const ExprNode *testee)
bool hasCurveNumArgs(const ExprFuncNode *testee)
const ExprVarNode * isVariable(const ExprNode *testee)
const ExprAssignNode * isCurveAssign(const ExprNode *testee)
const ExprVecNode * isVector(const ExprNode *testee)
const ExprFuncNode * isFunc(const ExprNode *testee)