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; })
154 mpl::smart_ptr<U> || std::is_base_of_v<std::shared_ptr<typename U::element_type>, U>
158 if constexpr (std::ranges::contiguous_range<typename U::element_type>)
160 return std::ranges::data(*var.get());
162 else if constexpr (std::same_as<typename U::element_type, T> || std::same_as<T, void>)
168 else if constexpr (std::ranges::contiguous_range<U>)
170 return std::ranges::data(var);
172 else if constexpr (std::same_as<T, U> || std::same_as<T, void>)
183 template <
class T, std::ranges::input_range Range,
class Allocator>
184 requires(!std::ranges::view<Range>)
187 std::vector<T*, Allocator> raw_ptr_vec;
188 raw_ptr_vec.reserve(range.size());
189 std::ranges::transform(
191 std::back_inserter(raw_ptr_vec),
200 template <
class T,
class Optional,
class Allocator>
204 if (!optional.has_value())
211 template <
class T,
class Tuple,
class Allocator>
215 std::vector<T*, Allocator> raw_ptr_vec;
216 raw_ptr_vec.reserve(std::tuple_size_v<Tuple>);
218 [&raw_ptr_vec](
auto&&... args)
228 requires std::same_as<T, std::nullopt_t>
230 && mpl::testable<std::ranges::range_value_t<typename T::value_type>>)
231 || (std::ranges::range<T> && mpl::testable<std::ranges::range_value_t<T>>)
234 if constexpr (!std::same_as<T, std::nullopt_t>)
238 if (elements.has_value())
240 return std::ranges::all_of(
242 [](
const auto& child)
255 return std::ranges::all_of(
257 [](
const auto& element)
259 return bool(element);
Concept for any smart pointer type.
Concept for testable types in boolean contexts.
constexpr bool is_type_instance_of_v
Variable template for convenient access to is_type_instance_of.
void unreachable()
Invokes undefined behavior for optimization purposes.
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.