49 std::size_t chain_size, std::size_t max_len)
51 if(prefixes.empty() || chain_size == 0) {
52 return std::u32string();
55 std::u32string prefix, res;
67 std::vector<int> random(max_len);
69 for(; j < max_len; ++j) {
74 while(res.size() < max_len) {
75 const markov_prefix_map::const_iterator
i = prefixes.find(prefix);
76 if(
i == prefixes.end() ||
i->second.empty()) {
80 const char32_t c =
i->second[random[j++]%
i->second.size()];
85 res.resize(res.size()+1);
87 prefix.resize(prefix.size()+1);
89 while(prefix.size() > chain_size) {
90 prefix.erase(prefix.begin());
103 std::u32string originalRes = res;
104 while(!res.empty()) {
105 const int prefixLen = chain_size < res.size() ? chain_size : res.size();
106 prefix = std::u32string(res.end() - prefixLen, res.end());
108 const markov_prefix_map::const_iterator
i = prefixes.find(prefix);
109 if (
i == prefixes.end() ||
i->second.empty()) {