diff options
author | Mike Reed <reed@google.com> | 2017-01-11 13:58:55 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-11 19:53:36 +0000 |
commit | ab273facbfe496a3d5dd798e6b4b57c41eed7f16 (patch) | |
tree | 443a37908a8c32af2ff3137094430561780f3f41 /tools/Registry.h | |
parent | 20d031a6ad7853eec166a4a648c09b12e4f32008 (diff) |
move SkTRegister.h into tools
BUG=skia:
Change-Id: Ie7d4fac3024b361a281f456fec2b3a837e2bfe43
Reviewed-on: https://skia-review.googlesource.com/6881
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'tools/Registry.h')
-rw-r--r-- | tools/Registry.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tools/Registry.h b/tools/Registry.h new file mode 100644 index 0000000000..6a1e24a303 --- /dev/null +++ b/tools/Registry.h @@ -0,0 +1,57 @@ +/* + * 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 sk_tools_Registry_DEFINED +#define sk_tools_Registry_DEFINED + +#include "SkTypes.h" + +namespace sk_tools { + +/** 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 <typename T> class Registry : SkNoncopyable { +public: + typedef T Factory; + + explicit Registry(T fact) : fFact(fact) { +#ifdef SK_BUILD_FOR_ANDROID + // work-around for double-initialization bug + { + Registry* reg = gHead; + while (reg) { + if (reg == this) { + return; + } + reg = reg->fChain; + } + } +#endif + fChain = gHead; + gHead = this; + } + + static const Registry* Head() { return gHead; } + + const Registry* next() const { return fChain; } + const Factory& factory() const { return fFact; } + +private: + Factory fFact; + Registry* fChain; + + static Registry* gHead; +}; + +// The caller still needs to declare an instance of this somewhere +template <typename T> Registry<T>* Registry<T>::gHead; + +} // namespace sk_tools + +#endif |