@@ -175,30 +175,18 @@ concept arbitrary_numerical_type = arbitrary_real_or_complex_type<T> ||
175
175
template <typename T>
176
176
concept policy = boost::math::policies::is_policy<T>::value;
177
177
178
- // Workaround for LIBCPP versions that have <concepts> but have not implemented concepts in <iterator>
179
- #if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 13000
180
-
181
- template <typename T>
182
- concept forward_iterator = std::is_same_v<typename std::iterator_traits<T>::iterator_category(), std::forward_iterator_tag>;
183
-
184
- template <typename T>
185
- concept bidirectional_iterator = std::is_same_v<typename std::iterator_traits<T>::iterator_category(), std::bidirectional_iterator_tag>;
186
-
187
178
template <typename T>
188
- concept random_access_iterator = std::is_same_v<typename std::iterator_traits<T>::iterator_category(), std::random_access_iterator_tag>;
189
-
190
- #else
179
+ concept forward_iterator = std::derived_from<typename std::iterator_traits<T>::iterator_category, std::forward_iterator_tag>;
191
180
192
181
template <typename T>
193
- concept forward_iterator = std::forward_iterator<T >;
182
+ concept bidirectional_iterator = std::derived_from< typename std::iterator_traits<T>::iterator_category, std::bidirectional_iterator_tag >;
194
183
195
184
template <typename T>
196
- concept bidirectional_iterator = std::bidirectional_iterator<T >;
185
+ concept random_access_iterator = std::derived_from< typename std::iterator_traits<T>::iterator_category, std::random_access_iterator_tag >;
197
186
198
- template <typename T>
199
- concept random_access_iterator = std::random_access_iterator<T>;
200
-
201
- #endif
187
+ template <typename I, typename T>
188
+ concept output_iterator = std::derived_from<typename std::iterator_traits<I>::iterator_category, std::input_iterator_tag> &&
189
+ std::derived_from<typename std::iterator_traits<T>::iterator_category, std::output_iterator_tag>;
202
190
203
191
template <typename T>
204
192
concept is_container = detail::has_begin_v<T> &&
@@ -230,25 +218,19 @@ concept random_access_container = is_container<T> &&
230
218
#define BOOST_MATH_ARBITRARY_COMPLEX boost::math::concepts::arbitrary_complex_type
231
219
#define BOOST_MATH_ARBITRARY_REAL_OR_COMPLEX boost::math::concepts::arbitrary_real_or_complex_type
232
220
#define BOOST_MATH_ARBITRARY_NUMERICAL boost::math::concepts::arbitrary_numerical_type
221
+
233
222
#define BOOST_MATH_POLICY boost::math::concepts::policy
223
+
234
224
#define BOOST_MATH_CONTAINER boost::math::concepts::is_container
235
225
#define BOOST_MATH_RANDOM_ACCESS_CONTAINER boost::math::concepts::random_access_container
236
- #define BOOST_MATH_REQUIRES (X, T ) requires X<T>
237
-
238
- // Workaround for LIBCPP versions that have <concepts> but have not implemented concepts in <iterator>
239
- #if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 13000
240
226
241
227
#define BOOST_MATH_FORWARD_ITER boost::math::concepts::forward_iterator
242
228
#define BOOST_MATH_BIDIRECTIONAL_ITER boost::math::concepts::bidirectional_iterator
243
229
#define BOOST_MATH_RANDOM_ACCESS_ITER boost::math::concepts::random_access_iterator
230
+ #define BOOST_MATH_OUTPUT_ITER (I, T ) boost::math::concepts::output_iterator<I, T>
231
+ #define BOOST_MATH_REQUIRES_ITER (X ) requires X
244
232
245
- #else
246
-
247
- #define BOOST_MATH_FORWARD_ITER std::forward_iterator
248
- #define BOOST_MATH_BIDIRECTIONAL_ITER std::bidirectional_iterator
249
- #define BOOST_MATH_RANDOM_ACCESS_ITER std::random_access_iterator
250
-
251
- #endif // Workaround for LIBCPP
233
+ #define BOOST_MATH_REQUIRES (X, T ) requires X<T>
252
234
253
235
#ifdef BOOST_MATH_EXEC_COMPATIBLE
254
236
#include < execution>
@@ -365,6 +347,14 @@ concept execution_policy = std::is_execution_policy_v<std::remove_cvref_t<T>>;
365
347
# define BOOST_MATH_RANDOM_ACCESS_ITER typename
366
348
#endif
367
349
350
+ #ifndef BOOST_MATH_OUTPUT_ITER
351
+ # define BOOST_MATH_OUTPUT_ITER (I, T )
352
+ #endif
353
+
354
+ #ifndef BOOST_MATH_REQUIRES_ITER
355
+ # define BOOST_MATH_REQUIRES_ITER (X )
356
+ #endif
357
+
368
358
#ifndef BOOST_MATH_CONTAINER
369
359
# define BOOST_MATH_CONTAINER typename
370
360
#endif
0 commit comments