aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/Registry.h
diff options
context:
space:
mode:
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