aboutsummaryrefslogtreecommitdiff
path: root/Src/libvp6/include/endian.hpp
blob: cb26e7ad21fe06970c850607e011938d56cd4da7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#if !defined(ENDIAN_HPP)
#define ENDIAN_HPP
//______________________________________________________________________________
//
//  endian.hpp
//  Facilitate endian conversions.

//namespace xxx
//{

    //--------------------------------------
    inline
    bool big_endian()
    {
        long lTest = 1;

        return (reinterpret_cast<char*>(&lTest)[0] == 0);
    }

    //--------------------------------------
    inline
    short swap_endian(short i16)
    {
        return i16 << 8 & 0xff00
            | i16 >> 8 & 0x00ff;
    }

    //--------------------------------------
    inline
    unsigned short swap_endian(unsigned short ui16)
    {
        return ui16 << 8 & 0xff00
            | ui16 >> 8 & 0x00ff;
    }

    //--------------------------------------
    inline
    unsigned int swap_endian(unsigned int i32)
    {
        return i32 << 24 & 0xff000000
            | i32 << 8 & 0x00ff0000
            | i32 >> 8 & 0x0000ff00
            | i32 >> 24 & 0x000000ff;
    }

    //--------------------------------------
    inline
    int swap_endian(int ui32)
    {
        return ui32 << 24 & 0xff000000
            | ui32 << 8 & 0x00ff0000
            | ui32 >> 8 & 0x0000ff00
            | ui32 >> 24 & 0x000000ff;
    }

    //--------------------------------------
    inline
    short big_endian(short i16Native)
    {
        if (big_endian())
        {
            return i16Native;
        }

        return swap_endian(i16Native);
    }

    //--------------------------------------
    inline
    unsigned short big_endian(unsigned short ui16Native)
    {
        if (big_endian())
        {
            return ui16Native;
        }

        return swap_endian(ui16Native);
    }

    //--------------------------------------
    inline
    unsigned int big_endian(unsigned int i32Native)
    {
        if (big_endian())
        {
            return i32Native;
        }

        return swap_endian(i32Native);
    }

    //--------------------------------------
    inline
    int big_endian(int ui32Native)
    {
        if (big_endian())
        {
            return ui32Native;
        }

        return swap_endian(ui32Native);
    }

    //--------------------------------------
    inline
    short little_endian(short i16Native)
    {
        if (!big_endian())
        {
            return i16Native;
        }

        return swap_endian(i16Native);
    }

    //--------------------------------------
    inline
    unsigned short little_endian(unsigned short ui16Native)
    {
        if (!big_endian())
        {
            return ui16Native;
        }

        return swap_endian(ui16Native);
    }

    //--------------------------------------
    inline
    unsigned int little_endian(unsigned int i32Native)
    {
        if (!big_endian())
        {
            return i32Native;
        }

        return swap_endian(i32Native);
    }

    //--------------------------------------
    inline
    int little_endian(int ui32Native)
    {
        if (!big_endian())
        {
            return ui32Native;
        }

        return swap_endian(ui32Native);
    }

    //--------------------------------------
    inline
    short native_endian(short i16, bool bBigEndian)
    {
        if (big_endian() != bBigEndian)
        {
            return swap_endian(i16);
        }

        return i16;
    }

    //--------------------------------------
    inline
    unsigned short native_endian(unsigned short ui16, bool bBigEndian)
    {
        if (big_endian() != bBigEndian)
        {
            return swap_endian(ui16);
        }

        return ui16;
    }

    //--------------------------------------
    inline
    unsigned int native_endian(unsigned int i32, bool bBigEndian)
    {
        if (big_endian() != bBigEndian)
        {
            return swap_endian(i32);
        }

        return i32;
    }

    //--------------------------------------
    inline
    int native_endian(int ui32, bool bBigEndian)
    {
        if (big_endian() != bBigEndian)
        {
            return swap_endian(ui32);
        }

        return ui32;
    }

//}  //  namespace xxx

#endif  //  ENDIAN_HPP