Loading...
Searching...
No Matches
stringconvert.h
Go to the documentation of this file.
1#ifndef _BBM_ENOKI_STRINGCONVERT_H_
2#define _BBM_ENOKI_STRINGCONVERT_H_
3
5
6/************************************************************************/
7/*! \file stringconvert.h
8
9 \brief Specialization for converting backbone core types to and from strings
10
11*************************************************************************/
12
13namespace backbone {
14
15 namespace detail {
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 {};
18
19 template<typename T>
20 static constexpr bool is_packet_mask_v = is_packet_mask<std::decay_t<T>>::value;
21 }
22
23 /**********************************************************************/
24 /*! \brief regular enoki::array types
25 **********************************************************************/
26 template<typename T> requires (enoki::is_static_array_v<T> && !backbone::is_DiffArray_v<T>)
27 inline std::string toString(const T& arr)
28 {
29 using base_type = std::conditional_t<detail::is_packet_mask_v<T>, bool, value_t<T>>;
30
31 // helper lambda to convert to std::array
32 auto helper = [&]<size_t... IDX>(std::index_sequence<IDX...>) { return std::array<base_type, sizeof...(IDX)>{arr[IDX]...}; };
33
34 // leverage bbm::toString for std::array
35 return bbm::toString( helper(std::make_index_sequence<std::decay_t<T>::Size>{}) );
36 }
37
38 template<typename T> requires (enoki::is_static_array_v<T> && !backbone::is_DiffArray_v<T>)
39 inline T fromString(const std::string& str)
40 {
41 using base_type = std::conditional_t<detail::is_packet_mask_v<T>, bool, value_t<T>>;
42
43 // get compatible array
44 auto arr = bbm::fromString<std::array<base_type, std::decay_t<T>::Size>>(str);
45
46 // helper lambda for creating T from an std::array
47 auto helper = [&]<size_t... IDX>(std::index_sequence<IDX...>)
48 {
49 // special case packet mask
50 if constexpr (detail::is_packet_mask_v<T>)
51 {
52 T result;
53 ((result[IDX] = arr[IDX]), ...);
54 return result;
55 }
56
57 // otherwise (if not packtmask); direct construct
58 else return T(arr[IDX]...);
59 };
60
61 // Done.
62 return helper(std::make_index_sequence<std::decay_t<T>::Size>{});
63 }
64
65 /**********************************************************************/
66 /*! \brief enoki::DiffArray
67 **********************************************************************/
68 template<typename T> requires backbone::is_DiffArray_v<T>
69 inline std::string toString(const T& val)
70 {
71 return bbm::toString( enoki::detach(val) );
72 }
73
74 template<typename T> requires backbone::is_DiffArray_v<T>
75 inline T fromString(const std::string& str)
76 {
77 return T( bbm::fromString<enoki::value_t<T>>(str) );
78 }
79
80} // end backbone namespace
81
82#endif /* _BBM_ENOKI_STRINGCONVERT_H_ */
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
Definition: math.h:108