Line data Source code
1 : #include "utils/stringify.hpp" 2 : 3 : #include <cassert> 4 : #include <cstring> 5 : 6 : using namespace std; 7 : using namespace utils::stringify; 8 : 9 : unsigned stringify<float>::PRECISION = 7; 10 : unsigned stringify<double>::PRECISION = 15; 11 : 12 19339 : int stringify<int>::fromString(const string &s) { 13 19339 : return atoi(s.c_str()); 14 : } 15 : 16 19304 : string stringify<int>::toString(const int &s) { 17 19304 : return to_string(s); 18 : } 19 : 20 0 : long stringify<long>::fromString(const string &s) { 21 0 : return strtol(s.c_str(), nullptr, 10); 22 : } 23 : 24 0 : string stringify<long>::toString(const long &s) { 25 0 : return to_string(s); 26 : } 27 : 28 187027 : unsigned long stringify<unsigned long>::fromString(const string &s) { 29 187027 : return strtoul(s.c_str(), nullptr, 10); 30 : } 31 : 32 19304 : string stringify<unsigned long>::toString(const unsigned long &s) { 33 19304 : return to_string(s); 34 : } 35 : 36 284211 : bool stringify<bool>::fromString(const string &s) { 37 284211 : if(s == "1") 38 : return true; 39 227931 : else if(s == "0") 40 : return false; 41 : else 42 0 : throw runtime_error("Invalid bool string: " + s); 43 : } 44 : 45 0 : string stringify<bool>::toString(const bool &t) { 46 0 : return t ? "1" : "0"; 47 : } 48 : 49 0 : float stringify<float>::fromString(const string &s) { 50 0 : return (float)atof(s.c_str()); 51 : } 52 : 53 0 : string stringify<float>::toString(const float &s) { 54 0 : char bufChar[32]; 55 0 : sprintf(bufChar, "%.*f", PRECISION, s); 56 0 : string buf(bufChar); 57 : // clang-format off 58 0 : while( 59 0 : buf.size() > 1 && 60 0 : buf.find('.') != string::npos && 61 0 : (buf[buf.size() - 1] == '0' || buf[buf.size() - 1] == '.') 62 : ) { 63 : // clang-format on 64 0 : buf.erase(buf.size() - 1); 65 : } 66 0 : return string(buf); 67 : } 68 : 69 655460 : double stringify<double>::fromString(const string &s) { 70 655460 : return atof(s.c_str()); 71 : } 72 : 73 57912 : string stringify<double>::toString(const double &s) { 74 57912 : char bufChar[32]; 75 57912 : sprintf(bufChar, "%.*f", PRECISION, s); 76 57912 : string buf(bufChar); 77 : // clang-format off 78 189414 : while( 79 378761 : buf.size() > 1 && 80 189414 : buf.find('.') != string::npos && 81 188676 : (buf[buf.size() - 1] == '0' || buf[buf.size() - 1] == '.') 82 : ) { 83 : // clang-format on 84 131502 : buf.erase(buf.size() - 1); 85 : } 86 173736 : return string(buf); 87 : } 88 : 89 49777 : string stringify<string>::fromString(const string &s) { 90 49777 : return s; 91 : } 92 : 93 0 : string stringify<string>::toString(const string &s) { 94 0 : return s; 95 : } 96 : 97 0 : string stringify<vector<bool>>::toString(const std::vector<bool> &t) { 98 0 : string s(t.size(), '-'); 99 : 100 0 : for(size_t i = 0; i < t.size(); ++i) { 101 0 : string bs = stringify<bool>::toString(t[i]); 102 0 : assert(bs.size() == 1); 103 0 : s[i] = bs[0]; 104 : } 105 : 106 0 : return s; 107 : } 108 : 109 55306 : vector<bool> stringify<vector<bool>>::fromString(const std::string &s) { 110 55306 : std::vector<bool> ret(s.size()); 111 : 112 311864 : for(size_t i = 0; i < s.size(); ++i) { 113 513116 : ret[i] = stringify<bool>::fromString(s.substr(i, 1)); 114 : } 115 : 116 55306 : return ret; 117 : }