Clean up "test" and "example" projects.
This commit is contained in:
parent
34c9d3a99c
commit
93a286563a
@ -1,7 +1,7 @@
|
|||||||
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
||||||
|
|
||||||
ifneq ($(SANITIZE_ADDRESS),1)
|
ifneq ($(SANITIZE_ADDRESS),1)
|
||||||
XCFLAGS = -Ofast -DNDEBUG -s -static
|
XCFLAGS = -Ofast -flto -DNDEBUG -s -static
|
||||||
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
||||||
XCFLAGS += -march=x86-64 -mtune=nocona
|
XCFLAGS += -march=x86-64 -mtune=nocona
|
||||||
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
||||||
@ -25,7 +25,7 @@ BIN_PATH := bin
|
|||||||
ALL_PATH := $(SRC_PATH) $(BIN_PATH)
|
ALL_PATH := $(SRC_PATH) $(BIN_PATH)
|
||||||
|
|
||||||
BIN_FILE := $(BIN_PATH)/hashset-example$(EXE_SUFFIX)
|
BIN_FILE := $(BIN_PATH)/hashset-example$(EXE_SUFFIX)
|
||||||
SRC_FILE := $(SRC_PATH)/main.c
|
SRC_FILE := $(wildcard $(SRC_PATH)/*.c)
|
||||||
LIB_FILE := ../libhashset/lib/libhashset-1.a
|
LIB_FILE := ../libhashset/lib/libhashset-1.a
|
||||||
|
|
||||||
.PHONY: all build clean
|
.PHONY: all build clean
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="src\input.c" />
|
||||||
<ClCompile Include="src\main.c" />
|
<ClCompile Include="src\main.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -46,6 +47,9 @@
|
|||||||
<Project>{8cf3bd19-28b1-435d-b719-e00b052dfc3a}</Project>
|
<Project>{8cf3bd19-28b1-435d-b719-e00b052dfc3a}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="src\input.h" />
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
@ -18,5 +18,13 @@
|
|||||||
<ClCompile Include="src\main.c">
|
<ClCompile Include="src\main.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\input.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="src\input.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
50
example/src/input.c
Normal file
50
example/src/input.c
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#include "input.h"
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0U]))
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* I/O Functions */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
static const uint64_t INPUT_DATA[] =
|
||||||
|
{
|
||||||
|
UINT64_C(0xEC7D0A721D57EC50), UINT64_C(0x2D6A7AB6BF627C22), UINT64_C(0x4FDD65C766A875B3), UINT64_C(0x820325C26E55AADE), UINT64_C(0xDAAA501D96EEF99B),
|
||||||
|
UINT64_C(0x8144E2BD50513672), UINT64_C(0x292CE22A29D5DB2B), UINT64_C(0xBC6CF8B2053A5334), UINT64_C(0x6D1401A1D373E7D1), UINT64_C(0x24ADEDD753FA66AE),
|
||||||
|
UINT64_C(0xC10245EBF7AA2022), UINT64_C(0x023529AB3C7CD028), UINT64_C(0x36D2B9AC4939E5B6), UINT64_C(0xC03EBAFFF82F66AA), UINT64_C(0xF192D661B62529F8),
|
||||||
|
UINT64_C(0xB704F3B5D339E013), UINT64_C(0xA9FF1DACC3E51172), UINT64_C(0x56B07D81D1075239), UINT64_C(0xB1871C613F7AABE2), UINT64_C(0xA8EF994549F8FE4A),
|
||||||
|
UINT64_C(0xA57BB923C5253144), UINT64_C(0x00D86833851697B3), UINT64_C(0xDA9E46FDD32DC65D), UINT64_C(0x7ACB9C0ADDDFAB93), UINT64_C(0xB5B5850E76C843DB),
|
||||||
|
UINT64_C(0x3B6A7C89C7E81A5D), UINT64_C(0x4EB1262597175FCD), UINT64_C(0xB6FBE2171D1D7EA0), UINT64_C(0x081137EA1D536FC4), UINT64_C(0xE0445CD0FAD5C7DD),
|
||||||
|
UINT64_C(0x893007682A3BF169), UINT64_C(0xD0C19098FBD42472), UINT64_C(0xEDB93F32F0A49B30), UINT64_C(0x2EA9A358058AB291), UINT64_C(0x8DAEDB071BA37583),
|
||||||
|
UINT64_C(0x7D82157789453793), UINT64_C(0xBB2773CA12083932), UINT64_C(0x6303F020DEFC11A9), UINT64_C(0xD41F0AD15E0189DC), UINT64_C(0x19B057F06E39C89E),
|
||||||
|
UINT64_C(0x4253F25E0B30719C), UINT64_C(0x09463D8E5BA23234), UINT64_C(0x34D04E31976724AA), UINT64_C(0x4671121B954F5A79), UINT64_C(0xE92C10C3DB5D8D1B),
|
||||||
|
UINT64_C(0xE9CBC62D55911AE7), UINT64_C(0x2A1AB1C994DB788E), UINT64_C(0xC8C33ECF2C582D77), UINT64_C(0x5FA82FE6C15B629E), UINT64_C(0x466CEED23C511177),
|
||||||
|
UINT64_C(0x036D0870BAE19AE1), UINT64_C(0x6606CC0204159016), UINT64_C(0xD6238C8747BC5852), UINT64_C(0x223E4185F09E378F), UINT64_C(0xA9B3F004F76E5444),
|
||||||
|
UINT64_C(0x23C9471F9E0284DD), UINT64_C(0x8B8FD1A11AA899F1), UINT64_C(0x0AB371E3FC9D3B56), UINT64_C(0xAC2E67112F3A040D), UINT64_C(0x192A053B04315830),
|
||||||
|
UINT64_C(0x432D3397538C1F92), UINT64_C(0xE959C8CB414D0179), UINT64_C(0x2CBAD874DD3E7ED3), UINT64_C(0x27C1B56C45A07443), UINT64_C(0x985DCE41B814DB32),
|
||||||
|
UINT64_C(0x7D89DA5C4F0A66B3), UINT64_C(0x8BDD31E4EBE03149), UINT64_C(0xDE099239E444C693), UINT64_C(0x1ADD95B03AF163A0), UINT64_C(0x36CD32A83DE833F2),
|
||||||
|
UINT64_C(0xDF4A8C3B1DC66B09), UINT64_C(0xC29C92C5A077B9FE), UINT64_C(0x56950ECB370CBC27), UINT64_C(0x7FEAD937FCA475F1), UINT64_C(0x1E4AD443AD9D41EC),
|
||||||
|
UINT64_C(0x9A265C879D7E5872), UINT64_C(0x455AB983F8BA1441), UINT64_C(0x027C2ED163D11C29), UINT64_C(0xA7A7D23CAA6F4DC6), UINT64_C(0xEE7939920BE1E7BC),
|
||||||
|
UINT64_C(0x2AE02B16E28F02F6), UINT64_C(0xFE8A0CB4EB33DA1B), UINT64_C(0x8CCBF16F006BE241), UINT64_C(0x3371EF26F2850DAF), UINT64_C(0xC35EA57F39EA9E58),
|
||||||
|
UINT64_C(0x20977AD263FB0272), UINT64_C(0x29BBDD2B8DFCD944), UINT64_C(0x3EF8BD07A2CA3369), UINT64_C(0x64FC3600F0B37716), UINT64_C(0x53CBD741D2433E51),
|
||||||
|
UINT64_C(0x69459841B5CEE1AB), UINT64_C(0x170B6EBB26B0102C), UINT64_C(0xAF7D361D649AED05), UINT64_C(0x8843B951E1A79CA4), UINT64_C(0xCC0B139063D3EF0A),
|
||||||
|
UINT64_C(0x85CB5DBD53986A64), UINT64_C(0x7C66F5CD3E46FDB7), UINT64_C(0xE863F4436E8BD7F8), UINT64_C(0x82496CD067153344), UINT64_C(0x863F1F732CE3751E),
|
||||||
|
};
|
||||||
|
|
||||||
|
int have_more_items(const size_t offset)
|
||||||
|
{
|
||||||
|
return offset < ARRAY_SIZE(INPUT_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t get_next_item(const size_t offset)
|
||||||
|
{
|
||||||
|
if (offset < ARRAY_SIZE(INPUT_DATA))
|
||||||
|
{
|
||||||
|
return INPUT_DATA[offset];
|
||||||
|
}
|
||||||
|
return 0U;
|
||||||
|
}
|
15
example/src/input.h
Normal file
15
example/src/input.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _EXAMPLE_INPUT_INCLUDED
|
||||||
|
#define _EXAMPLE_INPUT_INCLUDED
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int have_more_items(const size_t offset);
|
||||||
|
uint64_t get_next_item(const size_t offset);
|
||||||
|
|
||||||
|
#endif /*_EXAMPLE_INPUT_INCLUDED*/
|
@ -6,50 +6,7 @@
|
|||||||
#include <hash_set.h>
|
#include <hash_set.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include "input.h"
|
||||||
#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0U]))
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* I/O Functions */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
static const uint64_t INPUT_DATA[] =
|
|
||||||
{
|
|
||||||
UINT64_C(0xEC7D0A721D57EC50), UINT64_C(0x2D6A7AB6BF627C22), UINT64_C(0x4FDD65C766A875B3), UINT64_C(0x820325C26E55AADE), UINT64_C(0xDAAA501D96EEF99B),
|
|
||||||
UINT64_C(0x8144E2BD50513672), UINT64_C(0x292CE22A29D5DB2B), UINT64_C(0xBC6CF8B2053A5334), UINT64_C(0x6D1401A1D373E7D1), UINT64_C(0x24ADEDD753FA66AE),
|
|
||||||
UINT64_C(0xC10245EBF7AA2022), UINT64_C(0x023529AB3C7CD028), UINT64_C(0x36D2B9AC4939E5B6), UINT64_C(0xC03EBAFFF82F66AA), UINT64_C(0xF192D661B62529F8),
|
|
||||||
UINT64_C(0xB704F3B5D339E013), UINT64_C(0xA9FF1DACC3E51172), UINT64_C(0x56B07D81D1075239), UINT64_C(0xB1871C613F7AABE2), UINT64_C(0xA8EF994549F8FE4A),
|
|
||||||
UINT64_C(0xA57BB923C5253144), UINT64_C(0x00D86833851697B3), UINT64_C(0xDA9E46FDD32DC65D), UINT64_C(0x7ACB9C0ADDDFAB93), UINT64_C(0xB5B5850E76C843DB),
|
|
||||||
UINT64_C(0x3B6A7C89C7E81A5D), UINT64_C(0x4EB1262597175FCD), UINT64_C(0xB6FBE2171D1D7EA0), UINT64_C(0x081137EA1D536FC4), UINT64_C(0xE0445CD0FAD5C7DD),
|
|
||||||
UINT64_C(0x893007682A3BF169), UINT64_C(0xD0C19098FBD42472), UINT64_C(0xEDB93F32F0A49B30), UINT64_C(0x2EA9A358058AB291), UINT64_C(0x8DAEDB071BA37583),
|
|
||||||
UINT64_C(0x7D82157789453793), UINT64_C(0xBB2773CA12083932), UINT64_C(0x6303F020DEFC11A9), UINT64_C(0xD41F0AD15E0189DC), UINT64_C(0x19B057F06E39C89E),
|
|
||||||
UINT64_C(0x4253F25E0B30719C), UINT64_C(0x09463D8E5BA23234), UINT64_C(0x34D04E31976724AA), UINT64_C(0x4671121B954F5A79), UINT64_C(0xE92C10C3DB5D8D1B),
|
|
||||||
UINT64_C(0xE9CBC62D55911AE7), UINT64_C(0x2A1AB1C994DB788E), UINT64_C(0xC8C33ECF2C582D77), UINT64_C(0x5FA82FE6C15B629E), UINT64_C(0x466CEED23C511177),
|
|
||||||
UINT64_C(0x036D0870BAE19AE1), UINT64_C(0x6606CC0204159016), UINT64_C(0xD6238C8747BC5852), UINT64_C(0x223E4185F09E378F), UINT64_C(0xA9B3F004F76E5444),
|
|
||||||
UINT64_C(0x23C9471F9E0284DD), UINT64_C(0x8B8FD1A11AA899F1), UINT64_C(0x0AB371E3FC9D3B56), UINT64_C(0xAC2E67112F3A040D), UINT64_C(0x192A053B04315830),
|
|
||||||
UINT64_C(0x432D3397538C1F92), UINT64_C(0xE959C8CB414D0179), UINT64_C(0x2CBAD874DD3E7ED3), UINT64_C(0x27C1B56C45A07443), UINT64_C(0x985DCE41B814DB32),
|
|
||||||
UINT64_C(0x7D89DA5C4F0A66B3), UINT64_C(0x8BDD31E4EBE03149), UINT64_C(0xDE099239E444C693), UINT64_C(0x1ADD95B03AF163A0), UINT64_C(0x36CD32A83DE833F2),
|
|
||||||
UINT64_C(0xDF4A8C3B1DC66B09), UINT64_C(0xC29C92C5A077B9FE), UINT64_C(0x56950ECB370CBC27), UINT64_C(0x7FEAD937FCA475F1), UINT64_C(0x1E4AD443AD9D41EC),
|
|
||||||
UINT64_C(0x9A265C879D7E5872), UINT64_C(0x455AB983F8BA1441), UINT64_C(0x027C2ED163D11C29), UINT64_C(0xA7A7D23CAA6F4DC6), UINT64_C(0xEE7939920BE1E7BC),
|
|
||||||
UINT64_C(0x2AE02B16E28F02F6), UINT64_C(0xFE8A0CB4EB33DA1B), UINT64_C(0x8CCBF16F006BE241), UINT64_C(0x3371EF26F2850DAF), UINT64_C(0xC35EA57F39EA9E58),
|
|
||||||
UINT64_C(0x20977AD263FB0272), UINT64_C(0x29BBDD2B8DFCD944), UINT64_C(0x3EF8BD07A2CA3369), UINT64_C(0x64FC3600F0B37716), UINT64_C(0x53CBD741D2433E51),
|
|
||||||
UINT64_C(0x69459841B5CEE1AB), UINT64_C(0x170B6EBB26B0102C), UINT64_C(0xAF7D361D649AED05), UINT64_C(0x8843B951E1A79CA4), UINT64_C(0xCC0B139063D3EF0A),
|
|
||||||
UINT64_C(0x85CB5DBD53986A64), UINT64_C(0x7C66F5CD3E46FDB7), UINT64_C(0xE863F4436E8BD7F8), UINT64_C(0x82496CD067153344), UINT64_C(0x863F1F732CE3751E),
|
|
||||||
};
|
|
||||||
|
|
||||||
static int have_more_items(const size_t offset)
|
|
||||||
{
|
|
||||||
return offset < ARRAY_SIZE(INPUT_DATA);
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64_t get_next_item(const size_t offset)
|
|
||||||
{
|
|
||||||
if (offset < ARRAY_SIZE(INPUT_DATA))
|
|
||||||
{
|
|
||||||
return INPUT_DATA[offset];
|
|
||||||
}
|
|
||||||
return 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
/* MAIN */
|
/* MAIN */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
||||||
|
|
||||||
ifneq ($(SANITIZE_ADDRESS),1)
|
ifneq ($(SANITIZE_ADDRESS),1)
|
||||||
XCFLAGS = -Ofast -DNDEBUG
|
XCFLAGS = -Ofast -flto -DNDEBUG
|
||||||
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
||||||
XCFLAGS += -march=x86-64 -mtune=nocona
|
XCFLAGS += -march=x86-64 -mtune=nocona
|
||||||
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
DUMPMACHINE := $(shell $(CC) -dumpmachine)
|
||||||
|
|
||||||
ifneq ($(SANITIZE_ADDRESS),1)
|
ifneq ($(SANITIZE_ADDRESS),1)
|
||||||
XCFLAGS = -Ofast -DNDEBUG -s -static
|
XCFLAGS = -Ofast -flto -DNDEBUG -s -static
|
||||||
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
ifneq ($(firstword $(filter x86_64-%,$(DUMPMACHINE))),)
|
||||||
XCFLAGS += -march=x86-64 -mtune=nocona
|
XCFLAGS += -march=x86-64 -mtune=nocona
|
||||||
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
else ifneq ($(firstword $(filter i686-%,$(DUMPMACHINE))),)
|
||||||
@ -25,7 +25,7 @@ BIN_PATH := bin
|
|||||||
ALL_PATH := $(SRC_PATH) $(BIN_PATH)
|
ALL_PATH := $(SRC_PATH) $(BIN_PATH)
|
||||||
|
|
||||||
BIN_FILE := $(BIN_PATH)/hashset-test$(EXE_SUFFIX)
|
BIN_FILE := $(BIN_PATH)/hashset-test$(EXE_SUFFIX)
|
||||||
SRC_FILE := $(SRC_PATH)/main.c
|
SRC_FILE := $(wildcard $(SRC_PATH)/*.c)
|
||||||
LIB_FILE := ../libhashset/lib/libhashset-1.a
|
LIB_FILE := ../libhashset/lib/libhashset-1.a
|
||||||
|
|
||||||
.PHONY: all build clean
|
.PHONY: all build clean
|
||||||
|
@ -40,12 +40,18 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\main.c" />
|
<ClCompile Include="src\main.c" />
|
||||||
|
<ClCompile Include="src\random.c" />
|
||||||
|
<ClCompile Include="src\tests.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\libhashset\libhashset.vcxproj">
|
<ProjectReference Include="..\libhashset\libhashset.vcxproj">
|
||||||
<Project>{8cf3bd19-28b1-435d-b719-e00b052dfc3a}</Project>
|
<Project>{8cf3bd19-28b1-435d-b719-e00b052dfc3a}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="src\random.h" />
|
||||||
|
<ClInclude Include="src\tests.h" />
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>16.0</VCProjectVersion>
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
@ -18,5 +18,19 @@
|
|||||||
<ClCompile Include="src\main.c">
|
<ClCompile Include="src\main.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\random.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\tests.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="src\random.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\tests.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
473
test/src/main.c
473
test/src/main.c
@ -3,457 +3,19 @@
|
|||||||
/* This work has been released under the CC0 1.0 Universal license! */
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#include <hash_set.h>
|
#include "tests.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <time.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#define RUN_TEST_CASE(X) do \
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
# define INLINE __inline__
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
# define INLINE __inline
|
|
||||||
#else
|
|
||||||
# define INLINE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* Utilities */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
#define INVERT(X) do { (X) = (!(X)); } while(0)
|
|
||||||
|
|
||||||
#define UNUSED(X) ((void)X)
|
|
||||||
|
|
||||||
#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0U]))
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define RtlGenRandom SystemFunction036
|
|
||||||
#define getentropy(X,Y) (RtlGenRandom((X),(uint32_t)(Y)) ? 0 : (-1))
|
|
||||||
unsigned char __stdcall RtlGenRandom(void *buffer, uint32_t length);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
size_t offset;
|
|
||||||
uint64_t buffer[16U];
|
|
||||||
}
|
|
||||||
random_t;
|
|
||||||
|
|
||||||
static INLINE void random_init(random_t *const rnd)
|
|
||||||
{
|
|
||||||
memset(rnd, 0, sizeof(random_t));
|
|
||||||
rnd->offset = SIZE_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INLINE uint64_t random_next(random_t *const rnd)
|
|
||||||
{
|
|
||||||
if (rnd->offset >= ARRAY_SIZE(rnd->buffer))
|
|
||||||
{
|
|
||||||
rnd->offset = 0U;
|
|
||||||
if (getentropy(rnd->buffer, sizeof(rnd->buffer)) < 0)
|
|
||||||
{
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rnd->buffer[rnd->offset++];
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PRINT_SET_INFO(X) do \
|
|
||||||
{ \
|
{ \
|
||||||
if (!hash_set_info64(hash_set, &capacity, &valid, &deleted, &limit)) \
|
if (test_function_##X(hash_set) != EXIT_SUCCESS) \
|
||||||
{ \
|
{ \
|
||||||
fprintf(stdout, "[#%d] capacity: %010zu, valid: %010zu, deleted: %010zu, limit: %010zu\n", (X), capacity, valid, deleted, limit); \
|
goto failure; \
|
||||||
fflush(stdout); \
|
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
while(0)
|
while(0)
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* TEST #1 */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
#define MAXIMUM 425984U
|
|
||||||
|
|
||||||
static int dump_callback(const size_t index, const char status, const uint64_t value)
|
|
||||||
{
|
|
||||||
#ifndef NDEBUG
|
|
||||||
printf("%016zX: %c -> %016" PRIX64 "\n", index, status, value);
|
|
||||||
#else
|
|
||||||
UNUSED(index); UNUSED(status); UNUSED(value);
|
|
||||||
#endif
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int test_function_1(hash_set64_t *const hash_set)
|
|
||||||
{
|
|
||||||
size_t r, capacity, valid, deleted, limit;
|
|
||||||
uint64_t i;
|
|
||||||
uint8_t spinner = 0U;
|
|
||||||
|
|
||||||
for (r = 0U; r < 5U; ++r)
|
|
||||||
{
|
|
||||||
for (i = 0; i < MAXIMUM; ++i)
|
|
||||||
{
|
|
||||||
if ((i != 3167U) && (i != 9887U) && (i != 185903U) && (i != 387083U))
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_insert64(hash_set, i);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
printf("Insert operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x0F))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != MAXIMUM - 4U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXIMUM; ++i)
|
|
||||||
{
|
|
||||||
if ((i != 3167U) && (i != 9887U) && (i != 387083U))
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_insert64(hash_set, i);
|
|
||||||
if (error != ((i != 185903U) ? EEXIST : 0))
|
|
||||||
{
|
|
||||||
printf("Insert operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != MAXIMUM - 3U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXIMUM; ++i)
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_contains64(hash_set, i);
|
|
||||||
if (error != ((i != 3167U) && (i != 9887U) && (i != 387083U)) ? 0 : ENOENT)
|
|
||||||
{
|
|
||||||
printf("Contains operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_dump64(hash_set, dump_callback))
|
|
||||||
{
|
|
||||||
puts("Dump operation has failed!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXIMUM; ++i)
|
|
||||||
{
|
|
||||||
if ((i != 3167U) && (i != 9887U) && (i != 216263U) && (i != 387083U))
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_remove64(hash_set, i);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
printf("Remove operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x0F))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != 1U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXIMUM; ++i)
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_contains64(hash_set, i);
|
|
||||||
if (error != ((i != 216263U) ? ENOENT : 0))
|
|
||||||
{
|
|
||||||
printf("Contains operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hash_set_remove64(hash_set, 9887U))
|
|
||||||
{
|
|
||||||
puts("Final remove operation has failed!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_remove64(hash_set, 216263U))
|
|
||||||
{
|
|
||||||
puts("Final remove operation has failed!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != 0U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_SET_INFO(1);
|
|
||||||
puts("---------");
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* TEST #2 */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
#define TEST_SIZE 499979U
|
|
||||||
|
|
||||||
static int test_function_2(hash_set64_t *const hash_set)
|
|
||||||
{
|
|
||||||
size_t r, j, capacity, valid, deleted, limit;
|
|
||||||
uint64_t value;
|
|
||||||
uint8_t spinner = 0U, *test1, *test2;
|
|
||||||
uintptr_t cursor;
|
|
||||||
|
|
||||||
random_t random;
|
|
||||||
random_init(&random);
|
|
||||||
|
|
||||||
test1 = (uint8_t*) malloc(TEST_SIZE * sizeof(uint8_t));
|
|
||||||
if (!test1)
|
|
||||||
{
|
|
||||||
abort(); /*malloc has failed!*/
|
|
||||||
}
|
|
||||||
|
|
||||||
test2 = (uint8_t*) malloc(TEST_SIZE * sizeof(uint8_t));
|
|
||||||
if (!test2)
|
|
||||||
{
|
|
||||||
abort(); /*malloc has failed!*/
|
|
||||||
}
|
|
||||||
|
|
||||||
for (r = 0U; r < 64U; ++r)
|
|
||||||
{
|
|
||||||
memset(test1, 0, TEST_SIZE * sizeof(uint8_t));
|
|
||||||
memset(test2, 0, TEST_SIZE * sizeof(uint8_t));
|
|
||||||
|
|
||||||
for (j = 0U; j < TEST_SIZE / 3U; ++j)
|
|
||||||
{
|
|
||||||
size_t rnd;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rnd = random_next(&random) % TEST_SIZE;
|
|
||||||
}
|
|
||||||
while (test1[rnd]);
|
|
||||||
INVERT(test1[rnd]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0U; j < TEST_SIZE; ++j)
|
|
||||||
{
|
|
||||||
if (test1[j])
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_insert64(hash_set, j);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
printf("Insert operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x0F))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor = 0U;
|
|
||||||
while (!hash_set_iterate64(hash_set, &cursor, &value))
|
|
||||||
{
|
|
||||||
if ((!test1[value]) || test2[value])
|
|
||||||
{
|
|
||||||
puts("Iteration error has been detected!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
INVERT(test2[value]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0U; j < TEST_SIZE; ++j)
|
|
||||||
{
|
|
||||||
if (test1[j] != test2[j])
|
|
||||||
{
|
|
||||||
puts("Iteration error has been detected!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0U; j < TEST_SIZE; ++j)
|
|
||||||
{
|
|
||||||
if (test1[j])
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_remove64(hash_set, j);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
printf("Remove operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x0F))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != 0U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(test1);
|
|
||||||
free(test2);
|
|
||||||
|
|
||||||
PRINT_SET_INFO(2);
|
|
||||||
puts("---------");
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* TEST #3 */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
static int test_function_3(hash_set64_t *const hash_set)
|
|
||||||
{
|
|
||||||
size_t r, capacity, valid, deleted, limit;
|
|
||||||
uint8_t spinner = 0U;
|
|
||||||
clock_t last_update = clock();
|
|
||||||
|
|
||||||
random_t random;
|
|
||||||
random_init(&random);
|
|
||||||
|
|
||||||
for (r = 0U; r < 3U; ++r)
|
|
||||||
{
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
const uint64_t rnd = random_next(&random) & UINT64_C(0x3FFFFFFFFFFFFFF);
|
|
||||||
const errno_t error = hash_set_insert64(hash_set, rnd);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
if (error != EEXIST)
|
|
||||||
{
|
|
||||||
printf("Insert operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(3);
|
|
||||||
printf("Collision detected! [%016" PRIx64 "]\n", rnd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x7F))
|
|
||||||
{
|
|
||||||
const clock_t clock_now = clock();
|
|
||||||
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(3);
|
|
||||||
last_update = clock_now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_SET_INFO(3);
|
|
||||||
|
|
||||||
if (hash_set_clear64(hash_set))
|
|
||||||
{
|
|
||||||
puts("Clear operation has failed!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_SET_INFO(3);
|
|
||||||
puts("---------");
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
/* TEST #4 */
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
#define LIMIT (((uint64_t)UINT32_MAX) >> 2)
|
|
||||||
|
|
||||||
static int test_function_4(hash_set64_t *const hash_set)
|
|
||||||
{
|
|
||||||
size_t capacity, valid, deleted, limit;
|
|
||||||
uint64_t value;
|
|
||||||
uint8_t spinner = 0U;
|
|
||||||
clock_t last_update = clock();
|
|
||||||
|
|
||||||
for (value = 0U; value < LIMIT; ++value)
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_insert64(hash_set, value);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(4);
|
|
||||||
printf("Insert operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x7F))
|
|
||||||
{
|
|
||||||
const clock_t clock_now = clock();
|
|
||||||
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(4);
|
|
||||||
last_update = clock_now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (value = 0U; value < LIMIT; ++value)
|
|
||||||
{
|
|
||||||
const errno_t error = hash_set_remove64(hash_set, value);
|
|
||||||
if (error)
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(4);
|
|
||||||
printf("Remove operation has failed! (error: %d)\n", error);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
if (!(++spinner & 0x7F))
|
|
||||||
{
|
|
||||||
const clock_t clock_now = clock();
|
|
||||||
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
|
||||||
{
|
|
||||||
PRINT_SET_INFO(4);
|
|
||||||
last_update = clock_now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hash_set_size64(hash_set) != 0U)
|
|
||||||
{
|
|
||||||
puts("Invalid size!");
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINT_SET_INFO(4);
|
|
||||||
puts("---------");
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
/* MAIN */
|
/* MAIN */
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
@ -472,32 +34,17 @@ int main(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_function_1(hash_set) != EXIT_SUCCESS)
|
RUN_TEST_CASE(1);
|
||||||
{
|
RUN_TEST_CASE(2);
|
||||||
goto failure;
|
RUN_TEST_CASE(3);
|
||||||
}
|
RUN_TEST_CASE(4);
|
||||||
|
|
||||||
if (test_function_2(hash_set) != EXIT_SUCCESS)
|
|
||||||
{
|
|
||||||
goto failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_function_3(hash_set) != EXIT_SUCCESS)
|
|
||||||
{
|
|
||||||
goto failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_function_4(hash_set) != EXIT_SUCCESS)
|
|
||||||
{
|
|
||||||
goto failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_set_destroy64(hash_set);
|
hash_set_destroy64(hash_set);
|
||||||
puts("Test completed successfully.");
|
puts("Tests completed successfully.");
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
failure:
|
failure:
|
||||||
hash_set_destroy64(hash_set);
|
hash_set_destroy64(hash_set);
|
||||||
puts("Something went wrong !!!");
|
puts("\nSomething went wrong !!!");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
39
test/src/random.c
Normal file
39
test/src/random.c
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#include "random.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0U]))
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define RtlGenRandom SystemFunction036
|
||||||
|
#define getentropy(X,Y) (RtlGenRandom((X),(uint32_t)(Y)) ? 0 : (-1))
|
||||||
|
unsigned char __stdcall RtlGenRandom(void* buffer, uint32_t length);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void random_init(random_t *const rnd)
|
||||||
|
{
|
||||||
|
memset(rnd, 0, sizeof(random_t));
|
||||||
|
rnd->offset = SIZE_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t random_next(random_t *const rnd)
|
||||||
|
{
|
||||||
|
if (rnd->offset >= ARRAY_SIZE(rnd->buffer))
|
||||||
|
{
|
||||||
|
rnd->offset = 0U;
|
||||||
|
if (getentropy(rnd->buffer, sizeof(rnd->buffer)) < 0)
|
||||||
|
{
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rnd->buffer[rnd->offset++];
|
||||||
|
}
|
22
test/src/random.h
Normal file
22
test/src/random.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _TEST_RANDOM_INCLUDED
|
||||||
|
#define _TEST_RANDOM_INCLUDED
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
size_t offset;
|
||||||
|
uint64_t buffer[16U];
|
||||||
|
}
|
||||||
|
random_t;
|
||||||
|
|
||||||
|
void random_init(random_t *const rnd);
|
||||||
|
uint64_t random_next(random_t *const rnd);
|
||||||
|
|
||||||
|
#endif /*_TEST_RANDOM_INCLUDED*/
|
411
test/src/tests.c
Normal file
411
test/src/tests.c
Normal file
@ -0,0 +1,411 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#include "tests.h"
|
||||||
|
#include "random.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define TEST_COUNT 4
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* Utilities */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
#define UNUSED(X) ((void)X)
|
||||||
|
|
||||||
|
#define INVERT(X) do { (X) = (!(X)); } while(0)
|
||||||
|
|
||||||
|
#define PRINT_SET_INFO(X) do \
|
||||||
|
{\
|
||||||
|
if (!hash_set_info64(hash_set, &capacity, &valid, &deleted, &limit)) \
|
||||||
|
{ \
|
||||||
|
fprintf(stdout, "[Test %d/%d] capacity: %010zu, valid: %010zu, deleted: %010zu, limit: %010zu\n", (X), TEST_COUNT, capacity, valid, deleted, limit); \
|
||||||
|
fflush(stdout); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
while(0)
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* TEST #1 */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
#define MAXIMUM 425984U
|
||||||
|
|
||||||
|
static int dump_callback(const size_t index, const char status, const uint64_t value)
|
||||||
|
{
|
||||||
|
#ifndef NDEBUG
|
||||||
|
printf("%016zX: %c -> %016" PRIX64 "\n", index, status, value);
|
||||||
|
#else
|
||||||
|
UNUSED(index); UNUSED(status); UNUSED(value);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_function_1(hash_set64_t *const hash_set)
|
||||||
|
{
|
||||||
|
size_t r, capacity, valid, deleted, limit;
|
||||||
|
uint64_t i;
|
||||||
|
uint8_t spinner = 0U;
|
||||||
|
|
||||||
|
for (r = 0U; r < 5U; ++r)
|
||||||
|
{
|
||||||
|
for (i = 0; i < MAXIMUM; ++i)
|
||||||
|
{
|
||||||
|
if ((i != 3167U) && (i != 9887U) && (i != 185903U) && (i != 387083U))
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_insert64(hash_set, i);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
printf("Insert operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x0F))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != MAXIMUM - 4U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXIMUM; ++i)
|
||||||
|
{
|
||||||
|
if ((i != 3167U) && (i != 9887U) && (i != 387083U))
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_insert64(hash_set, i);
|
||||||
|
if (error != ((i != 185903U) ? EEXIST : 0))
|
||||||
|
{
|
||||||
|
printf("Insert operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != MAXIMUM - 3U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXIMUM; ++i)
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_contains64(hash_set, i);
|
||||||
|
if (error != ((i != 3167U) && (i != 9887U) && (i != 387083U)) ? 0 : ENOENT)
|
||||||
|
{
|
||||||
|
printf("Contains operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_dump64(hash_set, dump_callback))
|
||||||
|
{
|
||||||
|
puts("Dump operation has failed!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXIMUM; ++i)
|
||||||
|
{
|
||||||
|
if ((i != 3167U) && (i != 9887U) && (i != 216263U) && (i != 387083U))
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_remove64(hash_set, i);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
printf("Remove operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x0F))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != 1U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXIMUM; ++i)
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_contains64(hash_set, i);
|
||||||
|
if (error != ((i != 216263U) ? ENOENT : 0))
|
||||||
|
{
|
||||||
|
printf("Contains operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hash_set_remove64(hash_set, 9887U))
|
||||||
|
{
|
||||||
|
puts("Final remove operation has failed!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_remove64(hash_set, 216263U))
|
||||||
|
{
|
||||||
|
puts("Final remove operation has failed!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != 0U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_SET_INFO(1);
|
||||||
|
puts("---------");
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* TEST #2 */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
#define TEST_SIZE 499979U
|
||||||
|
|
||||||
|
int test_function_2(hash_set64_t *const hash_set)
|
||||||
|
{
|
||||||
|
size_t r, j, capacity, valid, deleted, limit;
|
||||||
|
uint64_t value;
|
||||||
|
uint8_t spinner = 0U, *test1, *test2;
|
||||||
|
uintptr_t cursor;
|
||||||
|
|
||||||
|
random_t random;
|
||||||
|
random_init(&random);
|
||||||
|
|
||||||
|
test1 = (uint8_t*) malloc(TEST_SIZE * sizeof(uint8_t));
|
||||||
|
if (!test1)
|
||||||
|
{
|
||||||
|
abort(); /*malloc has failed!*/
|
||||||
|
}
|
||||||
|
|
||||||
|
test2 = (uint8_t*) malloc(TEST_SIZE * sizeof(uint8_t));
|
||||||
|
if (!test2)
|
||||||
|
{
|
||||||
|
abort(); /*malloc has failed!*/
|
||||||
|
}
|
||||||
|
|
||||||
|
for (r = 0U; r < 64U; ++r)
|
||||||
|
{
|
||||||
|
memset(test1, 0, TEST_SIZE * sizeof(uint8_t));
|
||||||
|
memset(test2, 0, TEST_SIZE * sizeof(uint8_t));
|
||||||
|
|
||||||
|
for (j = 0U; j < TEST_SIZE / 3U; ++j)
|
||||||
|
{
|
||||||
|
size_t rnd;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rnd = random_next(&random) % TEST_SIZE;
|
||||||
|
}
|
||||||
|
while (test1[rnd]);
|
||||||
|
INVERT(test1[rnd]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0U; j < TEST_SIZE; ++j)
|
||||||
|
{
|
||||||
|
if (test1[j])
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_insert64(hash_set, j);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
printf("Insert operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x0F))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor = 0U;
|
||||||
|
while (!hash_set_iterate64(hash_set, &cursor, &value))
|
||||||
|
{
|
||||||
|
if ((!test1[value]) || test2[value])
|
||||||
|
{
|
||||||
|
puts("Iteration error has been detected!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
INVERT(test2[value]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0U; j < TEST_SIZE; ++j)
|
||||||
|
{
|
||||||
|
if (test1[j] != test2[j])
|
||||||
|
{
|
||||||
|
puts("Iteration error has been detected!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0U; j < TEST_SIZE; ++j)
|
||||||
|
{
|
||||||
|
if (test1[j])
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_remove64(hash_set, j);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
printf("Remove operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x0F))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != 0U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(test1);
|
||||||
|
free(test2);
|
||||||
|
|
||||||
|
PRINT_SET_INFO(2);
|
||||||
|
puts("---------");
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* TEST #3 */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
int test_function_3(hash_set64_t *const hash_set)
|
||||||
|
{
|
||||||
|
size_t r, capacity, valid, deleted, limit;
|
||||||
|
uint8_t spinner = 0U;
|
||||||
|
clock_t last_update = clock();
|
||||||
|
|
||||||
|
random_t random;
|
||||||
|
random_init(&random);
|
||||||
|
|
||||||
|
for (r = 0U; r < 3U; ++r)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
const uint64_t rnd = random_next(&random) & UINT64_C(0x3FFFFFFFFFFFFFF);
|
||||||
|
const errno_t error = hash_set_insert64(hash_set, rnd);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (error != EEXIST)
|
||||||
|
{
|
||||||
|
printf("Insert operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(3);
|
||||||
|
printf("Collision detected! [%016" PRIx64 "]\n", rnd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x7F))
|
||||||
|
{
|
||||||
|
const clock_t clock_now = clock();
|
||||||
|
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(3);
|
||||||
|
last_update = clock_now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_SET_INFO(3);
|
||||||
|
|
||||||
|
if (hash_set_clear64(hash_set))
|
||||||
|
{
|
||||||
|
puts("Clear operation has failed!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_SET_INFO(3);
|
||||||
|
puts("---------");
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
/* TEST #4 */
|
||||||
|
/* ========================================================================= */
|
||||||
|
|
||||||
|
#define LIMIT (((uint64_t)UINT32_MAX) >> 2)
|
||||||
|
|
||||||
|
int test_function_4(hash_set64_t *const hash_set)
|
||||||
|
{
|
||||||
|
size_t capacity, valid, deleted, limit;
|
||||||
|
uint64_t value;
|
||||||
|
uint8_t spinner = 0U;
|
||||||
|
clock_t last_update = clock();
|
||||||
|
|
||||||
|
for (value = 0U; value < LIMIT; ++value)
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_insert64(hash_set, value);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(4);
|
||||||
|
printf("Insert operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x7F))
|
||||||
|
{
|
||||||
|
const clock_t clock_now = clock();
|
||||||
|
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(4);
|
||||||
|
last_update = clock_now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (value = 0U; value < LIMIT; ++value)
|
||||||
|
{
|
||||||
|
const errno_t error = hash_set_remove64(hash_set, value);
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(4);
|
||||||
|
printf("Remove operation has failed! (error: %d)\n", error);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
if (!(++spinner & 0x7F))
|
||||||
|
{
|
||||||
|
const clock_t clock_now = clock();
|
||||||
|
if ((clock_now < last_update) || (clock_now >= last_update + CLOCKS_PER_SEC))
|
||||||
|
{
|
||||||
|
PRINT_SET_INFO(4);
|
||||||
|
last_update = clock_now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash_set_size64(hash_set) != 0U)
|
||||||
|
{
|
||||||
|
puts("Invalid size!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_SET_INFO(4);
|
||||||
|
puts("---------");
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
16
test/src/tests.h
Normal file
16
test/src/tests.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
/* HashSet for C99, by LoRd_MuldeR <MuldeR2@GMX.de> */
|
||||||
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _TEST_TESTS_INCLUDED
|
||||||
|
#define _TEST_TESTS_INCLUDED
|
||||||
|
|
||||||
|
#include <hash_set.h>
|
||||||
|
|
||||||
|
int test_function_1(hash_set64_t *const hash_set);
|
||||||
|
int test_function_2(hash_set64_t *const hash_set);
|
||||||
|
int test_function_3(hash_set64_t *const hash_set);
|
||||||
|
int test_function_4(hash_set64_t *const hash_set);
|
||||||
|
|
||||||
|
#endif /*_TEST_TESTS_INCLUDED*/
|
Loading…
Reference in New Issue
Block a user