ChaiScript
chaiscript_algebraic.hpp
1 // This file is distributed under the BSD License.
2 // See "license.txt" for details.
3 // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com)
4 // Copyright 2009-2018, Jason Turner (jason@emptycrate.com)
5 // http://www.chaiscript.com
6 
7 // This is an open source non-commercial project. Dear PVS-Studio, please check it.
8 // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
9 
10 #ifndef CHAISCRIPT_ALGEBRAIC_HPP_
11 #define CHAISCRIPT_ALGEBRAIC_HPP_
12 
13 #include "../utility/hash.hpp"
14 
15 #include <string>
16 
17 namespace chaiscript {
18  struct Operators {
19  enum class Opers {
20  equals,
21  less_than,
22  greater_than,
23  less_than_equal,
24  greater_than_equal,
25  not_equal,
26  assign,
27  pre_increment,
28  pre_decrement,
29  assign_product,
30  assign_sum,
31  assign_quotient,
32  assign_difference,
33  assign_bitwise_and,
34  assign_bitwise_or,
35  assign_shift_left,
36  assign_shift_right,
37  assign_remainder,
38  assign_bitwise_xor,
39  shift_left,
40  shift_right,
41  remainder,
42  bitwise_and,
43  bitwise_or,
44  bitwise_xor,
45  bitwise_complement,
46  sum,
47  quotient,
48  product,
49  difference,
50  unary_plus,
51  unary_minus,
52  invalid
53  };
54 
55  constexpr static const char *to_string(Opers t_oper) noexcept {
56  constexpr const char *opers[]
57  = {"", "==", "<", ">", "<=", ">=", "!=", "", "=", "++", "--", "*=", "+=", "/=", "-=", "", "&=", "|=", "<<=", ">>=", "%=", "^=", "", "<<", ">>", "%", "&", "|", "^", "~", "", "+", "/", "*", "-", "+", "-", ""};
58  return opers[static_cast<int>(t_oper)];
59  }
60 
61  constexpr static Opers to_operator(std::string_view t_str, bool t_is_unary = false) noexcept {
62 #ifdef CHAISCRIPT_MSVC
63 #pragma warning(push)
64 #pragma warning(disable : 4307)
65 #endif
66 
67  const auto op_hash = utility::hash(t_str);
68  switch (op_hash) {
69  case utility::hash("=="): {
70  return Opers::equals;
71  }
72  case utility::hash("<"): {
73  return Opers::less_than;
74  }
75  case utility::hash(">"): {
76  return Opers::greater_than;
77  }
78  case utility::hash("<="): {
79  return Opers::less_than_equal;
80  }
81  case utility::hash(">="): {
82  return Opers::greater_than_equal;
83  }
84  case utility::hash("!="): {
85  return Opers::not_equal;
86  }
87  case utility::hash("="): {
88  return Opers::assign;
89  }
90  case utility::hash("++"): {
91  return Opers::pre_increment;
92  }
93  case utility::hash("--"): {
94  return Opers::pre_decrement;
95  }
96  case utility::hash("*="): {
97  return Opers::assign_product;
98  }
99  case utility::hash("+="): {
100  return Opers::assign_sum;
101  }
102  case utility::hash("-="): {
103  return Opers::assign_difference;
104  }
105  case utility::hash("&="): {
106  return Opers::assign_bitwise_and;
107  }
108  case utility::hash("|="): {
109  return Opers::assign_bitwise_or;
110  }
111  case utility::hash("<<="): {
112  return Opers::assign_shift_left;
113  }
114  case utility::hash(">>="): {
115  return Opers::assign_shift_right;
116  }
117  case utility::hash("%="): {
118  return Opers::assign_remainder;
119  }
120  case utility::hash("^="): {
121  return Opers::assign_bitwise_xor;
122  }
123  case utility::hash("<<"): {
124  return Opers::shift_left;
125  }
126  case utility::hash(">>"): {
127  return Opers::shift_right;
128  }
129  case utility::hash("%"): {
130  return Opers::remainder;
131  }
132  case utility::hash("&"): {
133  return Opers::bitwise_and;
134  }
135  case utility::hash("|"): {
136  return Opers::bitwise_or;
137  }
138  case utility::hash("^"): {
139  return Opers::bitwise_xor;
140  }
141  case utility::hash("~"): {
142  return Opers::bitwise_complement;
143  }
144  case utility::hash("+"): {
145  return t_is_unary ? Opers::unary_plus : Opers::sum;
146  }
147  case utility::hash("-"): {
148  return t_is_unary ? Opers::unary_minus : Opers::difference;
149  }
150  case utility::hash("/"): {
151  return Opers::quotient;
152  }
153  case utility::hash("*"): {
154  return Opers::product;
155  }
156  default: {
157  return Opers::invalid;
158  }
159  }
160 #ifdef CHAISCRIPT_MSVC
161 #pragma warning(pop)
162 #endif
163  }
164  };
165 } // namespace chaiscript
166 
167 #endif /* _CHAISCRIPT_ALGEBRAIC_HPP */
Namespace chaiscript contains every API call that the average user will be concerned with...
Definition: chaiscript_algebraic.hpp:18