test namespace only

This commit is contained in:
Dennis Eichhorn 2022-09-17 01:00:19 +02:00
parent 24cf23f026
commit 04ab177b23
4 changed files with 258 additions and 277 deletions

View File

@ -117,56 +117,53 @@
namespace Hash {
namespace Meow {
#if !defined(MEOW_HASH_X64_AESNI_H)
#define MEOW_HASH_VERSION 5
#define MEOW_HASH_VERSION_NAME "0.5/calico"
#if !defined(meow_u8)
#if _MSC_VER
#if !defined(__clang__)
#define INSTRUCTION_REORDER_BARRIER _ReadWriteBarrier()
#else
#endif
#if _MSC_VER
#if !defined(__clang__)
#define INSTRUCTION_REORDER_BARRIER _ReadWriteBarrier()
#else
#endif
#include <intrin.h>
#else
#include <x86intrin.h>
#endif
#include <intrin.h>
#else
#include <x86intrin.h>
#endif
#define meow_u8 char unsigned
#define meow_u64 long long unsigned
#define meow_u128 __m128i
#define meow_u8 char unsigned
#define meow_u64 long long unsigned
#define meow_u128 __m128i
#if __x86_64__ || _M_AMD64
#define meow_umm long long unsigned
#define MeowU64From(A, I) (_mm_extract_epi64((A), (I)))
#elif __i386__ || _M_IX86
#define meow_umm int unsigned
#define MeowU64From(A, I) (*(meow_u64 *)&(A))
#else
#error Cannot determine architecture to use!
#endif
#if __x86_64__ || _M_AMD64
#define meow_umm long long unsigned
#define MeowU64From(A, I) (_mm_extract_epi64((A), (I)))
#elif __i386__ || _M_IX86
#define meow_umm int unsigned
#define MeowU64From(A, I) (*(meow_u64 *)&(A))
#else
#error Cannot determine architecture to use!
#endif
#define MeowU32From(A, I) (_mm_extract_epi32((A), (I)))
#define MeowHashesAreEqual(A, B) (_mm_movemask_epi8(_mm_cmpeq_epi8((A), (B))) == 0xFFFF)
#define MeowU32From(A, I) (_mm_extract_epi32((A), (I)))
#define MeowHashesAreEqual(A, B) (_mm_movemask_epi8(_mm_cmpeq_epi8((A), (B))) == 0xFFFF)
#if !defined INSTRUCTION_REORDER_BARRIER
#define INSTRUCTION_REORDER_BARRIER
#endif
#if !defined INSTRUCTION_REORDER_BARRIER
#define INSTRUCTION_REORDER_BARRIER
#endif
#if !defined MEOW_PAGESIZE
#define MEOW_PAGESIZE 4096
#endif
#if !defined MEOW_PAGESIZE
#define MEOW_PAGESIZE 4096
#endif
#if !defined MEOW_PREFETCH
#define MEOW_PREFETCH 4096
#endif
#if !defined MEOW_PREFETCH_LIMIT
#define MEOW_PREFETCH_LIMIT 0x3ff
#endif
#if !defined MEOW_PREFETCH
#define MEOW_PREFETCH 4096
#endif
#if !defined MEOW_PREFETCH_LIMIT
#define MEOW_PREFETCH_LIMIT 0x3ff
#endif
#endif
#define prefetcht0(A) _mm_prefetch((char *)(A), _MM_HINT_T0)
@ -182,52 +179,52 @@ namespace Hash {
#define pxor_clear(A, B) A = _mm_setzero_si128(); // NOTE(casey): pxor_clear is a nonsense thing that is only here because compilers don't detect xor(a, a) is clearing a :(
#define MEOW_MIX_REG(r1, r2, r3, r4, r5, i1, i2, i3, i4) \
aesdec(r1, r2); \
INSTRUCTION_REORDER_BARRIER; \
paddq(r3, i1); \
pxor(r2, i2); \
aesdec(r2, r4); \
INSTRUCTION_REORDER_BARRIER; \
paddq(r5, i3); \
pxor(r4, i4);
aesdec(r1, r2); \
INSTRUCTION_REORDER_BARRIER; \
paddq(r3, i1); \
pxor(r2, i2); \
aesdec(r2, r4); \
INSTRUCTION_REORDER_BARRIER; \
paddq(r5, i3); \
pxor(r4, i4);
#define MEOW_MIX(r1, r2, r3, r4, r5, ptr) \
MEOW_MIX_REG(r1, r2, r3, r4, r5, _mm_loadu_si128( (__m128i *) ((ptr) + 15) ), _mm_loadu_si128( (__m128i *) ((ptr) + 0) ), _mm_loadu_si128( (__m128i *) ((ptr) + 1) ), _mm_loadu_si128( (__m128i *) ((ptr) + 16) ))
MEOW_MIX_REG(r1, r2, r3, r4, r5, _mm_loadu_si128( (__m128i *) ((ptr) + 15) ), _mm_loadu_si128( (__m128i *) ((ptr) + 0) ), _mm_loadu_si128( (__m128i *) ((ptr) + 1) ), _mm_loadu_si128( (__m128i *) ((ptr) + 16) ))
#define MEOW_SHUFFLE(r1, r2, r3, r4, r5, r6) \
aesdec(r1, r4); \
paddq(r2, r5); \
pxor(r4, r6); \
aesdec(r4, r2); \
paddq(r5, r6); \
pxor(r2, r3)
aesdec(r1, r4); \
paddq(r2, r5); \
pxor(r4, r6); \
aesdec(r4, r2); \
paddq(r5, r6); \
pxor(r2, r3)
#if MEOW_DUMP
struct meow_dump
{
meow_u128 xmm[8];
void *Ptr;
char const *Title;
};
extern "C" meow_dump *MeowDumpTo;
meow_dump *MeowDumpTo;
#define MEOW_DUMP_STATE(T, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, ptr) \
if(MeowDumpTo) \
{ \
MeowDumpTo->xmm[0] = xmm0; \
MeowDumpTo->xmm[1] = xmm1; \
MeowDumpTo->xmm[2] = xmm2; \
MeowDumpTo->xmm[3] = xmm3; \
MeowDumpTo->xmm[4] = xmm4; \
MeowDumpTo->xmm[5] = xmm5; \
MeowDumpTo->xmm[6] = xmm6; \
MeowDumpTo->xmm[7] = xmm7; \
MeowDumpTo->Ptr = ptr; \
MeowDumpTo->Title = T; \
++MeowDumpTo; \
}
struct meow_dump
{
meow_u128 xmm[8];
void *Ptr;
char const *Title;
};
extern "C" meow_dump *MeowDumpTo;
meow_dump *MeowDumpTo;
#define MEOW_DUMP_STATE(T, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, ptr) \
if(MeowDumpTo) \
{ \
MeowDumpTo->xmm[0] = xmm0; \
MeowDumpTo->xmm[1] = xmm1; \
MeowDumpTo->xmm[2] = xmm2; \
MeowDumpTo->xmm[3] = xmm3; \
MeowDumpTo->xmm[4] = xmm4; \
MeowDumpTo->xmm[5] = xmm5; \
MeowDumpTo->xmm[6] = xmm6; \
MeowDumpTo->xmm[7] = xmm7; \
MeowDumpTo->Ptr = ptr; \
MeowDumpTo->Title = T; \
++MeowDumpTo; \
}
#else
#define MEOW_DUMP_STATE(...)
#define MEOW_DUMP_STATE(...)
#endif
static meow_u8 MeowShiftAdjust[32] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
@ -742,9 +739,6 @@ namespace Hash {
}
MeowEnd(&State, SeedResult);
}
#define MEOW_HASH_X64_AESNI_H
#endif
}
}
#endif

