• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SkTRegistry(Factory fact)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 
Head()41     static const SkTRegistry* Head() { return gHead; }
42 
next()43     const SkTRegistry* next() const { return fChain; }
factory()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