Library of Assembled Shared Sources
endianness.inl
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43
44
45#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_ENDIANNESS_INL
46#define LASS_GUARDIAN_OF_INCLUSION_NUM_ENDIANNESS_INL
47
48namespace lass
49{
50namespace num
51{
52
53// --- implementation ------------------------------------------------------------------------------
54
55namespace impl
56{
57
58template <size_t numOfBytes>
59struct Revertor
60{
61
62 static void revert(void* ioIn)
63 {
64 std::reverse(static_cast<Tuint8*>(ioIn), static_cast<Tuint8*>(ioIn) + numOfBytes);
65 }
66};
67
68template <>
69struct Revertor<0>
70{
71 static void revert(void* /*ioIn*/)
72 {
73 }
74};
75
76template <>
77struct Revertor<1>
78{
79 static void revert(void* /* ioIn */)
80 {
81 }
82};
83
84template <>
85struct Revertor<2>
86{
87 static void revert(void* ioIn)
88 {
89 Tuint16& temp = *static_cast<Tuint16*>(ioIn);
90 temp = static_cast<Tuint16>(((temp & 0x00ff) << 8) | (temp >> 8));
91 }
92};
93
94template <>
95struct Revertor<4>
96{
97 static void revert(void* ioIn)
98 {
99 Tuint32& temp = *static_cast<Tuint32*>(ioIn);
100 temp = ((temp & 0x000000ff) << 24) | ((temp & 0x0000ff00) << 8) |
101 ((temp & 0x00ff0000) >> 8) | (temp >> 24);
102 }
103};
104
105
106
107template <size_t numOfBytes, Endianness outEndian, Endianness inEndian>
108struct EndianCaster
109{
110 inline static void cast(void* ioIn)
111 {
112 Revertor<numOfBytes>::revert(ioIn);
113 }
114};
115
116template <size_t numOfBytes, Endianness endian>
117struct EndianCaster<numOfBytes, endian, endian>
118{
119 inline static void cast(void* /*ioIn*/)
120 {
121 }
122};
123
124}
125
126// --- free ----------------------------------------------------------------------------------------
127
128template <Endianness outEndian, Endianness inEndian, typename T>
129inline T endianCast(T iIn)
130{
131 impl::EndianCaster<sizeof(T), outEndian, inEndian>::cast(reinterpret_cast<void*>(&iIn));
132 return iIn;
133}
134
135template <typename T>
136inline T fixEndianness(T iIn, Endianness iEndianness)
137{
138 return iEndianness == systemEndian ? iIn : endianCast<bigEndian, littleEndian>(iIn);
139}
140
141}
142
143}
144
145#endif
146
147// EOF
numeric types and traits.
Definition basic_ops.h:70
Library for Assembled Shared Sources.
Definition config.h:53