130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/byte_array.h"
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <algorithm>
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/exception_type.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunconst int32_t ByteArray::COPY_BUFFER_SIZE = 8192;
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunByteArray::~ByteArray() {}
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Length() { return filled_length_; }
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Size() { return storage_length_; }
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::SetFilledLength(int32_t filled_length) {
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  filled_length_ = std::min<int32_t>(filled_length, storage_length_);
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return filled_length_;
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Get(int32_t index) {
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return InternalGet(index) & 0xff;
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Get(int32_t index, ByteVector* b) {
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(b);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return Get(index, &((*b)[0]), 0, b->size());
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Get(int32_t index,
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       byte_t* b,
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       int32_t offset,
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       int32_t length) {
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(b);
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (index < 0 || index >= filled_length_) {
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return 0;
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t actual_length = std::min<int32_t>(length, filled_length_ - index);
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return InternalGet(index, b, offset, actual_length);
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid ByteArray::Put(int32_t index, byte_t b) {
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (index < 0 || index >= Size()) {
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_NO_EXCEPTION)
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return;
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    throw IndexOutOfBoundException(
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        "Attempt to write outside the bounds of the data");
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  InternalPut(index, b);
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  filled_length_ = std::max<int32_t>(filled_length_, index + 1);
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Put(int index, ByteVector* b) {
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(b);
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return Put(index, &((*b)[0]), 0, b->size());
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::Put(int32_t index,
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       byte_t* b,
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       int32_t offset,
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                       int32_t length) {
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(b);
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (index < 0 || index >= Size()) {
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_NO_EXCEPTION)
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return 0;
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    throw IndexOutOfBoundException(
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        "Attempt to write outside the bounds of the data");
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t actual_length = std::min<int32_t>(length, Size() - index);
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t bytes_written = InternalPut(index, b, offset, actual_length);
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  filled_length_ = std::max<int32_t>(filled_length_, index + bytes_written);
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return bytes_written;
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::CopyTo(ByteArray* array) {
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return CopyTo(array, 0, Length());
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::CopyTo(ByteArray* array, int32_t offset, int32_t length) {
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return CopyTo(0, array, offset, length);
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::CopyTo(int32_t dst_offset, ByteArray* array,
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                          int32_t src_offset, int32_t length) {
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(array);
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (array->Size() < dst_offset + length) {  // insufficient space
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return -1;
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b(COPY_BUFFER_SIZE);
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t bytes_read = 0;
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t remaining_length = length;
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while ((bytes_read =
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun              Get(index + src_offset, &(b[0]), 0, buffer_length)) > 0) {
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    int bytes_written = array->Put(index + dst_offset, &(b[0]), 0, bytes_read);
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    UNREFERENCED_PARAMETER(bytes_written);
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    remaining_length -= bytes_read;
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    buffer_length = std::min<int32_t>(b.size(), remaining_length);
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return index;
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::CopyTo(OutputStream* os) {
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return CopyTo(os, 0, Length());
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t ByteArray::CopyTo(OutputStream* os, int32_t offset, int32_t length) {
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b(COPY_BUFFER_SIZE);
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t bytes_read = 0;
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while ((bytes_read = Get(index + offset, &(b[0]), 0, buffer_length)) > 0) {
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    os->Write(&b, 0, bytes_read);
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    buffer_length = std::min<int32_t>(b.size(), length - index);
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return index;
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool ByteArray::CopyFrom(InputStream* is, int32_t length) {
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b(COPY_BUFFER_SIZE);
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t bytes_read = 0;
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t buffer_length = std::min<int32_t>(COPY_BUFFER_SIZE, length);
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (Put(index, &(b[0]), 0, bytes_read) != bytes_read) {
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_NO_EXCEPTION)
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      return 0;
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      throw IOException("Error writing bytes.");
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    }
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    length -= bytes_read;
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    buffer_length = std::min<int32_t>(b.size(), length);
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbool ByteArray::CopyFrom(InputStream* is) {
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector b(COPY_BUFFER_SIZE);
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t bytes_read = 0;
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t index = 0;
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t buffer_length = COPY_BUFFER_SIZE;
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  while ((bytes_read = is->Read(&b, 0, buffer_length)) > 0) {
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (Put(index, &b[0], 0, bytes_read) != bytes_read) {
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined (SFNTLY_NO_EXCEPTION)
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      return 0;
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      throw IOException("Error writing bytes.");
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    }
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    index += bytes_read;
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return true;
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunByteArray::ByteArray(int32_t filled_length,
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t storage_length,
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     bool growable) {
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Init(filled_length, storage_length, growable);
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunByteArray::ByteArray(int32_t filled_length, int32_t storage_length) {
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Init(filled_length, storage_length, false);
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid ByteArray::Init(int32_t filled_length,
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     int32_t storage_length,
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                     bool growable) {
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  storage_length_ = storage_length;
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  growable_ = growable;
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  SetFilledLength(filled_length);
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
200