#pragma once #include #include namespace jvalidate { class ValidationResult; class Schema; class Status; } namespace jvalidate::adapter { enum class Type : int8_t; class Adapter; class Const; using AdapterCallback = std::function; using ObjectAdapterCallback = std::function; template struct AdapterTraits; template struct AdapterTraits : AdapterTraits {}; template using AdapterFor = typename AdapterTraits::template Adapter; } namespace jvalidate::constraint { class ConstraintVisitor; class Constraint; template class SimpleConstraint; class ExtensionConstraint; class TypeConstraint; class EnumConstraint; class AllOfConstraint; class AnyOfConstraint; class OneOfConstraint; class NotConstraint; class ConditionalConstraint; class MaximumConstraint; class MinimumConstraint; class MultipleOfConstraint; class MaxLengthConstraint; class MinLengthConstraint; class PatternConstraint; class AdditionalItemsConstraint; class ContainsConstraint; class MaxItemsConstraint; class MinItemsConstraint; class TupleConstraint; class UnevaluatedItemsConstraint; class UniqueItemsConstraint; class AdditionalPropertiesConstraint; class DependenciesConstraint; class MaxPropertiesConstraint; class MinPropertiesConstraint; class PatternPropertiesConstraint; class PropertiesConstraint; class PropertyNamesConstraint; class RequiredConstraint; class UnevaluatedPropertiesConstraint; } namespace jvalidate::schema { enum class Version : int; class Node; } namespace jvalidate { template concept ArrayIterator = std::forward_iterator and std::is_default_constructible_v and requires(It const it) { { *it } -> std::convertible_to; }; template concept ObjectIterator = std::forward_iterator and std::is_default_constructible_v and requires(It const it) { { it->first } -> std::convertible_to; { it->second } -> std::convertible_to; }; template concept ArrayAdapter = requires(A const a) { { a.size() } -> std::convertible_to; { a[0UL] } -> std::convertible_to; { a.begin() } -> ArrayIterator; { a.end() } -> ArrayIterator; }; template concept ObjectAdapter = requires(A const a) { { a.size() } -> std::convertible_to; { a.contains("") } -> std::same_as; { a[""] } -> std::convertible_to; { a.begin() } -> ObjectIterator; { a.end() } -> ObjectIterator; }; template concept Adapter = std::is_base_of_v && requires(A a) { { a.type() } -> std::same_as; { a.as_boolean() } -> std::same_as; { a.as_integer() } -> std::convertible_to; { a.as_number() } -> std::convertible_to; { a.as_number() } -> std::floating_point; { a.as_object() } -> ObjectAdapter; { a.as_array() } -> ArrayAdapter; { a.array_size() } -> std::convertible_to; { a.object_size() } -> std::convertible_to; }; template concept RegexEngine = std::constructible_from && requires(R const regex) { { regex.search("") } -> std::same_as; }; } namespace jvalidate { template class ValidationVisitor; class Validator; }