X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FMippleton.hh;h=a27a6c5023645e049fe51cebe6055a34964cda9c;hp=9ef960276b34a8d9384557d2b2a8d690c36d7488;hb=a31d65a998121df0651c57bfb68782e2a07d2e2f;hpb=bfa6212d09d8735d8fd5e2638188e4a99f21ada4 diff --git a/src/Moof/Mippleton.hh b/src/Moof/Mippleton.hh index 9ef9602..a27a6c5 100644 --- a/src/Moof/Mippleton.hh +++ b/src/Moof/Mippleton.hh @@ -40,6 +40,8 @@ #include +#include + #include @@ -49,28 +51,17 @@ namespace Mf { template class Mippleton { - typedef std::pair ptr_value_t; - typedef std::pair ptr_map_pair_t; - typedef stlplus::hash ptr_map_t; - //typedef std::map ptr_map_t; + typedef std::pair PtrValue; + typedef stlplus::hash 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 getInstance(const std::string& name) { - releaseByName(obj->getName()); + return boost::shared_ptr(retain(name), &release); } }; template -stlplus::hash< std::string,std::pair,hash_string > -//std::map< std::string,std::pair > - Mippleton::ptrs_; +stlplus::hash< std::string,std::pair,getHash > + Mippleton::mPtrMap; } // namespace Mf