40#ifndef GEOGRAM_BASIC_GEOFILE
41#define GEOGRAM_BASIC_GEOFILE
102 template <class T> inline
bool read_ascii_attribute(
103 FILE* file, Memory::pointer base_addr,
index_t nb_elements
105 T* attrib =
reinterpret_cast<T*
>(base_addr);
106 for(
index_t i=0; i<nb_elements; ++i) {
109 while(
char(res = fgetc(file)) !=
'\n') {
113 buff.push_back(
char(res));
115 if(!String::from_string(buff.c_str(),attrib[i])) {
134 T* attrib =
reinterpret_cast<T*
>(base_addr);
135 for(
index_t i=0; i<nb_elements; ++i) {
138 file,
"%s\n", String::to_string(attrib[i]).c_str()
158 template <>
inline bool read_ascii_attribute<char>(
161 char* attrib =
reinterpret_cast<char*
>(base_addr);
162 for(
index_t i=0; i<nb_elements; ++i) {
164 if(fscanf(file,
"%d", &val) == 0) {
167 attrib[i] = char(val);
182 template <>
inline bool write_ascii_attribute<char>(
185 char* attrib =
reinterpret_cast<char*
>(base_addr);
186 for(
index_t i=0; i<nb_elements; ++i) {
187 if(fprintf(file,
"%d\n",
int(attrib[i])) == 0) {
204 template <>
inline bool read_ascii_attribute<bool>(
207 char* attrib =
reinterpret_cast<char*
>(base_addr);
208 for(
index_t i=0; i<nb_elements; ++i) {
210 if(fscanf(file,
"%d", &val) == 0) {
213 attrib[i] = char(val);
228 template <>
inline bool write_ascii_attribute<bool>(
231 char* attrib =
reinterpret_cast<char*
>(base_addr);
232 for(
index_t i=0; i<nb_elements; ++i) {
233 if(fprintf(file,
"%d\n",
int(attrib[i])) == 0) {
276 typedef bool (*AsciiAttributeSerializer)(
288 const std::string& type_name,
289 AsciiAttributeSerializer read,
290 AsciiAttributeSerializer write
320 return current_chunk_class_;
328 return current_chunk_size_;
350 const std::string& name_in,
351 const std::string& element_type_in,
352 size_t element_size_in,
356 element_type(element_type_in),
357 element_size(element_size_in),
358 dimension(dimension_in) {
402 const std::string& name_in,
406 nb_items(nb_items_in),
418 const std::string& name_in
420 for(
index_t i=0; i<attributes.size(); ++i) {
421 if(attributes[i].name == name_in) {
422 return &(attributes[i]);
436 for(
index_t i=0; i<attributes.size(); ++i) {
437 if(attributes[i].name == name_in) {
438 return &(attributes[i]);
473 auto it = attribute_sets_.find(name);
474 if(it == attribute_sets_.end()) {
477 return &(it->second);
487 const std::string& name
489 auto it = attribute_sets_.find(name);
490 if(it == attribute_sets_.end()) {
493 return &(it->second);
534 void write_string(
const std::string& s,
const char* comment =
nullptr);
595 return sizeof(
index_t) + s.length();
605 const std::vector<std::string>& strings
622 const std::string& chunk_class,
size_t size
646 std::string filename_;
650 std::string current_chunk_class_;
651 long current_chunk_size_;
652 long current_chunk_file_pos_;
653 std::map<std::string, AttributeSetInfo> attribute_sets_;
655 static std::map<std::string, AsciiAttributeSerializer>
656 ascii_attribute_read_;
658 static std::map<std::string, AsciiAttributeSerializer>
659 ascii_attribute_write_;
706 geo_assert(current_attribute_set_ !=
nullptr);
707 return *current_attribute_set_;
718 return *current_attribute_;
726 const std::string& current_comment()
const {
728 return current_comment_;
752 std::string current_comment_;
788 const std::string& name,
index_t nb_items
805 const std::string& attribute_set_name,
806 const std::string& attribute_name,
807 const std::string& element_type,
#define geo_assert(x)
Verifies that a condition is met.
Common include file, providing basic definitions. Should be included before anything else by all head...
GeoFileException(const std::string &s)
GeoFileException constructor.
GeoFileException(const GeoFileException &rhs)
GeoFileException copy constructor.
~GeoFileException() GEO_NOEXCEPT override
GeoFileException destructor.
Base class for reading or writing Geogram structured binary files.
std::string read_chunk_class()
Reads a chunk class from the file.
void check_chunk_size()
Checks that the actual chunk size corresponds to the specified chunk size.
void write_chunk_class(const std::string &chunk_class)
Writes a chunk class into the file.
long current_chunk_size() const
Gets the size of the current chunk.
bool is_ascii() const
Tests whether this GeoFile is ascii.
const std::string & current_chunk_class() const
Gets the current chunk class.
size_t string_array_size(const std::vector< std::string > &strings) const
Gets the size in bytes used by a given string array in the file.
AttributeSetInfo * find_attribute_set(const std::string &name)
Finds an attribute set by name.
const AttributeSetInfo * find_attribute_set(const std::string &name) const
Finds an attribute set by name.
GeoFile(const std::string &filename)
GeoFile constructor.
void clear_attribute_maps()
Clears all memorized information about attributes and attribute sets.
std::string read_string()
Reads a string from the file.
size_t string_size(const std::string &s) const
Gets the size in bytes used by a given string in the file.
void read_string_array(std::vector< std::string > &strings)
Reads a string array from the file.
void write_int(index_t x, const char *comment=nullptr)
Writes an integer into the file.
void write_string(const std::string &s, const char *comment=nullptr)
Writes a string into the file.
void check_zlib_version()
Compares the zlib version declared in the header file with the zlib version obtained from the runtime...
index_t read_int()
Reads an integer from the file.
void write_size(size_t x)
Writes an unsigned 64 bits integer into the file.
void write_string_array(const std::vector< std::string > &strings)
Writes a string array into the file.
~GeoFile()
GeoFile destructor.
void write_chunk_header(const std::string &chunk_class, size_t size)
Writes a chunk header into the file.
size_t read_size()
Reads an unsigned 64 bits integer from the file.
void read_chunk_header()
Reads a chunk header from the file.
static void register_ascii_attribute_serializer(const std::string &type_name, AsciiAttributeSerializer read, AsciiAttributeSerializer write)
Declares a new attribute type that can be read from and written to ascii files.
Used to write a structured binary file.
void write_attribute_set(const std::string &name, index_t nb_items)
Writes a new attribute set to the file.
void write_separator()
Writes a separator into the file.
OutputGeoFile(const std::string &filename, index_t compression_level=3)
OutputGeoFile constructor.
void write_comment(const std::string &comment)
Writes a new comment to the file.
void write_attribute(const std::string &attribute_set_name, const std::string &attribute_name, const std::string &element_type, size_t element_size, index_t dimension, const void *data)
Writes a new attribute to the file.
void write_command_line(const std::vector< std::string > &args)
Writes the command line to the file.
Vector with aligned memory allocation.
Types and functions for memory manipulation.
byte * pointer
Pointer to unsigned byte(s)
Global Vorpaline namespace.
geo_index_t index_t
The type for storing and manipulating indices.
bool write_ascii_attribute(FILE *file, Memory::pointer base_addr, index_t nb_elements)
Writes an ASCII attribute to a file.
Types and functions for numbers manipulation.
Functions for string manipulation.
Internal representation of attributes.
std::string name
Name of the attribute.
AttributeInfo()
AttributeInfo constructor.
index_t dimension
The number of elements per item.
size_t element_size
The size in bytes of each element.
std::string element_type
A string with the name fo the C++ type of the elements.
AttributeInfo(const std::string &name_in, const std::string &element_type_in, size_t element_size_in, index_t dimension_in)
AttributeInfo constructor.
Internal representation of an attribute set.
AttributeSetInfo(const std::string &name_in, index_t nb_items_in)
AttributeSetInfo constructor.
bool skip
if set, all attributes in the set are skipped when reading the file.
AttributeInfo * find_attribute(const std::string &name_in)
Finds an AttributeInfo by name.
index_t nb_items
number of items in each attribute of the set.
vector< AttributeInfo > attributes
the attributes of the set.
AttributeSetInfo()
AttributeSetInfo constructor.
std::string name
name of the attribute set.
const AttributeInfo * find_attribute(const std::string &name_in) const
Finds an AttributeInfo by name.