json_binder.hpp 1007 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #pragma once
  2. #include "json/json_common.hpp"
  3. #include <iostream>
  4. namespace json { namespace binder {
  5. template <typename T> class binder_impl {
  6. public:
  7. virtual binder_impl<T> * clone() const = 0;
  8. virtual ~binder_impl() {}
  9. virtual void parse(T &, char const *&, parser::options) const = 0;
  10. virtual void write(T const &, std::ostream &) const = 0;
  11. };
  12. template <typename T> class binder {
  13. public:
  14. binder() : impl(nullptr) {}
  15. binder(binder const & other) : impl(other.impl->clone()) {}
  16. binder(binder_impl<T> const * p) : impl(p) {}
  17. binder(binder_impl<T> const & r) : impl(r.clone()) {}
  18. ~binder() { delete impl; }
  19. void parse(T & object, char const *& data, parser::options opts) const {
  20. if (!impl) return; // error?
  21. impl->parse(object, data, opts);
  22. }
  23. void write(T const & object, std::ostream & data) const {
  24. if (!impl) return; // error?
  25. impl->write(object, data);
  26. }
  27. private:
  28. binder_impl<T> const * impl;
  29. };
  30. }}