]> git.tdb.fi Git - libs/gl.git/commitdiff
Make Tag directly comparable and use it as a key in relevant maps
authorMikko Rasa <tdb@tdb.fi>
Thu, 4 Feb 2010 14:12:45 +0000 (14:12 +0000)
committerMikko Rasa <tdb@tdb.fi>
Thu, 4 Feb 2010 14:12:45 +0000 (14:12 +0000)
source/pipeline.cpp
source/pipeline.h
source/tag.cpp
source/tag.h
source/technique.cpp
source/technique.h

index 5969246ba7010f37b976eef4972a81a11ad7eff6..9d5870cd1a6b03dbc71a1f4d444948684ca83a9c 100644 (file)
@@ -37,17 +37,17 @@ Pipeline::~Pipeline()
 
 PipelinePass &Pipeline::add_pass(const Tag &tag)
 {
-       if(passes.count(tag.id))
+       if(passes.count(tag))
                throw KeyError("Pass already exists");
 
-       PipelinePass &pass=passes[tag.id];
+       PipelinePass &pass=passes[tag];
        pass_order.push_back(tag);
        return pass;
 }
 
 PipelinePass &Pipeline::get_pass(const Tag &tag)
 {
-       map<unsigned, PipelinePass>::iterator i=passes.find(tag.id);
+       PassMap::iterator i=passes.find(tag);
        if(i==passes.end())
                throw KeyError("Unknown pass");
        return i->second;
@@ -55,7 +55,7 @@ PipelinePass &Pipeline::get_pass(const Tag &tag)
 
 const PipelinePass &Pipeline::get_pass(const Tag &tag) const
 {
-       map<unsigned, PipelinePass>::const_iterator i=passes.find(tag.id);
+       PassMap::const_iterator i=passes.find(tag);
        if(i==passes.end())
                throw KeyError("Unknown pass");
        return i->second;
index afa9ed5ed525f1ecce5caaab550b1afcacf22c67..8edd679507ccbd9e8e0cc37f8b334f5f823a495d 100644 (file)
@@ -24,7 +24,9 @@ class Texture2D;
 class Pipeline: public Renderable
 {
 private:
-       std::map<unsigned, PipelinePass> passes;
+       typedef std::map<Tag, PipelinePass> PassMap;
+
+       PassMap passes;
        std::vector<Tag> pass_order;
        std::vector<const Renderable *> renderables;
        std::vector<Effect *> effects;
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
index b2d4fd512b9a10c4c777950eda43ed8943005b9e..47c4643e1fa8e27fd5fe73fe96c84ce78650d938 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007, 2010  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -20,6 +20,9 @@ struct Tag
        Tag(): id(0) { }
        Tag(const char *);
        Tag(const std::string &s);
+
+       bool operator<(const Tag &t) const { return id<t.id; }
+       bool operator==(const Tag &t) const { return id==t.id; }
 };
 
 } // namespace GL
index 53c7a9ae76cacdc3ba68b05bd54db5000de452e2..c7bd25ed1a70e51f920a72436255f9070e29aa02 100644 (file)
@@ -26,18 +26,18 @@ Technique::Technique():
 
 Technique::~Technique()
 {
-       for(map<unsigned, ObjectPass>::iterator i=passes.begin(); i!=passes.end(); ++i)
+       for(PassMap::iterator i=passes.begin(); i!=passes.end(); ++i)
                delete i->second.shdata;
 }
 
 bool Technique::has_pass(const GL::Tag &tag) const
 {
-       return passes.count(tag.id);
+       return passes.count(tag);
 }
 
 const ObjectPass &Technique::get_pass(const GL::Tag &tag) const
 {
-       map<unsigned, ObjectPass>::const_iterator i=passes.find(tag.id);
+       PassMap::const_iterator i=passes.find(tag);
        if(i==passes.end())
                throw KeyError("Unknown pass");
        return i->second;
@@ -76,7 +76,7 @@ Technique::Loader::Loader(Technique &t, Collection &c):
 
 void Technique::Loader::finish()
 {
-       for(map<unsigned, ObjectPass>::iterator i=tech.passes.begin(); i!=tech.passes.end(); ++i)
+       for(PassMap::iterator i=tech.passes.begin(); i!=tech.passes.end(); ++i)
                if(i->second.shdata)
                {
                        for(unsigned j=0; j<tech.textures.size(); ++j)
@@ -97,12 +97,12 @@ void Technique::Loader::material_inline()
 
 void Technique::Loader::pass(const string &n)
 {
-       unsigned id=Tag(n).id;
-       if(tech.passes.count(id))
+       Tag tag(n);
+       if(tech.passes.count(tag))
                throw KeyError("Duplicate pass name", n);
        ObjectPass p;
        load_sub(p, coll);
-       tech.passes[id]=p;
+       tech.passes[tag]=p;
 }
 
 void Technique::Loader::shader(const string &n)
index ef7e9e12e451f942fba1431b175d8bb4bfc0693b..468131f75724cc1a39e6922a0539942991a51db8 100644 (file)
@@ -58,9 +58,11 @@ private:
                TextureSlot(): texture(0) { }
        };
 
+       typedef std::map<Tag, ObjectPass> PassMap;
+
        std::vector<TextureSlot> textures;
        const Texture *main_texture;
-       std::map<unsigned, ObjectPass> passes;
+       PassMap passes;
        ObjectPass *normal_pass;
        const Material *material;