diff options
Diffstat (limited to 'include/misc.hpp')
-rw-r--r-- | include/misc.hpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/include/misc.hpp b/include/misc.hpp new file mode 100644 index 0000000..f8afe77 --- /dev/null +++ b/include/misc.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include <algorithm> +#include <cmath> +#include <cstdint> +#include <sstream> + +constexpr int64_t DIPHA_MAGIC = 8067171840; +constexpr int64_t DIPHA_DISTANCE_MATRIX = 7; +constexpr int64_t DIPHA_PERSISTENCE_DIAGRAM = 2; +constexpr int64_t DIPHA_WEIGHTED_BOUNDARY_MATRIX = 0; +inline constexpr double PI = 4*std::atan(1); + +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)); +} + +enum class Message_tag : int { result, work }; + +template <typename T> inline T unroll_upper_tri(T n, T i, T j) +{ + return i*(n-1) - ((i-1)*i)/2 + j; +} + +template <typename T> inline T unroll_full(T n, T i, T j) +{ + return i*n + j; +} |