#pragma once
#include <atomic>
#include <mutex>
#include "Common.hpp"
#include "SerializableDict.hpp"
namespace marisa {
class Trie;
}
namespace opencc {
class OPENCC_EXPORT MarisaDict : public Dict, public SerializableDict {
public:
virtual ~MarisaDict() override;
virtual size_t KeyMaxLength() const override;
virtual Optional<const DictEntry*> Match(const char* word,
size_t len) const override;
virtual Optional<const DictEntry*> MatchPrefix(const char* word,
size_t len) const override;
virtual std::vector<const DictEntry*> MatchAllPrefixes(
const char* word, size_t len) const override;
virtual LexiconPtr GetLexicon() const override;
virtual bool SupportsFastPrefixMatch() const override { return true; }
virtual PrefixMatchView MatchPrefixValue(const char* word,
size_t len) const override;
virtual void SerializeToFile(FILE* fp) const override;
static MarisaDictPtr NewFromDict(const Dict& thatDict);
static MarisaDictPtr NewFromFile(FILE* fp);
static MarisaDictPtr NewFromBuffer(const char* data, size_t size);
bool IsLexiconReconstructed() const {
return lexiconReconstructed.load(std::memory_order_acquire);
}
private:
MarisaDict();
void LoadFromMappedBuffer();
void ReconstructLexicon() const;
mutable size_t maxLength;
mutable LexiconPtr lexicon;
mutable std::mutex lexiconMutex;
mutable std::atomic<bool> lexiconReconstructed;
LexiconPtr valuesLexicon;
class MarisaInternal;
std::unique_ptr<MarisaInternal> internal;
};
}