1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUFACTORYREGISTRY_HPP 2*35238bceSAndroid Build Coastguard Worker #define _TCUFACTORYREGISTRY_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core 5*35238bceSAndroid Build Coastguard Worker * ---------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Generic registry class for factories 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker 28*35238bceSAndroid Build Coastguard Worker #include <string> 29*35238bceSAndroid Build Coastguard Worker #include <vector> 30*35238bceSAndroid Build Coastguard Worker 31*35238bceSAndroid Build Coastguard Worker namespace tcu 32*35238bceSAndroid Build Coastguard Worker { 33*35238bceSAndroid Build Coastguard Worker 34*35238bceSAndroid Build Coastguard Worker class AbstractFactory 35*35238bceSAndroid Build Coastguard Worker { 36*35238bceSAndroid Build Coastguard Worker public: 37*35238bceSAndroid Build Coastguard Worker AbstractFactory(void); 38*35238bceSAndroid Build Coastguard Worker virtual ~AbstractFactory(void); 39*35238bceSAndroid Build Coastguard Worker 40*35238bceSAndroid Build Coastguard Worker virtual const char *getName(void) const = 0; 41*35238bceSAndroid Build Coastguard Worker }; 42*35238bceSAndroid Build Coastguard Worker 43*35238bceSAndroid Build Coastguard Worker class GenericFactoryRegistry 44*35238bceSAndroid Build Coastguard Worker { 45*35238bceSAndroid Build Coastguard Worker public: 46*35238bceSAndroid Build Coastguard Worker GenericFactoryRegistry(void); 47*35238bceSAndroid Build Coastguard Worker ~GenericFactoryRegistry(void); 48*35238bceSAndroid Build Coastguard Worker size(void) const49*35238bceSAndroid Build Coastguard Worker size_t size(void) const 50*35238bceSAndroid Build Coastguard Worker { 51*35238bceSAndroid Build Coastguard Worker return m_factories.size(); 52*35238bceSAndroid Build Coastguard Worker } empty(void) const53*35238bceSAndroid Build Coastguard Worker bool empty(void) const 54*35238bceSAndroid Build Coastguard Worker { 55*35238bceSAndroid Build Coastguard Worker return m_factories.empty(); 56*35238bceSAndroid Build Coastguard Worker } 57*35238bceSAndroid Build Coastguard Worker 58*35238bceSAndroid Build Coastguard Worker void registerFactory(AbstractFactory *factory); 59*35238bceSAndroid Build Coastguard Worker 60*35238bceSAndroid Build Coastguard Worker AbstractFactory *getFactoryByName(const std::string &name); 61*35238bceSAndroid Build Coastguard Worker const AbstractFactory *getFactoryByName(const std::string &name) const; 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker AbstractFactory *getFactoryByIndex(size_t index); 64*35238bceSAndroid Build Coastguard Worker const AbstractFactory *getFactoryByIndex(size_t index) const; 65*35238bceSAndroid Build Coastguard Worker 66*35238bceSAndroid Build Coastguard Worker private: 67*35238bceSAndroid Build Coastguard Worker GenericFactoryRegistry(const GenericFactoryRegistry &); 68*35238bceSAndroid Build Coastguard Worker GenericFactoryRegistry &operator=(const GenericFactoryRegistry &); 69*35238bceSAndroid Build Coastguard Worker 70*35238bceSAndroid Build Coastguard Worker std::vector<AbstractFactory *> m_factories; 71*35238bceSAndroid Build Coastguard Worker }; 72*35238bceSAndroid Build Coastguard Worker 73*35238bceSAndroid Build Coastguard Worker class FactoryBase : public AbstractFactory 74*35238bceSAndroid Build Coastguard Worker { 75*35238bceSAndroid Build Coastguard Worker public: 76*35238bceSAndroid Build Coastguard Worker FactoryBase(const std::string &name, const std::string &description); 77*35238bceSAndroid Build Coastguard Worker ~FactoryBase(void); 78*35238bceSAndroid Build Coastguard Worker 79*35238bceSAndroid Build Coastguard Worker const char *getName(void) const; 80*35238bceSAndroid Build Coastguard Worker const char *getDescription(void) const; 81*35238bceSAndroid Build Coastguard Worker 82*35238bceSAndroid Build Coastguard Worker private: 83*35238bceSAndroid Build Coastguard Worker const std::string m_name; 84*35238bceSAndroid Build Coastguard Worker const std::string m_description; 85*35238bceSAndroid Build Coastguard Worker }; 86*35238bceSAndroid Build Coastguard Worker 87*35238bceSAndroid Build Coastguard Worker template <class Factory> 88*35238bceSAndroid Build Coastguard Worker class FactoryRegistry 89*35238bceSAndroid Build Coastguard Worker { 90*35238bceSAndroid Build Coastguard Worker public: FactoryRegistry(void)91*35238bceSAndroid Build Coastguard Worker FactoryRegistry(void) 92*35238bceSAndroid Build Coastguard Worker { 93*35238bceSAndroid Build Coastguard Worker } ~FactoryRegistry(void)94*35238bceSAndroid Build Coastguard Worker ~FactoryRegistry(void) 95*35238bceSAndroid Build Coastguard Worker { 96*35238bceSAndroid Build Coastguard Worker } 97*35238bceSAndroid Build Coastguard Worker empty(void) const98*35238bceSAndroid Build Coastguard Worker bool empty(void) const 99*35238bceSAndroid Build Coastguard Worker { 100*35238bceSAndroid Build Coastguard Worker return m_registry.empty(); 101*35238bceSAndroid Build Coastguard Worker } size(void) const102*35238bceSAndroid Build Coastguard Worker size_t size(void) const 103*35238bceSAndroid Build Coastguard Worker { 104*35238bceSAndroid Build Coastguard Worker return m_registry.size(); 105*35238bceSAndroid Build Coastguard Worker } getFactoryCount(void) const106*35238bceSAndroid Build Coastguard Worker size_t getFactoryCount(void) const 107*35238bceSAndroid Build Coastguard Worker { 108*35238bceSAndroid Build Coastguard Worker return m_registry.size(); 109*35238bceSAndroid Build Coastguard Worker } 110*35238bceSAndroid Build Coastguard Worker registerFactory(Factory * factory)111*35238bceSAndroid Build Coastguard Worker void registerFactory(Factory *factory) 112*35238bceSAndroid Build Coastguard Worker { 113*35238bceSAndroid Build Coastguard Worker m_registry.registerFactory(factory); 114*35238bceSAndroid Build Coastguard Worker } 115*35238bceSAndroid Build Coastguard Worker 116*35238bceSAndroid Build Coastguard Worker Factory *getFactoryByName(const std::string &name); 117*35238bceSAndroid Build Coastguard Worker const Factory *getFactoryByName(const std::string &name) const; 118*35238bceSAndroid Build Coastguard Worker 119*35238bceSAndroid Build Coastguard Worker Factory *getFactoryByIndex(size_t index); 120*35238bceSAndroid Build Coastguard Worker const Factory *getFactoryByIndex(size_t index) const; 121*35238bceSAndroid Build Coastguard Worker getDefaultFactory(void)122*35238bceSAndroid Build Coastguard Worker Factory *getDefaultFactory(void) 123*35238bceSAndroid Build Coastguard Worker { 124*35238bceSAndroid Build Coastguard Worker return getFactoryByIndex(0); 125*35238bceSAndroid Build Coastguard Worker } getDefaultFactory(void) const126*35238bceSAndroid Build Coastguard Worker const Factory *getDefaultFactory(void) const 127*35238bceSAndroid Build Coastguard Worker { 128*35238bceSAndroid Build Coastguard Worker return getFactoryByIndex(0); 129*35238bceSAndroid Build Coastguard Worker } 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker private: 132*35238bceSAndroid Build Coastguard Worker GenericFactoryRegistry m_registry; 133*35238bceSAndroid Build Coastguard Worker }; 134*35238bceSAndroid Build Coastguard Worker 135*35238bceSAndroid Build Coastguard Worker template <class Factory> getFactoryByName(const std::string & name)136*35238bceSAndroid Build Coastguard Workerinline Factory *FactoryRegistry<Factory>::getFactoryByName(const std::string &name) 137*35238bceSAndroid Build Coastguard Worker { 138*35238bceSAndroid Build Coastguard Worker return static_cast<Factory *>(m_registry.getFactoryByName(name)); 139*35238bceSAndroid Build Coastguard Worker } 140*35238bceSAndroid Build Coastguard Worker 141*35238bceSAndroid Build Coastguard Worker template <class Factory> getFactoryByName(const std::string & name) const142*35238bceSAndroid Build Coastguard Workerinline const Factory *FactoryRegistry<Factory>::getFactoryByName(const std::string &name) const 143*35238bceSAndroid Build Coastguard Worker { 144*35238bceSAndroid Build Coastguard Worker return static_cast<const Factory *>(m_registry.getFactoryByName(name)); 145*35238bceSAndroid Build Coastguard Worker } 146*35238bceSAndroid Build Coastguard Worker 147*35238bceSAndroid Build Coastguard Worker template <class Factory> getFactoryByIndex(size_t index)148*35238bceSAndroid Build Coastguard Workerinline Factory *FactoryRegistry<Factory>::getFactoryByIndex(size_t index) 149*35238bceSAndroid Build Coastguard Worker { 150*35238bceSAndroid Build Coastguard Worker return static_cast<Factory *>(m_registry.getFactoryByIndex(index)); 151*35238bceSAndroid Build Coastguard Worker } 152*35238bceSAndroid Build Coastguard Worker 153*35238bceSAndroid Build Coastguard Worker template <class Factory> getFactoryByIndex(size_t index) const154*35238bceSAndroid Build Coastguard Workerinline const Factory *FactoryRegistry<Factory>::getFactoryByIndex(size_t index) const 155*35238bceSAndroid Build Coastguard Worker { 156*35238bceSAndroid Build Coastguard Worker return static_cast<const Factory *>(m_registry.getFactoryByIndex(index)); 157*35238bceSAndroid Build Coastguard Worker } 158*35238bceSAndroid Build Coastguard Worker 159*35238bceSAndroid Build Coastguard Worker } // namespace tcu 160*35238bceSAndroid Build Coastguard Worker 161*35238bceSAndroid Build Coastguard Worker #endif // _TCUFACTORYREGISTRY_HPP 162