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 §ionName, const std::string &keyName, T defaultValue = 0) const;
38*03ce13f7SAndroid Build Coastguard Worker bool getBoolean(const std::string §ionName, const std::string &keyName, bool defaultValue = false) const;
39*03ce13f7SAndroid Build Coastguard Worker double getFloat(const std::string §ionName, 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 §ionName, const std::string &keyName, const std::string &defaultValue = "") const;
42*03ce13f7SAndroid Build Coastguard Worker void addValue(const std::string §ionName, 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 §ionName, 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 §ionName, 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