]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Mippleton.hh
minor refactoring and state progress
[chaz/yoink] / src / Moof / Mippleton.hh
index 9ef960276b34a8d9384557d2b2a8d690c36d7488..a27a6c5023645e049fe51cebe6055a34964cda9c 100644 (file)
@@ -40,6 +40,8 @@
 
 #include <string>
 
+#include <boost/shared_ptr.hpp>
+
 #include <Moof/Hash.hh>
 
 
@@ -49,28 +51,17 @@ namespace Mf {
 template <class T>
 class Mippleton
 {
-       typedef std::pair<unsigned,T*>                                                          ptr_value_t;
-       typedef std::pair<std::string,ptr_value_t>                                      ptr_map_pair_t;
-       typedef stlplus::hash<std::string,ptr_value_t,hash_string>      ptr_map_t;
-       //typedef std::map<std::string,ptr_value_t>     ptr_map_t;
+       typedef std::pair<unsigned,T*>                                                  PtrValue;
+       typedef stlplus::hash<std::string,PtrValue,getHash>             PtrMap;
 
-       static ptr_map_t        ptrs_;
-       std::string                     name_;
+       static PtrMap   mPtrMap;
+       std::string             mName;
 
-public:
-       explicit Mippleton(const std::string& name) :
-               name_(name) {}
-
-       inline const std::string& getName() const
+       static T* retain(const std::string& name)
        {
-               return name_;
-       }
+               typename PtrMap::iterator it = mPtrMap.find(name);
 
-       inline static T* retain(const std::string& name)
-       {
-               typename ptr_map_t::iterator it = ptrs_.find(name);
-
-               if (it != ptrs_.end())
+               if (it != mPtrMap.end())
                {
                        ++((*it).second.first);
                        return (*it).second.second;
@@ -78,32 +69,46 @@ public:
                else
                {
                        T* newObj = new T(name);
-                       ptrs_.insert(ptr_map_pair_t(name, ptr_value_t(1, newObj)));
+                       mPtrMap.insert(std::make_pair(name, std::make_pair(1, newObj)));
                        return newObj; 
                }
        }
 
-       inline static void releaseByName(const std::string& name)
+       static void release(T* obj)
        {
-               typename ptr_map_t::iterator it;
+               releaseByName(obj->mName);
+       }
 
-               if ((it = ptrs_.find(name)) != ptrs_.end() && --(*it).second.first == 0)
+       static void releaseByName(const std::string& name)
+       {
+               typename PtrMap::iterator it;
+
+               if ((it = mPtrMap.find(name)) != mPtrMap.end() && --(*it).second.first == 0)
                {
                        delete (*it).second.second;
-                       ptrs_.erase((*it).first);
+                       mPtrMap.erase((*it).first);
                }
        }
 
-       inline static void release(T* obj)
+public:
+
+       explicit Mippleton(const std::string& name) :
+               mName(name) {}
+
+       const std::string& getName() const
+       {
+               return mName;
+       }
+
+       static boost::shared_ptr<T> getInstance(const std::string& name)
        {
-               releaseByName(obj->getName());
+               return boost::shared_ptr<T>(retain(name), &release);
        }
 };
 
 template <class T>
-stlplus::hash< std::string,std::pair<unsigned,T*>,hash_string >
-//std::map< std::string,std::pair<unsigned,T*> >
-       Mippleton<T>::ptrs_;
+stlplus::hash< std::string,std::pair<unsigned,T*>,getHash >
+       Mippleton<T>::mPtrMap;
 
 
 } // namespace Mf
This page took 0.024737 seconds and 4 git commands to generate.