Loading...
Searching...
No Matches
stringconvert.h
Go to the documentation of this file.
1#ifndef _BBM_DRJIT_STRINGCONVERT_H_
2#define _BBM_DRJIT_STRINGCONVERT_H_
3
4#include "util/typestring.h"
5#include "core/error.h"
7
8/************************************************************************/
9/*! \file stringconvert.h
10
11 \brief Specialization for converting backbone core types to and from strings
12
13*************************************************************************/
14
15namespace backbone {
16
17 /**********************************************************************/
18 /*! \brief regular drjit::array types
19 **********************************************************************/
20 template<typename T> requires (drjit::is_static_array_v<T> && !backbone::is_LLVMArray_v<T> && !backbone::is_DiffArray_v<T>)
21 inline std::string toString(const T& arr)
22 {
23 // helper lambda to convert to std::array
24 auto helper = [&]<size_t... IDX>(std::index_sequence<IDX...>) { return std::array{arr[IDX]...}; };
25
26 // leverage bbm::toString for std::array
27 return bbm::toString( helper(std::make_index_sequence<std::decay_t<T>::Size>{}) );
28 }
29
30 template<typename T> requires (drjit::is_static_array_v<T> && !backbone::is_LLVMArray_v<T> && !backbone::is_DiffArray_v<T>)
31 inline T fromString(const std::string& str)
32 {
33 // convert str to std::array
34 auto arr = bbm::fromString<std::array<value_t<T>, std::decay_t<T>::Size>>(str);
35
36 // helper lambda to create T from std::array
37 auto helper = [&]<size_t ...IDX>(std::index_sequence<IDX...>) { return T(arr[IDX]...); };
38
39 // Done.
40 return helper(std::make_index_sequence<std::decay_t<T>::Size>{});
41 }
42
43 /**********************************************************************/
44 /*! \brief Handle drjit::DiffArray
45 **********************************************************************/
46 template<typename T> requires backbone::is_DiffArray_v<T>
47 inline std::string toString(const T& val)
48 {
49 return bbm::toString( drjit::detach(val) );
50 }
51
52 template<typename T> requires backbone::is_DiffArray_v<T>
53 inline T fromString(const std::string& str)
54 {
55 return T( bbm::fromString<drjit::value_t<T>>(str) );
56 }
57
58 /**********************************************************************/
59 /*! \brief Handle drjit::LLVMArray
60 **********************************************************************/
61 template<typename T> requires backbone::is_LLVMArray_v<T>
62 inline std::string toString(const T& val)
63 {
64 if(val.size() == 0) throw bbm_unassigned_ref;
65 return bbm::toString( val[0] );
66 }
67
68 template<typename T> requires backbone::is_LLVMArray_v<T>
69 inline T fromString(const std::string& str)
70 {
71 return T( bbm::fromString<drjit::value_t<T>>(str) );
72 }
73
74} // end backbone namespace
75
76#endif /* _BBM_DRJIT_STRINGCONVERT_H_ */
Predefined exceptions for common errors.
#define bbm_unassigned_ref
Definition: error.h:43
concept to check if a type has a valid string_converter.
Random number generator; built on top of Drjit.
Definition: backbone.h:53
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
produce stringview of type name of a type. Avoids using typeid for GCC, MSVC, and CLANG....