Skip to content

Instantly share code, notes, and snippets.

@eruffaldi
Last active February 10, 2016 05:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eruffaldi/2ea55ac42b4ccaf0e8dc to your computer and use it in GitHub Desktop.
Save eruffaldi/2ea55ac42b4ccaf0e8dc to your computer and use it in GitHub Desktop.
iterating splitter
// Example program
#include <iostream>
#include <string>
/// boost splitter is too complex
class split_iterator
{
public:
split_iterator(const std::string & ain, char ac): in(ain),c(ac),ip(0)
{
auto newip = in.find(c);
if(newip == std::string::npos)
{
np = in.size()-ip;
}
else
{
np = newip-ip;
}
}
split_iterator() : ip(std::string::npos),np(std::string::npos) {}
std::string operator * () const
{
return in.substr(ip,np);
}
split_iterator &operator++()
{
if(ip == std::string::npos)
return *this;
else
{
ip += np+1;
if(ip >= in.size())
{
ip = std::string::npos;
}
else
{
auto newip = in.find(c,ip);
if(newip == std::string::npos)
{
np = in.size()-ip;
}
else
{
np = newip-ip;
}
}
}
return *this;
}
bool operator != (const split_iterator & s) const
{
return !(s == *this);
}
bool operator == (const split_iterator & s) const
{
return s.ip == ip && ip == std::string::npos;
}
std::string::size_type ip,np;
std::string in;
char c;
};
class splitter
{
public:
splitter(const std::string aa, char ac) : a(aa),c(ac) {}
split_iterator begin() { return split_iterator(a,c); }
split_iterator end() { return split_iterator(); }
std::string a;
char c;
};
inline split_iterator make_split_iterator(const std::string & x, char c)
{
return split_iterator(x,c);
}
int main()
{
std::string name;
std::cout << "What is your name? ";
for(auto q : splitter("",' '))
{
std::cout << q << std::endl;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment