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