diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/core/SkTRegistry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/core/SkTRegistry.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,55 @@ + +/* + * Copyright 2009 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SkTRegistry_DEFINED +#define SkTRegistry_DEFINED + +#include "SkTypes.h" + +/** Template class that registers itself (in the constructor) into a linked-list + and provides a function-pointer. This can be used to auto-register a set of + services, e.g. a set of image codecs. + */ +template class SkTRegistry : SkNoncopyable { +public: + typedef T Factory; + + explicit SkTRegistry(T fact) : fFact(fact) { +#ifdef SK_BUILD_FOR_ANDROID + // work-around for double-initialization bug + { + SkTRegistry* reg = gHead; + while (reg) { + if (reg == this) { + return; + } + reg = reg->fChain; + } + } +#endif + fChain = gHead; + gHead = this; + } + + static const SkTRegistry* Head() { return gHead; } + + const SkTRegistry* next() const { return fChain; } + const Factory& factory() const { return fFact; } + +private: + Factory fFact; + SkTRegistry* fChain; + + static SkTRegistry* gHead; +}; + +// The caller still needs to declare an instance of this somewhere +template SkTRegistry* SkTRegistry::gHead; + +#endif