| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- //
- // json_direct_binder.hpp
- // json
- //
- // Created by Sam Jaffe on 4/23/16.
- //
- #pragma once
- #include "json_binder.hpp"
- namespace json { namespace binder {
- template <typename T, typename E, typename = void>
- class direct_binder;
-
- template <typename T, typename E, typename = void>
- class forward_binder : public binder_impl<T> {
- public:
- forward_binder(E T::*p, binder<E> const& i) :
- ptr(p), impl(i) {
- }
-
- virtual binder_impl<T>* clone() const override {
- return new forward_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<E> impl;
- };
-
- template <typename T>
- class value_binder : public binder_impl<T> {
- private:
- struct detail {
- T value;
- };
- public:
- template <typename... Args>
- value_binder(Args &&... args) : impl(&detail::value, args...) {}
-
- virtual binder_impl<T>* 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<detail, T> impl;
- };
- } }
|