boost/libs/pfr/test/run/destructuring_tie.cpp
2021-10-05 21:37:46 +02:00

61 lines
1.7 KiB
C++

// Copyright (c) 2018 Adam Butcher, Antony Polukhin
// Copyright (c) 2019-2021 Antony Polukhin
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/pfr/core.hpp>
#include <boost/core/lightweight_test.hpp>
auto parseHex(char const* p, size_t limit = ~0u) {
struct { size_t val; char const* rest; } res = { 0, p };
while (limit) {
int v = *res.rest;
if (v >= '0' && v <= '9')
v = v - '0';
else if (v >= 'A' && v <= 'F')
v = 10 + v - 'A';
else if (v >= 'a' && v <= 'f')
v = 10 + v - 'a';
else
break;
res.val = (res.val << 4) + v;
--limit;
++res.rest;
}
return res;
}
auto parseLinePrefix(char const* line) {
struct {
size_t byteCount, address, recordType; char const* rest;
} res;
using namespace boost::pfr;
tie_from_structure (res.byteCount, line) = parseHex(line, 2);
tie_from_structure (res.address, line) = parseHex(line, 4);
tie_from_structure (res.recordType, line) = parseHex(line, 2);
res.rest = line;
return res;
}
int main() {
auto line = "0860E000616263646566000063";
auto meta = parseLinePrefix(line);
BOOST_TEST_EQ(meta.byteCount, 8);
BOOST_TEST_EQ(meta.address, 24800);
BOOST_TEST_EQ(meta.recordType, 0);
BOOST_TEST_EQ(meta.rest, line + 8);
size_t val;
using namespace boost::pfr;
tie_from_structure (val, std::ignore) = parseHex("a73b");
BOOST_TEST_EQ(val, 42811);
tie_from_structure (std::ignore, line) = parseHex(line, 8);
BOOST_TEST_EQ(line, meta.rest);
return boost::report_errors();
}