22class OrderedResizeableArray :
public ResizeableArray {
24 OrderedResizeableArray(int32_t newElementSize, int32_t keyNumBits, int32_t newKeyOffset = 0,
25 int32_t newMaxNumEmptySpacesToKeep = 16, int32_t newNumExtraSpacesToAllocate = 15);
26 int32_t search(int32_t key, int32_t comparison, int32_t rangeBegin, int32_t rangeEnd);
27 inline int32_t search(int32_t key, int32_t comparison, int32_t rangeBegin = 0) {
28 return search(key, comparison, rangeBegin, numElements);
31 int32_t searchExact(int32_t key);
32 int32_t insertAtKey(int32_t key,
bool isDefinitelyLast =
false);
33 void deleteAtKey(int32_t key);
39#if TEST_VECTOR_DUPLICATES
41 void testDuplicates();
48 inline int32_t getKeyAtIndex(int32_t i) {
return getKeyAtMemoryLocation(getElementAddress(i)); }
50 inline void setKeyAtIndex(int32_t key, int32_t i) { setKeyAtMemoryLocation(key, getElementAddress(i)); }
53 inline int32_t getKeyAtMemoryLocation(
void* address) {
54 int32_t keyBig = *(uint32_t*)((uint32_t)address + keyOffset) << keyShiftAmount;
55 return keyBig >> keyShiftAmount;
58 inline void setKeyAtMemoryLocation(int32_t key,
void* address) {
59 uint32_t offsetAddress = (uint32_t)address + keyOffset;
60 uint32_t prevContents = *(uint32_t*)offsetAddress;
61 *(uint32_t*)offsetAddress = (key & keyMask) | (prevContents & ~keyMask);
65 const uint32_t keyMask;
66 const int32_t keyOffset;
67 const int32_t keyShiftAmount;
72class OrderedResizeableArrayWith32bitKey :
public OrderedResizeableArray {
74 explicit OrderedResizeableArrayWith32bitKey(int32_t newElementSize, int32_t newMaxNumEmptySpacesToKeep = 16,
75 int32_t newNumExtraSpacesToAllocate = 15);
76 void shiftHorizontal(int32_t amount, int32_t effectiveLength);
77 void searchDual(int32_t
const* __restrict__ searchTerms, int32_t* __restrict__ resultingIndexes);
78 void searchMultiple(int32_t* __restrict__ searchTerms, int32_t numSearchTerms, int32_t rangeEnd = -1);
79 bool generateRepeats(int32_t wrapPoint, int32_t endPos);
80#if TEST_VECTOR_SEARCH_MULTIPLE
82 void testSearchMultiple();
85 inline int32_t getKeyAtIndex(int32_t i) {
return getKeyAtMemoryLocation(getElementAddress(i)); }
87 inline void setKeyAtIndex(int32_t key, int32_t i) { setKeyAtMemoryLocation(key, getElementAddress(i)); }
91 inline int32_t getKeyAtMemoryLocation(
void* address) {
return *(int32_t*)address; }
94 inline void setKeyAtMemoryLocation(int32_t key,
void* address) { *(int32_t*)address = key; }