#pragma once
#include <luna/CString.h>
#include <luna/Types.h>

u64 hash_memory(const void* mem, usize size, u64 salt);

template <typename T> u64 hash(const T& value, u64 salt)
{
    return hash_memory(&value, sizeof(value), salt);
}

template <> u64 hash(const char* const& value, u64 salt);

template <typename T> static void swap(T* a, T* b)
{
    char* x = (char*)a;
    char* y = (char*)b;

    usize size = sizeof(T);

    while (size--)
    {
        char t = *x;
        *x = *y;
        *y = t;
        x += 1;
        y += 1;
    }
}