class name_value_pair { private: char separator; char eos; enum State {looking_name, looking_value, no_value} state; public: name_value_pair (char s = '=', char e = '\n') : separator(s), eos(e), state(looking_name) { } void reset() { state = looking_name; } template bool operator()(InputIterator& next, InputIterator end, Token& tok) { tok = Token(); switch (state) { // For case where we have text for the "name", but none of the "value". Force empty value. case no_value: { // Note: we are not done yet, even if (next == end) here. state=looking_name; break; } // for case where we have previously found text for the "name", and a separator. case looking_value: { // Note: we are not done yet, even if (next == end) here. // We must guarantee an even number of tokens. while (next != end) { if (*next == eos) { ++next; break; } tok+=*next++; } state = looking_name; break; } case looking_name: { if (next == end) return false; while (next != end) { if (*next == separator) { state=looking_value; ++next; break; } if (*next == eos) { state = no_value; ++next; break; } tok+=*next++; } if (next == end) state=no_value; break; } } return true; } };