From 967be9e750221ab2ab783f95df79bb26d290a45e Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:07:58 +0200 Subject: add: added projects --- tiger-compiler/lib/misc/variant.hxx | 77 +++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tiger-compiler/lib/misc/variant.hxx (limited to 'tiger-compiler/lib/misc/variant.hxx') diff --git a/tiger-compiler/lib/misc/variant.hxx b/tiger-compiler/lib/misc/variant.hxx new file mode 100644 index 0000000..1f7feab --- /dev/null +++ b/tiger-compiler/lib/misc/variant.hxx @@ -0,0 +1,77 @@ +/** + ** \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 -- cgit v1.2.3