xref: /aosp_15_r20/art/libartbase/base/leb128.h (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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