Kaydet (Commit) 9a7959cd authored tarafından Łukasz Hryniuk's avatar Łukasz Hryniuk Kaydeden (comit) David Tardon

tdf#89387 Add functor for ScAmpersand

Change-Id: If89073cc6b21aad0f04f79e934aa2d646a057333
Reviewed-on: https://gerrit.libreoffice.org/14873Reviewed-by: 's avatarDavid Tardon <dtardon@redhat.com>
Tested-by: 's avatarDavid Tardon <dtardon@redhat.com>
üst fc56579e
......@@ -43,6 +43,10 @@ struct CompareOptions;
}
namespace svl {
class SharedStringPool;
}
/**
* Try NOT to use this struct. This struct should go away in a hopefully
* not so distant futture.
......@@ -394,6 +398,7 @@ public:
void MulOp(svl::SharedString aString, double fVal, ScMatrix& rMat);
void DivOp(bool bFlag, svl::SharedString aString, double fVal, ScMatrix& rMat);
void PowOp(bool bFlag, svl::SharedString aString, double fVal, ScMatrix& rMat);
void AmpersandOp(bool bFlag, svl::SharedString aString, ScMatrix& rMat, svl::SharedStringPool& rStrPool);
ScMatrix& operator+= ( const ScMatrix& r );
......
......@@ -1362,37 +1362,9 @@ void ScInterpreter::ScAmpersand()
for (SCSIZE j = 0; j < nR; ++j)
pResMat->PutError( nGlobalError, i, j);
}
else if (bFlag)
{
for (SCSIZE i = 0; i < nC; ++i)
for (SCSIZE j = 0; j < nR; ++j)
{
sal_uInt16 nErr = pMat->GetErrorIfNotString( i, j);
if (nErr)
pResMat->PutError( nErr, i, j);
else
{
OUString aTmp = sStr;
aTmp += pMat->GetString(*pFormatter, i, j).getString();
pResMat->PutString(mrStrPool.intern(aTmp), i, j);
}
}
}
else
{
for (SCSIZE i = 0; i < nC; ++i)
for (SCSIZE j = 0; j < nR; ++j)
{
sal_uInt16 nErr = pMat->GetErrorIfNotString( i, j);
if (nErr)
pResMat->PutError( nErr, i, j);
else
{
OUString aTmp = pMat->GetString(*pFormatter, i, j).getString();
aTmp += sStr;
pResMat->PutString(mrStrPool.intern(aTmp), i, j);
}
}
pMat->AmpersandOp(bFlag, sStr, *pResMat, mrStrPool);
}
PushMatrix(pResMat);
}
......
......@@ -29,6 +29,7 @@
#include <boost/noncopyable.hpp>
#include <svl/zforlist.hxx>
#include <svl/sharedstring.hxx>
#include <svl/sharedstringpool.hxx>
#include <tools/stream.hxx>
#include <rtl/math.hxx>
......@@ -36,6 +37,7 @@
#include <vector>
#include <limits>
#include <functional>
#include <mdds/multi_type_matrix.hpp>
#include <mdds/multi_type_vector_types.hpp>
......@@ -2584,6 +2586,49 @@ public:
}
};
struct AmpersandOp
{
private:
std::function<svl::SharedString(svl::SharedString,svl::SharedString)> maOp;
svl::SharedString maString;
public:
typedef svl::SharedString empty_value_type;
typedef double number_value_type;
typedef svl::SharedString string_value_type;
AmpersandOp(std::function<svl::SharedString(svl::SharedString,svl::SharedString)> aOp, svl::SharedString aString):
maOp(aOp),
maString(aString)
{ }
double operator()(double fVal) const
{
return CreateDoubleError(GetDoubleErrorValue(fVal));
}
double operator()(bool fVal) const
{
return CreateDoubleError(GetDoubleErrorValue(double(fVal)));
}
svl::SharedString operator()(svl::SharedString aVal) const
{
return maOp(maString, aVal);
}
svl::SharedString operator()(char) const
{
return maString;
}
bool useFunctionForEmpty() const
{
return true;
}
};
}
void ScMatrix::NotOp(svl::SharedString aString, ScMatrix& rMat)
......@@ -2662,6 +2707,24 @@ void ScMatrix::PowOp(bool bFlag, svl::SharedString aString, double fVal, ScMatri
}
}
void ScMatrix::AmpersandOp(bool bFlag, svl::SharedString aString, ScMatrix& rMat, svl::SharedStringPool& rStrPool)
{
if (bFlag)
{
auto amp_ = [&rStrPool](svl::SharedString a, svl::SharedString b) -> svl::SharedString
{return rStrPool.intern(a.getString() += b.getString());};
matop::AmpersandOp aOp(amp_, aString);
pImpl->ApplyOperation(aOp, *rMat.pImpl);
}
else
{
auto amp_ = [&rStrPool](svl::SharedString a, svl::SharedString b) -> svl::SharedString
{return rStrPool.intern(b.getString() += a.getString());};
matop::AmpersandOp aOp(amp_, aString);
pImpl->ApplyOperation(aOp, *rMat.pImpl);
}
}
ScMatrix& ScMatrix::operator+= ( const ScMatrix& r )
{
pImpl->AddValues(*r.pImpl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment