2525
2626namespace STDEXEC
2727{
28- template <class _Tp , std::size_t _Size>
29- struct __static_vector
28+ template <class _Tp , std::size_t _Capacity>
29+ struct __static_vector ;
30+
31+ namespace __detail
32+ {
33+ struct __static_vector_base
34+ {
35+ template <class ... _What, class _Tp , std::size_t _Capacity>
36+ [[nodiscard]]
37+ friend constexpr auto operator +(__mexception<_What...>, //
38+ __static_vector<_Tp, _Capacity> const &) noexcept //
39+ -> __mexception<_What...>
40+ {
41+ return {};
42+ }
43+
44+ template <class ... _What, class _Tp , std::size_t _Capacity>
45+ [[nodiscard]]
46+ friend constexpr auto operator +(__static_vector<_Tp, _Capacity> const &, //
47+ __mexception<_What...>) noexcept //
48+ -> __mexception<_What...>
49+ {
50+ return {};
51+ }
52+
53+ template <class _Ty , std::size_t _Capacity0, std::size_t _Capacity1>
54+ [[nodiscard]]
55+ friend constexpr auto operator +(__static_vector<_Ty, _Capacity0> const &__lhs, //
56+ __static_vector<_Ty, _Capacity1> const &__rhs)
57+ noexcept (__nothrow_copy_constructible<_Ty>) -> __static_vector<_Ty, _Capacity0 + _Capacity1>
58+ {
59+ __static_vector<_Ty, _Capacity0 + _Capacity1> __result;
60+ std::copy (__lhs.begin (), __lhs.end (), __result.begin ());
61+ std::copy (__rhs.begin (), __rhs.end (), __result.begin () + __lhs.size ());
62+ __result.resize (__lhs.size () + __rhs.size ());
63+ return __result;
64+ }
65+ };
66+ } // namespace __detail
67+
68+ template <class _Tp , std::size_t _Capacity>
69+ struct __static_vector : __detail::__static_vector_base
3070 {
3171 using value_type = _Tp;
3272 using iterator = value_type *;
@@ -37,8 +77,9 @@ namespace STDEXEC
3777 constexpr __static_vector (std::initializer_list<value_type> __init)
3878 noexcept (__nothrow_copy_constructible<value_type>)
3979 {
40- auto const __end = std::copy_n (__init.begin (), (std::min) (__init.size (), _Size), __data_);
41- __size_ = __end - __data_;
80+ auto const __count = (std::min) (__init.size (), _Capacity);
81+ auto const __end = std::ranges::copy_n (__init.begin (), __count, __data_).out ;
82+ __size_ = __end - __data_;
4283 }
4384
4485 [[nodiscard]]
@@ -86,7 +127,7 @@ namespace STDEXEC
86127 [[nodiscard]]
87128 static constexpr auto capacity () noexcept -> std::size_t
88129 {
89- return _Size ;
130+ return _Capacity ;
90131 }
91132
92133 constexpr void resize (std::size_t __new_size) noexcept
@@ -102,19 +143,58 @@ namespace STDEXEC
102143 }
103144
104145 std::size_t __size_ = 0 ;
105- value_type __data_[_Size ];
146+ value_type __data_[_Capacity ];
106147 };
107148
108- template <class _Tp , std::size_t _Size0, std::size_t _Size1>
109- [[nodiscard]]
110- constexpr auto __concat (__static_vector<_Tp, _Size0> const &__lhs, //
111- __static_vector<_Tp, _Size1> const &__rhs)
112- noexcept (__nothrow_copy_constructible<_Tp>) -> __static_vector<_Tp, _Size0 + _Size1>
149+ // Specialization of __static_vector for zero capacity that doesn't require default
150+ // constructibility of _Tp.
151+ template <class _Tp >
152+ struct __static_vector <_Tp, 0 > : __detail::__static_vector_base
113153 {
114- __static_vector<_Tp, _Size0 + _Size1> __result;
115- std::copy (__lhs.begin (), __lhs.end (), __result.begin ());
116- std::copy (__rhs.begin (), __rhs.end (), __result.begin () + __lhs.size ());
117- __result.resize (__lhs.size () + __rhs.size ());
118- return __result;
119- }
154+ using value_type = _Tp;
155+ using iterator = value_type *;
156+ using const_iterator = value_type const *;
157+
158+ __static_vector () = default ;
159+
160+ [[nodiscard]]
161+ constexpr auto begin () noexcept -> iterator
162+ {
163+ return nullptr ;
164+ }
165+
166+ [[nodiscard]]
167+ constexpr auto begin () const noexcept -> const_iterator
168+ {
169+ return nullptr ;
170+ }
171+
172+ [[nodiscard]]
173+ constexpr auto end () noexcept -> iterator
174+ {
175+ return nullptr ;
176+ }
177+
178+ [[nodiscard]]
179+ constexpr auto end () const noexcept -> const_iterator
180+ {
181+ return nullptr ;
182+ }
183+
184+ [[nodiscard]]
185+ static constexpr auto size () noexcept -> std::size_t
186+ {
187+ return 0 ;
188+ }
189+
190+ [[nodiscard]]
191+ static constexpr auto capacity () noexcept -> std::size_t
192+ {
193+ return 0 ;
194+ }
195+ };
196+
197+ template <class _First , __same_as<_First>... _Rest>
198+ STDEXEC_HOST_DEVICE_DEDUCTION_GUIDE
199+ __static_vector (_First, _Rest...) -> __static_vector<_First, 1 + sizeof ...(_Rest)>;
120200} // namespace STDEXEC
0 commit comments