View File

@ -17,38 +17,34 @@
#include "StringUtils.h"
namespace Utils {
class ArrayUtils {
private:
public:
static inline
char* get_arg(const char *id, char **argv, int length)
{
if (Utils::StringUtils::is_number(id)) {
return argv[atoi(id)];
}
for (int i = 0; i < length - 1; ++i) {
if (strcmp(id, argv[i]) == 0) {
return argv[i + 1];
}
}
return NULL;
namespace ArrayUtils {
inline
char* get_arg(const char *id, char **argv, int length)
{
if (Utils::StringUtils::is_number(id)) {
return argv[atoi(id)];
}
static inline
bool has_arg(const char *id, char **argv, int length)
{
for (int i = 0; i < length; ++i) {
if (strcmp(id, argv[i]) == 0) {
return true;
}
for (int i = 0; i < length - 1; ++i) {
if (strcmp(id, argv[i]) == 0) {
return argv[i + 1];
}
return false;
}
};
return NULL;
}
inline
bool has_arg(const char *id, char **argv, int length)
{
for (int i = 0; i < length; ++i) {
if (strcmp(id, argv[i]) == 0) {
return true;
}
}
return false;
}
}
#endif

View File

@ -28,95 +28,91 @@
#endif
namespace Utils {
class FileUtils {
private:
public:
static inline
bool file_exists (char *filename)
{
#ifdef _WIN32
#ifdef _MSC_VER
return _access_s(filename, 0) == 0;
#else
return access(filename, 0) == 0;
#endif
#elif defined __linux__
struct stat buffer;
return stat(filename, &buffer) == 0;
namespace FileUtils {
inline
bool file_exists (char *filename)
{
#ifdef _WIN32
#ifdef _MSC_VER
return _access_s(filename, 0) == 0;
#else
return access(filename, 0) == 0;
#endif
}
#elif defined __linux__
struct stat buffer;
return stat(filename, &buffer) == 0;
#endif
}
static inline
time_t last_modification (char *filename)
{
#ifdef _WIN32
FILETIME modtime;
HANDLE h;
inline
time_t last_modification (char *filename)
{
#ifdef _WIN32
FILETIME modtime;
HANDLE h;
h = CreateFileW(filename, GENERIC_READ | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL);
if (h == INVALID_HANDLE_VALUE) {
return (time_t) 0;
}
if (GetFileTime(h, NULL, NULL, &modtime) == 0) {
return (time_t) 0;
}
unsinged long long seconds = modtime.dwHighDateTime << 32;
seconds |= modtime.dwLowDateTime;
return (seconds - 116444736000000000) / 10000000;
#elif defined __linux__
struct stat buffer;
stat(filename, &buffer);
(time_t) buffer.st_mtim.tv_sec;
#endif
}
char* file_extension (char *filename)
{
char *dot = strrchr(filename, '.');
if (!dot || dot == filename) {
return "";
h = CreateFileW(filename, GENERIC_READ | FILE_WRITE_ATTRIBUTES, 0, NULL, OPEN_EXISTING, 0, NULL);
if (h == INVALID_HANDLE_VALUE) {
return (time_t) 0;
}
return dot + 1;
}
typedef struct {
char *content;
int size;
} file_body;
static inline
file_body read_file (char *filename)
{
file_body file = {0};
FILE *fp = fopen(filename, "rb");
if (!fp) {
return NULL;
if (GetFileTime(h, NULL, NULL, &modtime) == 0) {
return (time_t) 0;
}
fseek(fp, 0, SEEK_END);
file.size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsinged long long seconds = modtime.dwHighDateTime << 32;
seconds |= modtime.dwLowDateTime;
file.content = malloc(file.size);
if (!file.content) {
fprintf(stderr, "CRITICAL: malloc failed");
}
return (seconds - 116444736000000000) / 10000000;
#elif defined __linux__
struct stat buffer;
stat(filename, &buffer);
fread(file.content, file.size, 1, fp);
(time_t) buffer.st_mtim.tv_sec;
#endif
}
fclose(fp);
char* file_extension (char *filename)
{
char *dot = strrchr(filename, '.');
return file;
if (!dot || dot == filename) {
return "";
}
};
return dot + 1;
}
typedef struct {
char *content;
int size;
} file_body;
inline
file_body read_file (char *filename)
{
file_body file = {0};
FILE *fp = fopen(filename, "rb");
if (!fp) {
return NULL;
}
fseek(fp, 0, SEEK_END);
file.size = ftell(fp);
fseek(fp, 0, SEEK_SET);
file.content = malloc(file.size);
if (!file.content) {
fprintf(stderr, "CRITICAL: malloc failed");
}
fread(file.content, file.size, 1, fp);
fclose(fp);
return file;
}
}
#endif

View File

@ -17,130 +17,125 @@
#include "ArraySort.h"
namespace Utils {
class StringUtils {
private:
public:
static inline
bool is_number(const char *s)
{
while (*s != '\0') {
if (!isdigit(*s)) {
return false;
}
++s;
namespace StringUtils {
inline
bool is_number(const char *s)
{
while (*s != '\0') {
if (!isdigit(*s)) {
return false;
}
return true;
++s;
}
typedef struct {
char **values;
int *masks;
int size;
} text_diff;
return true;
}
static
text_diff computeLCSDiff (char **from, int fromSize, char **to, int toSize)
{
char **diffValues = malloc(fromSize * toSize * sizeof(char *));
int *diffMasks = calloc(fromSize * toSize, sizeof(int));
typedef struct {
char **values;
int *masks;
int size;
} text_diff;
int *dm = calloc((fromSize + 1) * (toSize + 1), sizeof(int));
text_diff computeLCSDiff (char **from, int fromSize, char **to, int toSize)
{
char **diffValues = malloc(fromSize * toSize * sizeof(char *));
int *diffMasks = calloc(fromSize * toSize, sizeof(int));
if (!diffValues || !diffMasks || !dm) {
fprintf(stderr, "CRITICAL: malloc failed");
int *dm = calloc((fromSize + 1) * (toSize + 1), sizeof(int));
if (!diffValues || !diffMasks || !dm) {
fprintf(stderr, "CRITICAL: malloc failed");
}
int i = 0;
int j = 0;
/* Handled with calloc
for (j = 0; j <= toSize; ++j) {
dm[0 + j] = 0;
}
for (i = 1; i <= fromSize; ++i) {
dm[i * fromSize + 0] = 0;
}
*/
for (i = 1; i <= fromSize; ++i) {
for (j = 1; j <= toSize; ++j) {
dm[i * fromSize + j] = strcmp(from[i - 1], to[j - 1]) == 0
? dm[(i - 1) * fromSize + (j - 1)] + 1
: oms_max(dm[(i - 1) * fromSize + j], dm[i * fromSize + (j - 1)]);
}
}
int i = 0;
int j = 0;
int diffIndex = 0;
/* Handled with calloc
for (j = 0; j <= toSize; ++j) {
dm[0 + j] = 0;
}
i = fromSize;
j = toSize;
for (i = 1; i <= fromSize; ++i) {
dm[i * fromSize + 0] = 0;
}
*/
for (i = 1; i <= fromSize; ++i) {
for (j = 1; j <= toSize; ++j) {
dm[i * fromSize + j] = strcmp(from[i - 1], to[j - 1]) == 0
? dm[(i - 1) * fromSize + (j - 1)] + 1
: oms_max(dm[(i - 1) * fromSize + j], dm[i * fromSize + (j - 1)]);
}
}
int diffIndex = 0;
i = fromSize;
j = toSize;
while (i > 0 || j > 0) {
if (j > 0 && dm[i * fromSize + (j - 1)] == dm[i * fromSize + j]) {
diffValues[diffIndex] = malloc((strlen(to[j - 1]) + 1) * sizeof(char));
if (!diffValues[diffIndex]) {
fprintf(stderr, "CRITICAL: malloc failed");
}
strcpy(diffValues[diffIndex], to[j - 1]);
diffMasks[diffIndex] = 1;
--j;
++diffIndex;
continue;
while (i > 0 || j > 0) {
if (j > 0 && dm[i * fromSize + (j - 1)] == dm[i * fromSize + j]) {
diffValues[diffIndex] = malloc((strlen(to[j - 1]) + 1) * sizeof(char));
if (!diffValues[diffIndex]) {
fprintf(stderr, "CRITICAL: malloc failed");
}
if (i > 0 && dm[(i - 1) * fromSize + j] == dm[i * fromSize + j]) {
diffValues[diffIndex] = malloc((strlen(from[i - 1]) + 1) * sizeof(char));
if (!diffValues[diffIndex]) {
fprintf(stderr, "CRITICAL: malloc failed");
}
strcpy(diffValues[diffIndex], to[j - 1]);
diffMasks[diffIndex] = 1;
strcpy(diffValues[diffIndex], from[i - 1]);
diffMasks[diffIndex] = -1;
--j;
++diffIndex;
--i;
++diffIndex;
continue
}
continue;
}
if (i > 0 && dm[(i - 1) * fromSize + j] == dm[i * fromSize + j]) {
diffValues[diffIndex] = malloc((strlen(from[i - 1]) + 1) * sizeof(char));
if (!diffValues[diffIndex]) {
fprintf(stderr, "CRITICAL: malloc failed");
}
strcpy(diffValues[diffIndex], from[i - 1]);
/* Handled with calloc
diffMasks[diffIndex] = 0;
*/
diffMasks[diffIndex] = -1;
--i;
--j;
++diffIndex;
continue
}
free(dm);
diffValues = realloc(diffValues, diffIndex * sizeof(char *));
diffMasks = realloc(diffMasks, diffIndex * sizeof(int));
if (!diffValues || !diffMasks) {
diffValues[diffIndex] = malloc((strlen(from[i - 1]) + 1) * sizeof(char));
if (!diffValues[diffIndex]) {
fprintf(stderr, "CRITICAL: malloc failed");
}
ArraySort::reverse_char(diffValues, diffIndex);
ArraySort::reverse_int(diffMasks, diffIndex);
strcpy(diffValues[diffIndex], from[i - 1]);
return text_diff { diffValues, diffMasks, diffIndex };
/* Handled with calloc
diffMasks[diffIndex] = 0;
*/
--i;
--j;
++diffIndex;
}
};
free(dm);
diffValues = realloc(diffValues, diffIndex * sizeof(char *));
diffMasks = realloc(diffMasks, diffIndex * sizeof(int));
if (!diffValues || !diffMasks) {
fprintf(stderr, "CRITICAL: malloc failed");
}
ArraySort::reverse_char(diffValues, diffIndex);
ArraySort::reverse_int(diffMasks, diffIndex);
return text_diff { diffValues, diffMasks, diffIndex };
}
}
#endif