diff options
Diffstat (limited to 'core/fulltext.h')
-rw-r--r-- | core/fulltext.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/core/fulltext.h b/core/fulltext.h new file mode 100644 index 000000000..c22a118b8 --- /dev/null +++ b/core/fulltext.h @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0 + +// A class for performing full text searches on dives. +// Search is case-insensitive. Even though QString has many design +// issues such as COW semantics and UTF-16 encoding, it provides +// platform independence and reasonable performance. Therefore, +// this is based in QString instead of std::string. +// +// To make this accessible from C, this does manual memory management: +// Every dive is associated with a cache of words. Thus, when deleting +// a dive, a function freeing that data has to be called. + +#ifndef FULLTEXT_H +#define FULLTEXT_H + +// For now only compile on desktop +#ifndef SUBSURFACE_MOBILE + +// 1) The C-accessible interface + +#ifdef __cplusplus +extern "C" { +#endif + +struct full_text_cache; +struct dive; +void fulltext_register(struct dive *d); // Note: can be called repeatedly +void fulltext_unregister(struct dive *d); // Note: can be called repeatedly +void fulltext_unregister_all(); // Unregisters all dives in the dive table +void fulltext_reload(); // Registers all dives in the dive table + +#ifdef __cplusplus +} +#endif + +// 2) The C++-only interface +#ifdef __cplusplus + +#include <QString> +#include <vector> + +enum class StringFilterMode { + SUBSTRING = 0, + STARTSWITH = 1, + EXACT = 2 +}; + +// A fulltext query. Basically a list of normalized words we search for +struct FullTextQuery { + std::vector<QString> words; + FullTextQuery &operator=(const QString &); // Initialize by assigning a user-provided search string + bool doit() const; // true if we should to a fulltext search +}; + +// Describes the result of a fulltext search +struct FullTextResult { + std::vector<dive *> dives; + bool dive_matches(const struct dive *d) const; +}; + +// Two search modes: +// 1) Find all dives matching the query. +// 2) Test if a given dive matches the query. +FullTextResult fulltext_find_dives(const FullTextQuery &q, StringFilterMode); +bool fulltext_dive_matches(const struct dive *d, const FullTextQuery &q, StringFilterMode); + +#endif +#endif // SUBSURFACE_MOBILE +#endif |