| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include <string> | ||
| 2 | #include <unordered_map> | ||
| 3 | #include <gsl/gsl> | ||
| 4 | |||
| 5 | #include "merger.hpp" | ||
| 6 | |||
| 7 | namespace assmpq::merger { | ||
| 8 | |||
| 9 | struct CliffKey { | ||
| 10 | uint8_t la0, la1, la2, la3, var; | ||
| 11 | }; | ||
| 12 | struct RampKey { | ||
| 13 | uint8_t la0, la1, la2, la3, var, par; | ||
| 14 | }; | ||
| 15 | |||
| 16 | |||
| 17 | // NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers) | ||
| 18 | static inline | ||
| 19 | ✗ | auto pack_cliff_key(uint8_t la0, uint8_t la1, uint8_t la2, uint8_t la3, uint8_t var) -> uint32_t | |
| 20 | { | ||
| 21 | ✗ | return static_cast<uint32_t>( la0 & 0b11) | |
| 22 | ✗ | | static_cast<uint32_t>((la1 & 0b11) << 2) | |
| 23 | ✗ | | static_cast<uint32_t>((la2 & 0b11) << 4) | |
| 24 | ✗ | | static_cast<uint32_t>((la3 & 0b11) << 6) | |
| 25 | ✗ | | static_cast<uint32_t>((var & 0b11) << 8); | |
| 26 | } | ||
| 27 | |||
| 28 | static inline | ||
| 29 | ✗ | auto unpack_cliff_key(uint32_t key) -> CliffKey | |
| 30 | { | ||
| 31 | return { | ||
| 32 | ✗ | .la0 = static_cast<uint8_t>( key & 0b11), | |
| 33 | ✗ | .la1 = static_cast<uint8_t>((key >> 2) & 0b11), | |
| 34 | ✗ | .la2 = static_cast<uint8_t>((key >> 4) & 0b11), | |
| 35 | ✗ | .la3 = static_cast<uint8_t>((key >> 6) & 0b11), | |
| 36 | ✗ | .var = static_cast<uint8_t>((key >> 8) & 0b11) | |
| 37 | ✗ | }; | |
| 38 | } | ||
| 39 | |||
| 40 | static inline | ||
| 41 | ✗ | auto pack_ramp_key(uint8_t la0, uint8_t la1, uint8_t la2, uint8_t la3, uint8_t var, uint8_t par) -> uint32_t | |
| 42 | { | ||
| 43 | ✗ | return static_cast<uint32_t>( la0 & 0b1111) | |
| 44 | ✗ | | static_cast<uint32_t>((la1 & 0b1111) << 4) | |
| 45 | ✗ | | static_cast<uint32_t>((la2 & 0b1111) << 8) | |
| 46 | ✗ | | static_cast<uint32_t>((la3 & 0b1111) << 12) | |
| 47 | ✗ | | static_cast<uint32_t>((var & 0b1111) << 16) | |
| 48 | ✗ | | static_cast<uint32_t>((par & 0b1111) << 20); | |
| 49 | } | ||
| 50 | |||
| 51 | static inline | ||
| 52 | ✗ | auto unpack_ramp_key(uint32_t key) -> RampKey | |
| 53 | { | ||
| 54 | return { | ||
| 55 | ✗ | .la0 = static_cast<uint8_t>( key & 0b1111), | |
| 56 | ✗ | .la1 = static_cast<uint8_t>((key >> 4) & 0b1111), | |
| 57 | ✗ | .la2 = static_cast<uint8_t>((key >> 8) & 0b1111), | |
| 58 | ✗ | .la3 = static_cast<uint8_t>((key >> 12) & 0b1111), | |
| 59 | ✗ | .var = static_cast<uint8_t>((key >> 16) & 0b1111), | |
| 60 | ✗ | .par = static_cast<uint8_t>((key >> 20) & 0b1111) | |
| 61 | ✗ | }; | |
| 62 | } | ||
| 63 | // NOLINTEND(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers) | ||
| 64 | |||
| 65 | static inline | ||
| 66 | ✗ | auto decode_geo_char(char char_code) -> uint8_t | |
| 67 | { | ||
| 68 | static const std::unordered_map<char, uint8_t> char_to_code = { | ||
| 69 | { '0', '\0' }, { 'a', '\0' }, { 'A', '\0' }, | ||
| 70 | { '1', '\1' }, { 'b', '\1' }, { 'B', '\1' }, | ||
| 71 | { '2', '\2' }, { 'c', '\2' }, { 'C', '\2' }, | ||
| 72 | { '3', '\3' }, | ||
| 73 | { 'l', '\4' }, { 'L', '\4' }, | ||
| 74 | { 'h', '\5' }, { 'H', '\5' }, | ||
| 75 | { 'x', '\6' }, { 'X', '\6' }, | ||
| 76 | ✗ | }; | |
| 77 | ✗ | return char_to_code.at(char_code); | |
| 78 | } | ||
| 79 | |||
| 80 | static inline | ||
| 81 | ✗ | auto encode_geo_char(uint8_t code) -> char | |
| 82 | { | ||
| 83 | static const std::unordered_map<uint8_t, char> code_to_char = { | ||
| 84 | { '\0', 'A' }, | ||
| 85 | { '\1', 'B' }, | ||
| 86 | { '\2', 'C' }, | ||
| 87 | { '\3', 'L' }, | ||
| 88 | { '\4', 'H' }, | ||
| 89 | { '\5', 'X' }, | ||
| 90 | ✗ | }; | |
| 91 | ✗ | return code_to_char.at(code); | |
| 92 | } | ||
| 93 | |||
| 94 | ✗ | auto get_cliff_key_from_geo_name(const std::string &str_key) -> uint32_t | |
| 95 | { | ||
| 96 | ✗ | Ensures(str_key.length() >= 5); | |
| 97 | ✗ | return pack_cliff_key( | |
| 98 | ✗ | decode_geo_char(static_cast<char>(str_key[3])), | |
| 99 | ✗ | decode_geo_char(static_cast<char>(str_key[2])), | |
| 100 | ✗ | decode_geo_char(static_cast<char>(str_key[1])), | |
| 101 | ✗ | decode_geo_char(static_cast<char>(str_key[0])), | |
| 102 | ✗ | decode_geo_char(static_cast<char>(str_key[4])) | |
| 103 | ✗ | ); | |
| 104 | } | ||
| 105 | |||
| 106 | ✗ | auto convert_cliff_key_to_string(uint32_t key) -> std::string | |
| 107 | { | ||
| 108 | ✗ | const CliffKey s_key = unpack_cliff_key(key); | |
| 109 | return std::string { | ||
| 110 | ✗ | encode_geo_char(s_key.la3), | |
| 111 | ✗ | encode_geo_char(s_key.la2), | |
| 112 | ✗ | encode_geo_char(s_key.la1), | |
| 113 | ✗ | encode_geo_char(s_key.la0), | |
| 114 | ✗ | static_cast<char>('0' + s_key.var), | |
| 115 | ✗ | }; | |
| 116 | } | ||
| 117 | |||
| 118 | ✗ | auto get_ramp_key_from_geo_name(const std::string &str_key, uint8_t part) -> uint32_t | |
| 119 | { | ||
| 120 | ✗ | Ensures(str_key.length() >= 5); | |
| 121 | ✗ | return pack_ramp_key( | |
| 122 | ✗ | decode_geo_char(static_cast<char>(str_key[3])), | |
| 123 | ✗ | decode_geo_char(static_cast<char>(str_key[2])), | |
| 124 | ✗ | decode_geo_char(static_cast<char>(str_key[1])), | |
| 125 | ✗ | decode_geo_char(static_cast<char>(str_key[0])), | |
| 126 | ✗ | decode_geo_char(static_cast<char>(str_key[4])), | |
| 127 | part | ||
| 128 | ✗ | ); | |
| 129 | } | ||
| 130 | |||
| 131 | ✗ | auto convert_ramp_key_to_string(uint32_t key) -> std::string | |
| 132 | { | ||
| 133 | ✗ | const RampKey s_key = unpack_ramp_key(key); | |
| 134 | return std::string { | ||
| 135 | ✗ | encode_geo_char(s_key.la3), | |
| 136 | ✗ | encode_geo_char(s_key.la2), | |
| 137 | ✗ | encode_geo_char(s_key.la1), | |
| 138 | ✗ | encode_geo_char(s_key.la0), | |
| 139 | ✗ | static_cast<char>('0' + s_key.var), | |
| 140 | ✗ | static_cast<char>('0' + s_key.par), | |
| 141 | ✗ | }; | |
| 142 | } | ||
| 143 | |||
| 144 | |||
| 145 | } // namespace assmpq::merger | ||
| 146 |