doxygen: add newline after \file
[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
26  * \ingroup bli
27  */
28
29 /* note: using a temp char to switch endian is a lot slower,
30  * use bit shifting instead. */
31
32 /* *** 16 *** */
33 BLI_INLINE void BLI_endian_switch_int16(short *val)
34 {
35         BLI_endian_switch_uint16((unsigned short *)val);
36 }
37 BLI_INLINE void BLI_endian_switch_uint16(unsigned short *val)
38 {
39 #if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 408))  /* gcc4.8+ only */
40         *val = __builtin_bswap16(*val);
41 #else
42         unsigned short tval = *val;
43         *val = (tval >> 8) |
44                (tval << 8);
45 #endif
46 }
47
48
49 /* *** 32 *** */
50 BLI_INLINE void BLI_endian_switch_int32(int *val)
51 {
52         BLI_endian_switch_uint32((unsigned int *)val);
53 }
54 BLI_INLINE void BLI_endian_switch_uint32(unsigned int *val)
55 {
56 #ifdef __GNUC__
57         *val = __builtin_bswap32(*val);
58 #else
59         unsigned int tval = *val;
60         *val = ((tval >> 24))             |
61                ((tval << 8) & 0x00ff0000) |
62                ((tval >> 8) & 0x0000ff00) |
63                ((tval << 24));
64 #endif
65 }
66 BLI_INLINE void BLI_endian_switch_float(float *val)
67 {
68         BLI_endian_switch_uint32((unsigned int *)val);
69 }
70
71
72 /* *** 64 *** */
73 BLI_INLINE void BLI_endian_switch_int64(int64_t *val)
74 {
75         BLI_endian_switch_uint64((uint64_t *)val);
76 }
77 BLI_INLINE void BLI_endian_switch_uint64(uint64_t *val)
78 {
79 #ifdef __GNUC__
80         *val = __builtin_bswap64(*val);
81 #else
82         uint64_t tval = *val;
83         *val = ((tval >> 56)) |
84                ((tval << 40) & 0x00ff000000000000ll) |
85                ((tval << 24) & 0x0000ff0000000000ll) |
86                ((tval <<  8) & 0x000000ff00000000ll) |
87                ((tval >>  8) & 0x00000000ff000000ll) |
88                ((tval >> 24) & 0x0000000000ff0000ll) |
89                ((tval >> 40) & 0x000000000000ff00ll) |
90                ((tval << 56));
91 #endif
92 }
93 BLI_INLINE void BLI_endian_switch_double(double *val)
94 {
95         BLI_endian_switch_uint64((uint64_t *)val);
96 }
97
98 #endif  /* __BLI_ENDIAN_SWITCH_INLINE_H__ */