X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FLibrary.hh;fp=src%2FMoof%2FLibrary.hh;h=1d5af36c34b6f22cff945ad3e8be5bb9d6001434;hp=0000000000000000000000000000000000000000;hb=bffc879fc8ee8167bb123310d39fad4e2f426ffd;hpb=9619ed3cee0f9e465ad2747fcb4f1f6cb6d3d889 diff --git a/src/Moof/Library.hh b/src/Moof/Library.hh new file mode 100644 index 0000000..1d5af36 --- /dev/null +++ b/src/Moof/Library.hh @@ -0,0 +1,122 @@ + +/******************************************************************************* + + 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_LIBRARY_HH_ +#define _MOOF_LIBRARY_HH_ + +/** + * @file Library.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 + +#include + + +namespace Mf { + + +template +class Library +{ + typedef std::pair PtrValue; + typedef stlplus::hash PtrMap; + + static PtrMap mPtrMap; + std::string mName; + + static T* retain(const std::string& name) + { + typename PtrMap::iterator it = mPtrMap.find(name); + + if (it != mPtrMap.end()) + { + ++((*it).second.first); + return (*it).second.second; + } + else + { + T* newObj(new T(name)); + if (newObj) + { + mPtrMap.insert(std::make_pair(name, std::make_pair(1, newObj))); + } + return newObj; + } + } + + static void release(T* obj) + { + releaseByName(obj->mName); + } + + 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; + mPtrMap.erase((*it).first); + } + } + +public: + + explicit Library(const std::string& name) : + mName(name) {} + + const std::string& getName() const + { + return mName; + } + + static boost::shared_ptr getInstance(const std::string& name) + { + return boost::shared_ptr(retain(name), &release); + } +}; + +template +stlplus::hash< std::string,std::pair,getHash > + Library::mPtrMap; + + +} // namespace Mf + +#endif // _MOOF_LIBRARY_HH_ + +/** vim: set ts=4 sw=4 tw=80: *************************************************/ +