Skip to content

Commit c1bdbac

Browse files
committed
fix triviality
1 parent ddb19ac commit c1bdbac

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

include/beman/inplace_vector/inplace_vector.hpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,18 @@ static constexpr void __assert_failure(char const *__file, int __line,
323323
using namespace std;
324324
using namespace beman::__iv_detail;
325325

326+
template <typename __T>
327+
concept __trivial_copy_assignment =
328+
(std::is_trivially_destructible_v<__T> &&
329+
std::is_trivially_copy_constructible_v<__T> &&
330+
std::is_trivially_copy_assignable_v<__T>);
331+
332+
template <typename __T>
333+
concept __trivial_move_assignment =
334+
(std::is_trivially_destructible_v<__T> &&
335+
std::is_trivially_move_constructible_v<__T> &&
336+
std::is_trivially_move_assignable_v<__T>);
337+
326338
// clang-format off
327339
// Smallest unsigned integer that can represent values in [0, N].
328340
template <size_t __N>
@@ -939,30 +951,36 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
939951
}
940952

941953
constexpr inplace_vector(const inplace_vector &__x)
942-
requires(__N == 0)
954+
requires(__N == 0 || is_trivially_copy_constructible_v<__T>)
943955
= default;
956+
944957
constexpr inplace_vector(const inplace_vector &__x)
945-
requires(__N != 0 && copyable<__T>)
958+
requires(__N != 0 && !is_trivially_copy_constructible_v<__T> &&
959+
copyable<__T>)
946960
{
947961
for (auto &&__e : __x)
948962
emplace_back(__e);
949963
}
950964

951965
constexpr inplace_vector(inplace_vector &&__x)
952-
requires(__N == 0)
966+
requires(__N == 0 || is_trivially_move_constructible_v<__T>)
953967
= default;
968+
954969
constexpr inplace_vector(inplace_vector &&__x)
955-
requires(__N != 0 && movable<__T>)
970+
requires(__N != 0 && !is_trivially_move_constructible_v<__T> &&
971+
movable<__T>)
956972
{
957973
for (auto &&__e : __x)
958974
emplace_back(::std::move(__e));
959975
}
960976

961977
constexpr inplace_vector &operator=(const inplace_vector &__x)
962-
requires(__N == 0)
978+
requires(__N == 0 || __iv_detail::__trivial_copy_assignment<__T>)
963979
= default;
980+
964981
constexpr inplace_vector &operator=(const inplace_vector &__x)
965-
requires(__N != 0 && copyable<__T>)
982+
requires(__N != 0 && !__iv_detail::__trivial_copy_assignment<__T> &&
983+
copyable<__T>)
966984
{
967985
clear();
968986
for (auto &&__e : __x)
@@ -971,10 +989,12 @@ struct inplace_vector : private __iv_detail::__storage::_t<__T, __N> {
971989
}
972990

973991
constexpr inplace_vector &operator=(inplace_vector &&__x)
974-
requires(__N == 0)
992+
requires(__N == 0 || __iv_detail::__trivial_move_assignment<__T>)
975993
= default;
994+
976995
constexpr inplace_vector &operator=(inplace_vector &&__x)
977-
requires(__N != 0 && movable<__T>)
996+
requires(__N != 0 && !__iv_detail::__trivial_move_assignment<__T> &&
997+
movable<__T>)
978998
{
979999
clear();
9801000
for (auto &&__e : __x)

0 commit comments

Comments
 (0)