33 #ifndef MULTITHREADING_OFF 49 Derived* getDerived() {
return static_cast<Derived*
>(
this); }
77 return std::pair<size_t, size_t>(1, 1);
102 errorT err = getDerived()->gameAdd(game);
110 errorT err = getDerived()->gameSave(game, replaced);
118 const byte* srcData,
size_t dataLen)
final {
128 err = getDerived()->gameAdd(&game);
139 std::pair<errorT, idNumberT> addName(
nameT,
const char*)
final {
157 err = getDerived()->open(filename, fMode);
171 template <
typename TProgress,
typename TSource,
typename TDestFn>
174 #ifndef MULTITHREADING_OFF 175 auto workTotal = src.parseProgress().second;
178 std::atomic<size_t> workDone{};
179 std::atomic<int8_t> sync[4] = {};
180 enum {sy_free, sy_used, sy_stop};
182 std::thread producer([&]() {
184 uint64_t nProduced = 0;
186 slot = nProduced % 4;
189 sy = sync[slot].load(std::memory_order_acquire);
191 std::this_thread::yield();
201 if (++nProduced % 1024 == 0) {
202 workDone.store(src.parseProgress().first,
203 std::memory_order_release);
206 sync[slot].store(sy_used, std::memory_order_release);
208 sync[slot].store(sy_stop, std::memory_order_release);
214 uint64_t nImported = 0;
216 slot = nImported % 4;
219 sy = sync[slot].load(std::memory_order_acquire);
221 std::this_thread::yield();
228 if (++nImported % 1024 == 0) {
229 if (!progress.report(workDone.load(std::memory_order_acquire),
236 err = destFn(game[slot]);
240 sync[slot].store(sy_free, std::memory_order_release);
242 sync[slot].store(sy_stop, std::memory_order_release);
245 progress(1, 1, src.parseErrors());
251 uint64_t nImported = 0;
257 if (++nImported % 1024 == 0) {
258 std::pair<size_t, size_t> count = src.parseProgress();
259 if (!progress.report(count.first, count.second)) {
265 progress(1, 1, src.parseErrors());
const errorT ERROR_CodecUnsupFeat
Manages memory databases that do not have associated files.
errorT gameSave(Game *, gamenumT)
Replaces a game in the database.
errorT parseNext(Game &)
Reads the next game.
errorT addGame(const IndexEntry *srcIe, const NameBase *srcNb, const byte *srcData, size_t dataLen) override
errorT dyn_open(fileModeT fMode, const char *, const Progress &, Index *idx, NameBase *nb) override
Opens/Creates a database.
Defines the ICodecDatabase interface, which encapsulates the data representation of databases...
const char * parseErrors()
Returns the list of errors produced by parseNext() calls.
void ProvideExternal(byte *data, size_t length)
errorT gameAdd(Game *)
Adds a game into the database.
This class stores the database's names (players, events, sites and rounds).
errorT LoadStandardTags(const IndexEntry *ie, const NameBase *nb)
const errorT ERROR_UserCancel
static errorT parseGames(const TProgress &progress, TSource &src, TDestFn destFn)
errorT saveGame(Game *game, gamenumT replaced) override
std::pair< size_t, size_t > parseProgress()
Returns info about the parsing progress.
Base class for non-native databases.
errorT open(const char *filename, fileModeT fMode)
Opens/creates a database encoded in a non-native format.
const errorT ERROR_NotFound
errorT Decode(ByteBuffer *buf, byte flags)
Implements the CodecMemory class, which represent a memory database.