|
7 | 7 | #ifndef CHAISCRIPT_ALGEBRAIC_HPP_ |
8 | 8 | #define CHAISCRIPT_ALGEBRAIC_HPP_ |
9 | 9 |
|
| 10 | +#include "../utility/fnv1a.hpp" |
| 11 | + |
10 | 12 | #include <string> |
11 | 13 |
|
12 | 14 | namespace chaiscript |
@@ -51,76 +53,39 @@ namespace chaiscript |
51 | 53 |
|
52 | 54 | static Opers to_operator(const std::string &t_str, bool t_is_unary = false) |
53 | 55 | { |
54 | | - if (t_str == "==") |
55 | | - { |
56 | | - return Opers::equals; |
57 | | - } else if (t_str == "<") { |
58 | | - return Opers::less_than; |
59 | | - } else if (t_str == ">") { |
60 | | - return Opers::greater_than; |
61 | | - } else if (t_str == "<=") { |
62 | | - return Opers::less_than_equal; |
63 | | - } else if (t_str == ">=") { |
64 | | - return Opers::greater_than_equal; |
65 | | - } else if (t_str == "!=") { |
66 | | - return Opers::not_equal; |
67 | | - } else if (t_str == "=") { |
68 | | - return Opers::assign; |
69 | | - } else if (t_str == "++") { |
70 | | - return Opers::pre_increment; |
71 | | - } else if (t_str == "--") { |
72 | | - return Opers::pre_decrement; |
73 | | - } else if (t_str == "*=") { |
74 | | - return Opers::assign_product; |
75 | | - } else if (t_str == "+=") { |
76 | | - return Opers::assign_sum; |
77 | | - } else if (t_str == "-=") { |
78 | | - return Opers::assign_difference; |
79 | | - } else if (t_str == "&=") { |
80 | | - return Opers::assign_bitwise_and; |
81 | | - } else if (t_str == "|=") { |
82 | | - return Opers::assign_bitwise_or; |
83 | | - } else if (t_str == "<<=") { |
84 | | - return Opers::assign_shift_left; |
85 | | - } else if (t_str == ">>=") { |
86 | | - return Opers::assign_shift_right; |
87 | | - } else if (t_str == "%=") { |
88 | | - return Opers::assign_remainder; |
89 | | - } else if (t_str == "^=") { |
90 | | - return Opers::assign_bitwise_xor; |
91 | | - } else if (t_str == "<<") { |
92 | | - return Opers::shift_left; |
93 | | - } else if (t_str == ">>") { |
94 | | - return Opers::shift_right; |
95 | | - } else if (t_str == "%") { |
96 | | - return Opers::remainder; |
97 | | - } else if (t_str == "&") { |
98 | | - return Opers::bitwise_and; |
99 | | - } else if (t_str == "|") { |
100 | | - return Opers::bitwise_or; |
101 | | - } else if (t_str == "^") { |
102 | | - return Opers::bitwise_xor; |
103 | | - } else if (t_str == "~") { |
104 | | - return Opers::bitwise_complement; |
105 | | - } else if (t_str == "+") { |
106 | | - if (t_is_unary) { |
107 | | - return Opers::unary_plus; |
108 | | - } else { |
109 | | - return Opers::sum; |
110 | | - } |
111 | | - } else if (t_str == "-") { |
112 | | - if (t_is_unary) { |
113 | | - return Opers::unary_minus; |
114 | | - } else { |
115 | | - return Opers::difference; |
116 | | - } |
117 | | - } else if (t_str == "/") { |
118 | | - return Opers::quotient; |
119 | | - } else if (t_str == "*") { |
120 | | - return Opers::product; |
121 | | - } else { |
122 | | - return Opers::invalid; |
123 | | - } |
| 56 | + const auto op_hash = utility::fnv1a_32(t_str.c_str()); |
| 57 | + switch (op_hash) { |
| 58 | + case utility::fnv1a_32("=="): { return Opers::equals; } |
| 59 | + case utility::fnv1a_32("<"): { return Opers::less_than; } |
| 60 | + case utility::fnv1a_32(">"): { return Opers::greater_than; } |
| 61 | + case utility::fnv1a_32("<="): { return Opers::less_than_equal; } |
| 62 | + case utility::fnv1a_32(">="): { return Opers::greater_than_equal; } |
| 63 | + case utility::fnv1a_32("!="): { return Opers::not_equal; } |
| 64 | + case utility::fnv1a_32("="): { return Opers::assign; } |
| 65 | + case utility::fnv1a_32("++"): { return Opers::pre_increment; } |
| 66 | + case utility::fnv1a_32("--"): { return Opers::pre_decrement; } |
| 67 | + case utility::fnv1a_32("*="): { return Opers::assign_product; } |
| 68 | + case utility::fnv1a_32("+="): { return Opers::assign_sum; } |
| 69 | + case utility::fnv1a_32("-="): { return Opers::assign_difference; } |
| 70 | + case utility::fnv1a_32("&="): { return Opers::assign_bitwise_and; } |
| 71 | + case utility::fnv1a_32("|="): { return Opers::assign_bitwise_or; } |
| 72 | + case utility::fnv1a_32("<<="): { return Opers::assign_shift_left; } |
| 73 | + case utility::fnv1a_32(">>="): { return Opers::assign_shift_right; } |
| 74 | + case utility::fnv1a_32("%="): { return Opers::assign_remainder; } |
| 75 | + case utility::fnv1a_32("^="): { return Opers::assign_bitwise_xor; } |
| 76 | + case utility::fnv1a_32("<<"): { return Opers::shift_left; } |
| 77 | + case utility::fnv1a_32(">>"): { return Opers::shift_right; } |
| 78 | + case utility::fnv1a_32("%"): { return Opers::remainder; } |
| 79 | + case utility::fnv1a_32("&"): { return Opers::bitwise_and; } |
| 80 | + case utility::fnv1a_32("|"): { return Opers::bitwise_or; } |
| 81 | + case utility::fnv1a_32("^"): { return Opers::bitwise_xor; } |
| 82 | + case utility::fnv1a_32("~"): { return Opers::bitwise_complement; } |
| 83 | + case utility::fnv1a_32("+"): { return t_is_unary ? Opers::unary_plus : Opers::sum; } |
| 84 | + case utility::fnv1a_32("-"): { return t_is_unary ? Opers::unary_minus : Opers::difference; } |
| 85 | + case utility::fnv1a_32("/"): { return Opers::quotient; } |
| 86 | + case utility::fnv1a_32("*"): { return Opers::product; } |
| 87 | + default: { return Opers::invalid; } |
| 88 | + } |
124 | 89 | } |
125 | 90 |
|
126 | 91 | }; |
|
0 commit comments