diff options
-rw-r--r-- | src/core/SkTLList.h | 111 | ||||
-rw-r--r-- | src/gpu/GrReducedClip.cpp | 6 | ||||
-rw-r--r-- | src/gpu/GrStencilAndCoverTextContext.cpp | 2 | ||||
-rw-r--r-- | tests/LListTest.cpp | 8 |
4 files changed, 25 insertions, 102 deletions
diff --git a/src/core/SkTLList.h b/src/core/SkTLList.h index 05755f5958..17e8a6a85e 100644 --- a/src/core/SkTLList.h +++ b/src/core/SkTLList.h @@ -10,6 +10,7 @@ #include "SkTInternalLList.h" #include "SkTypes.h" +#include <utility> template <typename T> class SkTLList; template <typename T> @@ -66,52 +67,42 @@ public: } } - T* addToHead(const T& t) { + /** Adds a new element to the list at the head. */ + template <typename... Args> T* addToHead(Args&&... args) { this->validate(); Node* node = this->createNode(); fList.addToHead(node); - new (node->fObj) T(t); this->validate(); - return reinterpret_cast<T*>(node->fObj); + return new (node->fObj) T(std::forward<Args>(args)...); } - T* addToHead() { - this->validate(); - Node* node = this->createNode(); - fList.addToHead(node); - new (node->fObj) T; - this->validate(); - return reinterpret_cast<T*>(node->fObj); - } - - T* addToTail(const T& t) { + /** Adds a new element to the list at the tail. */ + template <typename... Args> T* addToTail(Args&&... args) { this->validate(); Node* node = this->createNode(); fList.addToTail(node); - new (node->fObj) T(t); this->validate(); - return reinterpret_cast<T*>(node->fObj); + return new (node->fObj) T(std::forward<Args>(args)...); } - T* addToTail() { + /** Adds a new element to the list before the location indicated by the iterator. If the + iterator refers to a nullptr location then the new element is added at the tail */ + template <typename... Args> T* addBefore(Iter location, Args&&... args) { this->validate(); Node* node = this->createNode(); - fList.addToTail(node); - new (node->fObj) T; + fList.addBefore(node, location.getNode()); this->validate(); - return reinterpret_cast<T*>(node->fObj); - } - - /** Adds a new element to the list before the location indicated by the iterator. If the - iterator refers to a nullptr location then the new element is added at the tail */ - T* addBefore(const T& t, const Iter& location) { - return new (this->internalAddBefore(location)) T(t); + return new (node->fObj) T(std::forward<Args>(args)...); } /** Adds a new element to the list after the location indicated by the iterator. If the iterator refers to a nullptr location then the new element is added at the head */ - T* addAfter(const T& t, const Iter& location) { - return new (this->internalAddAfter(location)) T(t); + template <typename... Args> T* addAfter(Iter location, Args&&... args) { + this->validate(); + Node* node = this->createNode(); + fList.addAfter(node, location.getNode()); + this->validate(); + return new (node->fObj) T(std::forward<Args>(args)...); } /** Convenience methods for getting an iterator initialized to the head/tail of the list. */ @@ -227,12 +218,6 @@ public: } }; - // For use with operator new - enum Placement { - kBefore_Placement, - kAfter_Placement, - }; - private: struct Block { int fNodesInUse; @@ -333,30 +318,6 @@ private: #endif } - // Support in-place initializing of objects inserted into the list via operator new. - friend void* operator new<T>(size_t, - SkTLList* list, - Placement placement, - const Iter& location); - - - // Helpers that insert the node and returns a pointer to where the new object should be init'ed. - void* internalAddBefore(Iter location) { - this->validate(); - Node* node = this->createNode(); - fList.addBefore(node, location.getNode()); - this->validate(); - return node->fObj; - } - - void* internalAddAfter(Iter location) { - this->validate(); - Node* node = this->createNode(); - fList.addAfter(node, location.getNode()); - this->validate(); - return node->fObj; - } - NodeList fList; NodeList fFreeList; int fCount; @@ -364,40 +325,4 @@ private: }; -// Use the below macros rather than calling this directly -template <typename T> -void *operator new(size_t, SkTLList<T>* list, - typename SkTLList<T>::Placement placement, - const typename SkTLList<T>::Iter& location) { - SkASSERT(list); - if (SkTLList<T>::kBefore_Placement == placement) { - return list->internalAddBefore(location); - } else { - return list->internalAddAfter(location); - } -} - -// Skia doesn't use C++ exceptions but it may be compiled with them enabled. Having an op delete -// to match the op new silences warnings about missing op delete when a constructor throws an -// exception. -template <typename T> -void operator delete(void*, - SkTLList<T>*, - typename SkTLList<T>::Placement, - const typename SkTLList<T>::Iter&) { - SK_CRASH(); -} - -#define SkNEW_INSERT_IN_LLIST_BEFORE(list, location, type_name, args) \ - (new ((list), SkTLList< type_name >::kBefore_Placement, (location)) type_name args) - -#define SkNEW_INSERT_IN_LLIST_AFTER(list, location, type_name, args) \ - (new ((list), SkTLList< type_name >::kAfter_Placement, (location)) type_name args) - -#define SkNEW_INSERT_AT_LLIST_HEAD(list, type_name, args) \ - SkNEW_INSERT_IN_LLIST_BEFORE((list), (list)->headIter(), type_name, args) - -#define SkNEW_INSERT_AT_LLIST_TAIL(list, type_name, args) \ - SkNEW_INSERT_IN_LLIST_AFTER((list), (list)->tailIter(), type_name, args) - #endif diff --git a/src/gpu/GrReducedClip.cpp b/src/gpu/GrReducedClip.cpp index 137c83e411..9a6a6149ad 100644 --- a/src/gpu/GrReducedClip.cpp +++ b/src/gpu/GrReducedClip.cpp @@ -206,9 +206,7 @@ static void reduced_stack_walker(const SkClipStack& stack, if (isFlip) { SkASSERT(SkRegion::kXOR_Op == element->getOp() || SkRegion::kReverseDifference_Op == element->getOp()); - SkNEW_INSERT_AT_LLIST_HEAD(result, - Element, - (queryBounds, SkRegion::kReverseDifference_Op, false)); + result->addToHead(queryBounds, SkRegion::kReverseDifference_Op, false); } else { Element* newElement = result->addToHead(*element); if (newElement->isAA()) { @@ -386,7 +384,7 @@ void GrReducedClip::ReduceClipStack(const SkClipStack& stack, // iior should only be true if aa/non-aa status matches among all elements. SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart); bool doAA = iter.prev()->isAA(); - SkNEW_INSERT_AT_LLIST_HEAD(result, Element, (isectRect, SkRegion::kReplace_Op, doAA)); + result->addToHead(isectRect, SkRegion::kReplace_Op, doAA); if (requiresAA) { *requiresAA = doAA; } diff --git a/src/gpu/GrStencilAndCoverTextContext.cpp b/src/gpu/GrStencilAndCoverTextContext.cpp index 5289d092c7..2c8773860e 100644 --- a/src/gpu/GrStencilAndCoverTextContext.cpp +++ b/src/gpu/GrStencilAndCoverTextContext.cpp @@ -207,7 +207,7 @@ void GrStencilAndCoverTextContext::TextBlob::init(const SkTextBlob* skBlob, SkPaint runPaint(skPaint); for (SkTextBlobRunIterator iter(skBlob); !iter.done(); iter.next()) { iter.applyFontToPaint(&runPaint); // No need to re-seed the paint. - TextRun* run = SkNEW_INSERT_AT_LLIST_TAIL(this, TextRun, (runPaint)); + TextRun* run = this->addToTail(runPaint); const char* text = reinterpret_cast<const char*>(iter.glyphs()); size_t byteLength = sizeof(uint16_t) * iter.glyphCount(); diff --git a/tests/LListTest.cpp b/tests/LListTest.cpp index 5a0e1d89ba..e0e55d0419 100644 --- a/tests/LListTest.cpp +++ b/tests/LListTest.cpp @@ -152,11 +152,11 @@ static void TestTLList(skiatest::Reporter* reporter) { list2.reset(); // use both before/after in-place construction on an empty list - SkNEW_INSERT_IN_LLIST_BEFORE(&list2, list2.headIter(), ListElement, (1)); + list2.addBefore(list2.headIter(), 1); REPORTER_ASSERT(reporter, list2 == list1); list2.reset(); - SkNEW_INSERT_IN_LLIST_AFTER(&list2, list2.tailIter(), ListElement, (1)); + list2.addAfter(list2.tailIter(), 1); REPORTER_ASSERT(reporter, list2 == list1); // add an element to the second list, check that iters are still valid @@ -210,7 +210,7 @@ static void TestTLList(skiatest::Reporter* reporter) { // insert either before or after the iterator, then check that the // surrounding sequence is correct. if (2 == insertionMethod) { - SkNEW_INSERT_IN_LLIST_BEFORE(&list1, iter, ListElement, (id)); + list1.addBefore(iter, id); Iter newItem(iter); newItem.prev(); REPORTER_ASSERT(reporter, newItem.get()->fID == id); @@ -222,7 +222,7 @@ static void TestTLList(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, prev.next()->fID == id); } } else { - SkNEW_INSERT_IN_LLIST_AFTER(&list1, iter, ListElement, (id)); + list1.addAfter(iter, id); Iter newItem(iter); newItem.next(); REPORTER_ASSERT(reporter, newItem.get()->fID == id); |