#pragma once #include #include #include namespace jvalidate::constraint { class Constraint { public: virtual ~Constraint() = default; virtual Status accept(ConstraintVisitor const & visitor) const = 0; }; template class SimpleConstraint : public Constraint { public: Status accept(ConstraintVisitor const & visitor) const final { return visitor.visit(*static_cast(this)); } }; template class ExtensionConstraint : public Constraint { public: Status accept(ConstraintVisitor const & visitor) const final { if (auto * ptr = dynamic_cast const *>(&visitor)) { return ptr->visit(*static_cast(this)); } return Status::Noop; } }; }