#include <iostream>
#include <sstream>
#include <vector>
#include <list>
using namespace std;
class Line
{
public:
std::list<int> get_values() const
{
return { a, b, c };
}
private:
int a, b, c;
template<class charT>
friend basic_istream<charT>& operator>>(basic_istream<charT>& is,
Line& line)
{
return is >> line.a >> line.b >> line.c;
}
};
class line_parser : public std::ctype<char>
{
public:
static mask* make_table()
{
static std::vector<mask> v(classic_table(),
classic_table() + table_size);
int spaces[10] = {0x20, 0x0c, 0x0a, 0x0d, 0x09,
0x0b, '(', ',', ')', ';'};
// ^^^^^^^^^^^^^^^^^^
for (int i : spaces)
v[i] |= space;
return &v[0];
}
line_parser(int refs = 0) : ctype(make_table(), false, refs) { }
};
template<class Line>
class line_extractor
{
public:
line_extractor(Line& l)
: line(l)
{ }
private:
Line& line;
template<class charT>
void do_input(basic_istream<charT>& is) const
{
locale loc = is.getloc();
is.imbue(locale(loc, new line_parser)); // imbue the new locale
is >> line;
is.imbue(loc); // imbue the original locale
}
template<class charT>
friend basic_istream<charT>& operator>>(basic_istream<charT>& is,
const line_extractor& le)
{
le.do_input(is);
return is;
}
};
template<class Line>
line_extractor<Line> get_line(Line& l)
{
return line_extractor<Line>(l);
}
int main()
{
string line = "(1,2,3); (3,4,5);(6,7,8); (9,10,11);";
stringstream ss(line);
vector<Line> v;
for (Line line; ss >> get_line(line);)
{
v.push_back(line);
}
for (auto x : v)
{
for (auto y : x.get_values())
{
std::cout << y << " ";
}
std::cout << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGxpc3Q+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBMaW5lCnsKcHVibGljOgogICAgc3RkOjpsaXN0PGludD4gZ2V0X3ZhbHVlcygpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHsgYSwgYiwgYyB9OwogICAgfQpwcml2YXRlOgogICAgaW50IGEsIGIsIGM7CiAgICAKICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJUPgogICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08Y2hhclQ+JiBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhclQ+JiBpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lJiBsaW5lKQogICAgewogICAgICAgIHJldHVybiBpcyA+PiBsaW5lLmEgPj4gbGluZS5iID4+IGxpbmUuYzsKICAgIH0KfTsKCmNsYXNzIGxpbmVfcGFyc2VyIDogcHVibGljIHN0ZDo6Y3R5cGU8Y2hhcj4KewpwdWJsaWM6CiAgICBzdGF0aWMgbWFzayogbWFrZV90YWJsZSgpCiAgICB7CiAgICAgICAgc3RhdGljIHN0ZDo6dmVjdG9yPG1hc2s+IHYoY2xhc3NpY190YWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2ljX3RhYmxlKCkgKyB0YWJsZV9zaXplKTsKICAgICAgICBpbnQgc3BhY2VzWzEwXSA9IHsweDIwLCAweDBjLCAweDBhLCAweDBkLCAweDA5LAogICAgICAgICAgICAgICAgICAgICAgICAgMHgwYiwgJygnLCAnLCcsICcpJywgJzsnfTsKICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXgoKICAgICAgICBmb3IgKGludCBpIDogc3BhY2VzKQogICAgICAgICAgICB2W2ldIHw9IHNwYWNlOwogICAgICAgIHJldHVybiAmdlswXTsKICAgIH0KCiAgICBsaW5lX3BhcnNlcihpbnQgcmVmcyA9IDApIDogY3R5cGUobWFrZV90YWJsZSgpLCBmYWxzZSwgcmVmcykgeyB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBMaW5lPgpjbGFzcyBsaW5lX2V4dHJhY3Rvcgp7CnB1YmxpYzoKICAgIGxpbmVfZXh0cmFjdG9yKExpbmUmIGwpCiAgICAgICAgOiBsaW5lKGwpCiAgICB7IH0KcHJpdmF0ZToKICAgIExpbmUmIGxpbmU7CgogICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQ+CiAgICB2b2lkIGRvX2lucHV0KGJhc2ljX2lzdHJlYW08Y2hhclQ+JiBpcykgY29uc3QKICAgIHsKICAgICAgICBsb2NhbGUgbG9jID0gaXMuZ2V0bG9jKCk7CgogICAgICAgIGlzLmltYnVlKGxvY2FsZShsb2MsIG5ldyBsaW5lX3BhcnNlcikpOyAvLyBpbWJ1ZSB0aGUgbmV3IGxvY2FsZQoKICAgICAgICBpcyA+PiBsaW5lOwogICAgICAgIGlzLmltYnVlKGxvYyk7IC8vIGltYnVlIHRoZSBvcmlnaW5hbCBsb2NhbGUgCiAgICB9CgogICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQ+CiAgICBmcmllbmQgYmFzaWNfaXN0cmVhbTxjaGFyVD4mIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyVD4mIGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVfZXh0cmFjdG9yJiBsZSkKICAgIHsKICAgICAgICBsZS5kb19pbnB1dChpcyk7CiAgICAgICAgcmV0dXJuIGlzOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgTGluZT4KbGluZV9leHRyYWN0b3I8TGluZT4gZ2V0X2xpbmUoTGluZSYgbCkKewogICAgcmV0dXJuIGxpbmVfZXh0cmFjdG9yPExpbmU+KGwpOwp9CgppbnQgbWFpbigpCnsKICAgIHN0cmluZyBsaW5lID0gIigxLDIsMyk7ICgzLDQsNSk7KDYsNyw4KTsgKDksMTAsMTEpOyI7CiAgICBzdHJpbmdzdHJlYW0gc3MobGluZSk7CiAgICB2ZWN0b3I8TGluZT4gdjsKICAgIAogICAgZm9yIChMaW5lIGxpbmU7IHNzID4+IGdldF9saW5lKGxpbmUpOykKICAgIHsKICAgICAgICB2LnB1c2hfYmFjayhsaW5lKTsKICAgIH0KICAgIAogICAgZm9yIChhdXRvIHggOiB2KQogICAgewogICAgICAgIGZvciAoYXV0byB5IDogeC5nZXRfdmFsdWVzKCkpCiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgeSA8PCAiICI7CiAgICAgICAgfQogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9Cn0=