48 lines
1.2 KiB
C++
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
|
|
}
|
|
};
|
|
} |