leb128.h revision 15c1975f5fa5ae646ae87b57394bfdae1090a236
12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
161fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_LEB128_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_LEB128_H_
191fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
20578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h"
211e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko#include "utils.h"
221fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
231fb8620309a4e94d11879aabc33364acfa733904Carl Shapironamespace art {
241fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
251fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// Reads an unsigned LEB128 value, updating the given pointer to point
261fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// just past the end of the read value. This function tolerates
271fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// non-zero high-order bits in the fifth encoded byte.
2896faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline uint32_t DecodeUnsignedLeb128(const uint8_t** data) {
2996faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogers  const uint8_t* ptr = *data;
301fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  int result = *(ptr++);
311ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers  if (UNLIKELY(result > 0x7f)) {
321fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    int cur = *(ptr++);
331fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    result = (result & 0x7f) | ((cur & 0x7f) << 7);
341fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    if (cur > 0x7f) {
351fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      cur = *(ptr++);
361fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      result |= (cur & 0x7f) << 14;
371fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      if (cur > 0x7f) {
381fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        cur = *(ptr++);
391fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        result |= (cur & 0x7f) << 21;
401fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        if (cur > 0x7f) {
411fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          // Note: We don't check to see if cur is out of range here,
421fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          // meaning we tolerate garbage in the four high-order bits.
431fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          cur = *(ptr++);
441fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          result |= cur << 28;
451fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        }
461fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      }
471fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    }
481fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  }
491fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  *data = ptr;
50cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee  return static_cast<uint32_t>(result);
511fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}
521fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
53195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// Reads an unsigned LEB128 + 1 value. updating the given pointer to point
54195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// just past the end of the read value. This function tolerates
55195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// non-zero high-order bits in the fifth encoded byte.
56195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao// It is possible for this function to return -1.
5796faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline int32_t DecodeUnsignedLeb128P1(const uint8_t** data) {
58195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  return DecodeUnsignedLeb128(data) - 1;
59195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao}
60195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
611fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// Reads a signed LEB128 value, updating the given pointer to point
621fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// just past the end of the read value. This function tolerates
631fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro// non-zero high-order bits in the fifth encoded byte.
6496faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersstatic inline int32_t DecodeSignedLeb128(const uint8_t** data) {
6596faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogers  const uint8_t* ptr = *data;
661fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  int32_t result = *(ptr++);
671fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  if (result <= 0x7f) {
681fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    result = (result << 25) >> 25;
691fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  } else {
701fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    int cur = *(ptr++);
711fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    result = (result & 0x7f) | ((cur & 0x7f) << 7);
721fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    if (cur <= 0x7f) {
731fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      result = (result << 18) >> 18;
741fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    } else {
751fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      cur = *(ptr++);
761fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      result |= (cur & 0x7f) << 14;
771fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      if (cur <= 0x7f) {
781fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        result = (result << 11) >> 11;
791fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      } else {
801fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        cur = *(ptr++);
811fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        result |= (cur & 0x7f) << 21;
821fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        if (cur <= 0x7f) {
831fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          result = (result << 4) >> 4;
841fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        } else {
851fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          // Note: We don't check to see if cur is out of range here,
861fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          // meaning we tolerate garbage in the four high-order bits.
871fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          cur = *(ptr++);
881fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro          result |= cur << 28;
891fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro        }
901fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro      }
911fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro    }
921fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  }
931fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  *data = ptr;
941fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro  return result;
951fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}
961fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
97d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao// Returns the number of bytes needed to encode the value in unsigned LEB128.
98d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhaostatic inline uint32_t UnsignedLeb128Size(uint32_t data) {
991e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  // bits_to_encode = (data != 0) ? 32 - CLZ(x) : 1  // 32 - CLZ(data | 1)
1001e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  // bytes = ceil(bits_to_encode / 7.0);             // (6 + bits_to_encode) / 7
1011e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  uint32_t x = 6 + 32 - CLZ(data | 1);
1021e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  // Division by 7 is done by (x * 37) >> 8 where 37 = ceil(256 / 7).
1031e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  // This works for 0 <= x < 256 / (7 * 37 - 256), i.e. 0 <= x <= 85.
1041e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  return (x * 37) >> 8;
1051e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko}
1061e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko
1071e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko// Returns the number of bytes needed to encode the value in unsigned LEB128.
1081e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Markostatic inline uint32_t SignedLeb128Size(int32_t data) {
1091e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  // Like UnsignedLeb128Size(), but we need one bit beyond the highest bit that differs from sign.
1101e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  data = data ^ (data >> 31);
1111e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  uint32_t x = 1 /* we need to encode the sign bit */ + 6 + 32 - CLZ(data | 1);
1121e6cb63d77090ddc6aa19c755d7066f66e9ff87eVladimir Marko  return (x * 37) >> 8;
113d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao}
114d1f0fdedff1dac7249e1ed61ddc52a09265c138fjeffhao
115a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic inline uint8_t* EncodeUnsignedLeb128(uint8_t* dest, uint32_t value) {
116a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  uint8_t out = value & 0x7f;
117a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  value >>= 7;
118a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  while (value != 0) {
119a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    *dest++ = out | 0x80;
120a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    out = value & 0x7f;
121a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    value >>= 7;
122a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
123a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  *dest++ = out;
124a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  return dest;
125a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}
126a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
12715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckytemplate<typename Allocator>
12815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckystatic inline void EncodeUnsignedLeb128(std::vector<uint8_t, Allocator>* dest, uint32_t value) {
12915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  uint8_t out = value & 0x7f;
13015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  value >>= 7;
13115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  while (value != 0) {
13215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    dest->push_back(out | 0x80);
13315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    out = value & 0x7f;
13415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    value >>= 7;
13515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  }
13615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  dest->push_back(out);
13715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky}
13815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky
139a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromstatic inline uint8_t* EncodeSignedLeb128(uint8_t* dest, int32_t value) {
140a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6;
141a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  uint8_t out = value & 0x7f;
142a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  while (extra_bits != 0u) {
143a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    *dest++ = out | 0x80;
144a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    value >>= 7;
145a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    out = value & 0x7f;
146a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    extra_bits >>= 7;
147a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
148a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  *dest++ = out;
149a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  return dest;
150a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom}
151a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
15215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckytemplate<typename Allocator>
15315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckystatic inline void EncodeSignedLeb128(std::vector<uint8_t, Allocator>* dest, int32_t value) {
15415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  uint32_t extra_bits = static_cast<uint32_t>(value ^ (value >> 31)) >> 6;
15515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  uint8_t out = value & 0x7f;
15615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  while (extra_bits != 0u) {
15715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    dest->push_back(out | 0x80);
15815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    value >>= 7;
15915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    out = value & 0x7f;
16015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    extra_bits >>= 7;
16115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  }
16215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky  dest->push_back(out);
16315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky}
16415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky
165e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban// An encoder that pushed uint32_t data onto the given std::vector.
166e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Roubanclass Leb128Encoder {
167a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom public:
168e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban  explicit Leb128Encoder(std::vector<uint8_t>* data) : data_(data) {
169e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban    DCHECK(data != nullptr);
170a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
171a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
172a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  void Reserve(uint32_t size) {
173e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban    data_->reserve(size);
174a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
175a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
176a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  void PushBackUnsigned(uint32_t value) {
17715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    EncodeUnsignedLeb128(data_, value);
178a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
179a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
180a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  template<typename It>
181a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  void InsertBackUnsigned(It cur, It end) {
182a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    for (; cur != end; ++cur) {
183a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      PushBackUnsigned(*cur);
184a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    }
185a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
186a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
187a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  void PushBackSigned(int32_t value) {
18815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky    EncodeSignedLeb128(data_, value);
189a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
190a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
191a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  template<typename It>
192a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  void InsertBackSigned(It cur, It end) {
193a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    for (; cur != end; ++cur) {
194a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom      PushBackSigned(*cur);
195a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom    }
196a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
197a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
198a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  const std::vector<uint8_t>& GetData() const {
199e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban    return *data_;
200a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  }
201a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
202e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban protected:
203e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban  std::vector<uint8_t>* const data_;
204e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban
205a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom private:
206e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban  DISALLOW_COPY_AND_ASSIGN(Leb128Encoder);
207e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban};
208e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban
209e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban// An encoder with an API similar to vector<uint32_t> where the data is captured in ULEB128 format.
210e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Roubanclass Leb128EncodingVector FINAL : private std::vector<uint8_t>, public Leb128Encoder {
211e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban public:
212e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban  Leb128EncodingVector() : Leb128Encoder(this) {
213e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban  }
214a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
215e3ea83811d47152c00abea24a9b420651a33b496Yevgeny Rouban private:
216a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom  DISALLOW_COPY_AND_ASSIGN(Leb128EncodingVector);
217a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom};
218a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom
2191fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}  // namespace art
2201fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
221fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_LEB128_H_
222