Constructing tags mostly happens when loading datafiles or otherwise
outside the rendering loop, so the small extra overhead from a
cross-library function call is not significant. Renderables that wish to
compare the Tag against a fixed value should avoid constructing the
reference Tag on every render call anyway.
+#include <cstring>
+#include <msp/core/hash.h>
#include "tag.h"
-namespace {
-
-template<typename T>
-inline unsigned hash(T begin, T end)
-{
- unsigned result = 0;
- for(T i=begin; (i!=end && *i); ++i)
- result = ((result>>29)|(result<<5))^static_cast<unsigned char>(*i);
- return result;
-}
-
-}
-
namespace Msp {
namespace GL {
Tag::Tag(const char *s):
- id(s ? hash<const char *>(s, 0) : 0)
+ id((s && *s) ? hash32(s, strlen(s)) : 0)
{ }
Tag::Tag(const std::string &s):
- id(hash(s.begin(), s.end()))
+ id(s.empty() ? 0 : hash32(s))
{ }
} // namespace GL