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/growable_memory_byte_array.h"
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <limits.h>
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <string.h>
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <algorithm>
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunGrowableMemoryByteArray::GrowableMemoryByteArray()
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    : ByteArray(0, INT_MAX, true) {
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Note: We did not set an initial size of array like Java because STL
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  //       implementation will determine the best strategy.
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunGrowableMemoryByteArray::~GrowableMemoryByteArray() {}
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t GrowableMemoryByteArray::CopyTo(OutputStream* os,
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                        int32_t offset,
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                        int32_t length) {
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(os);
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  os->Write(&b_, offset, length);
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return length;
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid GrowableMemoryByteArray::InternalPut(int32_t index, byte_t b) {
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if ((size_t)index >= b_.size()) {
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    b_.resize((size_t)(index + 1));
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b_[index] = b;
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t GrowableMemoryByteArray::InternalPut(int32_t index,
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             byte_t* b,
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             int32_t offset,
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             int32_t length) {
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if ((size_t)index + length >= b_.size()) {
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    // Note: We grow one byte more than Java version. VC debuggers shows
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    //       data better this way.
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    b_.resize((size_t)(index + length + 1));
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  std::copy(b + offset, b + offset + length, b_.begin() + index);
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return length;
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbyte_t GrowableMemoryByteArray::InternalGet(int32_t index) {
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return b_[index];
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint32_t GrowableMemoryByteArray::InternalGet(int32_t index,
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             byte_t* b,
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             int32_t offset,
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                                             int32_t length) {
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  memcpy(b + offset, &(b_[0]) + index, length);
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return length;
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid GrowableMemoryByteArray::Close() {
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  b_.clear();
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunbyte_t* GrowableMemoryByteArray::Begin() {
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return &(b_[0]);
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
83