8 #ifndef TREELITE_DETAIL_SERIALIZER_H_
9 #define TREELITE_DETAIL_SERIALIZER_H_
25 #include <type_traits>
40 return (std::is_unsigned_v<T> ?
"=B" :
"=b");
42 return (std::is_unsigned_v<T> ?
"=H" :
"=h");
44 if (std::is_integral_v<T>) {
45 return (std::is_unsigned_v<T> ?
"=L" :
"=l");
47 TREELITE_CHECK(std::is_floating_point_v<T>) <<
"Could not infer format string";
51 if (std::is_integral_v<T>) {
52 return (std::is_unsigned_v<T> ?
"=Q" :
"=q");
54 TREELITE_CHECK(std::is_floating_point_v<T>) <<
"Could not infer format string";
70 static_assert(std::is_arithmetic_v<T> || std::is_enum_v<T>,
71 "Use GetPyBufferFromArray(vec, format) for composite types; specify format string manually");
85 static_assert(std::is_standard_layout_v<T>,
"T must be in the standard layout");
90 using T = std::underlying_type_t<TypeInfo>;
95 using T = std::underlying_type_t<TaskType>;
100 using T = std::underlying_type_t<TreeNodeType>;
104 template <
typename T>
106 static_assert(std::is_arithmetic_v<T> || std::is_enum_v<T>,
107 "Use GetPyBufferFromScalar(scalar, format) for composite types; "
108 "specify format string manually");
112 template <
typename T>
118 template <
typename T>
123 *vec = std::move(new_vec);
128 *str = std::string(
static_cast<char*
>(frame.buf), frame.nitem);
132 using T = std::underlying_type_t<TypeInfo>;
135 T* t =
static_cast<T*
>(frame.buf);
136 *scalar =
static_cast<TypeInfo>(*t);
140 using T = std::underlying_type_t<TaskType>;
143 T* t =
static_cast<T*
>(frame.buf);
144 *scalar =
static_cast<TaskType>(*t);
147 template <
typename T>
149 static_assert(std::is_standard_layout_v<T>,
"T must be in the standard layout");
152 T* t =
static_cast<T*
>(frame.buf);
156 template <
typename T>
158 static_assert(std::is_standard_layout_v<T>,
"T must be in the standard layout");
159 is.read(
reinterpret_cast<char*
>(scalar),
sizeof(T));
162 template <
typename T>
164 static_assert(std::is_standard_layout_v<T>,
"T must be in the standard layout");
165 os.write(
reinterpret_cast<char const*
>(scalar),
sizeof(T));
168 template <
typename T>
171 is.read(
reinterpret_cast<char*
>(&nelem),
sizeof(nelem));
177 is.read(
reinterpret_cast<char*
>(vec->
Data()),
sizeof(T) * nelem);
180 template <
typename T>
182 static_assert(
sizeof(std::uint64_t) >=
sizeof(std::size_t),
"size_t too large");
183 auto const nelem =
static_cast<std::uint64_t
>(vec->
Size());
184 os.write(
reinterpret_cast<char const*
>(&nelem),
sizeof(nelem));
188 os.write(
reinterpret_cast<char const*
>(vec->
Data()),
sizeof(T) * vec->
Size());
192 std::uint64_t str_len;
193 is.read(
reinterpret_cast<char*
>(&str_len),
sizeof(str_len));
197 *str = std::string(str_len,
'\0');
198 is.read(str->data(),
sizeof(
char) * str_len);
202 static_assert(
sizeof(std::uint64_t) >=
sizeof(std::size_t),
"size_t too large");
203 auto const str_len =
static_cast<std::uint64_t
>(str->length());
204 os.write(
reinterpret_cast<char const*
>(&str_len),
sizeof(str_len));
208 os.write(str->data(),
sizeof(char) * str->length());
212 std::string field_name;
215 std::uint64_t elem_size, nelem;
219 std::uint64_t
const nbytes = elem_size * nelem;
221 is.seekg(
static_cast<std::streamoff
>(nbytes), std::ios::cur);
Definition: contiguous_array.h:17
T * Data()
Definition: contiguous_array.h:108
std::size_t Size() const
Definition: contiguous_array.h:138
void Resize(std::size_t newsize)
Definition: contiguous_array.h:157
void UseForeignBuffer(void *prealloc_buf, std::size_t size)
Definition: contiguous_array.h:97
void Clear()
Definition: contiguous_array.h:182
A simple array container, with owned or non-owned (externally allocated) buffer.
size_t nitem
Definition: c_api.h:57
char * format
Definition: c_api.h:55
size_t itemsize
Definition: c_api.h:56
logging facility for Treelite
#define TREELITE_CHECK_LE(x, y)
Definition: logging.h:75
#define TREELITE_LOG(severity)
Definition: logging.h:84
#define TREELITE_CHECK(x)
Definition: logging.h:70
#define TREELITE_CHECK_EQ(x, y)
Definition: logging.h:77
Definition: serializer.h:28
void InitArrayFromPyBuffer(ContiguousArray< T > *vec, PyBufferFrame frame)
Definition: serializer.h:113
void InitScalarFromPyBuffer(TypeInfo *scalar, PyBufferFrame frame)
Definition: serializer.h:131
PyBufferFrame GetPyBufferFromScalar(void *data, char const *format, std::size_t itemsize)
Definition: serializer.h:75
void WriteStringToStream(std::string *str, std::ostream &os)
Definition: serializer.h:201
void WriteScalarToStream(T *scalar, std::ostream &os)
Definition: serializer.h:163
PyBufferFrame GetPyBufferFromArray(void *data, char const *format, std::size_t itemsize, std::size_t nitem)
Definition: serializer.h:30
void InitArrayFromPyBufferWithCopy(ContiguousArray< T > *vec, PyBufferFrame frame)
Definition: serializer.h:119
void ReadScalarFromStream(T *scalar, std::istream &is)
Definition: serializer.h:157
PyBufferFrame GetPyBufferFromString(std::string *str)
Definition: serializer.h:79
void InitStringFromPyBuffer(std::string *str, PyBufferFrame frame)
Definition: serializer.h:126
void ReadStringFromStream(std::string *str, std::istream &is)
Definition: serializer.h:191
void WriteArrayToStream(ContiguousArray< T > *vec, std::ostream &os)
Definition: serializer.h:181
void ReadArrayFromStream(ContiguousArray< T > *vec, std::istream &is)
Definition: serializer.h:169
char const * InferFormatString()
Definition: serializer.h:37
void SkipOptionalFieldInStream(std::istream &is)
Definition: serializer.h:211
TreelitePyBufferFrame PyBufferFrame
Definition: pybuffer_frame.h:18
TypeInfo
Types used by thresholds and leaf outputs.
Definition: typeinfo.h:21
TaskType
Enum type representing the task type.
Definition: task_type.h:19
TreeNodeType
Tree node type.
Definition: tree_node_type.h:17
Define enum type Operator.
Data structure to enable zero-copy exchange in Python.
Define enum type TaskType.
Define enum type NodeType.
Defines enum type TypeInfo.