1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 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_LEB128_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_LEB128_H_
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker #include <optional>
21*795d594fSAndroid Build Coastguard Worker #include <vector>
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
24*795d594fSAndroid Build Coastguard Worker
25*795d594fSAndroid Build Coastguard Worker #include "bit_utils.h"
26*795d594fSAndroid Build Coastguard Worker #include "globals.h"
27*795d594fSAndroid Build Coastguard Worker #include "macros.h"
28*795d594fSAndroid Build Coastguard Worker
29*795d594fSAndroid Build Coastguard Worker namespace art {
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker template <typename T>
DecodeLeb128Helper(const uint8_t ** data,const std::optional<const void * > & end,T * out)32*795d594fSAndroid Build Coastguard Worker static inline bool DecodeLeb128Helper(const uint8_t** data,
33*795d594fSAndroid Build Coastguard Worker const std::optional<const void*>& end,
34*795d594fSAndroid Build Coastguard Worker T* out) {
35*795d594fSAndroid Build Coastguard Worker static_assert(sizeof(T) == 8 || sizeof(T) == 4);
36*795d594fSAndroid Build Coastguard Worker const uint8_t* ptr = *data;
37*795d594fSAndroid Build Coastguard Worker T result = 0;
38*795d594fSAndroid Build Coastguard Worker const size_t num_bits = (sizeof(T) * 8);
39*795d594fSAndroid Build Coastguard Worker // We can encode 7-bits per byte in leb128. So max_bytes is ceil(number_of_bits / 7)
40*795d594fSAndroid Build Coastguard Worker const size_t max_bytes = (num_bits + 6u) / 7u;
41*795d594fSAndroid Build Coastguard Worker for (size_t index = 0; index < max_bytes; ++index) {
42*795d594fSAndroid Build Coastguard Worker if (end.has_value() && ptr >= end.value()) {
43*795d594fSAndroid Build Coastguard Worker return false;
44*795d594fSAndroid Build Coastguard Worker }
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker std::make_unsigned_t<T> curr = *(ptr++);
47*795d594fSAndroid Build Coastguard Worker result |= ((curr & 0x7f) << (index * 7));
48*795d594fSAndroid Build Coastguard Worker if (LIKELY(curr <= 0x7f)) {
49*795d594fSAndroid Build Coastguard Worker if (std::is_signed_v<T>) {
50*795d594fSAndroid Build Coastguard Worker // For signed values we need to sign extend the result. If we are using all the bits then
51*795d594fSAndroid Build Coastguard Worker // the result is already sign extended and we don't need to do anything.
52*795d594fSAndroid Build Coastguard Worker if (index < max_bytes - 1) {
53*795d594fSAndroid Build Coastguard Worker int shift = num_bits - (index + 1) * 7;
54*795d594fSAndroid Build Coastguard Worker result = (result << shift) >> shift;
55*795d594fSAndroid Build Coastguard Worker }
56*795d594fSAndroid Build Coastguard Worker }
57*795d594fSAndroid Build Coastguard Worker // End of encoding.
58*795d594fSAndroid Build Coastguard Worker break;
59*795d594fSAndroid Build Coastguard Worker }
60*795d594fSAndroid Build Coastguard Worker }
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker *out = result;
63*795d594fSAndroid Build Coastguard Worker *data = ptr;
64*795d594fSAndroid Build Coastguard Worker return true;
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker
67*795d594fSAndroid Build Coastguard Worker template <typename T = uint32_t>
DecodeUnsignedLeb128(const uint8_t ** data)68*795d594fSAndroid Build Coastguard Worker static inline T DecodeUnsignedLeb128(const uint8_t** data) {
69*795d594fSAndroid Build Coastguard Worker static_assert(!std::is_signed_v<T>);
70*795d594fSAndroid Build Coastguard Worker T value = 0;
71*795d594fSAndroid Build Coastguard Worker DecodeLeb128Helper(data, std::nullopt, &value);
72*795d594fSAndroid Build Coastguard Worker return value;
73*795d594fSAndroid Build Coastguard Worker }
74*795d594fSAndroid Build Coastguard Worker
75*795d594fSAndroid Build Coastguard Worker template <typename T = uint32_t>
DecodeUnsignedLeb128Checked(const uint8_t ** data,const void * end,T * out)76*795d594fSAndroid Build Coastguard Worker static inline bool DecodeUnsignedLeb128Checked(const uint8_t** data, const void* end, T* out) {
77*795d594fSAndroid Build Coastguard Worker static_assert(!std::is_signed_v<T>);
78*795d594fSAndroid Build Coastguard Worker return DecodeLeb128Helper(data, end, out);
79*795d594fSAndroid Build Coastguard Worker }
80*795d594fSAndroid Build Coastguard Worker
DecodeUnsignedLeb128WithoutMovingCursor(const uint8_t * data)81*795d594fSAndroid Build Coastguard Worker static inline uint32_t DecodeUnsignedLeb128WithoutMovingCursor(const uint8_t* data) {
82*795d594fSAndroid Build Coastguard Worker return DecodeUnsignedLeb128(&data);
83*795d594fSAndroid Build Coastguard Worker }
84*795d594fSAndroid Build Coastguard Worker
85*795d594fSAndroid Build Coastguard Worker // Reads an unsigned LEB128 + 1 value. updating the given pointer to point
86*795d594fSAndroid Build Coastguard Worker // just past the end of the read value. This function tolerates
87*795d594fSAndroid Build Coastguard Worker // non-zero high-order bits in the fifth encoded byte.
88*795d594fSAndroid Build Coastguard Worker // It is possible for this function to return -1.
DecodeUnsignedLeb128P1(const uint8_t ** data)89*795d594fSAndroid Build Coastguard Worker static inline int32_t DecodeUnsignedLeb128P1(const uint8_t** data) {
90*795d594fSAndroid Build Coastguard Worker return DecodeUnsignedLeb128(data) - 1;
91*795d594fSAndroid Build Coastguard Worker }
92*795d594fSAndroid Build Coastguard Worker
93*795d594fSAndroid Build Coastguard Worker template <typename T = int32_t>
DecodeSignedLeb128(const uint8_t ** data)94*795d594fSAndroid Build Coastguard Worker static inline T DecodeSignedLeb128(const uint8_t** data) {
95*795d594fSAndroid Build Coastguard Worker static_assert(std::is_signed_v<T>);
96*795d594fSAndroid Build Coastguard Worker T value = 0;
97*795d594fSAndroid Build Coastguard Worker DecodeLeb128Helper(data, std::nullopt, &value);
98*795d594fSAndroid Build Coastguard Worker return value;
99*795d594fSAndroid Build Coastguard Worker }
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Worker template <typename T = int32_t>
DecodeSignedLeb128Checked(const uint8_t ** data,const void * end,T * out)102*795d594fSAndroid Build Coastguard Worker static inline bool DecodeSignedLeb128Checked(const uint8_t** data, const void* end, T* out) {
103*795d594fSAndroid Build Coastguard Worker static_assert(std::is_signed_v<T>);
104*795d594fSAndroid Build Coastguard Worker return DecodeLeb128Helper(data, end, out);
105*795d594fSAndroid Build Coastguard Worker }
106*795d594fSAndroid Build Coastguard Worker
107*795d594fSAndroid Build Coastguard Worker // Returns the number of bytes needed to encode the value in unsigned LEB128.
UnsignedLeb128Size(uint64_t data)108*795d594fSAndroid Build Coastguard Worker static inline uint32_t UnsignedLeb128Size(uint64_t data) {
109*795d594fSAndroid Build Coastguard Worker // bits_to_encode = (data != 0) ? 64 - CLZ(x) : 1 // 64 - CLZ(data | 1)
110*795d594fSAndroid Build Coastguard Worker // bytes = ceil(bits_to_encode / 7.0); // (6 + bits_to_encode) / 7
111*795d594fSAndroid Build Coastguard Worker uint32_t x = 6 + 64 - CLZ(data | 1U);
112*795d594fSAndroid Build Coastguard Worker // Division by 7 is done by (x * 37) >> 8 where 37 = ceil(256 / 7).
113*795d594fSAndroid Build Coastguard Worker // This works for 0 <= x < 256 / (7 * 37 - 256), i.e. 0 <= x <= 85.
114*795d594fSAndroid Build Coastguard Worker return (x * 37) >> 8;
115*795d594fSAndroid Build Coastguard Worker }
116*795d594fSAndroid Build Coastguard Worker
IsLeb128Terminator(const uint8_t * ptr)117*795d594fSAndroid Build Coastguard Worker static inline bool IsLeb128Terminator(const uint8_t* ptr) {
118*795d594fSAndroid Build Coastguard Worker return *ptr <= 0x7f;
119*795d594fSAndroid Build Coastguard Worker }
120*795d594fSAndroid Build Coastguard Worker
121*795d594fSAndroid Build Coastguard Worker // Returns the first byte of a Leb128 value assuming that:
122*795d594fSAndroid Build Coastguard Worker // (1) `end_ptr` points to the first byte after the Leb128 value, and
123*795d594fSAndroid Build Coastguard Worker // (2) there is another Leb128 value before this one.
124*795d594fSAndroid Build Coastguard Worker template <typename T>
ReverseSearchUnsignedLeb128(T * end_ptr)125*795d594fSAndroid Build Coastguard Worker static inline T* ReverseSearchUnsignedLeb128(T* end_ptr) {
126*795d594fSAndroid Build Coastguard Worker static_assert(std::is_same_v<std::remove_const_t<T>, uint8_t>,
127*795d594fSAndroid Build Coastguard Worker "T must be a uint8_t");
128*795d594fSAndroid Build Coastguard Worker T* ptr = end_ptr;
129*795d594fSAndroid Build Coastguard Worker
130*795d594fSAndroid Build Coastguard Worker // Move one byte back, check that this is the terminating byte.
131*795d594fSAndroid Build Coastguard Worker ptr--;
132*795d594fSAndroid Build Coastguard Worker DCHECK(IsLeb128Terminator(ptr));
133*795d594fSAndroid Build Coastguard Worker
134*795d594fSAndroid Build Coastguard Worker // Keep moving back while the previous byte is not a terminating byte.
135*795d594fSAndroid Build Coastguard Worker // Fail after reading five bytes in case there isn't another Leb128 value
136*795d594fSAndroid Build Coastguard Worker // before this one.
137*795d594fSAndroid Build Coastguard Worker while (!IsLeb128Terminator(ptr - 1)) {
138*795d594fSAndroid Build Coastguard Worker ptr--;
139*795d594fSAndroid Build Coastguard Worker DCHECK_LE(static_cast<ptrdiff_t>(end_ptr - ptr), 5);
140*795d594fSAndroid Build Coastguard Worker }
141*795d594fSAndroid Build Coastguard Worker
142*795d594fSAndroid Build Coastguard Worker return ptr;
143*795d594fSAndroid Build Coastguard Worker }
144*795d594fSAndroid Build Coastguard Worker
145*795d594fSAndroid Build Coastguard Worker // Returns the number of bytes needed to encode the value in unsigned LEB128.
SignedLeb128Size(int64_t data)146*795d594fSAndroid Build Coastguard Worker static inline uint32_t SignedLeb128Size(int64_t data) {
147*795d594fSAndroid Build Coastguard Worker // Like UnsignedLeb128Size(), but we need one bit beyond the highest bit that differs from sign.
148*795d594fSAndroid Build Coastguard Worker uint64_t bits_to_encode = static_cast<uint64_t>(data ^ (data >> 63));
149*795d594fSAndroid Build Coastguard Worker uint32_t num_bits = 1 /* we need to encode the sign bit */ + 6 + 64 - CLZ(bits_to_encode | 1U);
150*795d594fSAndroid Build Coastguard Worker // See UnsignedLeb128Size for explanation. This is basically num_bits / 7.
151*795d594fSAndroid Build Coastguard Worker return (num_bits * 37) >> 8;
152*795d594fSAndroid Build Coastguard Worker }
153*795d594fSAndroid Build Coastguard Worker
EncodeUnsignedLeb128(uint8_t * dest,uint64_t value)154*795d594fSAndroid Build Coastguard Worker static inline uint8_t* EncodeUnsignedLeb128(uint8_t* dest, uint64_t value) {
155*795d594fSAndroid Build Coastguard Worker uint8_t out = value & 0x7f;
156*795d594fSAndroid Build Coastguard Worker value >>= 7;
157*795d594fSAndroid Build Coastguard Worker while (value != 0) {
158*795d594fSAndroid Build Coastguard Worker *dest++ = out | 0x80;
159*795d594fSAndroid Build Coastguard Worker out = value & 0x7f;
160*795d594fSAndroid Build Coastguard Worker value >>= 7;
161*795d594fSAndroid Build Coastguard Worker }
162*795d594fSAndroid Build Coastguard Worker *dest++ = out;
163*795d594fSAndroid Build Coastguard Worker return dest;
164*795d594fSAndroid Build Coastguard Worker }
165*795d594fSAndroid Build Coastguard Worker
166*795d594fSAndroid Build Coastguard Worker template <typename Vector>
EncodeUnsignedLeb128(Vector * dest,uint64_t value)167*795d594fSAndroid Build Coastguard Worker static inline void EncodeUnsignedLeb128(Vector* dest, uint64_t value) {
168*795d594fSAndroid Build Coastguard Worker static_assert(std::is_same_v<typename Vector::value_type, uint8_t>, "Invalid value type");
169*795d594fSAndroid Build Coastguard Worker uint8_t out = value & 0x7f;
170*795d594fSAndroid Build Coastguard Worker value >>= 7;
171*795d594fSAndroid Build Coastguard Worker while (value != 0) {
172*795d594fSAndroid Build Coastguard Worker dest->push_back(out | 0x80);
173*795d594fSAndroid Build Coastguard Worker out = value & 0x7f;
174*795d594fSAndroid Build Coastguard Worker value >>= 7;
175*795d594fSAndroid Build Coastguard Worker }
176*795d594fSAndroid Build Coastguard Worker dest->push_back(out);
177*795d594fSAndroid Build Coastguard Worker }
178*795d594fSAndroid Build Coastguard Worker
179*795d594fSAndroid Build Coastguard Worker // Overwrite encoded Leb128 with a new value. The new value must be less than
180*795d594fSAndroid Build Coastguard Worker // or equal to the old value to ensure that it fits the allocated space.
UpdateUnsignedLeb128(uint8_t * dest,uint32_t value)181*795d594fSAndroid Build Coastguard Worker static inline void UpdateUnsignedLeb128(uint8_t* dest, uint32_t value) {
182*795d594fSAndroid Build Coastguard Worker const uint8_t* old_end = dest;
183*795d594fSAndroid Build Coastguard Worker uint32_t old_value = DecodeUnsignedLeb128(&old_end);
184*795d594fSAndroid Build Coastguard Worker DCHECK_LE(UnsignedLeb128Size(value), UnsignedLeb128Size(old_value));
185*795d594fSAndroid Build Coastguard Worker for (uint8_t* end = EncodeUnsignedLeb128(dest, value); end < old_end; end++) {
186*795d594fSAndroid Build Coastguard Worker // Use longer encoding than necessary to fill the allocated space.
187*795d594fSAndroid Build Coastguard Worker end[-1] |= 0x80;
188*795d594fSAndroid Build Coastguard Worker end[0] = 0;
189*795d594fSAndroid Build Coastguard Worker }
190*795d594fSAndroid Build Coastguard Worker }
191*795d594fSAndroid Build Coastguard Worker
EncodeSignedLeb128(uint8_t * dest,int64_t value)192*795d594fSAndroid Build Coastguard Worker static inline uint8_t* EncodeSignedLeb128(uint8_t* dest, int64_t value) {
193*795d594fSAndroid Build Coastguard Worker uint64_t extra_bits = static_cast<uint64_t>(value ^ (value >> 63)) >> 6;
194*795d594fSAndroid Build Coastguard Worker uint8_t out = value & 0x7f;
195*795d594fSAndroid Build Coastguard Worker while (extra_bits != 0u) {
196*795d594fSAndroid Build Coastguard Worker *dest++ = out | 0x80;
197*795d594fSAndroid Build Coastguard Worker value >>= 7;
198*795d594fSAndroid Build Coastguard Worker out = value & 0x7f;
199*795d594fSAndroid Build Coastguard Worker extra_bits >>= 7;
200*795d594fSAndroid Build Coastguard Worker }
201*795d594fSAndroid Build Coastguard Worker *dest++ = out;
202*795d594fSAndroid Build Coastguard Worker return dest;
203*795d594fSAndroid Build Coastguard Worker }
204*795d594fSAndroid Build Coastguard Worker
EncodeSignedLeb128(std::vector<uint8_t> * dest,int64_t value)205*795d594fSAndroid Build Coastguard Worker static inline void EncodeSignedLeb128(std::vector<uint8_t>* dest, int64_t value) {
206*795d594fSAndroid Build Coastguard Worker uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6;
207*795d594fSAndroid Build Coastguard Worker uint8_t out = value & 0x7f;
208*795d594fSAndroid Build Coastguard Worker while (extra_bits != 0u) {
209*795d594fSAndroid Build Coastguard Worker dest->push_back(out | 0x80);
210*795d594fSAndroid Build Coastguard Worker value >>= 7;
211*795d594fSAndroid Build Coastguard Worker out = value & 0x7f;
212*795d594fSAndroid Build Coastguard Worker extra_bits >>= 7;
213*795d594fSAndroid Build Coastguard Worker }
214*795d594fSAndroid Build Coastguard Worker dest->push_back(out);
215*795d594fSAndroid Build Coastguard Worker }
216*795d594fSAndroid Build Coastguard Worker
217*795d594fSAndroid Build Coastguard Worker // An encoder that pushes int32_t/uint32_t data onto the given std::vector.
218*795d594fSAndroid Build Coastguard Worker template <typename Vector = std::vector<uint8_t>>
219*795d594fSAndroid Build Coastguard Worker class Leb128Encoder {
220*795d594fSAndroid Build Coastguard Worker static_assert(std::is_same_v<typename Vector::value_type, uint8_t>, "Invalid value type");
221*795d594fSAndroid Build Coastguard Worker
222*795d594fSAndroid Build Coastguard Worker public:
Leb128Encoder(Vector * data)223*795d594fSAndroid Build Coastguard Worker explicit Leb128Encoder(Vector* data) : data_(data) {
224*795d594fSAndroid Build Coastguard Worker DCHECK(data != nullptr);
225*795d594fSAndroid Build Coastguard Worker }
226*795d594fSAndroid Build Coastguard Worker
Reserve(uint32_t size)227*795d594fSAndroid Build Coastguard Worker void Reserve(uint32_t size) {
228*795d594fSAndroid Build Coastguard Worker data_->reserve(size);
229*795d594fSAndroid Build Coastguard Worker }
230*795d594fSAndroid Build Coastguard Worker
PushBackUnsigned(uint32_t value)231*795d594fSAndroid Build Coastguard Worker void PushBackUnsigned(uint32_t value) {
232*795d594fSAndroid Build Coastguard Worker EncodeUnsignedLeb128(data_, value);
233*795d594fSAndroid Build Coastguard Worker }
234*795d594fSAndroid Build Coastguard Worker
235*795d594fSAndroid Build Coastguard Worker template<typename It>
InsertBackUnsigned(It cur,It end)236*795d594fSAndroid Build Coastguard Worker void InsertBackUnsigned(It cur, It end) {
237*795d594fSAndroid Build Coastguard Worker for (; cur != end; ++cur) {
238*795d594fSAndroid Build Coastguard Worker PushBackUnsigned(*cur);
239*795d594fSAndroid Build Coastguard Worker }
240*795d594fSAndroid Build Coastguard Worker }
241*795d594fSAndroid Build Coastguard Worker
PushBackSigned(int32_t value)242*795d594fSAndroid Build Coastguard Worker void PushBackSigned(int32_t value) {
243*795d594fSAndroid Build Coastguard Worker EncodeSignedLeb128(data_, value);
244*795d594fSAndroid Build Coastguard Worker }
245*795d594fSAndroid Build Coastguard Worker
246*795d594fSAndroid Build Coastguard Worker template<typename It>
InsertBackSigned(It cur,It end)247*795d594fSAndroid Build Coastguard Worker void InsertBackSigned(It cur, It end) {
248*795d594fSAndroid Build Coastguard Worker for (; cur != end; ++cur) {
249*795d594fSAndroid Build Coastguard Worker PushBackSigned(*cur);
250*795d594fSAndroid Build Coastguard Worker }
251*795d594fSAndroid Build Coastguard Worker }
252*795d594fSAndroid Build Coastguard Worker
GetData()253*795d594fSAndroid Build Coastguard Worker const Vector& GetData() const {
254*795d594fSAndroid Build Coastguard Worker return *data_;
255*795d594fSAndroid Build Coastguard Worker }
256*795d594fSAndroid Build Coastguard Worker
257*795d594fSAndroid Build Coastguard Worker protected:
258*795d594fSAndroid Build Coastguard Worker Vector* const data_;
259*795d594fSAndroid Build Coastguard Worker
260*795d594fSAndroid Build Coastguard Worker private:
261*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(Leb128Encoder);
262*795d594fSAndroid Build Coastguard Worker };
263*795d594fSAndroid Build Coastguard Worker
264*795d594fSAndroid Build Coastguard Worker // An encoder with an API similar to vector<uint32_t> where the data is captured in ULEB128 format.
265*795d594fSAndroid Build Coastguard Worker template <typename Vector = std::vector<uint8_t>>
266*795d594fSAndroid Build Coastguard Worker class Leb128EncodingVector final : private Vector,
267*795d594fSAndroid Build Coastguard Worker public Leb128Encoder<Vector> {
268*795d594fSAndroid Build Coastguard Worker static_assert(std::is_same_v<typename Vector::value_type, uint8_t>, "Invalid value type");
269*795d594fSAndroid Build Coastguard Worker
270*795d594fSAndroid Build Coastguard Worker public:
Leb128EncodingVector()271*795d594fSAndroid Build Coastguard Worker Leb128EncodingVector() : Leb128Encoder<Vector>(this) { }
272*795d594fSAndroid Build Coastguard Worker
Leb128EncodingVector(const typename Vector::allocator_type & alloc)273*795d594fSAndroid Build Coastguard Worker explicit Leb128EncodingVector(const typename Vector::allocator_type& alloc)
274*795d594fSAndroid Build Coastguard Worker : Vector(alloc),
275*795d594fSAndroid Build Coastguard Worker Leb128Encoder<Vector>(this) { }
276*795d594fSAndroid Build Coastguard Worker
277*795d594fSAndroid Build Coastguard Worker private:
278*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(Leb128EncodingVector);
279*795d594fSAndroid Build Coastguard Worker };
280*795d594fSAndroid Build Coastguard Worker
281*795d594fSAndroid Build Coastguard Worker } // namespace art
282*795d594fSAndroid Build Coastguard Worker
283*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBARTBASE_BASE_LEB128_H_
284