wrapper_object.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 <sstream>
  10. #include <string>
  11. #include <json/json.h>
  12. namespace logging { namespace detail {
  13. class object {
  14. private:
  15. void * ptr_;
  16. std::string (*to_string_)(void *);
  17. Json::Value (*to_json_)(void *);
  18. public:
  19. template <typename T> explicit object(T & object);
  20. Json::Value json() const { return to_json_(ptr_); }
  21. private:
  22. friend std::ostream & operator<<(std::ostream & os, object const & obj) {
  23. return os << obj.to_string_(obj.ptr_);
  24. }
  25. template <typename> static std::string to_string_impl(void * ptr);
  26. template <typename> static Json::Value to_json_impl(void * ptr);
  27. };
  28. template <typename T> void to_stream(T const & obj, std::ostream & os) {
  29. os << obj;
  30. }
  31. template <typename T> std::string to_string(T const & obj) {
  32. std::stringstream ss;
  33. to_stream(obj, ss);
  34. return ss.str();
  35. }
  36. template <typename T> Json::Value to_json(T const & obj) {
  37. return to_string(obj);
  38. }
  39. template <typename T> std::string object::to_string_impl(void * ptr) {
  40. return to_string(*static_cast<T *>(ptr));
  41. }
  42. template <typename T> Json::Value object::to_json_impl(void * ptr) {
  43. return to_json(*static_cast<T *>(ptr));
  44. }
  45. template <typename T>
  46. object::object(T & object)
  47. : ptr_(&object), to_string_(&object::to_string_impl<T>),
  48. to_json_(&object::to_json_impl<T>) {}
  49. }}