based

Opinionated 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

Diffstat:
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");
}