[Libreoffice-commits] core.git: Branch 'feature/calc-pluggable-opencl' - 2 commits - sc/inc sc/Library_sc.mk sc/Library_scopencl.mk sc/Library_scui.mk sc/qa sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Fri Sep 13 15:59:55 PDT 2013


 sc/Library_sc.mk                         |    1 
 sc/Library_scopencl.mk                   |    1 
 sc/Library_scui.mk                       |    1 
 sc/inc/cellvalue.hxx                     |    3 -
 sc/inc/dociter.hxx                       |    4 +-
 sc/inc/formulagroup.hxx                  |    3 +
 sc/inc/mtvelements.hxx                   |    3 +
 sc/inc/platforminfo.hxx                  |    6 ++-
 sc/qa/unit/helper/qahelper.cxx           |    1 
 sc/source/core/data/cellvalue.cxx        |   29 ----------------
 sc/source/core/data/dociter.cxx          |   18 ++++-----
 sc/source/core/data/mtvelements.cxx      |   25 +++++++++++++
 sc/source/core/opencl/formulagroupcl.cxx |   14 +++++++
 sc/source/core/opencl/openclwrapper.cxx  |   15 ++++++++
 sc/source/core/opencl/openclwrapper.hxx  |    1 
 sc/source/core/opencl/platforminfo.cxx   |   24 -------------
 sc/source/core/tool/formulagroup.cxx     |   56 ++++++++++++++++++++++++-------
 sc/source/core/tool/platforminfo.cxx     |   21 +++++++++++
 sc/source/ui/optdlg/calcoptionsdlg.cxx   |    6 ++-
 19 files changed, 148 insertions(+), 84 deletions(-)

New commits:
commit b76a80472394786a87ea1268e9bbb8846ab6ff36
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri Sep 13 18:59:41 2013 -0400

    Avoid having build-time dependency on scopencl.
    
    Change-Id: I32918599dca0556a61b85d868dffbb5e72541e69

diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index d198737..b0ab893 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -227,6 +227,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
 	sc/source/core/tool/optutil \
 	sc/source/core/tool/orcusxml \
 	sc/source/core/tool/parclass \
+        sc/source/core/tool/platforminfo \
 	sc/source/core/tool/printopt \
 	sc/source/core/tool/prnsave \
 	sc/source/core/tool/progress \
diff --git a/sc/Library_scopencl.mk b/sc/Library_scopencl.mk
index 44137826..2942e47 100644
--- a/sc/Library_scopencl.mk
+++ b/sc/Library_scopencl.mk
@@ -35,7 +35,6 @@ $(eval $(call gb_Library_use_libraries,scopencl,\
 
 $(eval $(call gb_Library_add_exception_objects,scopencl,\
         sc/source/core/opencl/formulagroupcl \
-		sc/source/core/opencl/platforminfo \
         sc/source/core/opencl/openclwrapper \
         sc/source/core/opencl/clcc/clew \
 ))
diff --git a/sc/Library_scui.mk b/sc/Library_scui.mk
index 85028ee..f553dde 100644
--- a/sc/Library_scui.mk
+++ b/sc/Library_scui.mk
@@ -35,7 +35,6 @@ $(eval $(call gb_Library_use_libraries,scui,\
 	i18nlangtag \
 	sal \
 	sc \
-	scopencl \
 	sfx \
 	sot \
 	svl \
diff --git a/sc/inc/formulagroup.hxx b/sc/inc/formulagroup.hxx
index f4cbbdb..ef9adbb 100644
--- a/sc/inc/formulagroup.hxx
+++ b/sc/inc/formulagroup.hxx
@@ -12,7 +12,9 @@
 
 #include "address.hxx"
 #include "types.hxx"
+#include "platforminfo.hxx"
 
+#include <vector>
 #include <boost/noncopyable.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
 #include <boost/unordered_set.hpp>
@@ -52,6 +54,7 @@ class SC_DLLPUBLIC FormulaGroupInterpreter
 
  public:
     static FormulaGroupInterpreter *getStatic();
+    static void fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms);
 
     virtual ScMatrixRef inverseMatrix(const ScMatrix& rMat) = 0;
     virtual bool interpret(ScDocument& rDoc, const ScAddress& rTopPos, const ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode) = 0;
diff --git a/sc/inc/platforminfo.hxx b/sc/inc/platforminfo.hxx
index 21c9aa9..7a48e11 100644
--- a/sc/inc/platforminfo.hxx
+++ b/sc/inc/platforminfo.hxx
@@ -26,6 +26,8 @@ struct SC_DLLPUBLIC OpenclDeviceInfo
     size_t mnMemory;
     size_t mnComputeUnits;
     size_t mnFrequency;
+
+    OpenclDeviceInfo();
 };
 
 struct SC_DLLPUBLIC OpenclPlatformInfo
@@ -34,9 +36,9 @@ struct SC_DLLPUBLIC OpenclPlatformInfo
     OUString maVendor;
     OUString maName;
     std::vector<OpenclDeviceInfo> maDevices;
-};
 
-SC_DLLPUBLIC std::vector<OpenclPlatformInfo> listAllOpenclPlatforms();
+    OpenclPlatformInfo();
+};
 
 }
 
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 61d9944..ce5f568 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -1080,6 +1080,20 @@ SAL_DLLPUBLIC_EXPORT sc::FormulaGroupInterpreter* SAL_CALL createFormulaGroupOpe
     return new sc::opencl::FormulaGroupInterpreterOpenCL();
 }
 
