/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkDataTable_DEFINED #define SkDataTable_DEFINED #include "../private/SkTDArray.h" #include "SkData.h" #include "SkString.h" /** * Like SkData, SkDataTable holds an immutable data buffer. The data buffer is * organized into a table of entries, each with a length, so the entries are * not required to all be the same size. */ class SK_API SkDataTable : public SkRefCnt { public: /** * Returns true if the table is empty (i.e. has no entries). */ bool isEmpty() const { return 0 == fCount; } /** * Return the number of entries in the table. 0 for an empty table */ int count() const { return fCount; } /** * Return the size of the index'th entry in the table. The caller must * ensure that index is valid for this table. */ size_t atSize(int index) const; /** * Return a pointer to the data of the index'th entry in the table. * The caller must ensure that index is valid for this table. * * @param size If non-null, this returns the byte size of this entry. This * will be the same value that atSize(index) would return. */ const void* at(int index, size_t* size = nullptr) const; template <typename T> const T* atT(int index, size_t* size = nullptr) const { return reinterpret_cast<const T*>(this->at(index, size)); } /** * Returns the index'th entry as a c-string, and assumes that the trailing * null byte had been copied into the table as well. */ const char* atStr(int index) const { size_t size; const char* str = this->atT<const char>(index, &size); SkASSERT(strlen(str) + 1 == size); return str; } typedef void (*FreeProc)(void* context); static sk_sp<SkDataTable> MakeEmpty(); /** * Return a new DataTable that contains a copy of the data stored in each * "array". * * @param ptrs array of points to each element to be copied into the table. * @param sizes array of byte-lengths for each entry in the corresponding * ptrs[] array. * @param count the number of array elements in ptrs[] and sizes[] to copy. */ static sk_sp<SkDataTable> MakeCopyArrays(const void * const * ptrs, const size_t sizes[], int count); /** * Return a new table that contains a copy of the data in array. * * @param array contiguous array of data for all elements to be copied. * @param elemSize byte-length for a given element. * @param count the number of entries to be copied out of array. The number * of bytes that will be copied is count * elemSize. */ static sk_sp<SkDataTable> MakeCopyArray(const void* array, size_t elemSize, int count); static sk_sp<SkDataTable> MakeArrayProc(const void* array, size_t elemSize, int count, FreeProc proc, void* context); private: struct Dir { const void* fPtr; uintptr_t fSize; }; int fCount; size_t fElemSize; union { const Dir* fDir; const char* fElems; } fU; FreeProc fFreeProc; void* fFreeProcContext; SkDataTable(); SkDataTable(const void* array, size_t elemSize, int count, FreeProc, void* context); SkDataTable(const Dir*, int count, FreeProc, void* context); virtual ~SkDataTable(); friend class SkDataTableBuilder; // access to Dir typedef SkRefCnt INHERITED; }; #endif