diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-02-06 17:02:21 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-02-06 17:02:21 -0500 |
commit | d0d9c819b9ce20e7b9a666449c3b5c7007ff7ac0 (patch) | |
tree | 0edd4eef7034f16cf1bf6899b6bde47c84cd1b33 | |
parent | b03bc5764785394930beaabe4f685fa6dfa3c8ce (diff) |
ModuleCollection no longer a child of ScSortedCollection.
-rw-r--r-- | sc/source/core/tool/callform.cxx | 86 |
1 files changed, 45 insertions, 41 deletions
diff --git a/sc/source/core/tool/callform.cxx b/sc/source/core/tool/callform.cxx index 5fa4d8739c58..10fefe7a60aa 100644 --- a/sc/source/core/tool/callform.cxx +++ b/sc/source/core/tool/callform.cxx @@ -39,6 +39,8 @@ #include "global.hxx" #include "adiasync.hxx" +#include <boost/ptr_container/ptr_map.hpp> + //------------------------------------------------------------------------ extern "C" { @@ -154,74 +156,81 @@ bool FuncCollection::SearchFunc( const rtl::OUString& rName, sal_uInt16& rIndex } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -class ModuleData : public ScDataObject +class ModuleData { friend class ModuleCollection; rtl::OUString aName; osl::Module* pInstance; public: - ModuleData(const String& rStr, osl::Module* pInst) : aName (rStr), pInstance (pInst) {} - ModuleData(const ModuleData& rData) : ScDataObject(), aName (rData.aName) {pInstance = new osl::Module(aName);} + ModuleData(const rtl::OUString& rStr, osl::Module* pInst) : aName(rStr), pInstance(pInst) {} + ModuleData(const ModuleData& rData) : aName(rData.aName) {pInstance = new osl::Module(aName);} ~ModuleData() { delete pInstance; } - virtual ScDataObject* Clone() const { return new ModuleData(*this); } const rtl::OUString& GetName() const { return aName; } osl::Module* GetInstance() const { return pInstance; } void FreeInstance() { delete pInstance; pInstance = 0; } + + struct less : public ::std::binary_function<ModuleData, ModuleData, bool> + { + bool operator() (const ModuleData& left, const ModuleData& right) const + { + return ScGlobal::GetpTransliteration()->compareString(left.GetName(), right.GetName()) < 0; + } + }; }; -//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -class ModuleCollection : public ScSortedCollection +namespace { + +class ModuleCollection { + typedef boost::ptr_map<rtl::OUString, ModuleData> MapType; + MapType maData; public: - ModuleCollection(sal_uInt16 nLim = 4, sal_uInt16 nDel = 4, sal_Bool bDup = false) : ScSortedCollection ( nLim, nDel, bDup ) {} - ModuleCollection(const ModuleCollection& rModuleCollection) : ScSortedCollection ( rModuleCollection ) {} - - virtual ScDataObject* Clone() const { return new ModuleCollection(*this); } - ModuleData* operator[]( const sal_uInt16 nIndex) const {return (ModuleData*)At(nIndex);} - virtual short Compare(ScDataObject* pKey1, ScDataObject* pKey2) const; - bool SearchModule( - const rtl::OUString& rName, const ModuleData*& rpModule ) const; + ModuleCollection() {} + ModuleCollection(const ModuleCollection& r) : maData(r.maData) {} + + const ModuleData* findByName(const rtl::OUString& rName) const; + void insert(ModuleData* pNew); + void clear(); }; -static ModuleCollection aModuleCollection; +ModuleCollection aModuleCollection; -//------------------------------------------------------------------------ +} -short ModuleCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const +const ModuleData* ModuleCollection::findByName(const rtl::OUString& rName) const { - return (short) ScGlobal::GetpTransliteration()->compareString( - ((ModuleData*)pKey1)->aName, ((ModuleData*)pKey2)->aName ); + MapType::const_iterator it = maData.find(rName); + return it == maData.end() ? NULL : it->second; } -//------------------------------------------------------------------------ +void ModuleCollection::insert(ModuleData* pNew) +{ + if (!pNew) + return; + + rtl::OUString aName = pNew->GetName(); + maData.insert(aName, pNew); +} -bool ModuleCollection::SearchModule( - const rtl::OUString& rName, const ModuleData*& rpModule ) const +void ModuleCollection::clear() { - sal_uInt16 nIndex; - ModuleData aSearchModule(rName, 0); - sal_Bool bFound = Search( &aSearchModule, nIndex ); - if (bFound) - rpModule = (ModuleData*)At(nIndex); - else - rpModule = 0; - return bFound; + maData.clear(); } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= bool InitExternalFunc(const rtl::OUString& rModuleName) { - // Module schon geladen? - const ModuleData* pTemp; - if (aModuleCollection.SearchModule(rModuleName, pTemp)) + // Module already loaded? + const ModuleData* pTemp = aModuleCollection.findByName(rModuleName); + if (pTemp) return false; rtl::OUString aNP; aNP = rModuleName; - sal_Bool bRet = false; + bool bRet = false; osl::Module* pLib = new osl::Module( aNP ); if (pLib->is()) { @@ -241,7 +250,7 @@ bool InitExternalFunc(const rtl::OUString& rModuleName) // Module in die Collection aufnehmen ModuleData* pModuleData = new ModuleData(rModuleName, pLib); - aModuleCollection.Insert(pModuleData); + aModuleCollection.insert(pModuleData); // Schnittstelle initialisieren AdvData pfCallBack = &ScAddInAsyncCallBack; @@ -297,12 +306,7 @@ bool InitExternalFunc(const rtl::OUString& rModuleName) void ExitExternalFunc() { - sal_uInt16 nCount = aModuleCollection.GetCount(); - for (sal_uInt16 i=0; i<nCount; i++) - { - ModuleData* pData = aModuleCollection[i]; - pData->FreeInstance(); - } + aModuleCollection.clear(); } //------------------------------------------------------------------------ |