| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #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 |
| |
|