// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #pragma once #include #include #include #include "core/common/common.h" namespace onnxruntime { /** * Tries to parse a value from an entire string. */ template bool TryParseString(const std::string& str, T& value) { if (std::is_integral::value && std::is_unsigned::value) { // if T is unsigned integral type, reject negative values which will wrap if (!str.empty() && str[0] == '-') { return false; } } // don't allow leading whitespace if (!str.empty() && std::isspace(str[0], std::locale::classic())) { return false; } std::istringstream is{str}; is.imbue(std::locale::classic()); T parsed_value{}; const bool parse_successful = is >> parsed_value && is.get() == std::istringstream::traits_type::eof(); // don't allow trailing characters if (!parse_successful) { return false; } value = std::move(parsed_value); return true; } inline bool TryParseString(const std::string& str, std::string& value) { value = str; return true; } inline bool TryParseString(const std::string& str, bool& value) { if (str == "0" || str == "False" || str == "false") { value = false; return true; } if (str == "1" || str == "True" || str == "true") { value = true; return true; } return false; } /** * Parses a value from an entire string. */ template Status ParseString(const std::string& s, T& value) { ORT_RETURN_IF_NOT(TryParseString(s, value), "Failed to parse value: \"", value, "\""); return Status::OK(); } /** * Parses a value from an entire string. */ template T ParseString(const std::string& s) { T value{}; ORT_THROW_IF_ERROR(ParseString(s, value)); return value; } } // namespace onnxruntime