VapourSynth-llvmexpr
Loading...
Searching...
No Matches
infix2postfix::PostfixBuilder Class Reference

#include <llvmexpr/frontend/infix2postfix/PostfixBuilder.hpp>

Public Member Functions

 PostfixBuilder ()=default
void addOp (TokenType type)
void addUnaryOp (TokenType type)
void addTernaryOp ()
void addFunctionCall (const std::string &func_name)
void append (const PostfixBuilder &other)
std::string getExpression () const
void clear ()
bool empty () const
void addNumber (const std::string &num_literal)
void addConstant (const std::string &const_name)
void addVariableLoad (const std::string &var_name)
void addVariableStore (const std::string &var_name)
void addLabel (const std::string &label_name)
void addConditionalJump (const std::string &label_name)
void addUnconditionalJump (const std::string &label_name)
void prefixLabels (const std::string &prefix)
void addPropAccess (const std::string &clip_name, const std::string &prop_name)
void addPropExist (const std::string &clip_name, const std::string &prop_name)
void addSetProp (const std::string &prop_name, const std::string &suffix)
void addDeleteProp (const std::string &prop_name)
void addStaticPixelAccess (const std::string &clip_name, const std::string &x, const std::string &y, const std::string &suffix)
void addDynPixelAccessExpr (const std::string &clip_name, const std::string &suffix)
void addDynPixelAccessSingle (const std::string &clip_name, const std::string &plane)
void addStoreExpr ()
void addStoreSingle (const std::string &plane)
void addFrameDimension (const std::string &dim, const std::string &plane)
void addExitMarker ()
void addDropN (int count=1)
void addDupN (int count=0)
void addSwapN (int count=1)
void addSortN (int count)
void addArrayAllocStatic (const std::string &array_name, const std::string &size)
void addArrayAllocDynamic (const std::string &array_name)
void addArrayLoad (const std::string &array_name)
void addArrayStore (const std::string &array_name)
void addRaw (const std::string &raw_string)

Detailed Description

Definition at line 30 of file PostfixBuilder.hpp.

Constructor & Destructor Documentation

◆ PostfixBuilder()

infix2postfix::PostfixBuilder::PostfixBuilder ( )
default

References PostfixBuilder().

Referenced by append(), and PostfixBuilder().

Member Function Documentation

◆ addArrayAllocDynamic()

void infix2postfix::PostfixBuilder::addArrayAllocDynamic ( const std::string & array_name)

Definition at line 215 of file PostfixBuilder.cpp.

215 {
216 pushToken(std::format("{}{{}}^", array_name));
217}

◆ addArrayAllocStatic()

void infix2postfix::PostfixBuilder::addArrayAllocStatic ( const std::string & array_name,
const std::string & size )

Definition at line 210 of file PostfixBuilder.cpp.

211 {
212 pushToken(std::format("{}{{}}^{}", array_name, size));
213}

◆ addArrayLoad()

void infix2postfix::PostfixBuilder::addArrayLoad ( const std::string & array_name)

Definition at line 219 of file PostfixBuilder.cpp.

219 {
220 pushToken(std::format("{}{{}}@", array_name));
221}

◆ addArrayStore()

void infix2postfix::PostfixBuilder::addArrayStore ( const std::string & array_name)

Definition at line 223 of file PostfixBuilder.cpp.

223 {
224 pushToken(std::format("{}{{}}!", array_name));
225}

◆ addConditionalJump()

void infix2postfix::PostfixBuilder::addConditionalJump ( const std::string & label_name)

Definition at line 136 of file PostfixBuilder.cpp.

136 {
137 pushToken(label_name + "#");
138}

Referenced by addUnconditionalJump().

◆ addConstant()

void infix2postfix::PostfixBuilder::addConstant ( const std::string & const_name)

Definition at line 120 of file PostfixBuilder.cpp.

120 {
121 pushToken(const_name);
122}

◆ addDeleteProp()

void infix2postfix::PostfixBuilder::addDeleteProp ( const std::string & prop_name)

Definition at line 160 of file PostfixBuilder.cpp.

160 {
161 pushToken(std::format("{}$d", prop_name));
162}

◆ addDropN()

void infix2postfix::PostfixBuilder::addDropN ( int count = 1)

Definition at line 194 of file PostfixBuilder.cpp.

194 {
195 pushToken(std::format("drop{}", count));
196}

◆ addDupN()

void infix2postfix::PostfixBuilder::addDupN ( int count = 0)

Definition at line 198 of file PostfixBuilder.cpp.

198 {
199 pushToken(std::format("dup{}", count));
200}

◆ addDynPixelAccessExpr()

void infix2postfix::PostfixBuilder::addDynPixelAccessExpr ( const std::string & clip_name,
const std::string & suffix )

