GCC Code Coverage Report


Directory: ./
File: src/merger/w3map.cpp
Date: 2026-04-01 15:09:43
Exec Total Coverage
Lines: 0 69 0.0%
Functions: 0 10 0.0%
Branches: 0 40 0.0%

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