From f9a5cf83acfca263ee08a0922b7d619be2e1712b Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 21:06:13 +0200 Subject: [PATCH 01/11] Modificato sostanzialmente tutti i metodi filter --- src/Media/Album.cpp | 76 +++++++-------- src/Media/Album.h | 3 +- src/Media/AudioBook.cpp | 34 +++---- src/Media/AudioBook.h | 2 +- src/Media/Ebook.cpp | 46 ++++----- src/Media/Ebook.h | 2 +- src/Media/Media.cpp | 78 +++++++--------- src/Media/Media.h | 2 +- src/Media/Movie.cpp | 65 ++++++------- src/Media/Movie.h | 3 +- src/Media/Novel.cpp | 70 ++++++-------- src/Media/Novel.h | 2 +- src/Media/Series.cpp | 41 ++++---- src/Media/Series.h | 2 +- src/Memory/MediaContainer.cpp | 171 ++++++++++++---------------------- src/Memory/MediaContainer.h | 50 ++++------ src/Memory/Serializer.h | 6 +- 17 files changed, 258 insertions(+), 395 deletions(-) diff --git a/src/Media/Album.cpp b/src/Media/Album.cpp index d19e638..ec5da60 100644 --- a/src/Media/Album.cpp +++ b/src/Media/Album.cpp @@ -26,64 +26,52 @@ bool Album::operator==(const Media &other) const { return false; } -std::vector> Album::filter(const std::vector>& input) const { - std::vector> result; - +bool Album::filter(const Media& album) const { // Riutilizzo filtro base di Media - std::vector> baseInput(input.begin(), input.end()); - std::vector> filteredBase = Media::filter(baseInput); - - // Filtro specifico per Album - for (const auto& mediaPtr : filteredBase) { - auto albumPtr = std::dynamic_pointer_cast(mediaPtr); - if (!albumPtr) continue; + if (!Media::filter(album)) + return false; - bool match = true; + // Cast to Album to access Album-specific members + const Album* albumPtr = dynamic_cast(&album); + if (!albumPtr) + return false; - // Band - if (!band_.empty() && !stringContainsIgnoreCase(albumPtr->getBand(), band_)) - match = false; + // Band + if (!band_.empty() && !stringContainsIgnoreCase(albumPtr->getBand(), band_)) + return false; - // Band members (ogni membro richiesto deve matchare almeno uno esistente) - if (!band_members_.empty()) { - for (const auto& memberFilter : band_members_) { - bool found = false; - for (const auto& m : albumPtr->getBandMembers()) { - if (stringContainsIgnoreCase(m, memberFilter)) { - found = true; - break; - } - } - if (!found) { - match = false; + // Band members (ogni membro richiesto deve matchare almeno uno esistente) + if (!band_members_.empty()) { + for (const auto& memberFilter : band_members_) { + bool found = false; + for (const auto& m : albumPtr->getBandMembers()) { + if (stringContainsIgnoreCase(m, memberFilter)) { + found = true; break; } } + if (!found) { + return false; + } } + } - // Songs (ogni canzone richiesta deve matchare almeno una esistente) - if (!songs_.empty()) { - for (const auto& songFilter : songs_) { - bool found = false; - for (const auto& s : albumPtr->getSongs()) { - if (stringContainsIgnoreCase(s, songFilter)) { - found = true; - break; - } - } - if (!found) { - match = false; + // Songs (ogni canzone richiesta deve matchare almeno una esistente) + if (!songs_.empty()) { + for (const auto& songFilter : songs_) { + bool found = false; + for (const auto& s : albumPtr->getSongs()) { + if (stringContainsIgnoreCase(s, songFilter)) { + found = true; break; } } + if (!found) { + return false; + } } - - if (match) - result.push_back(albumPtr); } - - return result; + return true; } - } // namespace media diff --git a/src/Media/Album.h b/src/Media/Album.h index da0fd7c..ca30cd3 100644 --- a/src/Media/Album.h +++ b/src/Media/Album.h @@ -20,8 +20,9 @@ class Album : public Media { const std::vector &getSongs() const; bool operator==(const Media &other) const override; - std::vector> filter(const std::vector>& input) const; + bool filter(const Media& album) const override; }; } // namespace media + #endif diff --git a/src/Media/AudioBook.cpp b/src/Media/AudioBook.cpp index 89f43ca..51ba54f 100644 --- a/src/Media/AudioBook.cpp +++ b/src/Media/AudioBook.cpp @@ -37,33 +37,21 @@ void AudioBook::setStreamingService(const std::string& service) { streamingService_ = service; } -std::vector> AudioBook::filter(const std::vector>& input) const { - std::vector> result; - - // Riutilizza filtro base di Novel (che include filtro di Media) - std::vector> novels(input.begin(), input.end()); - std::vector> filteredNovels = Novel::filter(novels); +bool AudioBook::filter(const Media& input) const { + if (!Novel::filter(input)) + return false; + const AudioBook* audiobookPtr = dynamic_cast(&input); + if (!audiobookPtr) + return false; // Protegge da cast fallito // Filtro specifico AudioBook - for (const auto& novelPtr : filteredNovels) { - auto audiobookPtr = std::dynamic_pointer_cast(novelPtr); - if (!audiobookPtr) continue; - - bool match = true; - - // File size - if (narrator_ != "" && audiobookPtr->getNarrator()!= narrator_) - match = false; + if (!narrator_.empty() && !stringContainsIgnoreCase(audiobookPtr->getNarrator(), narrator_)) + return false; - // DRM - if (streamingService_ != "" && audiobookPtr->getStreamingService() != streamingService_) - match = false; - - if (match) - result.push_back(audiobookPtr); - } + if (!streamingService_.empty() && !stringContainsIgnoreCase(audiobookPtr->getStreamingService(), streamingService_)) + return false; - return result; + return true; } } \ No newline at end of file diff --git a/src/Media/AudioBook.h b/src/Media/AudioBook.h index 38d77fa..e383e0c 100644 --- a/src/Media/AudioBook.h +++ b/src/Media/AudioBook.h @@ -26,7 +26,7 @@ class AudioBook : public Novel { void setNarrator(const std::string& narrator); void setStreamingService(const std::string& service); - std::vector> filter(const std::vector>& input) const; + bool filter(const Media& audiobook) const override; }; } diff --git a/src/Media/Ebook.cpp b/src/Media/Ebook.cpp index 60a10c4..d75ddc5 100644 --- a/src/Media/Ebook.cpp +++ b/src/Media/Ebook.cpp @@ -36,34 +36,24 @@ void Ebook::setDrm(bool drm) { drm_ = drm; } -std::vector> Ebook::filter(const std::vector>& input) const { - std::vector> result; - - // Riutilizza filtro base di Novel (che include filtro di Media) - std::vector> novels(input.begin(), input.end()); - std::vector> filteredNovels = Novel::filter(novels); - - // Filtro specifico Ebook - for (const auto& novelPtr : filteredNovels) { - auto ebookPtr = std::dynamic_pointer_cast(novelPtr); - if (!ebookPtr) continue; - - bool match = true; - - // File size - if (fileSizeBytes_ > 0 && ebookPtr->getFileSizeBytes() != fileSizeBytes_) - match = false; - - // DRM - if (drm_ && ebookPtr->hasDrm() != drm_) - match = false; - - if (match) - result.push_back(ebookPtr); - } - - return result; +bool Ebook::filter(const Media& input) const { + // Riutilizzo filtro base di Novel + if (!Novel::filter(input)) + return false; + // Cast to Ebook to access Ebook-specific members + const Ebook* ebookPtr = dynamic_cast(&input); + if (!ebookPtr) + return false; + + // File size filter + if (fileSizeBytes_ > 0 && ebookPtr->getFileSizeBytes() != fileSizeBytes_) + return false; + + // DRM filter + if (drm_ && ebookPtr->hasDrm() != drm_) + return false; + + return true; } - } \ No newline at end of file diff --git a/src/Media/Ebook.h b/src/Media/Ebook.h index d2ba138..1c8dc01 100644 --- a/src/Media/Ebook.h +++ b/src/Media/Ebook.h @@ -25,7 +25,7 @@ class Ebook : public Novel { void setFileSizeBytes(unsigned int size); void setDrm(bool drm); - std::vector> filter(const std::vector>& input) const; + bool filter(const Media& ebook) const override; }; diff --git a/src/Media/Media.cpp b/src/Media/Media.cpp index 2fcdcae..45e0f5d 100644 --- a/src/Media/Media.cpp +++ b/src/Media/Media.cpp @@ -31,55 +31,45 @@ bool Media::open() { return false; } -std::vector> Media::filter(const std::vector>& input) const { - std::vector> result; - - for (const auto& mediaPtr : input) { - if (!mediaPtr) continue; - - const Media& media = *mediaPtr; - bool match = true; - - // Title (substring, case-insensitive) - if (!getTitle().empty() && !stringContainsIgnoreCase(media.getTitle(), getTitle())) - match = false; - - // Release (confronto stretto) - if (getRelease() != std::numeric_limits::min() && - media.getRelease() != getRelease()) - match = false; - - // Language (substring, case-insensitive) - if (!getLanguage().empty() && media.getLanguage() != getLanguage()) - match = false; - - // Favourite (confronto booleano) - if (isFavourite() && media.isFavourite() != isFavourite()) - match = false; - - // Generi (match parziale case-insensitive su ogni genere richiesto) - if (!getGenres().empty()) { - const auto& mediaGenres = media.getGenres(); - for (const auto& genreFilter : getGenres()) { - bool found = false; - for (const auto& g : mediaGenres) { - if (stringContainsIgnoreCase(g, genreFilter)) { - found = true; - break; - } - } - if (!found) { - match = false; +bool Media::filter(const Media& media) const { + bool match = true; + + // Title (substring, case-insensitive) + if (!getTitle().empty() && !stringContainsIgnoreCase(media.getTitle(), getTitle())) + match = false; + + // Release (confronto stretto) + if (getRelease() != std::numeric_limits::min() && + media.getRelease() != getRelease()) + match = false; + + // Language (substring, case-insensitive) + if (!getLanguage().empty() && media.getLanguage() != getLanguage()) + match = false; + + // Favourite (confronto booleano) + if (isFavourite() && media.isFavourite() != isFavourite()) + match = false; + + // Generi (match parziale case-insensitive su ogni genere richiesto) + if (!getGenres().empty()) { + const auto& mediaGenres = media.getGenres(); + for (const auto& genreFilter : getGenres()) { + bool found = false; + for (const auto& g : mediaGenres) { + if (stringContainsIgnoreCase(g, genreFilter)) { + found = true; break; } } + if (!found) { + match = false; + break; + } } + } - if (match) - result.push_back(mediaPtr); - } - - return result; + return match; } diff --git a/src/Media/Media.h b/src/Media/Media.h index 0d39960..621efd5 100644 --- a/src/Media/Media.h +++ b/src/Media/Media.h @@ -44,7 +44,7 @@ class Media : IMedia{ const std::string &getImgPath() const; const std::string &getNotes() const; - std::vector> filter(const std::vector> &media) const; + virtual bool filter(const Media &media) const; }; } // namespace media #endif diff --git a/src/Media/Movie.cpp b/src/Media/Movie.cpp index 6d83d6b..82f541b 100644 --- a/src/Media/Movie.cpp +++ b/src/Media/Movie.cpp @@ -22,51 +22,44 @@ const std::vector &Movie::getCast() const { return cast_; } unsigned int Movie::getLength() const { return length_; } const std::string &Movie::getUniverse() const { return universe_; } -std::vector> Movie::filter(const std::vector>& input) const { - std::vector> result; +bool Movie::filter(const Media& movie) const { - // Riutilizza filtro base di Media (poiché Movie deriva da Media) - std::vector> baseInput(input.begin(), input.end()); - std::vector> filteredBase = Media::filter(baseInput); + if (!Media::filter(movie)) + return false; - for (const auto& mediaPtr : filteredBase) { - auto moviePtr = std::dynamic_pointer_cast(mediaPtr); - if (!moviePtr) continue; - - bool match = true; - - // Cast (match parziale, case-insensitive) - if (!cast_.empty()) { - const auto& movieCast = moviePtr->getCast(); - for (const auto& filterCast : cast_) { - bool found = false; - for (const auto& member : movieCast) { - if (stringContainsIgnoreCase(member, filterCast)) { - found = true; - break; - } - } - if (!found) { - match = false; + // Cast (match parziale, case-insensitive) + const Movie* moviePtr = dynamic_cast(&movie); + if (!moviePtr) { + return false; + } + if (!cast_.empty()) { + const auto& movieCast = moviePtr->getCast(); + for (const auto& filterCast : cast_) { + bool found = false; + for (const auto& member : movieCast) { + if (stringContainsIgnoreCase(member, filterCast)) { + found = true; break; } } + if (!found) { + return false; + } } - - // Length (confronto stretto) - if (length_ != std::numeric_limits::max() && moviePtr->getLength() != length_) - match = false; - - // Universe (match parziale, case-insensitive) - if (!universe_.empty() && !stringContainsIgnoreCase(moviePtr->getUniverse(), universe_)) - match = false; - - if (match) - result.push_back(moviePtr); } - return result; + // Length (confronto stretto) + if (length_ != std::numeric_limits::max() && moviePtr->getLength() != length_) + return false; + + // Universe (match parziale, case-insensitive) + if (!universe_.empty() && !stringContainsIgnoreCase(moviePtr->getUniverse(), universe_)) + return false; + + return true; } } // namespace media + + diff --git a/src/Media/Movie.h b/src/Media/Movie.h index c37d134..2d96c7a 100644 --- a/src/Media/Movie.h +++ b/src/Media/Movie.h @@ -24,7 +24,8 @@ class Movie : public Media { unsigned int getLength() const; const std::string &getUniverse() const; - std::vector> filter(const std::vector>& input) const; + bool filter(const Media& movie) const override; }; } // namespace media #endif + diff --git a/src/Media/Novel.cpp b/src/Media/Novel.cpp index 88f9195..3368c4e 100644 --- a/src/Media/Novel.cpp +++ b/src/Media/Novel.cpp @@ -34,45 +34,37 @@ void Novel::setSeries(const std::string& series) { series_ = series; } void Novel::setIsbn(const std::string& isbn) { isbn_ = isbn; } -std::vector> Novel::filter(const std::vector>& input) const { - std::vector> result; - - // Riutilizzo del filtro base di Media - std::vector> baseInput(input.begin(), input.end()); - std::vector> filteredBase = Media::filter(baseInput); - - // Filtro specifico per Novel - for (const auto& mediaPtr : filteredBase) { - auto novelPtr = std::dynamic_pointer_cast(mediaPtr); - if (!novelPtr) continue; - - bool match = true; - - // Autore - if (!author_.empty() && !stringContainsIgnoreCase(novelPtr->getAuthor(), author_)) - match = false; - - // Editore - if (!publisher_.empty() && !stringContainsIgnoreCase(novelPtr->getPublisher(), publisher_)) - match = false; - - // Serie - if (!series_.empty() && !stringContainsIgnoreCase(novelPtr->getSeries(), series_)) - match = false; - - // ISBN - if (!isbn_.empty() && !stringContainsIgnoreCase(novelPtr->getIsbn(), isbn_)) - match = false; - - // Pagine (confronto stretto) - if (pages_ > 0 && novelPtr->getPages() != pages_) - match = false; - - if (match) - result.push_back(novelPtr); - } - - return result; +bool Novel::filter(const Media& input) const { + // Riutilizzo filtro base di Media + if (!Media::filter(input)) + return false; + // Cast to Novel to access Novel-specific members + const Novel* novelPtr = dynamic_cast(&input); + if (!novelPtr) + return false; + + // Match fields + // Autore + if (!author_.empty() && !stringContainsIgnoreCase(novelPtr->getAuthor(), author_)) + return false; + + // Editore + if (!publisher_.empty() && !stringContainsIgnoreCase(novelPtr->getPublisher(), publisher_)) + return false; + + // Serie + if (!series_.empty() && !stringContainsIgnoreCase(novelPtr->getSeries(), series_)) + return false; + + // ISBN + if (!isbn_.empty() && !stringContainsIgnoreCase(novelPtr->getIsbn(), isbn_)) + return false; + + // Pagine (confronto stretto) + if (pages_ != std::numeric_limits::max() && novelPtr->getPages() != pages_) + return false; + + return true; } } \ No newline at end of file diff --git a/src/Media/Novel.h b/src/Media/Novel.h index 64f91c9..edab6b5 100644 --- a/src/Media/Novel.h +++ b/src/Media/Novel.h @@ -35,7 +35,7 @@ class Novel : public Media { void setSeries(const std::string& series); void setIsbn(const std::string& isbn); - std::vector> filter(const std::vector> &novel) const; + bool filter(const Media &novel) const override; }; } diff --git a/src/Media/Series.cpp b/src/Media/Series.cpp index 3dd0a1f..d9cdcac 100644 --- a/src/Media/Series.cpp +++ b/src/Media/Series.cpp @@ -25,36 +25,27 @@ unsigned int Series::getEpisodes() const { return episodes_; } unsigned int Series::getSeasons() const { return seasons_; } bool Series::isEnded() const { return ended_; } -std::vector> Series::filter(const std::vector>& input) const { - std::vector> result; +bool Series::filter(const Media& input) const { + if (!Movie::filter(input)) + return false; - // Riutilizzo filtro base di Movie (che a sua volta chiama Media::filter) - std::vector> baseInput(input.begin(), input.end()); - std::vector> filteredBase = Movie::filter(baseInput); + const Series* seriesPtr = dynamic_cast(&input); + if (!seriesPtr) + return false; // Protegge da cast fallito - for (const auto& mediaPtr : filteredBase) { - auto seriesPtr = std::dynamic_pointer_cast(mediaPtr); - if (!seriesPtr) continue; + // Episodes (confronto stretto) + if (episodes_ != std::numeric_limits::max() && seriesPtr->getEpisodes() != episodes_) + return false; - bool match = true; + // Seasons (confronto stretto) + if (seasons_ != std::numeric_limits::max() && seriesPtr->getSeasons() != seasons_) + return false; - // Episodes (confronto stretto) - if (episodes_ != std::numeric_limits::max() && seriesPtr->getEpisodes() != episodes_) - match = false; + // Ended (confronto booleano) + if (ended_ && ended_ != seriesPtr->isEnded()) + return false; - // Seasons (confronto stretto) - if (seasons_ != std::numeric_limits::max() && seriesPtr->getSeasons() != seasons_) - match = false; - - // Ended (confronto booleano) - if (ended_ && ended_ != seriesPtr->isEnded()) - match = false; - - if (match) - result.push_back(seriesPtr); - } - - return result; + return true; } } // namespace media diff --git a/src/Media/Series.h b/src/Media/Series.h index 42118bc..fedbda6 100644 --- a/src/Media/Series.h +++ b/src/Media/Series.h @@ -21,7 +21,7 @@ class Series : public Movie { unsigned int getSeasons() const; bool isEnded() const; - std::vector> filter(const std::vector>& input) const; + bool filter(const Media& input) const override; }; } #endif // MEDIA_SERIES_H diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 7d9c177..151f720 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -1,25 +1,41 @@ #include "MediaContainer.h" +#include +#include namespace memory { -void MediaContainer::addMedia(const std::shared_ptr& media) { - if (!media) return; +void MediaContainer::addMedia(const media::Media& media) { + data_[INDEX_ALL].push_back(media); - data_[static_cast(MediaType::All)].push_back(media); - - MediaType type = determineType(media); - if (type != MediaType::All) { - data_[static_cast(type)].push_back(media); + if (detectIndex(media) == INDEX_ALL) { + return; // Media already exists in the container + } else { + data_[detectIndex(media)].push_back(media); } } -void MediaContainer::removeMedia(const std::shared_ptr& media) { - if (!media) return; +int MediaContainer::detectIndex(const media::Media& media) const { + if (dynamic_cast(&media)) { + return INDEX_SERIES; + } else if (dynamic_cast(&media)) { + return INDEX_AUDIOBOOK; + } else if (dynamic_cast(&media)) { + return INDEX_EBOOK; + } else if (dynamic_cast(&media)) { + return INDEX_MOVIE; + } else if (dynamic_cast(&media)) { + return INDEX_ALBUM; + } else if (dynamic_cast(&media)) { + return INDEX_NOVEL; + } + return INDEX_ALL; // Default case +} +void MediaContainer::removeMedia(const media::Media& media) { 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; + [&](const media::Media& m) { + return typeid(m) == typeid(media) && m == media; }), vec.end()); } } @@ -30,127 +46,54 @@ void MediaContainer::clear() { } } -const std::vector>& MediaContainer::getAll() const { - return data_[static_cast(MediaType::All)]; +const std::vector& MediaContainer::getAll() const { + return data_[INDEX_ALL]; +} + +const std::vector& MediaContainer::getByIndex(int idx) const { + return data_[idx]; } -const std::vector>& MediaContainer::getByType(MediaType type) const { - return data_[static_cast(type)]; +const std::vector& MediaContainer::getByIndex(int idx) const { + return data_[idx]; } -const std::vector>& MediaContainer::getByTypeAndSubtype(MediaType type) const { - std::vector> result; +std::vector MediaContainer::getByGroupIndex(int idx) 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()); + switch (idx) { + case INDEX_NOVEL: + result.insert(result.end(), data_[INDEX_NOVEL].begin(), data_[INDEX_NOVEL].end()); + result.insert(result.end(), data_[INDEX_EBOOK].begin(), data_[INDEX_EBOOK].end()); + result.insert(result.end(), data_[INDEX_AUDIOBOOK].begin(), data_[INDEX_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()); + case INDEX_MOVIE: + result.insert(result.end(), data_[INDEX_MOVIE].begin(), data_[INDEX_MOVIE].end()); + result.insert(result.end(), data_[INDEX_SERIES].begin(), data_[INDEX_SERIES].end()); break; - case MediaType::All: - result = data_[0]; + case INDEX_ALL: + result.insert(result.end(), data_[INDEX_ALL].begin(), data_[INDEX_ALL].end()); break; default: - result = data_[static_cast(type)]; + result.insert(result.end(), data_[idx].begin(), data_[idx].end()); 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; +std::vector MediaContainer::filter(const media::Media& media) const { + std::vector results; + for (const media::Media* m : getByGroupIndex(detectIndex(media))) { + if (media.filter(*m)) { + results.push_back(m); + } + } + return results; } int MediaContainer::serialize(QSaveFile& file) const { - return Serializer::Serialize(getAll(), file); + return Serializer::Serialize(data_[INDEX_ALL], file); } } // namespace memory diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index c4d5938..e4fa4bf 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -3,9 +3,6 @@ #include #include -#include -#include -#include #include #include "Media.h" @@ -19,42 +16,31 @@ 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; + static constexpr int INDEX_ALL = 0; + static constexpr int INDEX_NOVEL = 1; + static constexpr int INDEX_ALBUM = 2; + static constexpr int INDEX_MOVIE = 3; + static constexpr int INDEX_EBOOK = 4; + static constexpr int INDEX_AUDIOBOOK = 5; + static constexpr int INDEX_SERIES = 6; + static constexpr int TYPE_COUNT = 7; - 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; + std::array, TYPE_COUNT> data_; - const std::vector>& getAll() const; - const std::vector>& getByType(MediaType type) const; - const std::vector>& getByTypeAndSubtype(MediaType type) const; + int detectIndex(const media::Media& media) const; + std::vector MediaContainer::getByGroupIndex(int idx) const; public: - void addMedia(const std::shared_ptr& media); - void removeMedia(const std::shared_ptr& media); + void addMedia(const media::Media& media); + void removeMedia(const media::Media& media); void clear(); - - // Filtri - std::vector> filter(const media::Media& media) const; + + std::vector filter(const media::Media& media) const; + + const std::vector& getAll() const; + const std::vector& getByIndex(int idx) const; int serialize(QSaveFile& file) const; }; diff --git a/src/Memory/Serializer.h b/src/Memory/Serializer.h index 34b5fa9..47a9274 100644 --- a/src/Memory/Serializer.h +++ b/src/Memory/Serializer.h @@ -6,11 +6,11 @@ namespace memory { class Serializer { private: - static int vecToJSON(const std::vector> &, QSaveFile &); - static int vecToXML(const std::vector> &, QSaveFile &); + static int vecToJSON(const media::Media &, QSaveFile &); + static int vecToXML(const media::Media&, QSaveFile &); public: - static int Serialize(const std::vector> &, QSaveFile &); + static int Serialize(const std::vector&, QSaveFile &); }; } // namespace memory #endif From 4078e0fbb27833a1ba2d88d9e1fd4a9b41fd68c1 Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 21:26:08 +0200 Subject: [PATCH 02/11] Sistemato gli include giusti --- src/Memory/MediaContainer.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index e4fa4bf..df52479 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -5,13 +5,13 @@ #include #include -#include "Media.h" -#include "Novel.h" -#include "Album.h" -#include "Movie.h" -#include "Ebook.h" -#include "AudioBook.h" -#include "Series.h" +#include "../Media/Media.h" +#include "../Media/Novel.h" +#include "../Media/Album.h" +#include "../Media/Movie.h" +#include "../Media/Ebook.h" +#include "../Media/AudioBook.h" +#include "../Media/Series.h" #include "Serializer.h" namespace memory { From 869ef101ad6bacd871a289b424d537dbd1d3a643 Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 21:35:59 +0200 Subject: [PATCH 03/11] Corretto cosa filter Media --- src/Media/Media.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Media/Media.cpp b/src/Media/Media.cpp index 45e0f5d..33d81f8 100644 --- a/src/Media/Media.cpp +++ b/src/Media/Media.cpp @@ -32,24 +32,22 @@ bool Media::open() { } bool Media::filter(const Media& media) const { - bool match = true; - - // Title (substring, case-insensitive) + // Title (substring, case-insensitive) if (!getTitle().empty() && !stringContainsIgnoreCase(media.getTitle(), getTitle())) - match = false; + return false; // Release (confronto stretto) if (getRelease() != std::numeric_limits::min() && media.getRelease() != getRelease()) - match = false; + return false; // Language (substring, case-insensitive) if (!getLanguage().empty() && media.getLanguage() != getLanguage()) - match = false; + return false; // Favourite (confronto booleano) if (isFavourite() && media.isFavourite() != isFavourite()) - match = false; + return false; // Generi (match parziale case-insensitive su ogni genere richiesto) if (!getGenres().empty()) { @@ -63,13 +61,12 @@ bool Media::filter(const Media& media) const { } } if (!found) { - match = false; - break; + return false; } } } - return match; + return true; } From 79bc9d17e69880a7c724af5d3973f16c42eca49f Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 22:03:41 +0200 Subject: [PATCH 04/11] Solo per compilazione aggiunto {} metodi static --- src/Memory/Database.cpp | 52 ----------------------------------- src/Memory/Database.h | 26 ------------------ src/Memory/Deserializer.h | 6 ++-- src/Memory/MediaContainer.cpp | 25 +++++++++-------- src/Memory/MediaContainer.h | 2 +- src/Memory/Serializer.h | 7 +++-- src/main.cpp | 43 ----------------------------- 7 files changed, 22 insertions(+), 139 deletions(-) delete mode 100644 src/Memory/Database.cpp delete mode 100644 src/Memory/Database.h diff --git a/src/Memory/Database.cpp b/src/Memory/Database.cpp deleted file mode 100644 index 4744e0b..0000000 --- a/src/Memory/Database.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "Database.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); -} -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; - } - return 0; -} -int 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 0; -} - -int DataBase::save() { - // ritorna false in caso di fallimento - if (!file_.commit()) { - // errore in scrittura - return -1; - } - // riapri il file dopo averlo chiuso - // ritorna false in caso di fallimento - if (!file_.open(QIODevice::ReadOnly | QIODevice::Text)) { - return 1; - } - return 0; -} - -// qua possiamo volendo utilizzare riferimenti costanti al posto di puntatori -std::vector DataBase::filterMedia( - const media::Media *media_as_filter) { - return media_container_.filter(media_as_filter); -} - -} // namespace memory diff --git a/src/Memory/Database.h b/src/Memory/Database.h deleted file mode 100644 index d327857..0000000 --- a/src/Memory/Database.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MEMORY_DATABASE_H -#define MEMORY_DATABASE_H -#include - -#include "./MediaContainer.h" - -namespace memory { -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 *); -}; -} // namespace memory -#endif diff --git a/src/Memory/Deserializer.h b/src/Memory/Deserializer.h index d44d427..fb074c9 100644 --- a/src/Memory/Deserializer.h +++ b/src/Memory/Deserializer.h @@ -7,11 +7,11 @@ namespace memory { class Deserializer { private: - static std::vector>& XMLtoVec(const QFile &); - static std::vector>& JSONtoVec(const QFile &); + static std::vector>& XMLtoVec(const QFile &){} + static std::vector>& JSONtoVec(const QFile &){} public: - static std::vector>& deserialize(const QFile &); + static std::vector>& deserialize(const QFile &){} }; } // namespace memory #endif diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 151f720..16d046b 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -54,34 +54,37 @@ const std::vector& MediaContainer::getByIndex(int idx) const { return data_[idx]; } -const std::vector& MediaContainer::getByIndex(int idx) const { - return data_[idx]; -} - std::vector MediaContainer::getByGroupIndex(int idx) const { std::vector result; + auto appendGroup = [&](int groupIndex) { + for (const auto& media : data_[groupIndex]) { + result.push_back(&media); + } + }; + switch (idx) { case INDEX_NOVEL: - result.insert(result.end(), data_[INDEX_NOVEL].begin(), data_[INDEX_NOVEL].end()); - result.insert(result.end(), data_[INDEX_EBOOK].begin(), data_[INDEX_EBOOK].end()); - result.insert(result.end(), data_[INDEX_AUDIOBOOK].begin(), data_[INDEX_AUDIOBOOK].end()); + appendGroup(INDEX_NOVEL); + appendGroup(INDEX_EBOOK); + appendGroup(INDEX_AUDIOBOOK); break; case INDEX_MOVIE: - result.insert(result.end(), data_[INDEX_MOVIE].begin(), data_[INDEX_MOVIE].end()); - result.insert(result.end(), data_[INDEX_SERIES].begin(), data_[INDEX_SERIES].end()); + appendGroup(INDEX_MOVIE); + appendGroup(INDEX_SERIES); break; case INDEX_ALL: - result.insert(result.end(), data_[INDEX_ALL].begin(), data_[INDEX_ALL].end()); + appendGroup(INDEX_ALL); break; default: - result.insert(result.end(), data_[idx].begin(), data_[idx].end()); + appendGroup(idx); break; } return result; } + std::vector MediaContainer::filter(const media::Media& media) const { std::vector results; for (const media::Media* m : getByGroupIndex(detectIndex(media))) { diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index df52479..fa86bf0 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -30,7 +30,7 @@ class MediaContainer { std::array, TYPE_COUNT> data_; int detectIndex(const media::Media& media) const; - std::vector MediaContainer::getByGroupIndex(int idx) const; + std::vector getByGroupIndex(int idx) const; public: void addMedia(const media::Media& media); diff --git a/src/Memory/Serializer.h b/src/Memory/Serializer.h index 47a9274..40ea2bd 100644 --- a/src/Memory/Serializer.h +++ b/src/Memory/Serializer.h @@ -5,12 +5,13 @@ namespace memory { class Serializer { + private: - static int vecToJSON(const media::Media &, QSaveFile &); - static int vecToXML(const media::Media&, QSaveFile &); + static int vecToJSON(const media::Media &, QSaveFile &){} + static int vecToXML(const media::Media&, QSaveFile &){} public: - static int Serialize(const std::vector&, QSaveFile &); + static int Serialize(const std::vector&, QSaveFile &){} }; } // namespace memory #endif diff --git a/src/main.cpp b/src/main.cpp index 55a15bc..b8ec46d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,48 +5,5 @@ #include "Media/Media.h" // Include il tuo header int main() { - // Crea alcuni media - auto media1 = std::make_shared( - "House of Cards", - 2013, - "English", - true, - std::vector{"Drama", "Politics"} - ); - - auto media2 = std::make_shared( - "The Crown", - 2016, - "English", - false, - std::vector{"History", "Drama"} - ); - - auto media3 = std::make_shared( - "Breaking Bad", - 2008, - "English", - false, - std::vector{"Crime", "Thriller"} - ); - - // Inserisci i media in un vettore - std::vector> inputList = {media1, media2, media3}; - - // Crea un oggetto Media come filtro - auto filterMedia = std::make_shared( - "Ho", - std::numeric_limits::min() - ); - - // Filtra - std::vector> filtered = filterMedia->filter(inputList); - - //Stampa i risultati - std::cout << "Media che passano il filtro:\n"; - for (const auto& m : filtered) { - std::cout << "- " << m->getTitle() << "\n"; - } - return 0; } From a55646421d3905506efc57237c29632512a02c0a Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 22:35:28 +0200 Subject: [PATCH 05/11] Modfichi con indici --- src/Memory/MediaContainer.cpp | 4 ++++ src/Memory/MediaContainer.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 16d046b..461c66f 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -54,6 +54,10 @@ const std::vector& MediaContainer::getByIndex(int idx) const { return data_[idx]; } +const std::vector& MediaContainer::getByIndex(int idx) const { + return data_[idx]; +} + std::vector MediaContainer::getByGroupIndex(int idx) const { std::vector result; diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index fa86bf0..df52479 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -30,7 +30,7 @@ class MediaContainer { std::array, TYPE_COUNT> data_; int detectIndex(const media::Media& media) const; - std::vector getByGroupIndex(int idx) const; + std::vector MediaContainer::getByGroupIndex(int idx) const; public: void addMedia(const media::Media& media); From b58dc987428545c49c0dca34d71ec9e2a5c9e17b Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 22:41:27 +0200 Subject: [PATCH 06/11] Aggiunta classe Enum --- src/Memory/MediaContainer.cpp | 99 ++++++++++++++++++----------------- src/Memory/MediaContainer.h | 29 +++++----- src/main.cpp | 1 + 3 files changed, 68 insertions(+), 61 deletions(-) diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 461c66f..f00fddf 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -4,31 +4,35 @@ namespace memory { -void MediaContainer::addMedia(const media::Media& media) { - data_[INDEX_ALL].push_back(media); +void MediaContainer::addMedia(const media::Media& media) { + data_[static_cast(Type::All)].push_back(media); - if (detectIndex(media) == INDEX_ALL) { - return; // Media already exists in the container - } else { - data_[detectIndex(media)].push_back(media); + Type t = detectType(media); + if (t != Type::All) { + data_[static_cast(t)].push_back(media); } } -int MediaContainer::detectIndex(const media::Media& media) const { +MediaContainer::Type MediaContainer::detectType(const media::Media& media) const { if (dynamic_cast(&media)) { - return INDEX_SERIES; - } else if (dynamic_cast(&media)) { - return INDEX_AUDIOBOOK; - } else if (dynamic_cast(&media)) { - return INDEX_EBOOK; - } else if (dynamic_cast(&media)) { - return INDEX_MOVIE; - } else if (dynamic_cast(&media)) { - return INDEX_ALBUM; - } else if (dynamic_cast(&media)) { - return INDEX_NOVEL; + return Type::Series; } - return INDEX_ALL; // Default case + if (dynamic_cast(&media)) { + return Type::AudioBook; + } + if (dynamic_cast(&media)) { + return Type::Ebook; + } + if (dynamic_cast(&media)) { + return Type::Movie; + } + if (dynamic_cast(&media)) { + return Type::Album; + } + if (dynamic_cast(&media)) { + return Type::Novel; + } + return Type::All; } void MediaContainer::removeMedia(const media::Media& media) { @@ -47,51 +51,50 @@ void MediaContainer::clear() { } const std::vector& MediaContainer::getAll() const { - return data_[INDEX_ALL]; -} - -const std::vector& MediaContainer::getByIndex(int idx) const { - return data_[idx]; + return data_[static_cast(Type::All)]; } -const std::vector& MediaContainer::getByIndex(int idx) const { - return data_[idx]; +const std::vector& MediaContainer::getByType(Type type) const { + return data_[static_cast(type)]; } -std::vector MediaContainer::getByGroupIndex(int idx) const { +std::vector MediaContainer::getByGroup(Type type) const { std::vector result; - auto appendGroup = [&](int groupIndex) { - for (const auto& media : data_[groupIndex]) { + auto appendGroup = [&](Type t) { + for (const auto& media : data_[static_cast(t)]) { result.push_back(&media); } }; - switch (idx) { - case INDEX_NOVEL: - appendGroup(INDEX_NOVEL); - appendGroup(INDEX_EBOOK); - appendGroup(INDEX_AUDIOBOOK); - break; - case INDEX_MOVIE: - appendGroup(INDEX_MOVIE); - appendGroup(INDEX_SERIES); - break; - case INDEX_ALL: - appendGroup(INDEX_ALL); - break; - default: - appendGroup(idx); - break; + switch (type) { + case Type::Novel: + appendGroup(Type::Novel); + appendGroup(Type::Ebook); + appendGroup(Type::AudioBook); + break; + + case Type::Movie: + appendGroup(Type::Movie); + appendGroup(Type::Series); + break; + + case Type::All: + appendGroup(Type::All); + break; + + default: + appendGroup(type); + break; } return result; } - std::vector MediaContainer::filter(const media::Media& media) const { std::vector results; - for (const media::Media* m : getByGroupIndex(detectIndex(media))) { + Type t = detectType(media); + for (const media::Media* m : getByGroup(t)) { if (media.filter(*m)) { results.push_back(m); } @@ -100,7 +103,7 @@ std::vector MediaContainer::filter(const media::Media& medi } int MediaContainer::serialize(QSaveFile& file) const { - return Serializer::Serialize(data_[INDEX_ALL], file); + return Serializer::Serialize(data_[static_cast(Type::All)], file); } } // namespace memory diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index df52479..badbe26 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -17,20 +17,23 @@ namespace memory { class MediaContainer { -private: - static constexpr int INDEX_ALL = 0; - static constexpr int INDEX_NOVEL = 1; - static constexpr int INDEX_ALBUM = 2; - static constexpr int INDEX_MOVIE = 3; - static constexpr int INDEX_EBOOK = 4; - static constexpr int INDEX_AUDIOBOOK = 5; - static constexpr int INDEX_SERIES = 6; - static constexpr int TYPE_COUNT = 7; +public: + enum class Type { + All = 0, + Novel, + Album, + Movie, + Ebook, + AudioBook, + Series, + TypeCount + }; - std::array, TYPE_COUNT> data_; +private: + std::array, static_cast(Type::TypeCount)> data_; - int detectIndex(const media::Media& media) const; - std::vector MediaContainer::getByGroupIndex(int idx) const; + Type detectType(const media::Media& media) const; + std::vector getByGroup(Type type) const; public: void addMedia(const media::Media& media); @@ -40,7 +43,7 @@ class MediaContainer { std::vector filter(const media::Media& media) const; const std::vector& getAll() const; - const std::vector& getByIndex(int idx) const; + const std::vector& getByType(Type type) const; int serialize(QSaveFile& file) const; }; diff --git a/src/main.cpp b/src/main.cpp index b8ec46d..4a96007 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,5 +5,6 @@ #include "Media/Media.h" // Include il tuo header int main() { + std::cout << "Aggiornato" << std::endl; return 0; } From c6ecd1a729ab9762e4bb028bc2a35374699daf05 Mon Sep 17 00:00:00 2001 From: Steva0 Date: Tue, 20 May 2025 22:45:21 +0200 Subject: [PATCH 07/11] Aggiornato in privato --- src/Memory/MediaContainer.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index badbe26..620176a 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -17,7 +17,7 @@ namespace memory { class MediaContainer { -public: +private: enum class Type { All = 0, Novel, @@ -29,12 +29,12 @@ class MediaContainer { TypeCount }; -private: std::array, static_cast(Type::TypeCount)> data_; Type detectType(const media::Media& media) const; + const std::vector& getByType(Type type) const; std::vector getByGroup(Type type) const; - + public: void addMedia(const media::Media& media); void removeMedia(const media::Media& media); @@ -43,7 +43,6 @@ class MediaContainer { std::vector filter(const media::Media& media) const; const std::vector& getAll() const; - const std::vector& getByType(Type type) const; int serialize(QSaveFile& file) const; }; From 1bfe4a8912214a4f5d392e40938f651bcee1f98b Mon Sep 17 00:00:00 2001 From: Steva0 Date: Wed, 21 May 2025 12:19:26 +0200 Subject: [PATCH 08/11] Modifica firma metodo --- src/Memory/MediaContainer.cpp | 9 +++++++-- src/Memory/MediaContainer.h | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index f00fddf..97eaadc 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -54,10 +54,15 @@ const std::vector& MediaContainer::getAll() const { return data_[static_cast(Type::All)]; } -const std::vector& MediaContainer::getByType(Type type) const { - return data_[static_cast(type)]; +std::vector MediaContainer::getByType(Type type) const { + std::vector result; + for (const auto& media : data_[static_cast(type)]) { + result.push_back(&media); + } + return result; } + std::vector MediaContainer::getByGroup(Type type) const { std::vector result; diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index 620176a..9fb85f4 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -32,7 +32,7 @@ class MediaContainer { std::array, static_cast(Type::TypeCount)> data_; Type detectType(const media::Media& media) const; - const std::vector& getByType(Type type) const; + std::vector getByType(Type type) const; std::vector getByGroup(Type type) const; public: From 8b3c51353625d4df5e75d9c78433c6a4d43c4b91 Mon Sep 17 00:00:00 2001 From: Steva0 Date: Wed, 21 May 2025 12:22:54 +0200 Subject: [PATCH 09/11] tolti size_t messi int --- src/Memory/MediaContainer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 97eaadc..53ca87d 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -51,12 +51,12 @@ void MediaContainer::clear() { } const std::vector& MediaContainer::getAll() const { - return data_[static_cast(Type::All)]; + return data_[static_cast(Type::All)]; } std::vector MediaContainer::getByType(Type type) const { std::vector result; - for (const auto& media : data_[static_cast(type)]) { + for (const auto& media : data_[static_cast(type)]) { result.push_back(&media); } return result; @@ -67,7 +67,7 @@ std::vector MediaContainer::getByGroup(Type type) const { std::vector result; auto appendGroup = [&](Type t) { - for (const auto& media : data_[static_cast(t)]) { + for (const auto& media : data_[static_cast(t)]) { result.push_back(&media); } }; From 68f2f1e9c8540332648f0026ea213e0af014666b Mon Sep 17 00:00:00 2001 From: Steva0 Date: Wed, 21 May 2025 12:43:51 +0200 Subject: [PATCH 10/11] Aggiunto metodo clone e tolto slicing --- src/Media/Album.cpp | 5 ++ src/Media/Album.h | 2 + src/Media/AudioBook.cpp | 4 ++ src/Media/AudioBook.h | 2 + src/Media/Ebook.cpp | 4 ++ src/Media/Ebook.h | 2 + src/Media/IMedia.h | 1 + src/Media/Media.cpp | 5 ++ src/Media/Media.h | 3 ++ src/Media/Movie.cpp | 5 ++ src/Media/Movie.h | 2 + src/Media/Novel.cpp | 4 ++ src/Media/Novel.h | 2 + src/Media/Series.cpp | 5 ++ src/Media/Series.h | 2 + src/Memory/MediaContainer.cpp | 90 ++++++++++++++++------------------- src/Memory/MediaContainer.h | 8 ++-- src/Memory/Serializer.h | 2 +- 18 files changed, 95 insertions(+), 53 deletions(-) diff --git a/src/Media/Album.cpp b/src/Media/Album.cpp index ec5da60..ef163d7 100644 --- a/src/Media/Album.cpp +++ b/src/Media/Album.cpp @@ -26,6 +26,11 @@ bool Album::operator==(const Media &other) const { return false; } +std::unique_ptr Album::clone() const { + return std::make_unique(*this); +} + + bool Album::filter(const Media& album) const { // Riutilizzo filtro base di Media if (!Media::filter(album)) diff --git a/src/Media/Album.h b/src/Media/Album.h index ca30cd3..6efe82a 100644 --- a/src/Media/Album.h +++ b/src/Media/Album.h @@ -20,6 +20,8 @@ class Album : public Media { const std::vector &getSongs() const; bool operator==(const Media &other) const override; + std::unique_ptr clone() const override; + bool filter(const Media& album) const override; }; diff --git a/src/Media/AudioBook.cpp b/src/Media/AudioBook.cpp index 51ba54f..f9d91f8 100644 --- a/src/Media/AudioBook.cpp +++ b/src/Media/AudioBook.cpp @@ -21,6 +21,10 @@ bool AudioBook::operator==(const Media& other) const { return false; } +std::unique_ptr AudioBook::clone() const { + return std::make_unique(*this); +} + std::string AudioBook::getNarrator() const { return narrator_; } diff --git a/src/Media/AudioBook.h b/src/Media/AudioBook.h index e383e0c..2012e99 100644 --- a/src/Media/AudioBook.h +++ b/src/Media/AudioBook.h @@ -26,6 +26,8 @@ class AudioBook : public Novel { void setNarrator(const std::string& narrator); void setStreamingService(const std::string& service); + std::unique_ptr clone() const override; + bool filter(const Media& audiobook) const override; }; diff --git a/src/Media/Ebook.cpp b/src/Media/Ebook.cpp index d75ddc5..cb4d562 100644 --- a/src/Media/Ebook.cpp +++ b/src/Media/Ebook.cpp @@ -36,6 +36,10 @@ void Ebook::setDrm(bool drm) { drm_ = drm; } +std::unique_ptr Ebook::clone() const { + return std::make_unique(*this); +} + bool Ebook::filter(const Media& input) const { // Riutilizzo filtro base di Novel if (!Novel::filter(input)) diff --git a/src/Media/Ebook.h b/src/Media/Ebook.h index 1c8dc01..e277746 100644 --- a/src/Media/Ebook.h +++ b/src/Media/Ebook.h @@ -25,6 +25,8 @@ class Ebook : public Novel { void setFileSizeBytes(unsigned int size); void setDrm(bool drm); + std::unique_ptr clone() const override; + bool filter(const Media& ebook) const override; }; diff --git a/src/Media/IMedia.h b/src/Media/IMedia.h index d2ffa8b..677381b 100644 --- a/src/Media/IMedia.h +++ b/src/Media/IMedia.h @@ -8,6 +8,7 @@ namespace media { class IMedia { virtual void accept(IConstMediaVisitor &) const = 0; virtual bool open() = 0; + virtual std::unique_ptr clone() const = 0; }; } diff --git a/src/Media/Media.cpp b/src/Media/Media.cpp index 33d81f8..3e7b8dc 100644 --- a/src/Media/Media.cpp +++ b/src/Media/Media.cpp @@ -18,6 +18,11 @@ Media::Media(const std::string &title, int release, const std::string &language, void Media::accept(IConstMediaVisitor &v) const {} +std::unique_ptr media::Media::clone() const { + return std::make_unique(*this); +} + + bool Media::operator==(const Media &other) const { return title_ == other.title_ && release_ == other.release_ && language_ == other.language_ && favourite_ == other.favourite_ && diff --git a/src/Media/Media.h b/src/Media/Media.h index 621efd5..7d607c4 100644 --- a/src/Media/Media.h +++ b/src/Media/Media.h @@ -44,6 +44,9 @@ class Media : IMedia{ const std::string &getImgPath() const; const std::string &getNotes() const; + virtual std::unique_ptr clone() const; + + virtual bool filter(const Media &media) const; }; } // namespace media diff --git a/src/Media/Movie.cpp b/src/Media/Movie.cpp index 82f541b..59652ab 100644 --- a/src/Media/Movie.cpp +++ b/src/Media/Movie.cpp @@ -18,6 +18,11 @@ bool Movie::operator==(const Media &other) const { } return false; } + +std::unique_ptr Movie::clone() const { + return std::make_unique(*this); +} + const std::vector &Movie::getCast() const { return cast_; } unsigned int Movie::getLength() const { return length_; } const std::string &Movie::getUniverse() const { return universe_; } diff --git a/src/Media/Movie.h b/src/Media/Movie.h index 2d96c7a..19a50d7 100644 --- a/src/Media/Movie.h +++ b/src/Media/Movie.h @@ -24,6 +24,8 @@ class Movie : public Media { unsigned int getLength() const; const std::string &getUniverse() const; + std::unique_ptr clone() const override; + bool filter(const Media& movie) const override; }; } // namespace media diff --git a/src/Media/Novel.cpp b/src/Media/Novel.cpp index 3368c4e..361585c 100644 --- a/src/Media/Novel.cpp +++ b/src/Media/Novel.cpp @@ -19,6 +19,10 @@ bool Novel::operator==(const Media& other) const { return false; } +std::unique_ptr Novel::clone() const { + return std::make_unique(*this); +} + // Getters std::string Novel::getAuthor() const { return author_; } std::string Novel::getPublisher() const { return publisher_; } diff --git a/src/Media/Novel.h b/src/Media/Novel.h index edab6b5..6fa0ad5 100644 --- a/src/Media/Novel.h +++ b/src/Media/Novel.h @@ -35,6 +35,8 @@ class Novel : public Media { void setSeries(const std::string& series); void setIsbn(const std::string& isbn); + std::unique_ptr clone() const override; + bool filter(const Media &novel) const override; }; diff --git a/src/Media/Series.cpp b/src/Media/Series.cpp index d9cdcac..f0fa1a9 100644 --- a/src/Media/Series.cpp +++ b/src/Media/Series.cpp @@ -21,6 +21,11 @@ bool Series::operator==(const Media &other) const { } return false; } + +std::unique_ptr Series::clone() const { + return std::make_unique(*this); +} + unsigned int Series::getEpisodes() const { return episodes_; } unsigned int Series::getSeasons() const { return seasons_; } bool Series::isEnded() const { return ended_; } diff --git a/src/Media/Series.h b/src/Media/Series.h index fedbda6..73fa611 100644 --- a/src/Media/Series.h +++ b/src/Media/Series.h @@ -20,6 +20,8 @@ class Series : public Movie { unsigned int getEpisodes() const; unsigned int getSeasons() const; bool isEnded() const; + + std::unique_ptr clone() const override; bool filter(const Media& input) const override; }; diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 53ca87d..41ac200 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -5,41 +5,33 @@ namespace memory { void MediaContainer::addMedia(const media::Media& media) { - data_[static_cast(Type::All)].push_back(media); + std::unique_ptr clone = media.clone(); + Type t = detectType(*clone); - Type t = detectType(media); + // Inserisci nel contenitore "All" + data_[static_cast(Type::All)].push_back(media.clone()); + + // Inserisci anche nel tipo specifico if (t != Type::All) { - data_[static_cast(t)].push_back(media); + data_[static_cast(t)].push_back(std::move(clone)); } } MediaContainer::Type MediaContainer::detectType(const media::Media& media) const { - if (dynamic_cast(&media)) { - return Type::Series; - } - if (dynamic_cast(&media)) { - return Type::AudioBook; - } - if (dynamic_cast(&media)) { - return Type::Ebook; - } - if (dynamic_cast(&media)) { - return Type::Movie; - } - if (dynamic_cast(&media)) { - return Type::Album; - } - if (dynamic_cast(&media)) { - return Type::Novel; - } + if (dynamic_cast(&media)) return Type::Series; + if (dynamic_cast(&media)) return Type::AudioBook; + if (dynamic_cast(&media)) return Type::Ebook; + if (dynamic_cast(&media)) return Type::Movie; + if (dynamic_cast(&media)) return Type::Album; + if (dynamic_cast(&media)) return Type::Novel; return Type::All; } void MediaContainer::removeMedia(const media::Media& media) { for (auto& vec : data_) { vec.erase(std::remove_if(vec.begin(), vec.end(), - [&](const media::Media& m) { - return typeid(m) == typeid(media) && m == media; + [&](const std::unique_ptr& m) { + return typeid(*m) == typeid(media) && *m == media; }), vec.end()); } } @@ -50,47 +42,43 @@ void MediaContainer::clear() { } } -const std::vector& MediaContainer::getAll() const { - return data_[static_cast(Type::All)]; +std::vector MediaContainer::getAll() const { + return getByType(Type::All); } std::vector MediaContainer::getByType(Type type) const { std::vector result; - for (const auto& media : data_[static_cast(type)]) { - result.push_back(&media); + for (const auto& ptr : data_[static_cast(type)]) { + result.push_back(ptr.get()); } return result; } - std::vector MediaContainer::getByGroup(Type type) const { std::vector result; auto appendGroup = [&](Type t) { - for (const auto& media : data_[static_cast(t)]) { - result.push_back(&media); + for (const auto& ptr : data_[static_cast(t)]) { + result.push_back(ptr.get()); } }; switch (type) { - case Type::Novel: - appendGroup(Type::Novel); - appendGroup(Type::Ebook); - appendGroup(Type::AudioBook); - break; - - case Type::Movie: - appendGroup(Type::Movie); - appendGroup(Type::Series); - break; - - case Type::All: - appendGroup(Type::All); - break; - - default: - appendGroup(type); - break; + case Type::Novel: + appendGroup(Type::Novel); + appendGroup(Type::Ebook); + appendGroup(Type::AudioBook); + break; + case Type::Movie: + appendGroup(Type::Movie); + appendGroup(Type::Series); + break; + case Type::All: + appendGroup(Type::All); + break; + default: + appendGroup(type); + break; } return result; @@ -108,7 +96,11 @@ std::vector MediaContainer::filter(const media::Media& medi } int MediaContainer::serialize(QSaveFile& file) const { - return Serializer::Serialize(data_[static_cast(Type::All)], file); + std::vector rawAll; + for (const auto& ptr : data_[static_cast(Type::All)]) { + rawAll.push_back(ptr.get()); + } + return Serializer::Serialize(rawAll, file); } } // namespace memory diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index 9fb85f4..80aee54 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -3,6 +3,7 @@ #include #include +#include #include #include "../Media/Media.h" @@ -29,12 +30,13 @@ class MediaContainer { TypeCount }; - std::array, static_cast(Type::TypeCount)> data_; + std::array>, static_cast(Type::TypeCount)> data_; Type detectType(const media::Media& media) const; + std::vector getByType(Type type) const; std::vector getByGroup(Type type) const; - + public: void addMedia(const media::Media& media); void removeMedia(const media::Media& media); @@ -42,7 +44,7 @@ class MediaContainer { std::vector filter(const media::Media& media) const; - const std::vector& getAll() const; + std::vector getAll() const; int serialize(QSaveFile& file) const; }; diff --git a/src/Memory/Serializer.h b/src/Memory/Serializer.h index 40ea2bd..cecc7d7 100644 --- a/src/Memory/Serializer.h +++ b/src/Memory/Serializer.h @@ -11,7 +11,7 @@ class Serializer { static int vecToXML(const media::Media&, QSaveFile &){} public: - static int Serialize(const std::vector&, QSaveFile &){} + static int Serialize(std::vector, QSaveFile &){} }; } // namespace memory #endif From d7f1916e661dc91b863d869edabc40f97fa77a9e Mon Sep 17 00:00:00 2001 From: Steva0 Date: Wed, 21 May 2025 12:59:03 +0200 Subject: [PATCH 11/11] Tolto doppio clone in add MEdia --- src/Memory/MediaContainer.cpp | 18 ++++++++++-------- src/Memory/MediaContainer.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Memory/MediaContainer.cpp b/src/Memory/MediaContainer.cpp index 41ac200..1cff655 100644 --- a/src/Memory/MediaContainer.cpp +++ b/src/Memory/MediaContainer.cpp @@ -6,17 +6,19 @@ namespace memory { void MediaContainer::addMedia(const media::Media& media) { std::unique_ptr clone = media.clone(); - Type t = detectType(*clone); + media::Media* rawPtr = clone.get(); - // Inserisci nel contenitore "All" - data_[static_cast(Type::All)].push_back(media.clone()); + // Inserisce rawPtr nel vettore "All" copiando il puntatore (non l’oggetto!) + data_[static_cast(Type::All)].push_back(std::unique_ptr(clone->clone())); - // Inserisci anche nel tipo specifico + // Inserisco anche nel tipo specifico + Type t = detectType(*clone); if (t != Type::All) { - data_[static_cast(t)].push_back(std::move(clone)); + data_[static_cast(t)].push_back(std::move(clone)); } } + MediaContainer::Type MediaContainer::detectType(const media::Media& media) const { if (dynamic_cast(&media)) return Type::Series; if (dynamic_cast(&media)) return Type::AudioBook; @@ -48,7 +50,7 @@ std::vector MediaContainer::getAll() const { std::vector MediaContainer::getByType(Type type) const { std::vector result; - for (const auto& ptr : data_[static_cast(type)]) { + for (const auto& ptr : data_[static_cast(type)]) { result.push_back(ptr.get()); } return result; @@ -58,7 +60,7 @@ std::vector MediaContainer::getByGroup(Type type) const { std::vector result; auto appendGroup = [&](Type t) { - for (const auto& ptr : data_[static_cast(t)]) { + for (const auto& ptr : data_[static_cast(t)]) { result.push_back(ptr.get()); } }; @@ -97,7 +99,7 @@ std::vector MediaContainer::filter(const media::Media& medi int MediaContainer::serialize(QSaveFile& file) const { std::vector rawAll; - for (const auto& ptr : data_[static_cast(Type::All)]) { + for (const auto& ptr : data_[static_cast(Type::All)]) { rawAll.push_back(ptr.get()); } return Serializer::Serialize(rawAll, file); diff --git a/src/Memory/MediaContainer.h b/src/Memory/MediaContainer.h index 80aee54..7b26273 100644 --- a/src/Memory/MediaContainer.h +++ b/src/Memory/MediaContainer.h @@ -30,7 +30,7 @@ class MediaContainer { TypeCount }; - std::array>, static_cast(Type::TypeCount)> data_; + std::array>, static_cast(Type::TypeCount)> data_; Type detectType(const media::Media& media) const;