Definition at line 171 of file PostfixBuilder.cpp.

172 {
173 pushToken(std::format("{}[]{}", clip_name, suffix));
174}

◆ addDynPixelAccessSingle()

void infix2postfix::PostfixBuilder::addDynPixelAccessSingle ( const std::string & clip_name,
const std::string & plane )

Definition at line 176 of file PostfixBuilder.cpp.

177 {
178 pushToken(std::format("{}^{}[]", clip_name, plane));
179}

◆ addExitMarker()

void infix2postfix::PostfixBuilder::addExitMarker ( )

Definition at line 192 of file PostfixBuilder.cpp.

192{ pushToken("^exit^"); }

◆ addFrameDimension()

void infix2postfix::PostfixBuilder::addFrameDimension ( const std::string & dim,
const std::string & plane )

Definition at line 187 of file PostfixBuilder.cpp.

188 {
189 pushToken(std::format("{}^{}", dim, plane));
190}

◆ addFunctionCall()

void infix2postfix::PostfixBuilder::addFunctionCall ( const std::string & func_name)

Definition at line 112 of file PostfixBuilder.cpp.

112 {
113 pushToken(func_name);
114}

◆ addLabel()

void infix2postfix::PostfixBuilder::addLabel ( const std::string & label_name)

Definition at line 132 of file PostfixBuilder.cpp.

132 {
133 pushToken("#" + label_name);
134}

◆ addNumber()

void infix2postfix::PostfixBuilder::addNumber ( const std::string & num_literal)

Definition at line 116 of file PostfixBuilder.cpp.

116 {
117 pushToken(num_literal);
118}

◆ addOp()

void infix2postfix::PostfixBuilder::addOp ( TokenType type)

Definition at line 35 of file PostfixBuilder.cpp.

35 {
36 switch (type) {
37 case TokenType::Plus:
38 pushToken("+");
39 break;
40 case TokenType::Minus:
41 pushToken("-");
42 break;
43 case TokenType::Star:
44 pushToken("*");
45 break;
46 case TokenType::Slash:
47 pushToken("/");
48 break;
49 case TokenType::Percent:
50 pushToken("%");
51 break;
52 case TokenType::StarStar:
53 pushToken("pow");
54 break;
55 case TokenType::LogicalAnd:
56 pushToken("and");
57 break;
58 case TokenType::LogicalOr:
59 pushToken("or");
60 break;
61 case TokenType::BitAnd:
62 pushToken("bitand");
63 break;
64 case TokenType::BitOr:
65 pushToken("bitor");
66 break;
67 case TokenType::BitXor:
68 pushToken("bitxor");
69 break;
70 case TokenType::Eq:
71 pushToken("=");
72 break;
73 case TokenType::Ne:
74 pushToken("=");
75 pushToken("not");
76 break;
77 case TokenType::Lt:
78 pushToken("<");
79 break;
80 case TokenType::Le:
81 pushToken("<=");
82 break;
83 case TokenType::Gt:
84 pushToken(">");
85 break;
86 case TokenType::Ge:
87 pushToken(">=");
88 break;
89 default:
90 std::unreachable();
91 }
92}

References Eq, Ge, Gt, Le, and Lt.

◆ addPropAccess()

void infix2postfix::PostfixBuilder::addPropAccess ( const std::string & clip_name,
const std::string & prop_name )

Definition at line 145 of file PostfixBuilder.cpp.

146 {
147 pushToken(std::format("{}.{}", clip_name, prop_name));
148}

◆ addPropExist()

void infix2postfix::PostfixBuilder::addPropExist ( const std::string & clip_name,
const std::string & prop_name )

Definition at line 150 of file PostfixBuilder.cpp.

151 {
152 pushToken(std::format("{}.{}?", clip_name, prop_name));
153}

◆ addRaw()

void infix2postfix::PostfixBuilder::addRaw ( const std::string & raw_string)

Definition at line 227 of file PostfixBuilder.cpp.

227 {
228 std::stringstream ss(raw_string);
229 std::string token;
230 while (ss >> token) {
231 pushToken(token);
232 }
233}

◆ addSetProp()

void infix2postfix::PostfixBuilder::addSetProp ( const std::string & prop_name,
const std::string & suffix )

Definition at line 155 of file PostfixBuilder.cpp.

156 {
157 pushToken(std::format("{}${}", prop_name, suffix));
158}

◆ addSortN()

void infix2postfix::PostfixBuilder::addSortN ( int count)

Definition at line 206 of file PostfixBuilder.cpp.

206 {
207 pushToken(std::format("sort{}", count));
208}

◆ addStaticPixelAccess()

void infix2postfix::PostfixBuilder::addStaticPixelAccess ( const std::string & clip_name,
const std::string & x,
const std::string & y,
const std::string & suffix )

