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