basedOpinionated 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
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