Untitled
unknown
plain_text
4 years ago
1.6 kB
13
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...