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