xref: /aosp_15_r20/art/libartbase/base/endian_utils.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright 2020 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBARTBASE_BASE_ENDIAN_UTILS_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_ENDIAN_UTILS_H_
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker #include <stdint.h>
21*795d594fSAndroid Build Coastguard Worker #include <endian.h>
22*795d594fSAndroid Build Coastguard Worker #include <vector>
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker namespace art {
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker template<typename T>
AppendBytes(std::vector<uint8_t> & bytes,T data)27*795d594fSAndroid Build Coastguard Worker inline void AppendBytes(std::vector<uint8_t>& bytes, T data) {
28*795d594fSAndroid Build Coastguard Worker   size_t size = bytes.size();
29*795d594fSAndroid Build Coastguard Worker   bytes.resize(size + sizeof(T));
30*795d594fSAndroid Build Coastguard Worker   memcpy(bytes.data() + size, &data, sizeof(T));
31*795d594fSAndroid Build Coastguard Worker }
32*795d594fSAndroid Build Coastguard Worker 
Append1BE(std::vector<uint8_t> & bytes,uint8_t value)33*795d594fSAndroid Build Coastguard Worker inline void Append1BE(std::vector<uint8_t>& bytes, uint8_t value) {
34*795d594fSAndroid Build Coastguard Worker   bytes.push_back(value);
35*795d594fSAndroid Build Coastguard Worker }
36*795d594fSAndroid Build Coastguard Worker 
Append2BE(std::vector<uint8_t> & bytes,uint16_t value)37*795d594fSAndroid Build Coastguard Worker inline void Append2BE(std::vector<uint8_t>& bytes, uint16_t value) {
38*795d594fSAndroid Build Coastguard Worker   AppendBytes<uint16_t>(bytes, htobe16(value));
39*795d594fSAndroid Build Coastguard Worker }
40*795d594fSAndroid Build Coastguard Worker 
Append4BE(std::vector<uint8_t> & bytes,uint32_t value)41*795d594fSAndroid Build Coastguard Worker inline void Append4BE(std::vector<uint8_t>& bytes, uint32_t value) {
42*795d594fSAndroid Build Coastguard Worker   AppendBytes<uint32_t>(bytes, htobe32(value));
43*795d594fSAndroid Build Coastguard Worker }
44*795d594fSAndroid Build Coastguard Worker 
Append8BE(std::vector<uint8_t> & bytes,uint64_t value)45*795d594fSAndroid Build Coastguard Worker inline void Append8BE(std::vector<uint8_t>& bytes, uint64_t value) {
46*795d594fSAndroid Build Coastguard Worker   AppendBytes<uint64_t>(bytes, htobe64(value));
47*795d594fSAndroid Build Coastguard Worker }
48*795d594fSAndroid Build Coastguard Worker 
AppendUtf16BE(std::vector<uint8_t> & bytes,const uint16_t * chars,size_t char_count)49*795d594fSAndroid Build Coastguard Worker inline void AppendUtf16BE(std::vector<uint8_t>& bytes, const uint16_t* chars, size_t char_count) {
50*795d594fSAndroid Build Coastguard Worker   Append4BE(bytes, char_count);
51*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < char_count; ++i) {
52*795d594fSAndroid Build Coastguard Worker     Append2BE(bytes, chars[i]);
53*795d594fSAndroid Build Coastguard Worker   }
54*795d594fSAndroid Build Coastguard Worker }
55*795d594fSAndroid Build Coastguard Worker 
AppendUtf16CompressedBE(std::vector<uint8_t> & bytes,const uint8_t * chars,size_t char_count)56*795d594fSAndroid Build Coastguard Worker inline void AppendUtf16CompressedBE(std::vector<uint8_t>& bytes,
57*795d594fSAndroid Build Coastguard Worker                                     const uint8_t* chars,
58*795d594fSAndroid Build Coastguard Worker                                     size_t char_count) {
59*795d594fSAndroid Build Coastguard Worker   Append4BE(bytes, char_count);
60*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < char_count; ++i) {
61*795d594fSAndroid Build Coastguard Worker     Append2BE(bytes, static_cast<uint16_t>(chars[i]));
62*795d594fSAndroid Build Coastguard Worker   }
63*795d594fSAndroid Build Coastguard Worker }
64*795d594fSAndroid Build Coastguard Worker 
65*795d594fSAndroid Build Coastguard Worker template <typename T>
SetBytes(uint8_t * buf,T val)66*795d594fSAndroid Build Coastguard Worker inline void SetBytes(uint8_t* buf, T val) {
67*795d594fSAndroid Build Coastguard Worker   memcpy(buf, &val, sizeof(T));
68*795d594fSAndroid Build Coastguard Worker }
69*795d594fSAndroid Build Coastguard Worker 
Set1(uint8_t * buf,uint8_t val)70*795d594fSAndroid Build Coastguard Worker inline void Set1(uint8_t* buf, uint8_t val) {
71*795d594fSAndroid Build Coastguard Worker   *buf = val;
72*795d594fSAndroid Build Coastguard Worker }
73*795d594fSAndroid Build Coastguard Worker 
Set2BE(uint8_t * buf,uint16_t val)74*795d594fSAndroid Build Coastguard Worker inline void Set2BE(uint8_t* buf, uint16_t val) {
75*795d594fSAndroid Build Coastguard Worker   SetBytes<uint16_t>(buf, htobe16(val));
76*795d594fSAndroid Build Coastguard Worker }
77*795d594fSAndroid Build Coastguard Worker 
Set4BE(uint8_t * buf,uint32_t val)78*795d594fSAndroid Build Coastguard Worker inline void Set4BE(uint8_t* buf, uint32_t val) {
79*795d594fSAndroid Build Coastguard Worker   SetBytes<uint32_t>(buf, htobe32(val));
80*795d594fSAndroid Build Coastguard Worker }
81*795d594fSAndroid Build Coastguard Worker 
Set8BE(uint8_t * buf,uint64_t val)82*795d594fSAndroid Build Coastguard Worker inline void Set8BE(uint8_t* buf, uint64_t val) {
83*795d594fSAndroid Build Coastguard Worker   SetBytes<uint64_t>(buf, htobe64(val));
84*795d594fSAndroid Build Coastguard Worker }
85*795d594fSAndroid Build Coastguard Worker 
Write1BE(uint8_t ** dst,uint8_t value)86*795d594fSAndroid Build Coastguard Worker inline void Write1BE(uint8_t** dst, uint8_t value) {
87*795d594fSAndroid Build Coastguard Worker   Set1(*dst, value);
88*795d594fSAndroid Build Coastguard Worker   *dst += sizeof(value);
89*795d594fSAndroid Build Coastguard Worker }
90*795d594fSAndroid Build Coastguard Worker 
Write2BE(uint8_t ** dst,uint16_t value)91*795d594fSAndroid Build Coastguard Worker inline void Write2BE(uint8_t** dst, uint16_t value) {
92*795d594fSAndroid Build Coastguard Worker   Set2BE(*dst, value);
93*795d594fSAndroid Build Coastguard Worker   *dst += sizeof(value);
94*795d594fSAndroid Build Coastguard Worker }
95*795d594fSAndroid Build Coastguard Worker 
Write4BE(uint8_t ** dst,uint32_t value)96*795d594fSAndroid Build Coastguard Worker inline void Write4BE(uint8_t** dst, uint32_t value) {
97*795d594fSAndroid Build Coastguard Worker   Set4BE(*dst, value);
98*795d594fSAndroid Build Coastguard Worker   *dst += sizeof(value);
99*795d594fSAndroid Build Coastguard Worker }
100*795d594fSAndroid Build Coastguard Worker 
Write8BE(uint8_t ** dst,uint64_t value)101*795d594fSAndroid Build Coastguard Worker inline void Write8BE(uint8_t** dst, uint64_t value) {
102*795d594fSAndroid Build Coastguard Worker   Set8BE(*dst, value);
103*795d594fSAndroid Build Coastguard Worker   *dst += sizeof(value);
104*795d594fSAndroid Build Coastguard Worker }
105*795d594fSAndroid Build Coastguard Worker 
106*795d594fSAndroid Build Coastguard Worker }  // namespace art
107*795d594fSAndroid Build Coastguard Worker 
108*795d594fSAndroid Build Coastguard Worker #endif  // ART_LIBARTBASE_BASE_ENDIAN_UTILS_H_
109