1/* 2 * Copyright (C) 2011 The sfntly Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_ 18#define SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_ 19 20#include "sfntly/port/refcount.h" 21#include "sfntly/port/type.h" 22#include "sfntly/port/input_stream.h" 23#include "sfntly/port/output_stream.h" 24 25namespace sfntly { 26 27// An abstraction to a contiguous array of bytes. 28// C++ port of this class assumes that the data are stored in a linear region 29// like std::vector. 30class ByteArray : virtual public RefCount { 31 public: 32 virtual ~ByteArray(); 33 34 // Gets the current filled and readable length of the array. 35 int32_t Length(); 36 37 // Gets the maximum size of the array. This is the maximum number of bytes that 38 // the array can hold and all of it may not be filled with data or even fully 39 // allocated yet. 40 int32_t Size(); 41 42 // Determines whether or not this array is growable or of fixed size. 43 bool growable() { return growable_; } 44 45 int32_t SetFilledLength(int32_t filled_length); 46 47 // Gets the byte from the given index. 48 // @param index the index into the byte array 49 // @return the byte or -1 if reading beyond the bounds of the data 50 virtual int32_t Get(int32_t index); 51 52 // Gets the bytes from the given index and fill the buffer with them. As many 53 // bytes as will fit into the buffer are read unless that would go past the 54 // end of the array. 55 // @param index the index into the byte array 56 // @param b the buffer to put the bytes read into 57 // @return the number of bytes read from the buffer 58 virtual int32_t Get(int32_t index, ByteVector* b); 59 60 // Gets the bytes from the given index and fill the buffer with them starting 61 // at the offset given. As many bytes as the specified length are read unless 62 // that would go past the end of the array. 63 // @param index the index into the byte array 64 // @param b the buffer to put the bytes read into 65 // @param offset the location in the buffer to start putting the bytes 66 // @param length the number of bytes to put into the buffer 67 // @return the number of bytes read from the buffer 68 virtual int32_t Get(int32_t index, 69 byte_t* b, 70 int32_t offset, 71 int32_t length); 72 73 // Puts the specified byte into the array at the given index unless that would 74 // be beyond the length of the array and it isn't growable. 75 virtual void Put(int32_t index, byte_t b); 76 77 // Puts the specified bytes into the array at the given index. The entire 78 // buffer is put into the array unless that would extend beyond the length and 79 // the array isn't growable. 80 virtual int32_t Put(int32_t index, ByteVector* b); 81 82 // Puts the specified bytes into the array at the given index. All of the bytes 83 // specified are put into the array unless that would extend beyond the length 84 // and the array isn't growable. The bytes to be put into the array are those 85 // in the buffer from the given offset and for the given length. 86 // @param index the index into the ByteArray 87 // @param b the bytes to put into the array 88 // @param offset the offset in the bytes to start copying from 89 // @param length the number of bytes to copy into the array 90 // @return the number of bytes actually written 91 virtual int32_t Put(int32_t index, 92 byte_t* b, 93 int32_t offset, 94 int32_t length); 95 96 // Fully copies this ByteArray to another ByteArray to the extent that the 97 // destination array has storage for the data copied. 98 virtual int32_t CopyTo(ByteArray* array); 99 100 // Copies a segment of this ByteArray to another ByteArray. 101 // @param array the destination 102 // @param offset the offset in this ByteArray to start copying from 103 // @param length the maximum length in bytes to copy 104 // @return the number of bytes copied 105 virtual int32_t CopyTo(ByteArray* array, int32_t offset, int32_t length); 106 107 // Copies this ByteArray to another ByteArray. 108 // @param dstOffset the offset in the destination array to start copying to 109 // @param array the destination 110 // @param srcOffset the offset in this ByteArray to start copying from 111 // @param length the maximum length in bytes to copy 112 // @return the number of bytes copied 113 virtual int32_t CopyTo(int32_t dst_offset, 114 ByteArray* array, 115 int32_t src_offset, 116 int32_t length); 117 118 // Copies this ByteArray to an OutputStream. 119 // @param os the destination 120 // @return the number of bytes copied 121 virtual int32_t CopyTo(OutputStream* os); 122 123 // Copies this ByteArray to an OutputStream. 124 // @param os the destination 125 // @param offset 126 // @param length 127 // @return the number of bytes copied 128 virtual int32_t CopyTo(OutputStream* os, int32_t offset, int32_t length); 129 130 // Copies from the InputStream into this ByteArray. 131 // @param is the source 132 // @param length the number of bytes to copy 133 virtual bool CopyFrom(InputStream* is, int32_t length); 134 135 // Copies everything from the InputStream into this ByteArray. 136 // @param is the source 137 virtual bool CopyFrom(InputStream* is); 138 139 protected: 140 // filledLength the length that is "filled" and readable counting from offset. 141 // storageLength the maximum storage size of the underlying data. 142 // growable is the storage growable - storageLength is the max growable size. 143 ByteArray(int32_t filled_length, int32_t storage_length, bool growable); 144 ByteArray(int32_t filled_length, int32_t storage_length); 145 void Init(int32_t filled_length, int32_t storage_length, bool growable); 146 147 // Internal subclass API 148 149 // Stores the byte at the index given. 150 // @param index the location to store at 151 // @param b the byte to store 152 virtual void InternalPut(int32_t index, byte_t b) = 0; 153 154 // Stores the array of bytes at the given index. 155 // @param index the location to store at 156 // @param b the bytes to store 157 // @param offset the offset to start from in the byte array 158 // @param length the length of the byte array to store from the offset 159 // @return the number of bytes actually stored 160 virtual int32_t InternalPut(int32_t index, 161 byte_t* b, 162 int32_t offset, 163 int32_t length) = 0; 164 165 // Gets the byte at the index given. 166 // @param index the location to get from 167 // @return the byte stored at the index 168 virtual byte_t InternalGet(int32_t index) = 0; 169 170 // Gets the bytes at the index given of the given length. 171 // @param index the location to start getting from 172 // @param b the array to put the bytes into 173 // @param offset the offset in the array to put the bytes into 174 // @param length the length of bytes to read 175 // @return the number of bytes actually ready 176 virtual int32_t InternalGet(int32_t index, 177 byte_t* b, 178 int32_t offset, 179 int32_t length) = 0; 180 181 // Close this instance of the ByteArray. 182 virtual void Close() = 0; 183 184 // C++ port only, raw pointer to the first element of storage. 185 virtual byte_t* Begin() = 0; 186 187 // Java toString() not ported. 188 189 static const int32_t COPY_BUFFER_SIZE; 190 191 private: 192 //bool bound_; // unused, comment out 193 int32_t filled_length_; 194 int32_t storage_length_; 195 bool growable_; 196}; 197typedef Ptr<ByteArray> ByteArrayPtr; 198 199} // namespace sfntly 200 201#endif // SFNTLY_CPP_SRC_SFNTLY_DATA_BYTE_ARRAY_H_ 202