summaryrefslogtreecommitdiff
path: root/include/gudhi/Off_reader.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/gudhi/Off_reader.h')
-rw-r--r--include/gudhi/Off_reader.h187
1 files changed, 0 insertions, 187 deletions
diff --git a/include/gudhi/Off_reader.h b/include/gudhi/Off_reader.h
deleted file mode 100644
index 05a1e145..00000000
--- a/include/gudhi/Off_reader.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): David Salinas
- *
- * Copyright (C) 2014 Inria
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifndef OFF_READER_H_
-#define OFF_READER_H_
-
-
-#include <sstream>
-#include <iostream>
-#include <iterator>
-#include <string>
-#include <vector>
-#include <fstream>
-
-namespace Gudhi {
-
-/** \brief OFF file reader top class visitor.
- *
- * OFF file must be conform to format described here :
- * http://www.geomview.org/docs/html/OFF.html
- */
-class Off_reader {
- public:
- Off_reader(std::ifstream& stream) : stream_(stream) { }
-
- ~Off_reader() {
- stream_.close();
- }
-
- /** \brief
- * Read an OFF file and calls the following methods :
- *
- * <CODE>void init(int dim,int num_vertices,int num_faces,int num_edges); // from file header - num_edges may not be set
- *
- * void point(const std::vector<double>& point); // for each point read
- *
- * void maximal_face(const std::list<int>& face); // for each face read
- *
- * void done(); // upon file read is finished</CODE>
- *
- * of the visitor when reading a point or a maximal face. Edges are not taken into account.
- */
- template<typename OffVisitor>
- bool read(OffVisitor& off_visitor) {
- bool success_read_off_preambule = read_off_preambule(off_visitor);
- if (!success_read_off_preambule) {
- std::cerr << "could not read off preambule\n";
- return false;
- }
-
- bool success_read_off_points = read_off_points(off_visitor);
- if (!success_read_off_points) {
- std::cerr << "could not read off points\n";
- return false;
- }
-
- bool success_read_off_faces = read_off_faces(off_visitor);
- if (!success_read_off_faces) {
- std::cerr << "could not read off faces\n";
- return false;
- }
-
- off_visitor.done();
- return success_read_off_preambule && success_read_off_points && success_read_off_faces;
- }
-
- private:
- std::ifstream& stream_;
-
- struct Off_info {
- int dim;
- int num_vertices;
- int num_edges;
- int num_faces;
- };
-
- Off_info off_info_;
-
- template<typename OffVisitor>
- bool read_off_preambule(OffVisitor& off_visitor) {
- std::string line;
- if (!goto_next_uncomment_line(line)) return false;
-
- bool is_off_file = (line.find("OFF") != std::string::npos);
- bool is_noff_file = (line.find("nOFF") != std::string::npos);
-
-
-
- if (!is_off_file && !is_noff_file) {
- std::cerr << line << std::endl;
- std::cerr << "missing off header\n";
- return false;
- }
-
- if (is_noff_file) {
- // Should be on a separate line, but we accept it on the same line as the number of vertices
- stream_ >> off_info_.dim;
- } else {
- off_info_.dim = 3;
- }
-
- if (!goto_next_uncomment_line(line)) return false;
- std::istringstream iss(line);
- if (!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
- std::cerr << "incorrect number of vertices/faces/edges\n";
- return false;
- }
- off_visitor.init(off_info_.dim, off_info_.num_vertices, off_info_.num_faces, off_info_.num_edges);
-
- return true;
- }
-
- bool goto_next_uncomment_line(std::string& uncomment_line) {
- do {
- // skip whitespace, including empty lines
- if (!std::ifstream::sentry(stream_)) return false;
- std::getline(stream_, uncomment_line);
- } while (uncomment_line[0] == '#');
- return static_cast<bool>(stream_);
- }
-
- template<typename OffVisitor>
- bool read_off_points(OffVisitor& visitor) {
- int num_vertices_to_read = off_info_.num_vertices;
- while (num_vertices_to_read--) {
- std::string line;
- if (!goto_next_uncomment_line(line)) return false;
- std::vector<double> point;
- std::istringstream iss(line);
- point.assign(std::istream_iterator<double>(iss), std::istream_iterator<double>());
- // if(point.size() != off_info_.dim) return false;
- visitor.point(point);
- }
- return true;
- }
-
- template<typename OffVisitor>
- bool read_off_faces(OffVisitor& visitor) {
- std::string line;
- while (goto_next_uncomment_line(line)) {
- std::istringstream iss(line);
- int num_face_vertices;
- iss >> num_face_vertices;
- std::vector<int> face;
- face.assign(std::istream_iterator<int>(iss), std::istream_iterator<int>());
- // if (face.size() != (off_info_.dim + 1)) return false;
- visitor.maximal_face(face);
- }
- return true;
- }
-};
-
-template<typename OFFVisitor>
-void read_off(const std::string& name_file_off, OFFVisitor& vis) {
- std::ifstream stream(name_file_off);
- if (!stream.is_open()) {
- std::cerr << "could not open file \n";
- } else {
- Off_reader off_reader(stream);
- off_reader.read(vis);
- }
-}
-
-} // namespace Gudhi
-
-#endif // OFF_READER_H_