Geant4 Cross Reference |
1 // 2 // MIT License 3 // Copyright (c) 2020 Jonathan R. Madsen 4 // Permission is hereby granted, free of charge, to any person obtaining a copy 5 // of this software and associated documentation files (the "Software"), to deal 6 // in the Software without restriction, including without limitation the rights 7 // to use, copy, modify, merge, publish, distribute, sublicense, and 8 // copies of the Software, and to permit persons to whom the Software is 9 // furnished to do so, subject to the following conditions: 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 12 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 13 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 15 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 16 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 17 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 // 19 // 20 21 #pragma once 22 23 #include <cctype> 24 #include <cstdlib> 25 #include <functional> 26 #include <iomanip> 27 #include <iostream> 28 #include <map> 29 #include <mutex> 30 #include <set> 31 #include <sstream> // IWYU pragma: keep 32 #include <string> 33 #include <tuple> 34 #include <utility> 35 36 namespace PTL 37 { 38 //--------------------------------------------------------------------------------------// 39 // use this function to get an environment variable setting + 40 // a default if not defined, e.g. 41 // int num_threads = 42 // GetEnv<int>("FORCENUMBEROFTHREADS", 43 // std::thread::hardware_concurrency()); 44 // 45 template <typename Tp> 46 Tp 47 GetEnv(const std::string& env_id, Tp _default = Tp()) 48 { 49 char* env_var = std::getenv(env_id.c_str()); 50 if(env_var) 51 { 52 std::string str_var = std::string(env_var); 53 std::istringstream iss(str_var); 54 Tp var = Tp(); 55 iss >> var; 56 return var; 57 } 58 59 // return default if not specified in environment 60 return _default; 61 } 62 63 //--------------------------------------------------------------------------------------// 64 // overload for boolean 65 // 66 template <> 67 inline bool 68 GetEnv(const std::string& env_id, bool _default) 69 { 70 char* env_var = std::getenv(env_id.c_str()); 71 if(env_var) 72 { 73 std::string var = std::string(env_var); 74 bool val = true; 75 if(var.find_first_not_of("0123456789") == std::string::npos) 76 val = (bool) atoi(var.c_str()); 77 else 78 { 79 for(auto& itr : var) 80 itr = tolower(itr); 81 if(var == "off" || var == "false") 82 val = false; 83 } 84 return val; 85 } 86 87 // return default if not specified in environment 88 return _default; 89 } 90 91 //--------------------------------------------------------------------------------------// 92 93 } // namespace PTL 94