1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __LESWAPS_H 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __LESWAPS_H 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LETypes.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \file 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \brief C++ API: Endian independent access to data for LayoutEngine 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A convenience macro which invokes the swapWord member function 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * from a concise call. 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.8 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 2527f654740f2a26ad62a5c155af9199af9e69b889claireho#define SWAPW(value) LESwaps::swapWord((le_uint16)(value)) 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A convenience macro which invokes the swapLong member function 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * from a concise call. 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.8 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 3327f654740f2a26ad62a5c155af9199af9e69b889claireho#define SWAPL(value) LESwaps::swapLong((le_uint32)(value)) 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This class is used to access data which stored in big endian order 3785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * regardless of the conventions of the platform. 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * All methods are static and inline in an attempt to induce the compiler 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to do most of the calculations at compile time. 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.8 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ { 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Reads a big-endian 16-bit word and returns a native-endian value. 49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * No-op on a big-endian platform, byte-swaps on a little-endian platform. 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value - the word to be byte swapped 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the byte swapped word 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.8 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 5727f654740f2a26ad62a5c155af9199af9e69b889claireho static le_uint16 swapWord(le_uint16 value) 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if (defined(U_IS_BIG_ENDIAN) && U_IS_BIG_ENDIAN) || \ 60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \ 61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho defined(__BIG_ENDIAN__) 62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Fastpath when we know that the platform is big-endian. 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return value; 64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reads a big-endian value on any platform. 66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const le_uint8 *p = reinterpret_cast<const le_uint8 *>(&value); 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (le_uint16)((p[0] << 8) | p[1]); 68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /** 72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Reads a big-endian 32-bit word and returns a native-endian value. 73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * No-op on a big-endian platform, byte-swaps on a little-endian platform. 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value - the long to be byte swapped 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the byte swapped long 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @stable ICU 2.8 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 8127f654740f2a26ad62a5c155af9199af9e69b889claireho static le_uint32 swapLong(le_uint32 value) 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if (defined(U_IS_BIG_ENDIAN) && U_IS_BIG_ENDIAN) || \ 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \ 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho defined(__BIG_ENDIAN__) 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Fastpath when we know that the platform is big-endian. 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return value; 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Reads a big-endian value on any platform. 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const le_uint8 *p = reinterpret_cast<const le_uint8 *>(&value); 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (le_uint32)((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate: 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LESwaps() {} // private - forbid instantiation 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 101