summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2012-02-06 21:22:29 -0500
committerKohei Yoshida <kohei.yoshida@suse.com>2012-02-06 21:23:23 -0500
commit9ccaa4b1468527bbec12d7e0fccf4ea443478f50 (patch)
treea37b33a47e32b402f8c54ff1b1ffedc409674844
parent2bf1a98da8a5bf0e8a0f28c0f2d8846dc17970d4 (diff)
FuncCollection no longer a child of ScSortedCollection.
-rw-r--r--sc/inc/callform.hxx40
-rw-r--r--sc/source/core/data/funcdesc.cxx8
-rw-r--r--sc/source/core/inc/adiasync.hxx13
-rw-r--r--sc/source/core/tool/adiasync.cxx12
-rw-r--r--sc/source/core/tool/callform.cxx88
-rw-r--r--sc/source/core/tool/compiler.cxx13
-rw-r--r--sc/source/core/tool/interpr4.cxx7
-rw-r--r--sc/source/core/tool/parclass.cxx41
-rw-r--r--sc/source/ui/unoobj/funcuno.cxx20
9 files changed, 130 insertions, 112 deletions
diff --git a/sc/inc/callform.hxx b/sc/inc/callform.hxx
index 4708a4739a64..f72a7f18de34 100644
--- a/sc/inc/callform.hxx
+++ b/sc/inc/callform.hxx
@@ -33,6 +33,8 @@
#include <rtl/ustring.hxx>
+#include <boost/ptr_container/ptr_map.hpp>
+
#define MAXFUNCPARAM 16
#define MAXARRSIZE 0xfffe
@@ -57,9 +59,11 @@ enum ParamType
};
class ModuleData;
-class FuncData : public ScDataObject
+
+class FuncData
{
-friend class FuncCollection;
+ friend class FuncCollection;
+
const ModuleData* pModuleData;
rtl::OUString aInternalName;
rtl::OUString aFuncName;
@@ -78,7 +82,6 @@ public:
const ParamType* peType,
ParamType eType);
FuncData(const FuncData& rData);
- virtual ScDataObject* Clone() const { return new FuncData(*this); }
const rtl::OUString& GetModuleName() const;
const rtl::OUString& GetInternalName() const { return aInternalName; }
@@ -87,27 +90,32 @@ public:
ParamType GetParamType(sal_uInt16 nIndex) const { return eParamType[nIndex]; }
ParamType GetReturnType() const { return eParamType[0]; }
ParamType GetAsyncType() const { return eAsyncType; }
- bool Call(void** ppParam);
+ bool Call(void** ppParam) const;
bool Unadvice(double nHandle);
- // name and description of parameter nParam.
- // nParam==0 => Desc := function description,
- // Name := n/a
- bool getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal_uInt16 nParam );
-
+ // name and description of parameter nParam.
+ // nParam==0 => Desc := function description,
+ // Name := n/a
+ bool getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal_uInt16 nParam ) const;
};
-class FuncCollection : public ScSortedCollection
+class FuncCollection
{
+ typedef boost::ptr_map<rtl::OUString, FuncData> MapType;
+ MapType maData;
public:
- FuncCollection(sal_uInt16 nLim = 4, sal_uInt16 nDel = 4, sal_Bool bDup = false) : ScSortedCollection ( nLim, nDel, bDup ) {}
- FuncCollection(const FuncCollection& rFuncCollection) : ScSortedCollection ( rFuncCollection ) {}
+ typedef MapType::const_iterator const_iterator;
+
+ FuncCollection();
+ FuncCollection(const FuncCollection& r);
+
+ const FuncData* findByName(const rtl::OUString& rName) const;
+ FuncData* findByName(const rtl::OUString& rName);
+ void insert(FuncData* pNew);
- virtual ScDataObject* Clone() const { return new FuncCollection(*this); }
- FuncData* operator[]( const sal_uInt16 nIndex) const {return (FuncData*)At(nIndex);}
- virtual short Compare(ScDataObject* pKey1, ScDataObject* pKey2) const;
- bool SearchFunc( const rtl::OUString& rName, sal_uInt16& rIndex ) const;
+ const_iterator begin() const;
+ const_iterator end() const;
};
diff --git a/sc/source/core/data/funcdesc.cxx b/sc/source/core/data/funcdesc.cxx
index cbaeb21014e7..4175effc7d25 100644
--- a/sc/source/core/data/funcdesc.cxx
+++ b/sc/source/core/data/funcdesc.cxx
@@ -379,7 +379,6 @@ ScFunctionList::ScFunctionList() :
{
ScFuncDesc* pDesc = NULL;
xub_StrLen nStrLen = 0;
- FuncCollection* pFuncColl;
::std::list<ScFuncDesc*> tmpFuncList;
sal_uInt16 nDescBlock[] =
{
@@ -441,11 +440,12 @@ ScFunctionList::ScFunctionList() :
::rtl::OUString aDefArgDescNone = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("none"));
::rtl::OUString aArgName, aArgDesc;
- pFuncColl = ScGlobal::GetFuncCollection();
- for (sal_uInt16 i = 0; i < pFuncColl->GetCount(); ++i)
+ const FuncCollection& rFuncColl = *ScGlobal::GetFuncCollection();
+ FuncCollection::const_iterator it = rFuncColl.begin(), itEnd = rFuncColl.end();
+ for (; it != itEnd; ++it)
{
+ const FuncData* pAddInFuncData = it->second;
pDesc = new ScFuncDesc;
- FuncData *pAddInFuncData = (FuncData*)pFuncColl->At(i);
sal_uInt16 nArgs = pAddInFuncData->GetParamCount() - 1;
pAddInFuncData->getParamDesc( aArgName, aArgDesc, 0 );
pDesc->nFIndex = nNextId++; // ??? OpCode vergeben
diff --git a/sc/source/core/inc/adiasync.hxx b/sc/source/core/inc/adiasync.hxx
index 4d47d3d5cf09..cfb3c214266b 100644
--- a/sc/source/core/inc/adiasync.hxx
+++ b/sc/source/core/inc/adiasync.hxx
@@ -59,16 +59,15 @@ private:
String* pStr;
};
ScAddInDocs* pDocs; // Liste der benutzenden Dokumente
- FuncData* pFuncData; // Zeiger auf die Daten in der Collection
+ FuncData* mpFuncData; // Zeiger auf die Daten in der Collection
sal_uLong nHandle; // wird von double auf sal_uLong gecasted
- ParamType eType; // PTR_DOUBLE oder PTR_STRING Ergebnis
+ ParamType meType; // PTR_DOUBLE oder PTR_STRING Ergebnis
sal_Bool bValid; // ob Wert gueltig
public:
- // cTor nur wenn ScAddInAsync::Get fehlschlaegt!
- // nIndex: Index aus der FunctionCollection
- ScAddInAsync( sal_uLong nHandle, sal_uInt16 nIndex,
- ScDocument* pDoc );
+ // cTor nur wenn ScAddInAsync::Get fehlschlaegt!
+ // nIndex: Index aus der FunctionCollection
+ ScAddInAsync(sal_uLong nHandle, FuncData* pFuncData, ScDocument* pDoc);
// default-cTor nur fuer das eine globale aSeekObj !!!
ScAddInAsync();
virtual ~ScAddInAsync();
@@ -76,7 +75,7 @@ public:
static void CallBack( sal_uLong nHandle, void* pData );
static void RemoveDocument( ScDocument* pDocument );
sal_Bool IsValid() const { return bValid; }
- ParamType GetType() const { return eType; }
+ ParamType GetType() const { return meType; }
double GetValue() const { return nVal; }
const String& GetString() const { return *pStr; }
sal_Bool HasDocument( ScDocument* pDoc ) const
diff --git a/sc/source/core/tool/adiasync.cxx b/sc/source/core/tool/adiasync.cxx
index e7b21a8fa306..20cfc65b38d5 100644
--- a/sc/source/core/tool/adiasync.cxx
+++ b/sc/source/core/tool/adiasync.cxx
@@ -68,16 +68,16 @@ ScAddInAsync::ScAddInAsync() :
-ScAddInAsync::ScAddInAsync( sal_uLong nHandleP, sal_uInt16 nIndex, ScDocument* pDoc ) :
+ScAddInAsync::ScAddInAsync(sal_uLong nHandleP, FuncData* pFuncData, ScDocument* pDoc) :
SvtBroadcaster(),
pStr( NULL ),
+ mpFuncData(pFuncData),
nHandle( nHandleP ),
+ meType(pFuncData->GetAsyncType()),
bValid( false )
{
pDocs = new ScAddInDocs( 1 );
pDocs->Insert( pDoc );
- pFuncData = (FuncData*)ScGlobal::GetFuncCollection()->At(nIndex);
- eType = pFuncData->GetAsyncType();
theAddInAsyncTbl.Insert( this );
}
@@ -89,8 +89,8 @@ ScAddInAsync::~ScAddInAsync()
if ( nHandle )
{
// im dTor wg. theAddInAsyncTbl.DeleteAndDestroy in ScGlobal::Clear
- pFuncData->Unadvice( (double)nHandle );
- if ( eType == PTR_STRING && pStr ) // mit Typvergleich wg. Union!
+ mpFuncData->Unadvice( (double)nHandle );
+ if ( meType == PTR_STRING && pStr ) // mit Typvergleich wg. Union!
delete pStr;
delete pDocs;
}
@@ -124,7 +124,7 @@ void ScAddInAsync::CallBack( sal_uLong nHandleP, void* pData )
delete p;
return ;
}
- switch ( p->eType )
+ switch ( p->meType )
{
case PTR_DOUBLE :
p->nVal = *(double*)pData;
diff --git a/sc/source/core/tool/callform.cxx b/sc/source/core/tool/callform.cxx
index 3c9d5f042ef3..ab0b8fc12355 100644
--- a/sc/source/core/tool/callform.cxx
+++ b/sc/source/core/tool/callform.cxx
@@ -39,8 +39,6 @@
#include "global.hxx"
#include "adiasync.hxx"
-#include <boost/ptr_container/ptr_map.hpp>
-
//------------------------------------------------------------------------
extern "C" {
@@ -88,6 +86,21 @@ typedef void (CALLTYPE* FARPROC) ( void );
#define ADVICE "Advice"
#define UNADVICE "Unadvice"
+class ModuleData
+{
+friend class ModuleCollection;
+ rtl::OUString aName;
+ osl::Module* pInstance;
+public:
+ 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; }
+
+ const rtl::OUString& GetName() const { return aName; }
+ osl::Module* GetInstance() const { return pInstance; }
+ void FreeInstance() { delete pInstance; pInstance = 0; }
+};
+
FuncData::FuncData(const rtl::OUString& rIName) :
pModuleData (NULL),
aInternalName (rIName),
@@ -122,7 +135,6 @@ FuncData::FuncData(const ModuleData*pModule,
//------------------------------------------------------------------------
FuncData::FuncData(const FuncData& rData) :
- ScDataObject(),
pModuleData (rData.pModuleData),
aInternalName (rData.aInternalName),
aFuncName (rData.aFuncName),
@@ -134,38 +146,6 @@ FuncData::FuncData(const FuncData& rData) :
eParamType[i] = rData.eParamType[i];
}
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-short FuncCollection::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const
-{
- return (short) ScGlobal::GetpTransliteration()->compareString(
- ((FuncData*)pKey1)->aInternalName, ((FuncData*)pKey2)->aInternalName );
-}
-
-//------------------------------------------------------------------------
-
-bool FuncCollection::SearchFunc( const rtl::OUString& rName, sal_uInt16& rIndex ) const
-{
- FuncData aDataObj(rName);
- return Search( &aDataObj, rIndex );
-}
-
-//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-class ModuleData
-{
-friend class ModuleCollection;
- rtl::OUString aName;
- osl::Module* pInstance;
-public:
- 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; }
-
- const rtl::OUString& GetName() const { return aName; }
- osl::Module* GetInstance() const { return pInstance; }
- void FreeInstance() { delete pInstance; pInstance = 0; }
-};
-
namespace {
class ModuleCollection
@@ -277,7 +257,7 @@ bool InitExternalFunc(const rtl::OUString& rModuleName)
nParamCount,
eParamType,
eAsyncType );
- pFuncCol->Insert(pFuncData);
+ pFuncCol->insert(pFuncData);
}
bRet = sal_True;
}
@@ -298,7 +278,7 @@ void ExitExternalFunc()
//------------------------------------------------------------------------
-bool FuncData::Call(void** ppParam)
+bool FuncData::Call(void** ppParam) const
{
bool bRet = false;
osl::Module* pLib = pModuleData->GetInstance();
@@ -413,7 +393,7 @@ const rtl::OUString& FuncData::GetModuleName() const
return pModuleData->GetName();
}
-bool FuncData::getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal_uInt16 nParam )
+bool FuncData::getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal_uInt16 nParam ) const
{
bool bRet = false;
if ( nParam <= nParamCount )
@@ -440,4 +420,36 @@ bool FuncData::getParamDesc( ::rtl::OUString& aName, ::rtl::OUString& aDesc, sal
return bRet;
}
+FuncCollection::FuncCollection() {}
+FuncCollection::FuncCollection(const FuncCollection& r) : maData(r.maData) {}
+
+const FuncData* FuncCollection::findByName(const rtl::OUString& rName) const
+{
+ MapType::const_iterator it = maData.find(rName);
+ return it == maData.end() ? NULL : it->second;
+}
+
+FuncData* FuncCollection::findByName(const rtl::OUString& rName)
+{
+ MapType::iterator it = maData.find(rName);
+ return it == maData.end() ? NULL : it->second;
+}
+
+void FuncCollection::insert(FuncData* pNew)
+{
+ rtl::OUString aName = pNew->GetInternalName();
+ maData.insert(aName, pNew);
+}
+
+FuncCollection::const_iterator FuncCollection::begin() const
+{
+ return maData.begin();
+}
+
+FuncCollection::const_iterator FuncCollection::end() const
+{
+ return maData.end();
+}
+
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index c7dc18ac660d..162eaf5549fd 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -188,7 +188,7 @@ void ScCompiler::DeInit()
bool ScCompiler::IsEnglishSymbol( const String& rName )
{
// function names are always case-insensitive
- String aUpper( ScGlobal::pCharClass->uppercase( rName ) );
+ rtl::OUString aUpper = ScGlobal::pCharClass->uppercase(rName);
// 1. built-in function name
OpCode eOp = ScCompiler::GetEnglishOpCode( aUpper );
@@ -197,15 +197,14 @@ bool ScCompiler::IsEnglishSymbol( const String& rName )
return true;
}
// 2. old add in functions
- sal_uInt16 nIndex;
- if ( ScGlobal::GetFuncCollection()->SearchFunc( aUpper, nIndex ) )
+ if (ScGlobal::GetFuncCollection()->findByName(aUpper))
{
return true;
}
// 3. new (uno) add in functions
- String aIntName(ScGlobal::GetAddInCollection()->FindFunction( aUpper, false ));
- if (aIntName.Len())
+ rtl::OUString aIntName = ScGlobal::GetAddInCollection()->FindFunction(aUpper, false);
+ if (!aIntName.isEmpty())
{
return true;
}
@@ -2522,9 +2521,7 @@ bool ScCompiler::IsOpCode( const String& rName, bool bInArray )
if (!aIntName.Len())
{
// Old (deprecated) addins first for legacy.
- sal_uInt16 nIndex;
- bFound = ScGlobal::GetFuncCollection()->SearchFunc( cSymbol, nIndex);
- if (bFound)
+ if (ScGlobal::GetFuncCollection()->findByName(cSymbol))
{
ScRawToken aToken;
aToken.SetExternal( cSymbol );
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index b6492dda0a32..fac1d34b9002 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -2495,13 +2495,12 @@ void ScInterpreter::ScDBGet()
void ScInterpreter::ScExternal()
{
RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScExternal" );
- sal_uInt16 nIndex;
sal_uInt8 nParamCount = GetByte();
String aUnoName;
String aFuncName( ScGlobal::pCharClass->uppercase( pCur->GetExternal() ) );
- if (ScGlobal::GetFuncCollection()->SearchFunc(aFuncName, nIndex))
+ FuncData* pFuncData = ScGlobal::GetFuncCollection()->findByName(aFuncName);
+ if (pFuncData)
{
- FuncData* pFuncData = (FuncData*)ScGlobal::GetFuncCollection()->At(nIndex);
if (nParamCount <= MAXFUNCPARAM && nParamCount == pFuncData->GetParamCount() - 1)
{
ParamType eParamType[MAXFUNCPARAM];
@@ -2645,7 +2644,7 @@ void ScInterpreter::ScExternal()
ScAddInAsync* pAs = ScAddInAsync::Get( nHandle );
if ( !pAs )
{
- pAs = new ScAddInAsync( nHandle, nIndex, pDok );
+ pAs = new ScAddInAsync(nHandle, pFuncData, pDok);
pMyFormulaCell->StartListening( *pAs );
}
else
diff --git a/sc/source/core/tool/parclass.cxx b/sc/source/core/tool/parclass.cxx
index 7add078052c4..e8509a3e4e39 100644
--- a/sc/source/core/tool/parclass.cxx
+++ b/sc/source/core/tool/parclass.cxx
@@ -324,31 +324,34 @@ ScParameterClassification::GetExternalParameterType( const formula::FormulaToken
{
Type eRet = Unknown;
// similar to ScInterpreter::ScExternal()
- sal_uInt16 nIndex;
- String aUnoName;
- String aFuncName( ScGlobal::pCharClass->uppercase( pToken->GetExternal()));
- if ( ScGlobal::GetFuncCollection()->SearchFunc( aFuncName, nIndex) )
+ rtl::OUString aFuncName = ScGlobal::pCharClass->uppercase( pToken->GetExternal());
{
- FuncData* pFuncData = (FuncData*)ScGlobal::GetFuncCollection()->At(
- nIndex);
- if ( nParameter >= pFuncData->GetParamCount() )
- eRet = Bounds;
- else
+ const FuncData* pFuncData = ScGlobal::GetFuncCollection()->findByName(aFuncName);
+ if (pFuncData)
{
- switch ( pFuncData->GetParamType( nParameter) )
+ if ( nParameter >= pFuncData->GetParamCount() )
+ eRet = Bounds;
+ else
{
- case PTR_DOUBLE:
- case PTR_STRING:
- eRet = Value;
- break;
- default:
- eRet = Reference;
- // also array types are created using an area reference
+ switch ( pFuncData->GetParamType( nParameter) )
+ {
+ case PTR_DOUBLE:
+ case PTR_STRING:
+ eRet = Value;
+ break;
+ default:
+ eRet = Reference;
+ // also array types are created using an area reference
+ }
}
+ return eRet;
}
}
- else if ( (aUnoName = ScGlobal::GetAddInCollection()->FindFunction(
- aFuncName, false)).Len() )
+
+ rtl::OUString aUnoName =
+ ScGlobal::GetAddInCollection()->FindFunction(aFuncName, false);
+
+ if (!aUnoName.isEmpty())
{
// the relevant parts of ScUnoAddInCall without having to create one
const ScUnoAddInFuncData* pFuncData =
diff --git a/sc/source/ui/unoobj/funcuno.cxx b/sc/source/ui/unoobj/funcuno.cxx
index 4297d7255746..6eac293f084e 100644
--- a/sc/source/ui/unoobj/funcuno.cxx
+++ b/sc/source/ui/unoobj/funcuno.cxx
@@ -355,7 +355,7 @@ SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFunctionAccess )
sal_Bool lcl_AddFunctionToken( ScTokenArray& rArray, const rtl::OUString& rName,const ScCompiler& rCompiler )
{
// function names are always case-insensitive
- String aUpper( ScGlobal::pCharClass->uppercase( rName ) );
+ rtl::OUString aUpper = ScGlobal::pCharClass->uppercase(rName);
// same options as in ScCompiler::IsOpCode:
// 1. built-in function name
@@ -364,25 +364,25 @@ sal_Bool lcl_AddFunctionToken( ScTokenArray& rArray, const rtl::OUString& rName,
if ( eOp != ocNone )
{
rArray.AddOpCode( eOp );
- return sal_True;
+ return true;
}
// 2. old add in functions
- sal_uInt16 nIndex;
- if ( ScGlobal::GetFuncCollection()->SearchFunc( aUpper, nIndex ) )
+ if (ScGlobal::GetFuncCollection()->findByName(aUpper))
{
- rArray.AddExternal( aUpper.GetBuffer() );
- return sal_True;
+ rArray.AddExternal(aUpper.getStr());
+ return true;
}
// 3. new (uno) add in functions
- String aIntName(ScGlobal::GetAddInCollection()->FindFunction( aUpper, false ));
- if (aIntName.Len())
+ rtl::OUString aIntName =
+ ScGlobal::GetAddInCollection()->FindFunction(aUpper, false);
+ if (!aIntName.isEmpty())
{
- rArray.AddExternal( aIntName.GetBuffer() ); // international name
- return sal_True;
+ rArray.AddExternal(aIntName.getStr()); // international name
+ return true;
}
return false; // no valid function name