Fix clang-tidy findings in the guard-page tests
Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
1 file changed
+18
-8
@@ -19,6 +19,7 @@
|
|||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -86,7 +87,7 @@ class guarded_buffer
|
|||||||
{
|
{
|
||||||
REQUIRE(input.size() <= page);
|
REQUIRE(input.size() <= page);
|
||||||
unsigned char* const first = base + (2 * page) - input.size();
|
unsigned char* const first = base + (2 * page) - input.size();
|
||||||
std::memcpy(first, input.data(), input.size());
|
std::copy(input.begin(), input.end(), first);
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ class guarded_buffer
|
|||||||
{
|
{
|
||||||
REQUIRE(input.size() <= page);
|
REQUIRE(input.size() <= page);
|
||||||
unsigned char* const first = base + page;
|
unsigned char* const first = base + page;
|
||||||
std::memcpy(first, input.data(), input.size());
|
std::copy(input.begin(), input.end(), first);
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,18 +313,27 @@ void check_binary(guarded_buffer& guard, const std::vector<std::uint8_t>& bytes,
|
|||||||
|
|
||||||
// parse_float_native() at both ends of the guarded page, compared bit for bit
|
// parse_float_native() at both ends of the guarded page, compared bit for bit
|
||||||
// with converting the same token from a std::string
|
// with converting the same token from a std::string
|
||||||
|
template<typename FloatType>
|
||||||
|
std::uint64_t float_bits(FloatType value)
|
||||||
|
{
|
||||||
|
static_assert(sizeof(FloatType) <= sizeof(std::uint64_t), "unsupported floating-point width");
|
||||||
|
std::uint64_t bits = 0;
|
||||||
|
std::memcpy(&bits, &value, sizeof(value));
|
||||||
|
return bits;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename FloatType>
|
template<typename FloatType>
|
||||||
void check_float_native(guarded_buffer& guard, const std::string& token)
|
void check_float_native(guarded_buffer& guard, const std::string& token)
|
||||||
{
|
{
|
||||||
const std::size_t decimal_point = token.find('.');
|
const auto decimal_point = token.find('.');
|
||||||
const std::size_t exponent = token.find_first_of("eE");
|
const auto exponent = token.find_first_of("eE");
|
||||||
const std::size_t mantissa_end = exponent == std::string::npos ? token.size() : exponent;
|
const auto mantissa_end = exponent == std::string::npos ? token.size() : exponent;
|
||||||
const FloatType expected = nlohmann::detail::parse_float_native<FloatType>(token.data(), token.data() + token.size(), decimal_point, mantissa_end);
|
const auto expected = nlohmann::detail::parse_float_native<FloatType>(token.data(), token.data() + token.size(), decimal_point, mantissa_end);
|
||||||
for (int placement = 0; placement < 2; ++placement)
|
for (int placement = 0; placement < 2; ++placement)
|
||||||
{
|
{
|
||||||
const char* const first = reinterpret_cast<const char*>(placement == 0 ? guard.at_end(token) : guard.at_start(token));
|
const char* const first = reinterpret_cast<const char*>(placement == 0 ? guard.at_end(token) : guard.at_start(token));
|
||||||
const FloatType value = nlohmann::detail::parse_float_native<FloatType>(first, first + token.size(), decimal_point, mantissa_end);
|
const auto value = nlohmann::detail::parse_float_native<FloatType>(first, first + token.size(), decimal_point, mantissa_end);
|
||||||
CHECK(std::memcmp(&value, &expected, sizeof(value)) == 0);
|
CHECK(float_bits(value) == float_bits(expected));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
Reference in new issue
Block a user