1 | /* |
2 | This file is part of the KDE libraries |
3 | SPDX-FileCopyrightText: 1999 Waldo Bastian <bastian@kde.org> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.0-only |
6 | */ |
7 | |
8 | #ifndef KSYCOCADICT_H |
9 | #define KSYCOCADICT_H |
10 | |
11 | #include "ksycocaentry.h" |
12 | #include <kservice_export.h> |
13 | |
14 | #include <QList> |
15 | |
16 | #include <memory> |
17 | |
18 | class KSycocaDictPrivate; |
19 | |
20 | class QString; |
21 | class QDataStream; |
22 | |
23 | /** |
24 | * @internal |
25 | * Hash table implementation for the sycoca database file |
26 | * |
27 | * Only exported for the unit test |
28 | */ |
29 | class KSERVICE_EXPORT KSycocaDict // krazy:exclude=dpointer (not const because it gets deleted by clear()) |
30 | { |
31 | public: |
32 | /** |
33 | * Create an empty dict, for building the database |
34 | */ |
35 | KSycocaDict(); |
36 | /** |
37 | * Create a dict from an existing database |
38 | */ |
39 | KSycocaDict(QDataStream *str, int offset); |
40 | |
41 | ~KSycocaDict(); |
42 | |
43 | /** |
44 | * Adds a 'payload' to the dictionary with key 'key'. |
45 | * |
46 | * 'payload' should have a valid offset by the time |
47 | * the dictionary gets saved. |
48 | **/ |
49 | void add(const QString &key, const KSycocaEntry::Ptr &payload); |
50 | |
51 | /** |
52 | * Removes the 'payload' from the dictionary with key 'key'. |
53 | * |
54 | * Not very fast, use with care O(N) |
55 | **/ |
56 | void remove(const QString &key); |
57 | |
58 | /** |
59 | * Looks up an entry identified by 'key'. |
60 | * |
61 | * If 0 is returned, no matching entry exists. |
62 | * Otherwise, the offset of the entry is returned. |
63 | * |
64 | * NOTE: It is not guaranteed that this entry is |
65 | * indeed the one you were looking for. |
66 | * After loading the entry you should check that it |
67 | * indeed matches the search key. If it doesn't |
68 | * then no matching entry exists. |
69 | */ |
70 | int find_string(const QString &key) const; |
71 | |
72 | /** |
73 | * Looks up all entries identified by 'key'. |
74 | * This is useful when the dict is used as a multi-hash. |
75 | * |
76 | * If an empty list is returned, no matching entry exists. |
77 | * Otherwise, the offset of the matching entries are returned. |
78 | * |
79 | * NOTE: It is not guaranteed that each entry is |
80 | * indeed among the ones you were looking for. |
81 | * After loading each entry you should check that it |
82 | * indeed matches the search key. |
83 | */ |
84 | QList<int> findMultiString(const QString &key) const; |
85 | |
86 | /** |
87 | * The number of entries in the dictionary. |
88 | * |
89 | * Only valid when building the database. |
90 | */ |
91 | uint count() const; |
92 | |
93 | /** |
94 | * Reset the dictionary. |
95 | * |
96 | * Only valid when building the database. |
97 | */ |
98 | void clear(); |
99 | |
100 | /** |
101 | * Save the dictionary to the stream |
102 | * A reasonable fast hash algorithm will be created. |
103 | * |
104 | * Typically this will find 90% of the entries directly. |
105 | * Average hash table size: nrOfItems * 20 bytes. |
106 | * Average duplicate list size: nrOfItms * avgKeyLength / 5. |
107 | * |
108 | * Unknown keys have an average 20% chance to give a false hit. |
109 | * (That's why your program should check the result) |
110 | * |
111 | * Example: |
112 | * Assume 1000 items with an average key length of 60 bytes. |
113 | * |
114 | * Approx. 900 items will hash directly to the right entry. |
115 | * Approx. 100 items require a lookup in the duplicate list. |
116 | * |
117 | * The hash table size will be approx. 20Kb. |
118 | * The duplicate list size will be approx. 12Kb. |
119 | **/ |
120 | void save(QDataStream &str); |
121 | |
122 | private: |
123 | Q_DISABLE_COPY(KSycocaDict) |
124 | std::unique_ptr<KSycocaDictPrivate> d; |
125 | }; |
126 | |
127 | #endif |
128 | |