Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2009 The Android Open Source Project
      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 
     10 #ifndef SkTRegistry_DEFINED
     11 #define SkTRegistry_DEFINED
     12 
     13 #include "SkTypes.h"
     14 
     15 /** Template class that registers itself (in the constructor) into a linked-list
     16     and provides a function-pointer. This can be used to auto-register a set of
     17     services, e.g. a set of image codecs.
     18  */
     19 template <typename T> class SkTRegistry : SkNoncopyable {
     20 public:
     21     typedef T Factory;
     22 
     23     explicit SkTRegistry(T fact) : fFact(fact) {
     24 #ifdef SK_BUILD_FOR_ANDROID
     25         // work-around for double-initialization bug
     26         {
     27             SkTRegistry* reg = gHead;
     28             while (reg) {
     29                 if (reg == this) {
     30                     return;
     31                 }
     32                 reg = reg->fChain;
     33             }
     34         }
     35 #endif
     36         fChain = gHead;
     37         gHead  = this;
     38     }
     39 
     40     static const SkTRegistry* Head() { return gHead; }
     41 
     42     const SkTRegistry* next() const { return fChain; }
     43     const Factory& factory() const { return fFact; }
     44 
     45 private:
     46     Factory      fFact;
     47     SkTRegistry* fChain;
     48 
     49     static SkTRegistry* gHead;
     50 };
     51 
     52 // The caller still needs to declare an instance of this somewhere
     53 template <typename T> SkTRegistry<T>* SkTRegistry<T>::gHead;
     54 
     55 #endif
     56