/* * Copyright 2023 jacqueline * * SPDX-License-Identifier: GPL-3.0-only */ #pragma once #include #include #include #include #include #include "bloom_filter.hpp" #include "database.hpp" #include "future_fetcher.hpp" #include "random.hpp" #include "source.hpp" #include "track.hpp" namespace playlist { /* * A source composes of other sources and/or specific extra tracks. Supports * iteration over its contents in a random order. */ class Shuffler : public ISource { public: static auto Create() -> Shuffler*; explicit Shuffler( util::IRandom* random, std::unique_ptr> filter); auto Current() -> std::optional override; auto Advance() -> std::optional override; auto Peek(std::size_t, std::vector*) -> std::size_t override; typedef std::variant> Item; auto Add(Item) -> void; /* * Returns the enqueued items, starting from the current item, in their * original insertion order. */ auto Unshuffle() -> std::vector; // Not copyable or movable. Shuffler(const Shuffler&) = delete; Shuffler& operator=(const Shuffler&) = delete; private: auto RefillBuffer() -> void; util::IRandom* random_; std::unique_ptr> already_played_; bool out_of_items_; std::deque ordered_items_; std::deque shuffled_items_buffer_; }; } // namespace playlist