#pragma once #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 bool apply_array(AdapterCallback const & cb) const = 0; virtual bool apply_object(ObjectAdapterCallback const & cb) const = 0; }; class Const { public: virtual ~Const() = default; virtual bool apply(AdapterCallback const & cb) const = 0; }; } namespace jvalidate::adapter::detail { template class GenericConst final : public Const { public: explicit GenericConst(JSON const & value) : value_(value) {} bool apply(AdapterCallback const & cb) const { return cb(typename AdapterTraits::ConstAdapter(value_)); } private: JSON value_; }; }