1 #ifndef SERIALIZATION_H_
2 #define SERIALIZATION_H_
26 namespace serialization
31 template<
typename Archive,
typename T>
39 template<
typename Archive,
typename T>
48 template<
typename InputArchive>
53 template<
typename OutputArchive>
60 #define BASIC_TYPE_SERIALIZER(type)\
62 struct Serializer<type> \
64 template<typename InputArchive>\
65 static inline void load(InputArchive& ar, type& val)\
69 template<typename OutputArchive>\
70 static inline void save(OutputArchive& ar, const type& val)\
76 #define ENUM_SERIALIZER(type)\
78 struct Serializer<type>\
80 template<typename InputArchive>\
81 static inline void load(InputArchive& ar, type& val)\
85 val = (type) int_val;\
87 template<typename OutputArchive>\
88 static inline void save(OutputArchive& ar, const type& val)\
90 int int_val = (int)val;\
122 template<
typename InputArchive>
128 for (
size_t i=0;i<
size;++i) {
133 template<
typename OutputArchive>
137 for (
size_t i=0;i<val.size();++i) {
144 template<
typename K,
typename V>
147 template<
typename InputArchive>
152 for (
size_t i = 0; i <
size; ++i)
158 map_val[key] = value;
162 template<
typename OutputArchive>
166 for (
typename std::map<K,V>::const_iterator i=map_val.begin(); i!=map_val.end(); ++i) {
176 template<
typename InputArchive>
182 template<
typename OutputArchive>
189 template<
typename T,
int N>
192 template<
typename InputArchive>
198 template<
typename OutputArchive>
236 template<
typename InputArchive>
239 ar.load_binary(
const_cast<void *
>(b.
ptr_), b.
size_);
242 template<
typename OutputArchive>
252 template<
typename InputArchive>
255 ar.load_binary(
const_cast<void *
>(b.
ptr_), b.
size_);
258 template<
typename OutputArchive>
286 template<
typename Archive>
299 return *
static_cast<Archive*
>(
this);
304 template<
typename Archive>
317 return *
static_cast<Archive*
>(
this);
335 size_ +=
sizeof(val);
374 #define BLOCK_BYTES (1024 * 64)
389 char *buffer_blocks_;
390 char *compressed_buffer_;
398 buffer_ = buffer_blocks_ = (
char *)malloc(
BLOCK_BYTES*2);
400 if (buffer_ ==
NULL || compressed_buffer_ ==
NULL) {
405 lz4Stream = &lz4Stream_body;
426 lz4Stream, buffer_+headSz, compressed_buffer_+headSz,
offset_-headSz,
435 memcpy(compressed_buffer_, buffer_, headSz);
438 first_block_ =
false;
440 size_t headSz =
sizeof(compSz);
444 lz4Stream, buffer_, compressed_buffer_+headSz,
offset_,
452 memcpy(compressed_buffer_, &compSz, headSz);
457 fwrite(compressed_buffer_, compSz, 1, stream_);
460 if (buffer_ == buffer_blocks_)
463 buffer_ = buffer_blocks_;
470 free(buffer_blocks_);
471 buffer_blocks_ =
NULL;
473 free(compressed_buffer_);
474 compressed_buffer_ =
NULL;
478 fwrite(&z,
sizeof(z), 1, stream_);
513 memcpy(buffer_+
offset_, &val,
sizeof(val));
562 char *buffer_blocks_;
563 char *compressed_buffer_;
568 void decompressAndLoadV10(FILE* stream)
573 size_t pos = ftell(stream);
575 size_t fileSize = ftell(stream)-pos;
580 char *compBuffer = (
char *)malloc(fileSize);
581 if (compBuffer ==
NULL) {
584 if (fread(compBuffer, fileSize, 1, stream) != 1) {
586 throw FLANNException(
"Invalid index file, cannot read from disk (compressed)");
593 size_t compressedSz = fileSize-headSz;
603 ptr_ = buffer_ = (
char *)malloc(uncompressedSz+headSz);
604 if (buffer_ ==
NULL) {
606 throw FLANNException(
"Error (re)allocating decompression buffer");
616 if (usedSz != uncompressedSz) {
622 memcpy(buffer_, compBuffer, headSz);
626 if (compressedSz+headSz+pos != fileSize)
627 fseek(stream, compressedSz+headSz+pos,
SEEK_SET);
628 block_sz_ = uncompressedSz+headSz;
631 void initBlock(FILE *stream)
633 size_t pos = ftell(stream);
635 buffer_blocks_ =
NULL;
636 compressed_buffer_ =
NULL;
644 if (fread(head, headSz, 1, stream) != 1) {
646 throw FLANNException(
"Invalid index file, cannot read from disk (header)");
653 return decompressAndLoadV10(stream);
658 buffer_ = buffer_blocks_ = (
char *)malloc(
BLOCK_BYTES*2);
660 if (buffer_ ==
NULL || compressed_buffer_ ==
NULL) {
666 lz4StreamDecode = &lz4StreamDecode_body;
670 memcpy(buffer_, head, headSz);
677 void loadBlock(
char* buffer_,
size_t compSz, FILE* stream)
684 if (fread(compressed_buffer_, compSz, 1, stream) != 1) {
685 throw FLANNException(
"Invalid index file, cannot read from disk (block)");
690 lz4StreamDecode, compressed_buffer_, buffer_, compSz,
BLOCK_BYTES);
692 throw FLANNException(
"Invalid index file, cannot decompress block");
694 block_sz_ = decBytes;
697 void preparePtr(
size_t size)
700 if (ptr_+
size <= buffer_+block_sz_)
704 if (buffer_ == buffer_blocks_)
707 buffer_ = buffer_blocks_;
711 size_t readCnt = fread(&cmpSz,
sizeof(cmpSz), 1, stream_);
712 if(cmpSz <= 0 || readCnt != 1) {
713 throw FLANNException(
"Requested to read next block past end of file");
717 loadBlock(buffer_, cmpSz, stream_);
724 if (buffer_blocks_ !=
NULL) {
727 if (fread(&zero,
sizeof(zero), 1, stream_) != 1) {
728 throw FLANNException(
"Invalid index file, cannot read from disk (end)");
731 throw FLANNException(
"Invalid index file, last block not zero length");
736 if (buffer_blocks_ !=
NULL) {
737 free(buffer_blocks_);
738 buffer_blocks_ =
NULL;
740 if (compressed_buffer_ !=
NULL) {
741 free(compressed_buffer_);
742 compressed_buffer_ =
NULL;
776 preparePtr(
sizeof(val));
777 memcpy(&val, ptr_,
sizeof(val));
806 memcpy(ptr, ptr_,
size);
void setObject(void *object)
LoadArchive(FILE *stream)
LoadArchive(const char *filename)
void load_binary(T *ptr, size_t size)
bool_< false > is_loading
Archive & operator&(const T &val)
SaveArchive(FILE *stream)
void save_binary(T *ptr, size_t size)
SaveArchive(const char *filename)
void save_binary(T *ptr, size_t size)
int LZ4_decompress_safe(const char *source, char *dest, int compressedSize, int maxDecompressedSize)
int LZ4_setStreamDecode(LZ4_streamDecode_t *LZ4_streamDecode, const char *dictionary, int dictSize)
int LZ4_decompress_safe_continue(LZ4_streamDecode_t *LZ4_streamDecode, const char *source, char *dest, int compressedSize, int maxOutputSize)
#define LZ4_COMPRESSBOUND(isize)
int LZ4_compress_HC_continue(LZ4_streamHC_t *LZ4_streamHCPtr, const char *source, char *dest, int inputSize, int maxOutputSize)
void LZ4_resetStreamHC(LZ4_streamHC_t *LZ4_streamHCPtr, int compressionLevel)
const binary_object make_binary_object(void *t, size_t size)
void serialize(Archive &ar, T &type)
#define BASIC_TYPE_SERIALIZER(type)
static void save(OutputArchive &ar, T *const &val)
static void load(InputArchive &ar, T *&val)
static void load(InputArchive &ar, T(&val)[N])
static void save(OutputArchive &ar, T const (&val)[N])
static void save(OutputArchive &ar, const binary_object &b)
static void load(InputArchive &ar, binary_object &b)
static void load(InputArchive &ar, const binary_object &b)
static void save(OutputArchive &ar, const binary_object &b)
static void load(InputArchive &ar, std::map< K, V > &map_val)
static void save(OutputArchive &ar, const std::map< K, V > &map_val)
static void load(InputArchive &ar, std::vector< T > &val)
static void save(OutputArchive &ar, const std::vector< T > &val)
static void load(InputArchive &ar, T &val)
static void save(OutputArchive &ar, const T &val)
static void serialize(Archive &ar, T &type)
binary_object & operator=(const binary_object &rhs)
binary_object(const binary_object &rhs)
binary_object(void *const ptr, size_t size)