27 #include <type_traits>
38 #define QUOTE_IT(parm) #parm
41 template <
typename T,
size_t N>
42 constexpr
size_t countof(T
const (&)[N]) noexcept {
48 using FileWriter = bool (*)(
const std::vector<char> &data,
const char *filename);
53 bool SaveDataToFile(
const std::vector<char> &data,
const char *filename);
58 return fread(data,
sizeof(T), n, fp) == n;
63 bool Serialize(FILE *fp,
const T *data,
size_t n = 1) {
64 return fwrite(data,
sizeof(T), n, fp) == n;
77 bool Open(
const char *filename,
FileReader reader);
79 bool Open(
const char *data,
size_t size);
81 bool Open(FILE *fp, int64_t end_offset);
88 bool DeSerializeSize(int32_t *data);
89 bool DeSerializeSkip(
size_t size = 1);
95 return FReadEndian(data,
sizeof(T), count) == count;
102 }
else if (size == 0) {
104 }
else if (size > 50000000) {
107 }
else if constexpr (std::is_same<T, std::string>::value) {
111 for (
auto &item : data) {
116 }
else if constexpr (std::is_class<T>::value) {
120 for (
auto &item : data) {
121 if (!item.DeSerialize(
this)) {
125 }
else if constexpr (std::is_pointer<T>::value) {
129 for (uint32_t i = 0; i < size; i++) {
135 typedef typename std::remove_pointer<T>::type ST;
137 if (!item->DeSerialize(
this)) {
155 bool Serialize(
const std::vector<char> &data);
156 template <
typename T>
158 return FWrite(data,
sizeof(T), count) == count;
160 template <
typename T>
163 uint32_t size = data.size();
166 }
else if constexpr (std::is_same<T, std::string>::value) {
168 for (
auto string : data) {
173 }
else if constexpr (std::is_class<T>::value) {
175 for (
auto &item : data) {
176 if (!item.Serialize(
this)) {
180 }
else if constexpr (std::is_pointer<T>::value) {
182 for (
auto &item : data) {
183 uint8_t non_null = (item !=
nullptr);
188 if (!item->Serialize(
this)) {
193 }
else if (size > 0) {
201 bool Skip(
size_t count);
206 char *FGets(
char *buffer,
int buffer_size);
210 size_t FReadEndian(
void *buffer,
size_t size,
size_t count);
212 size_t FRead(
void *buffer,
size_t size,
size_t count);
220 void OpenWrite(std::vector<char> *data);
221 bool CloseWrite(
const char *filename,
FileWriter writer);
225 size_t FWrite(
const void *buffer,
size_t size,
size_t count);
229 std::vector<char> *data_ =
nullptr;
231 unsigned offset_ = 0;
233 bool data_is_owned_ =
false;
235 bool is_writing_ =
false;
bool(*)(const std::vector< char > &data, const char *filename) FileWriter
bool DeSerialize(bool swap, FILE *fp, std::vector< T > &data)
bool Serialize(FILE *fp, const std::vector< T > &data)
constexpr size_t countof(T const (&)[N]) noexcept
bool SaveDataToFile(const GenericVector< char > &data, const char *filename)
bool(*)(const char *filename, std::vector< char > *data) FileReader
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
bool Serialize(const T *data, size_t count=1)
bool DeSerialize(T *data, size_t count=1)
bool DeSerialize(std::vector< T > &data)
void set_swap(bool value)
bool Serialize(const std::vector< T > &data)