void ArrayBase::Insert(int inPos) { if (inPos>=length) __SetSize(length+1); else { __SetSize(length+1); int s = GetElementSize(); memmove(mBase + inPos*s + s, mBase+inPos*s, (length-inPos-1)*s ); } }
void ArrayBase::RemoveElement(int inPos) { if (inPos<length) { int s = GetElementSize(); memmove(mBase + inPos*s, mBase+inPos*s + s, (length-inPos-1)*s ); __SetSize(length-1); } }
void ArrayBase::Blit(int inDestElement, ArrayBase *inSourceArray, int inSourceElement, int inElementCount) { int srcSize = inSourceArray->GetElementSize(); int srcElems = inSourceArray->length; if (inDestElement<0 || inSourceElement<0 || inSourceElement+inElementCount>srcElems) hx::Throw( HX_CSTRING("blit out of bounds") ); if (srcSize!=GetElementSize()) hx::Throw( HX_CSTRING("blit array mismatch") ); int newSize = inDestElement + inElementCount; if (newSize>length) __SetSize(newSize); const char *src = inSourceArray->mBase + inSourceElement*srcSize; char *dest = mBase + inDestElement*srcSize; int len = inElementCount*srcSize; if (src+len < dest || dest+len<src) memcpy(dest,src,len); else memmove(dest,src,len); }
void ArrayBase::Splice(ArrayBase *outResult,int inPos,int inLen) { if (inPos>=length) { return; } else if (inPos<0) { inPos += length; if (inPos<0) inPos =0; } if (inLen<0) return; if (inPos+inLen>length) inLen = length - inPos; outResult->__SetSize(inLen); int s = GetElementSize(); memcpy(outResult->mBase, mBase+inPos*s, s*inLen); memmove(mBase+inPos*s, mBase + (inPos+inLen)*s, (length-(inPos+inLen))*s); __SetSize(length-inLen); }