| 143 | |
| 144 | template<typename T, typename F, typename... Args> |
| 145 | static bool doParseNumber(const std::string_view& str, size_t& position, T& output, F&& fn, Args&&... args) { |
| 146 | const auto* startPtr = str.data() + position; |
| 147 | const auto* maxEndPtr = str.data() + str.size(); |
| 148 | char* endPtr = nullptr; |
| 149 | output = fn(startPtr, &endPtr, std::forward<Args>(args)...); |
| 150 | if (endPtr != nullptr && endPtr != startPtr && endPtr <= maxEndPtr) { |
| 151 | position += static_cast<size_t>(endPtr - startPtr); |
| 152 | return true; |
| 153 | } else { |
| 154 | return false; |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | std::optional<double> TextParser::parseDouble() { |
| 159 | double d; |