HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
operator.hpp
1// Copyright Take Vos 2019, 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "../macros.hpp"
8#include <cstdint>
9#include <limits>
10#include <tuple>
11
12namespace hi::inline v1 {
13
14enum class graphic_character_t {
15 none = 0x00,
16 exclamation_mark = 0x01,
17 double_quote = 0x02,
18 hash = 0x03,
19 dollar = 0x04,
20 percent = 0x05,
21 ampersand = 0x06,
22 single_quote = 0x07,
23 open_paren = 0x08,
24 close_paren = 0x09,
25 star = 0x0a,
26 plus = 0x0b,
27 comma = 0x0c,
28 minus = 0x0d,
29 dot = 0x0e,
30 slash = 0x0f,
31 colon = 0x10,
32 semi_colon = 0x11,
33 less_than = 0x12,
34 equal = 0x13,
35 greater_than = 0x14,
36 question_mark = 0x15,
37 open_bracket = 0x16,
38 back_slash = 0x17,
39 close_bracket = 0x18,
40 carret = 0x19,
41 underscore = 0x1a,
42 back_quote = 0x1b,
43 open_brace = 0x1c,
44 pipe = 0x1d,
45 close_brace = 0x1e,
46 tilde = 0x1f
47};
48
49[[nodiscard]] constexpr graphic_character_t char_to_graphic_character(char x) noexcept
50{
51 switch (x) {
52 case '!': return graphic_character_t::exclamation_mark;
53 case '"': return graphic_character_t::double_quote;
54 case '#': return graphic_character_t::hash;
55 case '$': return graphic_character_t::dollar;
56 case '%': return graphic_character_t::percent;
57 case '&': return graphic_character_t::ampersand;
58 case '\'': return graphic_character_t::single_quote;
59 case '(': return graphic_character_t::open_paren;
60 case ')': return graphic_character_t::close_paren;
61 case '*': return graphic_character_t::star;
62 case '+': return graphic_character_t::plus;
63 case ',': return graphic_character_t::comma;
64 case '-': return graphic_character_t::minus;
65 case '.': return graphic_character_t::dot;
66 case '/': return graphic_character_t::slash;
67 case ':': return graphic_character_t::colon;
68 case ';': return graphic_character_t::semi_colon;
69 case '<': return graphic_character_t::less_than;
70 case '=': return graphic_character_t::equal;
71 case '>': return graphic_character_t::greater_than;
72 case '?': return graphic_character_t::question_mark;
73 case '[': return graphic_character_t::open_bracket;
74 case '\\': return graphic_character_t::back_slash;
75 case ']': return graphic_character_t::close_bracket;
76 case '^': return graphic_character_t::carret;
77 case '_': return graphic_character_t::underscore;
78 case '`': return graphic_character_t::back_quote;
79 case '{': return graphic_character_t::open_brace;
80 case '|': return graphic_character_t::pipe;
81 case '}': return graphic_character_t::close_brace;
82 case '~': return graphic_character_t::tilde;
83 default: return graphic_character_t::none;
84 }
85}
86
87[[nodiscard]] constexpr uint64_t operator_to_int(std::string_view str) noexcept
88{
89 uint64_t r = 0;
90 for (hilet c: str) {
91 r <<= 5;
92 r |= static_cast<uint64_t>(char_to_graphic_character(c));
93 }
94 return r;
95}
96
100[[nodiscard]] constexpr std::pair<uint8_t, bool> binary_operator_precedence(std::string_view str) noexcept
101{
102 switch (operator_to_int(str)) {
103 case operator_to_int("::"): return {uint8_t{1}, true};
104 case operator_to_int("("): return {uint8_t{2}, true};
105 case operator_to_int("["): return {uint8_t{2}, true};
106 case operator_to_int("."): return {uint8_t{2}, true};
107 case operator_to_int("->"): return {uint8_t{2}, true};
108 case operator_to_int(".*"): return {uint8_t{4}, true};
109 case operator_to_int("->*"): return {uint8_t{4}, true};
110 case operator_to_int("**"): return {uint8_t{4}, true};
111 case operator_to_int("*"): return {uint8_t{5}, true};
112 case operator_to_int("/"): return {uint8_t{5}, true};
113 case operator_to_int("%"): return {uint8_t{5}, true};
114 case operator_to_int("+"): return {uint8_t{6}, true};
115 case operator_to_int("-"): return {uint8_t{6}, true};
116 case operator_to_int("<<"): return {uint8_t{7}, true};
117 case operator_to_int(">>"): return {uint8_t{7}, true};
118 case operator_to_int("<=>"): return {uint8_t{8}, true};
119 case operator_to_int("<"): return {uint8_t{9}, true};
120 case operator_to_int(">"): return {uint8_t{9}, true};
121 case operator_to_int("<="): return {uint8_t{9}, true};
122 case operator_to_int(">="): return {uint8_t{9}, true};
123 case operator_to_int("=="): return {uint8_t{10}, true};
124 case operator_to_int("!="): return {uint8_t{10}, true};
125 case operator_to_int("&"): return {uint8_t{11}, true};
126 case operator_to_int("^"): return {uint8_t{12}, true};
127 case operator_to_int("|"): return {uint8_t{13}, true};
128 case operator_to_int("&&"): return {uint8_t{14}, true};
129 case operator_to_int("||"): return {uint8_t{15}, true};
130 case operator_to_int("?"): return {uint8_t{16}, false};
131 case operator_to_int("="): return {uint8_t{16}, false};
132 case operator_to_int("+="): return {uint8_t{16}, false};
133 case operator_to_int("-="): return {uint8_t{16}, false};
134 case operator_to_int("*="): return {uint8_t{16}, false};
135 case operator_to_int("/="): return {uint8_t{16}, false};
136 case operator_to_int("%="): return {uint8_t{16}, false};
137 case operator_to_int("<<="): return {uint8_t{16}, false};
138 case operator_to_int(">>="): return {uint8_t{16}, false};
139 case operator_to_int("&="): return {uint8_t{16}, false};
140 case operator_to_int("^="): return {uint8_t{16}, false};
141 case operator_to_int("|="): return {uint8_t{16}, false};
142 case operator_to_int(","): return {uint8_t{17}, true};
143 case operator_to_int("]"): return {uint8_t{17}, true};
144 case operator_to_int(")"): return {uint8_t{17}, true};
145 case operator_to_int("!"): return {uint8_t{18}, true};
146 default: return {std::numeric_limits<uint8_t>::max(), true};
147 }
148}
149
153[[nodiscard]] constexpr std::pair<uint8_t, bool> operator_precedence(std::string_view str, bool binary) noexcept
154{
155 return binary ? binary_operator_precedence(str) : std::pair<uint8_t, bool>{uint8_t{3}, false};
156}
157
158} // namespace hi::inline v1
DOXYGEN BUG.
Definition algorithm.hpp:16
constexpr std::pair< uint8_t, bool > binary_operator_precedence(std::string_view str) noexcept
Binary Operator Precedence according to C++.
Definition operator.hpp:100
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
T equal(T... args)
T max(T... args)