| 159 | |
| 160 | template<typename Out> |
| 161 | bool StringToTime(const std::string& input, Out& output, core::TimeUnit& timeunit) { |
| 162 | if (input.size() == 0) { |
| 163 | return false; |
| 164 | } |
| 165 | |
| 166 | const char* begin = input.c_str(); |
| 167 | char *end; |
| 168 | errno = 0; |
| 169 | auto ival = std::strtoll(begin, &end, 0); |
| 170 | if (end == begin || errno == ERANGE) { |
| 171 | return false; |
| 172 | } |
| 173 | |
| 174 | if (end[0] == '\0') { |
| 175 | return false; |
| 176 | } |
| 177 | |
| 178 | while (*end == ' ') { |
| 179 | // Skip the space |
| 180 | end++; |
| 181 | } |
| 182 | |
| 183 | std::string unit(end); |
| 184 | std::transform(unit.begin(), unit.end(), unit.begin(), ::tolower); |
| 185 | |
| 186 | if (unit == "ns" || unit == "nano" || unit == "nanos" || unit == "nanoseconds") { |
| 187 | timeunit = core::TimeUnit::NANOSECOND; |
| 188 | output = ival; |
| 189 | return true; |
| 190 | } else if (unit == "us" || unit == "micro" || unit == "micros" || unit == "microseconds" || unit == "microsecond") { |
| 191 | timeunit = core::TimeUnit::MICROSECOND; |
| 192 | output = ival; |
| 193 | return true; |
| 194 | } else if (unit == "msec" || unit == "ms" || unit == "millisecond" || unit == "milliseconds" || unit == "msecs" || unit == "millis" || unit == "milli") { |
| 195 | timeunit = core::TimeUnit::MILLISECOND; |
| 196 | output = ival; |
| 197 | return true; |
| 198 | } else if (unit == "sec" || unit == "s" || unit == "second" || unit == "seconds" || unit == "secs") { |
| 199 | timeunit = core::TimeUnit::SECOND; |
| 200 | output = ival; |
| 201 | return true; |
| 202 | } else if (unit == "min" || unit == "m" || unit == "mins" || unit == "minute" || unit == "minutes") { |
| 203 | timeunit = core::TimeUnit::MINUTE; |
| 204 | output = ival; |
| 205 | return true; |
| 206 | } else if (unit == "h" || unit == "hr" || unit == "hour" || unit == "hrs" || unit == "hours") { |
| 207 | timeunit = core::TimeUnit::HOUR; |
| 208 | output = ival; |
| 209 | return true; |
| 210 | } else if (unit == "d" || unit == "day" || unit == "days") { |
| 211 | timeunit = core::TimeUnit::DAY; |
| 212 | output = ival; |
| 213 | return true; |
| 214 | } else { |
| 215 | return false; |
| 216 | } |
| 217 | } |
| 218 | } /* namespace internal */ |