1use crate::cpp_type::CppType;
4use ritual_common::errors::{bail, Result};
5use serde_derive::{Deserialize, Serialize};
6
7#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)]
9pub enum CppOperator {
10 Conversion(CppType),
12 Assignment,
14 Addition,
16 Subtraction,
18 UnaryPlus,
20 UnaryMinus,
22 Multiplication,
24 Division,
26 Modulo,
28 PrefixIncrement,
30 PostfixIncrement,
32 PrefixDecrement,
34 PostfixDecrement,
36 EqualTo,
38 NotEqualTo,
40 GreaterThan,
42 LessThan,
44 GreaterThanOrEqualTo,
46 LessThanOrEqualTo,
48 LogicalNot,
50 LogicalAnd,
52 LogicalOr,
54 BitwiseNot,
56 BitwiseAnd,
58 BitwiseOr,
60 BitwiseXor,
62 BitwiseLeftShift,
64 BitwiseRightShift,
66
67 AdditionAssignment,
69 SubtractionAssignment,
71 MultiplicationAssignment,
73 DivisionAssignment,
75 ModuloAssignment,
77 BitwiseAndAssignment,
79 BitwiseOrAssignment,
81 BitwiseXorAssignment,
83 BitwiseLeftShiftAssignment,
85 BitwiseRightShiftAssignment,
87 Subscript,
89 Indirection,
91 AddressOf,
93 StructureDereference,
95 PointerToMember,
97 FunctionCall,
99 Comma,
101 New,
103 NewArray,
105 Delete,
107 DeleteArray,
109}
110
111#[derive(Debug, PartialEq, Eq, Clone)]
114pub struct CppOperatorInfo {
115 pub function_name_suffix: Option<&'static str>,
121 pub arguments_count: usize,
125 pub allows_variadic_arguments: bool,
128}
129
130impl CppOperator {
131 pub fn info(&self) -> CppOperatorInfo {
133 use self::CppOperator::*;
134 fn oi(suffix: &'static str, count: usize) -> CppOperatorInfo {
135 CppOperatorInfo {
136 function_name_suffix: Some(suffix),
137 arguments_count: count,
138 allows_variadic_arguments: false,
139 }
140 }
141
142 match *self {
143 Conversion(..) => CppOperatorInfo {
144 function_name_suffix: None,
145 arguments_count: 1,
146 allows_variadic_arguments: false,
147 },
148 Assignment => oi("=", 2),
149 Addition => oi("+", 2),
150 Subtraction => oi("-", 2),
151 UnaryPlus => oi("+", 1),
152 UnaryMinus => oi("-", 1),
153 Multiplication => oi("*", 2),
154 Division => oi("/", 2),
155 Modulo => oi("%", 2),
156 PrefixIncrement => oi("++", 1),
157 PostfixIncrement => oi("++", 2),
158 PrefixDecrement => oi("--", 1),
159 PostfixDecrement => oi("--", 2),
160 EqualTo => oi("==", 2),
161 NotEqualTo => oi("!=", 2),
162 GreaterThan => oi(">", 2),
163 LessThan => oi("<", 2),
164 GreaterThanOrEqualTo => oi(">=", 2),
165 LessThanOrEqualTo => oi("<=", 2),
166 LogicalNot => oi("!", 1),
167 LogicalAnd => oi("&&", 2),
168 LogicalOr => oi("||", 2),
169 BitwiseNot => oi("~", 1),
170 BitwiseAnd => oi("&", 2),
171 BitwiseOr => oi("|", 2),
172 BitwiseXor => oi("^", 2),
173 BitwiseLeftShift => oi("<<", 2),
174 BitwiseRightShift => oi(">>", 2),
175 AdditionAssignment => oi("+=", 2),
176 SubtractionAssignment => oi("-=", 2),
177 MultiplicationAssignment => oi("*=", 2),
178 DivisionAssignment => oi("/=", 2),
179 ModuloAssignment => oi("%=", 2),
180 BitwiseAndAssignment => oi("&=", 2),
181 BitwiseOrAssignment => oi("|=", 2),
182 BitwiseXorAssignment => oi("^=", 2),
183 BitwiseLeftShiftAssignment => oi("<<=", 2),
184 BitwiseRightShiftAssignment => oi(">>=", 2),
185 Subscript => oi("[]", 2),
186 Indirection => oi("*", 1),
187 AddressOf => oi("&", 1),
188 StructureDereference => oi("->", 1),
189 PointerToMember => oi("->*", 2),
190 FunctionCall => CppOperatorInfo {
191 function_name_suffix: Some("()"),
192 arguments_count: 0,
193 allows_variadic_arguments: true,
194 },
195 Comma => oi(",", 2),
196 New => oi("new", 2),
197 NewArray => oi("new[]", 2),
198 Delete => oi("delete", 2),
199 DeleteArray => oi("delete[]", 2),
200 }
201 }
202
203 pub fn ascii_name(&self) -> Result<&'static str> {
206 use self::CppOperator::*;
207 Ok(match *self {
208 Conversion(..) => {
209 bail!("CppOperator::c_name: conversion operators are not supported");
210 }
211 Assignment => "assign",
212 Addition => "add",
213 Subtraction => "sub",
214 UnaryPlus => "unary_plus",
215 UnaryMinus => "neg",
216 Multiplication => "mul",
217 Division => "div",
218 Modulo => "rem",
219 PrefixIncrement => "inc",
220 PostfixIncrement => "inc_postfix",
221 PrefixDecrement => "dec",
222 PostfixDecrement => "dec_postfix",
223 EqualTo => "eq",
224 NotEqualTo => "neq",
225 GreaterThan => "gt",
226 LessThan => "lt",
227 GreaterThanOrEqualTo => "ge",
228 LessThanOrEqualTo => "le",
229 LogicalNot => "not",
230 LogicalAnd => "and",
231 LogicalOr => "or",
232 BitwiseNot => "bit_not",
233 BitwiseAnd => "bit_and",
234 BitwiseOr => "bit_or",
235 BitwiseXor => "bit_xor",
236 BitwiseLeftShift => "shl",
237 BitwiseRightShift => "shr",
238 AdditionAssignment => "add_assign",
239 SubtractionAssignment => "sub_assign",
240 MultiplicationAssignment => "mul_assign",
241 DivisionAssignment => "div_assign",
242 ModuloAssignment => "rem_assign",
243 BitwiseAndAssignment => "bit_and_assign",
244 BitwiseOrAssignment => "bit_or_assign",
245 BitwiseXorAssignment => "bit_xor_assign",
246 BitwiseLeftShiftAssignment => "shl_assign",
247 BitwiseRightShiftAssignment => "shr_assign",
248 Subscript => "index",
249 Indirection => "indirection",
250 AddressOf => "address_of",
251 StructureDereference => "struct_deref",
252 PointerToMember => "ptr_to_member",
253 FunctionCall => "call",
254 Comma => "comma",
255 New => "new",
256 NewArray => "new_array",
257 Delete => "delete",
258 DeleteArray => "delete_array",
259 })
260 }
261
262 pub fn all() -> Vec<CppOperator> {
265 use self::CppOperator::*;
266 vec![
267 Assignment,
268 Addition,
269 Subtraction,
270 UnaryPlus,
271 UnaryMinus,
272 Multiplication,
273 Division,
274 Modulo,
275 PrefixIncrement,
276 PostfixIncrement,
277 PrefixDecrement,
278 PostfixDecrement,
279 EqualTo,
280 NotEqualTo,
281 GreaterThan,
282 LessThan,
283 GreaterThanOrEqualTo,
284 LessThanOrEqualTo,
285 LogicalNot,
286 LogicalAnd,
287 LogicalOr,
288 BitwiseNot,
289 BitwiseAnd,
290 BitwiseOr,
291 BitwiseXor,
292 BitwiseLeftShift,
293 BitwiseRightShift,
294 AdditionAssignment,
295 SubtractionAssignment,
296 MultiplicationAssignment,
297 DivisionAssignment,
298 ModuloAssignment,
299 BitwiseAndAssignment,
300 BitwiseOrAssignment,
301 BitwiseXorAssignment,
302 BitwiseLeftShiftAssignment,
303 BitwiseRightShiftAssignment,
304 Subscript,
305 Indirection,
306 AddressOf,
307 StructureDereference,
308 PointerToMember,
309 FunctionCall,
310 Comma,
311 New,
312 NewArray,
313 Delete,
314 DeleteArray,
315 ]
316 }
317}