#include <string>
+#include <boost/shared_ptr.hpp>
+
#include <Moof/Hash.hh>
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;
-
- static ptr_map_t ptrs_;
- std::string name_;
-
-public:
- explicit Mippleton(const std::string& name) :
- name_(name) {}
+ typedef std::pair<unsigned,T*> PtrValue;
+ typedef stlplus::hash<std::string,PtrValue,getHash> PtrMap;
- inline const std::string& getName() const
- {
- return name_;
- }
+ static PtrMap ptrs_;
+ std::string name_;
inline static T* retain(const std::string& name)
{
- typename ptr_map_t::iterator it = ptrs_.find(name);
+ typename PtrMap::iterator it = ptrs_.find(name);
if (it != ptrs_.end())
{
else
{
T* newObj = new T(name);
- ptrs_.insert(ptr_map_pair_t(name, ptr_value_t(1, newObj)));
+ ptrs_.insert(std::make_pair(name, std::make_pair(1, newObj)));
return newObj;
}
}
+ inline static void release(T* obj)
+ {
+ releaseByName(obj->name_);
+ }
+
inline static void releaseByName(const std::string& name)
{
- typename ptr_map_t::iterator it;
+ typename PtrMap::iterator it;
if ((it = ptrs_.find(name)) != ptrs_.end() && --(*it).second.first == 0)
{
}
}
- inline static void release(T* obj)
+public:
+ explicit Mippleton(const std::string& name) :
+ name_(name) {}
+
+ inline const std::string& getName() const
+ {
+ return name_;
+ }
+
+ inline 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*> >
+stlplus::hash< std::string,std::pair<unsigned,T*>,getHash >
Mippleton<T>::ptrs_;