Home | History | Annotate | Download | only in win
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #ifndef SkSkTScopedPtr_DEFINED
     10 #define SkSkTScopedPtr_DEFINED
     11 
     12 #include "SkTypes.h"
     13 #include "SkTemplates.h"
     14 
     15 template<typename T>
     16 class SkBlockComRef : public T {
     17 private:
     18     virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
     19     virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
     20 };
     21 
     22 template<typename T>
     23 class SkTScopedComPtr : SkNoncopyable {
     24 private:
     25     T *fPtr;
     26 
     27 public:
     28     explicit SkTScopedComPtr(T *ptr = NULL) : fPtr(ptr) { }
     29     ~SkTScopedComPtr() {
     30         this->reset();
     31     }
     32     T &operator*() const { SkASSERT(fPtr != NULL); return *fPtr; }
     33     SkBlockComRef<T> *operator->() const {
     34         return static_cast<SkBlockComRef<T>*>(fPtr);
     35     }
     36     /**
     37      * Returns the address of the underlying pointer.
     38      * This is dangerous -- it breaks encapsulation and the reference escapes.
     39      * Must only be used on instances currently pointing to NULL,
     40      * and only to initialize the instance.
     41      */
     42     T **operator&() { SkASSERT(fPtr == NULL); return &fPtr; }
     43     T *get() const { return fPtr; }
     44     void reset() {
     45         if (NULL != this->fPtr) {
     46             this->fPtr->Release();
     47             this->fPtr = NULL;
     48         }
     49     }
     50 
     51     void swap(SkTScopedComPtr<T>& that) {
     52         T* temp = this->fPtr;
     53         this->fPtr = that.fPtr;
     54         that.fPtr = temp;
     55     }
     56 
     57     T* release() {
     58         T* temp = this->fPtr;
     59         this->fPtr = NULL;
     60         return temp;
     61     }
     62 };
     63 
     64 #endif
     65