#pragma once #include #include #include #include #include #include #include #include #include namespace jvalidate::adapter { class Adapter { public: virtual ~Adapter() = default; virtual Type type() const = 0; virtual std::unique_ptr freeze() const = 0; virtual bool as_boolean() const = 0; virtual int64_t as_integer() const = 0; virtual double as_number() const = 0; virtual std::string as_string() const = 0; virtual size_t array_size() const = 0; virtual size_t object_size() const = 0; virtual Status apply_array(AdapterCallback const & cb) const = 0; virtual Status apply_object(ObjectAdapterCallback const & cb) const = 0; virtual bool equals(Adapter const & lhs, bool strict) const = 0; }; class Const { public: virtual ~Const() = default; virtual Status apply(AdapterCallback const & cb) const = 0; }; } namespace jvalidate::adapter::detail { template class GenericConst final : public Const { public: explicit GenericConst(JSON const & value) : value_(value) {} Status apply(AdapterCallback const & cb) const { return cb(typename AdapterTraits::ConstAdapter(value_)); } private: JSON value_; }; }