/src/skia/include/core/SkDataTable.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2013 Google Inc. |
3 | | * |
4 | | * Use of this source code is governed by a BSD-style license that can be |
5 | | * found in the LICENSE file. |
6 | | */ |
7 | | |
8 | | #ifndef SkDataTable_DEFINED |
9 | | #define SkDataTable_DEFINED |
10 | | |
11 | | #include "include/core/SkRefCnt.h" |
12 | | #include "include/private/base/SkAPI.h" |
13 | | #include "include/private/base/SkAssert.h" |
14 | | |
15 | | #include <cstdint> |
16 | | #include <cstring> |
17 | | |
18 | | /** |
19 | | * Like SkData, SkDataTable holds an immutable data buffer. The data buffer is |
20 | | * organized into a table of entries, each with a length, so the entries are |
21 | | * not required to all be the same size. |
22 | | */ |
23 | | class SK_API SkDataTable : public SkRefCnt { |
24 | | public: |
25 | | /** |
26 | | * Returns true if the table is empty (i.e. has no entries). |
27 | | */ |
28 | 0 | bool isEmpty() const { return 0 == fCount; } |
29 | | |
30 | | /** |
31 | | * Return the number of entries in the table. 0 for an empty table |
32 | | */ |
33 | 0 | int count() const { return fCount; } |
34 | | |
35 | | /** |
36 | | * Return the size of the index'th entry in the table. The caller must |
37 | | * ensure that index is valid for this table. |
38 | | */ |
39 | | size_t atSize(int index) const; |
40 | | |
41 | | /** |
42 | | * Return a pointer to the data of the index'th entry in the table. |
43 | | * The caller must ensure that index is valid for this table. |
44 | | * |
45 | | * @param size If non-null, this returns the byte size of this entry. This |
46 | | * will be the same value that atSize(index) would return. |
47 | | */ |
48 | | const void* at(int index, size_t* size = nullptr) const; |
49 | | |
50 | | template <typename T> |
51 | 0 | const T* atT(int index, size_t* size = nullptr) const { |
52 | 0 | return reinterpret_cast<const T*>(this->at(index, size)); |
53 | 0 | } |
54 | | |
55 | | /** |
56 | | * Returns the index'th entry as a c-string, and assumes that the trailing |
57 | | * null byte had been copied into the table as well. |
58 | | */ |
59 | 0 | const char* atStr(int index) const { |
60 | 0 | size_t size; |
61 | 0 | const char* str = this->atT<const char>(index, &size); |
62 | 0 | SkASSERT(strlen(str) + 1 == size); |
63 | 0 | return str; |
64 | 0 | } Unexecuted instantiation: SkDataTable::atStr(int) const Unexecuted instantiation: SkDataTable::atStr(int) const |
65 | | |
66 | | typedef void (*FreeProc)(void* context); |
67 | | |
68 | | static sk_sp<SkDataTable> MakeEmpty(); |
69 | | |
70 | | /** |
71 | | * Return a new DataTable that contains a copy of the data stored in each |
72 | | * "array". |
73 | | * |
74 | | * @param ptrs array of points to each element to be copied into the table. |
75 | | * @param sizes array of byte-lengths for each entry in the corresponding |
76 | | * ptrs[] array. |
77 | | * @param count the number of array elements in ptrs[] and sizes[] to copy. |
78 | | */ |
79 | | static sk_sp<SkDataTable> MakeCopyArrays(const void * const * ptrs, |
80 | | const size_t sizes[], int count); |
81 | | |
82 | | /** |
83 | | * Return a new table that contains a copy of the data in array. |
84 | | * |
85 | | * @param array contiguous array of data for all elements to be copied. |
86 | | * @param elemSize byte-length for a given element. |
87 | | * @param count the number of entries to be copied out of array. The number |
88 | | * of bytes that will be copied is count * elemSize. |
89 | | */ |
90 | | static sk_sp<SkDataTable> MakeCopyArray(const void* array, size_t elemSize, int count); |
91 | | |
92 | | static sk_sp<SkDataTable> MakeArrayProc(const void* array, size_t elemSize, int count, |
93 | | FreeProc proc, void* context); |
94 | | |
95 | | private: |
96 | | struct Dir { |
97 | | const void* fPtr; |
98 | | uintptr_t fSize; |
99 | | }; |
100 | | |
101 | | int fCount; |
102 | | size_t fElemSize; |
103 | | union { |
104 | | const Dir* fDir; |
105 | | const char* fElems; |
106 | | } fU; |
107 | | |
108 | | FreeProc fFreeProc; |
109 | | void* fFreeProcContext; |
110 | | |
111 | | SkDataTable(); |
112 | | SkDataTable(const void* array, size_t elemSize, int count, |
113 | | FreeProc, void* context); |
114 | | SkDataTable(const Dir*, int count, FreeProc, void* context); |
115 | | ~SkDataTable() override; |
116 | | |
117 | | friend class SkDataTableBuilder; // access to Dir |
118 | | |
119 | | using INHERITED = SkRefCnt; |
120 | | }; |
121 | | |
122 | | #endif |