annotate include/llvm/Support/Endian.h @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- Endian.h - Utilities for IO with endian specific data ----*- C++ -*-===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // This file declares generic functions to read and write endian specific data.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #ifndef LLVM_SUPPORT_ENDIAN_H
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #define LLVM_SUPPORT_ENDIAN_H
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
16 #include "llvm/Support/AlignOf.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
17 #include "llvm/Support/Compiler.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/Support/Host.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/Support/SwapByteOrder.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include <cstddef>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
22 #include <cstdint>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 #include <cstring>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
24 #include <type_traits>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 namespace llvm {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 namespace support {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
28
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 enum endianness {big, little, native};
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 // These are named values for common alignments.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 enum {aligned = 0, unaligned = 1};
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 namespace detail {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
35
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
36 /// ::value is either alignment, or alignof(T) if alignment is 0.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 template<class T, int alignment>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 struct PickAlignment {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 enum { value = alignment == 0 ? alignof(T) : alignment };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 } // end namespace detail
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 namespace endian {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
45
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
46 constexpr endianness system_endianness() {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
47 return sys::IsBigEndianHost ? big : little;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
48 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
49
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
50 template <typename value_type>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
51 inline value_type byte_swap(value_type value, endianness endian) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
52 if ((endian != native) && (endian != system_endianness()))
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 sys::swapByteOrder(value);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 return value;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
57 /// Swap the bytes of value to match the given endianness.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 template<typename value_type, endianness endian>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
59 inline value_type byte_swap(value_type value) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
60 return byte_swap(value, endian);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
61 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
62
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 /// Read a value of a particular endianness from memory.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
64 template <typename value_type, std::size_t alignment>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
65 inline value_type read(const void *memory, endianness endian) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66 value_type ret;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 memcpy(&ret,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 LLVM_ASSUME_ALIGNED(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 memory, (detail::PickAlignment<value_type, alignment>::value)),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 sizeof(value_type));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 return byte_swap<value_type>(ret, endian);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
73 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 template<typename value_type,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 endianness endian,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 std::size_t alignment>
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 inline value_type read(const void *memory) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 return read<value_type, alignment>(memory, endian);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82 /// Read a value of a particular endianness from a buffer, and increment the
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
83 /// buffer past that value.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
84 template <typename value_type, std::size_t alignment, typename CharT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
85 inline value_type readNext(const CharT *&memory, endianness endian) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
86 value_type ret = read<value_type, alignment>(memory, endian);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
87 memory += sizeof(value_type);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88 return ret;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
89 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
90
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
91 template<typename value_type, endianness endian, std::size_t alignment,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
92 typename CharT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
93 inline value_type readNext(const CharT *&memory) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
94 return readNext<value_type, alignment, CharT>(memory, endian);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
95 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
96
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 /// Write a value to memory with a particular endianness.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
98 template <typename value_type, std::size_t alignment>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 inline void write(void *memory, value_type value, endianness endian) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
100 value = byte_swap<value_type>(value, endian);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
101 memcpy(LLVM_ASSUME_ALIGNED(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
102 memory, (detail::PickAlignment<value_type, alignment>::value)),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
103 &value, sizeof(value_type));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 template<typename value_type,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 endianness endian,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 std::size_t alignment>
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 inline void write(void *memory, value_type value) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
110 write<value_type, alignment>(memory, value, endian);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
112
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
113 template <typename value_type>
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
114 using make_unsigned_t = typename std::make_unsigned<value_type>::type;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
115
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
116 /// Read a value of a particular endianness from memory, for a location
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
117 /// that starts at the given bit offset within the first byte.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
118 template <typename value_type, endianness endian, std::size_t alignment>
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
119 inline value_type readAtBitAlignment(const void *memory, uint64_t startBit) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
120 assert(startBit < 8);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
121 if (startBit == 0)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
122 return read<value_type, endian, alignment>(memory);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
123 else {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
124 // Read two values and compose the result from them.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
125 value_type val[2];
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
126 memcpy(&val[0],
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
127 LLVM_ASSUME_ALIGNED(
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
128 memory, (detail::PickAlignment<value_type, alignment>::value)),
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
129 sizeof(value_type) * 2);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
130 val[0] = byte_swap<value_type, endian>(val[0]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
131 val[1] = byte_swap<value_type, endian>(val[1]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
132
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
133 // Shift bits from the lower value into place.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
134 make_unsigned_t<value_type> lowerVal = val[0] >> startBit;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
135 // Mask off upper bits after right shift in case of signed type.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
136 make_unsigned_t<value_type> numBitsFirstVal =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
137 (sizeof(value_type) * 8) - startBit;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
138 lowerVal &= ((make_unsigned_t<value_type>)1 << numBitsFirstVal) - 1;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
139
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
140 // Get the bits from the upper value.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
141 make_unsigned_t<value_type> upperVal =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
142 val[1] & (((make_unsigned_t<value_type>)1 << startBit) - 1);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
143 // Shift them in to place.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
144 upperVal <<= numBitsFirstVal;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
145
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
146 return lowerVal | upperVal;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
147 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
148 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
149
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
150 /// Write a value to memory with a particular endianness, for a location
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
151 /// that starts at the given bit offset within the first byte.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
152 template <typename value_type, endianness endian, std::size_t alignment>
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
153 inline void writeAtBitAlignment(void *memory, value_type value,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
154 uint64_t startBit) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
155 assert(startBit < 8);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
156 if (startBit == 0)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
157 write<value_type, endian, alignment>(memory, value);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
158 else {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
159 // Read two values and shift the result into them.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
160 value_type val[2];
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
161 memcpy(&val[0],
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
162 LLVM_ASSUME_ALIGNED(
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
163 memory, (detail::PickAlignment<value_type, alignment>::value)),
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
164 sizeof(value_type) * 2);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
165 val[0] = byte_swap<value_type, endian>(val[0]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
166 val[1] = byte_swap<value_type, endian>(val[1]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
167
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
168 // Mask off any existing bits in the upper part of the lower value that
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
169 // we want to replace.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
170 val[0] &= ((make_unsigned_t<value_type>)1 << startBit) - 1;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
171 make_unsigned_t<value_type> numBitsFirstVal =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
172 (sizeof(value_type) * 8) - startBit;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
173 make_unsigned_t<value_type> lowerVal = value;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
174 if (startBit > 0) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
175 // Mask off the upper bits in the new value that are not going to go into
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
176 // the lower value. This avoids a left shift of a negative value, which
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
177 // is undefined behavior.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
178 lowerVal &= (((make_unsigned_t<value_type>)1 << numBitsFirstVal) - 1);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
179 // Now shift the new bits into place
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
180 lowerVal <<= startBit;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
181 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
182 val[0] |= lowerVal;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
183
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
184 // Mask off any existing bits in the lower part of the upper value that
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
185 // we want to replace.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
186 val[1] &= ~(((make_unsigned_t<value_type>)1 << startBit) - 1);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
187 // Next shift the bits that go into the upper value into position.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
188 make_unsigned_t<value_type> upperVal = value >> numBitsFirstVal;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
189 // Mask off upper bits after right shift in case of signed type.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
190 upperVal &= ((make_unsigned_t<value_type>)1 << startBit) - 1;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
191 val[1] |= upperVal;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
192
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
193 // Finally, rewrite values.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
194 val[0] = byte_swap<value_type, endian>(val[0]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
195 val[1] = byte_swap<value_type, endian>(val[1]);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
196 memcpy(LLVM_ASSUME_ALIGNED(
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
197 memory, (detail::PickAlignment<value_type, alignment>::value)),
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
198 &val[0], sizeof(value_type) * 2);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
199 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
200 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
201
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 } // end namespace endian
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 namespace detail {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
205
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
206 template <typename ValueType, endianness Endian, std::size_t Alignment,
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
207 std::size_t ALIGN = PickAlignment<ValueType, Alignment>::value>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 struct packed_endian_specific_integral {
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
209 using value_type = ValueType;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
210 static constexpr endianness endian = Endian;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
211 static constexpr std::size_t alignment = Alignment;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
212
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
213 packed_endian_specific_integral() = default;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
214
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
215 explicit packed_endian_specific_integral(value_type val) { *this = val; }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
216
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 operator value_type() const {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 return endian::read<value_type, endian, alignment>(
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 (const void*)Value.buffer);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 void operator=(value_type newValue) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 endian::write<value_type, endian, alignment>(
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 (void*)Value.buffer, newValue);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
227 packed_endian_specific_integral &operator+=(value_type newValue) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
228 *this = *this + newValue;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
229 return *this;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
230 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
231
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
232 packed_endian_specific_integral &operator-=(value_type newValue) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
233 *this = *this - newValue;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
234 return *this;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
235 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
236
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
237 packed_endian_specific_integral &operator|=(value_type newValue) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
238 *this = *this | newValue;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
239 return *this;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
240 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
241
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
242 packed_endian_specific_integral &operator&=(value_type newValue) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
243 *this = *this & newValue;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
244 return *this;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
245 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
246
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 private:
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
248 struct {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
249 alignas(ALIGN) char buffer[sizeof(value_type)];
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
250 } Value;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
251
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
252 public:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
253 struct ref {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
254 explicit ref(void *Ptr) : Ptr(Ptr) {}
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
255
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256 operator value_type() const {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
257 return endian::read<value_type, endian, alignment>(Ptr);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
258 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
259
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
260 void operator=(value_type NewValue) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
261 endian::write<value_type, endian, alignment>(Ptr, NewValue);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
262 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
263
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
264 private:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
265 void *Ptr;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
266 };
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 };
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
268
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 } // end namespace detail
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
271 using ulittle16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
272 detail::packed_endian_specific_integral<uint16_t, little, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
273 using ulittle32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
274 detail::packed_endian_specific_integral<uint32_t, little, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
275 using ulittle64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
276 detail::packed_endian_specific_integral<uint64_t, little, unaligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
278 using little16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
279 detail::packed_endian_specific_integral<int16_t, little, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
280 using little32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
281 detail::packed_endian_specific_integral<int32_t, little, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
282 using little64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
283 detail::packed_endian_specific_integral<int64_t, little, unaligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
285 using aligned_ulittle16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
286 detail::packed_endian_specific_integral<uint16_t, little, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
287 using aligned_ulittle32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
288 detail::packed_endian_specific_integral<uint32_t, little, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
289 using aligned_ulittle64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
290 detail::packed_endian_specific_integral<uint64_t, little, aligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
292 using aligned_little16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
293 detail::packed_endian_specific_integral<int16_t, little, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
294 using aligned_little32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
295 detail::packed_endian_specific_integral<int32_t, little, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
296 using aligned_little64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
297 detail::packed_endian_specific_integral<int64_t, little, aligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
299 using ubig16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
300 detail::packed_endian_specific_integral<uint16_t, big, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
301 using ubig32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
302 detail::packed_endian_specific_integral<uint32_t, big, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
303 using ubig64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
304 detail::packed_endian_specific_integral<uint64_t, big, unaligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
306 using big16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
307 detail::packed_endian_specific_integral<int16_t, big, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
308 using big32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
309 detail::packed_endian_specific_integral<int32_t, big, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
310 using big64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
311 detail::packed_endian_specific_integral<int64_t, big, unaligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
313 using aligned_ubig16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
314 detail::packed_endian_specific_integral<uint16_t, big, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
315 using aligned_ubig32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
316 detail::packed_endian_specific_integral<uint32_t, big, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
317 using aligned_ubig64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
318 detail::packed_endian_specific_integral<uint64_t, big, aligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
320 using aligned_big16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
321 detail::packed_endian_specific_integral<int16_t, big, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
322 using aligned_big32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
323 detail::packed_endian_specific_integral<int32_t, big, aligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
324 using aligned_big64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
325 detail::packed_endian_specific_integral<int64_t, big, aligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
327 using unaligned_uint16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
328 detail::packed_endian_specific_integral<uint16_t, native, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
329 using unaligned_uint32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
330 detail::packed_endian_specific_integral<uint32_t, native, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
331 using unaligned_uint64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
332 detail::packed_endian_specific_integral<uint64_t, native, unaligned>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
333
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
334 using unaligned_int16_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
335 detail::packed_endian_specific_integral<int16_t, native, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
336 using unaligned_int32_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
337 detail::packed_endian_specific_integral<int32_t, native, unaligned>;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338 using unaligned_int64_t =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 detail::packed_endian_specific_integral<int64_t, native, unaligned>;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
340
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
341 template <typename T>
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
342 using little_t = detail::packed_endian_specific_integral<T, little, unaligned>;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
343 template <typename T>
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
344 using big_t = detail::packed_endian_specific_integral<T, big, unaligned>;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
345
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
346 template <typename T>
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
347 using aligned_little_t =
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
348 detail::packed_endian_specific_integral<T, little, aligned>;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
349 template <typename T>
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
350 using aligned_big_t = detail::packed_endian_specific_integral<T, big, aligned>;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
351
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
352 namespace endian {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
353
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
354 template <typename T> inline T read(const void *P, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
355 return read<T, unaligned>(P, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
356 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
357
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
358 template <typename T, endianness E> inline T read(const void *P) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
359 return *(const detail::packed_endian_specific_integral<T, E, unaligned> *)P;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
360 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
361
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
362 inline uint16_t read16(const void *P, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
363 return read<uint16_t>(P, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
364 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
365 inline uint32_t read32(const void *P, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
366 return read<uint32_t>(P, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
367 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
368 inline uint64_t read64(const void *P, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
369 return read<uint64_t>(P, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
370 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
371
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
372 template <endianness E> inline uint16_t read16(const void *P) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
373 return read<uint16_t, E>(P);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
374 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
375 template <endianness E> inline uint32_t read32(const void *P) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
376 return read<uint32_t, E>(P);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
377 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
378 template <endianness E> inline uint64_t read64(const void *P) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
379 return read<uint64_t, E>(P);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
380 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
381
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
382 inline uint16_t read16le(const void *P) { return read16<little>(P); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
383 inline uint32_t read32le(const void *P) { return read32<little>(P); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
384 inline uint64_t read64le(const void *P) { return read64<little>(P); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
385 inline uint16_t read16be(const void *P) { return read16<big>(P); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
386 inline uint32_t read32be(const void *P) { return read32<big>(P); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
387 inline uint64_t read64be(const void *P) { return read64<big>(P); }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
388
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
389 template <typename T> inline void write(void *P, T V, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
390 write<T, unaligned>(P, V, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
391 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
392
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
393 template <typename T, endianness E> inline void write(void *P, T V) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
394 *(detail::packed_endian_specific_integral<T, E, unaligned> *)P = V;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
395 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
396
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
397 inline void write16(void *P, uint16_t V, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
398 write<uint16_t>(P, V, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
399 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
400 inline void write32(void *P, uint32_t V, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
401 write<uint32_t>(P, V, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
402 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
403 inline void write64(void *P, uint64_t V, endianness E) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
404 write<uint64_t>(P, V, E);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
405 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
406
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
407 template <endianness E> inline void write16(void *P, uint16_t V) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
408 write<uint16_t, E>(P, V);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
409 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
410 template <endianness E> inline void write32(void *P, uint32_t V) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
411 write<uint32_t, E>(P, V);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
412 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
413 template <endianness E> inline void write64(void *P, uint64_t V) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
414 write<uint64_t, E>(P, V);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
415 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
416
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
417 inline void write16le(void *P, uint16_t V) { write16<little>(P, V); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
418 inline void write32le(void *P, uint32_t V) { write32<little>(P, V); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
419 inline void write64le(void *P, uint64_t V) { write64<little>(P, V); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
420 inline void write16be(void *P, uint16_t V) { write16<big>(P, V); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
421 inline void write32be(void *P, uint32_t V) { write32<big>(P, V); }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
422 inline void write64be(void *P, uint64_t V) { write64<big>(P, V); }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
423
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
424 } // end namespace endian
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
425
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
426 } // end namespace support
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 } // end namespace llvm
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
429 #endif // LLVM_SUPPORT_ENDIAN_H