summaryrefslogtreecommitdiff
path: root/src/playlist/include/source.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/playlist/include/source.hpp')
-rw-r--r--src/playlist/include/source.hpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/playlist/include/source.hpp b/src/playlist/include/source.hpp
index aa15e7df..ce12faf3 100644
--- a/src/playlist/include/source.hpp
+++ b/src/playlist/include/source.hpp
@@ -9,6 +9,7 @@
#include <deque>
#include <memory>
#include <mutex>
+#include <stack>
#include <variant>
#include <vector>
@@ -73,6 +74,24 @@ class IResetableSource : public ISource {
virtual auto Reset() -> void = 0;
};
+class IteratorSource : public IResetableSource {
+ public:
+ IteratorSource(const database::Iterator&);
+
+ auto Current() -> std::optional<database::TrackId> override;
+ auto Advance() -> std::optional<database::TrackId> override;
+ auto Peek(std::size_t n, std::vector<database::TrackId>*)
+ -> std::size_t override;
+
+ auto Previous() -> std::optional<database::TrackId> override;
+ auto Reset() -> void override;
+
+ private:
+ const database::Iterator& start_;
+ std::optional<database::TrackId> current_;
+ std::stack<database::Iterator, std::vector<database::Iterator>> next_;
+};
+
auto CreateSourceFromResults(
std::weak_ptr<database::Database>,
std::shared_ptr<database::Result<database::IndexRecord>>)