1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef FlipBytes_h 27#define FlipBytes_h 28 29namespace WTF { 30 31inline bool needToFlipBytesIfLittleEndian(bool littleEndian) 32{ 33#if CPU(BIG_ENDIAN) 34 return littleEndian; 35#else 36 return !littleEndian; 37#endif 38} 39 40inline uint16_t flipBytes(uint16_t value) 41{ 42 return ((value & 0x00ff) << 8) 43 | ((value & 0xff00) >> 8); 44} 45 46inline uint32_t flipBytes(uint32_t value) 47{ 48 return ((value & 0x000000ff) << 24) 49 | ((value & 0x0000ff00) << 8) 50 | ((value & 0x00ff0000) >> 8) 51 | ((value & 0xff000000) >> 24); 52} 53 54inline uint64_t flipBytes(uint64_t value) 55{ 56 return ((value & 0x00000000000000ffull) << 56) 57 | ((value & 0x000000000000ff00ull) << 40) 58 | ((value & 0x0000000000ff0000ull) << 24) 59 | ((value & 0x00000000ff000000ull) << 8) 60 | ((value & 0x000000ff00000000ull) >> 8) 61 | ((value & 0x0000ff0000000000ull) >> 24) 62 | ((value & 0x00ff000000000000ull) >> 40) 63 | ((value & 0xff00000000000000ull) >> 56); 64} 65 66template<typename T> 67inline T flipBytes(T value) 68{ 69 if (sizeof(value) == 1) 70 return value; 71 if (sizeof(value) == 2) { 72 union { 73 T original; 74 uint16_t word; 75 } u; 76 u.original = value; 77 u.word = flipBytes(u.word); 78 return u.original; 79 } 80 if (sizeof(value) == 4) { 81 union { 82 T original; 83 uint32_t word; 84 } u; 85 u.original = value; 86 u.word = flipBytes(u.word); 87 return u.original; 88 } 89 if (sizeof(value) == 8) { 90 union { 91 T original; 92 uint64_t word; 93 } u; 94 u.original = value; 95 u.word = flipBytes(u.word); 96 return u.original; 97 } 98 RELEASE_ASSERT_NOT_REACHED(); 99 return T(); 100} 101 102template<typename T> 103inline T flipBytesIfLittleEndian(T value, bool littleEndian) 104{ 105 if (needToFlipBytesIfLittleEndian(littleEndian)) 106 return flipBytes(value); 107 return value; 108} 109 110} // namespace WTF 111 112using WTF::needToFlipBytesIfLittleEndian; 113using WTF::flipBytes; 114using WTF::flipBytesIfLittleEndian; 115 116#endif // FlipBytes_h 117 118