130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright (C) 2011 The sfntly Open Source Project
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#ifndef SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/refcount.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/input_stream.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/output_stream.h"
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// An abstraction to a contiguous array of bytes.
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// C++ port of this class assumes that the data are stored in a linear region
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// like std::vector.
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass ByteArray : virtual public RefCount {
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~ByteArray();
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the current filled and readable length of the array.
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t Length();
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the maximum size of the array. This is the maximum number of bytes that
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // the array can hold and all of it may not be filled with data or even fully
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // allocated yet.
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t Size();
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Determines whether or not this array is growable or of fixed size.
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool growable() { return growable_; }
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t SetFilledLength(int32_t filled_length);
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the byte from the given index.
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the index into the byte array
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the byte or -1 if reading beyond the bounds of the data
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t Get(int32_t index);
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the bytes from the given index and fill the buffer with them. As many
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // bytes as will fit into the buffer are read unless that would go past the
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // end of the array.
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the index into the byte array
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the buffer to put the bytes read into
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes read from the buffer
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t Get(int32_t index, ByteVector* b);
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the bytes from the given index and fill the buffer with them starting
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // at the offset given. As many bytes as the specified length are read unless
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // that would go past the end of the array.
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the index into the byte array
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the buffer to put the bytes read into
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the location in the buffer to start putting the bytes
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the number of bytes to put into the buffer
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes read from the buffer
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t Get(int32_t index,
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      byte_t* b,
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      int32_t offset,
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      int32_t length);
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Puts the specified byte into the array at the given index unless that would
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // be beyond the length of the array and it isn't growable.
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual void Put(int32_t index, byte_t b);
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Puts the specified bytes into the array at the given index. The entire
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // buffer is put into the array unless that would extend beyond the length and
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // the array isn't growable.
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t Put(int32_t index, ByteVector* b);
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Puts the specified bytes into the array at the given index. All of the bytes
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // specified are put into the array unless that would extend beyond the length
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // and the array isn't growable. The bytes to be put into the array are those
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // in the buffer from the given offset and for the given length.
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the index into the ByteArray
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the bytes to put into the array
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the offset in the bytes to start copying from
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the number of bytes to copy into the array
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes actually written
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t Put(int32_t index,
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      byte_t* b,
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      int32_t offset,
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                      int32_t length);
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Fully copies this ByteArray to another ByteArray to the extent that the
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // destination array has storage for the data copied.
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t CopyTo(ByteArray* array);
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies a segment of this ByteArray to another ByteArray.
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param array the destination
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the offset in this ByteArray to start copying from
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the maximum length in bytes to copy
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes copied
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t CopyTo(ByteArray* array, int32_t offset, int32_t length);
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies this ByteArray to another ByteArray.
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param dstOffset the offset in the destination array to start copying to
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param array the destination
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param srcOffset the offset in this ByteArray to start copying from
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the maximum length in bytes to copy
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes copied
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t CopyTo(int32_t dst_offset,
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                         ByteArray* array,
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                         int32_t src_offset,
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                         int32_t length);
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies this ByteArray to an OutputStream.
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param os the destination
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes copied
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t CopyTo(OutputStream* os);
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies this ByteArray to an OutputStream.
12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param os the destination
12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset
12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length
12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes copied
12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t CopyTo(OutputStream* os, int32_t offset, int32_t length);
12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies from the InputStream into this ByteArray.
13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param is the source
13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the number of bytes to copy
13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual bool CopyFrom(InputStream* is, int32_t length);
13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Copies everything from the InputStream into this ByteArray.
13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param is the source
13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual bool CopyFrom(InputStream* is);
13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun protected:
14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // filledLength the length that is "filled" and readable counting from offset.
14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // storageLength the maximum storage size of the underlying data.
14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // growable is the storage growable - storageLength is the max growable size.
14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteArray(int32_t filled_length, int32_t storage_length, bool growable);
14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteArray(int32_t filled_length, int32_t storage_length);
14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  void Init(int32_t filled_length, int32_t storage_length, bool growable);
14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Internal subclass API
14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Stores the byte at the index given.
15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the location to store at
15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the byte to store
15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual void InternalPut(int32_t index, byte_t b) = 0;
15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Stores the array of bytes at the given index.
15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the location to store at
15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the bytes to store
15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the offset to start from in the byte array
15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the length of the byte array to store from the offset
15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes actually stored
16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t InternalPut(int32_t index,
16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              byte_t* b,
16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              int32_t offset,
16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              int32_t length) = 0;
16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the byte at the index given.
16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the location to get from
16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the byte stored at the index
16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual byte_t InternalGet(int32_t index) = 0;
16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Gets the bytes at the index given of the given length.
17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param index the location to start getting from
17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param b the array to put the bytes into
17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param offset the offset in the array to put the bytes into
17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @param length the length of bytes to read
17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // @return the number of bytes actually ready
17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual int32_t InternalGet(int32_t index,
17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              byte_t* b,
17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              int32_t offset,
17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                              int32_t length) = 0;
18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Close this instance of the ByteArray.
18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual void Close() = 0;
18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // C++ port only, raw pointer to the first element of storage.
18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual byte_t* Begin() = 0;
18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Java toString() not ported.
18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t COPY_BUFFER_SIZE;
19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  //bool bound_;  // unused, comment out
19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t filled_length_;
19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t storage_length_;
19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool growable_;
19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<ByteArray> ByteArrayPtr;
19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_
202