// // json_direct_binder.hpp // json // // Created by Sam Jaffe on 4/23/16. // #pragma once namespace json { namespace binder { template class direct_binder : public binder_impl { public: direct_binder(E T::*p, binder const& i) : ptr(p), impl(i) { } virtual binder_impl* clone() const override { return new direct_binder(*this); } virtual void parse(T& val, char const*& data, parser::options opts) const override { impl.parse(val.*ptr, data, opts); } virtual void write(T const& val, std::ostream & data) const override { impl.write(val.*ptr, data); } private: E T::*ptr; binder impl; }; template class value_binder : public binder_impl { private: struct detail { T value; }; public: template value_binder(Args &&... args) : impl(&detail::value, args...) {} virtual binder_impl* clone() const override { return new value_binder(*this); } virtual void parse(T & val, char const *&data, parser::options opts) const override { detail tmp; impl.parse(tmp, data, opts); val = std::move(tmp.value); } virtual void write(T const& val, std::ostream & data) const override { impl.write({val}, data); } private: direct_binder impl; }; } }