|
|
@@ -12,74 +12,74 @@ namespace stream { namespace detail {
|
|
|
std::advance(curr_, n); \
|
|
|
end_ = mem_.end();
|
|
|
|
|
|
- namespace join {
|
|
|
- template <typename C> class iterator {
|
|
|
- private:
|
|
|
- using impl_t = ::stream::iterator<C>;
|
|
|
- using local_iterator = typename C::const_iterator;
|
|
|
-
|
|
|
- public:
|
|
|
- using reference = typename local_iterator::reference;
|
|
|
-
|
|
|
- public:
|
|
|
- iterator(impl_t && f, impl_t && l)
|
|
|
- : start_(std::move(f)), finish_(std::move(l)) {
|
|
|
- if (start_ != finish_) {
|
|
|
- mem_ = *(start_);
|
|
|
- curr_ = mem_.begin();
|
|
|
- end_ = mem_.end();
|
|
|
- advance();
|
|
|
- }
|
|
|
+ template <typename C> class join_iterator {
|
|
|
+ public:
|
|
|
+ using reference = typename C::const_iterator::reference;
|
|
|
+
|
|
|
+ public:
|
|
|
+ join_iterator(iterator<C> && f, iterator<C> && l)
|
|
|
+ : start_(std::move(f)), finish_(std::move(l)) {
|
|
|
+ if (start_ != finish_) {
|
|
|
+ mem_ = *(start_);
|
|
|
+ curr_ = mem_.begin();
|
|
|
+ end_ = mem_.end();
|
|
|
+ advance();
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- iterator(iterator const & other){JOIN_CTOR()} iterator(iterator && other){
|
|
|
- JOIN_CTOR(std::move)}
|
|
|
+ join_iterator(join_iterator const & other) {
|
|
|
+ JOIN_CTOR()
|
|
|
+ }
|
|
|
+
|
|
|
+ join_iterator(join_iterator && other){
|
|
|
+ JOIN_CTOR(std::move)
|
|
|
+ }
|
|
|
|
|
|
- iterator &
|
|
|
- operator=(iterator const & other) {
|
|
|
- JOIN_CTOR()
|
|
|
- return *this;
|
|
|
- }
|
|
|
+ join_iterator & operator=(join_iterator const & other) {
|
|
|
+ JOIN_CTOR()
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
|
|
|
- iterator & operator=(iterator && other) {
|
|
|
- JOIN_CTOR(std::move)
|
|
|
- return *this;
|
|
|
- }
|
|
|
+ join_iterator & operator=(join_iterator && other) {
|
|
|
+ JOIN_CTOR(std::move)
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
|
|
|
- reference operator*() { return *curr_; }
|
|
|
+ reference operator*() { return *curr_; }
|
|
|
|
|
|
- iterator & operator++() {
|
|
|
- ++curr_;
|
|
|
- advance();
|
|
|
- return *this;
|
|
|
- }
|
|
|
+ join_iterator & operator++() {
|
|
|
+ ++curr_;
|
|
|
+ advance();
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
|
|
|
- DELEGATE_ITERATOR_IMPL_BASE(start_)
|
|
|
- private:
|
|
|
- void advance() {
|
|
|
- while (curr_ == end_ && start_ != finish_) {
|
|
|
- if (++start_ == finish_) { break; }
|
|
|
- mem_ = *start_;
|
|
|
- curr_ = mem_.begin();
|
|
|
- end_ = mem_.end();
|
|
|
- }
|
|
|
+ bool operator==(join_iterator const & rhs) const { return start_ == rhs.start_; }
|
|
|
+ private:
|
|
|
+ void advance() {
|
|
|
+ while (curr_ == end_ && start_ != finish_) {
|
|
|
+ if (++start_ == finish_) { break; }
|
|
|
+ mem_ = *start_;
|
|
|
+ curr_ = mem_.begin();
|
|
|
+ end_ = mem_.end();
|
|
|
}
|
|
|
- impl_t start_, finish_;
|
|
|
- C mem_;
|
|
|
- local_iterator curr_, end_;
|
|
|
- };
|
|
|
- }
|
|
|
+ }
|
|
|
+ iterator<C> start_;
|
|
|
+ iterator<C> finish_;
|
|
|
+ C mem_;
|
|
|
+ typename C::const_iterator curr_;
|
|
|
+ typename C::const_iterator end_;
|
|
|
+ };
|
|
|
|
|
|
template <typename C> class join_stream {
|
|
|
public:
|
|
|
using T = typename C::value_type;
|
|
|
explicit join_stream(stream_base<C> const & sb) : source_(sb) {}
|
|
|
|
|
|
- ::stream::iterator<T> begin() {
|
|
|
- return {join::iterator<C>{source_.begin(), source_.end()}};
|
|
|
+ iterator<T> begin() {
|
|
|
+ return {join_iterator<C>{source_.begin(), source_.end()}};
|
|
|
}
|
|
|
- ::stream::iterator<T> end() {
|
|
|
- return {join::iterator<C>{source_.end(), source_.end()}};
|
|
|
+ iterator<T> end() {
|
|
|
+ return {join_iterator<C>{source_.end(), source_.end()}};
|
|
|
}
|
|
|
|
|
|
private:
|