| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef COLMAP_SRC_UTIL_ENDIAN_H_ |
| #define COLMAP_SRC_UTIL_ENDIAN_H_ |
|
|
| #include <algorithm> |
| #include <iostream> |
|
|
| namespace colmap { |
|
|
| |
| template <typename T> |
| T ReverseBytes(const T& data); |
|
|
| |
| bool IsLittleEndian(); |
| bool IsBigEndian(); |
|
|
| |
| |
| |
| template <typename T> |
| T LittleEndianToNative(const T x); |
| template <typename T> |
| T BigEndianToNative(const T x); |
| template <typename T> |
| T NativeToLittleEndian(const T x); |
| template <typename T> |
| T NativeToBigEndian(const T x); |
|
|
| |
| template <typename T> |
| T ReadBinaryLittleEndian(std::istream* stream); |
| template <typename T> |
| void ReadBinaryLittleEndian(std::istream* stream, std::vector<T>* data); |
|
|
| |
| template <typename T> |
| void WriteBinaryLittleEndian(std::ostream* stream, const T& data); |
| template <typename T> |
| void WriteBinaryLittleEndian(std::ostream* stream, const std::vector<T>& data); |
|
|
| |
| |
| |
|
|
| template <typename T> |
| T ReverseBytes(const T& data) { |
| T data_reversed = data; |
| std::reverse(reinterpret_cast<char*>(&data_reversed), |
| reinterpret_cast<char*>(&data_reversed) + sizeof(T)); |
| return data_reversed; |
| } |
|
|
| inline bool IsLittleEndian() { |
| #ifdef BOOST_BIG_ENDIAN |
| return false; |
| #else |
| return true; |
| #endif |
| } |
|
|
| inline bool IsBigEndian() { |
| #ifdef BOOST_BIG_ENDIAN |
| return true; |
| #else |
| return false; |
| #endif |
| } |
|
|
| template <typename T> |
| T LittleEndianToNative(const T x) { |
| if (IsLittleEndian()) { |
| return x; |
| } else { |
| return ReverseBytes(x); |
| } |
| } |
|
|
| template <typename T> |
| T BigEndianToNative(const T x) { |
| if (IsBigEndian()) { |
| return x; |
| } else { |
| return ReverseBytes(x); |
| } |
| } |
|
|
| template <typename T> |
| T NativeToLittleEndian(const T x) { |
| if (IsLittleEndian()) { |
| return x; |
| } else { |
| return ReverseBytes(x); |
| } |
| } |
|
|
| template <typename T> |
| T NativeToBigEndian(const T x) { |
| if (IsBigEndian()) { |
| return x; |
| } else { |
| return ReverseBytes(x); |
| } |
| } |
|
|
| template <typename T> |
| T ReadBinaryLittleEndian(std::istream* stream) { |
| T data_little_endian; |
| stream->read(reinterpret_cast<char*>(&data_little_endian), sizeof(T)); |
| return LittleEndianToNative(data_little_endian); |
| } |
|
|
| template <typename T> |
| void ReadBinaryLittleEndian(std::istream* stream, std::vector<T>* data) { |
| for (size_t i = 0; i < data->size(); ++i) { |
| (*data)[i] = ReadBinaryLittleEndian<T>(stream); |
| } |
| } |
|
|
| template <typename T> |
| void WriteBinaryLittleEndian(std::ostream* stream, const T& data) { |
| const T data_little_endian = NativeToLittleEndian(data); |
| stream->write(reinterpret_cast<const char*>(&data_little_endian), sizeof(T)); |
| } |
|
|
| template <typename T> |
| void WriteBinaryLittleEndian(std::ostream* stream, const std::vector<T>& data) { |
| for (const auto& elem : data) { |
| WriteBinaryLittleEndian<T>(stream, elem); |
| } |
| } |
|
|
| } |
|
|
| #endif |
|
|