Utils: Introduce TreeItem::{begin,end}

... and use this to reduce the number of explicit uses of m_children.

Despite of being shorter code by itself it is a step towards having
an explicit LeafItem object that doesn't explicitly store a(n empty)
vector of child nodes.

Change-Id: If8db85e2f1134dd1578a78d31235bf57a28f863a
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2017-02-07 08:53:00 +01:00
parent af54ab960a
commit 196dbbe0e7
16 changed files with 75 additions and 66 deletions

View File

@@ -620,7 +620,13 @@ TreeItem::~TreeItem()
TreeItem *TreeItem::childAt(int pos) const
{
QTC_ASSERT(pos >= 0, return 0);
return pos < m_children.size() ? m_children.at(pos) : 0;
return pos < childCount() ? *(begin() + pos) : nullptr;
}
int TreeItem::indexOf(const TreeItem *item) const
{
auto it = std::find(begin(), end(), item);
return it == end() ? -1 : it - begin();
}
QVariant TreeItem::data(int column, int role) const
@@ -661,14 +667,14 @@ void TreeItem::prependChild(TreeItem *item)
void TreeItem::appendChild(TreeItem *item)
{
insertChild(m_children.size(), item);
insertChild(childCount(), item);
}
void TreeItem::insertChild(int pos, TreeItem *item)
{
QTC_CHECK(!item->model());
QTC_CHECK(!item->parent());
QTC_ASSERT(0 <= pos && pos <= m_children.size(), return); // '<= size' is intentional.
QTC_ASSERT(0 <= pos && pos <= childCount(), return); // '<=' is intentional.
if (m_model) {
QModelIndex idx = index();
@@ -733,7 +739,7 @@ void TreeItem::updateAll()
if (m_model) {
QModelIndex idx = index();
m_model->dataChanged(idx, idx.sibling(idx.row(), m_model->m_columnCount - 1));
foreach (TreeItem *item, m_children)
for (TreeItem *item : *this)
item->updateAll();
}
}
@@ -748,12 +754,12 @@ void TreeItem::updateColumn(int column)
TreeItem *TreeItem::firstChild() const
{
return m_children.isEmpty() ? 0 : m_children.first();
return childCount() == 0 ? nullptr : *begin();
}
TreeItem *TreeItem::lastChild() const
{
return m_children.isEmpty() ? 0 : m_children.last();
return childCount() == 0 ? nullptr : *(end() - 1);
}
int TreeItem::level() const
@@ -766,7 +772,7 @@ int TreeItem::level() const
int TreeItem::indexInParent() const
{
return m_parent ? m_parent->m_children.indexOf(const_cast<TreeItem *>(this)) : -1;
return m_parent ? m_parent->indexOf(this) : -1;
}
QModelIndex TreeItem::index() const
@@ -782,7 +788,7 @@ QAbstractItemModel *TreeItem::model() const
void TreeItem::forAllChildren(const std::function<void (TreeItem *)> &pred) const
{
foreach (TreeItem *item, m_children) {
for (TreeItem *item : *this) {
pred(item);
item->forAllChildren(pred);
}
@@ -790,7 +796,7 @@ void TreeItem::forAllChildren(const std::function<void (TreeItem *)> &pred) cons
void TreeItem::forSelectedChildren(const std::function<bool (TreeItem *)> &pred) const
{
foreach (TreeItem *item, m_children) {
for (TreeItem *item : *this) {
if (pred(item))
item->forSelectedChildren(pred);
}
@@ -800,10 +806,10 @@ void TreeItem::forChildrenAtLevel(int level, const std::function<void(TreeItem *
{
QTC_ASSERT(level > 0, return);
if (level == 1) {
foreach (TreeItem *item, m_children)
for (TreeItem *item : *this)
pred(item);
} else {
foreach (TreeItem *item, m_children)
for (TreeItem *item : *this)
item->forChildrenAtLevel(level - 1, pred);
}
}
@@ -812,11 +818,11 @@ TreeItem *TreeItem::findChildAtLevel(int level, const std::function<bool(TreeIte
{
QTC_ASSERT(level > 0, return 0);
if (level == 1) {
foreach (TreeItem *item, m_children)
for (TreeItem *item : *this)
if (pred(item))
return item;
} else {
foreach (TreeItem *item, m_children) {
for (TreeItem *item : *this) {
if (auto found = item->findChildAtLevel(level - 1, pred))
return found;
}
@@ -826,7 +832,7 @@ TreeItem *TreeItem::findChildAtLevel(int level, const std::function<bool(TreeIte
TreeItem *TreeItem::findAnyChild(const std::function<bool(TreeItem *)> &pred) const
{
foreach (TreeItem *item, m_children) {
for (TreeItem *item : *this) {
if (pred(item))
return item;
if (TreeItem *found = item->findAnyChild(pred))
@@ -837,7 +843,7 @@ TreeItem *TreeItem::findAnyChild(const std::function<bool(TreeItem *)> &pred) co
void TreeItem::clear()
{
while (m_children.size()) {
while (childCount() != 0) {
TreeItem *item = m_children.takeLast();
item->m_model = 0;
item->m_parent = 0;
@@ -857,7 +863,7 @@ void TreeItem::propagateModel(BaseTreeModel *m)
QTC_ASSERT(m_model == 0 || m_model == m, return);
if (m && !m_model) {
m_model = m;
foreach (TreeItem *item, m_children)
for (TreeItem *item : *this)
item->propagateModel(m);
}
}
@@ -1067,7 +1073,7 @@ QModelIndex BaseTreeModel::indexForItem(const TreeItem *item) const
QTC_ASSERT(p, return QModelIndex());
TreeItem *mitem = const_cast<TreeItem *>(item);
int row = p->m_children.indexOf(mitem);
int row = p->indexOf(mitem);
return createIndex(row, 0, mitem);
}
@@ -1095,7 +1101,7 @@ TreeItem *BaseTreeModel::takeItem(TreeItem *item)
QTC_ASSERT(item, return item);
TreeItem *parent = item->parent();
QTC_ASSERT(parent, return item);
int pos = parent->m_children.indexOf(item);
int pos = parent->indexOf(item);
QTC_ASSERT(pos != -1, return item);
QModelIndex idx = indexForItem(parent);