1#ifndef _BBM_ENOKI_STRINGCONVERT_H_
2#define _BBM_ENOKI_STRINGCONVERT_H_
16 template<
typename T>
struct is_packet_mask : std::false_type {};
17 template<
typename T>
struct is_packet_mask<
enoki::PacketMask<T>> : std::true_type {};
20 static constexpr bool is_packet_mask_v = is_packet_mask<std::decay_t<T>>::value;
26 template<
typename T>
requires (enoki::is_static_array_v<T> && !backbone::is_DiffArray_v<T>)
29 using base_type = std::conditional_t<detail::is_packet_mask_v<T>, bool,
value_t<T>>;
32 auto helper = [&]<
size_t... IDX>(std::index_sequence<IDX...>) {
return std::array<base_type,
sizeof...(IDX)>{arr[IDX]...}; };
35 return bbm::toString( helper(std::make_index_sequence<std::decay_t<T>::Size>{}) );
38 template<
typename T>
requires (enoki::is_static_array_v<T> && !backbone::is_DiffArray_v<T>)
41 using base_type = std::conditional_t<detail::is_packet_mask_v<T>, bool,
value_t<T>>;
44 auto arr = bbm::fromString<std::array<base_type, std::decay_t<T>::Size>>(str);
47 auto helper = [&]<
size_t... IDX>(std::index_sequence<IDX...>)
50 if constexpr (detail::is_packet_mask_v<T>)
53 ((result[IDX] = arr[IDX]), ...);
58 else return T(arr[IDX]...);
62 return helper(std::make_index_sequence<std::decay_t<T>::Size>{});
68 template<
typename T>
requires backbone::is_DiffArray_v<T>
69 inline std::string
toString(
const T& val)
74 template<
typename T>
requires backbone::is_DiffArray_v<T>
concept to check if a type has a valid string_converter.
Random number generator; built on top of Drjit.
Definition: backbone.h:53
typename backbone::detail::value< std::decay_t< T > >::type value_t
Value trait.
Definition: type_traits.h:35
std::string toString(const T &)
regular drjit::array types
Definition: stringconvert.h:21
T fromString(const std::string &)
Definition: stringconvert.h:31
T fromString(const std::string &)
fromString alias
Definition: stringconvert.h:584
std::string toString(const T &)
toString alias
Definition: stringconvert.h:594