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 
SkTRegistry(T fact)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 
Head()40     static const SkTRegistry* Head() { return gHead; }
41 
next()42     const SkTRegistry* next() const { return fChain; }
factory()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