constraint.h 831 B

123456789101112131415161718192021222324252627282930
  1. #pragma once
  2. #include <jvalidate/constraint/visitor.h>
  3. #include <jvalidate/enum.h>
  4. #include <jvalidate/forward.h>
  5. namespace jvalidate::constraint {
  6. class Constraint {
  7. public:
  8. virtual ~Constraint() = default;
  9. virtual Status accept(ConstraintVisitor const & visitor) const = 0;
  10. };
  11. template <typename CRTP> class SimpleConstraint : public Constraint {
  12. public:
  13. Status accept(ConstraintVisitor const & visitor) const final {
  14. return visitor.visit(*static_cast<CRTP const *>(this));
  15. }
  16. };
  17. template <typename CRTP> class ExtensionConstraint : public Constraint {
  18. public:
  19. Status accept(ConstraintVisitor const & visitor) const final {
  20. if (auto * ptr = dynamic_cast<ExtensionConstraintVisitor<CRTP> const *>(&visitor)) {
  21. return ptr->visit(*static_cast<CRTP const *>(this));
  22. }
  23. return Status::Noop;
  24. }
  25. };
  26. }