summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2019-03-01 11:33:28 +0100
committerMike Kaganski <mike.kaganski@collabora.com>2019-03-01 21:27:10 +0100
commit289cff91eb67c27874ba11115b9188a05ea8768d (patch)
tree4badd3188113005cd38bd9f974166c55dffb4b80 /include
parente1e39fac2203d10f8a19b18558c42a1943ad8736 (diff)
Use parameter pack + folding to have only one concatSequences
Change-Id: I4a303f8aab7a0e2af83dd9be7c269dc6855311a9 Reviewed-on: https://gerrit.libreoffice.org/68542 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'include')
-rw-r--r--include/comphelper/sequence.hxx41
1 files changed, 7 insertions, 34 deletions
diff --git a/include/comphelper/sequence.hxx b/include/comphelper/sequence.hxx
index d80534f4a8c7..59cd74fb1b83 100644
--- a/include/comphelper/sequence.hxx
+++ b/include/comphelper/sequence.hxx
@@ -43,21 +43,15 @@ namespace comphelper
}
}
- /// concat two sequences
- template <class T>
- inline css::uno::Sequence<T> concatSequences(const css::uno::Sequence<T>& _rLeft, const css::uno::Sequence<T>& _rRight)
+ /// concat several sequences
+ template <class T, class... Ss>
+ inline css::uno::Sequence<T> concatSequences(const css::uno::Sequence<T>& rS1, const Ss&... rSn)
{
- sal_Int32 nLeft(_rLeft.getLength()), nRight(_rRight.getLength());
- const T* pLeft = _rLeft.getConstArray();
- const T* pRight = _rRight.getConstArray();
-
- sal_Int32 nReturnLen(nLeft + nRight);
- css::uno::Sequence<T> aReturn(nReturnLen);
+ // unary fold to disallow empty parameter pack: at least have one sequence in rSn
+ css::uno::Sequence<T> aReturn(rS1.getLength() + (... + rSn.getLength()));
T* pReturn = aReturn.getArray();
-
- internal::implCopySequence(pLeft, pReturn, nLeft);
- internal::implCopySequence(pRight, pReturn, nRight);
-
+ (internal::implCopySequence(rS1.getConstArray(), pReturn, rS1.getLength()), ...,
+ internal::implCopySequence(rSn.getConstArray(), pReturn, rSn.getLength()));
return aReturn;
}
@@ -89,27 +83,6 @@ namespace comphelper
return ret;
}
- /// concat three sequences
- template <class T>
- inline css::uno::Sequence<T> concatSequences(const css::uno::Sequence<T>& _rLeft, const css::uno::Sequence<T>& _rMiddle, const css::uno::Sequence<T>& _rRight)
- {
- sal_Int32 nLeft(_rLeft.getLength()), nMiddle(_rMiddle.getLength()), nRight(_rRight.getLength());
- const T* pLeft = _rLeft.getConstArray();
- const T* pMiddle = _rMiddle.getConstArray();
- const T* pRight = _rRight.getConstArray();
-
- sal_Int32 nReturnLen(nLeft + nMiddle + nRight);
- css::uno::Sequence<T> aReturn(nReturnLen);
- T* pReturn = aReturn.getArray();
-
- internal::implCopySequence(pLeft, pReturn, nLeft);
- internal::implCopySequence(pMiddle, pReturn, nMiddle);
- internal::implCopySequence(pRight, pReturn, nRight);
-
- return aReturn;
- }
-
-
/// remove a specified element from a sequences
template<class T>
inline void removeElementAt(css::uno::Sequence<T>& _rSeq, sal_Int32 _nPos)