sc/source/core/opencl/formulagroupcl.cxx |   32 -
 sc/source/core/opencl/op_addin.cxx       |  124 -----
 sc/source/core/opencl/op_array.cxx       |   33 -
 sc/source/core/opencl/op_database.cxx    |  121 -----
 sc/source/core/opencl/op_financial.cxx   |  586 ++++---------------------
 sc/source/core/opencl/op_logical.cxx     |  346 +-------------
 sc/source/core/opencl/op_logical.hxx     |   34 -
 sc/source/core/opencl/op_math.cxx        |  657 ++++------------------------
 sc/source/core/opencl/op_spreadsheet.cxx |   11 
 sc/source/core/opencl/op_statistical.cxx |  724 +++++--------------------------
 sc/source/core/opencl/opbase.cxx         |   45 +
 sc/source/core/opencl/opbase.hxx         |    6 
 12 files changed, 466 insertions(+), 2253 deletions(-)

New commits:
commit 7ed959dfe96f3a4edc0ee00f23473aac28734e1f
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Tue Sep 6 12:37:50 2022 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Tue Sep 13 09:05:06 2022 +0200

    reduce opencl copy&paste in op_addin.cxx and op_logical.cxx
    
    The svDoubleVectorRef stuff in OpAnd etc. didn't make sense, those
    operators are required to do implicit intersection (which can be done
    in sc core in ScCompiler::HandleIIOpCodeInternal()).
    
    Change-Id: Ic970c8e649a651f6a804b5ed265fe2e08ff29681
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139485
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/source/core/opencl/op_addin.cxx 
b/sc/source/core/opencl/op_addin.cxx
index a9c2f9508ac8..602ed2dfb36d 100644
--- a/sc/source/core/opencl/op_addin.cxx
+++ b/sc/source/core/opencl/op_addin.cxx
@@ -23,69 +23,8 @@ void OpBesselj::GenSlidingWindowFunction(outputstream &ss,
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double x = 0.0;\n";
-    ss << "    double N = 0.0;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    assert(tmpCur0);
-    if(ocPush == vSubArguments[0]->GetFormulaToken()->GetOpCode())
-    {
-        if(tmpCur0->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken*tmpCurSVR0 =
-                static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
-            ss << "    if (gid0 < " << tmpCurSVR0->GetArrayLength() << ")\n";
-            ss << "    {\n";
-            ss << "        x = ";
-            ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "        if (isnan(x))\n";
-            ss << "            x = 0.0;\n";
-            ss << "    }\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDouble)
-        {
-            ss << "    x = " << tmpCur0->GetDouble() << ";\n";
-        }
-        else
-        {
-            throw Unhandled(__FILE__, __LINE__);
-        }
-    }
-    else
-    {
-        ss << "    x = ";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-    }
-
-    FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
-    assert(tmpCur1);
-    if(ocPush == vSubArguments[1]->GetFormulaToken()->GetOpCode())
-    {
-        if(tmpCur1->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken*tmpCurSVR1 =
-                static_cast<const formula::SingleVectorRefToken *>(tmpCur1);
-            ss << "    if (gid0 < " << tmpCurSVR1->GetArrayLength() << ")\n";
-            ss << "    {\n";
-            ss << "        N = ";
-            ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
-            ss << "        if (isnan(N))\n";
-            ss << "            N = 0.0;\n";
-            ss << "    }\n";
-        }
-        else if(tmpCur1->GetType() == formula::svDouble)
-        {
-            ss << "    N = " << tmpCur1->GetDouble() << ";\n";
-        }
-        else
-        {
-            throw Unhandled(__FILE__, __LINE__);
-        }
-    }
-    else
-    {
-        ss << "    N = ";
-        ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
-    }
+    GenerateArg( "x", 0, vSubArguments, ss );
+    GenerateArg( "N", 1, vSubArguments, ss );
     ss << "    double f_2_DIV_PI = 2.0 / M_PI;\n";
     ss << "    if( N < 0.0 )\n";
     ss << "        return CreateDoubleError(IllegalArgument);\n";
@@ -170,44 +109,14 @@ void OpGestep::GenSlidingWindowFunction(
     outputstream &ss,const std::string &sSymName,
     SubArguments &vSubArguments)
 {
+    CHECK_PARAMETER_COUNT( 2, 2 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
-    ss << "    double tmp=0,tmp0 =0,tmp1 = 0;\n";
+    ss << "    double tmp=0;\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss <<"\n";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
-        assert(pCur);
-        if (pCur->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken& rSVR =
-            dynamic_cast< const formula::SingleVectorRefToken& >(*pCur);
-            ss << "    if (gid0 < " << rSVR.GetArrayLength() << ")\n";
-            ss << "    {\n";
-        }
-        else if (pCur->GetType() == formula::svDouble)
-        {
-            ss << "    {\n";
-        }
-
-        if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
-        {
-            ss << "        if (isnan(";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << "))\n";
-            ss << "            tmp"<<i<<" = 0;\n";
-            ss << "        else\n";
-            ss << "            tmp"<<i<<" = ";
-            ss << vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss << ";\n    }\n";
-        }
-        else
-        {
-            ss << "tmp"<<i<<" ="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<";\n";
-        }
-    }
+    GenerateArg( "tmp0", 0, vSubArguments, ss );
+    GenerateArg( "tmp1", 1, vSubArguments, ss );
     ss << "    tmp =tmp0 >= tmp1 ? 1 : 0;\n";
     ss << "    return tmp;\n";
     ss << "}\n";
diff --git a/sc/source/core/opencl/op_logical.cxx 
b/sc/source/core/opencl/op_logical.cxx
index ae4bb9d03de7..2af37c73395e 100644
--- a/sc/source/core/opencl/op_logical.cxx
+++ b/sc/source/core/opencl/op_logical.cxx
@@ -15,158 +15,24 @@
 using namespace formula;
 
 namespace sc::opencl {
-void OpAnd::GenSlidingWindowFunction(outputstream &ss,
-    const std::string &sSymName, SubArguments &vSubArguments)
-{
-    CHECK_PARAMETER_COUNT_MIN( 1 );
-    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
-    ss << "{\n";
-    ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double t = 1,tmp=0;\n";
-    for(size_t j = 0; j< vSubArguments.size(); j++)
-    {
-        ss << "    double tmp"<<j<<" = 1;\n";
-        FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken();
-        if(tmpCur0->GetType() == formula::svSingleVectorRef)
-        {
-        const formula::SingleVectorRefToken*pCurDVR= static_cast<const
-            formula::SingleVectorRefToken *>(tmpCur0);
-        ss<< "    int buffer_len"<<j<<" = "<<pCurDVR->GetArrayLength();
-        ss<< ";\n";
-        ss <<"    if(gid0 >= buffer_len"<<j<<" || isnan(";
-        ss <<vSubArguments[j]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        tmp = 1;\n    else\n";
-        ss <<"        tmp = ";
-        ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-        ss <<"    tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDouble)
-        {
-            ss <<"        tmp = ";
-            ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
-        {
-            const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
-            formula::DoubleVectorRefToken *>(tmpCur0);
-            size_t nCurWindowSize = pCurDVR->GetArrayLength() <
-            pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
-            pCurDVR->GetRefRowSize() ;
-            ss << "    for(int i = ";
-            if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
-            ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
-            ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
-            }
-            else{
-            ss << "0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-            ss <<"    if(isnan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 1;\n    else\n";
-            }
-            else
-            {
-            ss <<"    if(isnan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss <<")||i>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 1;\n    else\n";
-            }
-            ss <<"        tmp = ";
-            ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp"<<j<<" = tmp"<<j<<" && tmp;\n";
-            ss <<"    }\n";
-        }
-        else
-        {
-            ss <<"        tmp"<<j<<" = ";
-            ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-        }
-        ss <<"    t = t && tmp"<<j<<";\n";
-    }
-    ss << "    return t;\n";
-    ss << "}\n";
-}
 
-void OpOr::GenSlidingWindowFunction(outputstream &ss,
+void OpLogicalBinaryOperator::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    CHECK_PARAMETER_COUNT_MIN( 1 );
+    CHECK_PARAMETER_COUNT( 1, 30 );
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double t = 0,tmp=0;\n";
+    ss << "    bool t = " << defaultOpenclValue() << ";\n";
     for(size_t j = 0; j< vSubArguments.size(); j++)
     {
-        ss << "    double tmp"<<j<<" = 0;\n";
-        FormulaToken *tmpCur0 = vSubArguments[j]->GetFormulaToken();
-        if(tmpCur0->GetType() == formula::svSingleVectorRef)
-        {
-        const formula::SingleVectorRefToken*pCurDVR= static_cast<const
-            formula::SingleVectorRefToken *>(tmpCur0);
-        ss<< "    int buffer_len"<<j<<" = "<<pCurDVR->GetArrayLength();
-        ss<< ";\n";
-        ss <<"    if(gid0 >= buffer_len"<<j<<" || isnan(";
-        ss <<vSubArguments[j]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        tmp = 0;\n    else\n";
-        ss <<"        tmp = ";
-        ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-        ss <<"    tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDouble)
-        {
-            ss <<"        tmp = ";
-            ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
-        {
-            const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
-            formula::DoubleVectorRefToken *>(tmpCur0);
-            size_t nCurWindowSize = pCurDVR->GetArrayLength() <
-            pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
-            pCurDVR->GetRefRowSize() ;
-            ss << "    for(int i = ";
-            if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
-            ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
-            ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
-            }
-            else{
-            ss << "0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-            ss <<"    if(isnan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 0;\n    else\n";
-            }
-            else
-            {
-            ss <<"    if(isnan("<<vSubArguments[j]->GenSlidingWindowDeclRef();
-            ss <<")||i>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 0;\n    else\n";
-            }
-            ss <<"        tmp = ";
-            ss <<vSubArguments[j]->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp"<<j<<" = tmp"<<j<<" || tmp;\n";
-            ss <<"    }\n";
-        }
-        ss <<"    t = t || tmp"<<j<<";\n";
+        GenerateArg( j, vSubArguments, ss );
+        ss << "    t = t " << openclOperator() << " (arg" << j << " != 0);\n";
     }
     ss << "    return t;\n";
     ss << "}\n";
 }
+
 void OpNot::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
@@ -174,103 +40,11 @@ void OpNot::GenSlidingWindowFunction(outputstream &ss,
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    double tmp=0;\n";
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svSingleVectorRef)
-    {
-        const formula::SingleVectorRefToken*pCurDVR= static_cast<const
-            formula::SingleVectorRefToken *>(tmpCur0);
-        ss <<"    if(gid0 >= "<<pCurDVR->GetArrayLength()<<" || isnan(";
-        ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss <<"))\n";
-        ss <<"        tmp = 0;\n    else\n";
-        ss <<"        tmp = ";
-        ss <<vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
-        ss <<"    tmp = (tmp == 0.0);\n";
-    }
-    else if(tmpCur0->GetType() == formula::svDouble)
-    {
-        ss <<"        tmp = ";
-        ss <<vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
-        ss <<"    tmp = (tmp == 0.0);\n";
-    }
-    ss << "    return tmp;\n";
+    GenerateArg( 0, vSubArguments, ss );
+    ss << "    return arg0 == 0;\n";
     ss << "}\n";
 }
 
-void OpXor::GenSlidingWindowFunction(outputstream &ss,
-    const std::string &sSymName, SubArguments &vSubArguments)
-{
-    CHECK_PARAMETER_COUNT_MIN( 1 );
-    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
-    ss << "{\n";
-    ss << "    int gid0 = get_global_id(0);\n";
-    ss << "    int t = 0,tmp0 = 0;\n";
-    ss << "    double tmp = 0;\n";
-    for(DynamicKernelArgumentRef & rArg : vSubArguments)
-    {
-        FormulaToken *tmpCur0 = rArg->GetFormulaToken();
-        if(tmpCur0->GetType() == formula::svSingleVectorRef)
-        {
-            const formula::SingleVectorRefToken*pCurDVR= static_cast<const
-                formula::SingleVectorRefToken *>(tmpCur0);
-            ss <<"    if(gid0 >= "<<pCurDVR->GetArrayLength()<<" || isnan(";
-            ss <<rArg->GenSlidingWindowDeclRef();
-            ss <<"))\n";
-            ss <<"        tmp = 0;\n    else\n";
-            ss <<"        tmp = ";
-            ss <<rArg->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp0 = (tmp != 0);\n";
-            ss <<"    t = t ^tmp0;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDouble)
-        {
-            ss <<"        tmp = ";
-            ss <<rArg->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp0 = (tmp != 0);\n";
-            ss <<"    t = t ^tmp0;\n";
-        }
-        else if(tmpCur0->GetType() == formula::svDoubleVectorRef)
-        {
-            const formula::DoubleVectorRefToken*pCurDVR= static_cast<const
-            formula::DoubleVectorRefToken *>(tmpCur0);
-            size_t nCurWindowSize = pCurDVR->GetArrayLength() <
-            pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
-            pCurDVR->GetRefRowSize() ;
-            ss << "    for(int i = ";
-            if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
-            ss << "gid0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            else if(pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()){
-            ss << "0; i < gid0 + " << nCurWindowSize << "; i++) {\n";
-            }
-            else{
-            ss << "0; i < " << nCurWindowSize << "; i++) {\n";
-            }
-            if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
-            {
-            ss <<"    if(isnan("<<rArg->GenSlidingWindowDeclRef();
-            ss <<")||i+gid0>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 0;\n    else\n";
-            }
-            else
-            {
-            ss <<"    if(isnan("<<rArg->GenSlidingWindowDeclRef();
-            ss <<")||i>="<<pCurDVR->GetArrayLength();
-            ss <<")\n";
-            ss <<"        tmp = 0;\n    else\n";
-            }
-            ss <<"        tmp = ";
-            ss <<rArg->GenSlidingWindowDeclRef()<<";\n";
-            ss <<"    tmp0 = (tmp != 0);\n";
-            ss <<"    t = t ^tmp0;\n";
-            ss <<"    }\n";
-        }
-    }
-    ss << "    return t;\n";
-    ss << "}\n";
-}
 void OpIf::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
@@ -278,51 +52,20 @@ void OpIf::GenSlidingWindowFunction(outputstream &ss,
     GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
+    GenerateArg( 0, vSubArguments, ss );
+    if(vSubArguments.size()>1)
+        GenerateArg( 1, vSubArguments, ss );
+    else
+        ss << "    double arg1 = 1;\n";
+    if(vSubArguments.size()>2)
+        GenerateArg( 2, vSubArguments, ss );
+    else
+        ss << "    double arg2 = 0;\n";
 
-    FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
-    if(tmpCur0->GetType() == formula::svDoubleVectorRef)
-    {
-        throw UnhandledToken("unknown operand for ocPush", __FILE__, __LINE__);
-    }
-    if(vSubArguments.size()==3)
-    {
-        ss << "    if(isnan(";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << ")||  ";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << " == 0)\n";
-        ss << "         return ";
-        ss << vSubArguments[2]->GenSlidingWindowDeclRef();
-        ss << ";\n";
-        ss << "     else";
-        ss <<"          return ";
-        ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-        ss <<";\n";
-    }
-    if(vSubArguments.size()==2)
-    {
-        ss << "    if(isnan(";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << ")||  ";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << " == 0)\n";
-        ss << "         return 0;\n";
-        ss << "     else";
-        ss <<"          return ";
-        ss << vSubArguments[1]->GenSlidingWindowDeclRef();
-        ss <<";\n";
-    }
-    if(vSubArguments.size()==1)
-    {
-        ss << "    if(isnan(";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << ")||  ";
-        ss << vSubArguments[0]->GenSlidingWindowDeclRef();
-        ss << " == 0)\n";
-        ss << "         return 0;\n";
-        ss << "     else";
-        ss <<"          return 1;\n";
-    }
+    ss << "    if(arg0 != 0)\n";
+    ss << "        return arg1;\n";
+    ss << "    else\n";
+    ss << "        return arg2;\n";
     ss << "}\n";
 }
 
diff --git a/sc/source/core/opencl/op_logical.hxx 
b/sc/source/core/opencl/op_logical.hxx
index 18cb0b59001f..f4c6b7a952ef 100644
--- a/sc/source/core/opencl/op_logical.hxx
+++ b/sc/source/core/opencl/op_logical.hxx
@@ -14,23 +14,34 @@
 
 namespace sc::opencl {
 
-class OpAnd: public Normal
+/// Implements OpAnd, OpOr, OpXor.
+class OpLogicalBinaryOperator : public Normal
 {
-public:
     virtual void GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments) override;
-    virtual std::string BinFuncName() const override { return "And"; }
     virtual bool canHandleMultiVector() const override { return true; }
+    /// The C operator implementing the function.
+    virtual const char* openclOperator() const = 0;
+    /// Default value when chaining the operator.
+    virtual const char* defaultOpenclValue() const = 0;
 };
 
-class OpOr: public Normal
+class OpAnd: public OpLogicalBinaryOperator
+{
+public:
+    virtual std::string BinFuncName() const override { return "And"; }
+    virtual const char* openclOperator() const override { return "&&"; };
+    virtual const char* defaultOpenclValue() const override { return "true"; }
+};
+
+class OpOr: public OpLogicalBinaryOperator
 {
 public:
-    virtual void GenSlidingWindowFunction(outputstream &ss,
-            const std::string &sSymName, SubArguments &vSubArguments) override;
     virtual std::string BinFuncName() const override { return "Or"; }
-    virtual bool canHandleMultiVector() const override { return true; }
+    virtual const char* openclOperator() const override { return "||"; };
+    virtual const char* defaultOpenclValue() const override { return "false"; }
 };
+
 class OpNot: public Normal
 {
 public:
@@ -38,14 +49,15 @@ public:
             const std::string &sSymName, SubArguments &vSubArguments) override;
     virtual std::string BinFuncName() const override { return "Not"; }
 };
-class OpXor: public Normal
+
+class OpXor: public OpLogicalBinaryOperator
 {
 public:
-    virtual void GenSlidingWindowFunction(outputstream &ss,
-            const std::string &sSymName, SubArguments &vSubArguments) override;
     virtual std::string BinFuncName() const override { return "Xor"; }
-    virtual bool canHandleMultiVector() const override { return true; }
+    virtual const char* openclOperator() const override { return "^"; };
+    virtual const char* defaultOpenclValue() const override { return "false"; }
 };
+
 class OpIf:public Normal
 {
 public:
diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx
index 7f50d5523a15..a10ba9f77b64 100644
--- a/sc/source/core/opencl/opbase.cxx
+++ b/sc/source/core/opencl/opbase.cxx
@@ -174,36 +174,45 @@ bool VectorRef::NeedParallelReduction() const
     return false;
 }
 
-void SlidingFunctionBase::GenerateArg( int num, SubArguments& vSubArguments, 
outputstream& ss )
+void SlidingFunctionBase::GenerateArg( const char* name, int num, 
SubArguments& vSubArguments, outputstream& ss )
 {
     CHECK_PARAMETER_COUNT_MIN( num );
     FormulaToken *token = vSubArguments[num]->GetFormulaToken();
     if( token == nullptr )
         throw Unhandled( __FILE__, __LINE__ );
-    ss << "    double arg" << num << ";\n";
+    ss << "    double " << name << ";\n";
     if(token->GetOpCode() == ocPush)
     {
         if(token->GetType() == formula::svSingleVectorRef)
         {
-            ss << "    if(isnan(";
+            const formula::SingleVectorRefToken* svr =
+                static_cast<const formula::SingleVectorRefToken *>(token);
+            ss << "    if (gid0 >= " << svr->GetArrayLength() << " || isnan(";
             ss << vSubArguments[num]->GenSlidingWindowDeclRef() << "))\n";
-            ss << "        arg" << num << " = 0.0;\n";
+            ss << "        " << name << " = 0.0;\n";
             ss << "    else\n";
-            ss << "        arg" << num << " = ";
+            ss << "        " << name << " = ";
             ss << vSubArguments[num]->GenSlidingWindowDeclRef() << ";\n";
         }
         else if(token->GetType() == formula::svDouble)
-            ss << "    arg" << num << " = " << token->GetDouble() << ";\n";
+            ss << "    " << name << " = " << token->GetDouble() << ";\n";
         else
             throw Unhandled( __FILE__, __LINE__ );
     }
     else
     {
-        ss << "    arg" << num << " = ";
+        ss << "    " << name << " = ";
         ss << vSubArguments[num]->GenSlidingWindowDeclRef() << ";\n";
     }
 }
 
+void SlidingFunctionBase::GenerateArg( int num, SubArguments& vSubArguments, 
outputstream& ss )
+{
+    char buf[ 30 ];
+    sprintf( buf, "arg%d", num );
+    GenerateArg( buf, num, vSubArguments, ss );
+}
+
 void SlidingFunctionBase::GenerateFunctionDeclaration( const std::string& 
sSymName,
     SubArguments& vSubArguments, outputstream& ss )
 {
diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx
index 1b118d39e93e..46b767062b9a 100644
--- a/sc/source/core/opencl/opbase.hxx
+++ b/sc/source/core/opencl/opbase.hxx
@@ -225,7 +225,9 @@ public:
     virtual void GenSlidingWindowFunction( outputstream&,
         const std::string&, SubArguments& ) = 0;
 protected:
-    // generate code for "double arg<num> = <value>;" from vSubArguments
+    // generate code for "double <name> = <value>;" from vSubArguments
+    static void GenerateArg( const char* name, int num, SubArguments& 
vSubArguments, outputstream& ss );
+    // overload, variable will be named "arg<num>"
     static void GenerateArg( int num, SubArguments& vSubArguments, 
outputstream& ss );
     void GenerateFunctionDeclaration( const std::string& sSymName,
         SubArguments& vSubArguments, outputstream& ss );
commit b58acf93626456f9d9b9ff66f9208a3f944180ac
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Tue Sep 6 12:37:43 2022 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Tue Sep 13 09:04:51 2022 +0200

    reduce opencl copy&paste when generating function declaration
    
    Change-Id: Ibe3677ed56423aeb0d19b510664bc402fc53366d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139484
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/source/core/opencl/formulagroupcl.cxx 
b/sc/source/core/opencl/formulagroupcl.cxx
index 9838e9adaef2..28b4c87fdb07 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -1419,15 +1419,8 @@ public:
     virtual void GenSlidingWindowFunction( outputstream& ss,
         const std::string& sSymName, SubArguments& vSubArguments ) override
     {
-        ss << "\ndouble " << sSymName;
-        ss << "_" << BinFuncName() << "(";
-        for (size_t i = 0; i < vSubArguments.size(); i++)
-        {
-            if (i)
-                ss << ", ";
-            vSubArguments[i]->GenSlidingWindowDecl(ss);
-        }
-        ss << ") {\n";
+        GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+        ss << "{\n";
         ss << "double tmp = " << GetBottom() << ";\n";
         ss << "int gid0 = get_global_id(0);\n";
         if (isAverage() || isMinOrMax())
@@ -1534,16 +1527,9 @@ public:
     virtual void GenSlidingWindowFunction( outputstream& ss,
         const std::string& sSymName, SubArguments& vSubArguments ) override
     {
-        ss << "\ndouble " << sSymName;
-        ss << "_" << BinFuncName() << "(";
-        assert(vSubArguments.size() == 2);
-        for (size_t i = 0; i < vSubArguments.size(); i++)
-        {
-            if (i)
-                ss << ", ";
-            vSubArguments[i]->GenSlidingWindowDecl(ss);
-        }
-        ss << ") {\n\t";
+        CHECK_PARAMETER_COUNT( 2, 2 );
+        GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+        ss << "{\n\t";
         ss << "int gid0 = get_global_id(0), i = 0;\n\t";
         ss << "double tmp = ";
         ss << Gen2(vSubArguments[0]->GenSlidingWindowDeclRef(),
@@ -1563,13 +1549,10 @@ public:
         size_t nCurWindowSize = 0;
         FormulaToken* tmpCur = nullptr;
         const formula::DoubleVectorRefToken* pCurDVR = nullptr;
-        ss << "\ndouble " << sSymName;
-        ss << "_" << BinFuncName() << "(";
+        GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+        ss << "{\n";
         for (size_t i = 0; i < vSubArguments.size(); i++)
         {
-            if (i)
-                ss << ",";
-            vSubArguments[i]->GenSlidingWindowDecl(ss);
             size_t nCurChildWindowSize = vSubArguments[i]->GetWindowSize();
             nCurWindowSize = (nCurWindowSize < nCurChildWindowSize) ?
                 nCurChildWindowSize : nCurWindowSize;
@@ -1582,7 +1565,6 @@ public:
                     throw Unhandled(__FILE__, __LINE__);
             }
         }
-        ss << ") {\n";
         ss << "    double tmp = 0.0;\n";
         ss << "    int gid0 = get_global_id(0);\n";
 
diff --git a/sc/source/core/opencl/op_addin.cxx 
b/sc/source/core/opencl/op_addin.cxx
index 5e4dc04a2b0b..a9c2f9508ac8 100644
--- a/sc/source/core/opencl/op_addin.cxx
+++ b/sc/source/core/opencl/op_addin.cxx
@@ -20,15 +20,8 @@ void OpBesselj::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 2, 2 );
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() << "(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double x = 0.0;\n";
     ss << "    double N = 0.0;\n";
@@ -177,15 +170,7 @@ void OpGestep::GenSlidingWindowFunction(
     outputstream &ss,const std::string &sSymName,
     SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    double tmp=0,tmp0 =0,tmp1 = 0;\n";
     ss << "    int gid0=get_global_id(0);\n";
diff --git a/sc/source/core/opencl/op_array.cxx 
b/sc/source/core/opencl/op_array.cxx
index cf54a5be8b92..65a1caf65fbc 100644
--- a/sc/source/core/opencl/op_array.cxx
+++ b/sc/source/core/opencl/op_array.cxx
@@ -19,15 +19,8 @@ namespace sc::opencl {
 void OpSumX2MY2::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"     int gid0=get_global_id(0);\n";
     ss << "    double tmp =0;\n";
     GenTmpVariables(ss,vSubArguments);
@@ -76,15 +69,8 @@ void OpSumX2MY2::GenSlidingWindowFunction(outputstream &ss,
 void OpSumX2PY2::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double tmp =0;\n";
     GenTmpVariables(ss,vSubArguments);
@@ -132,15 +118,8 @@ void OpSumX2PY2::GenSlidingWindowFunction(outputstream &ss,
 void OpSumXMY2::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double tmp =0;\n";
     GenTmpVariables(ss,vSubArguments);
diff --git a/sc/source/core/opencl/op_database.cxx 
b/sc/source/core/opencl/op_database.cxx
index 2a76a4171501..8c7e92e3654e 100644
--- a/sc/source/core/opencl/op_database.cxx
+++ b/sc/source/core/opencl/op_database.cxx
@@ -17,15 +17,8 @@ namespace sc::opencl {
 void OpDmax::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double max = -1000000000000;\n";
     ss << "    double value=0.0;\n";
@@ -144,15 +137,8 @@ void OpDmax::GenSlidingWindowFunction(outputstream &ss,
 void OpDmin::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double min = 1000000000000;\n";
     ss << "    double value=0.0;\n";
@@ -272,15 +258,8 @@ void OpDmin::GenSlidingWindowFunction(outputstream &ss,
 void OpDproduct::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double product = 1;\n";
     ss << "    double value =0;\n";
@@ -398,15 +377,8 @@ void OpDproduct::GenSlidingWindowFunction(outputstream &ss,
 void OpDaverage::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double sum = 0;\n";
     ss << "    int count = 0;\n";
@@ -529,15 +501,8 @@ void OpDaverage::GenSlidingWindowFunction(outputstream &ss,
 void OpDstdev::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double var = 0;\n";
     ss << "    double mean = 0;\n";
@@ -711,15 +676,8 @@ void OpDstdev::GenSlidingWindowFunction(outputstream &ss,
 void OpDstdevp::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double var = 0;\n";
     ss << "    double mean = 0;\n";
@@ -893,15 +851,8 @@ void OpDstdevp::GenSlidingWindowFunction(outputstream &ss,
 void OpDsum::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double sum = 0;\n";
     ss << "    double value =0;\n";
@@ -1020,15 +971,8 @@ void OpDsum::GenSlidingWindowFunction(outputstream &ss,
 void OpDvar::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double var = 0;\n";
     ss << "    double mean = 0;\n";
@@ -1202,15 +1146,8 @@ void OpDvar::GenSlidingWindowFunction(outputstream &ss,
 void OpDvarp::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double var = 0;\n";
     ss << "    double mean = 0;\n";
@@ -1384,15 +1321,8 @@ void OpDvarp::GenSlidingWindowFunction(outputstream &ss,
 void OpDcount::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double value=0;\n";
     ss << "    int count = 0;\n";
@@ -1512,15 +1442,8 @@ void OpDcount::GenSlidingWindowFunction(outputstream &ss,
 void OpDcount2::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double value=0;\n";
     ss << "    int count = 0;\n";
diff --git a/sc/source/core/opencl/op_financial.cxx 
b/sc/source/core/opencl/op_financial.cxx
index 12acbb435081..0840c334f7df 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -22,15 +22,8 @@ void RRI::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 3, 3 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fv;\n";
@@ -92,15 +85,8 @@ void OpNominal::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &
 vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "double temp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
@@ -150,15 +136,8 @@ void OpDollarde::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 2, 2 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double fInt = " << GetBottom() <<";\n\t";
@@ -201,15 +180,8 @@ void OpDollarde::GenSlidingWindowFunction(
 void OpDollarfr::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double fInt = " << GetBottom() <<";\n\t";
@@ -261,15 +233,8 @@ void OpDISC::BinInlineFun(std::set<std::string>& decls,
 void OpDISC::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() << "(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -332,15 +297,8 @@ void OpINTRATE::BinInlineFun(std::set<std::string>& decls,
 void OpINTRATE::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() << "(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -396,15 +354,8 @@ void OpFV::BinInlineFun(std::set<std::string>& decls,
 void OpFV::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -446,15 +397,8 @@ void OpIPMT::BinInlineFun(std::set<std::string>& decls,
 void OpIPMT::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -515,15 +459,8 @@ void OpISPMT::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 4, 4 );
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -569,15 +506,8 @@ void OpISPMT::GenSlidingWindowFunction(outputstream& ss,
 void OpPDuration::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -635,15 +565,8 @@ void OpDuration_ADD::BinInlineFun(std::set<std::string>& 
decls,
 void OpDuration_ADD::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -695,15 +618,8 @@ void OpMDuration::BinInlineFun(std::set<std::string>& 
decls,
 void OpMDuration::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -761,15 +677,8 @@ void Fvschedule::GenSlidingWindowFunction(
     const formula::DoubleVectorRefToken* pCurDVR =
         static_cast<const formula::DoubleVectorRefToken *>(pCur);
     size_t nCurWindowSize = pCurDVR->GetRefRowSize();
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = 1.0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
@@ -800,15 +709,8 @@ void Cumipmt::GenSlidingWindowFunction(
 vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 6 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fRate,fVal;\n";
     ss << "    int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
@@ -915,15 +817,8 @@ void IRR::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 2, 2 );
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() << "(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    #define  Epsilon   1.0E-7\n";
     ss << "    int gid0 = get_global_id(0);\n";
     FormulaToken* pSur = vSubArguments[1]->GetFormulaToken();
@@ -1080,16 +975,8 @@ void XNPV::GenSlidingWindowFunction(
     const formula::DoubleVectorRefToken* pCurDVR =
         static_cast<const formula::DoubleVectorRefToken *>(pCur);
     size_t nCurWindowSize = pCurDVR->GetRefRowSize();
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"( ";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double result = 0.0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "int i=0;\n\t";
@@ -1187,15 +1074,8 @@ void PriceMat::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 6 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double result=0;\n\t";
     ss<< "int nNullDate = GetNullDate( );\n\t";
@@ -1298,15 +1178,8 @@ void PriceMat::GenSlidingWindowFunction(
 void OpSYD::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double result=0;\n";
     ss << "    double cost;\n";
@@ -1398,15 +1271,8 @@ void MIRR::GenSlidingWindowFunction(
         static_cast< const formula::SingleVectorRefToken* >(pCur2);
     assert(pSVR2);
 
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double arg0, arg1, arg2;\n\t";
@@ -1456,15 +1322,8 @@ void MIRR::GenSlidingWindowFunction(
 void OpEffective::GenSlidingWindowFunction(outputstream& ss,
     const std::string &sSymName, SubArguments& vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_" << BinFuncName() << "(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n\t";
     ss << "    double arg0 = " << GetBottom() << ";\n";
@@ -1520,15 +1379,8 @@ void OpEffective::GenSlidingWindowFunction(outputstream& 
ss,
 void OpTbilleq::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "   int gid0 = get_global_id(0);\n";
     ss << "double tmp = 0;\n\t";
     ss << "double tmp000;\n\t";
@@ -1599,15 +1451,8 @@ void OpCumprinc::GenSlidingWindowFunction(outputstream 
&ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 6 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fRate,fVal;\n";
@@ -1726,15 +1571,8 @@ void OpAccrint::GenSlidingWindowFunction(
     SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 7, 7 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = 0;\n";
     ss << "    int nStartDate,nEndDate,mode,freq;\n";
@@ -1841,15 +1679,8 @@ void OpAccrintm::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 5, 5 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int nStartDate,nEndDate,mode;\n\t";
@@ -1969,15 +1800,8 @@ void OpYield::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 7, 7 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp000;\n\t";
@@ -2109,15 +1933,8 @@ void OpYield::GenSlidingWindowFunction(
 void OpSLN::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double cost;\n";
@@ -2186,15 +2003,8 @@ void OpYieldmat::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 6 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp000;\n\t";
@@ -2309,15 +2119,8 @@ void OpYieldmat::GenSlidingWindowFunction(
 void OpPMT::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss<<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    double temp=0.0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
@@ -2369,15 +2172,8 @@ void OpPMT::GenSlidingWindowFunction(outputstream &ss,
 void OpNPV::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ", ";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0.0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nCount = 1;\n";
@@ -2499,15 +2295,8 @@ void OpNPV::GenSlidingWindowFunction(outputstream &ss,
 void OpPrice::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ", ";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss<<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
     ss<<"    double tmp0=0;\n";
@@ -2573,15 +2362,8 @@ void OpOddlprice::BinInlineFun(std::set<std::string>& 
decls,
 void OpOddlprice::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss <<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    double tmp = 0;\n";
     ss <<"    int gid0 = get_global_id(0);\n";
     ss <<"    double tmp0=0;\n";
@@ -2670,15 +2452,8 @@ void OpOddlyield::BinInlineFun(std::set<std::string>& 
decls,
 void OpOddlyield::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss <<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    double tmp = 0;\n";
     ss <<"    int gid0 = get_global_id(0);\n";
     ss <<"    double tmp0=0;\n";
@@ -2771,15 +2546,8 @@ void OpPriceDisc::BinInlineFun(std::set<std::string>& 
decls,
 void OpPriceDisc::GenSlidingWindowFunction(outputstream &ss,
           const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss<<"    double tmp0=0;\n";
@@ -2831,15 +2599,8 @@ void OpPriceDisc::GenSlidingWindowFunction(outputstream 
&ss,
 void OpNper::GenSlidingWindowFunction(outputstream &ss,
          const std::string &sSymName, SubArguments &vSubArguments)
  {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-     if (i)
-         ss << ", ";
-     vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss <<"    double tmp0=0;\n";
@@ -2904,15 +2665,8 @@ void OpPPMT::BinInlineFun(std::set<std::string>& decls,
 void OpPPMT::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss<<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
     ss<<"    double arg=0;\n";
@@ -3008,15 +2762,8 @@ void OpCoupdaybs::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &
 vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3099,15 +2846,8 @@ void OpCoupdays::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &
 vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3185,15 +2925,8 @@ void OpCouppcd::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName,
     SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3272,15 +3005,8 @@ void OpCoupncd::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &
 vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3372,15 +3098,8 @@ void OpCoupdaysnc::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName,
     SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3458,15 +3177,8 @@ void OpCoupnum::BinInlineFun(std::set<std::string>& 
decls,
 void OpCoupnum::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-          ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle,nMat,nFreq,nBase;\n";
@@ -3538,16 +3250,9 @@ void OpAmordegrc::GenSlidingWindowFunction(outputstream 
&ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 7 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-      if (i)
-        ss << ",";
-      vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n    ";
-    ss << "int gid0 = get_global_id(0);\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
+    ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    double fCost,fRestVal,fPer,fRate;\n";
     ss << "    int nDate,nFirstPer,nBase;\n";
@@ -3694,15 +3399,8 @@ void OpAmorlinc::GenSlidingWindowFunction(outputstream 
&ss,
              const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 7 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = 0;\n";
     ss << "    double fCost,fRestVal,fPer,fRate;\n";
@@ -3833,15 +3531,8 @@ void OpReceived::GenSlidingWindowFunction(outputstream 
&ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 5, 5 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double tmp = " << GetBottom() <<";\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int nSettle, nMat;\n";
@@ -3931,15 +3622,8 @@ void OpYielddisc::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT(5,5);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp000;\n\t";
@@ -4051,15 +3735,8 @@ void OpYielddisc::GenSlidingWindowFunction(
 void OpTbillprice::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = 0;\n";
 
@@ -4087,21 +3764,14 @@ void RATE::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 6, 6 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
 
     FormulaToken* pCur = vSubArguments[5]->GetFormulaToken();
     assert(pCur);
     const formula::SingleVectorRefToken* pSVR =
         static_cast< const formula::SingleVectorRefToken* >(pCur);
     assert(pSVR);
-    ss << ") {\n";
     ss << "    double result;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    bool bValid = true, bFound = false;\n";
@@ -4226,15 +3896,8 @@ void RATE::GenSlidingWindowFunction(
 void OpTbillyield::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double tmp = 0;\n\t";
     ss << "double tmp000;\n\t";
@@ -4302,15 +3965,8 @@ void OpDDB::GenSlidingWindowFunction(outputstream& ss,
             const std::string &sSymName, SubArguments& vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 5, 5 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = 0;\n";
     ss << "    double fCost, fSalvage, fLife, fPeriod, fFactor;\n";
@@ -4403,15 +4059,8 @@ void OpPV::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &
 vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    double result = 0;\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double rate;\n";
@@ -4538,15 +4187,8 @@ tmpCur4);
 void OpVDB::GenSlidingWindowFunction(
     outputstream &ss, const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int singleIndex = gid0;\n";
     ss << "    double result = 0;\n";
@@ -4587,15 +4229,8 @@ void OpXirr::GenSlidingWindowFunction(outputstream &ss,
     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     pCurDVR->GetRefRowSize() ;
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int doubleIndex = gid0;\n";
     ss << "    int singleIndex = gid0;\n";
@@ -4700,15 +4335,8 @@ void OpDB::GenSlidingWindowFunction(outputstream& ss,
             const std::string &sSymName, SubArguments& vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 5, 5 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fCost, fSalvage, fLife, fPeriod;\n";
     ss << "    int nMonths;\n";
diff --git a/sc/source/core/opencl/op_logical.cxx 
b/sc/source/core/opencl/op_logical.cxx
index 1fa21e8250e6..ae4bb9d03de7 100644
--- a/sc/source/core/opencl/op_logical.cxx
+++ b/sc/source/core/opencl/op_logical.cxx
@@ -19,15 +19,8 @@ void OpAnd::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT_MIN( 1 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double t = 1,tmp=0;\n";
     for(size_t j = 0; j< vSubArguments.size(); j++)
@@ -105,15 +98,8 @@ void OpOr::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT_MIN( 1 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double t = 0,tmp=0;\n";
     for(size_t j = 0; j< vSubArguments.size(); j++)
@@ -185,15 +171,8 @@ void OpNot::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 1, 1 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp=0;\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -223,15 +202,8 @@ void OpXor::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT_MIN( 1 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    int t = 0,tmp0 = 0;\n";
     ss << "    double tmp = 0;\n";
@@ -303,15 +275,8 @@ void OpIf::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 1, 3 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
 
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
diff --git a/sc/source/core/opencl/op_math.cxx 
b/sc/source/core/opencl/op_math.cxx
index 4dec63ac654f..b837d930910f 100644
--- a/sc/source/core/opencl/op_math.cxx
+++ b/sc/source/core/opencl/op_math.cxx
@@ -20,14 +20,7 @@ namespace sc::opencl {
 void OpCos::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-        ss << "\ndouble " << sSymName;
-        ss << "_"<< BinFuncName() <<"(";
-        for (size_t i = 0; i < vSubArguments.size(); i++)
-        {
-            if (i) ss << ",";
-            vSubArguments[i]->GenSlidingWindowDecl(ss);
-        }
-        ss << ")\n";
+        GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
         ss << "{\n";
         ss << "    int gid0=get_global_id(0);\n";
         ss << "    double arg0 = 0.0f;\n";
@@ -71,15 +64,8 @@ void OpSec::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss <<"    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
@@ -102,15 +88,8 @@ void OpSecH::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss <<"    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
@@ -125,15 +104,8 @@ void OpMROUND::GenSlidingWindowFunction(outputstream &ss,
         const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT(2, 2);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ", ";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss<<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss<<"    double tmp = 0;\n";
     ss<<"    int gid0 = get_global_id(0);\n";
     ss<<"    double arg0=0;\n";
@@ -184,15 +156,8 @@ void OpCosh::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n";
@@ -208,15 +173,7 @@ void OpCosh::GenSlidingWindowFunction(outputstream &ss,
 void OpCot::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -269,15 +226,8 @@ void OpCoth::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n";
@@ -301,15 +251,8 @@ void OpCombinA::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 2, 2 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tem;\n";
     ss << "    double arg0,arg1;\n";
@@ -358,15 +301,8 @@ void OpEven::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n";
@@ -390,15 +326,8 @@ void OpMod::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
     CHECK_PARAMETER_COUNT( 2, 2 );
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n";
@@ -424,15 +353,8 @@ void OpMod::GenSlidingWindowFunction(outputstream &ss,
 void OpLog::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tem;\n";
     ss << "    double arg0,arg1;\n";
@@ -475,15 +397,8 @@ void OpCsc::GenSlidingWindowFunction(
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss <<"int gid0=get_global_id(0);\n\t";
     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
@@ -504,15 +419,8 @@ void OpCountIfs::GenSlidingWindowFunction(outputstream &ss,
     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     pCurDVR->GetRefRowSize() ;
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    int tmp =0;\n";
     ss << "    int loop;\n";
@@ -696,15 +604,8 @@ void OpSumIfs::GenSlidingWindowFunction(outputstream &ss,
         ss << "}\n";
     }// finish generate reduction code
     // generate functions as usual
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss << "    double tmp =0;\n";
     if (!mNeedReductionKernel)
@@ -767,15 +668,8 @@ void OpCscH::GenSlidingWindowFunction(
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss <<"int gid0=get_global_id(0);\n\t";
     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
@@ -790,14 +684,7 @@ void OpCscH::GenSlidingWindowFunction(
 void OpExp::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -844,15 +731,8 @@ void OpAverageIfs::GenSlidingWindowFunction(outputstream 
&ss,
     size_t nCurWindowSize = pCurDVR->GetArrayLength() <
     pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength():
     pCurDVR->GetRefRowSize() ;
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n    {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"     int gid0=get_global_id(0);\n";
     ss << "    double tmp =0;\n";
     ss << "    int count=0;\n";
@@ -901,15 +781,8 @@ void OpLog10::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n{\n\t";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n\t";
     ss <<"int gid0=get_global_id(0);\n\t";
     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
@@ -925,15 +798,8 @@ void OpLog10::GenSlidingWindowFunction(outputstream &ss,
 void OpSinh::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss <<") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss <<"    int gid0=get_global_id(0);\n";
     ss <<"    double arg0 = " <<
         vSubArguments[0]->GenSlidingWindowDeclRef();
@@ -947,14 +813,7 @@ void OpSinh::GenSlidingWindowFunction(outputstream &ss,
 void OpSin::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -996,15 +855,8 @@ void OpSin::GenSlidingWindowFunction(outputstream &ss,
 void OpAbs::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0   = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1032,14 +884,8 @@ void OpArcCos::BinInlineFun(std::set<std::string>& decls,
 void OpArcCos::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1058,14 +904,8 @@ void OpArcCos::GenSlidingWindowFunction(outputstream &ss,
 void OpArcCosHyp::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0   = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1103,14 +943,7 @@ void OpArcCosHyp::GenSlidingWindowFunction(outputstream 
&ss,
 void OpTan::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -1154,15 +987,7 @@ void OpTanH::GenSlidingWindowFunction(outputstream &ss,
     FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const
           formula::SingleVectorRefToken *>(tmpCur);
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = "<< vSubArguments[0]->GenSlidingWindowDeclRef();
@@ -1178,15 +1003,7 @@ void OpTanH::GenSlidingWindowFunction(outputstream &ss,
 void OpPower::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg[2];\n";
@@ -1246,15 +1063,7 @@ void OpPower::GenSlidingWindowFunction(outputstream &ss,
 void OpSqrt::GenSlidingWindowFunction(outputstream &ss,
             const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i)
-            ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -1301,14 +1110,8 @@ void OpSqrt::GenSlidingWindowFunction(outputstream &ss,
 void OpArcCot::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0   = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1326,14 +1129,7 @@ void OpArcCot::GenSlidingWindowFunction(outputstream &ss,
 void OpArcCotHyp::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ")\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
     ss << "{\n";
     ss << "    int gid0=get_global_id(0);\n";
     ss << "    double arg0 = 0.0f;\n";
@@ -1380,14 +1176,8 @@ void OpArcSin::BinInlineFun(std::set<std::string>& decls,
 void OpArcSin::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0   = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1405,14 +1195,8 @@ void OpArcSin::GenSlidingWindowFunction(outputstream &ss,
 void OpArcSinHyp::GenSlidingWindowFunction(outputstream &ss,
     const std::string &sSymName, SubArguments &vSubArguments)
 {
-    ss << "\ndouble " << sSymName;
-    ss << "_"<< BinFuncName() <<"(";
-    for (size_t i = 0; i < vSubArguments.size(); i++)
-    {
-        if (i) ss << ",";
-        vSubArguments[i]->GenSlidingWindowDecl(ss);
-    }
-    ss << ") {\n";
+    GenerateFunctionDeclaration( sSymName, vSubArguments, ss );
+    ss << "{\n";
     ss << "    int gid0   = get_global_id(0);\n";
     ss << "    double tmp = " << GetBottom() << ";\n";
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
@@ -1453,14 +1237,8 @@ void OpArcTan2::BinInlineFun(std::set<std::string>& 
decls,
 void OpArcTan2::GenSlidingWindowFunction(outputstream &ss,

... etc. - the rest is truncated

Reply via email to