From 3d5a45b283d2a59211f9e24f100b95169375213d Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Tue, 4 Feb 2025 00:37:08 +0100 Subject: Add deref utilities & use them for log writer --- asl/meta.hpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'asl/meta.hpp') diff --git a/asl/meta.hpp b/asl/meta.hpp index 9909be6..a464e36 100644 --- a/asl/meta.hpp +++ b/asl/meta.hpp @@ -117,6 +117,8 @@ template struct _is_ref_helper { static constexpr bool l = true template struct _is_ref_helper { static constexpr bool l = false; static constexpr bool r = true; }; template concept is_ref = _is_ref_helper::l || _is_ref_helper::r; +template concept is_rref = _is_ref_helper::r; +template concept is_lref = _is_ref_helper::l; template struct _is_ptr_helper : false_type {}; template struct _is_ptr_helper : true_type {}; @@ -218,4 +220,29 @@ concept has_niche = constructible_from && equality_comparable_with concept is_niche = same_as, niche_t>; +template +concept _derefs_with_indirection_as = requires(T& t) +{ + *t; + requires convertible_from; +}; + +template +concept _derefs_reference_as = is_ref && convertible_from; + +template +concept _derefs_value_as = !is_ref && convertible_from; + +template T> +constexpr U& deref(T&& t) { return static_cast(*t); } + +template T> +constexpr U& deref(T&& t) { return static_cast(t); } + +template T> +constexpr U& deref(T&& t) { return static_cast(t); } + +template +concept derefs_as = _derefs_with_indirection_as || _derefs_reference_as || _derefs_value_as; + } // namespace asl -- cgit