#include <iostream>
#include <functional>
#include <cctype>
#include <algorithm>
#include <iterator>
template <typename InputIterator>
class IteratorWithSkip : public std::iterator<std::forward_iterator_tag, typename InputIterator::value_type>
{
public:
typedef typename InputIterator::value_type value_type;
typedef bool (*skip_function)(value_type);
explicit IteratorWithSkip(InputIterator begin, InputIterator end, skip_function f)
: m_final(false), m_it(begin), m_end(end), m_f(f) {}
IteratorWithSkip() : m_final(true) {}
IteratorWithSkip(const IteratorWithSkip& it) : m_it(it.m_it), m_end(it.m_end), m_final(it.m_final), m_f(it.m_f) {
skip();
}
IteratorWithSkip& operator=(const IteratorWithSkip& it) {
if (this != &it) {
m_it = it.m_it;
m_end = it.m_end;
m_final = it.m_final;
m_f = it.m_f;
}
return *this;
}
IteratorWithSkip operator++(int) {
IteratorWithSkip tmp(m_it, m_end, m_f);
++(*this);
return tmp;
}
IteratorWithSkip& operator++(){
if (m_it != m_end) ++m_it;
skip();
return *this;
}
bool operator==(const IteratorWithSkip& it) const {
return (it.m_final && m_it == m_end);
}
bool operator!=(const IteratorWithSkip& it) const {
return ! (*this == it);
}
value_type operator*() {
return *m_it;
}
private:
void skip() {
while (m_it != m_end && m_f(*m_it)) ++m_it;
}
bool m_final;
InputIterator m_it, m_end;
skip_function m_f;
};
bool is_space (char s)
{
return isspace(s);
}
int main()
{
std::string s1 = "hello world", s2 = " hellow o r l d ";
typedef IteratorWithSkip<std::string::iterator> SkipIterator;
SkipIterator i1(s1.begin(), s1.end(), is_space), i1_end, i2(s2.begin(), s2.end(), is_space);
std::copy (SkipIterator(s2.begin(), s2.end(), is_space),
SkipIterator(),
std::ostream_iterator<char>(std::cout));
std::cout << std::endl;
std::cout << std::boolalpha << std::equal (i1, i1_end, i2) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGNjdHlwZT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3I+CmNsYXNzIEl0ZXJhdG9yV2l0aFNraXAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yOjp2YWx1ZV90eXBlPgp7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5wdXRJdGVyYXRvcjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiBib29sICgqc2tpcF9mdW5jdGlvbikodmFsdWVfdHlwZSk7CiAgICAKICAgIGV4cGxpY2l0IEl0ZXJhdG9yV2l0aFNraXAoSW5wdXRJdGVyYXRvciBiZWdpbiwgSW5wdXRJdGVyYXRvciBlbmQsIHNraXBfZnVuY3Rpb24gZikgCiAgICAgICAgOiBtX2ZpbmFsKGZhbHNlKSwgIG1faXQoYmVnaW4pLCBtX2VuZChlbmQpLCBtX2YoZikge30KICAgICAgICAKICAgIEl0ZXJhdG9yV2l0aFNraXAoKSA6IG1fZmluYWwodHJ1ZSkge30KICAgIAogICAgSXRlcmF0b3JXaXRoU2tpcChjb25zdCBJdGVyYXRvcldpdGhTa2lwJiBpdCkgOiBtX2l0KGl0Lm1faXQpLCBtX2VuZChpdC5tX2VuZCksIG1fZmluYWwoaXQubV9maW5hbCksIG1fZihpdC5tX2YpIHsKICAgICAgICBza2lwKCk7CiAgICB9CiAgICAKICAgIEl0ZXJhdG9yV2l0aFNraXAmIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvcldpdGhTa2lwJiBpdCkgewogICAgICAgIGlmICh0aGlzICE9ICZpdCkgewogICAgICAgICAgICBtX2l0ID0gaXQubV9pdDsKICAgICAgICAgICAgbV9lbmQgPSBpdC5tX2VuZDsKICAgICAgICAgICAgbV9maW5hbCA9IGl0Lm1fZmluYWw7CiAgICAgICAgICAgIG1fZiA9IGl0Lm1fZjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCiAgICBJdGVyYXRvcldpdGhTa2lwIG9wZXJhdG9yKysoaW50KSB7IAogICAgICAgIEl0ZXJhdG9yV2l0aFNraXAgdG1wKG1faXQsIG1fZW5kLCBtX2YpOwogICAgICAgICsrKCp0aGlzKTsKICAgICAgICByZXR1cm4gdG1wOwogICAgfQogICAgCiAgICBJdGVyYXRvcldpdGhTa2lwJiBvcGVyYXRvcisrKCl7CiAgICAgICAgaWYgKG1faXQgIT0gbV9lbmQpICsrbV9pdDsKICAgICAgICBza2lwKCk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCiAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3JXaXRoU2tpcCYgaXQpIGNvbnN0IHsKICAgICAgICByZXR1cm4gKGl0Lm1fZmluYWwgJiYgbV9pdCA9PSBtX2VuZCk7CiAgICB9CiAgICAKICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvcldpdGhTa2lwJiBpdCkgY29uc3QgewogICAgICAgIHJldHVybiAhICgqdGhpcyA9PSBpdCk7CiAgICB9CiAgICAKICAgIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgewogICAgICAgIHJldHVybiAqbV9pdDsKICAgIH0KcHJpdmF0ZToKICAgIHZvaWQgc2tpcCgpIHsKICAgICAgICB3aGlsZSAobV9pdCAhPSBtX2VuZCAmJiBtX2YoKm1faXQpKSArK21faXQ7CiAgICB9CiAgICBib29sIG1fZmluYWw7CiAgICBJbnB1dEl0ZXJhdG9yIG1faXQsIG1fZW5kOwogICAgc2tpcF9mdW5jdGlvbiBtX2Y7Cn07Cgpib29sIGlzX3NwYWNlIChjaGFyIHMpCnsKICAgIHJldHVybiBpc3NwYWNlKHMpOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c3RyaW5nIHMxID0gImhlbGxvIHdvcmxkIiwgczIgPSAiIGhlbGxvdyBvIHIgbCBkICAgIjsKICAgIHR5cGVkZWYgSXRlcmF0b3JXaXRoU2tpcDxzdGQ6OnN0cmluZzo6aXRlcmF0b3I+IFNraXBJdGVyYXRvcjsKICAgIAogICAgU2tpcEl0ZXJhdG9yIGkxKHMxLmJlZ2luKCksIHMxLmVuZCgpLCBpc19zcGFjZSksIGkxX2VuZCwgaTIoczIuYmVnaW4oKSwgczIuZW5kKCksIGlzX3NwYWNlKTsKICAgIAogICAgc3RkOjpjb3B5IChTa2lwSXRlcmF0b3IoczIuYmVnaW4oKSwgczIuZW5kKCksIGlzX3NwYWNlKSwgCiAgICAgICAgICAgICAgIFNraXBJdGVyYXRvcigpLCAKICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGNoYXI+KHN0ZDo6Y291dCkpOyAKICAgICAgICAgICAgICAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSA8PCBzdGQ6OmVxdWFsIChpMSwgaTFfZW5kLCBpMikgPDwgc3RkOjplbmRsOwp9