40 [[nodiscard]]
constexpr int64_t
ssize(
const T& value);
54 template <
typename T,
typename U>
67 template <
class T, std::ranges::input_range Range,
class Allocator = std::allocator<T*>>
68 requires(!std::ranges::view<Range>)
69 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Range& range);
81 template <
class T,
class Optional,
class Allocator = std::allocator<T*>>
83 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Optional& optional);
97 template <
class T,
class Tuple,
class Allocator = std::allocator<T*>>
99 [[nodiscard]]
constexpr std::vector<T*, Allocator>
to_raw_ptr_vec(Tuple& tuple);
106 requires std::same_as<T, std::nullopt_t>
109 || (std::ranges::range<T> &&
mpl::testable<std::ranges::range_value_t<T>>)
117 constexpr int64_t
ssize(
const T& value)
119 if constexpr (std::ranges::sized_range<T>)
121 return static_cast<int64_t
>(std::ranges::size(value));
125 return std::tuple_size_v<T>;
129 if (value.has_value())
131 return ssize(*value);
144 template <
typename T,
typename U>
147 if constexpr (std::is_pointer_v<U>)
151 else if constexpr (
requires {
typename U::element_type; })
153 if constexpr (
mpl::smart_ptr<U> || std::is_base_of_v<std::shared_ptr<typename U::element_type>, U>
156 if constexpr (std::ranges::contiguous_range<typename U::element_type>)
158 return std::ranges::data(*var.get());
160 else if constexpr (std::same_as<typename U::element_type, T> || std::same_as<T, void>)
166 else if constexpr (std::ranges::contiguous_range<U>)
168 return std::ranges::data(var);
170 else if constexpr (std::same_as<T, U> || std::same_as<T, void>)
181 template <
class T, std::ranges::input_range Range,
class Allocator>
182 requires(!std::ranges::view<Range>)
185 std::vector<T*, Allocator> raw_ptr_vec;
186 raw_ptr_vec.reserve(range.size());
187 std::ranges::transform(
189 std::back_inserter(raw_ptr_vec),
198 template <
class T,
class Optional,
class Allocator>
202 if (!optional.has_value())
209 template <
class T,
class Tuple,
class Allocator>
213 std::vector<T*, Allocator> raw_ptr_vec;
214 raw_ptr_vec.reserve(std::tuple_size_v<Tuple>);
216 [&raw_ptr_vec](
auto&&... args)
226 requires std::same_as<T, std::nullopt_t>
228 && mpl::testable<std::ranges::range_value_t<typename T::value_type>>)
229 || (std::ranges::range<T> && mpl::testable<std::ranges::range_value_t<T>>)
232 if constexpr (!std::same_as<T, std::nullopt_t>)
236 if (elements.has_value())
238 return std::ranges::all_of(
240 [](
const auto& child)
253 return std::ranges::all_of(
255 [](
const auto& element)
257 return bool(element);
constexpr bool is_type_instance_of_v
true if T is a concrete type template instanciation of U which is a type template.
void unreachable()
Invokes undefined behavior.
constexpr int64_t ssize(const T &value)
Get the size of a range, a tuple or an optional.
constexpr std::vector< T *, Allocator > to_raw_ptr_vec(Range &range)
Create a vector of pointers to elements from a range.
constexpr bool all_element_are_true(const T &elements)
Check if all elements of a range or std::optional<range> are valid by caling their bool operator.
constexpr T * get_raw_ptr(U &var)
Get a raw pointer from a smart pointer, a range, an object or a pointer.
Workaround to replace static_assert(false) in template code.