xref: /aosp_15_r20/external/swiftshader/src/System/Configurator.hpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef sw_Configurator_hpp
16*03ce13f7SAndroid Build Coastguard Worker #define sw_Configurator_hpp
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include <optional>
19*03ce13f7SAndroid Build Coastguard Worker #include <sstream>
20*03ce13f7SAndroid Build Coastguard Worker #include <string>
21*03ce13f7SAndroid Build Coastguard Worker #include <unordered_map>
22*03ce13f7SAndroid Build Coastguard Worker 
23*03ce13f7SAndroid Build Coastguard Worker namespace sw {
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker class Configurator
26*03ce13f7SAndroid Build Coastguard Worker {
27*03ce13f7SAndroid Build Coastguard Worker public:
28*03ce13f7SAndroid Build Coastguard Worker 	// Construct a Configurator given a configuration file.
29*03ce13f7SAndroid Build Coastguard Worker 	explicit Configurator(const std::string &filePath);
30*03ce13f7SAndroid Build Coastguard Worker 
31*03ce13f7SAndroid Build Coastguard Worker 	// Construct a Configurator given an in-memory stream.
32*03ce13f7SAndroid Build Coastguard Worker 	explicit Configurator(std::istream &str);
33*03ce13f7SAndroid Build Coastguard Worker 
34*03ce13f7SAndroid Build Coastguard Worker 	void writeFile(const std::string &filePath, const std::string &title = "Configuration File");
35*03ce13f7SAndroid Build Coastguard Worker 
36*03ce13f7SAndroid Build Coastguard Worker 	template<typename T>
37*03ce13f7SAndroid Build Coastguard Worker 	int getInteger(const std::string &sectionName, const std::string &keyName, T defaultValue = 0) const;
38*03ce13f7SAndroid Build Coastguard Worker 	bool getBoolean(const std::string &sectionName, const std::string &keyName, bool defaultValue = false) const;
39*03ce13f7SAndroid Build Coastguard Worker 	double getFloat(const std::string &sectionName, const std::string &keyName, double defaultValue = 0.0) const;
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker 	std::string getValue(const std::string &sectionName, const std::string &keyName, const std::string &defaultValue = "") const;
42*03ce13f7SAndroid Build Coastguard Worker 	void addValue(const std::string &sectionName, const std::string &keyName, const std::string &value);
43*03ce13f7SAndroid Build Coastguard Worker 
44*03ce13f7SAndroid Build Coastguard Worker private:
45*03ce13f7SAndroid Build Coastguard Worker 	bool readConfiguration(std::istream &str);
46*03ce13f7SAndroid Build Coastguard Worker 
47*03ce13f7SAndroid Build Coastguard Worker 	std::optional<std::string> getValueIfExists(const std::string &sectionName, const std::string &keyName) const;
48*03ce13f7SAndroid Build Coastguard Worker 
49*03ce13f7SAndroid Build Coastguard Worker 	struct Section
50*03ce13f7SAndroid Build Coastguard Worker 	{
51*03ce13f7SAndroid Build Coastguard Worker 		std::unordered_map<std::string, std::string> keyValuePairs;
52*03ce13f7SAndroid Build Coastguard Worker 	};
53*03ce13f7SAndroid Build Coastguard Worker 	std::unordered_map<std::string, Section> sections;
54*03ce13f7SAndroid Build Coastguard Worker };
55*03ce13f7SAndroid Build Coastguard Worker 
56*03ce13f7SAndroid Build Coastguard Worker template<typename T>
getInteger(const std::string & sectionName,const std::string & keyName,T defaultValue) const57*03ce13f7SAndroid Build Coastguard Worker int Configurator::getInteger(const std::string &sectionName, const std::string &keyName, T defaultValue) const
58*03ce13f7SAndroid Build Coastguard Worker {
59*03ce13f7SAndroid Build Coastguard Worker 	static_assert(std::is_integral_v<T>, "getInteger must be used with integral types");
60*03ce13f7SAndroid Build Coastguard Worker 
61*03ce13f7SAndroid Build Coastguard Worker 	auto strValue = getValueIfExists(sectionName, keyName);
62*03ce13f7SAndroid Build Coastguard Worker 	if(!strValue)
63*03ce13f7SAndroid Build Coastguard Worker 		return defaultValue;
64*03ce13f7SAndroid Build Coastguard Worker 
65*03ce13f7SAndroid Build Coastguard Worker 	std::stringstream ss{ *strValue };
66*03ce13f7SAndroid Build Coastguard Worker 	if(strValue->find("0x") != std::string::npos)
67*03ce13f7SAndroid Build Coastguard Worker 		ss >> std::hex;
68*03ce13f7SAndroid Build Coastguard Worker 
69*03ce13f7SAndroid Build Coastguard Worker 	T val = 0;
70*03ce13f7SAndroid Build Coastguard Worker 	ss >> val;
71*03ce13f7SAndroid Build Coastguard Worker 	return val;
72*03ce13f7SAndroid Build Coastguard Worker }
73*03ce13f7SAndroid Build Coastguard Worker 
74*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw
75*03ce13f7SAndroid Build Coastguard Worker 
76*03ce13f7SAndroid Build Coastguard Worker #endif  // sw_Configurator_hpp
77