diff --git a/src/ai/composite/value_translator.hpp b/src/ai/composite/value_translator.hpp index 0f294351a2f8..0e1cc2f972ac 100644 --- a/src/ai/composite/value_translator.hpp +++ b/src/ai/composite/value_translator.hpp @@ -24,6 +24,7 @@ #include "ai/manager.hpp" #include "terrain/filter.hpp" +#include "lexical_cast.hpp" #include "util.hpp" #include "serialization/string_utils.hpp" #include "resources.hpp" diff --git a/src/commandline_options.cpp b/src/commandline_options.cpp index 9e0ad08cf9ec..96f1456f256e 100644 --- a/src/commandline_options.cpp +++ b/src/commandline_options.cpp @@ -17,9 +17,9 @@ #include "config.hpp" #include "formatter.hpp" +#include "lexical_cast.hpp" #include "log.hpp" // for logger, set_strict_severity, etc #include "serialization/string_utils.hpp" // for split -#include "util.hpp" // for lexical_cast #include // for any #include diff --git a/src/config.cpp b/src/config.cpp index e3579c9f3b94..31d424a6f29d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -22,6 +22,7 @@ #include "global.hpp" +#include "lexical_cast.hpp" #include "log.hpp" #include "util.hpp" #include "utils/const_clone.hpp" @@ -42,7 +43,7 @@ static lg::log_domain log_config("config"); #define DBG_CF LOG_STREAM(debug, log_config) -#ifdef USE_HETEROGENOUS_LOOKUPS +#ifdef USE_HETEROGENOUS_LOOKUPS struct config_simple_key { const char* str; diff --git a/src/font/font_description.hpp b/src/font/font_description.hpp index b46c06b3549f..aab0e195ee46 100644 --- a/src/font/font_description.hpp +++ b/src/font/font_description.hpp @@ -16,6 +16,7 @@ #define FONT_FONT_DESCRIPTION_HPP #include "config.hpp" +#include "lexical_cast.hpp" #include "util.hpp" #include "serialization/string_utils.hpp" diff --git a/src/font/marked-up_text.cpp b/src/font/marked-up_text.cpp index c554514bc8a6..a41f75a9710c 100644 --- a/src/font/marked-up_text.cpp +++ b/src/font/marked-up_text.cpp @@ -52,6 +52,7 @@ std::string::const_iterator parse_markup(std::string::const_iterator i1, int* font_size, color_t* color, int* style) { + try { while(i1 != i2) { switch(*i1) { case '\\': @@ -132,6 +133,7 @@ std::string::const_iterator parse_markup(std::string::const_iterator i1, } ++i1; } + } catch(bad_lexical_cast) {} return i1; } diff --git a/src/game_initialization/lobby_data.cpp b/src/game_initialization/lobby_data.cpp index c714aaf248c9..1f362995e459 100644 --- a/src/game_initialization/lobby_data.cpp +++ b/src/game_initialization/lobby_data.cpp @@ -21,6 +21,7 @@ #include "formatter.hpp" #include "formula/string_utils.hpp" #include "gettext.hpp" +#include "lexical_cast.hpp" #include "log.hpp" #include "map/map.hpp" #include "map/exception.hpp" diff --git a/src/gui/auxiliary/filter.hpp b/src/gui/auxiliary/filter.hpp index 3788a2864b98..49087bcd5668 100644 --- a/src/gui/auxiliary/filter.hpp +++ b/src/gui/auxiliary/filter.hpp @@ -22,7 +22,7 @@ #include "global.hpp" #include "gui/widgets/text_box.hpp" -#include "util.hpp" +#include "lexical_cast.hpp" #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index b487f6c2cfb3..bdf080b15555 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -34,6 +34,7 @@ #include "gui/widgets/tree_view_node.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" +#include "lexical_cast.hpp" #include "serialization/string_utils.hpp" #include "utils/functional.hpp" diff --git a/src/gui/dialogs/editor/generate_map.cpp b/src/gui/dialogs/editor/generate_map.cpp index 6498ae6ef5d4..26fa131a2a9a 100644 --- a/src/gui/dialogs/editor/generate_map.cpp +++ b/src/gui/dialogs/editor/generate_map.cpp @@ -28,6 +28,7 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/text_box.hpp" #include "generators/map_generator.hpp" +#include "lexical_cast.hpp" #include "utils/functional.hpp" diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index db89922fb1c1..bf4bccd6824a 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -59,7 +59,7 @@ #include "gui/widgets/text_box.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" -#include "util.hpp" +#include "lexical_cast.hpp" #include "utils/functional.hpp" #include diff --git a/src/gui/widgets/pane.cpp b/src/gui/widgets/pane.cpp index b574cb341b5a..b4960ec717ec 100644 --- a/src/gui/widgets/pane.cpp +++ b/src/gui/widgets/pane.cpp @@ -23,6 +23,7 @@ #include "utils/const_clone.hpp" #include "gui/core/event/message.hpp" #include "gettext.hpp" +#include "lexical_cast.hpp" #include "utils/functional.hpp" diff --git a/src/lexical_cast.hpp b/src/lexical_cast.hpp index e1980ec5ce72..7af8092aec9a 100644 --- a/src/lexical_cast.hpp +++ b/src/lexical_cast.hpp @@ -95,7 +95,13 @@ inline To lexical_cast(From value) } /** Thrown when a lexical_cast fails. */ -struct bad_lexical_cast : std::exception {}; +struct bad_lexical_cast : std::exception +{ + const char* what() const throw() + { + return "bad_lexical_cast"; + } +}; namespace implementation { diff --git a/src/terrain/translation.cpp b/src/terrain/translation.cpp index 4858b042b3cc..1ce59e3b9311 100644 --- a/src/terrain/translation.cpp +++ b/src/terrain/translation.cpp @@ -21,6 +21,7 @@ #include "global.hpp" #include "gettext.hpp" +#include "lexical_cast.hpp" #include "log.hpp" #include "terrain/translation.hpp" #include "serialization/string_utils.hpp" diff --git a/src/units/frame.cpp b/src/units/frame.cpp index f69189f82751..f6edd1c4dfea 100644 --- a/src/units/frame.cpp +++ b/src/units/frame.cpp @@ -171,11 +171,13 @@ progressive_::progressive_(const std::string &data, int duration) : ERR_NG << "Invalid time in unit animation: " << colon_split[1] << "\n"; } - std::vector range = utils::split(colon_split[0],'~',split_flag); - T range0 = lexical_cast(range[0]); - T range1 = (range.size() > 1) ? lexical_cast(range[1]) : range0; - typedef std::pair range_pair; - data_.push_back(std::pair(range_pair(range0, range1), time)); + try { + std::vector range = utils::split(colon_split[0],'~',split_flag); + T range0 = lexical_cast(range[0]); + T range1 = (range.size() > 1) ? lexical_cast(range[1]) : range0; + typedef std::pair range_pair; + data_.push_back(std::pair(range_pair(range0, range1), time)); + } catch(bad_lexical_cast) {} } } diff --git a/src/util.cpp b/src/util.cpp index 560a04329ff3..981a363c0e47 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -20,33 +20,7 @@ #include "util.hpp" #include -template<> -size_t lexical_cast(const std::string& a) -{ - char* endptr; - size_t res = strtoul(a.c_str(), &endptr, 10); - - if (a.empty() || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} -#ifndef MSVC_DO_UNIT_TESTS -template<> -size_t lexical_cast(const char* a) -{ - char* endptr; - size_t res = strtoul(a, &endptr, 10); - - if (*a == '\0' || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} -#endif template<> size_t lexical_cast_default(const std::string& a, size_t def) { @@ -63,6 +37,7 @@ size_t lexical_cast_default(const std::string& a, si return res; } } + template<> size_t lexical_cast_default(const char* a, size_t def) { @@ -79,31 +54,7 @@ size_t lexical_cast_default(const char* a, size_t def) return res; } } -template<> -long lexical_cast(const std::string& a) -{ - char* endptr; - long res = strtol(a.c_str(), &endptr, 10); - - if (a.empty() || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} - -template<> -long lexical_cast(const char* a) -{ - char* endptr; - long res = strtol(a, &endptr, 10); - if (*a == '\0' || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} template<> long lexical_cast_default(const std::string& a, long def) { @@ -120,6 +71,7 @@ long lexical_cast_default(const std::string& a, long d return res; } } + template<> long lexical_cast_default(const char* a, long def) { @@ -136,33 +88,6 @@ long lexical_cast_default(const char* a, long def) return res; } } -template<> -int lexical_cast(const std::string& a) -{ - char* endptr; - int res = strtol(a.c_str(), &endptr, 10); - - if (a.empty() || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} - -#ifndef MSVC_DO_UNIT_TESTS -template<> -int lexical_cast(const char* a) -{ - char* endptr; - int res = strtol(a, &endptr, 10); - - if (*a == '\0' || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} -#endif template<> int lexical_cast_default(const std::string& a, int def) @@ -198,32 +123,6 @@ int lexical_cast_default(const char* a, int def) } } -template<> -double lexical_cast(const std::string& a) -{ - char* endptr; - double res = strtod(a.c_str(), &endptr); - - if (a.empty() || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} - -template<> -double lexical_cast(const char* a) -{ - char* endptr; - double res = strtod(a, &endptr); - - if (*a == '\0' || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} - template<> double lexical_cast_default(const std::string& a, double def) { @@ -250,31 +149,6 @@ double lexical_cast_default(const char* a, double def) } } -template<> -float lexical_cast(const std::string& a) -{ - char* endptr; - float res = static_cast(strtod(a.c_str(), &endptr)); - - if (a.empty() || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} - -template<> -float lexical_cast(const char* a) -{ - char* endptr; - float res = static_cast(strtod(a, &endptr)); - - if (*a == '\0' || *endptr != '\0') { - throw bad_lexical_cast(); - } else { - return res; - } -} template<> float lexical_cast_default(const std::string& a, float def) { @@ -300,4 +174,3 @@ float lexical_cast_default(const char* a, float def) return res; } } - diff --git a/src/util.hpp b/src/util.hpp index 4c326a69c8b1..fc4021e3c89e 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -77,28 +77,6 @@ inline double round_portable(double d) { return (d >= 0.0) ? std::floor(d + 0.5) : std::ceil(d - 0.5); } -struct bad_lexical_cast : public std::exception -{ - const char *what() const throw() - { - return "bad_lexical_cast"; - } -}; - - -template -To lexical_cast(From a) -{ - To res = To(); - std::stringstream str; - - if(str << a && str >> res) { - return res; - } else { - throw bad_lexical_cast(); - } -} - template To lexical_cast_default(From a, To def=To()) { @@ -112,60 +90,30 @@ To lexical_cast_default(From a, To def=To()) } } -template<> -size_t lexical_cast(const std::string& a); - -template<> -size_t lexical_cast(const char* a); - template<> size_t lexical_cast_default(const std::string& a, size_t def); template<> size_t lexical_cast_default(const char* a, size_t def); -template<> -long lexical_cast(const std::string& a); - -template<> -long lexical_cast(const char* a); - template<> long lexical_cast_default(const std::string& a, long def); template<> long lexical_cast_default(const char* a, long def); -template<> -int lexical_cast(const std::string& a); - -template<> -int lexical_cast(const char* a); - template<> int lexical_cast_default(const std::string& a, int def); template<> int lexical_cast_default(const char* a, int def); -template<> -double lexical_cast(const std::string& a); - -template<> -double lexical_cast(const char* a); - template<> double lexical_cast_default(const std::string& a, double def); template<> double lexical_cast_default(const char* a, double def); -template<> -float lexical_cast(const std::string& a); - -template<> -float lexical_cast(const char* a); - template<> float lexical_cast_default(const std::string& a, float def);