basedOpinionated utility library |
git clone git://git.dimitrijedobrota.com/based.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
commit | 1e1b79e6085133901298bfcba01a8ff7214133b4 |
parent | 1519665e81a8f2258b93df0c56063887058e0bd9 |
author | Dimitrije Dobrota < mail@dimitrijedobrota.com > |
date | Sun, 22 Jun 2025 15:34:17 +0200 |
Add some missing traits
A | include/based/trait/add_const.hpp | | | ++++++++++++++++++ |
A | include/based/trait/add_cv.hpp | | | ++++++++++++++++++ |
M | include/based/trait/add_lvalue_reference.hpp | | | ++ -- |
M | include/based/trait/add_rvalue_reference.hpp | | | ++ -- |
A | include/based/trait/add_volatile.hpp | | | ++++++++++++++++++ |
A | include/based/trait/void.hpp | | | +++++++++ |
M | include/based/utility/declvar.hpp | | | + - |
7 files changed, 68 insertions(+), 5 deletions(-)
diff --git a/ include/based/trait/add_const.hpp b/ include/based/trait/add_const.hpp
@@ -0,0 +1,18 @@
#pragma once
namespace based::trait
{
namespace detail
{
// clang-format off
template<class T> struct AddConstHelper { using Type = const T; };
// clang-format on
} // namespace detail
template<class T>
using AddConst = typename detail::AddConstHelper<T>::Type;
} // namespace based::trait
diff --git a/ include/based/trait/add_cv.hpp b/ include/based/trait/add_cv.hpp
@@ -0,0 +1,18 @@
#pragma once
namespace based::trait
{
namespace detail
{
// clang-format off
template<class T> struct AddCVHelper { using Type = const volatile T; };
// clang-format on
} // namespace detail
template<class T>
using AddCV = typename detail::AddCVHelper<T>::Type;
} // namespace based::trait
diff --git a/ include/based/trait/add_lvalue_reference.hpp b/ include/based/trait/add_lvalue_reference.hpp
@@ -15,13 +15,13 @@
template<class T> // Handle T = cv void case
auto try_add(...) -> TypeIdentity<T>;
template<class T>
struct AddLvalueReferenceHelper : decltype(detail::try_add<T>(0))
struct AddLValueReferenceHelper : decltype(detail::try_add<T>(0))
{
};
} // namespace detail
template<class T>
using AddLvalueReference = typename detail::AddLvalueReferenceHelper<T>::Type;
using AddLValueReference = typename detail::AddLValueReferenceHelper<T>::Type;
} // namespace based::trait
diff --git a/ include/based/trait/add_rvalue_reference.hpp b/ include/based/trait/add_rvalue_reference.hpp
@@ -17,13 +17,13 @@
template<class T>
auto try_add(...) -> TypeIdentity<T>;
template<class T>
struct AddRvalueReferenceHelper : decltype(detail::try_add<T>(0))
struct AddRValueReferenceHelper : decltype(detail::try_add<T>(0))
{
};
} // namespace detail
template<class T>
using AddRvalueReference = typename detail::AddRvalueReferenceHelper<T>::Type;
using AddRValueReference = typename detail::AddRValueReferenceHelper<T>::Type;
} // namespace based::trait
diff --git a/ include/based/trait/add_volatile.hpp b/ include/based/trait/add_volatile.hpp
@@ -0,0 +1,18 @@
#pragma once
namespace based::trait
{
namespace detail
{
// clang-format off
template<class T> struct AddVolatileHelper { using Type = volatile T; };
// clang-format on
} // namespace detail
template<class T>
using AddVolatile = typename detail::AddVolatileHelper<T>::Type;
} // namespace based::trait
diff --git a/ include/based/trait/void.hpp b/ include/based/trait/void.hpp
@@ -0,0 +1,9 @@
#pragma once
namespace based::trait
{
template<class...>
using VoidT = void;
} // namespace based::trait
diff --git a/ include/based/utility/declvar.hpp b/ include/based/utility/declvar.hpp
@@ -6,7 +6,7 @@
namespace based
{
template<typename T>
trait::AddRvalueReference<T> declval() noexcept
trait::AddRValueReference<T> declval() noexcept
{
static_assert(false, "declval not allowed in an evaluated context");
}