From 81ff940d1bea07447f8218ab9a764fbf393431e8 Mon Sep 17 00:00:00 2001 From: Charles McGarvey Date: Sat, 23 Jan 2010 18:19:16 -0700 Subject: [PATCH 1/1] included manager class --- src/Moof/Manager.hh | 116 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/Moof/Manager.hh diff --git a/src/Moof/Manager.hh b/src/Moof/Manager.hh new file mode 100644 index 0000000..89c2076 --- /dev/null +++ b/src/Moof/Manager.hh @@ -0,0 +1,116 @@ + +/******************************************************************************* + + Copyright (c) 2009, Charles McGarvey + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +#ifndef _MOOF_MANAGER_HH_ +#define _MOOF_MANAGER_HH_ + +/** + * @file Manager.hh + * A library is a collection of named objects of the same type. Libraries use + * reference counting to automagically delete objects which no longer have any + * interested code. + */ + +#include + +#include + +#include + + +namespace Mf { + + +template +class Manager +{ +public: + + Manager() : + mRetainCount(1) {} + + const std::string& getName() const + { + return mName; + } + + static boost::shared_ptr getInstance(const std::string& name) + { + return boost::shared_ptr(retain(name), &release); + } + +private: + + typedef stlplus::hash PtrMap; + + static PtrMap mPtrMap; + std::string mName; + unsigned mRetainCount; + + static T* retain(const std::string& name) + { + typename PtrMap::iterator it = mPtrMap.find(name); + + if (it != mPtrMap.end()) + { + ++((*it).second->mRetainCount); + return (*it).second; + } + else + { + T* newObj(new T); + if (newObj) + { + newObj->mName = name; + newObj->init(name); + mPtrMap.insert(std::make_pair(name, newObj)); + } + return newObj; + } + } + + static void release(T* obj) + { + if (--(obj->mRetainCount) == 0) + { + mPtrMap.erase(obj->mName); + delete obj; + } + } +}; + +template +stlplus::hash Manager::mPtrMap; + + +} // namespace Mf + +#endif // _MOOF_MANAGER_HH_ + +/** vim: set ts=4 sw=4 tw=80: *************************************************/ + -- 2.43.0