+SAL_DLLPUBLIC_EXPORT size_t getOpenCLPlatformCount()
+{
+    return sc::opencl::getOpenCLPlatformCount();
+}
+
+SAL_DLLPUBLIC_EXPORT void SAL_CALL fillOpenCLInfo(sc::OpenclPlatformInfo* pInfos, size_t nInfoSize)
+{
+    std::vector<sc::OpenclPlatformInfo> aPlatforms;
+    sc::opencl::fillOpenCLInfo(aPlatforms);
+    size_t n = std::min(aPlatforms.size(), nInfoSize);
+    for (size_t i = 0; i < n; ++i)
+        pInfos[i] = aPlatforms[i];
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index f5178c2..f508758 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -2718,6 +2718,21 @@ bool createPlatformInfo(cl_platform_id nPlatformId, OpenclPlatformInfo& rPlatfor
 
 }
 
+size_t getOpenCLPlatformCount()
+{
+    int status = clewInit(OPENCL_DLL_NAME);
+    if (status < 0)
+        return 0;
+
+    cl_uint nPlatforms;
+    cl_int nState = clGetPlatformIDs(0, NULL, &nPlatforms);
+
+    if (nState != CL_SUCCESS)
+        return 0;
+
+    return nPlatforms;
+}
+
 void fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms)
 {
     int status = clewInit(OPENCL_DLL_NAME);
diff --git a/sc/source/core/opencl/openclwrapper.hxx b/sc/source/core/opencl/openclwrapper.hxx
index adaa98e..4d509c5 100644
--- a/sc/source/core/opencl/openclwrapper.hxx
+++ b/sc/source/core/opencl/openclwrapper.hxx
@@ -280,6 +280,7 @@ public:
     friend class agency;
 };
 
+size_t getOpenCLPlatformCount();
 void fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms);
 
 }}
diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx
index 1a40b15..3b3001d 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -334,12 +334,29 @@ public:
 
 static void SAL_CALL thisModule() {}
 
-typedef FormulaGroupInterpreter* (*LoaderFn)(void);
+typedef FormulaGroupInterpreter* (*__createFormulaGroupOpenCLInterpreter)(void);
+typedef size_t (*__getOpenCLPlatformCount)(void);
+typedef void (*__fillOpenCLInfo)(OpenclPlatformInfo*, size_t);
 
 #endif
 
 FormulaGroupInterpreter *FormulaGroupInterpreter::msInstance = NULL;
 
+osl::Module* getOpenCLModule()
+{
+    static osl::Module aModule;
+    if (aModule.is())
+        // Already loaded.
+        return &aModule;
+
+    OUString aLibName(SVLIBRARY("scopencl"));
+    bool bLoaded = aModule.loadRelative(&thisModule, aLibName);
+    if (!bLoaded)
+        bLoaded = aModule.load(aLibName);
+
+    return bLoaded ? &aModule : NULL;
+}
+
 /// load and/or configure the correct formula group interpreter
 FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic()
 {
@@ -376,18 +393,12 @@ FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic()
             msInstance = createFormulaGroupOpenCLInterpreter();
 #else
             // Dynamically load scopencl shared object, and instantiate the opencl interpreter.
-
-            OUString aLibName(SVLIBRARY("scopencl"));
-            static osl::Module aModule;
-            bool bLoaded = aModule.loadRelative(&thisModule, aLibName);
-            if (!bLoaded)
-                bLoaded = aModule.load(aLibName);
-
-            if (bLoaded)
+            osl::Module* pModule = getOpenCLModule();
+            if (pModule)
             {
-                oslGenericFunction fn = aModule.getFunctionSymbol("createFormulaGroupOpenCLInterpreter");
+                oslGenericFunction fn = pModule->getFunctionSymbol("createFormulaGroupOpenCLInterpreter");
                 if (fn)
-                    msInstance = reinterpret_cast<LoaderFn>(fn)();
+                    msInstance = reinterpret_cast<__createFormulaGroupOpenCLInterpreter>(fn)();
             }
 
             if (!msInstance)
@@ -405,6 +416,29 @@ FormulaGroupInterpreter *FormulaGroupInterpreter::getStatic()
     return msInstance;
 }
 
