ritual/
cpp_operator.rs

1//! Types for describing C++ operators
2
3use crate::cpp_type::CppType;
4use ritual_common::errors::{bail, Result};
5use serde_derive::{Deserialize, Serialize};
6
7/// Available types of C++ operators
8#[derive(Debug, PartialEq, Eq, Clone, Hash, Serialize, Deserialize)]
9pub enum CppOperator {
10    /// (type) a
11    Conversion(CppType),
12    /// a = b
13    Assignment,
14    /// a + b
15    Addition,
16    /// a - b
17    Subtraction,
18    /// +a
19    UnaryPlus,
20    /// -a
21    UnaryMinus,
22    /// a * b
23    Multiplication,
24    /// a / b
25    Division,
26    /// a % b
27    Modulo,
28    /// ++a
29    PrefixIncrement,
30    /// a++
31    PostfixIncrement,
32    /// --a
33    PrefixDecrement,
34    /// a--
35    PostfixDecrement,
36    /// a == b
37    EqualTo,
38    /// a != b
39    NotEqualTo,
40    /// a > b
41    GreaterThan,
42    /// a < b
43    LessThan,
44    /// a >= b
45    GreaterThanOrEqualTo,
46    /// a <= b
47    LessThanOrEqualTo,
48    /// !a
49    LogicalNot,
50    /// a && b
51    LogicalAnd,
52    /// a || b
53    LogicalOr,
54    /// ~a
55    BitwiseNot,
56    /// a & b
57    BitwiseAnd,
58    /// a | b
59    BitwiseOr,
60    /// a ^ b
61    BitwiseXor,
62    /// a << b
63    BitwiseLeftShift,
64    /// a >> b
65    BitwiseRightShift,
66
67    /// a += b
68    AdditionAssignment,
69    /// a -= b
70    SubtractionAssignment,
71    /// a *= b
72    MultiplicationAssignment,
73    /// a /= b
74    DivisionAssignment,
75    /// a %= b
76    ModuloAssignment,
77    /// a &= b
78    BitwiseAndAssignment,
79    /// a |= b
80    BitwiseOrAssignment,
81    /// a ^= b
82    BitwiseXorAssignment,
83    /// a <<= b
84    BitwiseLeftShiftAssignment,
85    /// a >>= b
86    BitwiseRightShiftAssignment,
87    /// a[b]
88    Subscript,
89    /// *a
90    Indirection,
91    /// &a
92    AddressOf,
93    /// a->b
94    StructureDereference,
95    /// a->*b
96    PointerToMember,
97    /// a(a1, a2)
98    FunctionCall,
99    /// a, b
100    Comma,
101    /// new type
102    New,
103    /// new type[n]
104    NewArray,
105    /// delete a
106    Delete,
107    /// delete[] a
108    DeleteArray,
109}
110
111/// Constraints applied to a C++ operator method
112/// of a certain kind
113#[derive(Debug, PartialEq, Eq, Clone)]
114pub struct CppOperatorInfo {
115    /// String that must appear after `"operator"` in the method name,
116    /// e.g. `">"` for `"operator>"`. `"operator"` prefix must
117    /// be present for any operator. This field is `None` for
118    /// conversion operator, as its name includes
119    /// corresponding C++ type instead of a fixed string.
120    pub function_name_suffix: Option<&'static str>,
121    /// Total number of arguments, including implicit "this" argument.
122    /// Most operators can be class members or free functions,
123    /// but total number of arguments is the same in both cases.
124    pub arguments_count: usize,
125    /// True if this kind of operator can have variadic arguments.
126    /// Only the function call operator has this property.
127    pub allows_variadic_arguments: bool,
128}
129
130impl CppOperator {
131    /// Reports information about this operator
132    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    /// Returns alphanumeric identifier for this operator
204    /// used to name wrapper functions.
205    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    /// Returns all existing operator kinds except for
263    /// conversion operator which includes an arbitrary C++ type.
264    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}