Kaydet (Commit) eaf640d2 authored tarafından Michael Stahl's avatar Michael Stahl

comphelper: add a generic implementation of std container operator==

... that contain std::unique_ptr.  With C++11 variadic templates this
apparently works for both std::vector and std::set; associative
containers like std::map have different iterators so need a different
implementation.

Change-Id: I6872445b007875c310d08fa7a8d7311075880b1d
Reviewed-on: https://gerrit.libreoffice.org/19818Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 5c3ccc9e
...@@ -100,6 +100,29 @@ template<class T> struct UniquePtrValueLess ...@@ -100,6 +100,29 @@ template<class T> struct UniquePtrValueLess
} }
}; };
/// by-value implementation of std::foo<std::unique_ptr<T>>::operator==
template<template<typename, typename...> class C, typename T, typename... Etc>
bool ContainerUniquePtrEquals(
C<std::unique_ptr<T>, Etc...> const& lhs,
C<std::unique_ptr<T>, Etc...> const& rhs)
{
if (lhs.size() != rhs.size())
{
return false;
}
for (auto iter1 = lhs.begin(), iter2 = rhs.begin();
iter1 != lhs.end();
++iter1, ++iter2)
{
if (!(**iter1 == **iter2))
{
return false;
}
}
return true;
};
/** STL-compliant structure for comparing Reference&lt; &lt;iface&gt; &gt; instances /** STL-compliant structure for comparing Reference&lt; &lt;iface&gt; &gt; instances
*/ */
template < class IAFCE > template < class IAFCE >
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include "dociter.hxx" #include "dociter.hxx"
#include "brdcst.hxx" #include "brdcst.hxx"
#include <comphelper/stl_types.hxx>
#include <memory> #include <memory>
#include <utility> #include <utility>
...@@ -1169,18 +1171,7 @@ size_t ScDBCollection::NamedDBs::size() const ...@@ -1169,18 +1171,7 @@ size_t ScDBCollection::NamedDBs::size() const
bool ScDBCollection::NamedDBs::operator== (const NamedDBs& r) const bool ScDBCollection::NamedDBs::operator== (const NamedDBs& r) const
{ {
if (m_DBs.size() != r.m_DBs.size()) return ::comphelper::ContainerUniquePtrEquals(m_DBs, r.m_DBs);
{
return false;
}
for (auto iter1 = m_DBs.begin(), iter2 = r.m_DBs.begin(); iter1 != m_DBs.end(); ++iter1, ++iter2)
{
if (**iter1 != **iter2)
{
return false;
}
}
return true;
} }
ScDBCollection::AnonDBs::iterator ScDBCollection::AnonDBs::begin() ScDBCollection::AnonDBs::iterator ScDBCollection::AnonDBs::begin()
...@@ -1257,14 +1248,7 @@ bool ScDBCollection::AnonDBs::has( const ScDBData* p ) const ...@@ -1257,14 +1248,7 @@ bool ScDBCollection::AnonDBs::has( const ScDBData* p ) const
bool ScDBCollection::AnonDBs::operator== (const AnonDBs& r) const bool ScDBCollection::AnonDBs::operator== (const AnonDBs& r) const
{ {
if (m_DBs.size() != r.m_DBs.size()) return ::comphelper::ContainerUniquePtrEquals(m_DBs, r.m_DBs);
return false;
for (auto iter1 = begin(), iter2 = r.begin(); iter1 != end(); ++iter1, ++iter2)
{
if (**iter1 != **iter2)
return false;
}
return true;
} }
ScDBCollection::AnonDBs::AnonDBs() ScDBCollection::AnonDBs::AnonDBs()
......
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