/** ** \file misc/variant.hxx ** \brief Implementation of misc::variant. **/ #pragma once #include #include #include namespace misc { template template requires ContainsTypeSet variant::variant(const U& rhs) : super_type(rhs) {} template template requires ContainsTypeSet variant& variant::operator=(const U& rhs) { // Don't assign to oneself. if (static_cast(&rhs) != static_cast(this)) super_type::operator=(rhs); return *this; } template template requires ContainsTypeGet variant::operator U&() { return std::get(*this); } template template requires ContainsTypeGet variant::operator const U&() const { // FIXME DONE: Some code was deleted here. return std::get(*this); } template template requires Visits auto variant::visit(V&& visitor) const { return std::visit(visitor, static_cast(*this)); } template template auto variant::visit(V&& visitor, Variants&&... vars) { return std::visit(visitor, static_cast(vars)...); } template std::ostream& operator<<(std::ostream& os, const variant& obj) { PrintVisitor pv(os); return std::visit(pv, static_cast>(obj)); } template std::ostream& PrintVisitor::operator()(const T& value) const { return os_ << value; } } // namespace misc