forward.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #pragma once
  2. #include <functional>
  3. #include <string>
  4. #include <type_traits>
  5. namespace jvalidate {
  6. class Schema;
  7. class Status;
  8. class URI;
  9. struct ValidationConfig;
  10. class ValidationResult;
  11. }
  12. namespace jvalidate::adapter {
  13. enum class Type : int8_t;
  14. class Adapter;
  15. class Const;
  16. using AdapterCallback = std::function<Status(adapter::Adapter const &)>;
  17. using ObjectAdapterCallback = std::function<Status(std::string const &, adapter::Adapter const &)>;
  18. template <typename> struct AdapterTraits;
  19. template <typename V> struct AdapterTraits<V const> : AdapterTraits<V> {};
  20. template <typename JSON> using AdapterFor = typename AdapterTraits<JSON>::template Adapter<JSON>;
  21. }
  22. namespace jvalidate::constraint {
  23. class ConstraintVisitor;
  24. class Constraint;
  25. template <typename> class SimpleConstraint;
  26. class ExtensionConstraint;
  27. class TypeConstraint;
  28. class EnumConstraint;
  29. class AllOfConstraint;
  30. class AnyOfConstraint;
  31. class OneOfConstraint;
  32. class NotConstraint;
  33. class ConditionalConstraint;
  34. class MaximumConstraint;
  35. class MinimumConstraint;
  36. class MultipleOfConstraint;
  37. class MaxLengthConstraint;
  38. class MinLengthConstraint;
  39. class PatternConstraint;
  40. class FormatConstraint;
  41. class AdditionalItemsConstraint;
  42. class ContainsConstraint;
  43. class MaxItemsConstraint;
  44. class MinItemsConstraint;
  45. class TupleConstraint;
  46. class UnevaluatedItemsConstraint;
  47. class UniqueItemsConstraint;
  48. class AdditionalPropertiesConstraint;
  49. class DependenciesConstraint;
  50. class MaxPropertiesConstraint;
  51. class MinPropertiesConstraint;
  52. class PatternPropertiesConstraint;
  53. class PropertiesConstraint;
  54. class PropertyNamesConstraint;
  55. class RequiredConstraint;
  56. class UnevaluatedPropertiesConstraint;
  57. }
  58. namespace jvalidate::schema {
  59. enum class Version : int;
  60. class Node;
  61. }
  62. namespace jvalidate {
  63. template <typename It>
  64. concept ArrayIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  65. requires(It const it) {
  66. { *it } -> std::convertible_to<adapter::Adapter const &>;
  67. };
  68. template <typename It>
  69. concept ObjectIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  70. requires(It const it) {
  71. { it->first } -> std::convertible_to<std::string_view>;
  72. { it->second } -> std::convertible_to<adapter::Adapter const &>;
  73. };
  74. template <typename A>
  75. concept ArrayAdapter = requires(A const a) {
  76. { a.size() } -> std::convertible_to<std::size_t>;
  77. { a[0UL] } -> std::convertible_to<adapter::Adapter const &>;
  78. { a.begin() } -> ArrayIterator;
  79. { a.end() } -> ArrayIterator;
  80. };
  81. template <typename A>
  82. concept ObjectAdapter = requires(A const a) {
  83. { a.size() } -> std::convertible_to<std::size_t>;
  84. { a.contains("") } -> std::same_as<bool>;
  85. { a[""] } -> std::convertible_to<adapter::Adapter const &>;
  86. { a.begin() } -> ObjectIterator;
  87. { a.end() } -> ObjectIterator;
  88. };
  89. template <typename A>
  90. concept Adapter = std::is_base_of_v<adapter::Adapter, A> && requires(A const a) {
  91. typename A::value_type;
  92. { a.type() } -> std::same_as<adapter::Type>;
  93. { a.as_boolean() } -> std::same_as<bool>;
  94. { a.as_integer() } -> std::convertible_to<int64_t>;
  95. { a.as_number() } -> std::convertible_to<double>;
  96. { a.as_number() } -> std::floating_point;
  97. { a.as_object() } -> ObjectAdapter;
  98. { a.as_array() } -> ArrayAdapter;
  99. { a.array_size() } -> std::convertible_to<size_t>;
  100. { a.object_size() } -> std::convertible_to<size_t>;
  101. };
  102. template <typename A>
  103. concept MutableObject = ObjectAdapter<A> && requires(A const a) {
  104. {a.assign("", std::declval<adapter::Const>())};
  105. };
  106. template <typename A>
  107. concept MutableAdapter = Adapter<A> && requires(A const a) {
  108. {a.assign(std::declval<adapter::Const>())};
  109. {a.assign(std::declval<adapter::Adapter>())};
  110. { a.as_object() } -> MutableObject;
  111. };
  112. template <typename R>
  113. concept RegexEngine = std::constructible_from<std::string> && requires(R const regex) {
  114. { regex.search("") } -> std::same_as<bool>;
  115. };
  116. }
  117. namespace jvalidate {
  118. template <Adapter A> class ConstraintFactory;
  119. template <Adapter A> class DocumentCache;
  120. template <Adapter A, RegexEngine RE> class ValidationVisitor;
  121. template <RegexEngine RE> class ValidatorT;
  122. class Validator;
  123. template <Adapter A> using URIResolver = bool (*)(URI const &, typename A::value_type &);
  124. template <typename T, typename S>
  125. concept Not = not std::is_convertible_v<std::decay_t<S>, T>;
  126. }