mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-09-18 02:08:09 +08:00
add and_other and or_other to toml::result
effectively same as Rust's std::Result::and and or.
This commit is contained in:
@@ -409,3 +409,33 @@ BOOST_AUTO_TEST_CASE(test_or_else)
|
|||||||
BOOST_CHECK_EQUAL(mapped.unwrap_err(), "hogehoge");
|
BOOST_CHECK_EQUAL(mapped.unwrap_err(), "hogehoge");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_and_or_other)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
const toml::result<int, std::string> r1(toml::ok(42));
|
||||||
|
const toml::result<int, std::string> r2(toml::err<std::string>("foo"));
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(r1, r1.or_other(r2));
|
||||||
|
BOOST_CHECK_EQUAL(r2, r1.and_other(r2));
|
||||||
|
BOOST_CHECK_EQUAL(42, r1.or_other(r2).unwrap());
|
||||||
|
BOOST_CHECK_EQUAL("foo", r1.and_other(r2).unwrap_err());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto r1_gen = []() -> toml::result<int, std::string> {
|
||||||
|
return toml::ok(42);
|
||||||
|
};
|
||||||
|
auto r2_gen = []() -> toml::result<int, std::string> {
|
||||||
|
return toml::err<std::string>("foo");
|
||||||
|
};
|
||||||
|
const auto r3 = r1_gen();
|
||||||
|
const auto r4 = r2_gen();
|
||||||
|
|
||||||
|
BOOST_CHECK_EQUAL(r3, r1_gen().or_other (r2_gen()));
|
||||||
|
BOOST_CHECK_EQUAL(r4, r1_gen().and_other(r2_gen()));
|
||||||
|
BOOST_CHECK_EQUAL(42, r1_gen().or_other (r2_gen()).unwrap());
|
||||||
|
BOOST_CHECK_EQUAL("foo", r1_gen().and_other(r2_gen()).unwrap_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -592,6 +592,26 @@ struct result
|
|||||||
return ok(std::move(this->as_ok()));
|
return ok(std::move(this->as_ok()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if *this is error, returns *this. otherwise, returns other.
|
||||||
|
result and_other(const result& other) const&
|
||||||
|
{
|
||||||
|
return this->is_err() ? *this : other;
|
||||||
|
}
|
||||||
|
result and_other(result&& other) &&
|
||||||
|
{
|
||||||
|
return this->is_err() ? std::move(*this) : std::move(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if *this is okay, returns *this. otherwise, returns other.
|
||||||
|
result or_other(const result& other) const&
|
||||||
|
{
|
||||||
|
return this->is_ok() ? *this : other;
|
||||||
|
}
|
||||||
|
result or_other(result&& other) &&
|
||||||
|
{
|
||||||
|
return this->is_ok() ? std::move(*this) : std::move(other);
|
||||||
|
}
|
||||||
|
|
||||||
void swap(result<T, E>& other)
|
void swap(result<T, E>& other)
|
||||||
{
|
{
|
||||||
result<T, E> tmp(std::move(*this));
|
result<T, E> tmp(std::move(*this));
|
||||||
@@ -638,5 +658,22 @@ void swap(result<T, E>& lhs, result<T, E>& rhs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this might be confusing because it eagerly evaluated, while in the other
|
||||||
|
// cases operator && and || are short-circuited.
|
||||||
|
//
|
||||||
|
// template<typename T, typename E>
|
||||||
|
// inline result<T, E>
|
||||||
|
// operator&&(const result<T, E>& lhs, const result<T, E>& rhs) noexcept
|
||||||
|
// {
|
||||||
|
// return lhs.is_ok() ? rhs : lhs;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// template<typename T, typename E>
|
||||||
|
// inline result<T, E>
|
||||||
|
// operator||(const result<T, E>& lhs, const result<T, E>& rhs) noexcept
|
||||||
|
// {
|
||||||
|
// return lhs.is_ok() ? lhs : rhs;
|
||||||
|
// }
|
||||||
|
|
||||||
} // toml11
|
} // toml11
|
||||||
#endif// TOML11_RESULT_H
|
#endif// TOML11_RESULT_H
|
||||||
|
Reference in New Issue
Block a user