refs #106, moved removeIf from CSequence to CContainerBase and added remove method in CCollection (CSequence already had a remove method)

This commit is contained in:
Mathew Sutcliffe
2014-01-28 18:30:06 +00:00
parent 1e153b45f0
commit d48d8ed951
3 changed files with 30 additions and 21 deletions

View File

@@ -186,6 +186,12 @@ namespace BlackMisc
*/
const_iterator find(const T &value) const { Q_ASSERT(pimpl()); return pimpl()->find(value); }
/*!
* \brief Efficient remove using the find and erase of the implementation container. Typically O(log n).
* \pre The sequence must be initialized.
*/
void remove(const T &object) { auto it = find(object); if (it != end()) { erase(pos); } }
/*!
* \brief Test for equality.
* \todo Improve inefficient implementation.

View File

@@ -113,6 +113,30 @@ namespace BlackMisc
return contains(BlackMisc::Predicates::MemberEqual<T>(key1, value1));
}
/*!
* \brief Remove elements for which a given predicate returns true.
* \pre The sequence must be initialized.
*/
template <class Predicate>
void removeIf(Predicate p)
{
for (auto it = derived().begin(); it != derived().end(); ++it)
{
if (p(*it)) { it = derived().erase(it); }
}
}
/*!
* \brief Remove elements matching a particular key/value pair.
* \param key1 A pointer to a member function of T.
* \param value1 Will be compared to the return value of key1.
*/
template <class K1, class V1>
void removeIf(K1 key1, V1 value1)
{
removeIf(BlackMisc::Predicates::MemberEqual<T>(key1, value1));
}
public: // CValueObject overrides
/*!
* \copydoc CValueObject::toQVariant()

View File

@@ -252,27 +252,6 @@ namespace BlackMisc
applyIf([ & ](const T &value) { return value == pattern; }, newValues);
}
/*!
* \brief Remove elements for which a given predicate returns true.
* \pre The sequence must be initialized.
*/
template <class Predicate>
void removeIf(Predicate p)
{
erase(std::remove_if(begin(), end(), p), end());
}
/*!
* \brief Remove elements matching a particular key/value pair.
* \param key1 A pointer to a member function of T.
* \param value1 Will be compared to the return value of key1.
*/
template <class K1, class V1>
void removeIf(K1 key1, V1 value1)
{
removeIf(BlackMisc::Predicates::MemberEqual<T>(key1, value1));
}
/*!
* \brief Remove the given object, if it is contained.
* \pre The sequence must be initialized.