HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
forward_value.hpp
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#include <type_traits>
6#include <string>
7#include <string_view>
8
9#pragma once
10
11namespace tt {
12
28template<typename T>
30 using type = std::remove_cvref_t<T>;
31
32 [[nodiscard]] type operator()(T const &t) const noexcept
33 {
34 return t;
35 }
36};
37
38
39#define MAKE_FORWARD_VALUE(TEMPLATE_TYPE, RETURN_TYPE, ARGUMENT_TYPE) \
40 template<> \
41 struct forward_value<TEMPLATE_TYPE> { \
42 using type = RETURN_TYPE; \
43\
44 [[nodiscard]] type operator()(ARGUMENT_TYPE t) const noexcept \
45 { \
46 return type{t}; \
47 } \
48 };
49
50// Copy string_view by string value.
51MAKE_FORWARD_VALUE(std::string_view, std::string, std::string_view const &)
52MAKE_FORWARD_VALUE(std::string_view const, std::string, std::string_view const &)
53MAKE_FORWARD_VALUE(std::string_view &, std::string, std::string_view const &)
54MAKE_FORWARD_VALUE(std::string_view const &, std::string, std::string_view const &)
55
56// Copy char pointers by string value.
57MAKE_FORWARD_VALUE(char *, std::string, char const *)
58MAKE_FORWARD_VALUE(char const *, std::string, char const *)
59MAKE_FORWARD_VALUE(char * const, std::string, char const *)
60MAKE_FORWARD_VALUE(char const * const, std::string, char const *)
61MAKE_FORWARD_VALUE(char *&, std::string, char const *)
62MAKE_FORWARD_VALUE(char const *&, std::string, char const *)
63MAKE_FORWARD_VALUE(char *const&, std::string, char const *)
64MAKE_FORWARD_VALUE(char const *const&, std::string, char const *)
65
66#undef MAKE_FORWARD_VALUE
67
68// Copy string literal by pointer.
69template<size_t N>
70struct forward_value<char const (&)[N]> {
71 using type = char const *;
72
73 [[nodiscard]] constexpr type operator()(char const (&t)[N]) const noexcept
74 {
75 return static_cast<char const *>(t);
76 }
77};
78
83template<typename T>
84using forward_value_t = typename forward_value<T>::type;
85
86} // namespace tt
Functor for forwarding an forwarding-reference to variable.
Definition forward_value.hpp:29