diff --git a/func.hpp b/func.hpp index 0cbf654..4b6b8e0 100644 --- a/func.hpp +++ b/func.hpp @@ -1,9 +1,8 @@ #pragma once +#include "type.hpp" #include "util.hpp" -#include "../type/type.hpp" - namespace util { // @@ -18,19 +17,19 @@ template constexpr bool is_reference_wrapper_v template constexpr decltype(auto) INVOKE(Type T::*f, T1 &&t1, Args &&... args) { - if constexpr (type::is_member_function_pointer_v) { - if constexpr (type::is_base_of_v>) + if constexpr (util::is_member_function_pointer_v) { + if constexpr (util::is_base_of_v>) return (util::forward(t1).*f)(util::forward(args)...); - else if constexpr (is_reference_wrapper_v>) + else if constexpr (is_reference_wrapper_v>) return (t1.get().*f)(util::forward(args)...); else return ((*util::forward(t1)).*f)(util::forward(args)...); } else { - static_assert(type::is_member_object_pointer_v); + static_assert(util::is_member_object_pointer_v); static_assert(sizeof...(args) == 0); - if constexpr (type::is_base_of_v>) + if constexpr (util::is_base_of_v>) return util::forward(t1).*f; - else if constexpr (is_reference_wrapper_v>) + else if constexpr (is_reference_wrapper_v>) return t1.get().*f; else return (*util::forward(t1)).*f; @@ -49,8 +48,8 @@ template void FUN(T &&) = delete; } // namespace detail template -constexpr type::invoke_result_t invoke(Fn &&f, Args &&... args) - noexcept(type::is_nothrow_invocable_v) +constexpr util::invoke_result_t invoke(Fn &&f, Args &&... args) + noexcept(util::is_nothrow_invocable_v) { return detail::INVOKE(util::forward(f), util::forward(args)...); } @@ -58,10 +57,13 @@ constexpr type::invoke_result_t invoke(Fn &&f, Args &&... args) template class reference_wrapper { public: + // types + using type = T; + // construct/copy/destroy template (util::declval()), - type::enable_if_t>>())> + util::enable_if_t>>())> constexpr reference_wrapper(U &&u) noexcept(noexcept(detail::FUN(util::forward(u)))) : _ptr(util::addressof(detail::FUN(util::forward(u)))) {} @@ -75,14 +77,11 @@ class reference_wrapper { constexpr T &get() const noexcept { return *_ptr; } template - constexpr type::invoke_result_t operator()(ArgTypes &&... args) const + constexpr util::invoke_result_t operator()(ArgTypes &&... args) const { return invoke(get(), util::forward(args)...); } - // types - using type = T; - private: T *_ptr; }; diff --git a/type.hpp b/type.hpp index 62ef754..f92d265 100644 --- a/type.hpp +++ b/type.hpp @@ -2,14 +2,16 @@ // Fix for limits.h not exposing LLONG_MIN, LLONG_MIN, and ULLONG_MAX to C++ context #ifdef __cplusplus +#ifndef __STDC_VERSION__ #define __STDC_VERSION__ 201112L #endif +#endif #include #include #include -namespace type { +namespace util { // @@ -244,14 +246,14 @@ template using enable_if_t = typename enable_if struct reference_wrapper; -template inline constexpr T &&forward(type::remove_reference_t &t) noexcept; -template type::add_rvalue_reference_t declval() noexcept; +template inline constexpr T &&forward(util::remove_reference_t &t) noexcept; +template util::add_rvalue_reference_t declval() noexcept; } // namespace util ////////////////////////////////////////////////////////////////////////// -namespace type { +namespace util { // Everything is nothrow_invocable, because exceptions are disabled in avr-gcc template struct is_nothrow_invocable : true_type {}; @@ -407,4 +409,4 @@ struct numeric_limits { }; // clang-format on -} // namespace type +} // namespace util diff --git a/util.hpp b/util.hpp index 42f2edd..35d2e78 100644 --- a/util.hpp +++ b/util.hpp @@ -2,7 +2,7 @@ #include -#include "../type/type.hpp" +#include "type.hpp" namespace util { @@ -11,37 +11,37 @@ namespace util { // clang-format off template -type::enable_if_t, T *> addressof(T &arg) noexcept +util::enable_if_t, T *> addressof(T &arg) noexcept { return reinterpret_cast(&const_cast(reinterpret_cast(arg))); } template -type::enable_if_t, T *> addressof(T &arg) noexcept +util::enable_if_t, T *> addressof(T &arg) noexcept { return &arg; } // -template type::add_rvalue_reference_t declval() noexcept; +template util::add_rvalue_reference_t declval() noexcept; template -inline constexpr type::remove_reference_t &&move(T &&t) noexcept +inline constexpr util::remove_reference_t &&move(T &&t) noexcept { - return static_cast &&>(t); + return static_cast &&>(t); } template -inline constexpr T &&forward(type::remove_reference_t &t) noexcept +inline constexpr T &&forward(util::remove_reference_t &t) noexcept { return static_cast(t); } template -inline constexpr T &&forward(type::remove_reference_t &&t) noexcept +inline constexpr T &&forward(util::remove_reference_t &&t) noexcept { - static_assert(!type::is_lvalue_reference_v, "Can not forward an rvalue as an lvalue."); + static_assert(!util::is_lvalue_reference_v, "Can not forward an rvalue as an lvalue."); return static_cast(t); } @@ -112,10 +112,10 @@ inline constexpr auto make_offset_index_sequence() template auto for_constexpr(Fn &&func, index_sequence) { - if constexpr (type::is_void_v>>) { - (func(type::integral_constant{}), ...); + if constexpr (util::is_void_v>>) { + (func(util::integral_constant{}), ...); } else { - if ((func(type::integral_constant{}) && ...)) + if ((func(util::integral_constant{}) && ...)) return true; return false; }