summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryiming ju <yiming@multicorewareinc.com>2013-11-01 16:54:56 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-11-01 12:56:14 -0500
commit8e88765cc67b42755b6950dccb24f771c1e1dc83 (patch)
tree5cf86c7081bc17294a168f759ef326579082af3b
parentGPU Calc: implement NAN argument handling in PMT (diff)
downloadcore-8e88765cc67b42755b6950dccb24f771c1e1dc83.tar.gz
core-8e88765cc67b42755b6950dccb24f771c1e1dc83.zip
GPU Calc: refactor code generation for inlined library routines
Refactored all library functions of now formule calc in GPU Change-Id: Icf238c18cae5ca2b685a99204994f5d3211b3ac9 Signed-off-by: haochen <haochen@multicorewareinc.com> Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
-rw-r--r--sc/source/core/opencl/formulagroupcl.cxx2
-rw-r--r--sc/source/core/opencl/formulagroupcl_finacial.hxx727
-rw-r--r--sc/source/core/opencl/op_financial.cxx230
-rw-r--r--sc/source/core/opencl/op_financial.hxx17
-rw-r--r--sc/source/core/opencl/opinlinefun_finacial.cxx879
5 files changed, 1121 insertions, 734 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 2dfc0cf65b59..d4dada657a4a 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -23,7 +23,6 @@
#include "op_math.hxx"
#include "op_statistical.hxx"
#include "formulagroupcl_public.hxx"
-#include "formulagroupcl_finacial.hxx"
#include <list>
#include <map>
@@ -1187,7 +1186,6 @@ public:
}
// preambles
decl << publicFunc;
- decl << finacialFunc;
DK->DumpInlineFun(inlineDecl,inlineFun);
for(std::set<std::string>::iterator set_iter=inlineDecl.begin();
set_iter!=inlineDecl.end();set_iter++)
diff --git a/sc/source/core/opencl/formulagroupcl_finacial.hxx b/sc/source/core/opencl/formulagroupcl_finacial.hxx
deleted file mode 100644
index da09168ff7f1..000000000000
--- a/sc/source/core/opencl/formulagroupcl_finacial.hxx
+++ /dev/null
@@ -1,727 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#ifndef SC_OPENCL_FORMULAGROUPCL_FINACIAL_HXX
-#define SC_OPENCL_FORMULAGROUPCL_FINACIAL_HXX
-const char* finacialFunc =
-"double GetRmz( double fZins, double fZzr, double fBw, double fZw, int nF )\n"
-"{\n"
- "\tdouble fRmz;\n"
- "\tif( fZins == 0.0 )\n"
- "\t\tfRmz = ( fBw + fZw ) / fZzr;\n"
- "\telse\n"
- "\t\t{\n"
- "\t\t\tdouble fTerm = pow( 1.0 + fZins, fZzr );\n"
- "\t\t\tif( nF > 0 )\n"
- "\t\t\t\tfRmz = ( fZw * fZins / ( fTerm - 1.0 ) + fBw"
- " * fZins / ( 1.0 - 1.0 / fTerm ) ) / ( 1.0 + fZins );\n"
- "\t\t\telse\n"
- "\t\t\t\tfRmz = fZw * fZins / ( fTerm - 1.0 ) + fBw * fZins /"
- "( 1.0 - 1.0 / fTerm );\n"
- "\t\t}\n"
- "\treturn -fRmz;\n"
-"}\n\n"
-"double GetZw( double fZins, double fZzr, double fRmz, double fBw, int nF )\n"
-"{\n"
-" double fZw;\n"
-" if( fZins == 0.0 )\n"
-" fZw = fBw + fRmz * fZzr;\n"
-" else\n"
-" {\n"
-" double fTerm = pow( 1.0 + fZins, fZzr );\n"
-" if( nF > 0 )\n"
-" fZw = fBw * fTerm + fRmz * ( 1.0 + fZins ) *"
-"( fTerm - 1.0 ) / fZins;\n"
-" else\n"
-" fZw = fBw * fTerm + fRmz * ( fTerm - 1.0 ) / fZins;\n"
-" }\n"
-" return -fZw;\n"
-"}\n\n"
-"bool IsLeapYear( int n )\n"
-"{\n"
- "return ( (( ( n % 4 ) == 0 ) && ( ( n % 100 ) != 0)) || ( ( n % 400 ) == 0 ) );\n"
-"}\n"
-
-"int DaysInMonth( int nMonth, int nYear )\n"
-"{\n"
- " int aDaysInMonth[12] = { 31, 28, 31, 30, 31, 30,\n"
- " 31, 31, 30, 31, 30, 31 };\n"
-"\n"
-" if ( nMonth != 2 )\n"
-" return aDaysInMonth[nMonth-1];\n"
-" else\n"
-" {\n"
-" if ( IsLeapYear(nYear) )\n"
-" return aDaysInMonth[nMonth-1] + 1;\n"
-" else\n"
-" return aDaysInMonth[nMonth-1];\n"
-" }\n"
-"}\n"
-
-"void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear )\n"
-"{\n"
-"\n"
-" int nTempDays;\n"
-" int i = 0;\n"
-" bool bCalc;\n"
-
-" do\n"
-" {\n"
-" nTempDays = nDays;\n"
-" *rYear = (int)((nTempDays / 365) - i);\n"
-" nTempDays -= ((int) *rYear -1) * 365;\n"
-" nTempDays -= (( *rYear -1) / 4) - (( *rYear -1) / 100) + ((*rYear -1) / 400);\n"
-" bCalc = false;\n"
-" if ( nTempDays < 1 )\n"
-" {\n"
-" i++;\n"
-" bCalc = true;\n"
-" }\n"
-" else\n"
-" {\n"
-" if ( nTempDays > 365 )\n"
-" {\n"
-" if ( (nTempDays != 366) || !IsLeapYear( *rYear ) )\n"
-" {\n"
-" i--;\n"
-" bCalc = true;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" while ( bCalc );\n"
-
-" *rMonth = 1;\n"
-" while ( (int)nTempDays > DaysInMonth( *rMonth, *rYear ) )\n"
-" {\n"
-" nTempDays -= DaysInMonth( *rMonth, *rYear );\n"
-" *rMonth+=1;\n"
-" }\n"
-" *rDay = (int)nTempDays;\n"
-"}\n"
-
-"int DateToDays( int nDay, int nMonth, int nYear )\n"
-"{\n"
-" int nDays = ((int)nYear-1) * 365;\n"
-" nDays += ((nYear-1) / 4) - ((nYear-1) / 100) + ((nYear-1) / 400);\n"
-
-" for( int i = 1; i < nMonth; i++ )\n"
-" nDays += DaysInMonth(i,nYear);\n"
-" nDays += nDay;\n"
-"\n"
-" return nDays;\n"
-"}\n"
-"int GetNullDate()\n"
-"{\n"
-" return DateToDays(30,12,1899 );\n"
-"}\n"
-
-"void ScaDate( int nNullDate, int nDate, int nBase,int *nOrigDay, int *nMonth,int *nYear,int *bLastDayMode,int *bLastDay,int *b30Days,int *bUSMode,int *nDay)\n"
-"{\n"
-"DaysToDate( nNullDate + nDate, nOrigDay, nMonth, nYear );\n"
-"*bLastDayMode = (nBase != 5);\n"
-"*bLastDay = (*nOrigDay >= DaysInMonth( *nMonth, *nYear ));\n"
-"*b30Days = (nBase == 0) || (nBase == 4);\n"
-"*bUSMode = (nBase == 0);\n"
- "if( *b30Days)\n"
- "{\n"
- "*nDay = min( *nOrigDay, 30);\n"
- "if( *bLastDay || (*nDay >=DaysInMonth( *nMonth, *nYear )) )\n"
- "*nDay = 30;\n"
- "}\n"
- "else\n"
- "{\n"
- "int nLastDay = DaysInMonth( *nMonth, *nYear );\n"
- "*nDay = *bLastDay ? nLastDay : min( *nOrigDay, nLastDay );\n"
- "}\n"
-"}\n"
-
-"void addMonths(int b30Days,int bLastDay,int *nDay,int nOrigDay,int *nMonth,int nMonthCount,int *year)\n"
-"{\n"
- "int nNewMonth = nMonthCount + *nMonth;\n"
- "if( nNewMonth > 12 )\n"
- "{\n"
- "--nNewMonth;\n"
- "*year+=nNewMonth / 12 ;\n"
- "*nMonth = ( nNewMonth % 12 ) + 1;\n"
- "}\n"
- "else if( nNewMonth < 1 )\n"
- "{\n"
- "*year+= nNewMonth / 12 - 1 ;\n"
- "*nMonth = nNewMonth % 12 + 12 ;\n"
- "}\n"
- "else\n"
- "*nMonth = nNewMonth ;\n"
- "if( b30Days )\n"
- "{\n"
- "*nDay = min( nOrigDay, 30);\n"
- "if( bLastDay || (*nDay >= DaysInMonth( *nMonth, *year )) )\n"
- "*nDay = 30;\n"
- "}\n"
- "else\n"
- "{\n"
- "int nLastDay = DaysInMonth( *nMonth, *year );\n"
- "*nDay = bLastDay ? nLastDay : min( nOrigDay, nLastDay );\n"
- "}\n"
-"}\n"
-"int getDaysInMonthRange( int nFrom, int nTo,int b30Days,int year)\n"
-"{\n"
- "if( nFrom > nTo )\n"
- "return 0;\n"
- "int nRet = 0;\n"
- "if( b30Days )\n"
- "nRet = (nTo - nFrom + 1) * 30;\n"
- "else\n"
- "{\n"
- "for( int nMonthIx = nFrom; nMonthIx <= nTo; ++nMonthIx )\n"
- "nRet += b30Days ? 30 : DaysInMonth( nMonthIx, year );\n"
- "}\n"
- "return nRet;\n"
-"}\n"
-
-"int GetDaysInYears( int nYear1, int nYear2 )\n"
-"{\n"
- "int nLeaps = 0;\n"
- "for( int n = nYear1 ; n <= nYear2 ; n++ )\n"
- "{\n"
- "if( IsLeapYear( n ) )\n"
- "nLeaps++;\n"
- "}\n"
- "int nSum = 1;\n"
- "nSum += nYear2;\n"
- "nSum -= nYear1;\n"
- "nSum *= 365;\n"
- "nSum += nLeaps;\n"
- "return nSum;\n"
-"}\n"
-
-"int GetDaysInYear( int nNullDate, int nDate, int nMode )\n"
-"{\n"
-"switch( nMode )\n"
-"{\n"
-"case 0:\n"
-"case 2:\n"
-"case 4:\n"
- "return 360;\n"
-"case 1:\n"
- "{\n"
- "int nD=0, nM=0, nY=0;\n"
- "nDate += nNullDate;\n"
- "DaysToDate( nDate, &nD, &nM, &nY );\n"
- "return IsLeapYear( nY )? 366 : 365;\n"
- "}\n"
-"case 3:\n"
- "return 365;\n"
-"}\n"
-"}\n"
-"int getDaysInYearRange( int nFrom, int nTo,int b30Days )\n"
-"{\n"
- "if( nFrom > nTo )\n"
- "return 0;\n"
- "return b30Days ? ((nTo - nFrom + 1) * 360) : GetDaysInYears( nFrom, nTo );\n"
-"}\n"
-
-"int getDiff(int rFrom,int rTo,int fDay,int fMonth,int fYear,int fbLastDayMode,int fbLastDay,int fb30Days,int fbUSMode,int fnDay,\n"
- "int tDay,int tMonth,int tYear,int tbLastDayMode,int tbLastDay,int tb30Days,int tbUSMode,int tnDay)\n"
-"{\n"
-"if(rFrom>rTo)\n"
-"{\n"
-"int d=fDay;fDay=tDay;tDay=d;\n"
-"int m=fMonth;fMonth=tMonth;tMonth=m;\n"
-"int y=fYear;fYear=tYear;tYear=y;\n"
-"int a=fbLastDayMode;fbLastDayMode=tbLastDayMode;tbLastDayMode=a;\n"
-"int b=fbLastDay;fbLastDay=tbLastDay;tbLastDay=b;\n"
-"int c=fb30Days;fb30Days=tb30Days;tb30Days=c;\n"
-"int e=fbUSMode;fbUSMode=tbUSMode;tbUSMode=e;\n"
-"int f=fnDay;fnDay=tnDay;tnDay=f;\n"
-"}\n"
-"int nDiff=0;\n"
-"if( tb30Days )\n"
-"{\n"
-"if( tbUSMode )\n"
-"{\n"
- "if( ((fMonth == 2) || (fnDay < 30)) && (tDay == 31) )\n"
- "tnDay = 31;\n"
- "else if( (tMonth == 2) && tbLastDay )\n"
- "tnDay = DaysInMonth( 2, tYear );\n"
-"}\n"
-"else\n"
-"{\n"
- "if( (fMonth == 2) && (fnDay == 30) )\n"
- "fnDay = DaysInMonth( 2, fYear );\n"
- "if( (tMonth == 2) && (tnDay == 30) )\n"
- "tnDay = DaysInMonth( 2, tYear );\n"
-"}\n"
-"}\n"
-"if( (fYear < tYear) || ((fYear == tYear) && (fMonth < tMonth)) )\n"
-"{\n"
-"nDiff = (fb30Days? 30:DaysInMonth(fMonth,fYear) )- fnDay + 1;\n"
-"fDay = fnDay = 1;\n"
-"fbLastDay = 0;\n"
-"addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,1,&fYear);\n"
-"if( fYear < tYear )\n"
-"{\n"
- "nDiff += getDaysInMonthRange( fMonth, 12,fb30Days,fYear);\n"
- "addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,13-fMonth,&fYear);\n"
- "nDiff += getDaysInYearRange( fYear, tYear - 1,fb30Days);\n"
- "fYear+=tYear - fYear;\n"
-"}\n"
-"nDiff += getDaysInMonthRange(fMonth, tMonth - 1,fb30Days ,fYear );\n"
-"addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,tMonth-fMonth,&fYear);\n"
-"}\n"
-"nDiff += tnDay - fnDay;\n"
-"return nDiff > 0 ? nDiff : 0;\n"
-"}\n"
-
-"int lcl_Getcoupdaybs(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
-"{\n"
- "int aDate = nMat;\n"
- "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,sMonth=0, sYear=0;\n"
- "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
- "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
- "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
- "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
- "rYear= sYear;\n"
- "nSettle=nSettle+nNullDate;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "if( aDate < nSettle )\n"
- "{\n"
- "rYear+= 1;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "}\n"
- "while(aDate > nSettle )\n"
- "{\n"
- "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear);\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "}\n"
- "return getDiff( aDate, nSettle, rDay, rMonth, rYear, rbLastDayMode, rbLastDay, rb30Days, rbUSMode, rnDay,\n"
- "sDay, sMonth, sYear, sbLastDayMode, sbLastDay, sb30Days, sbUSMode, snDay);\n"
-"}\n"
-
-"int lcl_Getcoupdays(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
-"{\n"
- "int aDate = nMat;\n"
- "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,sMonth=0, sYear=0;\n"
- "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
- "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
- "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
- "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
- "rYear= sYear;\n"
- "nSettle=nSettle+nNullDate;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "if( aDate < nSettle )\n"
- "{ \n"
- "rYear+= 1;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "}\n"
- "while(aDate > nSettle )\n"
- "{\n"
- "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear);\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "}\n"
- "int aNextDate=aDate;int aDay=rDay,aMonth=rMonth, aYear=rYear;\n"
- "int abLastDayMode=rbLastDayMode, abLastDay=rbLastDay,ab30Days=rb30Days,abUSMode=rbUSMode,anDay=rnDay;\n"
- "addMonths(ab30Days,abLastDay,&anDay,aDay,&aMonth,12/nFreq,&aYear);\n"
- "return getDiff( aDate, aNextDate, rDay, rMonth, rYear, rbLastDayMode, rbLastDay, rb30Days, rbUSMode, rnDay,\n"
- "aDay, aMonth, aYear, abLastDayMode, abLastDay, ab30Days, abUSMode, anDay);\n"
-"}\n"
-
-"int lcl_Getcoupnum(int nNullDate,int nSettle, int nMat,int nFreq)\n"
-"{\n"
- "int aDate = nMat;int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;\n"
- "int sDay=0,sMonth=0, sYear=0;\n"
- "DaysToDate(aDate+nNullDate,&rDay, &rMonth, &rYear );\n"
- "DaysToDate(nMat+nNullDate,&mDay, &mMonth, &mYear );\n"
- "DaysToDate(nSettle+nNullDate,&sDay, &sMonth, &sYear );\n"
- "rYear= sYear;\n"
- "nSettle=nSettle+nNullDate;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "if( aDate < nSettle )\n"
- "rYear+= 1;\n"
- "int d=DateToDays( rDay,rMonth,rYear );\n"
- "int nMonthCount=-1*(12 / nFreq);\n"
- "while(d > nSettle )\n"
- "{\n"
- "int nNewMonth = nMonthCount + rMonth;\n"
- "if( nNewMonth > 12 )\n"
- "{\n"
- "--nNewMonth;\n"
- "rYear+=nNewMonth / 12;\n"
- "rMonth = nNewMonth % 12 + 1;\n"
- "}\n"
- "else if( nNewMonth < 1 )\n"
- "{\n"
- "rYear+= nNewMonth / 12 - 1;\n"
- "rMonth = nNewMonth % 12 + 12;\n"
- "}\n"
- "else\n"
- "rMonth = nNewMonth;\n"
- "d=DateToDays( rDay,rMonth,rYear );\n"
- "}\n"
- "int n=(mYear-rYear)*12+mMonth-rMonth;\n"
- "n=n*nFreq/12;\n"
- "return n;\n"
-"}\n"
-
-"double coupdays(int nSettle,int nMat,int nFreq,int nBase)\n"
-"{\n"
- "int nNullDate=GetNullDate();\n"
- "if( nBase == 1 )\n"
- "return lcl_Getcoupdays(nNullDate, nSettle, nMat,nFreq, nBase);\n"
- "else\n"
- "return (double)GetDaysInYear(0,0,nBase)/nFreq;\n"
-"}\n"
-
-"double coupdaybs( int nSettle,int nMat,int nFreq,int nBase)\n"
-"{\n"
- "int nNullDate=GetNullDate();\n"
- "return lcl_Getcoupdaybs(nNullDate, nSettle, nMat,nFreq, nBase);\n"
-"}\n"
-
-"double coupdaysnc( int nSettle,int nMat,int nFreq,int nBase)\n"
-"{\n"
-"int nNullDate=GetNullDate();\n"
-"if((nBase != 0) && (nBase != 4))\n"
-"{\n"
- "int aDate = nMat;\n"
- "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,sMonth=0, sYear=0;\n"
- "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
- "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
- "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
- "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
- "rYear= sYear;\n"
- "nSettle=nSettle+nNullDate;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
- "if( aDate > nSettle )\n"
- "{\n"
- "rYear-= 1;\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
-"}\n"
-"while(aDate <= nSettle )\n"
-"{\n"
- "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,12/nFreq,&rYear);\n"
- "aDate=DateToDays( rDay,rMonth,rYear );\n"
-"}\n"
-"return getDiff( nSettle, aDate, sDay, sMonth, sYear, sbLastDayMode, sbLastDay, sb30Days, sbUSMode, snDay,\n"
- "rDay, rMonth, rYear, rbLastDayMode, rbLastDay, rb30Days, rbUSMode, rnDay);\n"
-"}\n"
-"else\n"
- "return coupdays(nSettle,nMat,nFreq,nBase)- coupdaybs( nSettle,nMat,nFreq,nBase);\n"
-"}\n"
-
-"double coupnum( int nSettle,int nMat,int nFreq,int nBase)\n"
-"{\n"
- "int nNullDate=GetNullDate();\n"
- "return lcl_Getcoupnum(nNullDate,nSettle,nMat,nFreq);\n"
-"}\n"
-
-"double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
- "double fRedemp, int nFreq, int nBase )\n"
-"{\n"
- "double fFreq = nFreq;\n"
- "double fE = coupdays( nSettle, nMat, nFreq, nBase );\n"
- "double fDSC_E = coupdaysnc( nSettle, nMat, nFreq, nBase ) / fE;\n"
- "double fN = coupnum( nSettle, nMat, nFreq, nBase );\n"
- "double fA = coupdaybs( nSettle, nMat, nFreq, nBase );\n"
- "double fRet = fRedemp / ( pow( 1.0 + fYield / fFreq, fN - 1.0 + fDSC_E ) );\n"
- "fRet -= 100.0 * fRate / fFreq * fA / fE;\n"
- "double fT1 = 100.0 * fRate / fFreq;\n"
- "double fT2 = 1.0 + fYield / fFreq;\n"
- "for( double fK = 0.0 ; fK < fN ; fK+=1.0 )\n"
- "fRet += fT1 / pow( fT2, fK + fDSC_E );\n"
-"return fRet;\n"
-"}\n"
-
-"double getYield_( int nNullDate, int nSettle, int nMat, double fCoup, double fPrice,double fRedemp, int nFreq, int nBase )\n"
-"{\n"
- "double fRate = fCoup;\n"
- "double fPriceN = 0.0;\n"
- "double fYield1 = 0.0;\n"
- "double fYield2 = 1.0;\n"
- "double fPrice1 = getPrice_(nSettle, nMat, fRate, fYield1, fRedemp, nFreq, nBase );\n"
- "double fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase );\n"
- "double fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
- "for( unsigned int nIter = 0 ; nIter < 100 && fPriceN != fPrice ; nIter++ )\n"
- "{\n"
- "fPriceN = getPrice_(nSettle, nMat, fRate, fYieldN, fRedemp, nFreq, nBase );\n"
- "if( fPrice == fPrice1 )\n"
- "return fYield1;\n"
- "else if( fPrice == fPrice2 )\n"
- "return fYield2;\n"
- "else if( fPrice == fPriceN )\n"
- "return fYieldN;\n"
- "else if( fPrice < fPrice2 )\n"
- "{\n"
- "fYield2 *= 2.0;\n"
- "fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase );\n"
- "fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
- "}\n"
- "else\n"
- "{\n"
- "if( fPrice < fPriceN )\n"
- "{\n"
- "fYield1 = fYieldN;\n"
- "fPrice1 = fPriceN;\n"
- "}\n"
- "else\n"
- "{\n"
- "fYield2 = fYieldN;\n"
- "fPrice2 = fPriceN;\n"
- "}\n"
- "fYieldN = fYield2 - ( fYield2 - fYield1 ) * ( ( fPrice - fPrice2 ) / ( fPrice1 - fPrice2 ) );\n"
- "}\n"
- "}\n"
- "return fYieldN;\n"
-"}\n"
-
-"double GetYearFrac( int nNullDate, int nStartDate, int nEndDate, int nMode ) \n"
-"{\n"
-" if( nStartDate == nEndDate )\n"
-" return 0.0; \n"
-
- " if( nStartDate > nEndDate )\n"
- " {\n"
- " int n = nEndDate;\n"
- " nEndDate = nStartDate;\n"
- " nStartDate = n;\n"
- " }\n"
-
- " int nDate1 = nStartDate + nNullDate;\n"
- " int nDate2 = nEndDate + nNullDate;\n"
-
- " int nDay1, nDay2;\n"
- " int nMonth1, nMonth2;\n"
- " int nYear1, nYear2;\n"
-
- " DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
- " DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
-
-
- " int nDayDiff;\n"
- " switch( nMode )\n"
- " {\n"
- " case 0: \n"
- " if ( nDay1 == 31 )\n"
- " {\n"
- " nDay1--;\n"
- " }\n"
- " if ( nDay1 == 30 && nDay2 == 31 )\n"
- " {\n"
- " nDay2--;\n"
- " }\n"
- " else\n"
- " {\n"
- " if ( nMonth1 == 2 && nDay1 == ( IsLeapYear( nYear1 ) ? 29 : 28 ) )\n"
- " {\n"
- " nDay1 = 30;\n"
- " if ( nMonth2 == 2 && nDay2 == ( IsLeapYear( nYear2 ) ? 29 : 28 ) )\n"
- " {\n"
- " nDay2 = 30;\n"
- " }\n"
- " }\n"
- " }\n"
- " nDayDiff = ( nYear2 - nYear1 ) * 360 + ( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
- " break;\n"
- " case 1: \n"
- " case 2: \n"
- " case 3: \n"
- " nDayDiff = nDate2 - nDate1;\n"
- " break;\n"
- " case 4: \n"
- " if ( nDay1 == 31 )\n"
- " {\n"
- " nDay1--;\n"
- " }\n"
- " if ( nDay2 == 31 )\n"
- " {\n"
- " nDay2--;\n"
- " }\n"
- " nDayDiff = ( nYear2 - nYear1 ) * 360 + ( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
- " break;\n"
- " }\n"
-
-
- " double nDaysInYear;\n"
- " switch( nMode )\n"
- " {\n"
- " case 0: \n"
- " case 2: \n"
- " case 4: \n"
- " nDaysInYear = 360;\n"
- " break;\n"
- " case 1: \n"
- " {\n"
- " bool isYearDifferent = ( nYear1 != nYear2 );\n"
- " if ( isYearDifferent &&\n"
- " ( ( nYear2 != nYear1 + 1 ) ||\n"
- " ( nMonth1 < nMonth2 ) ||\n"
- " ( nMonth1 == nMonth2 && nDay1 < nDay2 ) ) )\n"
- " {\n"
-
- " int nDayCount = 0;\n"
- " for ( int i = nYear1; i <= nYear2; i++ )\n"
- " nDayCount += ( IsLeapYear( i ) ? 366 : 365 );\n"
-
- " nDaysInYear = ( double ) nDayCount / ( double ) ( nYear2 - nYear1 + 1 );\n"
- " }\n"
- " else\n"
- " {\n"
- " if ( isYearDifferent && IsLeapYear( nYear1 ) )\n"
- " {\n"
- " nDaysInYear = 366;\n"
- " }\n"
- " else\n"
- " {\n"
-
- " if ( ( IsLeapYear( nYear1 ) && nMonth1 <= 2 && nDay1 <= 29 ) ||\n"
- " ( IsLeapYear( nYear2 ) && ( nMonth2 > 3 || ( nMonth2 == 2 && nDay1 == 29 ) ) ) )\n"
- " {\n"
- " nDaysInYear = 366;\n"
- " }\n"
- " else\n"
- " {\n"
- " nDaysInYear = 365;\n"
- " for ( int i = nYear1; i <= nYear2; i++ )\n"
- " {\n"
- " if ( IsLeapYear( i ) )\n"
- " {\n"
- " nDaysInYear = 366;\n"
- " break;\n"
- " }\n"
- " }\n"
- " }\n"
- " }\n"
- " }\n"
- " }\n"
- " break;\n"
- " case 3: \n"
- " nDaysInYear = 365;\n"
- " break;\n"
-
- " }\n"
-
- " return (double)( nDayDiff ) / (nDaysInYear);\n"
-"}\n"
- "double GetYieldmat( int nNullDate, int nSettle, int nMat, int nIssue,\n"
- "double fRate, double fPrice, int nBase )\n"
- "{\n"
- "double fIssMat = GetYearFrac( nNullDate, nIssue, nMat, nBase );\n"
- "double fIssSet = GetYearFrac( nNullDate, nIssue, nSettle, nBase );\n"
- "double fSetMat = GetYearFrac( nNullDate, nSettle, nMat, nBase );\n"
- "double y = 1.0 + fIssMat * fRate;\n"
- "y /= fPrice / 100.0 + fIssSet * fRate;\n"
- "y-=1.0;\n"
- "y /= fSetMat;\n"
- "return y;\n"
- "}\n"
-
-"int GetDiffDate( int nNullDate, int nStartDate, int nEndDate, int nMode,"
-" int* pOptDaysIn1stYear )\n"
-"{\n"
-"\t bool bNeg = nStartDate > nEndDate;\n"
-
-"\t if( bNeg )\n"
-"\t {\n"
-"\t\t int n = nEndDate;\n"
-"\t\t nEndDate = nStartDate;\n"
-"\t\t nStartDate = n;\n"
-"\t }\n"
-"\t int nRet;\n"
-"\t switch( nMode )\n"
-"\t {\n"
-"\t\t case 0: \n"
-"\t\t case 4: \n"
-"\t\t {\n"
-"\t\t\t int nD1, nM1, nY1, nD2, nM2, nY2;\n"
-"\t\t\t nStartDate += nNullDate;\n"
-"\t\t\t nEndDate += nNullDate;\n"
-"\t\t\t DaysToDate( nStartDate, &nD1, &nM1, &nY1 );\n"
-"\t\t\t DaysToDate( nEndDate, &nD2, &nM2, &nY2 );\n"
-"\t\t\t bool bLeap = IsLeapYear( nY1 );\n"
-"\t\t\t int nDays, nMonths;\n"
-"\t\t\t nMonths = nM2 - nM1;\n"
-"\t\t\t nDays = nD2 - nD1;\n"
-"\t\t\t nMonths += ( nY2 - nY1 ) * 12;\n"
-"\t\t\t nRet = nMonths * 30 + nDays;\n"
-"\t\t\t if( nMode == 0 && nM1 == 2 && nM2 != 2 && nY1 == nY2 )\n"
-"\t\t\t\t nRet -= bLeap? 1 : 2;\n"
-"\t\t\t if( pOptDaysIn1stYear )\n"
-"\t\t\t\t *pOptDaysIn1stYear = 360;\n"
-"\t\t }\n"
-"\t\t\t break;\n"
-"\t\t case 1: \n"
-"\t\t\t if( pOptDaysIn1stYear )\n"
-"\t\t\t {\n"
-"\t\t\t\t int nD, nM, nY;\n"
-"\t\t\t\t DaysToDate( nStartDate + nNullDate, &nD, &nM, &nY );\n"
-"\t\t\t\t *pOptDaysIn1stYear = IsLeapYear( nY )? 366 : 365;\n"
-"\t\t\t }\n"
-"\t\t\t nRet = nEndDate - nStartDate;\n"
-"\t\t\t break;\n"
-"\t\t case 2: \n"
-"\t\t\t nRet = nEndDate - nStartDate;\n"
-"\t\t\t if( pOptDaysIn1stYear )\n"
-"\t\t\t\t *pOptDaysIn1stYear = 360;\n"
-"\t\t\t break;\n"
-"\t\t case 3: \n"
-"\t\t\t nRet = nEndDate - nStartDate;\n"
-"\t\t\t if( pOptDaysIn1stYear )\n"
-"\t\t\t\t *pOptDaysIn1stYear = 365;\n"
-"\t\t\t break;\n"
-"\t }\n"
-"\t return bNeg? -nRet : nRet;\n"
-"}\n"
-"double GetYearDiff( int nNullDate, int nStartDate, int nEndDate, int nMode )\n"
-"{\n"
-"\t int nDays1stYear;\n"
-"\t int nTotalDays = GetDiffDate( nNullDate, nStartDate, nEndDate, nMode, &nDays1stYear );\n"
-"\t double result=(double)(nTotalDays)/(nDays1stYear);\n"
-"\treturn result;\n"
-"}\n"
-"int GetDiffDate360_(\n"
-" int nDay1, int nMonth1, int nYear1, bool bLeapYear1,\n"
-" int nDay2, int nMonth2, int nYear2,\n"
-" bool bUSAMethod )\n"
-"{\n"
-" if( nDay1 == 31 )\n"
-" nDay1--;\n"
-" else if( bUSAMethod && ( nMonth1 == 2 && ( nDay1 == 29 || ( nDay1 == 28 && !bLeapYear1 ) ) ) )\n"
-" nDay1 = 30;\n"
-" if( nDay2 == 31 )\n"
-" {\n"
-" if( bUSAMethod && nDay1 != 30 )\n"
-" {\n"
-" nDay2 = 1;\n"
-" if( nMonth2 == 12 )\n"
-" {\n"
-" nYear2++;\n"
-" nMonth2 = 1;\n"
-" }\n"
-" else\n"
-" nMonth2++;\n"
-" }\n"
-" else\n"
-" nDay2 = 30;\n"
-" }\n"
-" return nDay2 + nMonth2 * 30 + nYear2 * 360 - nDay1 - nMonth1 * 30 - nYear1 * 360;\n"
-"}\n"
-
-"int GetDiffDate360( int nNullDate, int nDate1, int nDate2, bool bUSAMethod )\n"
-"{\n"
-" nDate1 += nNullDate;\n"
-" nDate2 += nNullDate;\n"
-" int nDay1, nMonth1, nYear1, nDay2, nMonth2, nYear2;\n"
-" DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
-" DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
-" return GetDiffDate360_( nDay1, nMonth1, nYear1, IsLeapYear( nYear1 ), nDay2, nMonth2, nYear2, bUSAMethod );\n"
-"}\n";
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx
index 69f7d02bbccc..ff167e0f1675 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -258,6 +258,17 @@ void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss,
ss << "}";
}
+void OpDISC::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearFracDecl);decls.insert(DaysToDateDecl);
+ decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
+ funs.insert(GetYearFrac);funs.insert(DaysToDate);
+ funs.insert(GetNullDate);funs.insert(DateToDays);
+ funs.insert(DaysInMonth);funs.insert(IsLeapYear);
+}
+
void OpDISC::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -361,6 +372,19 @@ void OpDISC::GenSlidingWindowFunction(
ss << "}";
}
+void OpINTRATE::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearDiffDecl);decls.insert(GetDiffDateDecl);
+ decls.insert(DaysToDateDecl);decls.insert(GetNullDateDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysInMonthDecl);
+ decls.insert(IsLeapYearDecl);
+ funs.insert(GetYearDiff);funs.insert(GetDiffDate);
+ funs.insert(DaysToDate);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(DaysInMonth);
+ funs.insert(IsLeapYear);
+}
+
void OpINTRATE::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -507,7 +531,12 @@ void Fvschedule::GenSlidingWindowFunction(
ss << "return (double)tmp * arg0";
ss << ";\n}";
}
-
+void Cumipmt::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetRmzDecl); decls.insert(GetZwDecl);
+ funs.insert(GetRmz);funs.insert(GetZw);
+}
void Cumipmt::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -803,6 +832,17 @@ void XNPV::GenSlidingWindowFunction(
ss << "}";
}
+ void PriceMat::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
+
+ funs.insert(GetYearFrac);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(IsLeapYear);
+}
void PriceMat::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1153,6 +1193,18 @@ void OpEffective::GenSlidingWindowFunction(
ss << "}";
}
+ void OpTbilleq::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetDiffDate360_Decl);decls.insert(GetDiffDate360Decl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(GetNullDateDecl);
+ decls.insert(IsLeapYearDecl);
+ funs.insert(GetDiffDate360_);funs.insert(GetDiffDate360);
+ funs.insert(DateToDays);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(GetNullDate);
+ funs.insert(IsLeapYear);
+}
void OpTbilleq::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1233,7 +1285,12 @@ void OpTbilleq::GenSlidingWindowFunction(
ss << "return tmp;\n";
ss << "}";
}
-
+void OpCumprinc::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetRmzDecl); decls.insert(GetZwDecl);
+ funs.insert(GetRmz);funs.insert(GetZw);
+}
void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1361,6 +1418,16 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
ss << "}";
}
+void OpAccrintm::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
+ decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
+ decls.insert(GetNullDateDecl); decls.insert(GetDiffDateDecl);
+ funs.insert(IsLeapYear);funs.insert(DaysInMonth);
+ funs.insert(DaysToDate);funs.insert(DateToDays);
+ funs.insert(GetNullDate);funs.insert(GetDiffDate);
+}
void OpAccrintm::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1472,6 +1539,35 @@ void OpAccrintm::GenSlidingWindowFunction(
ss << "}";
}
+ void OpYield::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(getYield_Decl);decls.insert(getPrice_Decl);
+ decls.insert(coupnumDecl);decls.insert(coupdaysncDecl);
+ decls.insert(coupdaybsDecl);decls.insert(coupdaysDecl);
+ decls.insert(lcl_GetcoupnumDecl);decls.insert(lcl_GetcoupdaysDecl);
+ decls.insert(lcl_GetcoupdaybsDecl);decls.insert(getDiffDecl);
+ decls.insert(getDaysInYearRangeDecl);decls.insert(GetDaysInYearDecl);
+ decls.insert(GetDaysInYearsDecl);decls.insert(getDaysInMonthRangeDecl);
+ decls.insert(addMonthsDecl);decls.insert(ScaDateDecl);
+ decls.insert(GetNullDateDecl);decls.insert(DateToDaysDecl);
+ decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
+ decls.insert(IsLeapYearDecl);
+
+ funs.insert(getYield_);funs.insert(getPrice_);
+ funs.insert(coupnum);funs.insert(coupdaysnc);
+ funs.insert(coupdaybs);funs.insert(coupdays);
+ funs.insert(lcl_Getcoupnum);funs.insert(lcl_Getcoupdays);
+ funs.insert(lcl_Getcoupdaybs);funs.insert(getDiff);
+ funs.insert(getDaysInYearRange);funs.insert(GetDaysInYear);
+ funs.insert(GetDaysInYears);funs.insert(getDaysInMonthRange);
+ funs.insert(addMonths);funs.insert(ScaDate);
+ funs.insert(GetNullDate);funs.insert(DateToDays);
+ funs.insert(DaysToDate);funs.insert(DaysInMonth);
+ funs.insert(IsLeapYear);
+}
+
+
void OpYield::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1699,6 +1795,20 @@ void OpSLN::GenSlidingWindowFunction(std::stringstream &ss,
ss << "}";
}
+ void OpYieldmat::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
+ decls.insert(GetYieldmatDecl);
+
+ funs.insert(GetYearFrac);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(IsLeapYear);
+ funs.insert(GetYieldmat);
+}
+
void OpYieldmat::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -1952,6 +2062,12 @@ void OpPMT::GenSlidingWindowFunction(std::stringstream &ss,
ss << "return tmp;\n";
ss << "}";
}
+ void OpPPMT::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetZwDecl);
+ funs.insert(GetZw);
+}
void OpPPMT::GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
@@ -2036,7 +2152,24 @@ void OpPPMT::GenSlidingWindowFunction(std::stringstream &ss,
ss << "return tmp;\n";
ss << "}";
}
-
+void OpCoupdaybs::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
+ decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
+ decls.insert(GetNullDateDecl); decls.insert(ScaDateDecl);
+ decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
+ decls.insert(GetDaysInYearsDecl);
+ decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
+ decls.insert(lcl_GetcoupdaybsDecl);
+ funs.insert(IsLeapYear);funs.insert(DaysInMonth);
+ funs.insert(DaysToDate);funs.insert(DateToDays);
+ funs.insert(GetNullDate);funs.insert(ScaDate);
+ funs.insert(addMonths);funs.insert(getDaysInMonthRange);
+ funs.insert(GetDaysInYears);
+ funs.insert(getDaysInYearRange);funs.insert(getDiff);
+ funs.insert(lcl_Getcoupdaybs);
+}
void OpCoupdaybs::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -2120,6 +2253,24 @@ void OpCoupdaybs::GenSlidingWindowFunction(
ss << "return tmp;\n";
ss << "}";
}
+void OpCoupdays::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
+ decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
+ decls.insert(GetNullDateDecl); decls.insert(ScaDateDecl);
+ decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
+ decls.insert(GetDaysInYearsDecl); decls.insert(GetDaysInYearDecl);
+ decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
+ decls.insert(lcl_GetcoupdaysDecl);
+ funs.insert(IsLeapYear);funs.insert(DaysInMonth);
+ funs.insert(DaysToDate);funs.insert(DateToDays);
+ funs.insert(GetNullDate);funs.insert(ScaDate);
+ funs.insert(addMonths);funs.insert(getDaysInMonthRange);
+ funs.insert(GetDaysInYears);funs.insert(GetDaysInYear);
+ funs.insert(getDaysInYearRange);funs.insert(getDiff);
+ funs.insert(lcl_Getcoupdays);
+}
void OpCoupdays::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
@@ -2207,7 +2358,28 @@ void OpCoupdays::GenSlidingWindowFunction(
ss << "return tmp;\n";
ss << "}";
}
-
+void OpCoupdaysnc::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(IsLeapYearDecl); decls.insert(DaysInMonthDecl);
+ decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
+ decls.insert(GetNullDateDecl); decls.insert(ScaDateDecl);
+ decls.insert(addMonthsDecl); decls.insert(getDaysInMonthRangeDecl);
+ decls.insert(GetDaysInYearsDecl); decls.insert(GetDaysInYearDecl);
+ decls.insert(getDaysInYearRangeDecl); decls.insert(getDiffDecl);
+ decls.insert(lcl_GetcoupdaysDecl);decls.insert(lcl_GetcoupdaybsDecl);
+ decls.insert(coupdaysDecl);decls.insert(coupdaybsDecl);
+ decls.insert(coupdaysncDecl);
+ funs.insert(IsLeapYear);funs.insert(DaysInMonth);
+ funs.insert(DaysToDate);funs.insert(DateToDays);
+ funs.insert(GetNullDate);funs.insert(ScaDate);
+ funs.insert(addMonths);funs.insert(getDaysInMonthRange);
+ funs.insert(GetDaysInYears);funs.insert(GetDaysInYear);
+ funs.insert(getDaysInYearRange);funs.insert(getDiff);
+ funs.insert(lcl_Getcoupdays);funs.insert(lcl_Getcoupdaybs);
+ funs.insert(coupdaysnc);funs.insert(coupdaybs);
+ funs.insert(coupdays);
+}
void OpCoupdaysnc::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -2290,6 +2462,19 @@ void OpCoupdaysnc::GenSlidingWindowFunction(
ss << "}";
}
+ void OpReceived::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearDiffDecl);decls.insert(GetDiffDateDecl);
+ decls.insert(DaysToDateDecl);decls.insert(DaysInMonthDecl);
+ decls.insert(GetNullDateDecl);decls.insert(IsLeapYearDecl);
+ decls.insert(DateToDaysDecl);
+ funs.insert(GetDiffDate);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(IsLeapYear);
+ funs.insert(GetYearDiff);
+}
+
void OpReceived::GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
{
@@ -2387,6 +2572,17 @@ void OpReceived::GenSlidingWindowFunction(std::stringstream &ss,
ss << "}";
}
+ void OpYielddisc::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
+
+ funs.insert(GetYearFrac);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(IsLeapYear);
+}
void OpYielddisc::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -2507,6 +2703,18 @@ void OpYielddisc::GenSlidingWindowFunction(
ss << "}";
}
+ void OpTbillprice::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetYearFracDecl);decls.insert(GetNullDateDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(IsLeapYearDecl);
+
+ funs.insert(GetYearFrac);funs.insert(GetNullDate);
+ funs.insert(DateToDays);funs.insert(DaysToDate);
+ funs.insert(DaysInMonth);funs.insert(IsLeapYear);
+}
+
void OpTbillprice::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
@@ -2709,6 +2917,20 @@ void RATE::GenSlidingWindowFunction(
ss << "}";
}
+ void OpTbillyield::BinInlineFun(std::set<std::string>& decls,
+ std::set<std::string>& funs)
+{
+ decls.insert(GetDiffDate360Decl);decls.insert(IsLeapYearDecl);
+ decls.insert(DateToDaysDecl);decls.insert(DaysToDateDecl);
+ decls.insert(DaysInMonthDecl);decls.insert(GetNullDateDecl);
+ decls.insert(GetDiffDate360_Decl);
+ funs.insert(GetDiffDate360);funs.insert(DateToDays);
+ funs.insert(DaysToDate);funs.insert(IsLeapYear);
+ funs.insert(DaysInMonth);funs.insert(GetNullDate);
+ funs.insert(GetDiffDate360_);
+
+}
+
void OpTbillyield::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
{
diff --git a/sc/source/core/opencl/op_financial.hxx b/sc/source/core/opencl/op_financial.hxx
index 544d757c023f..7a79dde12393 100644
--- a/sc/source/core/opencl/op_financial.hxx
+++ b/sc/source/core/opencl/op_financial.hxx
@@ -69,6 +69,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "DISC"; }
};
@@ -80,6 +81,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "INTRATE"; }
};
@@ -96,6 +98,7 @@ class Cumipmt: public Normal
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class IRR: public Normal
@@ -124,6 +127,7 @@ class PriceMat: public Normal
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpSYD: public Normal
{
@@ -174,6 +178,7 @@ public:
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbilleq"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpCumprinc: public Normal
@@ -182,6 +187,7 @@ public:
virtual std::string GetBottom(void) { return "0"; }
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "cumprinc"; }
};
@@ -189,6 +195,7 @@ class OpAccrintm: public Normal
{
public:
virtual std::string GetBottom(void) { return "0"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Accrintm"; }
@@ -200,6 +207,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yield"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
@@ -224,6 +232,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yieldmat"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpPMT: public Normal
@@ -239,6 +248,7 @@ class OpPPMT: public Normal
public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "PPMT"; }
};
@@ -248,6 +258,7 @@ public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "Coupdaybs"; }
};
@@ -258,6 +269,7 @@ public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "Coupdays";}
};
@@ -268,6 +280,7 @@ public:
virtual std::string GetBottom(void) { return "0";}
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
virtual std::string BinFuncName(void) const { return "Coupdaysnc"; }
};
@@ -279,6 +292,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Received"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpYielddisc: public Normal
@@ -287,6 +301,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "Yielddisc"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpTbillprice: public Normal
@@ -295,6 +310,7 @@ public:
virtual void GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbillprice"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpPriceMat:public PriceMat
@@ -324,6 +340,7 @@ public:
const std::string sSymName, SubArguments &vSubArguments);
virtual std::string BinFuncName(void) const { return "fTbillyield"; }
+ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>& );
};
class OpMIRR: public MIRR
diff --git a/sc/source/core/opencl/opinlinefun_finacial.cxx b/sc/source/core/opencl/opinlinefun_finacial.cxx
index bb5d3f2fccf6..05e6a5f0b1cf 100644
--- a/sc/source/core/opencl/opinlinefun_finacial.cxx
+++ b/sc/source/core/opencl/opinlinefun_finacial.cxx
@@ -13,7 +13,7 @@ std::string approxEqualDecl="bool approxEqual(double a, double b);\n";
std::string approxEqual =
"bool approxEqual(double a, double b)\n"
"{\n"
- "\tif (a == b)\n"
+" if (a == b)\n"
"\t\treturn true;\n"
"\tdouble x = a - b;\n"
"\treturn (x < 0.0 ? -x : x) < ((a < 0.0 ? -a : a) * (1.0 / (16777216.0 *"
@@ -48,6 +48,883 @@ std::string Round =
"\tfValue = floor(fValue + 0.5 + nKorrVal[nIndex]);\n"
"\treturn fValue;\n"
"}\n";
+
+std::string GetRmzDecl =
+"double GetRmz( double fZins, double fZzr, double fBw, double fZw,int nF );\n";
+
+std::string GetRmz=
+"double GetRmz( double fZins, double fZzr, double fBw, double fZw, int nF )\n"
+"{\n"
+ "\tdouble fRmz;\n"
+ "\tif( fZins == 0.0 )\n"
+ "\t\tfRmz = ( fBw + fZw ) / fZzr;\n"
+ "\telse\n"
+ "\t\t{\n"
+ "\t\t\tdouble fTerm = pow( 1.0 + fZins, fZzr );\n"
+ "\t\t\tif( nF > 0 )\n"
+ "\t\t\t\tfRmz = ( fZw * fZins / ( fTerm - 1.0 ) + fBw"
+ " * fZins / ( 1.0 - 1.0 / fTerm ) ) / ( 1.0 + fZins );\n"
+ "\t\t\telse\n"
+ "\t\t\t\tfRmz = fZw * fZins / ( fTerm - 1.0 ) + fBw * fZins /"
+ "( 1.0 - 1.0 / fTerm );\n"
+ "\t\t}\n"
+ "\treturn -fRmz;\n"
+"}\n\n";
+
+std::string GetZwDecl =
+"double GetZw( double fZins, double fZzr, double fRmz, double fBw, int nF );\n";
+
+std::string GetZw =
+"double GetZw( double fZins, double fZzr, double fRmz, double fBw, int nF )\n"
+"{\n"
+" double fZw;\n"
+" if( fZins == 0.0 )\n"
+" fZw = fBw + fRmz * fZzr;\n"
+" else\n"
+" {\n"
+" double fTerm = pow( 1.0 + fZins, fZzr );\n"
+" if( nF > 0 )\n"
+" fZw = fBw * fTerm + fRmz * ( 1.0 + fZins ) *"
+"( fTerm - 1.0 ) / fZins;\n"
+" else\n"
+" fZw = fBw * fTerm + fRmz * ( fTerm - 1.0 ) / fZins;\n"
+" }\n"
+" return -fZw;\n"
+"}\n\n";
+
+std::string IsLeapYearDecl =
+"bool IsLeapYear( int n );\n";
+
+std::string IsLeapYear =
+"bool IsLeapYear( int n )\n"
+"{\n"
+ "return ( (( ( n % 4 ) == 0 ) && ( ( n % 100 ) != 0)) || ( ( n % 400 ) == 0 ) );\n"
+"}\n";
+
+std::string DaysInMonthDecl=
+"int DaysInMonth( int nMonth, int nYear );\n";
+
+std::string DaysInMonth =
+"int DaysInMonth( int nMonth, int nYear )\n"
+"{\n"
+ " int aDaysInMonth[12] = { 31, 28, 31, 30, 31, 30,\n"
+ " 31, 31, 30, 31, 30, 31 };\n"
+"\n"
+" if ( nMonth != 2 )\n"
+" return aDaysInMonth[nMonth-1];\n"
+" else\n"
+" {\n"
+" if ( IsLeapYear(nYear) )\n"
+" return aDaysInMonth[nMonth-1] + 1;\n"
+" else\n"
+" return aDaysInMonth[nMonth-1];\n"
+" }\n"
+"}\n";
+
+std::string DaysToDateDecl =
+"void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear );\n";
+
+std::string DaysToDate =
+"void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear )\n"
+"{\n"
+"\n"
+" int nTempDays;\n"
+" int i = 0;\n"
+" bool bCalc;\n"
+
+" do\n"
+" {\n"
+" nTempDays = nDays;\n"
+" *rYear = (int)((nTempDays / 365) - i);\n"
+" nTempDays -= ((int) *rYear -1) * 365;\n"
+" nTempDays -= (( *rYear -1) / 4) - (( *rYear -1) / 100) + ((*rYear -1) / 400);\n"
+" bCalc = false;\n"
+" if ( nTempDays < 1 )\n"
+" {\n"
+" i++;\n"
+" bCalc = true;\n"
+" }\n"
+" else\n"
+" {\n"
+" if ( nTempDays > 365 )\n"
+" {\n"
+" if ( (nTempDays != 366) || !IsLeapYear( *rYear ) )\n"
+" {\n"
+" i--;\n"
+" bCalc = true;\n"
+" }\n"
+" }\n"
+" }\n"
+" }\n"
+" while ( bCalc );\n"
+
+" *rMonth = 1;\n"
+" while ( (int)nTempDays > DaysInMonth( *rMonth, *rYear ) )\n"
+" {\n"
+" nTempDays -= DaysInMonth( *rMonth, *rYear );\n"
+" *rMonth+=1;\n"
+" }\n"
+" *rDay = (int)nTempDays;\n"
+"}\n";
+
+std::string DateToDaysDecl=
+"int DateToDays( int nDay, int nMonth, int nYear );\n";
+
+std::string DateToDays=
+"int DateToDays( int nDay, int nMonth, int nYear )\n"
+"{\n"
+" int nDays = ((int)nYear-1) * 365;\n"
+" nDays += ((nYear-1) / 4) - ((nYear-1) / 100) + ((nYear-1) / 400);\n"
+
+" for( int i = 1; i < nMonth; i++ )\n"
+" nDays += DaysInMonth(i,nYear);\n"
+" nDays += nDay;\n"
+"\n"
+" return nDays;\n"
+"}\n";
+
+std::string GetNullDateDecl=
+"int GetNullDate();\n";
+
+std::string GetNullDate=
+"int GetNullDate()\n"
+"{\n"
+" return DateToDays(30,12,1899 );\n"
+"}\n";
+
+std::string ScaDateDecl=
+"void ScaDate( int nNullDate, int nDate, int nBase,int *nOrigDay, "
+"int *nMonth,int *nYear,int *bLastDayMode,int *bLastDay,"
+"int *b30Days,int *bUSMode,int *nDay);\n";
+
+std::string ScaDate=
+"void ScaDate( int nNullDate, int nDate, int nBase,int *nOrigDay, "
+"int *nMonth,int *nYear,int *bLastDayMode,int *bLastDay,"
+"int *b30Days,int *bUSMode,int *nDay)\n"
+"{\n"
+"DaysToDate( nNullDate + nDate, nOrigDay, nMonth, nYear );\n"
+"*bLastDayMode = (nBase != 5);\n"
+"*bLastDay = (*nOrigDay >= DaysInMonth( *nMonth, *nYear ));\n"
+"*b30Days = (nBase == 0) || (nBase == 4);\n"
+"*bUSMode = (nBase == 0);\n"
+ "if( *b30Days)\n"
+ "{\n"
+ "*nDay = min( *nOrigDay, 30);\n"
+ "if( *bLastDay || (*nDay >=DaysInMonth( *nMonth, *nYear )) )\n"
+ "*nDay = 30;\n"
+ "}\n"
+ "else\n"
+ "{\n"
+ "int nLastDay = DaysInMonth( *nMonth, *nYear );\n"
+ "*nDay = *bLastDay ? nLastDay : min( *nOrigDay, nLastDay );\n"
+ "}\n"
+"}\n";
+
+std::string addMonthsDecl=
+"void addMonths(int b30Days,int bLastDay,int *nDay,int nOrigDay,"
+"int *nMonth,int nMonthCount,int *year);\n";
+
+std::string addMonths=
+"void addMonths(int b30Days,int bLastDay,int *nDay,int nOrigDay,"
+"int *nMonth,int nMonthCount,int *year)\n"
+"{\n"
+ "int nNewMonth = nMonthCount + *nMonth;\n"
+ "if( nNewMonth > 12 )\n"
+ "{\n"
+ "--nNewMonth;\n"
+ "*year+=nNewMonth / 12 ;\n"
+ "*nMonth = ( nNewMonth % 12 ) + 1;\n"
+ "}\n"
+ "else if( nNewMonth < 1 )\n"
+ "{\n"
+ "*year+= nNewMonth / 12 - 1 ;\n"
+ "*nMonth = nNewMonth % 12 + 12 ;\n"
+ "}\n"
+ "else\n"
+ "*nMonth = nNewMonth ;\n"
+ "if( b30Days )\n"
+ "{\n"
+ "*nDay = min( nOrigDay, 30);\n"
+ "if( bLastDay || (*nDay >= DaysInMonth( *nMonth, *year )) )\n"
+ "*nDay = 30;\n"
+ "}\n"
+ "else\n"
+ "{\n"
+ "int nLastDay = DaysInMonth( *nMonth, *year );\n"
+ "*nDay = bLastDay ? nLastDay : min( nOrigDay, nLastDay );\n"
+ "}\n"
+"}\n";
+
+std::string getDaysInMonthRangeDecl=
+"int getDaysInMonthRange( int nFrom, int nTo,int b30Days,int year);\n";
+
+std::string getDaysInMonthRange=
+"int getDaysInMonthRange( int nFrom, int nTo,int b30Days,int year)\n"
+"{\n"
+ "if( nFrom > nTo )\n"
+ "return 0;\n"
+ "int nRet = 0;\n"
+ "if( b30Days )\n"
+ "nRet = (nTo - nFrom + 1) * 30;\n"
+ "else\n"
+ "{\n"
+ "for( int nMonthIx = nFrom; nMonthIx <= nTo; ++nMonthIx )\n"
+ "nRet += b30Days ? 30 : DaysInMonth( nMonthIx, year );\n"
+ "}\n"
+ "return nRet;\n"
+"}\n";
+
+std::string GetDaysInYearsDecl=
+"int GetDaysInYears( int nYear1, int nYear2 );\n";
+
+std::string GetDaysInYears=
+"int GetDaysInYears( int nYear1, int nYear2 )\n"
+"{\n"
+ "int nLeaps = 0;\n"
+ "for( int n = nYear1 ; n <= nYear2 ; n++ )\n"
+ "{\n"
+ "if( IsLeapYear( n ) )\n"
+ "nLeaps++;\n"
+ "}\n"
+ "int nSum = 1;\n"
+ "nSum += nYear2;\n"
+ "nSum -= nYear1;\n"
+ "nSum *= 365;\n"
+ "nSum += nLeaps;\n"
+ "return nSum;\n"
+"}\n";
+
+std::string GetDaysInYearDecl=
+"int GetDaysInYear( int nNullDate, int nDate, int nMode );\n";
+
+std::string GetDaysInYear=
+"int GetDaysInYear( int nNullDate, int nDate, int nMode )\n"
+"{\n"
+"switch( nMode )\n"
+"{\n"
+"case 0:\n"
+"case 2:\n"
+"case 4:\n"
+ "return 360;\n"
+"case 1:\n"
+ "{\n"
+ "int nD=0, nM=0, nY=0;\n"
+ "nDate += nNullDate;\n"
+ "DaysToDate( nDate, &nD, &nM, &nY );\n"
+ "return IsLeapYear( nY )? 366 : 365;\n"
+ "}\n"
+"case 3:\n"
+ "return 365;\n"
+"}\n"
+"}\n";
+
+std::string getDaysInYearRangeDecl =
+"int getDaysInYearRange( int nFrom, int nTo,int b30Days );\n";
+
+std::string getDaysInYearRange=
+"int getDaysInYearRange( int nFrom, int nTo,int b30Days )\n"
+"{\n"
+ "if( nFrom > nTo )\n"
+ "return 0;\n"
+ "return b30Days ? ((nTo - nFrom + 1) * 360) : GetDaysInYears( nFrom, nTo );\n"
+"}\n";
+
+
+std::string getDiffDecl=
+"int getDiff(int rFrom,int rTo,int fDay,int fMonth,int fYear,int fbLastDayMode,int fbLastDay,"
+"int fb30Days,int fbUSMode,int fnDay,""int tDay,int tMonth,int tYear,int tbLastDayMode,"
+"int tbLastDay,int tb30Days,int tbUSMode,int tnDay);\n";
+
+
+std::string getDiff=
+"int getDiff(int rFrom,int rTo,int fDay,int fMonth,int fYear,int fbLastDayMode,int fbLastDay,"
+"int fb30Days,int fbUSMode,int fnDay,""int tDay,int tMonth,int tYear,int tbLastDayMode,"
+"int tbLastDay,int tb30Days,int tbUSMode,int tnDay)\n"
+"{\n"
+"if(rFrom>rTo)\n"
+"{\n"
+"int d=fDay;fDay=tDay;tDay=d;\n"
+"int m=fMonth;fMonth=tMonth;tMonth=m;\n"
+"int y=fYear;fYear=tYear;tYear=y;\n"
+"int a=fbLastDayMode;fbLastDayMode=tbLastDayMode;tbLastDayMode=a;\n"
+"int b=fbLastDay;fbLastDay=tbLastDay;tbLastDay=b;\n"
+"int c=fb30Days;fb30Days=tb30Days;tb30Days=c;\n"
+"int e=fbUSMode;fbUSMode=tbUSMode;tbUSMode=e;\n"
+"int f=fnDay;fnDay=tnDay;tnDay=f;\n"
+"}\n"
+"int nDiff=0;\n"
+"if( tb30Days )\n"
+"{\n"
+"if( tbUSMode )\n"
+"{\n"
+ "if( ((fMonth == 2) || (fnDay < 30)) && (tDay == 31) )\n"
+ "tnDay = 31;\n"
+ "else if( (tMonth == 2) && tbLastDay )\n"
+ "tnDay = DaysInMonth( 2, tYear );\n"
+"}\n"
+"else\n"
+"{\n"
+ "if( (fMonth == 2) && (fnDay == 30) )\n"
+ "fnDay = DaysInMonth( 2, fYear );\n"
+ "if( (tMonth == 2) && (tnDay == 30) )\n"
+ "tnDay = DaysInMonth( 2, tYear );\n"
+"}\n"
+"}\n"
+"if( (fYear < tYear) || ((fYear == tYear) && (fMonth < tMonth)) )\n"
+"{\n"
+"nDiff = (fb30Days? 30:DaysInMonth(fMonth,fYear) )- fnDay + 1;\n"
+"fDay = fnDay = 1;\n"
+"fbLastDay = 0;\n"
+"addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,1,&fYear);\n"
+"if( fYear < tYear )\n"
+"{\n"
+ "nDiff += getDaysInMonthRange( fMonth, 12,fb30Days,fYear);\n"
+ "addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,13-fMonth,&fYear);\n"
+ "nDiff += getDaysInYearRange( fYear, tYear - 1,fb30Days);\n"
+ "fYear+=tYear - fYear;\n"
+"}\n"
+"nDiff += getDaysInMonthRange(fMonth, tMonth - 1,fb30Days ,fYear );\n"
+"addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,tMonth-fMonth,&fYear);\n"
+"}\n"
+"nDiff += tnDay - fnDay;\n"
+"return nDiff > 0 ? nDiff : 0;\n"
+"}\n";
+
+
+
+std::string lcl_GetcoupdaybsDecl=
+"int lcl_Getcoupdaybs(int nNullDate,int nSettle, int nMat,int nFreq,int nBase);\n";
+
+
+std::string lcl_Getcoupdaybs=
+"int lcl_Getcoupdaybs(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
+"{\n"
+ "int aDate = nMat;\n"
+ "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,sMonth=0,"
+ "sYear=0;\n"
+ "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
+ "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
+ "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&rbLastDay,"
+ "&rb30Days,&rbUSMode,&rnDay);\n"
+ "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&sbLastDay,"
+ "&sb30Days,&sbUSMode,&snDay);\n"
+ "rYear= sYear;\n"
+ "nSettle=nSettle+nNullDate;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "if( aDate < nSettle )\n"
+ "{\n"
+ "rYear+= 1;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "}\n"
+ "while(aDate > nSettle )\n"
+ "{\n"
+ "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear);\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "}\n"
+ "return getDiff( aDate, nSettle, rDay, rMonth, rYear, rbLastDayMode, rbLastDay, rb30Days,"
+ "rbUSMode, rnDay,\n"
+ "sDay, sMonth, sYear, sbLastDayMode, sbLastDay, sb30Days, sbUSMode, snDay);\n"
+"}\n";
+
+std::string lcl_GetcoupdaysDecl=
+"int lcl_Getcoupdays(int nNullDate,int nSettle, int nMat,int nFreq,int nBase);\n";
+
+std::string lcl_Getcoupdays=
+"int lcl_Getcoupdays(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
+"{\n"
+ "int aDate = nMat;\n"
+ "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,"
+ "sMonth=0, sYear=0;\n"
+ "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
+ "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
+ "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,"
+ "&rbLastDayMode,&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
+ "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,"
+ "&sbLastDayMode,&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
+ "rYear= sYear;\n"
+ "nSettle=nSettle+nNullDate;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "if( aDate < nSettle )\n"
+ "{ \n"
+ "rYear+= 1;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "}\n"
+ "while(aDate > nSettle )\n"
+ "{\n"
+ "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear);\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "}\n"
+ "int aNextDate=aDate;int aDay=rDay,aMonth=rMonth, aYear=rYear;\n"
+ "int abLastDayMode=rbLastDayMode, abLastDay=rbLastDay,"
+ "ab30Days=rb30Days,abUSMode=rbUSMode,anDay=rnDay;\n"
+ "addMonths(ab30Days,abLastDay,&anDay,aDay,&aMonth,12/nFreq,&aYear);\n"
+ "return getDiff( aDate, aNextDate, rDay, rMonth, rYear, rbLastDayMode,"
+ "rbLastDay, rb30Days, rbUSMode, rnDay,\n"
+ "aDay, aMonth, aYear, abLastDayMode, abLastDay, ab30Days, abUSMode, anDay);\n"
+"}\n";
+
+
+std::string lcl_GetcoupnumDecl=
+"int lcl_Getcoupnum(int nNullDate,int nSettle, int nMat,int nFreq);\n";
+
+std::string lcl_Getcoupnum=
+"int lcl_Getcoupnum(int nNullDate,int nSettle, int nMat,int nFreq)\n"
+"{\n"
+ "int aDate = nMat;int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;\n"
+ "int sDay=0,sMonth=0, sYear=0;\n"
+ "DaysToDate(aDate+nNullDate,&rDay, &rMonth, &rYear );\n"
+ "DaysToDate(nMat+nNullDate,&mDay, &mMonth, &mYear );\n"
+ "DaysToDate(nSettle+nNullDate,&sDay, &sMonth, &sYear );\n"
+ "rYear= sYear;\n"
+ "nSettle=nSettle+nNullDate;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "if( aDate < nSettle )\n"
+ "rYear+= 1;\n"
+ "int d=DateToDays( rDay,rMonth,rYear );\n"
+ "int nMonthCount=-1*(12 / nFreq);\n"
+ "while(d > nSettle )\n"
+ "{\n"
+ "int nNewMonth = nMonthCount + rMonth;\n"
+ "if( nNewMonth > 12 )\n"
+ "{\n"
+ "--nNewMonth;\n"
+ "rYear+=nNewMonth / 12;\n"
+ "rMonth = nNewMonth % 12 + 1;\n"
+ "}\n"
+ "else if( nNewMonth < 1 )\n"
+ "{\n"
+ "rYear+= nNewMonth / 12 - 1;\n"
+ "rMonth = nNewMonth % 12 + 12;\n"
+ "}\n"
+ "else\n"
+ "rMonth = nNewMonth;\n"
+ "d=DateToDays( rDay,rMonth,rYear );\n"
+ "}\n"
+ "int n=(mYear-rYear)*12+mMonth-rMonth;\n"
+ "n=n*nFreq/12;\n"
+ "return n;\n"
+"}\n";
+
+std::string coupdaysDecl=
+"double coupdays(int nSettle,int nMat,int nFreq,int nBase);\n";
+
+
+std::string coupdays=
+"double coupdays(int nSettle,int nMat,int nFreq,int nBase)\n"
+"{\n"
+ "int nNullDate=GetNullDate();\n"
+ "if( nBase == 1 )\n"
+ "return lcl_Getcoupdays(nNullDate, nSettle, nMat,nFreq, nBase);\n"
+ "else\n"
+ "return (double)GetDaysInYear(0,0,nBase)/nFreq;\n"
+"}\n";
+
+std::string coupdaybsDecl=
+"double coupdaybs( int nSettle,int nMat,int nFreq,int nBase);\n";
+
+std::string coupdaybs=
+"double coupdaybs( int nSettle,int nMat,int nFreq,int nBase)\n"
+"{\n"
+ "int nNullDate=GetNullDate();\n"
+ "return lcl_Getcoupdaybs(nNullDate, nSettle, nMat,nFreq, nBase);\n"
+"}\n";
+
+std::string coupdaysncDecl=
+"double coupdaysnc( int nSettle,int nMat,int nFreq,int nBase);\n";
+
+
+std::string coupdaysnc=
+"double coupdaysnc( int nSettle,int nMat,int nFreq,int nBase)\n"
+"{\n"
+"int nNullDate=GetNullDate();\n"
+"if((nBase != 0) && (nBase != 4))\n"
+"{\n"
+ "int aDate = nMat;\n"
+ "int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0,"
+ "mYear=0;int sDay=0,sMonth=0, sYear=0;\n"
+ "int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
+ "int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
+ "ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,"
+ "&rbLastDayMode,&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
+ "ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,"
+ "&sbLastDayMode,&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
+ "rYear= sYear;\n"
+ "nSettle=nSettle+nNullDate;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+ "if( aDate > nSettle )\n"
+ "{\n"
+ "rYear-= 1;\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+"}\n"
+"while(aDate <= nSettle )\n"
+"{\n"
+ "addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,12/nFreq,&rYear);\n"
+ "aDate=DateToDays( rDay,rMonth,rYear );\n"
+"}\n"
+"return getDiff( nSettle, aDate, sDay, sMonth, sYear, "
+"sbLastDayMode, sbLastDay, sb30Days, sbUSMode, snDay,\n"
+ "rDay, rMonth, rYear, rbLastDayMode, rbLastDay, rb30Days, rbUSMode, rnDay);\n"
+"}\n"
+"else\n"
+ "return coupdays(nSettle,nMat,nFreq,nBase)- coupdaybs( nSettle,nMat,nFreq,nBase);\n"
+"}\n";
+
+std::string coupnumDecl=
+"double coupnum( int nSettle,int nMat,int nFreq,int nBase);\n";
+
+std::string coupnum=
+"double coupnum( int nSettle,int nMat,int nFreq,int nBase)\n"
+"{\n"
+ "int nNullDate=GetNullDate();\n"
+ "return lcl_Getcoupnum(nNullDate,nSettle,nMat,nFreq);\n"
+"}\n";
+
+std::string getPrice_Decl=
+"double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
+ "double fRedemp, int nFreq, int nBase );\n";
+
+
+std::string getPrice_=
+"double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
+ "double fRedemp, int nFreq, int nBase )\n"
+"{\n"
+ "double fFreq = nFreq;\n"
+ "double fE = coupdays( nSettle, nMat, nFreq, nBase );\n"
+ "double fDSC_E = coupdaysnc( nSettle, nMat, nFreq, nBase ) / fE;\n"
+ "double fN = coupnum( nSettle, nMat, nFreq, nBase );\n"
+ "double fA = coupdaybs( nSettle, nMat, nFreq, nBase );\n"
+ "double fRet = fRedemp / ( pow( 1.0 + fYield / fFreq, fN - 1.0 + fDSC_E ) );\n"
+ "fRet -= 100.0 * fRate / fFreq * fA / fE;\n"
+ "double fT1 = 100.0 * fRate / fFreq;\n"
+ "double fT2 = 1.0 + fYield / fFreq;\n"
+ "for( double fK = 0.0 ; fK < fN ; fK+=1.0 )\n"
+ "fRet += fT1 / pow( fT2, fK + fDSC_E );\n"
+"return fRet;\n"
+"}\n";
+
+std::string getYield_Decl=
+"double getYield_( int nNullDate, int nSettle, int nMat, double fCoup,"
+"double fPrice,double fRedemp, int nFreq, int nBase);\n";
+
+std::string getYield_=
+"double getYield_( int nNullDate, int nSettle, int nMat, double fCoup,"
+"double fPrice,double fRedemp, int nFreq, int nBase )\n"
+"{\n"
+ "double fRate = fCoup;\n"
+ "double fPriceN = 0.0;\n"
+ "double fYield1 = 0.0;\n"
+ "double fYield2 = 1.0;\n"
+ "double fPrice1 = getPrice_(nSettle, nMat, fRate, fYield1, fRedemp, nFreq, nBase );\n"
+ "double fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase );\n"
+ "double fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
+ "for( unsigned int nIter = 0 ; nIter < 100 && fPriceN != fPrice ; nIter++ )\n"
+ "{\n"
+ "fPriceN = getPrice_(nSettle, nMat, fRate, fYieldN, fRedemp, nFreq, nBase );\n"
+ "if( fPrice == fPrice1 )\n"
+ "return fYield1;\n"
+ "else if( fPrice == fPrice2 )\n"
+ "return fYield2;\n"
+ "else if( fPrice == fPriceN )\n"
+ "return fYieldN;\n"
+ "else if( fPrice < fPrice2 )\n"
+ "{\n"
+ "fYield2 *= 2.0;\n"
+ "fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, nFreq, nBase );\n"
+ "fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
+ "}\n"
+ "else\n"
+ "{\n"
+ "if( fPrice < fPriceN )\n"
+ "{\n"
+ "fYield1 = fYieldN;\n"
+ "fPrice1 = fPriceN;\n"
+ "}\n"
+ "else\n"
+ "{\n"
+ "fYield2 = fYieldN;\n"
+ "fPrice2 = fPriceN;\n"
+ "}\n"
+ "fYieldN = fYield2 - ( fYield2 - fYield1 ) * "
+ "( ( fPrice - fPrice2 ) / ( fPrice1 - fPrice2 ) );\n"
+ "}\n"
+ "}\n"
+ "return fYieldN;\n"
+"}\n";
+
+std::string GetYearFracDecl=
+"double GetYearFrac( int nNullDate, int nStartDate, int nEndDate, int nMode );\n";
+
+std::string GetYearFrac=
+"double GetYearFrac( int nNullDate, int nStartDate, int nEndDate, int nMode ) \n"
+"{\n"
+" if( nStartDate == nEndDate )\n"
+" return 0.0; \n"
+
+ " if( nStartDate > nEndDate )\n"
+ " {\n"
+ " int n = nEndDate;\n"
+ " nEndDate = nStartDate;\n"
+ " nStartDate = n;\n"
+ " }\n"
+
+ " int nDate1 = nStartDate + nNullDate;\n"
+ " int nDate2 = nEndDate + nNullDate;\n"
+
+ " int nDay1, nDay2;\n"
+ " int nMonth1, nMonth2;\n"
+ " int nYear1, nYear2;\n"
+ " DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
+ " DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
+ " int nDayDiff;\n"
+ " switch( nMode )\n"
+ " {\n"
+ " case 0: \n"
+ " if ( nDay1 == 31 )\n"
+ " {\n"
+ " nDay1--;\n"
+ " }\n"
+ " if ( nDay1 == 30 && nDay2 == 31 )\n"
+ " {\n"
+ " nDay2--;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " if ( nMonth1 == 2 && nDay1 == ( IsLeapYear( nYear1 ) ? 29 : 28 ) )\n"
+ " {\n"
+ " nDay1 = 30;\n"
+ " if ( nMonth2 == 2 && nDay2 == ( IsLeapYear( nYear2 ) ? 29 : 28 ) )\n"
+ " {\n"
+ " nDay2 = 30;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
+ "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
+ " break;\n"
+ " case 1: \n"
+ " case 2: \n"
+ " case 3: \n"
+ " nDayDiff = nDate2 - nDate1;\n"
+ " break;\n"
+ " case 4: \n"
+ " if ( nDay1 == 31 )\n"
+ " {\n"
+ " nDay1--;\n"
+ " }\n"
+ " if ( nDay2 == 31 )\n"
+ " {\n"
+ " nDay2--;\n"
+ " }\n"
+ " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
+ "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
+ " break;\n"
+ " }\n"
+
+ " double nDaysInYear;\n"
+ " switch( nMode )\n"
+ " {\n"
+ " case 0: \n"
+ " case 2: \n"
+ " case 4: \n"
+ " nDaysInYear = 360;\n"
+ " break;\n"
+ " case 1: \n"
+ " {\n"
+ " bool isYearDifferent = ( nYear1 != nYear2 );\n"
+ " if ( isYearDifferent &&\n"
+ " ( ( nYear2 != nYear1 + 1 ) ||\n"
+ " ( nMonth1 < nMonth2 ) ||\n"
+ " ( nMonth1 == nMonth2 && nDay1 < nDay2 ) ) )\n"
+ " {\n"
+ " int nDayCount = 0;\n"
+ " for ( int i = nYear1; i <= nYear2; i++ )\n"
+ " nDayCount += ( IsLeapYear( i ) ? 366 : 365 );\n"
+ " nDaysInYear = ( double ) nDayCount / ( double ) ( nYear2 - nYear1 + 1 );\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " if ( isYearDifferent && IsLeapYear( nYear1 ) )\n"
+ " {\n"
+ " nDaysInYear = 366;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " if ( ( IsLeapYear( nYear1 ) && nMonth1 <= 2 && nDay1 <= 29 ) ||\n"
+ " ( IsLeapYear( nYear2 ) && ( nMonth2 > 3 || "
+ "( nMonth2 == 2 && nDay1 == 29 ) ) ) )\n"
+ " {\n"
+ " nDaysInYear = 366;\n"
+ " }\n"
+ " else\n"
+ " {\n"
+ " nDaysInYear = 365;\n"
+ " for ( int i = nYear1; i <= nYear2; i++ )\n"
+ " {\n"
+ " if ( IsLeapYear( i ) )\n"
+ " {\n"
+ " nDaysInYear = 366;\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " break;\n"
+ " case 3: \n"
+ " nDaysInYear = 365;\n"
+ " break;\n"
+ " }\n"
+ " return (double)( nDayDiff ) / (nDaysInYear);\n"
+"}\n";
+
+
+std::string GetYieldmatDecl=
+ "double GetYieldmat( int nNullDate, int nSettle, int nMat, int nIssue,\n"
+ "double fRate, double fPrice, int nBase );\n";
+
+
+std::string GetYieldmat=
+ "double GetYieldmat( int nNullDate, int nSettle, int nMat, int nIssue,\n"
+ "double fRate, double fPrice, int nBase )\n"
+ "{\n"
+ "double fIssMat = GetYearFrac( nNullDate, nIssue, nMat, nBase );\n"
+ "double fIssSet = GetYearFrac( nNullDate, nIssue, nSettle, nBase );\n"
+ "double fSetMat = GetYearFrac( nNullDate, nSettle, nMat, nBase );\n"
+ "double y = 1.0 + fIssMat * fRate;\n"
+ "y /= fPrice / 100.0 + fIssSet * fRate;\n"
+ "y-=1.0;\n"
+ "y /= fSetMat;\n"
+ "return y;\n"
+ "}\n";
+
+std::string GetDiffDateDecl=
+"int GetDiffDate( int nNullDate, int nStartDate, int nEndDate, int nMode,"
+" int* pOptDaysIn1stYear );\n";
+
+std::string GetDiffDate=
+"int GetDiffDate( int nNullDate, int nStartDate, int nEndDate, int nMode,"
+" int* pOptDaysIn1stYear )\n"
+"{\n"
+"\t bool bNeg = nStartDate > nEndDate;\n"
+
+"\t if( bNeg )\n"
+"\t {\n"
+"\t\t int n = nEndDate;\n"
+"\t\t nEndDate = nStartDate;\n"
+"\t\t nStartDate = n;\n"
+"\t }\n"
+"\t int nRet;\n"
+"\t switch( nMode )\n"
+"\t {\n"
+"\t\t case 0: \n"
+"\t\t case 4: \n"
+"\t\t {\n"
+"\t\t\t int nD1, nM1, nY1, nD2, nM2, nY2;\n"
+"\t\t\t nStartDate += nNullDate;\n"
+"\t\t\t nEndDate += nNullDate;\n"
+"\t\t\t DaysToDate( nStartDate, &nD1, &nM1, &nY1 );\n"
+"\t\t\t DaysToDate( nEndDate, &nD2, &nM2, &nY2 );\n"
+"\t\t\t bool bLeap = IsLeapYear( nY1 );\n"
+"\t\t\t int nDays, nMonths;\n"
+"\t\t\t nMonths = nM2 - nM1;\n"
+"\t\t\t nDays = nD2 - nD1;\n"
+"\t\t\t nMonths += ( nY2 - nY1 ) * 12;\n"
+"\t\t\t nRet = nMonths * 30 + nDays;\n"
+"\t\t\t if( nMode == 0 && nM1 == 2 && nM2 != 2 && nY1 == nY2 )\n"
+"\t\t\t\t nRet -= bLeap? 1 : 2;\n"
+"\t\t\t if( pOptDaysIn1stYear )\n"
+"\t\t\t\t *pOptDaysIn1stYear = 360;\n"
+"\t\t }\n"
+"\t\t\t break;\n"
+"\t\t case 1: \n"
+"\t\t\t if( pOptDaysIn1stYear )\n"
+"\t\t\t {\n"
+"\t\t\t\t int nD, nM, nY;\n"
+"\t\t\t\t DaysToDate( nStartDate + nNullDate, &nD, &nM, &nY );\n"
+"\t\t\t\t *pOptDaysIn1stYear = IsLeapYear( nY )? 366 : 365;\n"
+"\t\t\t }\n"
+"\t\t\t nRet = nEndDate - nStartDate;\n"
+"\t\t\t break;\n"
+"\t\t case 2: \n"
+"\t\t\t nRet = nEndDate - nStartDate;\n"
+"\t\t\t if( pOptDaysIn1stYear )\n"
+"\t\t\t\t *pOptDaysIn1stYear = 360;\n"
+"\t\t\t break;\n"
+"\t\t case 3: \n"
+"\t\t\t nRet = nEndDate - nStartDate;\n"
+"\t\t\t if( pOptDaysIn1stYear )\n"
+"\t\t\t\t *pOptDaysIn1stYear = 365;\n"
+"\t\t\t break;\n"
+"\t }\n"
+"\t return bNeg? -nRet : nRet;\n"
+"}\n";
+
+std::string GetYearDiffDecl=
+"double GetYearDiff( int nNullDate, int nStartDate, int nEndDate, int nMode);\n";
+
+std::string GetYearDiff=
+"double GetYearDiff( int nNullDate, int nStartDate, int nEndDate, int nMode )\n"
+"{\n"
+"\t int nDays1stYear;\n"
+"\t int nTotalDays = GetDiffDate( nNullDate, nStartDate,"
+"nEndDate, nMode, &nDays1stYear );\n"
+"\t double result=(double)(nTotalDays)/(nDays1stYear);\n"
+"\treturn result;\n"
+"}\n";
+
+std::string GetDiffDate360_Decl=
+"int GetDiffDate360_(\n"
+" int nDay1, int nMonth1, int nYear1, bool bLeapYear1,\n"
+" int nDay2, int nMonth2, int nYear2,\n"
+" bool bUSAMethod );\n";
+
+std::string GetDiffDate360_=
+"int GetDiffDate360_(\n"
+" int nDay1, int nMonth1, int nYear1, bool bLeapYear1,\n"
+" int nDay2, int nMonth2, int nYear2,\n"
+" bool bUSAMethod )\n"
+"{\n"
+" if( nDay1 == 31 )\n"
+" nDay1--;\n"
+" else if( bUSAMethod && ( nMonth1 == 2 && ( nDay1 == 29 ||"
+"( nDay1 == 28 && !bLeapYear1 ) ) ) )\n"
+" nDay1 = 30;\n"
+" if( nDay2 == 31 )\n"
+" {\n"
+" if( bUSAMethod && nDay1 != 30 )\n"
+" {\n"
+" nDay2 = 1;\n"
+" if( nMonth2 == 12 )\n"
+" {\n"
+" nYear2++;\n"
+" nMonth2 = 1;\n"
+" }\n"
+" else\n"
+" nMonth2++;\n"
+" }\n"
+" else\n"
+" nDay2 = 30;\n"
+" }\n"
+" return nDay2 + nMonth2 * 30 + nYear2 * 360 - nDay1 - nMonth1 * 30 - nYear1 * 360;\n"
+"}\n";
+
+std::string GetDiffDate360Decl=
+"int GetDiffDate360( int nNullDate, int nDate1, int nDate2, bool bUSAMethod);\n";
+
+
+std::string GetDiffDate360=
+"int GetDiffDate360( int nNullDate, int nDate1, int nDate2, bool bUSAMethod )\n"
+"{\n"
+" nDate1 += nNullDate;\n"
+" nDate2 += nNullDate;\n"
+" int nDay1, nMonth1, nYear1, nDay2, nMonth2, nYear2;\n"
+" DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
+" DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
+" return GetDiffDate360_( nDay1, nMonth1, nYear1, "
+"IsLeapYear( nYear1 ), nDay2, nMonth2, nYear2, bUSAMethod );\n"
+"}\n";
+
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */