Search by range (dozen)
Bazist opened this issue · comments
Поиск по диапазону принимает указатель на ключи... но не принимает их длину. Таким образом, реально могут использоваться только ключи длиной в 32бита. 2хuint32 уже никак -- ибо мы не знаем, где ключ кончается:
`
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include "HArrayInt.h"
#include "HArrayVarRAM.h"
using namespace std;
uint32 totalHArrayTime = 0;
uint32 totalDenseTime = 0;
uint32 totalMapTime = 0;
uint32 totalUnorderedMapTime = 0;
HArrayVarRAM ha;
ulong64 msclock()
{
return (ulong64)clock() * 1000 / CLOCKS_PER_SEC; //in ms
}
uint32 key(const char* c) {
char* key1 = new char[sizeof(uint32)];
memset(key1,0,sizeof(uint32));
strcpy(key1,c);
return (uint32)(*key1);
}
void search(const char* msg, uint32* key1,uint32* key2) {
HArrayFixPair pairs[32];
uint32 val = ha.getKeysAndValuesByRange(pairs,sizeof(pairs)/sizeof(HArrayFixPair),key1,key2);
printf("%s %d\n",msg,val);
for( int i=0; i<val; i++ ) {
printf(" val %d = %d/%d\n",i,pairs[i].Key[0],pairs[i].Value);
}
}
int main()
{
printf("Pointer size: %ld\n", sizeof(void*));
uint32 key1 = key("AAA");
printf("key1: %d\n",key1);
uint32 key2 = key("BAA");
printf("key2: %d\n",key2);
uint32 key3 = key("CAA");
printf("key3: %d\n",key3);
uint32 key4 = key("DAA");
printf("key4: %d\n",key4);
ha.init(26);
ha.insert(&key1,sizeof(uint32),12345678);
ha.insert(&key2,sizeof(uint32),22345678);
ha.insert(&key3,sizeof(uint32),32345678);
uint32 ret = ha.getValueByKey(&key1, sizeof(uint32));
printf("%d -> %d\n",key1,ret);
ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);
ret = ha.getValueByKey(&key3, sizeof(uint32));
printf("%d -> %d\n",key3,ret);
search("search",&key1,&key4);
// delete
printf("delete %d\n",key2);
ha.delValueByKey(&key2, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);
printf("delete again %d\n",key2);
ha.delValueByKey(&key2, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);
printf("delete fake %d\n",key4);
ha.delValueByKey(&key4, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key4, sizeof(uint32));
printf("%d -> %d\n",key4,ret);
search("search after del",&key1,&key4);
// search by reverse
search("rev search",&key4,&key1);
// search by same
search("search same key",&key1,&key1);
// search limitations
uint32 key20[] = { 100 };
uint32 key21[] = { 100, 500 };
uint32 key22[] = { 100, 600 };
uint32 key23[] = { 200 };
ha.insert(key20,sizeof(key20),1100);
ha.insert(key21,sizeof(key21),1100500);
ha.insert(key22,sizeof(key22),1100600);
ha.insert(key23,sizeof(key23),1200);
ret = ha.getValueByKey(key20, sizeof(key20));
printf("%d -> %d\n",key20,ret);
ret = ha.getValueByKey(key21, sizeof(key21));
printf("%d -> %d\n",key21,ret);
ret = ha.getValueByKey(key22, sizeof(key22));
printf("%d -> %d\n",key22,ret);
ret = ha.getValueByKey(key23, sizeof(key23));
printf("%d -> %d\n",key23,ret);
search("search 20..23",key20,key23);
search("search 21..22",key21,key22);
ha.printStat();
ha.destroy();
return 0;
};
`
Тут передали указатели на ключ 22 и 23. Но код смотрит только на 100, так что и возвращает всё, что имеет 100 в первом сегменте`
Works !
void testRange()
{
HArray ha;
ha.init(26);
uint32 key1[] = {100, 200};
uint32 key2[] = {200, 300, 400};
uint32 key3[] = {200, 300, 500};
uint32 key4[] = {300, 400, 500, 600};
uint32 key5[] = {300, 500, 600};
uint32 key6[] = {300};
uint32 key7[] = {400, 500};
ha.insert(key1, sizeof(key1), 1);
ha.insert(key2, sizeof(key2), 2);
ha.insert(key3, sizeof(key3), 3);
ha.insert(key4, sizeof(key4), 4);
ha.insert(key5, sizeof(key5), 5);
ha.insert(key6, sizeof(key6), 6);
ha.insert(key7, sizeof(key7), 7);
HArrayPair* pairs = new HArrayPair[10];
uint32 count = ha.getKeysAndValuesByRange(pairs,
10,
key6,
8,
key2,
4);
for(uint32 i=0; i<count; i++)
{
printf("%u\n", pairs[i].Value);
}
}