mfbt/tests/TestEndian.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mfbt/tests/TestEndian.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,398 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +#include "mozilla/Assertions.h"
     1.9 +#include "mozilla/Endian.h"
    1.10 +
    1.11 +#include <stddef.h>
    1.12 +
    1.13 +using mozilla::BigEndian;
    1.14 +using mozilla::LittleEndian;
    1.15 +using mozilla::NativeEndian;
    1.16 +
    1.17 +template<typename T>
    1.18 +void
    1.19 +TestSingleSwap(T value, T swappedValue)
    1.20 +{
    1.21 +#if MOZ_LITTLE_ENDIAN
    1.22 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToBigEndian(value) == swappedValue);
    1.23 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromBigEndian(value) == swappedValue);
    1.24 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToNetworkOrder(value) == swappedValue);
    1.25 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromNetworkOrder(value) == swappedValue);
    1.26 +#else
    1.27 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToLittleEndian(value) == swappedValue);
    1.28 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromLittleEndian(value) == swappedValue);
    1.29 +#endif
    1.30 +}
    1.31 +
    1.32 +template<typename T>
    1.33 +void
    1.34 +TestSingleNoSwap(T value, T notSwappedValue)
    1.35 +{
    1.36 +#if MOZ_LITTLE_ENDIAN
    1.37 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToLittleEndian(value) == notSwappedValue);
    1.38 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromLittleEndian(value) == notSwappedValue);
    1.39 +#else
    1.40 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToBigEndian(value) == notSwappedValue);
    1.41 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromBigEndian(value) == notSwappedValue);
    1.42 +  MOZ_RELEASE_ASSERT(NativeEndian::swapToNetworkOrder(value) == notSwappedValue);
    1.43 +  MOZ_RELEASE_ASSERT(NativeEndian::swapFromNetworkOrder(value) == notSwappedValue);
    1.44 +#endif
    1.45 +}
    1.46 +
    1.47 +// Endian.h functions are declared as protected in an base class and
    1.48 +// then re-exported as public in public derived classes.  The
    1.49 +// standardese around explicit instantiation of templates is not clear
    1.50 +// in such cases.  Provide these wrappers to make things more explicit.
    1.51 +// For your own enlightenment, you may wish to peruse:
    1.52 +// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56152 and subsequently
    1.53 +// http://j.mp/XosS6S .
    1.54 +#define WRAP_COPYTO(NAME)                                       \
    1.55 +  template<typename T>                                          \
    1.56 +  void                                                          \
    1.57 +  NAME(void* dst, const T* src, size_t count)                   \
    1.58 +  {                                                             \
    1.59 +    NativeEndian::NAME<T>(dst, src, count);                     \
    1.60 +  }
    1.61 +
    1.62 +WRAP_COPYTO(copyAndSwapToLittleEndian)
    1.63 +WRAP_COPYTO(copyAndSwapToBigEndian)
    1.64 +WRAP_COPYTO(copyAndSwapToNetworkOrder)
    1.65 +
    1.66 +#define WRAP_COPYFROM(NAME)                                     \
    1.67 +  template<typename T>                                          \
    1.68 +  void                                                          \
    1.69 +  NAME(T* dst, const void* src, size_t count)                   \
    1.70 +  {                                                             \
    1.71 +    NativeEndian::NAME<T>(dst, src, count);                     \
    1.72 +  }
    1.73 +
    1.74 +WRAP_COPYFROM(copyAndSwapFromLittleEndian)
    1.75 +WRAP_COPYFROM(copyAndSwapFromBigEndian)
    1.76 +WRAP_COPYFROM(copyAndSwapFromNetworkOrder)
    1.77 +
    1.78 +#define WRAP_IN_PLACE(NAME)                                     \
    1.79 +  template<typename T>                                          \
    1.80 +  void                                                          \
    1.81 +  NAME(T* p, size_t count)                                      \
    1.82 +  {                                                             \
    1.83 +    NativeEndian::NAME<T>(p, count);                            \
    1.84 +  }
    1.85 +WRAP_IN_PLACE(swapToLittleEndianInPlace)
    1.86 +WRAP_IN_PLACE(swapFromLittleEndianInPlace)
    1.87 +WRAP_IN_PLACE(swapToBigEndianInPlace)
    1.88 +WRAP_IN_PLACE(swapFromBigEndianInPlace)
    1.89 +WRAP_IN_PLACE(swapToNetworkOrderInPlace)
    1.90 +WRAP_IN_PLACE(swapFromNetworkOrderInPlace)
    1.91 +
    1.92 +enum SwapExpectation {
    1.93 +  Swap,
    1.94 +  NoSwap
    1.95 +};
    1.96 +
    1.97 +template<typename T, size_t Count>
    1.98 +void
    1.99 +TestBulkSwapToSub(enum SwapExpectation expectSwap,
   1.100 +                  const T (&values)[Count],
   1.101 +                  void (*swapperFunc)(void*, const T*, size_t),
   1.102 +                  T (*readerFunc)(const void*))
   1.103 +{
   1.104 +  const size_t arraySize = 2 * Count;
   1.105 +  const size_t bufferSize = arraySize * sizeof(T);
   1.106 +  static uint8_t buffer[bufferSize];
   1.107 +  const uint8_t fillValue = 0xa5;
   1.108 +  static uint8_t checkBuffer[bufferSize];
   1.109 +
   1.110 +  MOZ_RELEASE_ASSERT(bufferSize > 2 * sizeof(T));
   1.111 +
   1.112 +  memset(checkBuffer, fillValue, bufferSize);
   1.113 +
   1.114 +  for (size_t startPosition = 0; startPosition < sizeof(T); ++startPosition) {
   1.115 +    for (size_t nValues = 0; nValues < Count; ++nValues) {
   1.116 +      memset(buffer, fillValue, bufferSize);
   1.117 +      swapperFunc(buffer + startPosition, values, nValues);
   1.118 +
   1.119 +      MOZ_RELEASE_ASSERT(memcmp(buffer, checkBuffer, startPosition) == 0);
   1.120 +      size_t valuesEndPosition = startPosition + sizeof(T) * nValues;
   1.121 +      MOZ_RELEASE_ASSERT(memcmp(buffer + valuesEndPosition,
   1.122 +                        checkBuffer + valuesEndPosition,
   1.123 +                        bufferSize - valuesEndPosition) == 0);
   1.124 +      if (expectSwap == NoSwap) {
   1.125 +        MOZ_RELEASE_ASSERT(memcmp(buffer + startPosition, values,
   1.126 +                          nValues * sizeof(T)) == 0);
   1.127 +      }
   1.128 +      for (size_t i = 0; i < nValues; ++i) {
   1.129 +        MOZ_RELEASE_ASSERT(readerFunc(buffer + startPosition + sizeof(T) * i) ==
   1.130 +                   values[i]);
   1.131 +      }
   1.132 +    }
   1.133 +  }
   1.134 +}
   1.135 +
   1.136 +template<typename T, size_t Count>
   1.137 +void
   1.138 +TestBulkSwapFromSub(enum SwapExpectation expectSwap,
   1.139 +                    const T (&values)[Count],
   1.140 +                    void (*swapperFunc)(T*, const void*, size_t),
   1.141 +                    T (*readerFunc)(const void*))
   1.142 +{
   1.143 +  const size_t arraySize = 2 * Count;
   1.144 +  const size_t bufferSize = arraySize * sizeof(T);
   1.145 +  static T buffer[arraySize];
   1.146 +  const uint8_t fillValue = 0xa5;
   1.147 +  static T checkBuffer[arraySize];
   1.148 +
   1.149 +  memset(checkBuffer, fillValue, bufferSize);
   1.150 +
   1.151 +  for (size_t startPosition = 0; startPosition < Count; ++startPosition) {
   1.152 +    for (size_t nValues = 0; nValues < (Count - startPosition); ++nValues) {
   1.153 +      memset(buffer, fillValue, bufferSize);
   1.154 +      swapperFunc(buffer + startPosition, values, nValues);
   1.155 +
   1.156 +      MOZ_RELEASE_ASSERT(memcmp(buffer, checkBuffer, startPosition * sizeof(T)) == 0);
   1.157 +      size_t valuesEndPosition = startPosition + nValues;
   1.158 +      MOZ_RELEASE_ASSERT(memcmp(buffer + valuesEndPosition,
   1.159 +                        checkBuffer + valuesEndPosition,
   1.160 +                        (arraySize - valuesEndPosition) * sizeof(T)) == 0);
   1.161 +      if (expectSwap == NoSwap) {
   1.162 +        MOZ_RELEASE_ASSERT(memcmp(buffer + startPosition, values,
   1.163 +                          nValues * sizeof(T)) == 0);
   1.164 +      }
   1.165 +      for (size_t i = 0; i < nValues; ++i)
   1.166 +        MOZ_RELEASE_ASSERT(readerFunc(buffer + startPosition + i) == values[i]);
   1.167 +    }
   1.168 +  }
   1.169 +}
   1.170 +
   1.171 +
   1.172 +template<typename T, size_t Count>
   1.173 +void
   1.174 +TestBulkInPlaceSub(enum SwapExpectation expectSwap,
   1.175 +                   const T (&values)[Count],
   1.176 +                   void (*swapperFunc)(T* p, size_t),
   1.177 +                   T (*readerFunc)(const void*))
   1.178 +{
   1.179 +  const size_t bufferCount = 4 * Count;
   1.180 +  const size_t bufferSize = bufferCount * sizeof(T);
   1.181 +  static T buffer[bufferCount];
   1.182 +  const T fillValue = 0xa5;
   1.183 +  static T checkBuffer[bufferCount];
   1.184 +
   1.185 +  MOZ_RELEASE_ASSERT(bufferSize > 2 * sizeof(T));
   1.186 +
   1.187 +  memset(checkBuffer, fillValue, bufferSize);
   1.188 +
   1.189 +  for (size_t startPosition = 0; startPosition < Count; ++startPosition) {
   1.190 +    for (size_t nValues = 0; nValues < Count; ++nValues) {
   1.191 +      memset(buffer, fillValue, bufferSize);
   1.192 +      memcpy(buffer + startPosition, values, nValues * sizeof(T));
   1.193 +      swapperFunc(buffer + startPosition, nValues);
   1.194 +
   1.195 +      MOZ_RELEASE_ASSERT(memcmp(buffer, checkBuffer, startPosition * sizeof(T)) == 0);
   1.196 +      size_t valuesEndPosition = startPosition + nValues;
   1.197 +      MOZ_RELEASE_ASSERT(memcmp(buffer + valuesEndPosition,
   1.198 +                        checkBuffer + valuesEndPosition,
   1.199 +                        bufferSize - valuesEndPosition * sizeof(T)) == 0);
   1.200 +      if (expectSwap == NoSwap) {
   1.201 +        MOZ_RELEASE_ASSERT(memcmp(buffer + startPosition, values,
   1.202 +                          nValues * sizeof(T)) == 0);
   1.203 +      }
   1.204 +      for (size_t i = 0; i < nValues; ++i)
   1.205 +        MOZ_RELEASE_ASSERT(readerFunc(buffer + startPosition + i) == values[i]);
   1.206 +    }
   1.207 +  }
   1.208 +}
   1.209 +
   1.210 +template<typename T>
   1.211 +struct Reader
   1.212 +{
   1.213 +};
   1.214 +
   1.215 +#define SPECIALIZE_READER(TYPE, READ_FUNC)                              \
   1.216 +  template<>                                                            \
   1.217 +  struct Reader<TYPE>                                                   \
   1.218 +  {                                                                     \
   1.219 +    static TYPE readLE(const void* p) { return LittleEndian::READ_FUNC(p); }    \
   1.220 +    static TYPE readBE(const void* p) { return BigEndian::READ_FUNC(p); } \
   1.221 +  };
   1.222 +
   1.223 +SPECIALIZE_READER(uint16_t, readUint16)
   1.224 +SPECIALIZE_READER(uint32_t, readUint32)
   1.225 +SPECIALIZE_READER(uint64_t, readUint64)
   1.226 +SPECIALIZE_READER(int16_t, readInt16)
   1.227 +SPECIALIZE_READER(int32_t, readInt32)
   1.228 +SPECIALIZE_READER(int64_t, readInt64)
   1.229 +
   1.230 +template<typename T, size_t Count>
   1.231 +void
   1.232 +TestBulkSwap(const T (&bytes)[Count])
   1.233 +{
   1.234 +#if MOZ_LITTLE_ENDIAN
   1.235 +  TestBulkSwapToSub(Swap, bytes, copyAndSwapToBigEndian<T>, Reader<T>::readBE);
   1.236 +  TestBulkSwapFromSub(Swap, bytes, copyAndSwapFromBigEndian<T>, Reader<T>::readBE);
   1.237 +  TestBulkSwapToSub(Swap, bytes, copyAndSwapToNetworkOrder<T>, Reader<T>::readBE);
   1.238 +  TestBulkSwapFromSub(Swap, bytes, copyAndSwapFromNetworkOrder<T>, Reader<T>::readBE);
   1.239 +#else
   1.240 +  TestBulkSwapToSub(Swap, bytes, copyAndSwapToLittleEndian<T>, Reader<T>::readLE);
   1.241 +  TestBulkSwapFromSub(Swap, bytes, copyAndSwapFromLittleEndian<T>, Reader<T>::readLE);
   1.242 +#endif
   1.243 +}
   1.244 +
   1.245 +template<typename T, size_t Count>
   1.246 +void
   1.247 +TestBulkNoSwap(const T (&bytes)[Count])
   1.248 +{
   1.249 +#if MOZ_LITTLE_ENDIAN
   1.250 +  TestBulkSwapToSub(NoSwap, bytes, copyAndSwapToLittleEndian<T>, Reader<T>::readLE);
   1.251 +  TestBulkSwapFromSub(NoSwap, bytes, copyAndSwapFromLittleEndian<T>, Reader<T>::readLE);
   1.252 +#else
   1.253 +  TestBulkSwapToSub(NoSwap, bytes, copyAndSwapToBigEndian<T>, Reader<T>::readBE);
   1.254 +  TestBulkSwapFromSub(NoSwap, bytes, copyAndSwapFromBigEndian<T>, Reader<T>::readBE);
   1.255 +  TestBulkSwapToSub(NoSwap, bytes, copyAndSwapToNetworkOrder<T>, Reader<T>::readBE);
   1.256 +  TestBulkSwapFromSub(NoSwap, bytes, copyAndSwapFromNetworkOrder<T>, Reader<T>::readBE);
   1.257 +#endif
   1.258 +}
   1.259 +
   1.260 +template<typename T, size_t Count>
   1.261 +void
   1.262 +TestBulkInPlaceSwap(const T (&bytes)[Count])
   1.263 +{
   1.264 +#if MOZ_LITTLE_ENDIAN
   1.265 +  TestBulkInPlaceSub(Swap, bytes, swapToBigEndianInPlace<T>, Reader<T>::readBE);
   1.266 +  TestBulkInPlaceSub(Swap, bytes, swapFromBigEndianInPlace<T>, Reader<T>::readBE);
   1.267 +  TestBulkInPlaceSub(Swap, bytes, swapToNetworkOrderInPlace<T>, Reader<T>::readBE);
   1.268 +  TestBulkInPlaceSub(Swap, bytes, swapFromNetworkOrderInPlace<T>, Reader<T>::readBE);
   1.269 +#else
   1.270 +  TestBulkInPlaceSub(Swap, bytes, swapToLittleEndianInPlace<T>, Reader<T>::readLE);
   1.271 +  TestBulkInPlaceSub(Swap, bytes, swapFromLittleEndianInPlace<T>, Reader<T>::readLE);
   1.272 +#endif
   1.273 +}
   1.274 +
   1.275 +template<typename T, size_t Count>
   1.276 +void
   1.277 +TestBulkInPlaceNoSwap(const T (&bytes)[Count])
   1.278 +{
   1.279 +#if MOZ_LITTLE_ENDIAN
   1.280 +  TestBulkInPlaceSub(NoSwap, bytes, swapToLittleEndianInPlace<T>, Reader<T>::readLE);
   1.281 +  TestBulkInPlaceSub(NoSwap, bytes, swapFromLittleEndianInPlace<T>, Reader<T>::readLE);
   1.282 +#else
   1.283 +  TestBulkInPlaceSub(NoSwap, bytes, swapToBigEndianInPlace<T>, Reader<T>::readBE);
   1.284 +  TestBulkInPlaceSub(NoSwap, bytes, swapFromBigEndianInPlace<T>, Reader<T>::readBE);
   1.285 +  TestBulkInPlaceSub(NoSwap, bytes, swapToNetworkOrderInPlace<T>, Reader<T>::readBE);
   1.286 +  TestBulkInPlaceSub(NoSwap, bytes, swapFromNetworkOrderInPlace<T>, Reader<T>::readBE);
   1.287 +#endif
   1.288 +}
   1.289 +
   1.290 +int
   1.291 +main()
   1.292 +{
   1.293 +  static const uint8_t unsigned_bytes[16] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
   1.294 +                                              0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 };
   1.295 +  static const int8_t signed_bytes[16] = { -0x0f, -0x0e, -0x0d, -0x0c, -0x0b, -0x0a, -0x09, -0x08,
   1.296 +                                           -0x0f, -0x0e, -0x0d, -0x0c, -0x0b, -0x0a, -0x09, -0x08 };
   1.297 +  static const uint16_t uint16_values[8] = { 0x102, 0x304, 0x506, 0x708, 0x102, 0x304, 0x506, 0x708 };
   1.298 +  static const int16_t int16_values[8] = { int16_t(0xf1f2), int16_t(0xf3f4), int16_t(0xf5f6), int16_t(0xf7f8),
   1.299 +                                           int16_t(0xf1f2), int16_t(0xf3f4), int16_t(0xf5f6), int16_t(0xf7f8) };
   1.300 +  static const uint32_t uint32_values[4] = { 0x1020304, 0x5060708, 0x1020304, 0x5060708 };
   1.301 +  static const int32_t int32_values[4] = { int32_t(0xf1f2f3f4), int32_t(0xf5f6f7f8),
   1.302 +                                           int32_t(0xf1f2f3f4), int32_t(0xf5f6f7f8) };
   1.303 +  static const uint64_t uint64_values[2] = { 0x102030405060708, 0x102030405060708 };
   1.304 +  static const int64_t int64_values[2] = { int64_t(0xf1f2f3f4f5f6f7f8),
   1.305 +                                           int64_t(0xf1f2f3f4f5f6f7f8) };
   1.306 +  uint8_t buffer[8];
   1.307 +
   1.308 +  MOZ_RELEASE_ASSERT(LittleEndian::readUint16(&unsigned_bytes[0]) == 0x201);
   1.309 +  MOZ_RELEASE_ASSERT(BigEndian::readUint16(&unsigned_bytes[0]) == 0x102);
   1.310 +
   1.311 +  MOZ_RELEASE_ASSERT(LittleEndian::readUint32(&unsigned_bytes[0]) == 0x4030201U);
   1.312 +  MOZ_RELEASE_ASSERT(BigEndian::readUint32(&unsigned_bytes[0]) == 0x1020304U);
   1.313 +
   1.314 +  MOZ_RELEASE_ASSERT(LittleEndian::readUint64(&unsigned_bytes[0]) == 0x807060504030201ULL);
   1.315 +  MOZ_RELEASE_ASSERT(BigEndian::readUint64(&unsigned_bytes[0]) == 0x102030405060708ULL);
   1.316 +
   1.317 +  LittleEndian::writeUint16(&buffer[0], 0x201);
   1.318 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint16_t)) == 0);
   1.319 +  BigEndian::writeUint16(&buffer[0], 0x102);
   1.320 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint16_t)) == 0);
   1.321 +
   1.322 +  LittleEndian::writeUint32(&buffer[0], 0x4030201U);
   1.323 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint32_t)) == 0);
   1.324 +  BigEndian::writeUint32(&buffer[0], 0x1020304U);
   1.325 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint32_t)) == 0);
   1.326 +
   1.327 +  LittleEndian::writeUint64(&buffer[0], 0x807060504030201ULL);
   1.328 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint64_t)) == 0);
   1.329 +  BigEndian::writeUint64(&buffer[0], 0x102030405060708ULL);
   1.330 +  MOZ_RELEASE_ASSERT(memcmp(&unsigned_bytes[0], &buffer[0], sizeof(uint64_t)) == 0);
   1.331 +
   1.332 +  MOZ_RELEASE_ASSERT(LittleEndian::readInt16(&signed_bytes[0]) == int16_t(0xf2f1));
   1.333 +  MOZ_RELEASE_ASSERT(BigEndian::readInt16(&signed_bytes[0]) == int16_t(0xf1f2));
   1.334 +
   1.335 +  MOZ_RELEASE_ASSERT(LittleEndian::readInt32(&signed_bytes[0]) == int32_t(0xf4f3f2f1));
   1.336 +  MOZ_RELEASE_ASSERT(BigEndian::readInt32(&signed_bytes[0]) == int32_t(0xf1f2f3f4));
   1.337 +
   1.338 +  MOZ_RELEASE_ASSERT(LittleEndian::readInt64(&signed_bytes[0]) == int64_t(0xf8f7f6f5f4f3f2f1LL));
   1.339 +  MOZ_RELEASE_ASSERT(BigEndian::readInt64(&signed_bytes[0]) == int64_t(0xf1f2f3f4f5f6f7f8LL));
   1.340 +
   1.341 +  LittleEndian::writeInt16(&buffer[0], 0xf2f1);
   1.342 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int16_t)) == 0);
   1.343 +  BigEndian::writeInt16(&buffer[0], 0xf1f2);
   1.344 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int16_t)) == 0);
   1.345 +
   1.346 +  LittleEndian::writeInt32(&buffer[0], 0xf4f3f2f1);
   1.347 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int32_t)) == 0);
   1.348 +  BigEndian::writeInt32(&buffer[0], 0xf1f2f3f4);
   1.349 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int32_t)) == 0);
   1.350 +
   1.351 +  LittleEndian::writeInt64(&buffer[0], 0xf8f7f6f5f4f3f2f1LL);
   1.352 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int64_t)) == 0);
   1.353 +  BigEndian::writeInt64(&buffer[0], 0xf1f2f3f4f5f6f7f8LL);
   1.354 +  MOZ_RELEASE_ASSERT(memcmp(&signed_bytes[0], &buffer[0], sizeof(int64_t)) == 0);
   1.355 +
   1.356 +  TestSingleSwap(uint16_t(0xf2f1), uint16_t(0xf1f2));
   1.357 +  TestSingleSwap(uint32_t(0xf4f3f2f1), uint32_t(0xf1f2f3f4));
   1.358 +  TestSingleSwap(uint64_t(0xf8f7f6f5f4f3f2f1), uint64_t(0xf1f2f3f4f5f6f7f8));
   1.359 +
   1.360 +  TestSingleSwap(int16_t(0xf2f1), int16_t(0xf1f2));
   1.361 +  TestSingleSwap(int32_t(0xf4f3f2f1), int32_t(0xf1f2f3f4));
   1.362 +  TestSingleSwap(int64_t(0xf8f7f6f5f4f3f2f1), int64_t(0xf1f2f3f4f5f6f7f8));
   1.363 +
   1.364 +  TestSingleNoSwap(uint16_t(0xf2f1), uint16_t(0xf2f1));
   1.365 +  TestSingleNoSwap(uint32_t(0xf4f3f2f1), uint32_t(0xf4f3f2f1));
   1.366 +  TestSingleNoSwap(uint64_t(0xf8f7f6f5f4f3f2f1), uint64_t(0xf8f7f6f5f4f3f2f1));
   1.367 +
   1.368 +  TestSingleNoSwap(int16_t(0xf2f1), int16_t(0xf2f1));
   1.369 +  TestSingleNoSwap(int32_t(0xf4f3f2f1), int32_t(0xf4f3f2f1));
   1.370 +  TestSingleNoSwap(int64_t(0xf8f7f6f5f4f3f2f1), int64_t(0xf8f7f6f5f4f3f2f1));
   1.371 +
   1.372 +  TestBulkSwap(uint16_values);
   1.373 +  TestBulkSwap(int16_values);
   1.374 +  TestBulkSwap(uint32_values);
   1.375 +  TestBulkSwap(int32_values);
   1.376 +  TestBulkSwap(uint64_values);
   1.377 +  TestBulkSwap(int64_values);
   1.378 +
   1.379 +  TestBulkNoSwap(uint16_values);
   1.380 +  TestBulkNoSwap(int16_values);
   1.381 +  TestBulkNoSwap(uint32_values);
   1.382 +  TestBulkNoSwap(int32_values);
   1.383 +  TestBulkNoSwap(uint64_values);
   1.384 +  TestBulkNoSwap(int64_values);
   1.385 +
   1.386 +  TestBulkInPlaceSwap(uint16_values);
   1.387 +  TestBulkInPlaceSwap(int16_values);
   1.388 +  TestBulkInPlaceSwap(uint32_values);
   1.389 +  TestBulkInPlaceSwap(int32_values);
   1.390 +  TestBulkInPlaceSwap(uint64_values);
   1.391 +  TestBulkInPlaceSwap(int64_values);
   1.392 +
   1.393 +  TestBulkInPlaceNoSwap(uint16_values);
   1.394 +  TestBulkInPlaceNoSwap(int16_values);
   1.395 +  TestBulkInPlaceNoSwap(uint32_values);
   1.396 +  TestBulkInPlaceNoSwap(int32_values);
   1.397 +  TestBulkInPlaceNoSwap(uint64_values);
   1.398 +  TestBulkInPlaceNoSwap(int64_values);
   1.399 +
   1.400 +  return 0;
   1.401 +}

mercurial