aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/Registry.h
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-01-11 13:58:55 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-11 19:53:36 +0000
commitab273facbfe496a3d5dd798e6b4b57c41eed7f16 (patch)
tree443a37908a8c32af2ff3137094430561780f3f41 /tools/Registry.h
parent20d031a6ad7853eec166a4a648c09b12e4f32008 (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.h57
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