/* */ #ifndef _D_SEQUENCE_H_ #define _D_SEQUENCE_H_ #include namespace aria2 { template class Sequence { public: // Generates value in [_first, _last). _last is not included. class Value { private: T _first; T _last; public: Value(const T& first, const T& last):_first(first), _last(last) {} T next() { return _first++; } bool hasNext() const { return _first != _last; } }; typedef std::deque Values; private: Values _values; public: Sequence(const Values& values): _values(values) {} T next() { if(_values.empty()) { return T(); } T t = _values.front().next(); if(!_values.front().hasNext()) { _values.pop_front(); } return t; } bool hasNext() { return !_values.empty(); } std::deque flush() { std::deque r; while(hasNext()) { r.push_back(next()); } return r; } }; } // namespace aria2 #endif // _D_SEQUENCE_H_