HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
operator.hpp
1// Copyright Take Vos 2019-2020.
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 <cstdint>
8#include <limits>
9#include <tuple>
10
11namespace tt {
12
13enum class graphic_character_t {
14 none = 0x00,
15 exclamation_mark = 0x01,
16 double_quote = 0x02,
17 hash = 0x03,
18 dollar = 0x04,
19 percent = 0x05,
20 ampersand = 0x06,
21 single_quote = 0x07,
22 open_paren = 0x08,
23 close_paren = 0x09,
24 star = 0x0a,
25 plus = 0x0b,
26 comma = 0x0c,
27 minus = 0x0d,
28 dot = 0x0e,
29 slash = 0x0f,
30 colon = 0x10,
31 semi_colon = 0x11,
32 less_than = 0x12,
33 equal = 0x13,
34 greater_than = 0x14,
35 question_mark = 0x15,
36 open_bracket = 0x16,
37 back_slash = 0x17,
38 close_bracket = 0x18,
39 carret = 0x19,
40 underscore = 0x1a,
41 back_quote = 0x1b,
42 open_brace = 0x1c,
43 pipe = 0x1d,
44 close_brace = 0x1e,
45 tilde = 0x1f
46};
47
48[[nodiscard]] constexpr graphic_character_t char_to_graphic_character(char x) noexcept
49{
50 switch (x) {
51 case '!': return graphic_character_t::exclamation_mark;
52 case '"': return graphic_character_t::double_quote;
53 case '#': return graphic_character_t::hash;
54 case '$': return graphic_character_t::dollar;
55 case '%': return graphic_character_t::percent;
56 case '&': return graphic_character_t::ampersand;
57 case '\'': return graphic_character_t::single_quote;
58 case '(': return graphic_character_t::open_paren;
59 case ')': return graphic_character_t::close_paren;
60 case '*': return graphic_character_t::star;
61 case '+': return graphic_character_t::plus;
62 case ',': return graphic_character_t::comma;
63 case '-': return graphic_character_t::minus;
64 case '.': return graphic_character_t::dot;
65 case '/': return graphic_character_t::slash;
66 case ':': return graphic_character_t::colon;
67 case ';': return graphic_character_t::semi_colon;
68 case '<': return graphic_character_t::less_than;
69 case '=': return graphic_character_t::equal;
70 case '>': return graphic_character_t::greater_than;
71 case '?': return graphic_character_t::question_mark;
72 case '[': return graphic_character_t::open_bracket;
73 case '\\': return graphic_character_t::back_slash;
74 case ']': return graphic_character_t::close_bracket;
75 case '^': return graphic_character_t::carret;
76 case '_': return graphic_character_t::underscore;
77 case '`': return graphic_character_t::back_quote;
78 case '{': return graphic_character_t::open_brace;
79 case '|': return graphic_character_t::pipe;
80 case '}': return graphic_character_t::close_brace;
81 case '~': return graphic_character_t::tilde;
82 default: return graphic_character_t::none;
83 }
84}
85
86[[nodiscard]] constexpr uint64_t operator_to_int(char const *s) noexcept
87{
88 uint64_t r = 0;
89 for (; *s != '\0'; s++) {
90 r <<= 5;
91 r |= static_cast<uint64_t>(char_to_graphic_character(*s));
92 }
93 return r;
94}
95
96
100[[nodiscard]] std::pair<uint8_t,bool> binary_operator_precedence(char const *str) noexcept {
101 switch (operator_to_int(str)) {
102 case operator_to_int("::"): return {uint8_t{1}, true};
103 case operator_to_int("("): return {uint8_t{2}, 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{4}, 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{5}, 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{6}, true};
114 case operator_to_int("-"): return {uint8_t{6}, true};
115 case operator_to_int("<<"): return {uint8_t{7}, true};
116 case operator_to_int(">>"): return {uint8_t{7}, true};
117 case operator_to_int("<=>"): return {uint8_t{8}, true};
118 case operator_to_int("<"): return {uint8_t{9}, 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{10}, true};
123 case operator_to_int("!="): return {uint8_t{10}, true};
124 case operator_to_int("&"): return {uint8_t{11}, true};
125 case operator_to_int("^"): return {uint8_t{12}, true};
126 case operator_to_int("|"): return {uint8_t{13}, true};
127 case operator_to_int("&&"): return {uint8_t{14}, true};
128 case operator_to_int("||"): return {uint8_t{15}, true};
129 case operator_to_int("?"): return {uint8_t{16}, false};
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{17}, true};
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{18}, true};
145 default: return {std::numeric_limits<uint8_t>::max(), true};
146 }
147}
148
152[[nodiscard]] std::pair<uint8_t,bool> operator_precedence(char const *str, bool binary) noexcept {
153 return binary ? binary_operator_precedence(str) : std::pair<uint8_t,bool>{uint8_t{3}, false};
154}
155
156}
STL namespace.
T equal(T... args)
T max(T... args)