diff options
Diffstat (limited to 'src/database/include')
| -rw-r--r-- | src/database/include/database.hpp | 5 | ||||
| -rw-r--r-- | src/database/include/index.hpp | 2 | ||||
| -rw-r--r-- | src/database/include/track.hpp | 63 |
3 files changed, 49 insertions, 21 deletions
diff --git a/src/database/include/database.hpp b/src/database/include/database.hpp index c75dbf96..88a18e17 100644 --- a/src/database/include/database.hpp +++ b/src/database/include/database.hpp @@ -87,8 +87,6 @@ class Database { leveldb::DB* db_; leveldb::Cache* cache_; - std::shared_ptr<tasks::Worker> worker_task_; - // Not owned. IFileGatherer& file_gatherer_; ITagParser& tag_parser_; @@ -98,8 +96,7 @@ class Database { leveldb::Cache* cache, IFileGatherer& file_gatherer, ITagParser& tag_parser, - locale::ICollator& collator, - std::shared_ptr<tasks::Worker> worker); + locale::ICollator& collator); auto dbMintNewTrackId() -> TrackId; diff --git a/src/database/include/index.hpp b/src/database/include/index.hpp index 15b21ee8..45dae464 100644 --- a/src/database/include/index.hpp +++ b/src/database/include/index.hpp @@ -62,7 +62,7 @@ struct IndexKey { }; auto Index(locale::ICollator&, const IndexInfo&, const Track&) - -> std::vector<std::pair<IndexKey, std::pmr::string>>; + -> std::vector<std::pair<IndexKey, std::string>>; auto ExpandHeader(const IndexKey::Header&, const std::optional<std::pmr::string>&) -> IndexKey::Header; diff --git a/src/database/include/track.hpp b/src/database/include/track.hpp index 0497c94d..610ab487 100644 --- a/src/database/include/track.hpp +++ b/src/database/include/track.hpp @@ -15,6 +15,7 @@ #include <string> #include <unordered_map> #include <utility> +#include <variant> #include "leveldb/db.h" #include "memory_resource.hpp" @@ -51,12 +52,21 @@ enum class Tag { kTitle = 0, kArtist = 1, kAlbum = 2, - kAlbumTrack = 3, - kGenre = 4, - kDuration = 5, + kAlbumArtist = 3, + kDisc = 4, + kTrack = 5, + kAlbumOrder = 6, + kGenres = 7, }; -auto TagToString(Tag t) -> std::string; +using TagValue = std::variant<std::monostate, + std::pmr::string, + uint32_t, + cpp::span<const std::pmr::string>>; + +auto tagName(Tag) -> std::string; +auto tagHash(const TagValue&) -> uint64_t; +auto tagToString(const TagValue&) -> std::string; /* * Owning container for tag-related track metadata that was extracted from a @@ -65,29 +75,43 @@ auto TagToString(Tag t) -> std::string; class TrackTags { public: TrackTags() - : encoding_(Container::kUnsupported), tags_(&memory::kSpiRamResource) {} + : encoding_(Container::kUnsupported), genres_(&memory::kSpiRamResource) {} TrackTags(const TrackTags& other) = delete; TrackTags& operator=(TrackTags& other) = delete; bool operator==(const TrackTags&) const = default; + auto get(Tag) const -> TagValue; + auto set(Tag, std::string_view) -> void; + + auto allPresent() const -> std::vector<Tag>; + auto encoding() const -> Container { return encoding_; }; auto encoding(Container e) -> void { encoding_ = e; }; - std::optional<int> channels; - std::optional<int> sample_rate; - std::optional<int> bits_per_sample; + auto title() const -> const std::optional<std::pmr::string>&; + auto title(std::string_view) -> void; + + auto artist() const -> const std::optional<std::pmr::string>&; + auto artist(std::string_view) -> void; - std::optional<int> duration; + auto album() const -> const std::optional<std::pmr::string>&; + auto album(std::string_view) -> void; - auto set(const Tag& key, const std::pmr::string& val) -> void; - auto at(const Tag& key) const -> std::optional<std::pmr::string>; - auto operator[](const Tag& key) const -> std::optional<std::pmr::string>; + auto albumArtist() const -> const std::optional<std::pmr::string>&; + auto albumArtist(std::string_view) -> void; - auto tags() const -> const std::pmr::unordered_map<Tag, std::pmr::string>& { - return tags_; - } + auto disc() const -> const std::optional<uint8_t>&; + auto disc(const std::string_view) -> void; + + auto track() const -> const std::optional<uint16_t>&; + auto track(const std::string_view) -> void; + + auto albumOrder() const -> uint32_t; + + auto genres() const -> cpp::span<const std::pmr::string>; + auto genres(const std::string_view) -> void; /* * Returns a hash of the 'identifying' tags of this track. That is, a hash @@ -99,7 +123,14 @@ class TrackTags { private: Container encoding_; - std::pmr::unordered_map<Tag, std::pmr::string> tags_; + + std::optional<std::pmr::string> title_; + std::optional<std::pmr::string> artist_; + std::optional<std::pmr::string> album_; + std::optional<std::pmr::string> album_artist_; + std::optional<uint8_t> disc_; + std::optional<uint16_t> track_; + std::pmr::vector<std::pmr::string> genres_; }; /* |
