feat: add into method to Option and Result + macro try_unwrap
This commit is contained in:
parent
7a9e022528
commit
b8ac4c450c
21
src/ro.h
21
src/ro.h
@ -10,6 +10,7 @@
|
||||
#define None(T) (ro::Option<T>())
|
||||
#define Some(v) (ro::Option(v))
|
||||
#define ERR(fmt, ...) Error(ro::sfmt("%s:%d: " fmt, __FILE__, __LINE__, ##__VA_ARGS__))
|
||||
#define try_unwrap(l,...) try{l=(__VA_ARGS__).unwrap();}catch(ro::Error e){return e;}
|
||||
// #define Err(e) (ro::Result(e))
|
||||
// #define Ok(v) (ro::Result(v))
|
||||
|
||||
@ -181,6 +182,16 @@ namespace ro
|
||||
return fn();
|
||||
}
|
||||
|
||||
inline bool into(T &output) const
|
||||
{
|
||||
if(is_some())
|
||||
{
|
||||
output = m_some;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename U>
|
||||
inline Option<U> map(const std::function<U(const T &)> &fn)
|
||||
{
|
||||
@ -404,6 +415,16 @@ namespace ro
|
||||
return alt;
|
||||
}
|
||||
|
||||
inline bool into(T &output) const
|
||||
{
|
||||
if(is_ok())
|
||||
{
|
||||
output = m_result;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline T unwrap_or_else(const std::function<T(const E &)> &fn)
|
||||
{
|
||||
if (is_ok())
|
||||
|
@ -19,6 +19,10 @@ static Stat g_stat = {0,0};
|
||||
throw Error(ro::sfmt("ASSERT ERROR %s:%d: " fmt, __FILE__, __LINE__, ##__VA_ARGS__)); \
|
||||
}
|
||||
|
||||
class TestError: public Error {
|
||||
public:
|
||||
TestError(const char *s) : Error(s){};
|
||||
};
|
||||
|
||||
void test(const char* desc, const std::function<void()>& lambda)
|
||||
{
|
||||
@ -36,6 +40,13 @@ void test(const char* desc, const std::function<void()>& lambda)
|
||||
g_stat.total++;
|
||||
}
|
||||
|
||||
Result<int, Error> test_macro(const Result<int, Error> & target)
|
||||
{
|
||||
int a;
|
||||
try_unwrap(a,target);
|
||||
return a;
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
test("Test Option", [](){
|
||||
@ -232,6 +243,20 @@ int main(int argc, char const *argv[])
|
||||
|
||||
});
|
||||
|
||||
test("Option Into", [](){
|
||||
Option<int> x = 2;
|
||||
int y = 0;
|
||||
bool v = x.into(y);
|
||||
assert(v, "Return value shall be true");
|
||||
assert(y == 2, "Unexpected value");
|
||||
|
||||
x = None(int);
|
||||
v = x.into(y);
|
||||
y = 0;
|
||||
assert(v == false, "Return value shall not be true");
|
||||
assert(y == 0, "Unexpected value");
|
||||
});
|
||||
|
||||
test("Test Result", []{
|
||||
Result<string, Error> ret = ERR("Error");
|
||||
assert(ret.is_err(), "Object should containe error object");
|
||||
@ -263,6 +288,7 @@ int main(int argc, char const *argv[])
|
||||
catch(Error e)
|
||||
{
|
||||
assert(true, "%s", e.what());
|
||||
cout << e.what() << endl;
|
||||
}
|
||||
});
|
||||
|
||||
@ -396,5 +422,27 @@ int main(int argc, char const *argv[])
|
||||
});
|
||||
|
||||
|
||||
test("Result Into", [](){
|
||||
Result<int, Error> x = 2;
|
||||
int y = 0;
|
||||
bool v = x.into(y);
|
||||
assert(v, "Return value shall be true");
|
||||
assert(y == 2, "Unexpected value");
|
||||
|
||||
x = ERR("Error");
|
||||
v = x.into(y);
|
||||
y = 0;
|
||||
assert(v == false, "Return value shall not be true");
|
||||
assert(y == 0, "Unexpected value");
|
||||
});
|
||||
|
||||
test("try_unwrap", [](){
|
||||
Result<int, Error> x = test_macro(Result<int, Error>(10));
|
||||
assert(x == 10, "Unexpected value");
|
||||
|
||||
x = test_macro(Result<int, Error>(Error("Hello")));
|
||||
assert(x.is_err(), "Unexpected value");
|
||||
});
|
||||
|
||||
cout << "REPORT: " << g_stat.passed << " tests passed / " << g_stat.total << " tests." << endl;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user