diff --git a/include/fixed_containers/fixed_circular_deque.hpp b/include/fixed_containers/fixed_circular_deque.hpp index e2640d71..a6f80fde 100644 --- a/include/fixed_containers/fixed_circular_deque.hpp +++ b/include/fixed_containers/fixed_circular_deque.hpp @@ -7,6 +7,7 @@ #include "fixed_containers/source_location.hpp" #include +#include #include #include #include @@ -506,6 +507,16 @@ template > +[[nodiscard]] constexpr FixedCircularDequeType make_fixed_circular_deque( + const std::array /*list*/, + const std_transition::source_location& /*loc*/ + = std_transition::source_location::current()) noexcept +{ + return {}; +} template [[nodiscard]] constexpr auto make_fixed_circular_deque( @@ -515,7 +526,18 @@ template { using CheckingType = customize::SequenceContainerAbortChecking; using FixedCircularDequeType = FixedCircularDeque; - return make_fixed_deque(list, loc); + return make_fixed_circular_deque(list, + loc); +} +template +[[nodiscard]] constexpr auto make_fixed_circular_deque( + const std::array list, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SequenceContainerAbortChecking; + using FixedCircularDequeType = FixedCircularDeque; + return make_fixed_circular_deque(list, loc); } } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_deque.hpp b/include/fixed_containers/fixed_deque.hpp index 98784936..bdea1a8f 100644 --- a/include/fixed_containers/fixed_deque.hpp +++ b/include/fixed_containers/fixed_deque.hpp @@ -1026,6 +1026,16 @@ template > +[[nodiscard]] constexpr FixedDequeType make_fixed_deque( + const std::array /*list*/, + const std_transition::source_location& /*loc*/ + = std_transition::source_location::current()) noexcept +{ + return {}; +} template [[nodiscard]] constexpr auto make_fixed_deque( @@ -1037,6 +1047,16 @@ template using FixedDequeType = FixedDeque; return make_fixed_deque(list, loc); } +template +[[nodiscard]] constexpr auto make_fixed_deque( + const std::array list, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SequenceContainerAbortChecking; + using FixedDequeType = FixedDeque; + return make_fixed_deque(list, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_list.hpp b/include/fixed_containers/fixed_list.hpp index 54918adf..1ad00002 100644 --- a/include/fixed_containers/fixed_list.hpp +++ b/include/fixed_containers/fixed_list.hpp @@ -11,6 +11,7 @@ #include "fixed_containers/source_location.hpp" #include +#include #include #include #include @@ -652,6 +653,16 @@ template > +[[nodiscard]] constexpr FixedListType make_fixed_list( + const std::array /*list*/, + const std_transition::source_location& /*loc*/ + = std_transition::source_location::current()) noexcept +{ + return {}; +} template [[nodiscard]] constexpr auto make_fixed_list( @@ -663,6 +674,16 @@ template using FixedListType = FixedList; return make_fixed_list(list, loc); } +template +[[nodiscard]] constexpr auto make_fixed_list( + const std::array list, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SequenceContainerAbortChecking; + using FixedListType = FixedList; + return make_fixed_list(list, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_map.hpp b/include/fixed_containers/fixed_map.hpp index 1aa7a37e..7335fa6d 100644 --- a/include/fixed_containers/fixed_map.hpp +++ b/include/fixed_containers/fixed_map.hpp @@ -12,6 +12,7 @@ #include "fixed_containers/source_location.hpp" #include +#include #include #include @@ -753,6 +754,23 @@ template , + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness COMPACTNESS = + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness::EMBEDDED_COLOR, + template typename StorageTemplate = FixedIndexBasedPoolStorage, + customize::MapChecking CheckingType, + typename FixedMapType = FixedMap> +[[nodiscard]] constexpr FixedMapType make_fixed_map( + const std::array, 0>& /*list*/, + const Compare& comparator = Compare{}, + const std_transition::source_location& /*loc*/ = + std_transition::source_location::current()) noexcept +{ + return FixedMapType{comparator}; +} template (list, comparator, loc); } +template , + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness COMPACTNESS = + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness::EMBEDDED_COLOR, + template typename StorageTemplate = FixedIndexBasedPoolStorage> +[[nodiscard]] constexpr auto make_fixed_map(const std::array, 0>& list, + const Compare& comparator = Compare{}, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::MapAbortChecking; + using FixedMapType = FixedMap; + return make_fixed_map( + list, comparator, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_set.hpp b/include/fixed_containers/fixed_set.hpp index 628edddf..0236ebe2 100644 --- a/include/fixed_containers/fixed_set.hpp +++ b/include/fixed_containers/fixed_set.hpp @@ -11,6 +11,7 @@ #include "fixed_containers/source_location.hpp" #include +#include #include #include #include @@ -491,6 +492,22 @@ template , + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness COMPACTNESS = + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness::EMBEDDED_COLOR, + template typename StorageTemplate = FixedIndexBasedPoolStorage, + customize::SetChecking CheckingType, + typename FixedSetType = FixedSet> +[[nodiscard]] constexpr FixedSetType make_fixed_set( + const std::array& /*list*/, + const Compare& comparator = Compare{}, + const std_transition::source_location& /*loc*/ = + std_transition::source_location::current()) noexcept +{ + return FixedSetType{comparator}; +} template , @@ -514,6 +531,21 @@ template (list, comparator, loc); } +template , + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness COMPACTNESS = + fixed_red_black_tree_detail::RedBlackTreeNodeColorCompactness::EMBEDDED_COLOR, + template typename StorageTemplate = FixedIndexBasedPoolStorage> +[[nodiscard]] constexpr auto make_fixed_set(const std::array& list, + const Compare& comparator = Compare{}, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SetAbortChecking; + using FixedSetType = FixedSet; + return make_fixed_set( + list, comparator, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_unordered_map.hpp b/include/fixed_containers/fixed_unordered_map.hpp index 1c3b7e96..27a885a1 100644 --- a/include/fixed_containers/fixed_unordered_map.hpp +++ b/include/fixed_containers/fixed_unordered_map.hpp @@ -5,6 +5,8 @@ #include "fixed_containers/map_checking.hpp" #include "fixed_containers/wyhash.hpp" +#include + namespace fixed_containers { @@ -86,6 +88,21 @@ template < { return {std::begin(list), std::end(list), hash, key_equal, loc}; } +template , + class KeyEqual = std::equal_to, + customize::MapChecking CheckingType, + typename FixedMapType = FixedUnorderedMap> +[[nodiscard]] constexpr FixedMapType make_fixed_unordered_map( + const std::array, 0>& /*list*/, + const Hash& hash = Hash{}, + const KeyEqual& key_equal = KeyEqual{}, + const std_transition::source_location& /*loc*/ = + std_transition::source_location::current()) noexcept +{ + return FixedMapType{hash, key_equal}; +} template < typename K, @@ -113,6 +130,19 @@ template < BUCKET_COUNT, FixedMapType>(list, hash, key_equal, loc); } +template , class KeyEqual = std::equal_to> +[[nodiscard]] constexpr auto make_fixed_unordered_map( + const std::array, 0> list, + const Hash& hash = Hash{}, + const KeyEqual& key_equal = KeyEqual{}, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::MapAbortChecking; + using FixedMapType = FixedUnorderedMap; + return make_fixed_unordered_map( + list, hash, key_equal, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_unordered_set.hpp b/include/fixed_containers/fixed_unordered_set.hpp index d0d459e5..fef9c82d 100644 --- a/include/fixed_containers/fixed_unordered_set.hpp +++ b/include/fixed_containers/fixed_unordered_set.hpp @@ -6,6 +6,8 @@ #include "fixed_containers/set_checking.hpp" #include "fixed_containers/wyhash.hpp" +#include + namespace fixed_containers { @@ -83,6 +85,20 @@ template < { return {std::begin(list), std::end(list), hash, key_equal, loc}; } +template , + class KeyEqual = std::equal_to, + customize::SetChecking CheckingType, + typename FixedSetType = FixedUnorderedSet> +[[nodiscard]] constexpr FixedSetType make_fixed_unordered_set( + const std::array& /*list*/, + const Hash& hash = Hash{}, + const KeyEqual& key_equal = KeyEqual{}, + const std_transition::source_location& /*loc*/ = + std_transition::source_location::current()) noexcept +{ + return {hash, key_equal}; +} template < typename K, @@ -108,6 +124,19 @@ template < BUCKET_COUNT, FixedSetType>(list, hash, key_equal, loc); } +template , class KeyEqual = std::equal_to> +[[nodiscard]] constexpr auto make_fixed_unordered_set( + const std::array& list, + const Hash& hash = Hash{}, + const KeyEqual& key_equal = KeyEqual{}, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SetAbortChecking; + using FixedSetType = FixedUnorderedSet; + return make_fixed_unordered_set( + list, hash, key_equal, loc); +} } // namespace fixed_containers diff --git a/include/fixed_containers/fixed_vector.hpp b/include/fixed_containers/fixed_vector.hpp index ac8cfbf9..428c3575 100644 --- a/include/fixed_containers/fixed_vector.hpp +++ b/include/fixed_containers/fixed_vector.hpp @@ -1019,6 +1019,16 @@ template > +[[nodiscard]] constexpr FixedVectorType make_fixed_vector( + const std::array /*list*/, + const std_transition::source_location& /*loc*/ + = std_transition::source_location::current()) noexcept +{ + return {}; +} template [[nodiscard]] constexpr auto make_fixed_vector( @@ -1030,6 +1040,16 @@ template using FixedVectorType = FixedVector; return make_fixed_vector(list, loc); } +template +[[nodiscard]] constexpr auto make_fixed_vector( + const std::array list, + const std_transition::source_location& loc = + std_transition::source_location::current()) noexcept +{ + using CheckingType = customize::SequenceContainerAbortChecking; + using FixedVectorType = FixedVector; + return make_fixed_vector(list, loc); +} } // namespace fixed_containers diff --git a/test/fixed_circular_deque_test.cpp b/test/fixed_circular_deque_test.cpp index 001ed79e..2f9c6e28 100644 --- a/test/fixed_circular_deque_test.cpp +++ b/test/fixed_circular_deque_test.cpp @@ -134,9 +134,15 @@ TEST(FixedCircularDeque, CountConstructor_ExceedsCapacity) TEST(FixedCircularDeque, MaxSizeDeduction) { - constexpr auto v1 = make_fixed_circular_deque({10, 11, 12, 13, 14}); - static_assert(v1.max_size() == 5); - static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + { + constexpr auto v1 = make_fixed_circular_deque({10, 11, 12, 13, 14}); + static_assert(v1.max_size() == 5); + static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + } + { + constexpr auto v1 = make_fixed_circular_deque({}); + static_assert(v1.max_size() == 0); + } } TEST(FixedCircularDeque, IteratorConstructor) diff --git a/test/fixed_deque_test.cpp b/test/fixed_deque_test.cpp index f6b7b334..047765b9 100644 --- a/test/fixed_deque_test.cpp +++ b/test/fixed_deque_test.cpp @@ -129,9 +129,15 @@ TEST(FixedDeque, CountConstructor_ExceedsCapacity) TEST(FixedDeque, MaxSizeDeduction) { - constexpr auto v1 = make_fixed_deque({10, 11, 12, 13, 14}); - static_assert(v1.max_size() == 5); - static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + { + constexpr auto v1 = make_fixed_deque({10, 11, 12, 13, 14}); + static_assert(v1.max_size() == 5); + static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + } + { + constexpr auto v1 = make_fixed_deque({}); + static_assert(v1.max_size() == 0); + } } TEST(FixedDeque, IteratorConstructor) diff --git a/test/fixed_list_test.cpp b/test/fixed_list_test.cpp index dfc47966..d1115988 100644 --- a/test/fixed_list_test.cpp +++ b/test/fixed_list_test.cpp @@ -265,9 +265,15 @@ TEST(FixedList, MockTriviallyCopyableButNotCopyableOrMoveable) TEST(FixedList, MaxSizeDeduction) { - constexpr auto v1 = make_fixed_list({10, 11, 12, 13, 14}); - static_assert(v1.max_size() == 5); - static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + { + constexpr auto v1 = make_fixed_list({10, 11, 12, 13, 14}); + static_assert(v1.max_size() == 5); + static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + } + { + constexpr auto v1 = make_fixed_list({}); + static_assert(v1.max_size() == 0); + } } TEST(FixedList, CountConstructor) diff --git a/test/fixed_map_test.cpp b/test/fixed_map_test.cpp index c19d67ed..dcef1099 100644 --- a/test/fixed_map_test.cpp +++ b/test/fixed_map_test.cpp @@ -141,12 +141,19 @@ TEST(FixedMap, OperatorBracket_Constexpr) TEST(FixedMap, MaxSizeDeduction) { - constexpr auto s1 = make_fixed_map({std::pair{30, 30}, std::pair{31, 54}}); - static_assert(s1.size() == 2); - static_assert(s1.max_size() == 2); - static_assert(s1.contains(30)); - static_assert(s1.contains(31)); - static_assert(!s1.contains(32)); + { + constexpr auto s1 = make_fixed_map({std::pair{30, 30}, std::pair{31, 54}}); + static_assert(s1.size() == 2); + static_assert(s1.max_size() == 2); + static_assert(s1.contains(30)); + static_assert(s1.contains(31)); + static_assert(!s1.contains(32)); + } + { + constexpr auto s1 = make_fixed_map({}); + static_assert(s1.size() == 0); + static_assert(s1.max_size() == 0); + } } TEST(FixedMap, OperatorBracket_NonConstexpr) diff --git a/test/fixed_set_test.cpp b/test/fixed_set_test.cpp index 81d0fa4e..d5972772 100644 --- a/test/fixed_set_test.cpp +++ b/test/fixed_set_test.cpp @@ -211,12 +211,19 @@ TEST(FixedSet, EmptySizeFull) TEST(FixedSet, MaxSizeDeduction) { - constexpr auto s1 = make_fixed_set({30, 31}); - static_assert(s1.size() == 2); - static_assert(s1.max_size() == 2); - static_assert(s1.contains(30)); - static_assert(s1.contains(31)); - static_assert(!s1.contains(32)); + { + constexpr auto s1 = make_fixed_set({30, 31}); + static_assert(s1.size() == 2); + static_assert(s1.max_size() == 2); + static_assert(s1.contains(30)); + static_assert(s1.contains(31)); + static_assert(!s1.contains(32)); + } + { + constexpr auto s1 = make_fixed_set({}); + static_assert(s1.size() == 0); + static_assert(s1.max_size() == 0); + } } TEST(FixedSet, Insert) diff --git a/test/fixed_unordered_map_test.cpp b/test/fixed_unordered_map_test.cpp index 516352c9..01376f34 100644 --- a/test/fixed_unordered_map_test.cpp +++ b/test/fixed_unordered_map_test.cpp @@ -139,12 +139,19 @@ TEST(FixedUnorderedMap, OperatorBracket_Constexpr) TEST(FixedUnorderedMap, MaxSizeDeduction) { - constexpr auto s1 = make_fixed_unordered_map({std::pair{30, 30}, std::pair{31, 54}}); - static_assert(s1.size() == 2); - static_assert(s1.max_size() == 2); - static_assert(s1.contains(30)); - static_assert(s1.contains(31)); - static_assert(!s1.contains(32)); + { + constexpr auto s1 = make_fixed_unordered_map({std::pair{30, 30}, std::pair{31, 54}}); + static_assert(s1.size() == 2); + static_assert(s1.max_size() == 2); + static_assert(s1.contains(30)); + static_assert(s1.contains(31)); + static_assert(!s1.contains(32)); + } + { + constexpr auto s1 = make_fixed_unordered_map({}); + static_assert(s1.size() == 0); + static_assert(s1.max_size() == 0); + } } TEST(FixedUnorderedMap, OperatorBracket_NonConstexpr) diff --git a/test/fixed_unordered_set_test.cpp b/test/fixed_unordered_set_test.cpp index f1528128..9ad4ec2a 100644 --- a/test/fixed_unordered_set_test.cpp +++ b/test/fixed_unordered_set_test.cpp @@ -141,12 +141,19 @@ TEST(FixedUnorderedSet, EmptySizeFull) TEST(FixedUnorderedSet, MaxSizeDeduction) { - constexpr auto s1 = make_fixed_unordered_set({30, 31}); - static_assert(s1.size() == 2); - static_assert(s1.max_size() == 2); - static_assert(s1.contains(30)); - static_assert(s1.contains(31)); - static_assert(!s1.contains(32)); + { + constexpr auto s1 = make_fixed_unordered_set({30, 31}); + static_assert(s1.size() == 2); + static_assert(s1.max_size() == 2); + static_assert(s1.contains(30)); + static_assert(s1.contains(31)); + static_assert(!s1.contains(32)); + } + { + constexpr auto s1 = make_fixed_unordered_set({}); + static_assert(s1.size() == 0); + static_assert(s1.max_size() == 0); + } } TEST(FixedUnorderedSet, Insert) diff --git a/test/fixed_vector_test.cpp b/test/fixed_vector_test.cpp index ae5ce58d..45913caf 100644 --- a/test/fixed_vector_test.cpp +++ b/test/fixed_vector_test.cpp @@ -392,9 +392,15 @@ TEST(FixedVector, Builder_MultipleOuts) TEST(FixedVector, MaxSizeDeduction) { - constexpr auto v1 = make_fixed_vector({10, 11, 12, 13, 14}); - static_assert(v1.max_size() == 5); - static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + { + constexpr auto v1 = make_fixed_vector({10, 11, 12, 13, 14}); + static_assert(v1.max_size() == 5); + static_assert(std::ranges::equal(v1, std::array{10, 11, 12, 13, 14})); + } + { + constexpr auto v1 = make_fixed_vector({}); + static_assert(v1.max_size() == 0); + } } TEST(FixedVector, CountConstructor)