mirror of
https://github.com/boostorg/pfr.git
synced 2026-01-19 04:22:13 +00:00
72 lines
2.0 KiB
C++
72 lines
2.0 KiB
C++
// Copyright (c) 2018 Adam Butcher, Antony Polukhin
|
|
// Copyright (c) 2019-2020 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/precise/core.hpp>
|
|
#include <boost/core/lightweight_test.hpp>
|
|
|
|
#if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE
|
|
|
|
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();
|
|
}
|
|
|
|
#else // C++14 without loophole
|
|
|
|
#include <iostream>
|
|
|
|
int main(int, char** argv) {
|
|
std::cerr << argv[0] << ": Not supported in C++14 without reflection loophole.\n";
|
|
}
|
|
|
|
#endif
|