summaryrefslogtreecommitdiffhomepage
path: root/include/ocl/option.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/ocl/option.hpp')
-rw-r--r--include/ocl/option.hpp32
1 files changed, 10 insertions, 22 deletions
diff --git a/include/ocl/option.hpp b/include/ocl/option.hpp
index 07cf194..93e01c7 100644
--- a/include/ocl/option.hpp
+++ b/include/ocl/option.hpp
@@ -8,7 +8,7 @@
#define __OCL_CORE_OPTION
#include <ocl/detail/config.hpp>
-#include <utility>
+#include <ocl/print.hpp>
namespace ocl
{
@@ -24,9 +24,9 @@ namespace ocl
{
using option_error = std::runtime_error;
- void throw_option_invalid_type_error()
+ inline void throw_option_invalid_type_error(const boost::string_view& loc = BOOST_CURRENT_LOCATION.to_string())
{
- throw option_error("option has invalid type.");
+ throw option_error(loc.to_string());
}
} // namespace detail
@@ -52,21 +52,22 @@ namespace ocl
if (ret_ == return_type::err)
{
- throw detail::option_error(input ? input : "option::error");
+ io::println(input ? input : "option::error");
+ detail::throw_option_invalid_type_error();
}
return *this;
}
template <typename Handleable>
- option& expect_or_handle(const char* input)
+ option& expect(const char* input)
{
assert(ret_ != return_type::invalid);
if (ret_ == return_type::err)
{
// AMLALE: Shall it be a functor or container here?
- Handleable(input ? input : "option::error");
+ Handleable{}(input ? input : "option::error");
}
return *this;
@@ -81,19 +82,7 @@ namespace ocl
// AMLALE: The operator() are marked as `noexcept` as failing conditions within an evaluation (say a overloads operator==) proves that the
// predictate is wrong. Thus program state is undefined.
- struct teller
- {
- teller() = default;
- virtual ~teller() = default;
-
- template <class ObjFirst, class ObjLast>
- bool operator()(ObjFirst a, ObjLast b) noexcept
- {
- return false;
- }
- };
-
- struct eq_teller final : teller
+ struct eq_teller final
{
template <class ObjFirst, class ObjLast>
bool operator()(ObjFirst a, ObjLast b) noexcept
@@ -102,7 +91,7 @@ namespace ocl
}
};
- struct greater_than_teller final : teller
+ struct greater_than_teller final
{
template <class ObjFirst, class ObjLast>
bool operator()(ObjFirst a, ObjLast b) noexcept
@@ -111,7 +100,7 @@ namespace ocl
}
};
- struct less_than_teller final : teller
+ struct less_than_teller final
{
template <class ObjFirst, class ObjLast>
bool operator()(ObjFirst a, ObjLast b) noexcept
@@ -124,7 +113,6 @@ namespace ocl
template <typename Teller, typename... Lst>
inline return_type eval(const Teller& tell, Lst&&... arg)
{
- static_assert(std::is_base_of_v<detail::teller, Teller>, "Teller is not evalueable.");
return tell(std::forward<Lst>(arg)...) ? return_type::okay : return_type::err;
}