Registry.h revision f523e25da069e3e1af2cb73d37073a34f3bb9ea2
100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com/*
200bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * Copyright 2009, The Android Open Source Project
300bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com *
400bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * Licensed under the Apache License, Version 2.0 (the "License");
500bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * you may not use this file except in compliance with the License.
600bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * You may obtain a copy of the License at
700bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com *
800bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com *     http://www.apache.org/licenses/LICENSE-2.0
900bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com *
1000bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * Unless required by applicable law or agreed to in writing, software
1100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * distributed under the License is distributed on an "AS IS" BASIS,
1200bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * See the License for the specific language governing permissions and
1400bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com * limitations under the License.
1500bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com */
1600bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
1700bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com#ifndef SkTRegistry_DEFINED
1800bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com#define SkTRegistry_DEFINED
1900bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
2000bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com#include "SkTypes.h"
2100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
2200bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com/** Template class that registers itself (in the constructor) into a linked-list
2300bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    and provides a function-pointer. This can be used to auto-register a set of
2400bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    services, e.g. a set of image codecs.
2500bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com */
2600bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.comtemplate <typename T, typename P> class SkTRegistry : SkNoncopyable {
2700bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.compublic:
2800bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    typedef T (*Factory)(P);
2900bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
3000bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    SkTRegistry(Factory fact) {
3100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com        fFact = fact;
3200bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com        fChain = gHead;
3300bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com        gHead = this;
3400bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    }
3500bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
3600bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    static const SkTRegistry* Head() { return gHead; }
3700bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
3800bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    const SkTRegistry* next() const { return fChain; }
3900bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    Factory factory() const { return fFact; }
4000bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
4100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.comprivate:
4200bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    Factory      fFact;
4300bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    SkTRegistry* fChain;
4400bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
4500bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com    static SkTRegistry* gHead;
4600bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com};
4700bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
48f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com// The caller still needs to declare an instance of this somewhere
4900bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.comtemplate <typename T, typename P> SkTRegistry<T, P>* SkTRegistry<T, P>::gHead;
5000bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com
5100bf85a98675c9d0c3150bbeb0a3d7198ad8f21freed@android.com#endif
52