treelite
serializer_mixins.h
Go to the documentation of this file.
1 
8 #ifndef TREELITE_DETAIL_SERIALIZER_MIXINS_H_
9 #define TREELITE_DETAIL_SERIALIZER_MIXINS_H_
10 
14 
15 #include <istream>
16 #include <ostream>
17 #include <string>
18 #include <vector>
19 
21 
23  public:
24  explicit StreamSerializerMixIn(std::ostream& os) : os_(os) {}
25 
26  template <typename T>
27  void SerializeScalar(T* field) {
28  WriteScalarToStream(field, os_);
29  }
30 
31  void SerializeString(std::string* field) {
32  WriteStringToStream(field, os_);
33  }
34 
35  template <typename T>
37  WriteArrayToStream(field, os_);
38  }
39 
40  private:
41  std::ostream& os_;
42 };
43 
45  public:
46  explicit StreamDeserializerMixIn(std::istream& is) : is_(is) {}
47 
48  template <typename T>
49  void DeserializeScalar(T* field) {
50  ReadScalarFromStream(field, is_);
51  }
52 
53  void DeserializeString(std::string* field) {
54  ReadStringFromStream(field, is_);
55  }
56 
57  template <typename T>
59  ReadArrayFromStream(field, is_);
60  }
61 
64  }
65 
66  private:
67  std::istream& is_;
68 };
69 
71  public:
73 
74  template <typename T>
75  void SerializeScalar(T* field) {
76  frames_.push_back(GetPyBufferFromScalar(field));
77  }
78 
79  void SerializeString(std::string* field) {
80  frames_.push_back(GetPyBufferFromString(field));
81  }
82 
83  template <typename T>
85  frames_.push_back(GetPyBufferFromArray(field));
86  }
87 
88  std::vector<PyBufferFrame> GetFrames() {
89  return frames_;
90  }
91 
92  private:
93  std::vector<PyBufferFrame> frames_;
94 };
95 
97  public:
98  explicit PyBufferDeserializerMixIn(std::vector<PyBufferFrame> const& frames)
99  : frames_(frames), cur_idx_(0) {}
100 
101  template <typename T>
102  void DeserializeScalar(T* field) {
103  InitScalarFromPyBuffer(field, frames_[cur_idx_++]);
104  }
105 
106  void DeserializeString(std::string* field) {
107  InitStringFromPyBuffer(field, frames_[cur_idx_++]);
108  }
109 
110  template <typename T>
112  InitArrayFromPyBuffer(field, frames_[cur_idx_++]);
113  }
114 
116  cur_idx_ += 2; // field name + content
117  }
118 
119  private:
120  std::vector<PyBufferFrame> const& frames_;
121  std::size_t cur_idx_;
122 };
123 
124 } // namespace treelite::detail::serializer
125 
126 #endif // TREELITE_DETAIL_SERIALIZER_MIXINS_H_
Definition: contiguous_array.h:17
void DeserializeScalar(T *field)
Definition: serializer_mixins.h:102
void DeserializeArray(ContiguousArray< T > *field)
Definition: serializer_mixins.h:111
void SkipOptionalField()
Definition: serializer_mixins.h:115
void DeserializeString(std::string *field)
Definition: serializer_mixins.h:106
PyBufferDeserializerMixIn(std::vector< PyBufferFrame > const &frames)
Definition: serializer_mixins.h:98
void SerializeString(std::string *field)
Definition: serializer_mixins.h:79
void SerializeScalar(T *field)
Definition: serializer_mixins.h:75
void SerializeArray(ContiguousArray< T > *field)
Definition: serializer_mixins.h:84
std::vector< PyBufferFrame > GetFrames()
Definition: serializer_mixins.h:88
void DeserializeString(std::string *field)
Definition: serializer_mixins.h:53
void SkipOptionalField()
Definition: serializer_mixins.h:62
void DeserializeScalar(T *field)
Definition: serializer_mixins.h:49
void DeserializeArray(ContiguousArray< T > *field)
Definition: serializer_mixins.h:58
StreamDeserializerMixIn(std::istream &is)
Definition: serializer_mixins.h:46
Definition: serializer_mixins.h:22
StreamSerializerMixIn(std::ostream &os)
Definition: serializer_mixins.h:24
void SerializeString(std::string *field)
Definition: serializer_mixins.h:31
void SerializeScalar(T *field)
Definition: serializer_mixins.h:27
void SerializeArray(ContiguousArray< T > *field)
Definition: serializer_mixins.h:36
A simple array container, with owned or non-owned (externally allocated) buffer.
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 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
void SkipOptionalFieldInStream(std::istream &is)
Definition: serializer.h:211
Data structure to enable zero-copy exchange in Python.
Building blocks for serializers.