aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.common/OpaqueIterator.hpp
blob: 128cbc6ec7e7a4bb91d902870a215aa5c7d6d307 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once

template <typename T>
class IOpaqueIterator {
public:
	virtual ~IOpaqueIterator() = default;
	virtual bool HasNext() const = 0;
	virtual T Next() = 0;
};

template <typename TContainer>
class ContainerOpaqueIterator : public IOpaqueIterator<typename TContainer::reference_type> {
private:
	typename TContainer::iterator mIter;
	typename TContainer::const_iterator mEnd;

public:
	ContainerOpaqueIterator(TContainer& container)
		: mIter{ container.begin() }
		, mEnd{ container.end() } {}

	virtual bool HasNext() const override {
		return mIter != mEnd;
	}

	virtual typename TContainer::reference_type Next() override {
		auto result = *mIter;
		++mIter;
		return result;
	}
};