summaryrefslogtreecommitdiff
path: root/include/gudhi_laplacian/misc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/gudhi_laplacian/misc.hpp')
-rw-r--r--include/gudhi_laplacian/misc.hpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/include/gudhi_laplacian/misc.hpp b/include/gudhi_laplacian/misc.hpp
new file mode 100644
index 0000000..614f30f
--- /dev/null
+++ b/include/gudhi_laplacian/misc.hpp
@@ -0,0 +1,68 @@
+#pragma once
+
+#include <cstdint>
+#include <istream>
+#include <ostream>
+#include <string>
+
+#include <glob.h>
+
+namespace Gudhi_laplacian
+{
+ // FIXME: Read from PETSc headers.
+ static const int32_t PETSC_MAT_FILE_CLASSID = 1211216;
+ static const int32_t PETSC_VEC_FILE_CLASSID = 1211214;
+
+ bool preexisting_files(const std::string & prefix, const std::string & postfix)
+ {
+ glob_t globbuf;
+ std::string pattern = prefix + std::string(".*.") + postfix;
+ bool ret = (glob(pattern.c_str(), GLOB_ERR | GLOB_NOSORT, NULL, &globbuf) != GLOB_NOMATCH);
+ globfree(&globbuf);
+ return ret;
+ }
+
+
+ template <typename T> inline void reverse_endianness(T & x)
+ {
+ uint8_t * p = reinterpret_cast<uint8_t *>(&x);
+ std::reverse(p, p + sizeof(T));
+ }
+
+ template <typename T> inline T read_le(std::istream & s)
+ {
+ T result;
+ s.read(reinterpret_cast<char *>(&result), sizeof(T));
+ #ifdef BIGENDIAN
+ reverse_endianness(result);
+ #endif
+ return result;
+ }
+
+ template <typename T> inline void write_le(std::ostream & s, T value)
+ {
+ #ifdef BIGENDIAN
+ reverse_endianness(value);
+ #endif
+ s.write(reinterpret_cast<char *>(&value), sizeof(T));
+ }
+
+ template <typename T> inline T read_be(std::istream & s)
+ {
+ T result;
+ s.read(reinterpret_cast<char *>(&result), sizeof(T));
+ #ifndef BIGENDIAN
+ reverse_endianness(result);
+ #endif
+ return result;
+ }
+
+ template <typename T> inline void write_be(std::ostream & s, T value)
+ {
+ #ifndef BIGENDIAN
+ reverse_endianness(value);
+ #endif
+ s.write(reinterpret_cast<char *>(&value), sizeof(T));
+ }
+}
+