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; ...@@ -43,6 +43,10 @@ struct CompareOptions;
} }
namespace svl {
class SharedStringPool;
}
/** /**
* Try NOT to use this struct. This struct should go away in a hopefully * Try NOT to use this struct. This struct should go away in a hopefully
* not so distant futture. * not so distant futture.
...@@ -394,6 +398,7 @@ public: ...@@ -394,6 +398,7 @@ public:
void MulOp(svl::SharedString aString, double fVal, ScMatrix& rMat); void MulOp(svl::SharedString aString, double fVal, ScMatrix& rMat);
void DivOp(bool bFlag, 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 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 ); ScMatrix& operator+= ( const ScMatrix& r );
......
...@@ -1362,37 +1362,9 @@ void ScInterpreter::ScAmpersand() ...@@ -1362,37 +1362,9 @@ void ScInterpreter::ScAmpersand()
for (SCSIZE j = 0; j < nR; ++j) for (SCSIZE j = 0; j < nR; ++j)
pResMat->PutError( nGlobalError, i, 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 else
{ {
for (SCSIZE i = 0; i < nC; ++i) pMat->AmpersandOp(bFlag, sStr, *pResMat, mrStrPool);
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);
}
}
} }
PushMatrix(pResMat); PushMatrix(pResMat);
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <svl/zforlist.hxx> #include <svl/zforlist.hxx>
#include <svl/sharedstring.hxx> #include <svl/sharedstring.hxx>
#include <svl/sharedstringpool.hxx>
#include <tools/stream.hxx> #include <tools/stream.hxx>
#include <rtl/math.hxx> #include <rtl/math.hxx>
...@@ -36,6 +37,7 @@ ...@@ -36,6 +37,7 @@
#include <vector> #include <vector>
#include <limits> #include <limits>
#include <functional>
#include <mdds/multi_type_matrix.hpp> #include <mdds/multi_type_matrix.hpp>
#include <mdds/multi_type_vector_types.hpp> #include <mdds/multi_type_vector_types.hpp>
...@@ -2584,6 +2586,49 @@ public: ...@@ -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) void ScMatrix::NotOp(svl::SharedString aString, ScMatrix& rMat)
...@@ -2662,6 +2707,24 @@ void ScMatrix::PowOp(bool bFlag, svl::SharedString aString, double fVal, ScMatri ...@@ -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 ) ScMatrix& ScMatrix::operator+= ( const ScMatrix& r )
{ {
pImpl->AddValues(*r.pImpl); 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