Skip to content

Commit 389dbd5

Browse files
committed
Fall back to fast_float when C++ stdlib doesn't provide from_chars for floats
1 parent d74d10f commit 389dbd5

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

CMakeLists.txt

+12
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,18 @@ IF(DOXYGEN_FOUND)
10381038
ADD_CUSTOM_TARGET(apidoc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generate the doxygen documentation into the doc directory.")
10391039
ENDIF()
10401040

1041+
include("cmake/Check-from_chars.cmake")
1042+
IF(NOT FROM_CHARS_WORKS)
1043+
CPMFindPackage(NAME fast_float
1044+
GIT_REPOSITORY https://github.com/fastfloat/fast_float
1045+
VERSION 6.1.0
1046+
EXCLUDE_FROM_ALL yes)
1047+
GET_TARGET_PROPERTY(fast_float_INCLUDE_DIRECTORIES
1048+
FastFloat::fast_float INTERFACE_INCLUDE_DIRECTORIES)
1049+
INCLUDE_DIRECTORIES(${fast_float_INCLUDE_DIRECTORIES})
1050+
ADD_DEFINITIONS(-DUSE_FAST_FLOAT)
1051+
ENDIF()
1052+
10411053
########### Top level include directories ###########
10421054
# This will be used for all compilations in sub-directories
10431055
INCLUDE_DIRECTORIES(

cmake/Check-from_chars.cmake

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
message(STATUS "Checking that std::from_chars for floats is supported by the C++ library")
2+
try_compile(FROM_CHARS_WORKS "${CMAKE_BINARY_DIR}" "${CMAKE_CURRENT_LIST_DIR}/check-from_chars.cpp")
3+
if(FROM_CHARS_WORKS)
4+
message(STATUS "Checking that std::from_chars for floats is supported by the C++ library - yes")
5+
else()
6+
message(STATUS "Checking that std::from_chars for floats is supported by the C++ library - NO")
7+
endif()

cmake/check-from_chars.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include <charconv>
2+
3+
int main()
4+
{
5+
const char str[] = "1.2345e3";
6+
float num;
7+
std::from_chars(str, str + sizeof str - 1, num);
8+
}

src/core/StelOBJ.cpp

+18-10
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@
2323
//#include "StelTextureMgr.hpp"
2424
#include "StelUtils.hpp"
2525

26-
#include <charconv>
26+
#if USE_FAST_FLOAT
27+
# include <fast_float/fast_float.h>
28+
using fast_float::from_chars;
29+
using fast_float::from_chars_result;
30+
#else
31+
# include <charconv>
32+
using std::from_chars;
33+
using std::from_chars_result;
34+
#endif
2735

2836
#include <QBuffer>
2937
#include <QDir>
@@ -156,7 +164,7 @@ bool StelOBJ::parseBool(const ParseParams &params, bool &out, int paramsStart)
156164

157165
bool StelOBJ::parseInt(const std::string_view& str, int& out)
158166
{
159-
return std::from_chars(str.data(), str.data() + str.size(), out).ec == std::errc{};
167+
return from_chars(str.data(), str.data() + str.size(), out).ec == std::errc{};
160168
}
161169

162170
bool StelOBJ::parseInt(const ParseParams &params, int &out, int paramsStart)
@@ -209,7 +217,7 @@ bool StelOBJ::parseFloat(const ParseParams &params, float &out, int paramsStart)
209217
}
210218

211219
const auto& str = params[paramsStart];
212-
const auto res = std::from_chars(str.data(), str.data() + str.size(), out);
220+
const auto res = from_chars(str.data(), str.data() + str.size(), out);
213221
return res.ec == std::errc{};
214222
}
215223

@@ -226,14 +234,14 @@ bool StelOBJ::parseVec3(const ParseParams& params, T &out, int paramsStart)
226234
const auto& yStr = params[paramsStart+1];
227235
const auto& zStr = params[paramsStart+2];
228236

229-
std::from_chars_result res;
230-
res = std::from_chars(xStr.data(), xStr.data() + xStr.size(), out[0]);
237+
from_chars_result res;
238+
res = from_chars(xStr.data(), xStr.data() + xStr.size(), out[0]);
231239
if (res.ec != std::errc{}) goto error;
232240

233-
res = std::from_chars(yStr.data(), yStr.data() + yStr.size(), out[1]);
241+
res = from_chars(yStr.data(), yStr.data() + yStr.size(), out[1]);
234242
if (res.ec != std::errc{}) goto error;
235243

236-
res = std::from_chars(zStr.data(), zStr.data() + zStr.size(), out[2]);
244+
res = from_chars(zStr.data(), zStr.data() + zStr.size(), out[2]);
237245
if (res.ec != std::errc{}) goto error;
238246

239247
return true;
@@ -255,11 +263,11 @@ bool StelOBJ::parseVec2(const ParseParams& params,T &out, int paramsStart)
255263
const auto& xStr = params[paramsStart+0];
256264
const auto& yStr = params[paramsStart+1];
257265

258-
std::from_chars_result res;
259-
res = std::from_chars(xStr.data(), xStr.data() + xStr.size(), out[0]);
266+
from_chars_result res;
267+
res = from_chars(xStr.data(), xStr.data() + xStr.size(), out[0]);
260268
if (res.ec != std::errc{}) goto error;
261269

262-
res = std::from_chars(yStr.data(), yStr.data() + yStr.size(), out[1]);
270+
res = from_chars(yStr.data(), yStr.data() + yStr.size(), out[1]);
263271
if (res.ec != std::errc{}) goto error;
264272

265273
return true;

0 commit comments

Comments
 (0)