From ccaac5e89d98698eca081bf8b815fefc03338f48 Mon Sep 17 00:00:00 2001 From: b0dyless Date: Wed, 21 May 2025 11:44:05 +0200 Subject: [PATCH] prima implementazione classe Database --- src/Memory/Database.cpp | 55 ++++++------ src/Memory/Database.h | 20 ++--- src/Memory/MediaContainer.cpp | 156 ---------------------------------- src/Memory/MediaContainer.h | 68 +++++---------- src/src.pro | 41 +++++++++ 5 files changed, 94 insertions(+), 246 deletions(-) delete mode 100644 src/Memory/MediaContainer.cpp create mode 100644 src/src.pro diff --git a/src/Memory/Database.cpp b/src/Memory/Database.cpp index 4744e0b..a205b2b 100644 --- a/src/Memory/Database.cpp +++ b/src/Memory/Database.cpp @@ -1,51 +1,44 @@ #include "Database.h" +#include +#include + +#include "Deserializer.h" namespace memory { -DataBase::~DataBase() { - // può darsi che se ne occupi il distruttore di QFile - // comportamento di default: per ora metto che non vengono salvati i - // cambiamenti - close(false); +Database::~Database() { + close(false); // di default non salvare eventuali cambiamenti } -int DataBase::open(const QString &path) { - // QFile.close() non lancia errori se il file non è stato aperto - // file_.commit(); - file_.setFileName(path); - if (!file_.open(QIODevice::ReadOnly | QIODevice::Text)) { - // TODO(alessandro): possiamo creare una qualche enum per i codici di errore - return 1; +bool Database::open(const QString &path) { + QFile file(path); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + return false; } - return 0; + media_container_.addMedia(Deserializer::deserialize(file)); + file.close(); + return true; } -int DataBase::close(bool save_on_exit) { +bool Database::close(bool save_on_exit) { if (save_on_exit) { - // ritorna false se c'è stato un errore. Possiamo voler cambiare il tipo di - // ritorno del metodo. - file_.commit(); - } else { - // void cancelWriting() - file_.cancelWriting(); + return file_.commit(); // false <=> errore } - return 0; + file_.cancelWriting(); + return true; } -int DataBase::save() { - // ritorna false in caso di fallimento +bool Database::save() { if (!file_.commit()) { // errore in scrittura - return -1; + return false; } - // riapri il file dopo averlo chiuso - // ritorna false in caso di fallimento + if (!file_.open(QIODevice::ReadOnly | QIODevice::Text)) { - return 1; + return false; } - return 0; + return true; } -// qua possiamo volendo utilizzare riferimenti costanti al posto di puntatori -std::vector DataBase::filterMedia( - const media::Media *media_as_filter) { +std::vector> Database::filterMedia( + const media::Media &media_as_filter) { return media_container_.filter(media_as_filter); } diff --git a/src/Memory/Database.h b/src/Memory/Database.h index d327857..ea95c0a 100644 --- a/src/Memory/Database.h +++ b/src/Memory/Database.h @@ -3,24 +3,22 @@ #include #include "./MediaContainer.h" +#include namespace memory { -class DataBase { +class Database { private: MediaContainer media_container_; QSaveFile file_; - // possiamo mettere open, close e save privati e poi usare un tipo di observer - // pattern per chiamare le funzioni. public: - DataBase() = default; - ~DataBase(); - int open(const QString &path); - int close(bool save); - int save(); - // TODO(alessandro): smart pointer - // possiamo cambiarlo a riferimenti costanti - std::vector filterMedia(const media::Media *); + ~Database(); + + bool open(const QString &path); + bool close(bool save); + bool save(); + + std::vector> filterMedia(const media::Media &); }; } // namespace memory #endif diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp deleted file mode 100644 index 7d9c177..0000000 --- a/src/Memory/MediaContainer.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "MediaContainer.h" - -namespace memory { - -void MediaContainer::addMedia(const std::shared_ptr& media) { - if (!media) return; - - data_[static_cast(MediaType::All)].push_back(media); - - MediaType type = determineType(media); - if (type != MediaType::All) { - data_[static_cast(type)].push_back(media); - } -} - -void MediaContainer::removeMedia(const std::shared_ptr& media) { - if (!media) return; - - for (auto& vec : data_) { - vec.erase(std::remove_if(vec.begin(), vec.end(), - [&](const std::shared_ptr& m) { - return typeid(*m) == typeid(*media) && *m == *media; - }), vec.end()); - } -} - -void MediaContainer::clear() { - for (auto& vec : data_) { - vec.clear(); - } -} - -const std::vector>& MediaContainer::getAll() const { - return data_[static_cast(MediaType::All)]; -} - -const std::vector>& MediaContainer::getByType(MediaType type) const { - return data_[static_cast(type)]; -} - -const std::vector>& MediaContainer::getByTypeAndSubtype(MediaType type) const { - std::vector> result; - - switch (type) { - case MediaType::Novel: - result.insert(result.end(), data_[static_cast(MediaType::Novel)].begin(), data_[static_cast(MediaType::Novel)].end()); - result.insert(result.end(), data_[static_cast(MediaType::EBook)].begin(), data_[static_cast(MediaType::EBook)].end()); - result.insert(result.end(), data_[static_cast(MediaType::AudioBook)].begin(), data_[static_cast(MediaType::AudioBook)].end()); - break; - case MediaType::Movie: - result.insert(result.end(), data_[static_cast(MediaType::Movie)].begin(), data_[static_cast(MediaType::Movie)].end()); - result.insert(result.end(), data_[static_cast(MediaType::Series)].begin(), data_[static_cast(MediaType::Series)].end()); - break; - case MediaType::All: - result = data_[0]; - break; - default: - result = data_[static_cast(type)]; - break; - } - - return result; -} - -MediaType MediaContainer::determineType(const std::shared_ptr& media) const { - if (std::dynamic_pointer_cast(media)) return MediaType::Series; - if (std::dynamic_pointer_cast(media)) return MediaType::Movie; - if (std::dynamic_pointer_cast(media)) return MediaType::AudioBook; - if (std::dynamic_pointer_cast(media)) return MediaType::EBook; - if (std::dynamic_pointer_cast(media)) return MediaType::Novel; - if (std::dynamic_pointer_cast(media)) return MediaType::Album; - return MediaType::All; -} - -std::vector> MediaContainer::filter(const media::Media& media) const { - std::shared_ptr mediaPtr = std::make_shared(media); - - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - if (auto m = std::dynamic_pointer_cast(mediaPtr)) return filters(m); - return filters(mediaPtr); -} - -std::vector> MediaContainer::filters(const std::shared_ptr& media) const { - auto allMedia = getAll(); - return media->filter(allMedia); -} - -std::vector> MediaContainer::filters(const std::shared_ptr& novel) const { - auto media = getByTypeAndSubtype(MediaType::Novel); - std::vector> allNovel; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allNovel.push_back(ptr); - std::vector> result; - for (const auto& m : novel->filter(allNovel)) result.push_back(m); - return result; -} - -std::vector> MediaContainer::filters(const std::shared_ptr& album) const { - auto media = getByType(MediaType::Album); - std::vector> allAlbum; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allAlbum.push_back(ptr); - std::vector> result; - for (const auto& m : album->filter(allAlbum)) result.push_back(m); - return result; -} - -std::vector> MediaContainer::filters(const std::shared_ptr& movie) const { - auto media = getByTypeAndSubtype(MediaType::Movie); - std::vector> allMovie; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allMovie.push_back(ptr); - std::vector> result; - for (const auto& m : movie->filter(allMovie)) result.push_back(m); - return result; -} - -std::vector> MediaContainer::filters(const std::shared_ptr& ebook) const { - auto media = getByType(MediaType::EBook); - std::vector> allEbook; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allEbook.push_back(ptr); - std::vector> result; - for (const auto& m : ebook->filter(allEbook)) result.push_back(m); - return result; -} - -std::vector> MediaContainer::filters(const std::shared_ptr& audiobook) const { - auto media = getByType(MediaType::AudioBook); - std::vector> allAudio; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allAudio.push_back(ptr); - std::vector> result; - for (const auto& m : audiobook->filter(allAudio)) result.push_back(m); - return result; -} - -std::vector> MediaContainer::filters(const std::shared_ptr& series) const { - auto media = getByType(MediaType::Series); - std::vector> allSeries; - for (const auto& m : media) - if (auto ptr = std::dynamic_pointer_cast(m)) allSeries.push_back(ptr); - std::vector> result; - for (const auto& m : series->filter(allSeries)) result.push_back(m); - return result; -} - -int MediaContainer::serialize(QSaveFile& file) const { - return Serializer::Serialize(getAll(), file); -} - -} // namespace memory diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index c4d5938..d00eb13 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -1,64 +1,36 @@ #ifndef MEMORY_MEDIACONTAINER_H #define MEMORY_MEDIACONTAINER_H +#include #include -#include #include -#include -#include -#include +#include -#include "Media.h" -#include "Novel.h" -#include "Album.h" -#include "Movie.h" -#include "Ebook.h" -#include "AudioBook.h" -#include "Series.h" -#include "Serializer.h" +#include "../Media/Album.h" +#include "../Media/AudioBook.h" +#include "../Media/Ebook.h" +#include "../Media/Movie.h" +#include "../Media/Novel.h" +#include "../Media/Series.h" namespace memory { -enum class MediaType { - All = 0, - Novel, - Album, - Movie, - EBook, - AudioBook, - Series, - Count -}; - class MediaContainer { -private: - std::array>, static_cast(MediaType::Count)> data_; - - MediaType determineType(const std::shared_ptr& media) const; - - std::vector> filters(const std::shared_ptr& media) const; - std::vector> filters(const std::shared_ptr& novel) const; - std::vector> filters(const std::shared_ptr& album) const; - std::vector> filters(const std::shared_ptr& movie) const; - std::vector> filters(const std::shared_ptr& ebook) const; - std::vector> filters(const std::shared_ptr& audiobook) const; - std::vector> filters(const std::shared_ptr& series) const; + private: - const std::vector>& getAll() const; - const std::vector>& getByType(MediaType type) const; - const std::vector>& getByTypeAndSubtype(MediaType type) const; + public: + void addMedia(const media::Media& media); + void addMedia(const std::vector&); // placeholder + void removeMedia(const media::Media& media); + void clear(); -public: - void addMedia(const std::shared_ptr& media); - void removeMedia(const std::shared_ptr& media); - void clear(); - - // Filtri - std::vector> filter(const media::Media& media) const; + // Filtri + std::vector> filter( + const media::Media& media) const; - int serialize(QSaveFile& file) const; + int serialize(QSaveFile& file) const; }; -} // namespace memory +} // namespace memory -#endif // MEMORY_MEDIACONTAINER_H +#endif // MEMORY_MEDIACONTAINER_H diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..ba5f2c5 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,41 @@ +###################################################################### +# Automatically generated by qmake (3.1) Tue May 20 17:32:43 2025 +###################################################################### + +TEMPLATE = app +TARGET = src +INCLUDEPATH += . +QT += widgets + +# You can make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# Please consult the documentation of the deprecated API in order to know +# how to port your code away from it. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +# Input +HEADERS += Media/Album.h \ + Media/AudioBook.h \ + Media/Ebook.h \ + Media/IConstMediaVisitor.h \ + Media/IMedia.h \ + Media/Media.h \ + Media/Movie.h \ + Media/Novel.h \ + Media/Series.h \ + Media/StringUtils.h \ + Memory/Database.h \ + Memory/Deserializer.h \ + Memory/MediaContainer.h \ + Memory/Serializer.h +SOURCES += main.cpp \ + Media/Album.cpp \ + Media/AudioBook.cpp \ + Media/Ebook.cpp \ + Media/Media.cpp \ + Media/Movie.cpp \ + Media/Novel.cpp \ + Media/Series.cpp \ + Memory/Database.cpp \ + Memory/MediaContainer.cpp