wrapper_object.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // wrapper_object.hpp
  3. // logging
  4. //
  5. // Created by Sam Jaffe on 4/4/19.
  6. //
  7. #pragma once
  8. #include <iostream>
  9. #include <string>
  10. #include <sstream>
  11. #include <json/json.h>
  12. namespace logging { namespace detail {
  13. class object {
  14. public:
  15. template <typename T> explicit object(T & object);
  16. Json::Value json() const { return to_json_(ptr_); }
  17. private:
  18. friend std::ostream & operator<<(std::ostream & os, object const & obj) {
  19. return os << obj.to_string_(obj.ptr_);
  20. }
  21. template <typename> static std::string to_string_impl(void * ptr);
  22. template <typename> static Json::Value to_json_impl(void * ptr);
  23. private:
  24. void * ptr_;
  25. std::string (*to_string_)(void*);
  26. Json::Value (*to_json_)(void*);
  27. };
  28. template <typename T>
  29. void to_stream(T const & obj, std::ostream & os) {
  30. os << obj;
  31. }
  32. template <typename T>
  33. std::string to_string(T const & obj) {
  34. std::stringstream ss;
  35. to_stream(obj, ss);
  36. return ss.str();
  37. }
  38. template <typename T>
  39. Json::Value to_json(T const & obj) {
  40. return to_string(obj);
  41. }
  42. template <typename T>
  43. std::string object::to_string_impl(void * ptr) {
  44. return to_string(*static_cast<T*>(ptr));
  45. }
  46. template <typename T>
  47. Json::Value object::to_json_impl(void * ptr) {
  48. return to_json(*static_cast<T*>(ptr));
  49. }
  50. template <typename T>
  51. object::object(T & object)
  52. : ptr_(&object),
  53. to_string_(&object::to_string_impl<T>),
  54. to_json_(&object::to_json_impl<T>) {
  55. }
  56. } }