containers: added opaque pointer access to implementation container, to help with debugging

This commit is contained in:
Mathew Sutcliffe
2014-07-01 01:03:32 +01:00
parent 08e65beaf4
commit b5097a0e63
2 changed files with 18 additions and 0 deletions

View File

@@ -310,6 +310,13 @@ namespace BlackMisc
*/
bool operator !=(const CCollection &other) const { return !(*this == other); }
/*!
* \brief Return an opaque pointer to the implementation container.
* \details Can be useful in unusual debugging situations.
* \warning Not for general use.
*/
void *getImpl() { return pimpl() ? pimpl()->impl() : nullptr; }
private:
class PimplBase
{
@@ -333,6 +340,7 @@ namespace BlackMisc
virtual iterator find(const T &value) = 0;
virtual const_iterator find(const T &value) const = 0;
virtual bool operator ==(const PimplBase &other) const = 0;
virtual void *impl() = 0;
};
template <class C> class Pimpl : public PimplBase
@@ -359,6 +367,7 @@ namespace BlackMisc
iterator find(const T &value) override { return iterator::fromImpl(m_impl.find(value)); }
const_iterator find(const T &value) const override { return const_iterator::fromImpl(m_impl.find(value)); }
bool operator ==(const PimplBase &other) const override { Pimpl copy = C(); for (auto i = other.cbegin(); i != other.cend(); ++i) copy.insert(*i); return m_impl == copy.m_impl; }
void *impl() override { return &m_impl; }
private:
C m_impl;
// insertHelper: QOrderedSet::insert returns an iterator, but std::set::insert returns a std::pair<interator, bool>

View File

@@ -486,6 +486,13 @@ namespace BlackMisc
*/
bool operator !=(const CSequence &other) const { return !(*this == other); }
/*!
* \brief Return an opaque pointer to the implementation container.
* \details Can be useful in unusual debugging situations.
* \warning Not for general use.
*/
void *getImpl() { return pimpl() ? pimpl()->impl() : nullptr; }
private:
class PimplBase
{
@@ -515,6 +522,7 @@ namespace BlackMisc
virtual iterator erase(iterator pos) = 0;
virtual iterator erase(iterator it1, iterator it2) = 0;
virtual bool operator ==(const PimplBase &other) const = 0;
virtual void *impl() = 0;
};
template <class C> class Pimpl : public PimplBase
@@ -546,6 +554,7 @@ namespace BlackMisc
iterator erase(iterator pos) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator*>(pos.getImpl()))); }
iterator erase(iterator it1, iterator it2) override { return iterator::fromImpl(m_impl.erase(*static_cast<const typename C::iterator*>(it1.getImpl()), *static_cast<const typename C::iterator*>(it2.getImpl()))); }
bool operator ==(const PimplBase &other) const override { Pimpl copy = C(); for (auto i = other.cbegin(); i != other.cend(); ++i) copy.push_back(*i); return m_impl == copy.m_impl; }
void *impl() override { return &m_impl; }
private:
C m_impl;
};