json_direct_scalar_binder.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // json_direct_scalar_binder.hpp
  3. // json
  4. //
  5. // Created by Sam Jaffe on 4/23/16.
  6. //
  7. #pragma once
  8. namespace json { namespace binder {
  9. template <typename T>
  10. class direct_binder<T, bool> : public binder_impl<T> {
  11. public:
  12. explicit direct_binder(bool T::*p) : ptr(p) {}
  13. virtual binder_impl<T>* clone() const override { return new direct_binder(*this); }
  14. virtual void parse(T& val, char const*& data, parser::options) const override {
  15. if (!strncmp(data, "true", 4)) {
  16. val.*ptr = true;
  17. data += 4;
  18. } else if (!strncmp(data, "false", 5)) {
  19. val.*ptr = false;
  20. data += 5;
  21. } else {
  22. throw json::malformed_json_exception("Expected a boolean type here");
  23. }
  24. }
  25. virtual void write(T const& val, std::ostream & data) const override {
  26. data << (val.*ptr ? "true" : "false");
  27. }
  28. private:
  29. bool T::*ptr;
  30. };
  31. template <typename T, typename N>
  32. class direct_binder<T, N, typename std::enable_if<std::is_integral<N>::value>::type> : public binder_impl<T> {
  33. public:
  34. explicit direct_binder(N T::*p) : ptr(p) {}
  35. virtual binder_impl<T>* clone() const override { return new direct_binder(*this); }
  36. virtual void parse(T& val, char const*& data, parser::options) const override {
  37. json::helper::parse_numeric(val.*ptr, data);
  38. }
  39. virtual void write(T const& val, std::ostream & data) const override {
  40. data << val.*ptr;
  41. }
  42. private:
  43. N T::*ptr;
  44. };
  45. template <typename T, typename N>
  46. class direct_binder<T, N, typename std::enable_if<std::is_floating_point<N>::value>::type> : public binder_impl<T> {
  47. public:
  48. explicit direct_binder(N T::*p) : ptr(p) {}
  49. virtual binder_impl<T>* clone() const override { return new direct_binder(*this); }
  50. virtual void parse(T& val, char const*& data, parser::options) const override {
  51. json::helper::parse_double(val.*ptr, data);
  52. }
  53. virtual void write(T const& val, std::ostream & data) const override {
  54. data << val.*ptr;
  55. }
  56. private:
  57. N T::*ptr;
  58. };
  59. template <typename T>
  60. class direct_binder<T, std::string> : public binder_impl<T> {
  61. public:
  62. explicit direct_binder(std::string T::*p) : ptr(p) {}
  63. virtual binder_impl<T>* clone() const override { return new direct_binder(*this); }
  64. virtual void parse(T& val, char const*& data, parser::options) const override {
  65. json::helper::parse_string(val.*ptr, data);
  66. }
  67. virtual void write(T const& val, std::ostream & data) const override {
  68. data << "\"" << val.*ptr << "\"";
  69. }
  70. private:
  71. std::string T::*ptr;
  72. };
  73. } }