Untitled
unknown
plain_text
4 years ago
1.6 kB
5
Indexable
template <typename T> std::set<Range<T>> GetToken(const std::string& s, std::function<T(std::string)> obr) { std::set<Range<T>> res; std::size_t k =0; for(std::size_t j =k; j<s.size(); j++) { if(s[j] == '-') { T first_token = static_cast<T>(obr(s.substr(k,j))); k = j+1; while(j < s.size() && s[j] != ',') j++; T second_token = static_cast<T>(obr(s.substr(k,j))); k = j+1; auto ret = res.insert(Range<T>{first_token, second_token}); if(!ret.second) { throw std::runtime_error{"can't insert value"}; } } else if(s[j] == ',') { T token = static_cast<T>(obr(s.substr(k,j))); k = j+1; auto ret = res.insert(Range<T>{token,token}); if(!ret.second) { throw std::runtime_error{"can't insert value"}; } } else if(j == s.size() -1 && k<j) { T token = static_cast<T>(obr(s.substr(k,j+1))); auto ret = res.insert(Range<T>{token,token}); if(!ret.second) { throw std::runtime_error{"can't insert value"}; } } } return res; }
Editor is loading...