/*
 * 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 "include/core/SkTypes.h"
#include "include/private/base/SkNoncopyable.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:
    explicit Registry(T value, bool condition = true) : fValue(value) {
        if (condition) {
            this->linkToRegistryHead();
        }
    }

    static const Registry* Head() { return gHead; }

    const Registry* next() const { return fChain; }
    const T& get() const { return fValue; }

    // for (const T& t : sk_tools::Registry<T>::Range()) { process(t); }
    struct Range {
        struct Iterator {
            const Registry* fPtr;
            const T& operator*() { return SkASSERT(fPtr), fPtr->get(); }
            void operator++() { if (fPtr) { fPtr = fPtr->next(); } }
            bool operator!=(const Iterator& other) const { return fPtr != other.fPtr; }
        };
        Iterator begin() const { return Iterator{Registry::Head()}; }
        Iterator end() const { return Iterator{nullptr}; }
    };

private:
    void linkToRegistryHead() {
        fChain = gHead;
        gHead  = this;
    }

    T fValue;
    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
