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