+void FormulaGroupInterpreter::fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms)
+{
+    osl::Module* pModule = getOpenCLModule();
+    if (!pModule)
+        return;
+
+    oslGenericFunction fn = pModule->getFunctionSymbol("getOpenCLPlatformCount");
+    if (!fn)
+        return;
+
+    size_t nPlatforms = reinterpret_cast<__getOpenCLPlatformCount>(fn)();
+    if (!nPlatforms)
+        return;
+
+    fn = pModule->getFunctionSymbol("fillOpenCLInfo");
+    if (!fn)
+        return;
+
+    std::vector<OpenclPlatformInfo> aPlatforms(nPlatforms);
+    reinterpret_cast<__fillOpenCLInfo>(fn)(&aPlatforms[0], aPlatforms.size());
+    rPlatforms.swap(aPlatforms);
+}
+
 void FormulaGroupInterpreter::generateRPNCode(ScDocument& rDoc, const ScAddress& rPos, ScTokenArray& rCode)
 {
     // First, generate an RPN (reverse polish notation) token array.
diff --git a/sc/source/core/opencl/platforminfo.cxx b/sc/source/core/tool/platforminfo.cxx
similarity index 68%
rename from sc/source/core/opencl/platforminfo.cxx
rename to sc/source/core/tool/platforminfo.cxx
index e5700d6..74f5136 100644
--- a/sc/source/core/opencl/platforminfo.cxx
+++ b/sc/source/core/tool/platforminfo.cxx
@@ -8,16 +8,13 @@
  */
 
 #include "platforminfo.hxx"
-#include "openclwrapper.hxx"
+#include "formulagroup.hxx"
 
 namespace sc {
 
-std::vector<OpenclPlatformInfo> listAllOpenclPlatforms()
-{
-    std::vector<OpenclPlatformInfo> aPlatforms;
-    opencl::fillOpenCLInfo(aPlatforms);
-    return aPlatforms;
-}
+OpenclDeviceInfo::OpenclDeviceInfo() {}
+
+OpenclPlatformInfo::OpenclPlatformInfo() {}
 
 }
 
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx
index 0b00a04..652090b 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.cxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx
@@ -14,6 +14,10 @@
 #include "svtools/svlbitm.hxx"
 #include "svtools/treelistentry.hxx"
 
+#if HAVE_FEATURE_OPENCL
+#include "formulagroup.hxx"
+#endif
+
 namespace {
 
 typedef enum {
@@ -195,7 +199,7 @@ void ScCalcOptionsDialog::fillOpenclList()
 {
     mpOpenclInfoList->SetUpdateMode(false);
     mpOpenclInfoList->Clear();
-    maPlatformInfo = sc::listAllOpenclPlatforms();
+    sc::FormulaGroupInterpreter::fillOpenCLInfo(maPlatformInfo);
     for(std::vector<sc::OpenclPlatformInfo>::iterator it = maPlatformInfo.begin(),
             itEnd = maPlatformInfo.end(); it != itEnd; ++it)
     {
commit 6b6088dcfd4f3e5b49e8bea677f146003bd43a7d
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Thu Sep 12 21:15:10 2013 -0400

    Change so that we won't have to include mtvelements.hxx in cellvalue.hxx.
    
    Because mtvelements.hxx is very slow to parse by the compiler, and
    cellvalue.hxx is included everywhere. Hopefully this will speed up the
    compilation time of sc...
    
    Change-Id: Ic9a9b8483c8325e4a91021f071f2391db8b57806

diff --git a/sc/inc/cellvalue.hxx b/sc/inc/cellvalue.hxx
index 0e2987c..fd112a6 100644
--- a/sc/inc/cellvalue.hxx
+++ b/sc/inc/cellvalue.hxx
@@ -11,7 +11,6 @@
 #define SC_CELLVALUE_HXX
 
 #include "global.hxx"
-#include "mtvelements.hxx"
 
 class ScDocument;
 class ScFormulaCell;
@@ -119,8 +118,6 @@ struct SC_DLLPUBLIC ScRefCellValue
      */
     void assign( ScDocument& rDoc, const ScAddress& rPos );
 
-    void assign( const sc::CellStoreType::const_iterator& itPos, size_t nOffset );
-
     /**
      * Set cell value at specified position in specified document.
      */
diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx
index 8a57ef3..3a83f0a 100644
--- a/sc/inc/dociter.hxx
+++ b/sc/inc/dociter.hxx
@@ -49,7 +49,7 @@ class ScFormulaCell;
 
 class ScValueIterator            // walk through all values in an area
 {
-    typedef std::pair<sc::CellStoreType::const_iterator, size_t> PositionType;
+    typedef sc::CellStoreType::const_position_type PositionType;
 
     ScDocument*     pDoc;
     const ScAttrArray*  pAttrArray;
@@ -253,7 +253,7 @@ class ScQueryCellIterator           // walk through all non-empty cells in an ar
         nTestEqualConditionFulfilled = nTestEqualConditionEnabled | nTestEqualConditionMatched
     };
 
-    typedef std::pair<sc::CellStoreType::const_iterator, size_t> PositionType;
+    typedef sc::CellStoreType::const_position_type PositionType;
     PositionType maCurPos;
 
     boost::scoped_ptr<ScQueryParam> mpParam;
diff --git a/sc/inc/mtvelements.hxx b/sc/inc/mtvelements.hxx
index 46a5d40..f0e5fff 100644
--- a/sc/inc/mtvelements.hxx
+++ b/sc/inc/mtvelements.hxx
@@ -31,6 +31,7 @@
 #include <boost/unordered_map.hpp>
 
 class ScDocument;
+struct ScRefCellValue;
 
 namespace sc {
 
@@ -133,6 +134,8 @@ public:
     ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
 };
 
+ScRefCellValue toRefCell( const sc::CellStoreType::const_iterator& itPos, size_t nOffset );
+
 }
 
 #endif
diff --git a/sc/qa/unit/helper/qahelper.cxx b/sc/qa/unit/helper/qahelper.cxx
index 7c409ef..33c8f04 100644
--- a/sc/qa/unit/helper/qahelper.cxx
+++ b/sc/qa/unit/helper/qahelper.cxx
@@ -11,6 +11,7 @@
 #include "csv_handler.hxx"
 #include "drwlayer.hxx"
 #include "compiler.hxx"
+#include "formulacell.hxx"
 #include "svx/svdpage.hxx"
 #include "svx/svdoole2.hxx"
 
diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx
index 2c40418..ba71d1e 100644
--- a/sc/source/core/data/cellvalue.cxx
+++ b/sc/source/core/data/cellvalue.cxx
@@ -496,35 +496,6 @@ void ScRefCellValue::assign( ScDocument& rDoc, const ScAddress& rPos )
     *this = rDoc.GetRefCellValue(rPos);
 }
 
-void ScRefCellValue::assign( const sc::CellStoreType::const_iterator& itPos, size_t nOffset )
-{
-    switch (itPos->type)
-    {
-        case sc::element_type_numeric:
-            // Numeric cell
-            mfValue = sc::numeric_block::at(*itPos->data, nOffset);
-            meType = CELLTYPE_VALUE;
-        break;
-        case sc::element_type_string:
-            // String cell
-            mpString = &sc::string_block::at(*itPos->data, nOffset);
-            meType = CELLTYPE_STRING;
-        break;
-        case sc::element_type_edittext:
-            // Edit cell
-            mpEditText = sc::edittext_block::at(*itPos->data, nOffset);
-            meType = CELLTYPE_EDIT;
-        break;
-        case sc::element_type_formula:
-            // Formula cell
-            mpFormula = sc::formula_block::at(*itPos->data, nOffset);
-            meType = CELLTYPE_FORMULA;
-        break;
-        default:
-            clear();
-    }
-}
-
 void ScRefCellValue::commit( ScDocument& rDoc, const ScAddress& rPos ) const
 {
     switch (meType)
diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx
index f951ea3..6f4d4a7 100644
--- a/sc/source/core/data/dociter.cxx
+++ b/sc/source/core/data/dociter.cxx
@@ -400,8 +400,7 @@ bool ScDBQueryDataIterator::DataAccessInternal::getCurrent(Value& rValue)
             continue;
         }
 
-        ScRefCellValue aCell;
-        aCell.assign(maCurPos.first, maCurPos.second);
+        ScRefCellValue aCell = sc::toRefCell(maCurPos.first, maCurPos.second);
 
         if (ScDBQueryDataIterator::IsQueryValid(*mpDoc, *mpParam, nTab, nRow, aCell))
         {
@@ -920,7 +919,7 @@ bool ScCellIterator::getCurrent()
             }
         }
 
-        maCurCell.assign(maCurColPos.first, maCurColPos.second);
+        maCurCell = sc::toRefCell(maCurColPos.first, maCurColPos.second);
         return true;
     }
     return false;
@@ -1154,8 +1153,7 @@ bool ScQueryCellIterator::GetThis()
             continue;
         }
 
