diff --git a/config.mk b/config.mk index cc29fc2..db4d098 100644 --- a/config.mk +++ b/config.mk @@ -1,6 +1,6 @@ -DUMPMACHINE := $(shell $(CC) -dumpmachine) +DUMPMACHINE := $(strip $(shell $(CC) -dumpmachine)) ifeq ($(DUMPMACHINE),) - $(error The C compiler could not be detected!) + $(error C compiler could not be detected!) endif ifneq ($(DEBUG),) diff --git a/hashset.sln b/hashset.sln index 74bba12..ad77cd8 100644 --- a/hashset.sln +++ b/hashset.sln @@ -11,10 +11,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{1E EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{42437750-05E3-4DB6-AADA-FB44E73729B0}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-hash-set", "test\hash-set\hashset-test.vcxproj", "{0B7ABB95-B60F-418B-8386-930B1629058F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-hash-set", "test\hash-set\test-hash-set.vcxproj", "{0B7ABB95-B60F-418B-8386-930B1629058F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example-hash-map", "example\hash-map\hash-map-example.vcxproj", "{C703A94D-2755-40AD-A8D4-C169E14DCF5F}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-hash-map", "test\hash-map\test-hash-map.vcxproj", "{903FEC5F-92A1-4EE0-A6E7-47B31742DA68}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -100,6 +102,24 @@ Global {C703A94D-2755-40AD-A8D4-C169E14DCF5F}.Static|x64.Build.0 = Static|x64 {C703A94D-2755-40AD-A8D4-C169E14DCF5F}.Static|x86.ActiveCfg = Static|Win32 {C703A94D-2755-40AD-A8D4-C169E14DCF5F}.Static|x86.Build.0 = Static|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|ARM64.Build.0 = Debug|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|x64.ActiveCfg = Debug|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|x64.Build.0 = Debug|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|x86.ActiveCfg = Debug|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Debug|x86.Build.0 = Debug|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|ARM64.ActiveCfg = Shared|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|ARM64.Build.0 = Shared|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|x64.ActiveCfg = Shared|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|x64.Build.0 = Shared|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|x86.ActiveCfg = Shared|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Shared|x86.Build.0 = Shared|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|ARM64.ActiveCfg = Static|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|ARM64.Build.0 = Static|ARM64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|x64.ActiveCfg = Static|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|x64.Build.0 = Static|x64 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|x86.ActiveCfg = Static|Win32 + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68}.Static|x86.Build.0 = Static|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -108,6 +128,7 @@ Global {8FB9B9DE-DC49-4224-892B-589422484766} = {1EFCA710-2528-41D7-B757-F4615301DCA2} {0B7ABB95-B60F-418B-8386-930B1629058F} = {42437750-05E3-4DB6-AADA-FB44E73729B0} {C703A94D-2755-40AD-A8D4-C169E14DCF5F} = {1EFCA710-2528-41D7-B757-F4615301DCA2} + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68} = {42437750-05E3-4DB6-AADA-FB44E73729B0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC8E0EA3-7ABA-4BA8-B2E1-D9A43934BA40} diff --git a/test/hash-map/Makefile b/test/hash-map/Makefile new file mode 100644 index 0000000..fb0a08d --- /dev/null +++ b/test/hash-map/Makefile @@ -0,0 +1,26 @@ +include ../../config.mk + +CFLAGS = -std=c99 -D_DEFAULT_SOURCE -Wpedantic -I../../libhashset/include $(XCFLAGS) +LDFLAGS = -L../../libhashset/lib -lhashset-1 $(XLDFLAGS) + +SRC_PATH := src +BIN_PATH := bin +ALL_PATH := $(SRC_PATH) $(BIN_PATH) + +BIN_FILE := $(BIN_PATH)/test-hash-set$(EXE_SUFFIX) +SRC_FILE := $(wildcard $(SRC_PATH)/*.c) + +.PHONY: all build clean + +all: clean build + +build: $(ALL_PATH) $(BIN_FILE) + +$(BIN_FILE): $(SRC_FILE) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +$(ALL_PATH): + mkdir -p $@ + +clean: + rm -vf $(BIN_FILE) diff --git a/test/hash-map/src/main.c b/test/hash-map/src/main.c new file mode 100644 index 0000000..8018811 --- /dev/null +++ b/test/hash-map/src/main.c @@ -0,0 +1,47 @@ +/******************************************************************************/ +/* HashSet for C99, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#include "tests.h" +#include +#include + +#define RUN_TEST_CASE(X) do \ +{ \ + if (test_function_##X(hash_set) != EXIT_SUCCESS) \ + { \ + goto failure; \ + } \ +} \ +while(0) + +/* ========================================================================= */ +/* MAIN */ +/* ========================================================================= */ + +int main(void) +{ + hash_map64_t *hash_set; + + printf("LibHashSet Hash-Map Test v%" PRIu16 ".%" PRIu16 ".%" PRIu16 " [%s]\n\n", + HASHSET_VERSION_MAJOR, HASHSET_VERSION_MINOR, HASHSET_VERSION_PATCH, HASHSET_BUILD_DATE); + + hash_set = hash_map_create64(0U, -1.0); + if (!hash_set) + { + puts("Allocation has failed!"); + return EXIT_FAILURE; + } + + RUN_TEST_CASE(1); + + hash_map_destroy64(hash_set); + puts("Tests completed successfully."); + return EXIT_SUCCESS; + +failure: + hash_map_destroy64(hash_set); + puts("\nSomething went wrong !!!"); + return EXIT_FAILURE; +} diff --git a/test/hash-map/src/random.c b/test/hash-map/src/random.c new file mode 100644 index 0000000..bd13c50 --- /dev/null +++ b/test/hash-map/src/random.c @@ -0,0 +1,39 @@ +/******************************************************************************/ +/* HashSet for C99, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#include "random.h" +#include + +#ifndef _WIN32 +# include +#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++]; +} diff --git a/test/hash-map/src/random.h b/test/hash-map/src/random.h new file mode 100644 index 0000000..f7b698b --- /dev/null +++ b/test/hash-map/src/random.h @@ -0,0 +1,22 @@ +/******************************************************************************/ +/* HashSet for C99, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#ifndef _TEST_RANDOM_INCLUDED +#define _TEST_RANDOM_INCLUDED + +#include +#include + +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*/ diff --git a/test/hash-map/src/tests.c b/test/hash-map/src/tests.c new file mode 100644 index 0000000..c7e5fc7 --- /dev/null +++ b/test/hash-map/src/tests.c @@ -0,0 +1,146 @@ +/******************************************************************************/ +/* HashSet for C99, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#include "tests.h" +#include "random.h" + +#include +#include +#include +#include +#include + +#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_map_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 TEST_SIZE 499979U + +int test_function_1(hash_map64_t *const hash_set) +{ + size_t r, j, cursor, capacity, valid, deleted, limit; + uint64_t key, value; + uint8_t spinner = 0U, *test1, *test2; + + 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_map_insert64(hash_set, j, 0U); + 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_map_iterate64(hash_set, &cursor, &key, &value)) + { + if ((!test1[key]) || test2[key]) + { + puts("Iteration error has been detected!"); + return EXIT_FAILURE; + } + INVERT(test2[key]); + } + + 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_map_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_map_size64(hash_set) != 0U) + { + puts("Invalid size!"); + return EXIT_FAILURE; + } + } + + free(test1); + free(test2); + + PRINT_SET_INFO(2); + puts("---------"); + + return EXIT_SUCCESS; +} diff --git a/test/hash-map/src/tests.h b/test/hash-map/src/tests.h new file mode 100644 index 0000000..650be00 --- /dev/null +++ b/test/hash-map/src/tests.h @@ -0,0 +1,13 @@ +/******************************************************************************/ +/* HashSet for C99, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#ifndef _TEST_TESTS_INCLUDED +#define _TEST_TESTS_INCLUDED + +#include + +int test_function_1(hash_map64_t *const hash_set); + +#endif /*_TEST_TESTS_INCLUDED*/ diff --git a/test/hash-map/test-hash-map.vcxproj b/test/hash-map/test-hash-map.vcxproj new file mode 100644 index 0000000..5b0a80e --- /dev/null +++ b/test/hash-map/test-hash-map.vcxproj @@ -0,0 +1,456 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Shared + ARM64 + + + Shared + Win32 + + + Shared + x64 + + + Static + ARM64 + + + Static + Win32 + + + Debug + x64 + + + Static + x64 + + + + + + + + + + + + + + {8cf3bd19-28b1-435d-b719-e00b052dfc3a} + + + + 16.0 + Win32Proj + {903FEC5F-92A1-4EE0-A6E7-47B31742DA68} + test-hash-map + 10.0.19041.0 + test-hash-map + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + true + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + false + $(SolutionDir)\bin\$(PlatformToolset)\$(Platform)\$(Configuration)\ + $(ProjectDir)\obj\$(PlatformToolset)\$(Platform)\$(Configuration)\ + + + + Level3 + false + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\libhashset\include + + + Console + true + true + 5.1 + + + + + + Level4 + true + true + false + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreaded + false + StreamingSIMDExtensions + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + 5.1 + true + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + + + Level4 + true + true + false + WIN32;NDEBUG;_CONSOLE;HASHSET_DLL;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreadedDLL + false + StreamingSIMDExtensions + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + 5.1 + true + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + copy /B /Y /N "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" "$(TargetDir)libhashset-1.dll" + + + cp "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" -> "$(TargetDir)libhashset-1.dll" + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\libhashset\include + + + Console + true + 5.2 + + + + + + Level3 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\libhashset\include + + + Console + true + + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreaded + false + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + 5.2 + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreaded + false + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;HASHSET_DLL;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreadedDLL + false + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + 5.2 + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + copy /B /Y /N "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" "$(TargetDir)libhashset-1.dll" + + + cp "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" -> "$(TargetDir)libhashset-1.dll" + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;HASHSET_DLL;%(PreprocessorDefinitions) + true + AnySuitable + true + MultiThreadedDLL + false + false + MaxSpeed + Speed + true + $(SolutionDir)\libhashset\include + Fast + + + Console + true + true + false + UseLinkTimeCodeGeneration + advapi32.dll + delayimp.lib;%(AdditionalDependencies) + + + + copy /B /Y /N "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" "$(TargetDir)libhashset-1.dll" + + + cp "$(SolutionDir)lib\$(PlatformToolset)\$(Platform)\$(Configuration)\libhashset-1.dll" -> "$(TargetDir)libhashset-1.dll" + + + + + + \ No newline at end of file diff --git a/test/hash-set/hashset-test.vcxproj.filters b/test/hash-map/test-hash-map.vcxproj.filters similarity index 100% rename from test/hash-set/hashset-test.vcxproj.filters rename to test/hash-map/test-hash-map.vcxproj.filters diff --git a/test/hash-set/_test-hash-set.vcxproj.filters b/test/hash-set/_test-hash-set.vcxproj.filters new file mode 100644 index 0000000..100d11c --- /dev/null +++ b/test/hash-set/_test-hash-set.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/test/hash-set/src/main.c b/test/hash-set/src/main.c index eb7754a..623c084 100644 --- a/test/hash-set/src/main.c +++ b/test/hash-set/src/main.c @@ -24,7 +24,7 @@ int main(void) { hash_set64_t *hash_set; - printf("LibHashSet Test v%" PRIu16 ".%" PRIu16 ".%" PRIu16 " [%s]\n\n", + printf("LibHashSet Hash-Set Test v%" PRIu16 ".%" PRIu16 ".%" PRIu16 " [%s]\n\n", HASHSET_VERSION_MAJOR, HASHSET_VERSION_MINOR, HASHSET_VERSION_PATCH, HASHSET_BUILD_DATE); hash_set = hash_set_create64(0U, -1.0); diff --git a/test/hash-set/hashset-test.vcxproj b/test/hash-set/test-hash-set.vcxproj similarity index 100% rename from test/hash-set/hashset-test.vcxproj rename to test/hash-set/test-hash-set.vcxproj diff --git a/test/hash-set/test-hash-set.vcxproj.filters b/test/hash-set/test-hash-set.vcxproj.filters new file mode 100644 index 0000000..100d11c --- /dev/null +++ b/test/hash-set/test-hash-set.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file