Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / blenlib / BLI_endian_switch_inline.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __BLI_ENDIAN_SWITCH_INLINE_H__
18 #define __BLI_ENDIAN_SWITCH_INLINE_H__
19
20 /* only include from header */
21 #ifndef __BLI_ENDIAN_SWITCH_H__
22 #  error "this file isnt to be directly included"
23 #endif
24
25 /** \file \ingroup bli
26  */
27
28 /* note: using a temp char to switch endian is a lot slower,
29  * use bit shifting instead. */
30
31 /* *** 16 *** */
32 BLI_INLINE void BLI_endian_switch_int16(short *val)
33 {
34         BLI_endian_switch_uint16((unsigned short *)val);
35 }
36 BLI_INLINE void BLI_endian_switch_uint16(unsigned short *val)
37 {
38 #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 408))  /* gcc4.8+ only */
39         *val = __builtin_bswap16(*val);
40 #else
41         unsigned short tval = *val;
42         *val = (tval >> 8) |
43                (tval << 8);
44 #endif
45 }
46
47
48 /* *** 32 *** */
49 BLI_INLINE void BLI_endian_switch_int32(int *val)
50 {
51         BLI_endian_switch_uint32((unsigned int *)val);
52 }
53 BLI_INLINE void BLI_endian_switch_uint32(unsigned int *val)
54 {
55 #ifdef __GNUC__
56         *val = __builtin_bswap32(*val);
57 #else
58         unsigned int tval = *val;
59         *val = ((tval >> 24))             |
60                ((tval << 8) & 0x00ff0000) |
61                ((tval >> 8) & 0x0000ff00) |
62                ((tval << 24));
63 #endif
64 }
65 BLI_INLINE void BLI_endian_switch_float(float *val)
66 {
67         BLI_endian_switch_uint32((unsigned int *)val);
68 }
69
70
71 /* *** 64 *** */
72 BLI_INLINE void BLI_endian_switch_int64(int64_t *val)
73 {
74         BLI_endian_switch_uint64((uint64_t *)val);
75 }
76 BLI_INLINE void BLI_endian_switch_uint64(uint64_t *val)
77 {
78 #ifdef __GNUC__
79         *val = __builtin_bswap64(*val);
80 #else
81         uint64_t tval = *val;
82         *val = ((tval >> 56)) |
83                ((tval << 40) & 0x00ff000000000000ll) |
84                ((tval << 24) & 0x0000ff0000000000ll) |
85                ((tval <<  8) & 0x000000ff00000000ll) |
86                ((tval >>  8) & 0x00000000ff000000ll) |
87                ((tval >> 24) & 0x0000000000ff0000ll) |
88                ((tval >> 40) & 0x000000000000ff00ll) |
89                ((tval << 56));
90 #endif
91 }
92 BLI_INLINE void BLI_endian_switch_double(double *val)
93 {
94         BLI_endian_switch_uint64((uint64_t *)val);
95 }
96
97 #endif  /* __BLI_ENDIAN_SWITCH_INLINE_H__ */