[sksg] Switch containers from SkT(D)Array to std::vector
Skia's containers grow too aggressively, stick to STL containers for
reduced head overhead.
Also introduce Group::shrink_to_fit() to be used when clients know they
are done adding children to a group.
TBR=
Bug: skia:8340
Change-Id: I842db2e80c7cfb65a462e4859af6e63496863a5c
Reviewed-on: https://skia-review.googlesource.com/151161
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/modules/sksg/src/SkSGNode.cpp b/modules/sksg/src/SkSGNode.cpp
index 0cb578e..59ce87b 100644
--- a/modules/sksg/src/SkSGNode.cpp
+++ b/modules/sksg/src/SkSGNode.cpp
@@ -9,6 +9,8 @@
#include "SkSGNode.h"
#include "SkSGInvalidationController.h"
+#include <algorithm>
+
namespace sksg {
class Node::ScopedFlag {
@@ -46,7 +48,7 @@
Node::~Node() {
if (fFlags & kObserverArray_Flag) {
- SkASSERT(fInvalObserverArray->isEmpty());
+ SkASSERT(fInvalObserverArray->empty());
delete fInvalObserverArray;
} else {
SkASSERT(!fInvalObserver);
@@ -61,8 +63,8 @@
return;
}
- auto observers = new SkTDArray<Node*>();
- observers->setReserve(2);
+ auto observers = new std::vector<Node*>();
+ observers->reserve(2);
observers->push_back(node->fInvalObserver);
node->fInvalObserverArray = observers;
@@ -70,7 +72,8 @@
}
// No duplicate observers.
- SkASSERT(node->fInvalObserverArray->find(this) < 0);
+ SkASSERT(std::find(node->fInvalObserverArray->begin(),
+ node->fInvalObserverArray->end(), this) == node->fInvalObserverArray->end());
node->fInvalObserverArray->push_back(this);
}
@@ -83,9 +86,11 @@
return;
}
- const auto idx = node->fInvalObserverArray->find(this);
- SkASSERT(idx >= 0);
- node->fInvalObserverArray->remove(idx);
+ SkDEBUGCODE(const auto origSize = node->fInvalObserverArray->size());
+ node->fInvalObserverArray->erase(std::remove(node->fInvalObserverArray->begin(),
+ node->fInvalObserverArray->end(), this),
+ node->fInvalObserverArray->end());
+ SkASSERT(node->fInvalObserverArray->size() == origSize - 1);
}
template <typename Func>