27 return static_cast<FileType>(int(x) | int(y));
30 return static_cast<FileType>(int(x) & int(y));
49 std::function<
void(std::string_view,
float)> reportProgress);
73 unsigned amountScanned = 0;
78 Entry(
const Sha1Sum& s, time_t
t, std::string_view f)
79 : filename(f), time(
t),
sum(s)
83 Entry(
const Sha1Sum& s,
const char*
t, std::string_view f)
84 : filename(f), timeStr(
t),
sum(s)
86 assert(timeStr !=
nullptr);
90 void setTime(time_t
t);
94 std::string_view filename;
95 const char* timeStr =
nullptr;
102 using Sha1Index = std::vector<Index>;
104 class FilenameIndexHelper {
106 FilenameIndexHelper(
const Pool& p) : pool(p) {}
107 [[nodiscard]] std::string_view get(std::string_view s)
const {
return s; }
108 [[nodiscard]] std::string_view get(Index idx)
const {
return pool[idx].filename; }
112 struct FilenameIndexHash : FilenameIndexHelper {
113 FilenameIndexHash(
const Pool& p) : FilenameIndexHelper(p) {}
114 template<
typename T> [[nodiscard]]
auto operator()(T
t)
const {
116 return hasher(get(
t));
119 struct FilenameIndexEqual : FilenameIndexHelper {
120 FilenameIndexEqual(
const Pool& p) : FilenameIndexHelper(p) {}
121 template<
typename T1,
typename T2>
122 [[nodiscard]]
bool operator()(T1 x, T2 y)
const {
123 return get(x) == get(y);
127 using FilenameIndex =
SimpleHashSet<Index, Index(-1), FilenameIndexHash, FilenameIndexEqual>;
130 void insert(
const Sha1Sum&
sum, time_t time,
const std::string& filename);
131 [[nodiscard]] Sha1Index::iterator getSha1Iterator(Index idx, Entry& entry);
132 void remove(Sha1Index::iterator it);
133 void remove(Index idx);
134 void remove(Index idx, Entry& entry);
135 bool adjustSha1(Sha1Index::iterator it, Entry& entry,
const Sha1Sum& newSum);
136 bool adjustSha1(Index idx, Entry& entry,
const Sha1Sum& newSum);
139 void writeSha1sums();
141 [[nodiscard]] File getFromPool(
const Sha1Sum& sha1sum);
142 [[nodiscard]] File scanDirectory(
143 const Sha1Sum& sha1sum,
144 const std::string& directory,
145 std::string_view poolPath,
146 ScanProgress& progress);
147 [[nodiscard]] File scanFile(
148 const Sha1Sum& sha1sum,
149 const std::string& filename,
151 std::string_view poolPath,
152 ScanProgress& progress);
153 [[nodiscard]] Sha1Sum calcSha1sum(File& file);
154 [[nodiscard]] std::pair<Index, Entry*> findInDatabase(std::string_view filename);
157 std::string fileCache;
159 std::function<void(std::string_view,
float)> reportProgress;
161 MemBuffer<char> fileMem;
162 std::vector<std::string> stringBuffer;
166 FilenameIndex filenameIndex{FilenameIndexHash(pool), FilenameIndexEqual(pool)};
169 bool needWrite =
false;
Sha1Sum getSha1Sum(File &file)
Calculate sha1sum for the given File object.
File getFile(FileType fileType, const Sha1Sum &sha1sum)
Search file with the given sha1sum.
void abort()
This is only meaningful to call from within the 'reportProgress' callback (constructor parameter).
std::vector< Dir > Directories
FilePoolCore(std::string fileCache, std::function< Directories()> getDirectories, std::function< void(std::string_view, float)> reportProgress)
This class represents the result of a sha1 calculation (a 160-bit value).
constexpr time_t INVALID_TIME_T
uint64_t getTime()
Get current (real) time in us.
This file implemented 3 utility functions:
FileType operator&(FileType x, FileType y)
FileType & operator|=(FileType &x, FileType y)
FileType operator|(FileType x, FileType y)
auto sum(InputRange &&range, Proj proj={})