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>
diff --git a/tools/Registry.h b/tools/Registry.h
new file mode 100644
index 0000000..6a1e24a
--- /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