blob: e94e57dca7efffc766f43739face0a640c4dc6d1 [file] [log] [blame]
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkTypedArray.h"
SkTypedArray::SkTypedArray() : fType(SkType_Unknown) {
}
SkTypedArray::SkTypedArray(SkDisplayTypes type) : fType(type) {
}
bool SkTypedArray::getIndex(int index, SkOperand* operand) {
if (index >= count()) {
SkASSERT(0);
return false;
}
*operand = begin()[index];
return true;
}
#if SK_SMALLER_ARRAY_TEMPLATE_EXPERIMENT == 1
SkDS32Array::SkDS32Array()
{
fReserve = fCount = 0;
fArray = NULL;
#ifdef SK_DEBUG
fData = NULL;
#endif
}
SkDS32Array::SkDS32Array(const SkDS32Array& src)
{
fReserve = fCount = 0;
fArray = NULL;
#ifdef SK_DEBUG
fData = NULL;
#endif
SkDS32Array tmp(src.fArray, src.fCount);
this->swap(tmp);
}
SkDS32Array::SkDS32Array(const int32_t src[], U16CPU count)
{
SkASSERT(src || count == 0);
fReserve = fCount = 0;
fArray = NULL;
#ifdef SK_DEBUG
fData = NULL;
#endif
if (count)
{
fArray = (int32_t*)sk_malloc_throw(count * sizeof(int32_t));
#ifdef SK_DEBUG
fData = (int32_t (*)[kDebugArraySize]) fArray;
#endif
memcpy(fArray, src, sizeof(int32_t) * count);
fReserve = fCount = SkToU16(count);
}
}
SkDS32Array& SkDS32Array::operator=(const SkDS32Array& src)
{
if (this != &src)
{
if (src.fCount > fReserve)
{
SkDS32Array tmp(src.fArray, src.fCount);
this->swap(tmp);
}
else
{
memcpy(fArray, src.fArray, sizeof(int32_t) * src.fCount);
fCount = src.fCount;
}
}
return *this;
}
int operator==(const SkDS32Array& a, const SkDS32Array& b)
{
return a.fCount == b.fCount &&
(a.fCount == 0 || !memcmp(a.fArray, b.fArray, a.fCount * sizeof(int32_t)));
}
void SkDS32Array::swap(SkDS32Array& other)
{
SkTSwap(fArray, other.fArray);
#ifdef SK_DEBUG
SkTSwap(fData, other.fData);
#endif
SkTSwap(fReserve, other.fReserve);
SkTSwap(fCount, other.fCount);
}
int32_t* SkDS32Array::append(U16CPU count, const int32_t* src)
{
unsigned oldCount = fCount;
if (count)
{
SkASSERT(src == NULL || fArray == NULL ||
src + count <= fArray || fArray + count <= src);
this->growBy(count);
if (src)
memcpy(fArray + oldCount, src, sizeof(int32_t) * count);
}
return fArray + oldCount;
}
int SkDS32Array::find(const int32_t& elem) const
{
const int32_t* iter = fArray;
const int32_t* stop = fArray + fCount;
for (; iter < stop; iter++)
{
if (*iter == elem)
return (int) (iter - fArray);
}
return -1;
}
void SkDS32Array::growBy(U16CPU extra)
{
SkASSERT(extra);
SkASSERT(fCount + extra <= 0xFFFF);
if (fCount + extra > fReserve)
{
size_t size = fCount + extra + 4;
size += size >> 2;
int32_t* array = (int32_t*)sk_malloc_throw(size * sizeof(int32_t));
memcpy(array, fArray, fCount * sizeof(int32_t));
sk_free(fArray);
fArray = array;
#ifdef SK_DEBUG
fData = (int32_t (*)[kDebugArraySize]) fArray;
#endif
fReserve = SkToU16((U16CPU)size);
}
fCount = SkToU16(fCount + extra);
}
int32_t* SkDS32Array::insert(U16CPU index, U16CPU count, const int32_t* src)
{
SkASSERT(count);
int oldCount = fCount;
this->growBy(count);
int32_t* dst = fArray + index;
memmove(dst + count, dst, sizeof(int32_t) * (oldCount - index));
if (src)
memcpy(dst, src, sizeof(int32_t) * count);
return dst;
}
int SkDS32Array::rfind(const int32_t& elem) const
{
const int32_t* iter = fArray + fCount;
const int32_t* stop = fArray;
while (iter > stop)
{
if (*--iter == elem)
return (int) (iter - stop);
}
return -1;
}
#endif