// // json_binder.h // json // // Created by Sam Jaffe on 1/31/16. // Copyright © 2016 Sam Jaffe. All rights reserved. // #ifndef json_binder_h #define json_binder_h #pragma once #include "json_common.hpp" #include #include #include namespace json { namespace binder { template class binder_impl { public: virtual binder_impl* clone() const = 0; virtual ~binder_impl() {} virtual void parse(T&, char const*&) const = 0; virtual void write(T const&, std::string &) const = 0; }; template class binder { public: binder() : impl(nullptr) { } binder(binder const& other) : impl(other.impl->clone()) { } binder(binder_impl const* p) : impl(p) { } binder(binder_impl const& r) : impl(r.clone()) { } ~binder() { if (impl) { delete impl; impl = nullptr; } } void parse(T& object, char const*& data) const { if (!impl) return; impl->parse(object, data); } void write(T const& object, std::string & data) const { if (!impl) return; impl->write(object, data); } private: binder_impl const* impl; }; template class visitor { public: visitor(S& o, binder_impl& b) : obj(o), b(b) {} void parse(char const* data) { b.parse(obj, data); } void write(std::string & data) const { b.write(obj, data); } private: S& obj; binder_impl& b; }; template visitor bind(T& object, binder_impl& b) { return visitor{object, b}; } } namespace parser { template void parse(binder::visitor& visitor, char const* data) { visitor.parse(data); } template void write(binder::visitor const & visitor, std::string & data) { visitor.write(data); } } } #include "json/json_binder_parser.hpp" #include "json/json_direct_binder.hpp" #include "json/json_tuple_binder.hpp" #include "json/json_object_binder.hpp" #include "json/json_direct_map_binder.hpp" #include "json/json_direct_scalar_binder.hpp" #include "json/json_direct_vector_binder.hpp" #endif /* json_binder_h */