Files
CDAG/Research/core/Hashers.h

48 lines
1.2 KiB
C++

#pragma once
#include <unordered_map>
#include "Defines.h"
#include "../inc/glm/common.hpp"
#include "BitHelper.h"
namespace std {
// Perfect hash
template<>
struct hash<glm::u8vec3> {
size_t operator()(glm::u8vec3 const &value) const {
return (((size_t) value.x) << 16) + (((size_t) value.y) << 8) + value.z;
}
};
// Perfect hash for 64 bit
template<>
struct hash<glm::u16vec3> {
size_t operator()(glm::u16vec3 const &value) const {
#ifdef ENVIRONMENT64
return (((size_t)value.x) << 32) | (((size_t)value.y) << 16) | (size_t)value.z;
#else
return (((size_t) value.x) << 16) ^ (((size_t) value.y) << 8) ^ (size_t) value.z;
#endif
}
};
template<>
struct hash<glm::u16vec2> {
size_t operator()(glm::u16vec2 const &value) const {
// Perfect hash even for 32 bits
return (size_t) value.x << 16 | value.y;
}
};
template<>
struct hash<glm::uvec3> {
size_t operator()(glm::uvec3 const &value) const {
#ifdef ENVIRONMENT64
return (((size_t)value.x) << 32) ^ (((size_t)value.y) << 16) ^ (size_t)value.z;
#else
return BitHelper::CircularShiftLeft(value.x, unsigned(16)) ^
BitHelper::CircularShiftLeft(value.y, unsigned(8)) ^ value.z;
#endif
}
};
}