xref: /aosp_15_r20/external/deqp/framework/common/tcuFactoryRegistry.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 Worker inline 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 Worker inline 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 Worker inline 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 Worker inline 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