| 37 | |
| 38 | template <typename STR> |
| 39 | bool SplitStringIntoKeyValueT(const STR& line, |
| 40 | typename STR::value_type key_value_delimiter, |
| 41 | STR* key, |
| 42 | STR* value) { |
| 43 | key->clear(); |
| 44 | value->clear(); |
| 45 | |
| 46 | // Find the delimiter. |
| 47 | size_t end_key_pos = line.find_first_of(key_value_delimiter); |
| 48 | if (end_key_pos == STR::npos) { |
| 49 | DVLOG(1) << "cannot find delimiter in: " << line; |
| 50 | return false; // no delimiter |
| 51 | } |
| 52 | key->assign(line, 0, end_key_pos); |
| 53 | |
| 54 | // Find the value string. |
| 55 | STR remains(line, end_key_pos, line.size() - end_key_pos); |
| 56 | size_t begin_value_pos = remains.find_first_not_of(key_value_delimiter); |
| 57 | if (begin_value_pos == STR::npos) { |
| 58 | DVLOG(1) << "cannot parse value from line: " << line; |
| 59 | return false; // no value |
| 60 | } |
| 61 | value->assign(remains, begin_value_pos, remains.size() - begin_value_pos); |
| 62 | return true; |
| 63 | } |
| 64 | |
| 65 | template <typename STR> |
| 66 | void SplitStringUsingSubstrT(const STR& str, |
no test coverage detected