1 
2 /*
3  * Copyright 2006 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #include "SkTypedArray.h"
11 
SkTypedArray()12 SkTypedArray::SkTypedArray() : fType(SkType_Unknown) {
13 }
14 
SkTypedArray(SkDisplayTypes type)15 SkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) {
16 }
17 
getIndex(int index,SkOperand * operand)18 bool SkTypedArray::getIndex(int index, SkOperand* operand) {
19     if (index >= count()) {
20         SkASSERT(0);
21         return false;
22     }
23     *operand = begin()[index];
24     return true;
25 }
26 
27 
28 #if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1
SkDS32Array()29 SkDS32Array::SkDS32Array()
30 {
31     fReserve = fCount = 0;
32     fArray = NULL;
33 #ifdef SK_DEBUG
34     fData = NULL;
35 #endif
36 }
37 
SkDS32Array(const SkDS32Array & src)38 SkDS32Array::SkDS32Array(const SkDS32Array& src)
39 {
40     fReserve = fCount = 0;
41     fArray = NULL;
42 #ifdef SK_DEBUG
43     fData = NULL;
44 #endif
45     SkDS32Array tmp(src.fArray, src.fCount);
46     this->swap(tmp);
47 }
48 
SkDS32Array(const int32_t src[],U16CPU count)49 SkDS32Array::SkDS32Array(const int32_t src[], U16CPU count)
50 {
51     SkASSERT(src || count == 0);
52 
53     fReserve = fCount = 0;
54     fArray = NULL;
55 #ifdef SK_DEBUG
56     fData = NULL;
57 #endif
58     if (count)
59     {
60         fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t));
61 #ifdef SK_DEBUG
62         fData = (int32_t (*)[kDebugArraySize]) fArray;
63 #endif
64         memcpy(fArray, src, sizeof(int32_t) * count);
65         fReserve = fCount = SkToU16(count);
66     }
67 }
68 
operator =(const SkDS32Array & src)69 SkDS32Array& SkDS32Array::operator=(const SkDS32Array& src)
70 {
71     if (this != &src)
72     {
73         if (src.fCount > fReserve)
74         {
75             SkDS32Array tmp(src.fArray, src.fCount);
76             this->swap(tmp);
77         }
78         else
79         {
80             memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount);
81             fCount = src.fCount;
82         }
83     }
84     return *this;
85 }
86 
operator ==(const SkDS32Array & a,const SkDS32Array & b)87 int operator==(const SkDS32Array& a, const SkDS32Array& b)
88 {
89     return a.fCount == b.fCount &&
90             (a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t)));
91 }
92 
swap(SkDS32Array & other)93 void SkDS32Array::swap(SkDS32Array& other)
94 {
95     SkTSwap(fArray, other.fArray);
96 #ifdef SK_DEBUG
97     SkTSwap(fData, other.fData);
98 #endif
99     SkTSwap(fReserve, other.fReserve);
100     SkTSwap(fCount, other.fCount);
101 }
102 
append(U16CPU count,const int32_t * src)103 int32_t* SkDS32Array::append(U16CPU count, const int32_t* src)
104 {
105     unsigned oldCount = fCount;
106     if (count)
107     {
108         SkASSERT(src == NULL || fArray == NULL ||
109                 src + count <= fArray || fArray + count <= src);
110 
111         this->growBy(count);
112         if (src)
113             memcpy(fArray + oldCount, src, sizeof(int32_t) * count);
114     }
115     return fArray + oldCount;
116 }
117 
find(const int32_t & elem) const118 int SkDS32Array::find(const int32_t& elem) const
119 {
120     const int32_t* iter = fArray;
121     const int32_t* stop = fArray + fCount;
122 
123     for (; iter < stop; iter++)
124     {
125         if (*iter == elem)
126             return (int) (iter - fArray);
127     }
128     return -1;
129 }
130 
growBy(U16CPU extra)131 void SkDS32Array::growBy(U16CPU extra)
132 {
133     SkASSERT(extra);
134     SkASSERT(fCount + extra <= 0xFFFF);
135 
136     if (fCount + extra > fReserve)
137     {
138         size_t size = fCount + extra + 4;
139         size += size >> 2;
140         int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t));
141         memcpy(array, fArray, fCount * sizeof(int32_t));
142 
143         sk_free(fArray);
144         fArray = array;
145 #ifdef SK_DEBUG
146         fData = (int32_t (*)[kDebugArraySize]) fArray;
147 #endif
148         fReserve = SkToU16((U16CPU)size);
149     }
150     fCount = SkToU16(fCount + extra);
151 }
152 
insert(U16CPU index,U16CPU count,const int32_t * src)153 int32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src)
154 {
155     SkASSERT(count);
156     int oldCount = fCount;
157     this->growBy(count);
158     int32_t* dst = fArray + index;
159     memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index));
160     if (src)
161         memcpy(dst, src, sizeof(int32_t) * count);
162     return dst;
163 }
164 
165 
rfind(const int32_t & elem) const166     int SkDS32Array::rfind(const int32_t& elem) const
167     {
168         const int32_t* iter = fArray + fCount;
169         const int32_t* stop = fArray;
170 
171         while (iter > stop)
172         {
173             if (*--iter == elem)
174                 return (int) (iter - stop);
175         }
176         return -1;
177     }
178 
179 #endif
180