mirror of
https://github.com/fastfloat/fast_float.git
synced 2026-06-15 00:16:11 +08:00
Compare commits
3 Commits
30868f8734
...
8234a89623
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8234a89623 | ||
|
|
0dce102cb4 | ||
|
|
82882b237d |
@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
|
||||
project(fast_float VERSION 8.2.8 LANGUAGES CXX)
|
||||
project(fast_float VERSION 8.2.9 LANGUAGES CXX)
|
||||
set(FASTFLOAT_CXX_STANDARD 11 CACHE STRING "the C++ standard to use for fastfloat")
|
||||
set(CMAKE_CXX_STANDARD ${FASTFLOAT_CXX_STANDARD})
|
||||
option(FASTFLOAT_TEST "Enable tests" OFF)
|
||||
|
||||
@ -531,7 +531,7 @@ sufficiently recent version of CMake (3.11 or better at least):
|
||||
FetchContent_Declare(
|
||||
fast_float
|
||||
GIT_REPOSITORY https://github.com/fastfloat/fast_float.git
|
||||
GIT_TAG tags/v8.2.8
|
||||
GIT_TAG tags/v8.2.9
|
||||
GIT_SHALLOW TRUE)
|
||||
|
||||
FetchContent_MakeAvailable(fast_float)
|
||||
@ -547,7 +547,7 @@ You may also use [CPM](https://github.com/cpm-cmake/CPM.cmake), like so:
|
||||
CPMAddPackage(
|
||||
NAME fast_float
|
||||
GITHUB_REPOSITORY "fastfloat/fast_float"
|
||||
GIT_TAG v8.2.8)
|
||||
GIT_TAG v8.2.9)
|
||||
```
|
||||
|
||||
## Using as single header
|
||||
@ -559,7 +559,7 @@ if desired as described in the command line help.
|
||||
|
||||
You may directly download automatically generated single-header files:
|
||||
|
||||
<https://github.com/fastfloat/fast_float/releases/download/v8.2.8/fast_float.h>
|
||||
<https://github.com/fastfloat/fast_float/releases/download/v8.2.9/fast_float.h>
|
||||
|
||||
## Benchmarking
|
||||
|
||||
|
||||
@ -600,7 +600,8 @@ parse_int_string(UC const *p, UC const *pend, T &value,
|
||||
|
||||
UC const *const start_digits = p;
|
||||
|
||||
FASTFLOAT_IF_CONSTEXPR17((std::is_same<T, std::uint8_t>::value)) {
|
||||
FASTFLOAT_IF_CONSTEXPR17(
|
||||
(std::is_same<T, std::uint8_t>::value && sizeof(UC) == 1)) {
|
||||
if (base == 10) {
|
||||
const size_t len = (size_t)(pend - p);
|
||||
if (len == 0) {
|
||||
@ -692,7 +693,8 @@ parse_int_string(UC const *p, UC const *pend, T &value,
|
||||
}
|
||||
}
|
||||
|
||||
FASTFLOAT_IF_CONSTEXPR17((std::is_same<T, std::uint16_t>::value)) {
|
||||
FASTFLOAT_IF_CONSTEXPR17(
|
||||
(std::is_same<T, std::uint16_t>::value && sizeof(UC) == 1)) {
|
||||
if (base == 10) {
|
||||
const size_t len = size_t(pend - p);
|
||||
if (len == 0) {
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
|
||||
#define FASTFLOAT_VERSION_MAJOR 8
|
||||
#define FASTFLOAT_VERSION_MINOR 2
|
||||
#define FASTFLOAT_VERSION_PATCH 8
|
||||
#define FASTFLOAT_VERSION_PATCH 9
|
||||
|
||||
#define FASTFLOAT_STRINGIZE_IMPL(x) #x
|
||||
#define FASTFLOAT_STRINGIZE(x) FASTFLOAT_STRINGIZE_IMPL(x)
|
||||
|
||||
@ -1295,6 +1295,59 @@ int main() {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
// The uint8_t and uint16_t base-10 paths use a byte-oriented fast path. A
|
||||
// wider code unit whose low byte is an ASCII digit (e.g. U+2131..U+2139) must
|
||||
// not be mistaken for that digit. The generic path already rejects these for
|
||||
// int; the fixed-width fast paths must agree. Lengths of 1..5 exercise both
|
||||
// the uint8_t path and the 4-digit uint16_t SWAR path.
|
||||
{
|
||||
const std::u16string bad16[] = {
|
||||
u"ℹ", u"ℱℲ", u"ℱℲℳ", u"ℱℲℳℴ", u"ℱℲℳℴℵ",
|
||||
};
|
||||
const std::u32string bad32[] = {
|
||||
U"ℹ",
|
||||
U"ℱℲℳ",
|
||||
U"ℱℲℳℴ",
|
||||
U"ℱℲℳℴℵ",
|
||||
};
|
||||
bool failed = false;
|
||||
for (auto const &s : bad16) {
|
||||
uint8_t r8 = 123;
|
||||
auto a8 = fast_float::from_chars(s.data(), s.data() + s.size(), r8);
|
||||
if (a8.ec == std::errc()) {
|
||||
failed = true;
|
||||
std::cerr << "Incorrectly parsed wide units as uint8_t " << unsigned(r8)
|
||||
<< "." << std::endl;
|
||||
}
|
||||
uint16_t r16 = 123;
|
||||
auto a16 = fast_float::from_chars(s.data(), s.data() + s.size(), r16);
|
||||
if (a16.ec == std::errc()) {
|
||||
failed = true;
|
||||
std::cerr << "Incorrectly parsed wide units as uint16_t " << r16 << "."
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
for (auto const &s : bad32) {
|
||||
uint8_t r8 = 123;
|
||||
auto a8 = fast_float::from_chars(s.data(), s.data() + s.size(), r8);
|
||||
if (a8.ec == std::errc()) {
|
||||
failed = true;
|
||||
std::cerr << "Incorrectly parsed wide units as uint8_t " << unsigned(r8)
|
||||
<< "." << std::endl;
|
||||
}
|
||||
uint16_t r16 = 123;
|
||||
auto a16 = fast_float::from_chars(s.data(), s.data() + s.size(), r16);
|
||||
if (a16.ec == std::errc()) {
|
||||
failed = true;
|
||||
std::cerr << "Incorrectly parsed wide units as uint16_t " << r16 << "."
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user