diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-12-07 16:57:05 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-12-07 17:00:30 +1100 |
| commit | 3f7f199cb940c8d5f6d48f77fd59971adffe49ef (patch) | |
| tree | aa22162e46c5e9ccce4c7ee8537b493f437664d9 /src/playlist/include/source.hpp | |
| parent | 009f69c929eb1d1b65d75b0937fbf3b8de5d9148 (diff) | |
| download | tangara-fw-3f7f199cb940c8d5f6d48f77fd59971adffe49ef.tar.gz | |
Remove pre-iterator concepts
- No more IndexRecord/Result/dbGetPage nonsense
- Queue is just track ids
- i am so tired and have so much to do
Diffstat (limited to 'src/playlist/include/source.hpp')
| -rw-r--r-- | src/playlist/include/source.hpp | 157 |
1 files changed, 0 insertions, 157 deletions
diff --git a/src/playlist/include/source.hpp b/src/playlist/include/source.hpp deleted file mode 100644 index ce12faf3..00000000 --- a/src/playlist/include/source.hpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2023 jacqueline <me@jacqueline.id.au> - * - * SPDX-License-Identifier: GPL-3.0-only - */ - -#pragma once - -#include <deque> -#include <memory> -#include <mutex> -#include <stack> -#include <variant> -#include <vector> - -#include "bloom_filter.hpp" -#include "database.hpp" -#include "future_fetcher.hpp" -#include "random.hpp" -#include "track.hpp" - -namespace playlist { - -/* - * Stateful interface for iterating over a collection of tracks by id. - */ -class ISource { - public: - virtual ~ISource() {} - - virtual auto Current() -> std::optional<database::TrackId> = 0; - - /* - * Discards the current track id and continues to the next in this source. - * Returns the new current track id. - */ - virtual auto Advance() -> std::optional<database::TrackId> = 0; - - /* - * Repeatedly advances until a track with the given id is the current track. - * Returns false if this source ran out of tracks before the requested id - * was encounted, true otherwise. - */ - virtual auto AdvanceTo(database::TrackId id) -> bool { - for (auto t = Current(); t.has_value(); t = Advance()) { - if (*t == id) { - return true; - } - } - return false; - } - - /* - * Places the next n tracks into the given vector, in order. Does not change - * the value returned by Current(). - */ - virtual auto Peek(std::size_t n, std::vector<database::TrackId>*) - -> std::size_t = 0; -}; - -/* - * A Source that supports restarting iteration from its original initial - * value. - */ -class IResetableSource : public ISource { - public: - virtual ~IResetableSource() {} - - virtual auto Previous() -> std::optional<database::TrackId> = 0; - - /* - * Restarts iteration from this source's initial value. - */ - 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>>) - -> std::shared_ptr<IResetableSource>; - -class IndexRecordSource : public IResetableSource { - public: - IndexRecordSource(std::weak_ptr<database::Database> db, - std::shared_ptr<database::Result<database::IndexRecord>>); - - IndexRecordSource(std::weak_ptr<database::Database> db, - std::shared_ptr<database::Result<database::IndexRecord>>, - std::size_t, - std::shared_ptr<database::Result<database::IndexRecord>>, - std::size_t); - - 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: - std::weak_ptr<database::Database> db_; - - std::shared_ptr<database::Result<database::IndexRecord>> initial_page_; - ssize_t initial_item_; - - std::shared_ptr<database::Result<database::IndexRecord>> current_page_; - ssize_t current_item_; -}; - -class NestedSource : public IResetableSource { - public: - NestedSource(std::weak_ptr<database::Database> db, - std::shared_ptr<database::Result<database::IndexRecord>>); - - 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: - auto CreateChild(std::shared_ptr<database::IndexRecord> page) - -> std::shared_ptr<IResetableSource>; - - std::weak_ptr<database::Database> db_; - - std::shared_ptr<database::Result<database::IndexRecord>> initial_page_; - ssize_t initial_item_; - - std::shared_ptr<database::Result<database::IndexRecord>> current_page_; - ssize_t current_item_; - - std::shared_ptr<IResetableSource> current_child_; -}; - -} // namespace playlist |
