/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "crypto/random/Random.h"
#include "memory/MallocAllocator.h"
#include "util/Assert.h"
#define Set_NAME OfInts
#define Set_TYPE uint32_t
#include "util/Set.h"
static inline int compareHighOnly(const uint32_t* a, const uint32_t* b)
{
return (*a >> 16) - (*b >> 16);
}
static inline uint32_t hashCodeHighOnly(const uint32_t* a)
{
return *a >> 16;
}
#define Set_COMPARE compareHighOnly
#define Set_HASHCODE hashCodeHighOnly
#define Set_NAME OfIntsHighOnly
#define Set_TYPE uint32_t
#include "util/Set.h"
#include
#include
#define CYCLES 1
#define COUNT 100
static void simpleTest(struct Allocator* alloc, struct Random* rand)
{
struct Set_OfInts* set = Set_OfInts_new(alloc);
uint32_t size;
Random_bytes(rand, (uint8_t*) &size, 4);
size = (size % 4096) + 101;
uint32_t* buff = Allocator_malloc(alloc, size * sizeof(uint32_t));
Random_bytes(rand, (uint8_t*)buff, size * sizeof(uint32_t));
for (uint32_t i = 0; i < size; i++) {
int size = set->size;
if (Set_OfInts_add(set, &buff[i]) != size + 1) {
int ok = 0;
for (uint32_t j = 0; j < i; j++) {
if (buff[j] == buff[i]) { ok = 1; break; }
}
Assert_true(ok);
} else {
for (uint32_t j = 0; j < i; j++) { Assert_true(buff[j] != buff[i]); }
}
}
uint32_t* val;
Set_FOREACH(OfInts, set, val) {
int size = set->size;
Assert_true(val == Set_OfInts_remove(set, val));
Assert_true(set->size == size - 1);
}
Assert_true(set->size == 0);
for (uint32_t i = 0; i < COUNT; i++) {
buff[i] = i;
Assert_true(set->size == (int)i);
Assert_true(Set_OfInts_add(set, &buff[i]) == (int) i+1);
}
for (uint32_t i = 0; i < COUNT; i++) {
uint32_t num = i;
Assert_true(Set_OfInts_get(set, &num) == &buff[i]);
}
}
static void comparitorTest(struct Allocator* alloc, struct Random* rand)
{
struct Set_OfIntsHighOnly* set = Set_OfIntsHighOnly_new(alloc);
uint32_t buff[5] = { 0, 1, 100000, 100001, 200000 };
uint32_t res[3] = { 0, 100000, 200000 };
for (uint32_t i = 0; i < 5; i++) { Set_OfIntsHighOnly_add(set, &buff[i]); }
Assert_true(set->size == 3);
int i = 0;
struct Set_OfIntsHighOnly_Iter iter;
for (Set_OfIntsHighOnly_iter(set, &iter); iter.val; Set_OfIntsHighOnly_iterNext(&iter)) {
Assert_true(i < 3);
Assert_true(*iter.val == res[i++]);
}
}
int main()
{
struct Allocator* mainAlloc = MallocAllocator_new(20000);
struct Random* rand = Random_new(mainAlloc, NULL, NULL);
for (int cycles = 0; cycles < CYCLES; cycles++) {
struct Allocator* alloc = MallocAllocator_new(1<<25);
simpleTest(alloc, rand);
Allocator_free(alloc);
alloc = MallocAllocator_new(1<<18);
comparitorTest(alloc, rand);
Allocator_free(alloc);
}
Allocator_free(mainAlloc);
return 0;
}