NanoRange
NanoRange copied to clipboard
Add an implementation of std::variant
This PR adds Michael Park's variant implementation, and uses it in common_iterator (unless we're compiling with C++17, in which case std::variant is used).
This shrinks common_iterator a little, but at the cost of potentially worse codegen for various functions: in particular, operator==() gets routed through std::visit, which may not optimise all that well.
There's also the fact that MPark.Variant is absolutely huge -- at around 3kloc, it's about 20% the size of the whole of NanoRange at present. If it were just for common_iterator, I probably wouldn't bother; but we may be able to reuse it to implement semiregular
, and thus avoid having to drag in an equally-large optional implementation from somewhere.