const-correct kiwix::Library

- Made most methods of kiwix::Library const.
- Also added const versions of getBookById() and getBookByPath()
  methods.
This commit is contained in:
Veloman Yunkan 2021-04-28 11:41:05 +04:00
parent 7336dcab1d
commit 3879b82112
4 changed files with 49 additions and 35 deletions

View File

@ -193,7 +193,9 @@ class Library
*/ */
bool removeBookmark(const std::string& zimId, const std::string& url); bool removeBookmark(const std::string& zimId, const std::string& url);
const Book& getBookById(const std::string& id) const;
Book& getBookById(const std::string& id); Book& getBookById(const std::string& id);
const Book& getBookByPath(const std::string& path) const;
Book& getBookByPath(const std::string& path); Book& getBookByPath(const std::string& path);
std::shared_ptr<Reader> getReaderById(const std::string& id); std::shared_ptr<Reader> getReaderById(const std::string& id);
@ -211,7 +213,7 @@ class Library
* @param path the path of the file to write to. * @param path the path of the file to write to.
* @return True if the library has been correctly saved. * @return True if the library has been correctly saved.
*/ */
bool writeToFile(const std::string& path); bool writeToFile(const std::string& path) const;
/** /**
* Write the library bookmarks to a file. * Write the library bookmarks to a file.
@ -219,7 +221,7 @@ class Library
* @param path the path of the file to write to. * @param path the path of the file to write to.
* @return True if the library has been correctly saved. * @return True if the library has been correctly saved.
*/ */
bool writeBookmarksToFile(const std::string& path); bool writeBookmarksToFile(const std::string& path) const;
/** /**
* Get the number of book in the library. * Get the number of book in the library.
@ -228,42 +230,42 @@ class Library
* @param remoteBooks If we must count remote books (books with an url) * @param remoteBooks If we must count remote books (books with an url)
* @return The number of books. * @return The number of books.
*/ */
unsigned int getBookCount(const bool localBooks, const bool remoteBooks); unsigned int getBookCount(const bool localBooks, const bool remoteBooks) const;
/** /**
* Get all langagues of the books in the library. * Get all langagues of the books in the library.
* *
* @return A list of languages. * @return A list of languages.
*/ */
std::vector<std::string> getBooksLanguages(); std::vector<std::string> getBooksLanguages() const;
/** /**
* Get all book creators of the books in the library. * Get all book creators of the books in the library.
* *
* @return A list of book creators. * @return A list of book creators.
*/ */
std::vector<std::string> getBooksCreators(); std::vector<std::string> getBooksCreators() const;
/** /**
* Get all book publishers of the books in the library. * Get all book publishers of the books in the library.
* *
* @return A list of book publishers. * @return A list of book publishers.
*/ */
std::vector<std::string> getBooksPublishers(); std::vector<std::string> getBooksPublishers() const;
/** /**
* Get all bookmarks. * Get all bookmarks.
* *
* @return A list of bookmarks * @return A list of bookmarks
*/ */
const std::vector<kiwix::Bookmark> getBookmarks(bool onlyValidBookmarks = true); const std::vector<kiwix::Bookmark> getBookmarks(bool onlyValidBookmarks = true) const;
/** /**
* Get all book ids of the books in the library. * Get all book ids of the books in the library.
* *
* @return A list of book ids. * @return A list of book ids.
*/ */
BookIdCollection getBooksIds(); BookIdCollection getBooksIds() const;
/** /**
* Filter the library and generate a new one with the keep elements. * Filter the library and generate a new one with the keep elements.
@ -273,7 +275,7 @@ class Library
* @param search List only books with search in the title or description. * @param search List only books with search in the title or description.
* @return The list of bookIds corresponding to the query. * @return The list of bookIds corresponding to the query.
*/ */
DEPRECATED BookIdCollection filter(const std::string& search); DEPRECATED BookIdCollection filter(const std::string& search) const;
/** /**
@ -282,7 +284,7 @@ class Library
* @param filter The filter to use. * @param filter The filter to use.
* @return The list of bookIds corresponding to the filter. * @return The list of bookIds corresponding to the filter.
*/ */
BookIdCollection filter(const Filter& filter); BookIdCollection filter(const Filter& filter) const;
/** /**
@ -292,7 +294,7 @@ class Library
* @param comparator how to sort the books * @param comparator how to sort the books
* @return The sorted list of books * @return The sorted list of books
*/ */
void sort(BookIdCollection& bookIds, supportedListSortBy sortBy, bool ascending); void sort(BookIdCollection& bookIds, supportedListSortBy sortBy, bool ascending) const;
/** /**
* List books in the library. * List books in the library.
@ -324,13 +326,13 @@ class Library
const std::string& creator = "", const std::string& creator = "",
const std::string& publisher = "", const std::string& publisher = "",
const std::vector<std::string>& tags = {}, const std::vector<std::string>& tags = {},
size_t maxSize = 0); size_t maxSize = 0) const;
friend class OPDSDumper; friend class OPDSDumper;
friend class libXMLDumper; friend class libXMLDumper;
private: // functions private: // functions
BookIdCollection filterViaBookDB(const Filter& filter); BookIdCollection filterViaBookDB(const Filter& filter) const;
void updateBookDB(const Book& book); void updateBookDB(const Book& book);
}; };

View File

@ -38,7 +38,7 @@ class LibXMLDumper
{ {
public: public:
LibXMLDumper() = default; LibXMLDumper() = default;
LibXMLDumper(Library* library); LibXMLDumper(const Library* library);
~LibXMLDumper(); ~LibXMLDumper();
/** /**
@ -69,10 +69,10 @@ class LibXMLDumper
* *
* @param library The library to dump. * @param library The library to dump.
*/ */
void setLibrary(Library* library) { this->library = library; } void setLibrary(const Library* library) { this->library = library; }
protected: protected:
kiwix::Library* library; const kiwix::Library* library;
std::string baseDir; std::string baseDir;
private: private:
void handleBook(Book book, pugi::xml_node root_node); void handleBook(Book book, pugi::xml_node root_node);

