2024-05-31 22:59:00 -04:00
|
|
|
#ifndef RFL_VISIT_HPP_
|
|
|
|
#define RFL_VISIT_HPP_
|
|
|
|
|
|
|
|
#include <variant>
|
|
|
|
|
|
|
|
#include "Literal.hpp"
|
|
|
|
#include "TaggedUnion.hpp"
|
|
|
|
#include "internal/StringLiteral.hpp"
|
|
|
|
#include "internal/VisitTree.hpp"
|
|
|
|
#include "internal/VisitorWrapper.hpp"
|
|
|
|
|
|
|
|
namespace rfl {
|
|
|
|
|
2024-06-08 14:10:59 -04:00
|
|
|
/// Implements the visitor pattern for Literals.
|
|
|
|
template <class Visitor, internal::StringLiteral... _fields, class... Args>
|
2024-06-08 15:53:06 -04:00
|
|
|
inline auto visit(
|
|
|
|
const Visitor& _visitor,
|
|
|
|
const Literal<_fields...> _literal,
|
|
|
|
const Args&... _args
|
|
|
|
) {
|
2024-05-31 22:59:00 -04:00
|
|
|
constexpr int size = sizeof...(_fields);
|
2024-06-08 14:10:59 -04:00
|
|
|
using WrapperType = internal::VisitorWrapper<Visitor, _fields...>;
|
2024-05-31 22:59:00 -04:00
|
|
|
const auto wrapper = WrapperType(&_visitor);
|
|
|
|
return internal::VisitTree::visit<0, size, WrapperType>(
|
2024-06-08 15:53:06 -04:00
|
|
|
wrapper, _literal.value(), _args...
|
|
|
|
);
|
2024-06-08 14:10:59 -04:00
|
|
|
}
|
2024-05-31 22:59:00 -04:00
|
|
|
|
2024-06-08 14:10:59 -04:00
|
|
|
/// Implements the visitor pattern for TaggedUnions.
|
2024-06-08 15:53:06 -04:00
|
|
|
template <
|
|
|
|
class Visitor,
|
|
|
|
internal::StringLiteral _discriminator,
|
|
|
|
class... Args>
|
|
|
|
inline auto visit(
|
|
|
|
const Visitor& _visitor,
|
|
|
|
const TaggedUnion<_discriminator, Args...>& _tagged_union
|
|
|
|
) {
|
2024-05-31 22:59:00 -04:00
|
|
|
return std::visit(_visitor, _tagged_union.variant());
|
2024-06-08 14:10:59 -04:00
|
|
|
}
|
2024-05-31 22:59:00 -04:00
|
|
|
|
2024-06-08 14:10:59 -04:00
|
|
|
} // namespace rfl
|
2024-05-31 22:59:00 -04:00
|
|
|
|
2024-06-08 14:10:59 -04:00
|
|
|
#endif // RFL_VISIT_HPP_
|