cc: Fix more size_t -> int truncations.
[chromium-blink-merge.git] / base / sys_byteorder.h
blob704ed568b09e4483fb613ac8923636f6ac084b0d
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This header defines cross-platform ByteSwap() implementations for 16, 32 and
6 // 64-bit values, and NetToHostXX() / HostToNextXX() functions equivalent to
7 // the traditional ntohX() and htonX() functions.
8 // Use the functions defined here rather than using the platform-specific
9 // functions directly.
11 #ifndef BASE_SYS_BYTEORDER_H_
12 #define BASE_SYS_BYTEORDER_H_
14 #include "base/basictypes.h"
15 #include "build/build_config.h"
17 #if defined(OS_WIN)
18 #include <winsock2.h>
19 #else
20 #include <arpa/inet.h>
21 #endif
23 namespace base {
25 // Returns a value with all bytes in |x| swapped, i.e. reverses the endianness.
26 inline uint16 ByteSwap(uint16 x) {
27 return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
30 inline uint32 ByteSwap(uint32 x) {
31 return ((x & 0x000000fful) << 24) | ((x & 0x0000ff00ul) << 8) |
32 ((x & 0x00ff0000ul) >> 8) | ((x & 0xff000000ul) >> 24);
35 inline uint64 ByteSwap(uint64 x) {
36 return ((x & 0x00000000000000ffull) << 56) |
37 ((x & 0x000000000000ff00ull) << 40) |
38 ((x & 0x0000000000ff0000ull) << 24) |
39 ((x & 0x00000000ff000000ull) << 8) |
40 ((x & 0x000000ff00000000ull) >> 8) |
41 ((x & 0x0000ff0000000000ull) >> 24) |
42 ((x & 0x00ff000000000000ull) >> 40) |
43 ((x & 0xff00000000000000ull) >> 56);
46 // Converts the bytes in |x| from host order (endianness) to little endian, and
47 // returns the result.
48 inline uint16 ByteSwapToLE16(uint16 x) {
49 #if defined(ARCH_CPU_LITTLE_ENDIAN)
50 return x;
51 #else
52 return ByteSwap(x);
53 #endif
55 inline uint32 ByteSwapToLE32(uint32 x) {
56 #if defined(ARCH_CPU_LITTLE_ENDIAN)
57 return x;
58 #else
59 return ByteSwap(x);
60 #endif
62 inline uint64 ByteSwapToLE64(uint64 x) {
63 #if defined(ARCH_CPU_LITTLE_ENDIAN)
64 return x;
65 #else
66 return ByteSwap(x);
67 #endif
70 // Converts the bytes in |x| from network to host order (endianness), and
71 // returns the result.
72 inline uint16 NetToHost16(uint16 x) {
73 #if defined(ARCH_CPU_LITTLE_ENDIAN)
74 return ByteSwap(x);
75 #else
76 return x;
77 #endif
79 inline uint32 NetToHost32(uint32 x) {
80 #if defined(ARCH_CPU_LITTLE_ENDIAN)
81 return ByteSwap(x);
82 #else
83 return x;
84 #endif
86 inline uint64 NetToHost64(uint64 x) {
87 #if defined(ARCH_CPU_LITTLE_ENDIAN)
88 return ByteSwap(x);
89 #else
90 return x;
91 #endif
94 // Converts the bytes in |x| from host to network order (endianness), and
95 // returns the result.
96 inline uint16 HostToNet16(uint16 x) {
97 #if defined(ARCH_CPU_LITTLE_ENDIAN)
98 return ByteSwap(x);
99 #else
100 return x;
101 #endif
103 inline uint32 HostToNet32(uint32 x) {
104 #if defined(ARCH_CPU_LITTLE_ENDIAN)
105 return ByteSwap(x);
106 #else
107 return x;
108 #endif
110 inline uint64 HostToNet64(uint64 x) {
111 #if defined(ARCH_CPU_LITTLE_ENDIAN)
112 return ByteSwap(x);
113 #else
114 return x;
115 #endif
118 } // namespace base
120 #endif // BASE_SYS_BYTEORDER_H_