Бібліотечна система
Бібліотечна система для управління книгами
Завантаження...
Пошук...
Нічого не знайдено
Storage.hpp
Див. документацію.
1// SPDX-License-Identifier: Proprietary
2// Copyright © 2025 Oleksandr Dreval. All rights reserved.
3
9#ifndef STORAGE_HPP
10#define STORAGE_HPP
11
12#include <algorithm>
13#include <memory>
14#include <string>
15#include <string_view>
16#include <unordered_map>
17#include <vector>
18
19#include "Book.hpp"
20#include "SearchUtility.hpp"
21
32class Storage {
33private:
34 // clang-format off
35 std::vector<std::unique_ptr<Book>> m_books;
36 struct StringHash {
37 using is_transparent = void;
38 size_t operator()(std::string_view str) const {
39 return std::hash<std::string_view> {}(str);
40 }
41 };
42 std::unordered_map<std::string, size_t, StringHash, std::equal_to<>>
43 m_bookIndex;
44 // clang-format on
45
51 void updateBookIds() noexcept;
52
58 bool processBookJson(const nlohmann::json& bookJson);
59
60public:
65 Storage() noexcept;
66
72
79 bool addBook(std::unique_ptr<Book> book);
80
86 void removeBook(std::string_view title);
87
94 Book* findBook(std::string_view title) const;
95
102 const Book* findBookIndexed(std::string_view title) const;
103
110 bool saveToFile(const std::string& filename) const;
111
119 bool loadFromFile(const std::string& filename);
120
125 const std::vector<std::unique_ptr<Book>>& getBooks() const noexcept { return m_books; }
126
134 bool loadBooksFromJson(const std::string& filename);
135
141 void setBestBookForAuthor(const std::string& authorName, const std::string& bookTitle) const;
142
149 template<typename Comparator>
150 void mergeSortBooks(Comparator comp) {
151 if(m_books.empty()) {
152 return;
153 }
154
155 size_t n = m_books.size();
156 std::vector<std::unique_ptr<Book>> workArray(n);
157
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);
161 }
162 m_books.swap(workArray);
163 }
164
165 updateBookIds();
166 }
167
172 void sortByTitle();
173
178 void sortByNumPages();
179
184 void sortByYearPublished();
185
186private:
195 template<typename Comparator>
196 void mergeSortHelper(
197 std::vector<std::unique_ptr<Book>>& books,
198 size_t left,
199 size_t right,
200 Comparator comp);
201
211 template<typename Comparator>
212 void merge(
213 std::vector<std::unique_ptr<Book>>& books,
214 size_t left,
215 size_t mid,
216 size_t right,
217 Comparator comp) const;
218
228 template<typename Comparator>
229 void mergeSubarrays(
230 size_t leftStart,
231 size_t size,
232 size_t n,
233 std::vector<std::unique_ptr<Book>>& workArray,
234 Comparator comp);
235};
236
246template<typename Comparator>
247void Storage::mergeSortHelper(
248 std::vector<std::unique_ptr<Book>>& books,
249 size_t left,
250 size_t right,
251 Comparator comp) {
252 if(left >= right) {
253 return;
254 }
255
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);
260}
261
272template<typename Comparator>
273void Storage::merge(
274 std::vector<std::unique_ptr<Book>>& books,
275 size_t left,
276 size_t mid,
277 size_t right,
278 Comparator comp) const {
279 size_t n1 = mid - left + 1;
280 size_t n2 = right - mid;
281
282 std::vector<std::unique_ptr<Book>> L(n1);
283 std::vector<std::unique_ptr<Book>> R(n2);
284
285 for(size_t i = 0; i < n1; i++) {
286 L[i] = std::move(books[left + i]);
287 }
288 for(size_t j = 0; j < n2; j++) {
289 R[j] = std::move(books[mid + 1 + j]);
290 }
291
292 size_t i = 0;
293 size_t j = 0;
294 size_t k = left;
295
296 while(i < n1 && j < n2) {
297 if(comp(*L[i], *R[j])) {
298 books[k] = std::move(L[i]);
299 i++;
300 } else {
301 books[k] = std::move(R[j]);
302 j++;
303 }
304 k++;
305 }
306
307 while(i < n1) {
308 books[k] = std::move(L[i]);
309 i++;
310 k++;
311 }
312
313 while(j < n2) {
314 books[k] = std::move(R[j]);
315 j++;
316 k++;
317 }
318}
319
320template<typename Comparator>
321void Storage::mergeSubarrays(
322 size_t leftStart,
323 size_t size,
324 size_t n,
325 std::vector<std::unique_ptr<Book>>& workArray,
326 Comparator comp) {
327 size_t mid = std::min(leftStart + size, n);
328 size_t rightEnd = std::min(leftStart + 2 * size, n);
329
330 size_t i = leftStart;
331 size_t j = mid;
332 size_t k = leftStart;
333
334 while(i < mid && j < rightEnd) {
335 if(comp(m_books[i], m_books[j])) {
336 workArray[k] = std::move(m_books[i]);
337 k++;
338 i++;
339 } else {
340 workArray[k] = std::move(m_books[j]);
341 k++;
342 j++;
343 }
344 }
345
346 while(i < mid) {
347 workArray[k] = std::move(m_books[i]);
348 k++;
349 i++;
350 }
351
352 while(j < rightEnd) {
353 workArray[k] = std::move(m_books[j]);
354 k++;
355 j++;
356 }
357}
358
359#endif // STORAGE_HPP
Визначення класу 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