#ifndef WORD_H_INCLUDED #define WORD_H_INCLUDED #include "grammar.h" class TransformatedWord; class Word { public: Word(Grammar& grammar, const std::map& data) : source(&grammar), channels(data), path(), freq(1.0) {;} // Word(const Word& w) // : source(w.source), channels(w.channels), path(w.path.copy()), freq (w.freq) // {;} // Word(Word&&) = default; // Word& operator=(const Word& w) // { // source = w.source; // channels = w.channels; // path = w.path.copy(); // freq = w.freq; // return *this; // } icu::UnicodeString& operator[](Grammar::channelID ch) {return channels[ch];} const icu::UnicodeString& operator[](Grammar::channelID ch) const {return channels.at(ch);} icu::UnicodeString& operator[](const icu::UnicodeString& ch) {return channels[source->chI(ch)];} const icu::UnicodeString& operator[](const icu::UnicodeString& ch) const {return channels.at(source->chI(ch));} Path& p() {return path;} const Path& p() const {return path;} double& f() {return freq;} const double& f() const {return freq;} Word& append(const std::map&, bool=false); Word& appendVal(const icu::UnicodeString&); Word& append(const icu::UnicodeString&v, const std::map&c, bool b=false) {appendVal(v); return append(c,b);} Word& append(const Word&); TransformatedWord transform() const; // icu::UnicodeString format(const std::string& fmt); icu::UnicodeString printAll(const icu::UnicodeString& sep); protected: Grammar* source; std::map channels; Path path; double freq; friend TransformatedWord Grammar::applyTransforms(const Word& w) const; }; class TransformatedWord : public Word { public: TransformatedWord(Grammar& grammar, const std::map& data) : Word(grammar, data) {for (const auto& s : data) history[s.first].push_back(s.second);} TransformatedWord(const Word& w) : Word(w) {;} //Get Word from this, keeping history Word getWord(const icu::UnicodeString& sep=u" → "); //Get Word from this, stripping history Word getWord(bool) {return *this;} // explicit operator Word() // {return *this;} protected: void fix(); std::map> history; friend TransformatedWord Grammar::applyTransforms(const Word& w) const; }; inline TransformatedWord Word::transform() const {return source->applyTransforms(*this);} #endif