Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef RTABMAP_FLANN_SAVING_H_
00030 #define RTABMAP_FLANN_SAVING_H_
00031
00032 #include <cstring>
00033 #include <vector>
00034 #include <stdio.h>
00035
00036 #include "rtflann/general.h"
00037 #include "rtflann/util/serialization.h"
00038
00039
00040 #ifdef FLANN_SIGNATURE_
00041 #undef FLANN_SIGNATURE_
00042 #endif
00043 #define FLANN_SIGNATURE_ "FLANN_INDEX_v1.1"
00044
00045 namespace rtflann
00046 {
00047
00051 struct IndexHeader
00052 {
00053 IndexHeaderStruct h;
00054
00055 IndexHeader()
00056 {
00057 memset(h.signature, 0, sizeof(h.signature));
00058 strcpy(h.signature, FLANN_SIGNATURE_);
00059 memset(h.version, 0, sizeof(h.version));
00060 strcpy(h.version, FLANN_VERSION_);
00061
00062 h.compression = 0;
00063 h.first_block_size = 0;
00064 }
00065
00066 private:
00067 template<typename Archive>
00068 void serialize(Archive& ar)
00069 {
00070 ar & h.signature;
00071 ar & h.version;
00072 ar & h.data_type;
00073 ar & h.index_type;
00074 ar & h.rows;
00075 ar & h.cols;
00076 ar & h.compression;
00077 ar & h.first_block_size;
00078 }
00079 friend struct serialization::access;
00080 };
00081
00088 template<typename Index>
00089 void save_header(FILE* stream, const Index& index)
00090 {
00091 IndexHeader header;
00092 header.h.data_type = flann_datatype_value<typename Index::ElementType>::value;
00093 header.h.index_type = index.getType();
00094 header.h.rows = index.size();
00095 header.h.cols = index.veclen();
00096
00097 fwrite(&header, sizeof(header),1,stream);
00098 }
00099
00100
00106 inline IndexHeader load_header(FILE* stream)
00107 {
00108 IndexHeader header;
00109 int read_size = fread(&header,sizeof(header),1,stream);
00110
00111 if (read_size != 1) {
00112 throw FLANNException("Invalid index file, cannot read");
00113 }
00114
00115 if (strncmp(header.h.signature,
00116 FLANN_SIGNATURE_,
00117 strlen(FLANN_SIGNATURE_) - strlen("v0.0")) != 0) {
00118 throw FLANNException("Invalid index file, wrong signature");
00119 }
00120
00121 return header;
00122 }
00123
00124
00125 namespace serialization
00126 {
00127 ENUM_SERIALIZER(flann_algorithm_t);
00128 ENUM_SERIALIZER(flann_centers_init_t);
00129 ENUM_SERIALIZER(flann_log_level_t);
00130 ENUM_SERIALIZER(flann_datatype_t);
00131 }
00132
00133 }
00134
00135 #endif