-        ScRefCellValue aCell;
-        aCell.assign(maCurPos.first, maCurPos.second);
+        ScRefCellValue aCell = sc::toRefCell(maCurPos.first, maCurPos.second);
 
         if (bAllStringIgnore && aCell.hasString())
             IncPos();
@@ -1407,7 +1405,7 @@ bool ScQueryCellIterator::BinarySearch()
     {
         OUString aCellStr;
         sal_uLong nFormat = pCol->GetNumberFormat(toLogicalPos(aLoPos));
-        aCell.assign(aLoPos.first, aLoPos.second);
+        aCell = sc::toRefCell(aLoPos.first, aLoPos.second);
         ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);
         sal_Int32 nTmp = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
         if ((rEntry.eOp == SC_LESS_EQUAL && nTmp > 0) ||
@@ -1450,7 +1448,7 @@ bool ScQueryCellIterator::BinarySearch()
         aLastInRangeString = OUString(sal_Unicode(0xFFFF));
     if (aLastInRange.first != pCol->maCells.end())
     {
-        aCell.assign(aLastInRange.first, aLastInRange.second);
+        aCell = sc::toRefCell(aLastInRange.first, aLastInRange.second);
         if (aCell.hasString())
         {
             sal_uLong nFormat = pCol->GetNumberFormat(toLogicalPos(aLastInRange));
@@ -1502,7 +1500,7 @@ bool ScQueryCellIterator::BinarySearch()
         if (!bStr && !bByString)
         {
             double nCellVal;
-            aCell.assign(aPos.first, aPos.second);
+            aCell = sc::toRefCell(aPos.first, aPos.second);
             switch (aCell.meType)
             {
                 case CELLTYPE_VALUE :
@@ -1557,7 +1555,7 @@ bool ScQueryCellIterator::BinarySearch()
         {
             OUString aCellStr;
             sal_uLong nFormat = pCol->GetNumberFormat(i);
-            aCell.assign(aPos.first, aPos.second);
+            aCell = sc::toRefCell(aPos.first, aPos.second);
             ScCellFormat::GetInputString(aCell, nFormat, aCellStr, rFormatter, pDoc);
 
             nRes = pCollator->compareString(aCellStr, rEntry.GetQueryItem().maString);
@@ -1735,7 +1733,7 @@ ScRefCellValue* ScHorizontalCellIterator::GetNext( SCCOL& rCol, SCROW& rRow )
 
     ColParam& r = maColPositions[mnCol-nStartCol];
     size_t nOffset = static_cast<size_t>(mnRow) - r.maPos->position;
-    maCurCell.assign(r.maPos, nOffset);
+    maCurCell = sc::toRefCell(r.maPos, nOffset);
     Advance();
 
     return &maCurCell;
diff --git a/sc/source/core/data/mtvelements.cxx b/sc/source/core/data/mtvelements.cxx
index efe07cf..222aabd 100644
--- a/sc/source/core/data/mtvelements.cxx
+++ b/sc/source/core/data/mtvelements.cxx
@@ -10,6 +10,7 @@
 #include "mtvelements.hxx"
 #include "globalnames.hxx"
 #include "document.hxx"
+#include "cellvalue.hxx"
 
 namespace sc {
 
@@ -64,6 +65,30 @@ ColumnBlockPosition* ColumnBlockPositionSet::getBlockPosition(SCTAB nTab, SCCOL
     return &it->second;
 }
 
+ScRefCellValue toRefCell( const sc::CellStoreType::const_iterator& itPos, size_t nOffset )
+{
+    switch (itPos->type)
+    {
+        case sc::element_type_numeric:
+            // Numeric cell
+            return ScRefCellValue(sc::numeric_block::at(*itPos->data, nOffset));
+        case sc::element_type_string:
+            // String cell
+            return ScRefCellValue(&sc::string_block::at(*itPos->data, nOffset));
+        case sc::element_type_edittext:
+            // Edit cell
+            return ScRefCellValue(sc::edittext_block::at(*itPos->data, nOffset));
+        break;
+        case sc::element_type_formula:
+            // Formula cell
+            return ScRefCellValue(sc::formula_block::at(*itPos->data, nOffset));
+        default:
+            ;
+    }
+
+    return ScRefCellValue();
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list