based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit 5a0ddb36672332e59e946fb6faefeebc060172d7
parent 1e1b79e6085133901298bfcba01a8ff7214133b4
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Mon, 23 Jun 2025 15:34:44 +0200

Add IsAssignable and IsCopiable and all variants

Diffstat:
A include/based/concept/is_assignable.hpp | +++++++++++++++++
A include/based/concept/is_constructible.hpp | ++++++++++++++++++
A include/based/concept/is_copy_assignable.hpp | +++++++++++++++++++++
A include/based/concept/is_copy_constructible.hpp | ++++++++++++++++++++
A include/based/concept/is_move_assignable.hpp | ++++++++++++++++++++++
A include/based/concept/is_move_constructible.hpp | ++++++++++++++++++++

6 files changed, 118 insertions(+), 0 deletions(-)


diff --git a/ include/based/concept/is_assignable.hpp b/ include/based/concept/is_assignable.hpp

@@ -0,0 +1,17 @@

#pragma once

#include <type_traits>

namespace based::trait
{

template<class T, class... Args>
concept IsAssignable = std::is_assignable_v<T, Args...>;

template<class T, class... Args>
concept IsTriviallyAssignable = std::is_trivially_assignable_v<T, Args...>;

template<class T, class... Args>
concept IsNothrowAssignable = std::is_nothrow_assignable_v<T, Args...>;

} // namespace based::trait

diff --git a/ include/based/concept/is_constructible.hpp b/ include/based/concept/is_constructible.hpp

@@ -0,0 +1,18 @@

#pragma once

#include <type_traits>

namespace based::trait
{

template<class T, class... Args>
concept IsConstructible = std::is_constructible_v<T, Args...>;

template<class T, class... Args>
concept IsTriviallyConstructible =
std::is_trivially_constructible_v<T, Args...>;

template<class T, class... Args>
concept IsNothrowConstructible = std::is_nothrow_constructible_v<T, Args...>;

} // namespace based::trait

diff --git a/ include/based/concept/is_copy_assignable.hpp b/ include/based/concept/is_copy_assignable.hpp

@@ -0,0 +1,21 @@

#pragma once

#include "based/concept/is_assignable.hpp"
#include "based/trait/add_lvalue_reference.hpp"

namespace based::trait
{

template<class T>
concept IsCopyAssignable =
IsAssignable<AddLValueReference<T>, AddLValueReference<const T>>;

template<class T>
concept IsTriviallyCopyAssignable =
IsTriviallyAssignable<AddLValueReference<T>, AddLValueReference<const T>>;

template<class T>
concept IsNothrowCopyAssignable =
IsNothrowAssignable<AddLValueReference<T>, AddLValueReference<const T>>;

} // namespace based::trait

diff --git a/ include/based/concept/is_copy_constructible.hpp b/ include/based/concept/is_copy_constructible.hpp

@@ -0,0 +1,20 @@

#pragma once

#include "based/concept/is_constructible.hpp"
#include "based/trait/add_lvalue_reference.hpp"

namespace based::trait
{

template<class T>
concept IsCopyConstructible = IsConstructible<T, AddLValueReference<const T>>;

template<class T>
concept IsTriviallyCopyConstructible =
IsTriviallyConstructible<T, AddLValueReference<const T>>;

template<class T>
concept IsNothrowCopyConstructible =
IsNothrowConstructible<T, AddLValueReference<const T>>;

} // namespace based::trait

diff --git a/ include/based/concept/is_move_assignable.hpp b/ include/based/concept/is_move_assignable.hpp

@@ -0,0 +1,22 @@

#pragma once

#include "based/concept/is_assignable.hpp"
#include "based/trait/add_lvalue_reference.hpp"
#include "based/trait/add_rvalue_reference.hpp"

namespace based::trait
{

template<class T>
concept IsMoveAssignable =
IsAssignable<AddLValueReference<T>, AddRValueReference<T>>;

template<class T>
concept IsTriviallyMoveAssignable =
IsTriviallyAssignable<AddLValueReference<T>, AddRValueReference<T>>;

template<class T>
concept IsNothrowMoveAssignable =
IsNothrowAssignable<AddLValueReference<T>, AddRValueReference<T>>;

} // namespace based::trait

diff --git a/ include/based/concept/is_move_constructible.hpp b/ include/based/concept/is_move_constructible.hpp

@@ -0,0 +1,20 @@

#pragma once

#include "based/concept/is_constructible.hpp"
#include "based/trait/add_rvalue_reference.hpp"

namespace based::trait
{

template<class T>
concept IsMoveConstructible = IsConstructible<T, AddRValueReference<T>>;

template<class T>
concept IsTriviallyMoveConstructible =
IsTriviallyConstructible<T, AddRValueReference<T>>;

template<class T>
concept IsNothrowMoveConstructible =
IsNothrowConstructible<T, AddRValueReference<T>>;

} // namespace based::trait