Untitled

 avatar
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...