1#ifndef _BBM_ENUMERATE_H_
2#define _BBM_ENUMERATE_H_
28 template<
typename VALUE,
typename T,
typename CALLBACK>
requires (std::convertible_to<T&, VALUE> && std::invocable<CALLBACK, VALUE>)
31 callback(std::forward<
decltype(
value)>(
value));
37 template<
typename VALUE,
typename T,
typename CALLBACK>
requires (std::ranges::range<T> && !std::convertible_to<T&, VALUE> && std::invocable<CALLBACK, VALUE>)
41 enumerate<VALUE>(std::forward<
decltype(val)>(val), std::forward<CALLBACK>(callback));
49 template<
typename VALUE,
typename T>
struct is_enumerable_impl : std::false_type {};
52 template<
typename VALUE,
typename T>
requires std::is_convertible_v<T&, VALUE>
53 struct is_enumerable_impl<VALUE, T> : std::true_type {};
56 template<
typename VALUE,
typename T>
requires (std::ranges::range<T> && !std::is_convertible_v<T&, VALUE>)
57 struct is_enumerable_impl<VALUE, T> : is_enumerable_impl<VALUE,
decltype( *std::begin(std::declval<T>()) ) > {};
64 template<
typename VALUE,
typename T>
67 template<
typename VALUE,
typename T>
Definition: aggregatebsdf.h:29
constexpr bool is_enumerable_v
Definition: enumerate.h:68
bbm::detail::is_enumerable_impl< VALUE, T > is_enumerable
Definition: enumerate.h:65
void enumerate(T &&value, CALLBACK &&callback)
Convertible to VALUE => callback.
Definition: enumerate.h:29
decltype(auto) value(T &&t)
return the value of an attribute, or if not an attribute the object
Definition: attribute_value.h:20
Additional basic helper concepts.