View File

@ -111,12 +111,18 @@ bool Library::removeBookById(const std::string& id)
return m_books.erase(id) == 1; return m_books.erase(id) == 1;
} }
Book& Library::getBookById(const std::string& id) const Book& Library::getBookById(const std::string& id) const
{ {
return m_books.at(id); return m_books.at(id);
} }
Book& Library::getBookByPath(const std::string& path) Book& Library::getBookById(const std::string& id)
{
const Library& const_self = *this;
return const_cast<Book&>(const_self.getBookById(id));
}
const Book& Library::getBookByPath(const std::string& path) const
{ {
for(auto& it: m_books) { for(auto& it: m_books) {
auto& book = it.second; auto& book = it.second;
@ -128,6 +134,12 @@ Book& Library::getBookByPath(const std::string& path)
throw std::out_of_range(ss.str()); throw std::out_of_range(ss.str());
} }
Book& Library::getBookByPath(const std::string& path)
{
const Library& const_self = *this;
return const_cast<Book&>(const_self.getBookByPath(path));
}
std::shared_ptr<Reader> Library::getReaderById(const std::string& id) std::shared_ptr<Reader> Library::getReaderById(const std::string& id)
{ {
try { try {
@ -143,7 +155,7 @@ std::shared_ptr<Reader> Library::getReaderById(const std::string& id)
} }
unsigned int Library::getBookCount(const bool localBooks, unsigned int Library::getBookCount(const bool localBooks,
const bool remoteBooks) const bool remoteBooks) const
{ {
unsigned int result = 0; unsigned int result = 0;
for (auto& pair: m_books) { for (auto& pair: m_books) {
@ -156,7 +168,7 @@ unsigned int Library::getBookCount(const bool localBooks,
return result; return result;
} }
bool Library::writeToFile(const std::string& path) bool Library::writeToFile(const std::string& path) const
{ {
auto baseDir = removeLastPathElement(path); auto baseDir = removeLastPathElement(path);
LibXMLDumper dumper(this); LibXMLDumper dumper(this);
@ -164,13 +176,13 @@ bool Library::writeToFile(const std::string& path)
return writeTextFile(path, dumper.dumpLibXMLContent(getBooksIds())); return writeTextFile(path, dumper.dumpLibXMLContent(getBooksIds()));
} }
bool Library::writeBookmarksToFile(const std::string& path) bool Library::writeBookmarksToFile(const std::string& path) const
{ {
LibXMLDumper dumper(this); LibXMLDumper dumper(this);
return writeTextFile(path, dumper.dumpLibXMLBookmark()); return writeTextFile(path, dumper.dumpLibXMLBookmark());
} }
std::vector<std::string> Library::getBooksLanguages() std::vector<std::string> Library::getBooksLanguages() const
{ {
std::vector<std::string> booksLanguages; std::vector<std::string> booksLanguages;
std::map<std::string, bool> booksLanguagesMap; std::map<std::string, bool> booksLanguagesMap;
@ -189,7 +201,7 @@ std::vector<std::string> Library::getBooksLanguages()
return booksLanguages; return booksLanguages;
} }
std::vector<std::string> Library::getBooksCreators() std::vector<std::string> Library::getBooksCreators() const
{ {
std::vector<std::string> booksCreators; std::vector<std::string> booksCreators;
std::map<std::string, bool> booksCreatorsMap; std::map<std::string, bool> booksCreatorsMap;
@ -208,7 +220,7 @@ std::vector<std::string> Library::getBooksCreators()
return booksCreators; return booksCreators;
} }
std::vector<std::string> Library::getBooksPublishers() std::vector<std::string> Library::getBooksPublishers() const
{ {
std::vector<std::string> booksPublishers; std::vector<std::string> booksPublishers;
std::map<std::string, bool> booksPublishersMap; std::map<std::string, bool> booksPublishersMap;
@ -227,7 +239,7 @@ std::vector<std::string> Library::getBooksPublishers()
return booksPublishers; return booksPublishers;
} }
const std::vector<kiwix::Bookmark> Library::getBookmarks(bool onlyValidBookmarks) const std::vector<kiwix::Bookmark> Library::getBookmarks(bool onlyValidBookmarks) const
{ {
if (!onlyValidBookmarks) { if (!onlyValidBookmarks) {
return m_bookmarks; return m_bookmarks;
@ -242,7 +254,7 @@ const std::vector<kiwix::Bookmark> Library::getBookmarks(bool onlyValidBookmarks
return validBookmarks; return validBookmarks;
} }
Library::BookIdCollection Library::getBooksIds() Library::BookIdCollection Library::getBooksIds() const
{ {
BookIdCollection bookIds; BookIdCollection bookIds;
@ -253,7 +265,7 @@ Library::BookIdCollection Library::getBooksIds()
return bookIds; return bookIds;
} }
Library::BookIdCollection Library::filter(const std::string& search) Library::BookIdCollection Library::filter(const std::string& search) const
{ {
if (search.empty()) { if (search.empty()) {
return getBooksIds(); return getBooksIds();
@ -424,7 +436,7 @@ Xapian::Query buildXapianQuery(const Filter& filter)
} // unnamed namespace } // unnamed namespace
Library::BookIdCollection Library::filterViaBookDB(const Filter& filter) Library::BookIdCollection Library::filterViaBookDB(const Filter& filter) const
{ {
const auto query = buildXapianQuery(filter); const auto query = buildXapianQuery(filter);
@ -443,7 +455,7 @@ Library::BookIdCollection Library::filterViaBookDB(const Filter& filter)
return bookIds; return bookIds;
} }
Library::BookIdCollection Library::filter(const Filter& filter) Library::BookIdCollection Library::filter(const Filter& filter) const
{ {
BookIdCollection result; BookIdCollection result;
for(auto id : filterViaBookDB(filter)) { for(auto id : filterViaBookDB(filter)) {
@ -467,13 +479,13 @@ struct KEY_TYPE<SIZE> {
template<supportedListSortBy sort> template<supportedListSortBy sort>
class Comparator { class Comparator {
private: private:
Library* lib; const Library* const lib;
bool ascending; const bool ascending;
inline typename KEY_TYPE<sort>::TYPE get_key(const std::string& id); inline typename KEY_TYPE<sort>::TYPE get_key(const std::string& id);
public: public:
Comparator(Library* lib, bool ascending) : lib(lib), ascending(ascending) {} Comparator(const Library* lib, bool ascending) : lib(lib), ascending(ascending) {}
inline bool operator() (const std::string& id1, const std::string& id2) { inline bool operator() (const std::string& id1, const std::string& id2) {
if (ascending) { if (ascending) {
return get_key(id1) < get_key(id2); return get_key(id1) < get_key(id2);
@ -513,7 +525,7 @@ std::string Comparator<PUBLISHER>::get_key(const std::string& id)
return lib->getBookById(id).getPublisher(); return lib->getBookById(id).getPublisher();
} }
void Library::sort(BookIdCollection& bookIds, supportedListSortBy sort, bool ascending) void Library::sort(BookIdCollection& bookIds, supportedListSortBy sort, bool ascending) const
{ {
switch(sort) { switch(sort) {
case TITLE: case TITLE:
@ -545,7 +557,7 @@ Library::BookIdCollection Library::listBooksIds(
const std::string& creator, const std::string& creator,
const std::string& publisher, const std::string& publisher,
const std::vector<std::string>& tags, const std::vector<std::string>& tags,
size_t maxSize) { size_t maxSize) const {
Filter _filter; Filter _filter;
if (mode & LOCAL) if (mode & LOCAL)

View File

@ -28,7 +28,7 @@
namespace kiwix namespace kiwix
{ {
/* Constructor */ /* Constructor */
LibXMLDumper::LibXMLDumper(Library* library) LibXMLDumper::LibXMLDumper(const Library* library)
: library(library) : library(library)
{ {
} }