#pragma once #include #include 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; } namespace jvalidate::schema { enum class Version : int; class Node; } namespace jvalidate { template concept ScalarAdapter = requires(A const a) { a.operator bool(); a.operator int64_t(); a.operator double(); a.operator std::string(); }; 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.as_object() } -> ObjectAdapter; { a.as_array() } -> ArrayAdapter; }; } namespace jvalidate { class Result; class Schema; }