forward.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <functional>
  3. #include <string>
  4. namespace jvalidate::adapter {
  5. enum class Type : int8_t;
  6. class Adapter;
  7. class Const;
  8. using AdapterCallback = std::function<bool(adapter::Adapter const &)>;
  9. using ObjectAdapterCallback = std::function<bool(std::string const &, adapter::Adapter const &)>;
  10. template <typename> struct AdapterTraits;
  11. template <typename V> struct AdapterTraits<V const> : AdapterTraits<V> {};
  12. template <typename JSON> using AdapterFor = typename AdapterTraits<JSON>::template Adapter<JSON>;
  13. }
  14. namespace jvalidate::constraint {
  15. class ConstraintVisitor;
  16. class Constraint;
  17. }
  18. namespace jvalidate::schema {
  19. enum class Version : int;
  20. class Node;
  21. }
  22. namespace jvalidate {
  23. template <typename A>
  24. concept ScalarAdapter = requires(A const a) {
  25. a.operator bool();
  26. a.operator int64_t();
  27. a.operator double();
  28. a.operator std::string();
  29. };
  30. template <typename It>
  31. concept ArrayIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  32. requires(It const it) {
  33. { *it } -> std::convertible_to<adapter::Adapter const &>;
  34. };
  35. template <typename It>
  36. concept ObjectIterator = std::forward_iterator<It> and std::is_default_constructible_v<It> and
  37. requires(It const it) {
  38. { it->first } -> std::convertible_to<std::string_view>;
  39. { it->second } -> std::convertible_to<adapter::Adapter const &>;
  40. };
  41. template <typename A>
  42. concept ArrayAdapter = requires(A const a) {
  43. { a.size() } -> std::convertible_to<std::size_t>;
  44. { a[0UL] } -> std::convertible_to<adapter::Adapter const &>;
  45. { a.begin() } -> ArrayIterator;
  46. { a.end() } -> ArrayIterator;
  47. };
  48. template <typename A>
  49. concept ObjectAdapter = requires(A const a) {
  50. { a.size() } -> std::convertible_to<std::size_t>;
  51. { a.contains("") } -> std::same_as<bool>;
  52. { a[""] } -> std::convertible_to<adapter::Adapter const &>;
  53. { a.begin() } -> ObjectIterator;
  54. { a.end() } -> ObjectIterator;
  55. };
  56. template <typename A>
  57. concept Adapter = std::is_base_of_v<adapter::Adapter, A> && requires(A a) {
  58. { a.as_object() } -> ObjectAdapter;
  59. { a.as_array() } -> ArrayAdapter;
  60. };
  61. }
  62. namespace jvalidate {
  63. class Result;
  64. class Schema;
  65. }