summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2025-05-14 00:23:11 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2025-05-14 00:41:51 +0200
commitf7a2699ac0cbb2824862439a72f23013436484de (patch)
tree8e8c63332b8b4ae188a3f41391cadf16145bbed5
parent088e03708afe4145a1903f0b20c53cab1899ad50 (diff)
Add and use copy_const_t
-rw-r--r--asl/base/meta.hpp2
-rw-r--r--asl/base/meta_tests.cpp10
-rw-r--r--asl/containers/buffer.hpp8
-rw-r--r--asl/containers/hash_map.hpp2
-rw-r--r--asl/containers/intrusive_list.hpp4
-rw-r--r--asl/types/array.hpp6
6 files changed, 22 insertions, 10 deletions
diff --git a/asl/base/meta.hpp b/asl/base/meta.hpp
index 3675df3..e050e69 100644
--- a/asl/base/meta.hpp
+++ b/asl/base/meta.hpp
@@ -146,6 +146,8 @@ struct _copy_const_helper<From, To, true> { using type = const To; };
template<typename From, typename To> using copy_cref_t =
_copy_ref_helper<From, typename _copy_const_helper<From, un_cvref_t<To>>::type>::type;
+template<typename From, typename To> using copy_const_t = _copy_const_helper<From, un_cvref_t<To>>::type;
+
template<typename T> struct _is_ptr_helper : false_type {};
template<typename T> struct _is_ptr_helper<T*> : true_type {};
diff --git a/asl/base/meta_tests.cpp b/asl/base/meta_tests.cpp
index 7bae295..36b0429 100644
--- a/asl/base/meta_tests.cpp
+++ b/asl/base/meta_tests.cpp
@@ -274,6 +274,7 @@ static_assert(asl::same_or_derived_from<int, int>);
static_assert(!asl::is_const<int>);
static_assert(asl::is_const<const int>);
static_assert(!asl::is_const<const int*>);
+static_assert(!asl::is_const<const int&>);
static_assert(asl::is_const<int* const>);
static_assert(asl::is_floating_point<float>);
@@ -362,6 +363,15 @@ static_assert(asl::same_as<asl::copy_cref_t<const int&, const float>, const floa
static_assert(asl::same_as<asl::copy_cref_t<const int&, float&&>, const float&>);
static_assert(asl::same_as<asl::copy_cref_t<const int&, const float&>, const float&>);
+static_assert(asl::same_as<asl::copy_const_t<int, float>, float>);
+static_assert(asl::same_as<asl::copy_const_t<int, const float>, float>);
+
+static_assert(asl::same_as<asl::copy_const_t<const int, float>, const float>);
+static_assert(asl::same_as<asl::copy_const_t<const int, const float>, const float>);
+
+static_assert(asl::same_as<asl::copy_const_t<const int*, float>, float>);
+static_assert(asl::same_as<asl::copy_const_t<int* const, float>, const float>);
+
static_assert(asl::same_as<asl::decay_t<int>, int>);
static_assert(!asl::same_as<asl::decay_t<int>, float>);
static_assert(asl::same_as<asl::decay_t<int&>, int>);
diff --git a/asl/containers/buffer.hpp b/asl/containers/buffer.hpp
index d61abf9..0e30745 100644
--- a/asl/containers/buffer.hpp
+++ b/asl/containers/buffer.hpp
@@ -392,7 +392,7 @@ public:
auto data(this auto&& self)
{
- using return_type = un_ref_t<copy_cref_t<decltype(self), T>>*;
+ using return_type = copy_const_t<un_ref_t<decltype(self)>, T>*;
// NOLINTNEXTLINE(*-reinterpret-cast)
auto&& buffer = reinterpret_cast<copy_cref_t<decltype(self), class buffer>>(self);
if constexpr (kInlineCapacity == 0)
@@ -410,13 +410,13 @@ public:
constexpr auto begin(this auto&& self)
{
- using type = un_ref_t<copy_cref_t<decltype(self), T>>;
+ using type = copy_const_t<un_ref_t<decltype(self)>, T>;
return contiguous_iterator<type>{self.data()};
}
constexpr auto end(this auto&& self)
{
- using type = un_ref_t<copy_cref_t<decltype(self), T>>;
+ using type = copy_const_t<un_ref_t<decltype(self)>, T>;
return contiguous_iterator<type>{self.data() + self.size()};
}
@@ -432,7 +432,7 @@ public:
constexpr auto as_span(this auto&& self)
{
- using type = un_ref_t<copy_cref_t<decltype(self), T>>;
+ using type = copy_const_t<un_ref_t<decltype(self)>, T>;
return span<type>{self.data(), self.size()};
}
diff --git a/asl/containers/hash_map.hpp b/asl/containers/hash_map.hpp
index dc140eb..a6d72dd 100644
--- a/asl/containers/hash_map.hpp
+++ b/asl/containers/hash_map.hpp
@@ -147,7 +147,7 @@ public:
auto get(this auto&& self, const U& value)
requires key_hasher<KeyHasher, U> && key_comparator<KeyComparator, K, U>
{
- using return_type = un_ref_t<copy_cref_t<decltype(self), V>>*;
+ using return_type = copy_const_t<un_ref_t<decltype(self)>, V>*;
isize_t index = self.find_slot_lookup(value);
if (index >= 0)
{
diff --git a/asl/containers/intrusive_list.hpp b/asl/containers/intrusive_list.hpp
index 81816ec..5ce69aa 100644
--- a/asl/containers/intrusive_list.hpp
+++ b/asl/containers/intrusive_list.hpp
@@ -82,13 +82,13 @@ public:
constexpr auto front(this auto&& self)
{
- using return_type = un_ref_t<copy_cref_t<decltype(self), T>>*;
+ using return_type = copy_const_t<un_ref_t<decltype(self)>, T>*;
return return_type{ self.m_head };
}
constexpr auto back(this auto&& self)
{
- using return_type = un_ref_t<copy_cref_t<decltype(self), T>>*;
+ using return_type = copy_const_t<un_ref_t<decltype(self)>, T>*;
return return_type{ self.m_head != nullptr ? self.m_head->m_prev : nullptr };
}
diff --git a/asl/types/array.hpp b/asl/types/array.hpp
index 5fb300a..54c3fbe 100644
--- a/asl/types/array.hpp
+++ b/asl/types/array.hpp
@@ -19,12 +19,12 @@ struct array
T m_data[kSize];
[[nodiscard]] constexpr bool is_empty() const { return false; }
-
+
[[nodiscard]] constexpr int64_t size() const { return kSize; }
constexpr auto data(this auto&& self)
{
- using return_type = un_ref_t<copy_cref_t<decltype(self), T>>*;
+ using return_type = copy_const_t<un_ref_t<decltype(self)>, T>*;
return static_cast<return_type>(self.m_data);
}
@@ -54,7 +54,7 @@ struct array
constexpr auto as_span(this auto&& self)
{
- using type = un_ref_t<copy_cref_t<decltype(self), T>>;
+ using type = copy_const_t<un_ref_t<decltype(self)>, T>;
return span<type, kSize>{self.data(), self.size()};
}