Fixed the crazy code in r5161.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5163 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
nodchip 2010-03-06 10:07:37 +00:00
parent 6376645b69
commit 2dabcb881c
2 changed files with 21 additions and 11 deletions

View File

@ -35,7 +35,7 @@
class VertexLoaderUID
{
u32 vid[5];
size_t hashValue;
size_t hash;
public:
VertexLoaderUID() {}
void InitFromCurrentState(int vtx_attr_group) {
@ -44,7 +44,7 @@ public:
vid[2] = g_VtxAttr[vtx_attr_group].g0.Hex & ~VAT_0_FRACBITS;
vid[3] = g_VtxAttr[vtx_attr_group].g1.Hex & ~VAT_1_FRACBITS;
vid[4] = g_VtxAttr[vtx_attr_group].g2.Hex & ~VAT_2_FRACBITS;
hashValue = hash(*this);
hash = CalculateHash();
}
bool operator < (const VertexLoaderUID &other) const {
// This is complex because of speed.
@ -60,16 +60,20 @@ public:
}
return false;
}
static size_t hash(const VertexLoaderUID& rh) {
bool operator == (const VertexLoaderUID& rh) const {
return hash == rh.hash && std::equal(vid, vid + sizeof(vid) / sizeof(vid[0]), rh.vid);
}
size_t GetHash() const {
return hash;
}
private:
size_t CalculateHash() {
size_t h = -1;
for (int i = 0; i < sizeof(rh.vid) / sizeof(rh.vid[0]); ++i) {
h = h * 137 + rh.vid[i];
for (int i = 0; i < sizeof(vid) / sizeof(vid[0]); ++i) {
h = h * 137 + vid[i];
}
return h;
}
operator size_t() const {
return hashValue;
}
};
class VertexLoader : public Gen::XCodeBlock

View File

@ -37,11 +37,17 @@ static int s_attr_dirty; // bitfield
static VertexLoader *g_VertexLoaders[8];
#ifndef _MSC_VER
#ifdef _MSC_VER
namespace stdext {
inline size_t hash_value(const VertexLoaderUID& uid) {
return uid.GetHash();
}
}
#else
namespace __gnu_cxx {
template<> struct hash<VertexLoaderUID> {
size_t operator()(const VertexLoaderUID& __x) const {
return __x;
size_t operator()(const VertexLoaderUID& uid) const {
return uid.GetHash();
}
};
}