Add str_to_int_ifp that returns an Optional<int> instead of throwing

This commit is contained in:
Maxime Coste 2015-05-01 18:47:22 +01:00
parent d3607bc773
commit d7159a9af0
4 changed files with 20 additions and 11 deletions

View File

@ -904,16 +904,14 @@ void NCursesUI::set_ui_options(const Options& options)
auto wheel_down_it = options.find("ncurses_wheel_down_button"); auto wheel_down_it = options.find("ncurses_wheel_down_button");
if (wheel_down_it == options.end()) if (wheel_down_it == options.end())
m_wheel_down_button = 2; m_wheel_down_button = 2;
else try { else if (auto down = str_to_int_ifp(wheel_down_it->second))
m_wheel_down_button = str_to_int(wheel_down_it->second);; m_wheel_down_button = *down;
} catch(...) {}
auto wheel_up_it = options.find("ncurses_wheel_up_button"); auto wheel_up_it = options.find("ncurses_wheel_up_button");
if (wheel_up_it == options.end()) if (wheel_up_it == options.end())
m_wheel_up_button = 4; m_wheel_up_button = 4;
else try { else if (auto up = str_to_int_ifp(wheel_up_it->second))
m_wheel_up_button = str_to_int(wheel_up_it->second);; m_wheel_up_button = *up;
} catch(...) {}
} }
} }

View File

@ -1,6 +1,8 @@
#ifndef optional_hh_INCLUDED #ifndef optional_hh_INCLUDED
#define optional_hh_INCLUDED #define optional_hh_INCLUDED
#include "assert.hh"
namespace Kakoune namespace Kakoune
{ {

View File

@ -98,7 +98,7 @@ String indent(StringView str, StringView indent)
return res; return res;
} }
int str_to_int(StringView str) Optional<int> str_to_int_ifp(StringView str)
{ {
unsigned int res = 0; unsigned int res = 0;
bool negative = false; bool negative = false;
@ -110,11 +110,18 @@ int str_to_int(StringView str)
else if (c >= '0' and c <= '9') else if (c >= '0' and c <= '9')
res = res * 10 + c - '0'; res = res * 10 + c - '0';
else else
throw runtime_error(str + "is not a number"); return {};
} }
return negative ? -(int)res : (int)res; return negative ? -(int)res : (int)res;
} }
int str_to_int(StringView str)
{
if (auto val = str_to_int_ifp(str))
return *val;
throw str + " is not a number";
}
InplaceString<16> to_string(int val) InplaceString<16> to_string(int val)
{ {
InplaceString<16> res; InplaceString<16> res;

View File

@ -1,11 +1,12 @@
#ifndef string_hh_INCLUDED #ifndef string_hh_INCLUDED
#define string_hh_INCLUDED #define string_hh_INCLUDED
#include "array_view.hh"
#include "hash.hh"
#include "optional.hh"
#include "units.hh" #include "units.hh"
#include "utf8.hh" #include "utf8.hh"
#include "hash.hh"
#include "vector.hh" #include "vector.hh"
#include "array_view.hh"
#include <string> #include <string>
#include <climits> #include <climits>
@ -256,7 +257,8 @@ inline String codepoint_to_str(Codepoint cp)
return str; return str;
} }
int str_to_int(StringView str); int str_to_int(StringView str); // throws on error
Optional<int> str_to_int_ifp(StringView str);
template<size_t N> template<size_t N>
struct InplaceString struct InplaceString