Definition at line 164 of file PostfixBuilder.cpp.

167 {
168 pushToken(std::format("{}[{},{}]{}", clip_name, x, y, suffix));
169}

◆ addStoreExpr()

void infix2postfix::PostfixBuilder::addStoreExpr ( )

Definition at line 181 of file PostfixBuilder.cpp.

181{ pushToken("@[]"); }

◆ addStoreSingle()

void infix2postfix::PostfixBuilder::addStoreSingle ( const std::string & plane)

Definition at line 183 of file PostfixBuilder.cpp.

183 {
184 pushToken(std::format("@[]^{}", plane));
185}

◆ addSwapN()

void infix2postfix::PostfixBuilder::addSwapN ( int count = 1)

Definition at line 202 of file PostfixBuilder.cpp.

202 {
203 pushToken(std::format("swap{}", count));
204}

◆ addTernaryOp()

void infix2postfix::PostfixBuilder::addTernaryOp ( )

Definition at line 110 of file PostfixBuilder.cpp.

110{ pushToken("?"); }

◆ addUnaryOp()

void infix2postfix::PostfixBuilder::addUnaryOp ( TokenType type)

Definition at line 94 of file PostfixBuilder.cpp.

94 {
95 switch (type) {
96 case TokenType::Minus:
97 pushToken("neg");
98 break;
99 case TokenType::Not:
100 pushToken("not");
101 break;
102 case TokenType::BitNot:
103 pushToken("bitnot");
104 break;
105 default:
106 std::unreachable();
107 }
108}

References Not.

◆ addUnconditionalJump()

void infix2postfix::PostfixBuilder::addUnconditionalJump ( const std::string & label_name)

Definition at line 140 of file PostfixBuilder.cpp.

140 {
141 pushToken("1");
142 addConditionalJump(label_name);
143}
void addConditionalJump(const std::string &label_name)

References addConditionalJump().

◆ addVariableLoad()

void infix2postfix::PostfixBuilder::addVariableLoad ( const std::string & var_name)

Definition at line 124 of file PostfixBuilder.cpp.

124 {
125 pushToken(var_name + "@");
126}

Referenced by infix2postfix::CodeGenerator::generate().

◆ addVariableStore()

void infix2postfix::PostfixBuilder::addVariableStore ( const std::string & var_name)

Definition at line 128 of file PostfixBuilder.cpp.

128 {
129 pushToken(var_name + "!");
130}

◆ append()

void infix2postfix::PostfixBuilder::append ( const PostfixBuilder & other)

Definition at line 263 of file PostfixBuilder.cpp.

263 {
264 tokens.insert(tokens.end(), other.tokens.begin(), other.tokens.end());
265}

References PostfixBuilder().

◆ clear()

void infix2postfix::PostfixBuilder::clear ( )

Definition at line 259 of file PostfixBuilder.cpp.

259{ tokens.clear(); }

◆ empty()

bool infix2postfix::PostfixBuilder::empty ( ) const
nodiscard

Definition at line 261 of file PostfixBuilder.cpp.

261{ return tokens.empty(); }

◆ getExpression()

std::string infix2postfix::PostfixBuilder::getExpression ( ) const
nodiscard

Definition at line 235 of file PostfixBuilder.cpp.

235 {
236 if (tokens.empty()) {
237 return "";
238 }
239
240 size_t total_len =
241 std::accumulate(tokens.begin(), tokens.end(), size_t{0},
242 [](size_t sum, const std::string& token) {
243 return sum + token.length();
244 });
245 total_len += tokens.size() - 1; // for spaces
246
247 std::string result;
248 result.reserve(total_len);
249
250 result.append(tokens[0]);
251 for (size_t i = 1; i < tokens.size(); ++i) {
252 result.push_back(' ');
253 result.append(tokens[i]);
254 }
255
256 return result;
257}

Referenced by infix2postfix::CodeGenerator::generate().

◆ prefixLabels()

void infix2postfix::PostfixBuilder::prefixLabels ( const std::string & prefix)

Definition at line 267 of file PostfixBuilder.cpp.

267 {
268 for (auto& token : tokens) {
269 if (token.empty()) {
270 continue;
271 }
272
273 bool is_label_def = token.front() == '#';
274 bool is_jump = token.back() == '#';
275
276 if (is_label_def || is_jump) {
277 std::string label_name = is_label_def
278 ? token.substr(1)
279 : token.substr(0, token.size() - 1);
280
281 if (label_name.empty()) {
282 continue;
283 }
284
285 if (label_name.starts_with("__internal_")) {
286 continue;
287 }
288
289 std::string new_label = prefix + label_name;
290 if (is_label_def) {
291 token = "#" + new_label;
292 } else {
293 token = new_label + "#";
294 }
295 }
296 }
297}

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