2022-10-20 15:06:26 +02:00
|
|
|
|
|
|
|
|
// Copyright Catch2 Authors
|
|
|
|
|
// Distributed under the Boost Software License, Version 1.0.
|
2022-10-28 11:22:53 +02:00
|
|
|
// (See accompanying file LICENSE.txt or copy at
|
2022-10-20 15:06:26 +02:00
|
|
|
// https://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
|
|
|
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
|
|
|
|
|
|
#include <catch2/internal/catch_parse_numbers.hpp>
|
|
|
|
|
|
|
|
|
|
#include <catch2/internal/catch_compiler_capabilities.hpp>
|
|
|
|
|
#include <catch2/internal/catch_string_manip.hpp>
|
|
|
|
|
|
|
|
|
|
#include <limits>
|
|
|
|
|
|
|
|
|
|
namespace Catch {
|
|
|
|
|
|
|
|
|
|
Optional<unsigned int> parseUInt(std::string const& input, int base) {
|
|
|
|
|
auto trimmed = trim( input );
|
|
|
|
|
// std::stoull is annoying and accepts numbers starting with '-',
|
|
|
|
|
// it just negates them into unsigned int
|
|
|
|
|
if ( trimmed.empty() || trimmed[0] == '-' ) {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CATCH_TRY {
|
|
|
|
|
size_t pos = 0;
|
|
|
|
|
const auto ret = std::stoull( trimmed, &pos, base );
|
|
|
|
|
|
|
|
|
|
// We did not consume the whole input, so there is an issue
|
|
|
|
|
// This can be bunch of different stuff, like multiple numbers
|
|
|
|
|
// in the input, or invalid digits/characters and so on. Either
|
|
|
|
|
// way, we do not want to return the partially parsed result.
|
|
|
|
|
if ( pos != trimmed.size() ) {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
// Too large
|
|
|
|
|
if ( ret > std::numeric_limits<unsigned int>::max() ) {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
return static_cast<unsigned int>(ret);
|
|
|
|
|
} CATCH_CATCH_ANON( std::exception const& ) {
|
|
|
|
|
// There was a larger issue with the input, e.g. the parsed
|
|
|
|
|
// number would be too large to fit within ull.
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Catch
|