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