Add a niche to box
This commit is contained in:
14
MODULE.bazel.lock
generated
14
MODULE.bazel.lock
generated
@ -64,20 +64,20 @@
|
||||
"@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": {
|
||||
"general": {
|
||||
"bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=",
|
||||
"usagesDigest": "+hz7IHWN6A1oVJJWNDB6yZRG+RYhF76wAYItpAeIUIg=",
|
||||
"usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
|
||||
"recordedFileInputs": {},
|
||||
"recordedDirentsInputs": {},
|
||||
"envVariables": {},
|
||||
"generatedRepoSpecs": {
|
||||
"local_config_apple_cc_toolchains": {
|
||||
"bzlFile": "@@apple_support~//crosstool:setup.bzl",
|
||||
"ruleClassName": "_apple_cc_autoconf_toolchains",
|
||||
"attributes": {}
|
||||
},
|
||||
"local_config_apple_cc": {
|
||||
"bzlFile": "@@apple_support~//crosstool:setup.bzl",
|
||||
"ruleClassName": "_apple_cc_autoconf",
|
||||
"attributes": {}
|
||||
},
|
||||
"local_config_apple_cc_toolchains": {
|
||||
"bzlFile": "@@apple_support~//crosstool:setup.bzl",
|
||||
"ruleClassName": "_apple_cc_autoconf_toolchains",
|
||||
"attributes": {}
|
||||
}
|
||||
},
|
||||
"recordedRepoMappingEntries": [
|
||||
@ -92,7 +92,7 @@
|
||||
"@@platforms//host:extension.bzl%host_platform": {
|
||||
"general": {
|
||||
"bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=",
|
||||
"usagesDigest": "pCYpDQmqMbmiiPI1p2Kd3VLm5T48rRAht5WdW0X2GlA=",
|
||||
"usagesDigest": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=",
|
||||
"recordedFileInputs": {},
|
||||
"recordedDirentsInputs": {},
|
||||
"envVariables": {},
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include "asl/config.hpp"
|
||||
|
||||
|
||||
#if ASL_COMPILER_CLANG_CL
|
||||
#define ASL_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
|
||||
#elif ASL_COMPILER_CLANG
|
||||
|
16
asl/box.hpp
16
asl/box.hpp
@ -16,15 +16,18 @@ class box
|
||||
ASL_NO_UNIQUE_ADDRESS Allocator m_alloc;
|
||||
|
||||
public:
|
||||
explicit constexpr box(T* ptr = nullptr)
|
||||
explicit constexpr box(niche)
|
||||
requires default_constructible<Allocator>
|
||||
: m_ptr{ptr}
|
||||
: m_ptr{nullptr}
|
||||
, m_alloc{}
|
||||
{}
|
||||
|
||||
|
||||
constexpr box(T* ptr, Allocator alloc)
|
||||
: m_ptr{ptr}
|
||||
, m_alloc{ASL_MOVE(alloc)}
|
||||
{}
|
||||
{
|
||||
ASL_ASSERT(m_ptr != nullptr);
|
||||
}
|
||||
|
||||
constexpr box(box&& other)
|
||||
: m_ptr{exchange(other.m_ptr, nullptr)}
|
||||
@ -77,6 +80,11 @@ public:
|
||||
ASL_ASSERT(m_ptr != nullptr);
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
constexpr bool operator==(niche) const
|
||||
{
|
||||
return m_ptr == nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
template<is_object T, allocator Allocator = DefaultAllocator, typename... Args>
|
||||
|
@ -160,4 +160,13 @@ template<typename T, int N> struct _is_array_helper<T[N]> : true_type {};
|
||||
|
||||
template<typename T> concept is_array = _is_array_helper<T>::value;
|
||||
|
||||
struct niche {};
|
||||
|
||||
template<typename T>
|
||||
concept has_niche = constructible_from<T, niche> &&
|
||||
requires (const T& value, niche n)
|
||||
{
|
||||
{ value == n } -> same_as<bool>;
|
||||
};
|
||||
|
||||
} // namespace asl
|
||||
|
@ -4,30 +4,20 @@
|
||||
#include "asl/tests/test_types.hpp"
|
||||
|
||||
static_assert(sizeof(asl::box<int>) == sizeof(int*));
|
||||
static_assert(asl::default_constructible<asl::box<int>>);
|
||||
static_assert(!asl::copyable<asl::box<int>>);
|
||||
static_assert(asl::moveable<asl::box<int>>);
|
||||
static_assert(asl::default_constructible<asl::box<NonMoveConstructible>>);
|
||||
static_assert(asl::has_niche<asl::box<int>>);
|
||||
|
||||
ASL_TEST(destructor)
|
||||
{
|
||||
bool d = false;
|
||||
|
||||
{
|
||||
asl::box<DestructorObserver> box2;
|
||||
|
||||
{
|
||||
auto box = asl::make_box<DestructorObserver>(&d);
|
||||
ASL_TEST_ASSERT(!d);
|
||||
|
||||
auto box = asl::make_box<DestructorObserver>(&d);
|
||||
ASL_TEST_ASSERT(!d);
|
||||
|
||||
auto box3 = ASL_MOVE(box);
|
||||
ASL_TEST_ASSERT(!d);
|
||||
|
||||
box2 = ASL_MOVE(box3);
|
||||
ASL_TEST_ASSERT(!d);
|
||||
}
|
||||
|
||||
auto box3 = ASL_MOVE(box);
|
||||
ASL_TEST_ASSERT(!d);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user