16#include <unordered_map>
35 std::vector<std::unique_ptr<Book>> m_books;
37 using is_transparent = void;
38 size_t operator()(std::string_view str)
const {
39 return std::hash<std::string_view> {}(str);
42 std::unordered_map<std::string, size_t, StringHash, std::equal_to<>>
51 void updateBookIds()
noexcept;
58 bool processBookJson(
const nlohmann::json& bookJson);
110 bool saveToFile(const std::
string& filename) const;
149 template<
typename Comparator>
156 std::vector<std::unique_ptr<Book>> workArray(n);
158 for(
size_t size = 1; size < n; size *= 2) {
159 for(
size_t leftStart = 0; leftStart < n; leftStart += 2 * size) {
160 mergeSubarrays(leftStart, size, n, workArray, comp);
195 template<
typename Comparator>
196 void mergeSortHelper(
197 std::vector<std::unique_ptr<Book>>& books,
211 template<
typename Comparator>
213 std::vector<std::unique_ptr<Book>>& books,
217 Comparator comp)
const;
228 template<
typename Comparator>
233 std::vector<std::unique_ptr<Book>>& workArray,
246template<
typename Comparator>
247void Storage::mergeSortHelper(
248 std::vector<std::unique_ptr<Book>>& books,
256 size_t mid = std::midpoint(left, right);
257 mergeSortHelper(books, left, mid, comp);
258 mergeSortHelper(books, mid + 1, right, comp);
259 merge(books, left, mid, right, comp);
272template<
typename Comparator>
274 std::vector<std::unique_ptr<Book>>& books,
278 Comparator comp)
const {
279 size_t n1 = mid - left + 1;
280 size_t n2 = right - mid;
282 std::vector<std::unique_ptr<Book>> L(n1);
283 std::vector<std::unique_ptr<Book>> R(n2);
285 for(
size_t i = 0; i < n1; i++) {
286 L[i] = std::move(books[left + i]);
288 for(
size_t j = 0; j < n2; j++) {
289 R[j] = std::move(books[mid + 1 + j]);
296 while(i < n1 && j < n2) {
297 if(comp(*L[i], *R[j])) {
298 books[k] = std::move(L[i]);
301 books[k] = std::move(R[j]);
308 books[k] = std::move(L[i]);
314 books[k] = std::move(R[j]);
320template<
typename Comparator>
321void Storage::mergeSubarrays(
325 std::vector<std::unique_ptr<Book>>& workArray,
327 size_t mid = std::min(leftStart + size, n);
328 size_t rightEnd = std::min(leftStart + 2 * size, n);
330 size_t i = leftStart;
332 size_t k = leftStart;
334 while(i < mid && j < rightEnd) {
335 if(comp(m_books[i], m_books[j])) {
336 workArray[k] = std::move(m_books[i]);
340 workArray[k] = std::move(m_books[j]);
347 workArray[k] = std::move(m_books[i]);
352 while(j < rightEnd) {
353 workArray[k] = std::move(m_books[j]);
Визначення класу Book для роботи з даними книг у бібліотечній системі
Заголовочний файл з шаблонними утилітами для пошуку в колекціях
const std::vector< Book > m_books
Вектор книг для зберігання результатів завантаження
Definition Utils.hpp:49
Клас, що представляє книгу в бібліотечній системі
Definition Book.hpp:46
Клас, що реалізує центральне сховище даних про книги
Definition Storage.hpp:32
const Book * findBookIndexed(std::string_view title) const
Здійснює індексований пошук книги за назвою
Definition Storage.cpp:303
Book * findBook(std::string_view title) const
Здійснює лінійний пошук книги за назвою
Definition Storage.cpp:84
void removeBook(std::string_view title)
Видаляє книгу зі сховища за назвою
Definition Storage.cpp:266
void sortByYearPublished()
Сортує книги за роком видання.
Definition Storage.cpp:361
void sortByTitle()
Сортує книги за назвою.
Definition Storage.cpp:333
void sortByNumPages()
Сортує книги за кількістю сторінок.
Definition Storage.cpp:347
bool loadBooksFromJson(const std::string &filename)
Завантажує книги з JSON файлу бази даних
Definition Storage.cpp:256
const std::vector< std::unique_ptr< Book > > & getBooks() const noexcept
Повертає посилання на колекцію книг
Definition Storage.hpp:125
Storage() noexcept
Конструктор за замовчуванням
void setBestBookForAuthor(const std::string &authorName, const std::string &bookTitle) const
Установлює кращу книгу для автора
Definition Storage.cpp:288
bool saveToFile(const std::string &filename) const
Зберігає колекцію книг у JSON файл
Definition Storage.cpp:114
void mergeSortBooks(Comparator comp)
Сортує книги за допомогою алгоритму Merge Sort.
Definition Storage.hpp:150
bool addBook(std::unique_ptr< Book > book)
Додає нову книгу до сховища
Definition Storage.cpp:46
bool loadFromFile(const std::string &filename)
Завантажує колекцію книг з JSON файлу
Definition Storage.cpp:201