diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2018-09-05 11:30:40 +0300 |
---|---|---|
committer | mpimenov <mpimenov@users.noreply.github.com> | 2018-09-14 16:42:42 +0300 |
commit | e78e3f6fdc1ca356168422e8babf317d668f9ef2 (patch) | |
tree | a9d83e0cd05c15546dde3ca814074bfa5757663a /coding | |
parent | ea3407d1ec6a2800353896fac481023dbc3f4854 (diff) |
Review fixes.
Diffstat (limited to 'coding')
-rw-r--r-- | coding/endianness.hpp | 19 | ||||
-rw-r--r-- | coding/reader.hpp | 4 | ||||
-rw-r--r-- | coding/write_to_sink.hpp | 2 |
3 files changed, 14 insertions, 11 deletions
diff --git a/coding/endianness.hpp b/coding/endianness.hpp index 2f0329d594..39b4edc3b2 100644 --- a/coding/endianness.hpp +++ b/coding/endianness.hpp @@ -8,11 +8,14 @@ // #define ENDIAN_IS_BIG -// @TODO(bykoianko) This method returns false since 05.12.2010. That means only little endian -// architecture is supported. Now checks are added to generator and to app that only -// little endian architecture is supported. All the usage of IsBigEndian(), ReverseByteOrder() -// and SwapIfBigEndian() should be removed. -inline bool IsBigEndian() +// @TODO(bykoianko) This method returns false since 05.12.2010. That means only little-endian +// architectures are supported. When it's necessary to support a big-endian system: +// * method IsBigEndianMacroBased() should be implemented based on IsLittleEndian() function +// * method SwapIfBigEndianMacroBased() should be implemented based on IsLittleEndian() function +// * all serialization and deserialization of rs_bit_vector and the other rank-select structures +// should be implemented taking endianness into account + +inline bool IsBigEndianMacroBased() { #ifdef ENDIAN_IS_BIG return true; @@ -33,7 +36,7 @@ template <typename T> T ReverseByteOrder(T t) return res; } -template <typename T> inline T SwapIfBigEndian(T t) +template <typename T> inline T SwapIfBigEndianMacroBased(T t) { #ifdef ENDIAN_IS_BIG return ReverseByteOrder(t); @@ -45,6 +48,6 @@ template <typename T> inline T SwapIfBigEndian(T t) inline bool IsLittleEndian() { uint16_t const word = 0x0001; - char const * const b = reinterpret_cast<char const * const>(&word); - return b[0] == 0x1; + uint8_t const * const b = reinterpret_cast<uint8_t const * const>(&word); + return b[0] != 0x0; } diff --git a/coding/reader.hpp b/coding/reader.hpp index 3fa06ad83f..fb3546a717 100644 --- a/coding/reader.hpp +++ b/coding/reader.hpp @@ -264,7 +264,7 @@ inline TPrimitive ReadPrimitiveFromPos(TReader const & reader, uint64_t pos) #endif TPrimitive primitive; ReadFromPos(reader, pos, &primitive, sizeof(primitive)); - return SwapIfBigEndian(primitive); + return SwapIfBigEndianMacroBased(primitive); } template <typename TPrimitive, class TSource> @@ -275,7 +275,7 @@ TPrimitive ReadPrimitiveFromSource(TSource & source) #endif TPrimitive primitive; source.Read(&primitive, sizeof(primitive)); - return SwapIfBigEndian(primitive); + return SwapIfBigEndianMacroBased(primitive); } template <typename TPrimitive, typename TSource> diff --git a/coding/write_to_sink.hpp b/coding/write_to_sink.hpp index f5921e4290..3a0abefc46 100644 --- a/coding/write_to_sink.hpp +++ b/coding/write_to_sink.hpp @@ -9,7 +9,7 @@ template <class Sink, typename T> std::enable_if_t<std::is_integral<T>::value || std::is_enum<T>::value, void> WriteToSink( Sink & sink, T const & v) { - T const t = SwapIfBigEndian(v); + T const t = SwapIfBigEndianMacroBased(v); sink.Write(&t, sizeof(T)); } |