#pragma once #include // for size_t #include #ifndef __APPLE__ using uint16_t = __int16; #endif // We use size_ts for fast indexing. Note that there is little type safety here using state = uint16_t; using input = uint16_t; using output = uint16_t; using word = std::vector; // concattenation of words template std::vector concat(std::vector const & l, std::vector const & r){ std::vector ret(l.size() + r.size()); auto it = copy(begin(l), end(l), begin(ret)); copy(begin(r), end(r), it); return ret; } // extends all words in seqs by all input symbols. Used to generate *all* strings inline std::vector all_seqs(input min, input max, std::vector const & seqs){ std::vector ret((max - min) * seqs.size()); auto it = begin(ret); for(auto const & x : seqs){ for(input i = min; i < max; ++i){ it->resize(x.size() + 1); auto e = copy(x.begin(), x.end(), it->begin()); *e++ = i; it++; } } return ret; }