]> git.tdb.fi Git - libs/gl.git/blobdiff - source/tag.cpp
Make Tag directly comparable and use it as a key in relevant maps
[libs/gl.git] / source / tag.cpp
index 8e29bee1f3eba6f97665bc9abd0e3fb60dd24d99..76adf7d1b53ccd5e681686335132ff6b265f64b7 100644 (file)
@@ -1,28 +1,35 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007, 2010  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
 #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(0)
-{
-       for(const char *i=s; *i; ++i)
-               id=id*id+*i;
-}
+       id(s ? hash<const char *>(s, 0) : 0)
+{ }
 
 Tag::Tag(const std::string &s):
-       id(0)
-{
-       for(std::string::const_iterator i=s.begin(); i!=s.end(); ++i)
-               id=id*id+*i;
-}
+       id(hash(s.begin(), s.end()))
+{ }
 
 } // namespace GL
 } // namespace Msp