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, typename P> class SkTRegistry : SkNoncopyable {
     20 public:
     21     typedef T (*Factory)(P);
     22 
     23     SkTRegistry(Factory 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         fFact = fact;
     37         fChain = gHead;
     38         gHead = this;
     39     }
     40 
     41     static const SkTRegistry* Head() { return gHead; }
     42 
     43     const SkTRegistry* next() const { return fChain; }
     44     Factory factory() const { return fFact; }
     45 
     46 private:
     47     Factory      fFact;
     48     SkTRegistry* fChain;
     49 
     50     static SkTRegistry* gHead;
     51 };
     52 
     53 // The caller still needs to declare an instance of this somewhere
     54 template <typename T, typename P> SkTRegistry<T, P>* SkTRegistry<T, P>::gHead;
     55 
     56 #endif
     57