38#ifndef vtkStringScanner_h
39#define vtkStringScanner_h
41#include "vtkCharConvCompatibility.h"
42#include "vtkCommonCoreModule.h"
45#include "vtkfast_float.h"
49#include VTK_SCN(scn/chrono.h)
50#include VTK_SCN(scn/scan.h)
58VTK_ABI_NAMESPACE_BEGIN
66template <
typename T,
typename = FASTFLOAT_ENABLE_IF(fast_
float::is_supported_
float_type<T>::value)>
67VTK_ALWAYS_INLINE
auto from_chars(
const char* first,
const char* last, T& value,
68 std::chars_format format = std::chars_format::general) -> std::from_chars_result
70 static constexpr std::array<fast_float::chars_format, 5> std_to_fast_float_chars_format = { {
71 fast_float::chars_format::general,
72 fast_float::chars_format::scientific,
73 fast_float::chars_format::fixed,
74 fast_float::chars_format::general,
75 fast_float::chars_format::hex,
77 auto result = fast_float::from_chars<T>(first, last, value,
78 std_to_fast_float_chars_format[
static_cast<std::underlying_type_t<std::chars_format>
>(format)]);
79 return { result.ptr, result.ec };
82 typename = FASTFLOAT_ENABLE_IF(fast_float::is_supported_integer_type<T>::value)>
83VTK_ALWAYS_INLINE
auto from_chars(
const char* first,
const char* last, T& value,
int base = 10)
84 -> std::from_chars_result
86 auto result = fast_float::from_chars<T>(first, last, value, base);
87 return { result.ptr, result.ec };
97template <
typename T,
typename = FASTFLOAT_ENABLE_IF(fast_
float::is_supported_
float_type<T>::value)>
98VTK_ALWAYS_INLINE
auto from_chars(
const std::string_view str, T& value,
99 std::chars_format format = std::chars_format::general) -> std::from_chars_result
101 return vtk::from_chars<T>(str.data(), str.data() + str.size(), value, format);
104 typename = FASTFLOAT_ENABLE_IF(fast_float::is_supported_integer_type<T>::value)>
105VTK_ALWAYS_INLINE
auto from_chars(
const std::string_view str, T& value,
int base = 10)
106 -> std::from_chars_result
108 return vtk::from_chars<T>(str.data(), str.data() + str.size(), value, base);
113#define VTK_FROM_CHARS_RESULT_IF_ERROR_COMMAND(from_chars_result, value, command) \
114 switch (from_chars_result.ec) \
116 case std::errc::invalid_argument: \
118 vtkLogF(ERROR, "The given argument was invalid, failed to get the converted " #value "."); \
121 case std::errc::result_out_of_range: \
123 vtkLogF(ERROR, "The result is out of range, failed to get the converted " #value "."); \
131#define VTK_FROM_CHARS_RESULT_IF_ERROR_BREAK(from_chars_result, value) \
132 VTK_FROM_CHARS_RESULT_IF_ERROR_COMMAND(from_chars_result, value, break)
134#define VTK_FROM_CHARS_RESULT_IF_ERROR_RETURN(from_chars_result, value, returnValue) \
135 VTK_FROM_CHARS_RESULT_IF_ERROR_COMMAND(from_chars_result, value, return returnValue)
138#define VTK_FROM_CHARS_CONCAT_INNER(a, b) a##b
139#define VTK_FROM_CHARS_CONCAT(a, b) VTK_FROM_CHARS_CONCAT_INNER(a, b)
142#define VTK_FROM_CHARS_IF_ERROR_COMMAND(string, value, command) \
143 auto VTK_FROM_CHARS_CONCAT(_from_chars_result_, __LINE__) = vtk::from_chars(string, value); \
144 VTK_FROM_CHARS_RESULT_IF_ERROR_COMMAND( \
145 VTK_FROM_CHARS_CONCAT(_from_chars_result_, __LINE__), value, command)
147#define VTK_FROM_CHARS_IF_ERROR_BREAK(string, value) \
148 VTK_FROM_CHARS_IF_ERROR_COMMAND(string, value, break)
150#define VTK_FROM_CHARS_IF_ERROR_RETURN(string, value, returnValue) \
151 VTK_FROM_CHARS_IF_ERROR_COMMAND(string, value, return returnValue)
154#define VTK_FROM_CHARS_WITH_PARAM_IF_ERROR_COMMAND(string, value, param, command) \
155 auto VTK_FROM_CHARS_CONCAT(_from_chars_result_, __LINE__) = \
156 vtk::from_chars(string, value, param); \
157 VTK_FROM_CHARS_RESULT_IF_ERROR_COMMAND( \
158 VTK_FROM_CHARS_CONCAT(_from_chars_result_, __LINE__), value, command)
160#define VTK_FROM_CHARS_WITH_PARAM_IF_ERROR_BREAK(string, value, param) \
161 VTK_FROM_CHARS_WITH_PARAM_IF_ERROR_COMMAND(string, value, param, break)
163#define VTK_FROM_CHARS_WITH_PARAM_IF_ERROR_RETURN(string, value, param, returnValue) \
164 VTK_FROM_CHARS_WITH_PARAM_IF_ERROR_COMMAND(string, value, param, return returnValue)
169using scn::scan_result_type;
178using scn::scan_value;
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
VTK_ALWAYS_INLINE auto from_chars(const char *first, const char *last, T &value, std::chars_format format=std::chars_format::general) -> std::from_chars_result
Given a char* first and char* last, convert it to a number, and return a from_chars_result;.