Line data Source code
1 : /* Cam Mannett 2020 2 : * 3 : * See LICENSE file 4 : */ 5 : 6 : #include "malbolge/utility/from_chars.hpp" 7 : 8 : #include <cstdlib> 9 : #include <cmath> 10 : 11 : using namespace malbolge; 12 : 13 : template <> 14 8 : float utility::from_chars<float>(std::string_view str) 15 : { 16 8 : if (str.empty()) [[unlikely]] { 17 1 : throw std::invalid_argument{"Empty from_chars input string"}; 18 : } 19 : 20 : char* end; 21 7 : const auto output = std::strtof(str.data(), &end); 22 7 : if (output == HUGE_VALF) { 23 1 : throw std::out_of_range{"Result not representatable by T"}; 24 6 : } else if (end == str.data()) { 25 1 : throw std::invalid_argument{"Unable to convert using from_chars"}; 26 : } 27 : 28 5 : return output; 29 : } 30 : 31 : template <> 32 8 : double utility::from_chars<double>(std::string_view str) 33 : { 34 8 : if (str.empty()) [[unlikely]] { 35 1 : throw std::invalid_argument{"Empty from_chars input string"}; 36 : } 37 : 38 : char* end; 39 7 : const auto output = std::strtod(str.data(), &end); 40 7 : if (output == HUGE_VAL) { 41 1 : throw std::out_of_range{"Result not representatable by T"}; 42 6 : } else if (end == str.data()) { 43 1 : throw std::invalid_argument{"Unable to convert using from_chars"}; 44 : } 45 : 46 5 : return output; 47 : } 48 : 49 : template <> 50 36 : math::ternary utility::from_chars<math::ternary>(std::string_view str) 51 : { 52 : // If this is a non-trit conversion, start by converting to decimal 53 36 : if (!str.starts_with("t")) { 54 29 : return from_chars<math::ternary::underlying_type>(str); 55 : } 56 : 57 7 : str.remove_prefix(1); 58 7 : return math::ternary::tritset_type{str}; 59 : }