89 {
90
91 auto include = [](char input) {
92
93 return !std::isspace(input) && input != ':';
94 };
95
96
97 auto count = std::count_if(src.begin(), src.end(), include);
98
99
100 if (count % 2) {
101 throw std::length_error{ "Invalid hexadecimal input length" };
102 }
103
104 std::vector<uint8_t> result;
105 result.reserve(count / 2);
106
107
108 auto data = src.data();
109
110
111 auto char_to_int = [](const char *input) {
112 switch (std::tolower(*input)) {
113 case '0': return 0;
114 case '1': return 1;
115 case '2': return 2;
116 case '3': return 3;
117 case '4': return 4;
118 case '5': return 5;
119 case '6': return 6;
120 case '7': return 7;
121 case '8': return 8;
122 case '9': return 9;
123 case 'a': return 10;
124 case 'b': return 11;
125 case 'c': return 12;
126 case 'd': return 13;
127 case 'e': return 14;
128 case 'f': return 15;
129 default: throw std::range_error{ "Invalid hexadecimal input" };
130 }
131 };
132
133
134 while (data[0] != '\0') {
135
136 if (!include(data[0])) {
137 ++data;
138 continue;
139 }
140
141
142 auto high = char_to_int(data++);
143 auto low = char_to_int(data++);
144
145 result.push_back(high << 4 | low);
146 }
147
148 return result;
149 }
mdb_size_t count(MDB_cursor *cur)