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