/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrPendingProgramElement_DEFINED #define GrPendingProgramElement_DEFINED #include "SkRefCnt.h" #include "GrTypes.h" /** * Helper for owning a pending execution on a GrProgramElement. Using this rather than ref allows * resources that are owned by the program element to be correctly tracked as having pending reads * and writes rather than refs. */ template class GrPendingProgramElement : SkNoncopyable { public: GrPendingProgramElement() : fObj(nullptr) { } // Adds a pending execution on obj. explicit GrPendingProgramElement(T* obj) : fObj(obj) { if (obj) { obj->addPendingExecution(); } } void reset(T* obj) { if (obj) { obj->addPendingExecution(); } if (fObj) { fObj->completedExecution(); } fObj = obj; } T* get() const { return fObj; } operator T*() { return fObj; } T *operator->() const { return fObj; } ~GrPendingProgramElement() { if (fObj) { fObj->completedExecution(); } } private: T* fObj; typedef SkNoncopyable INHERITED; }; #endif