You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

76 rivejä
1.7 KiB

  1. #pragma once
  2. #include "iomanip.h"
  3. namespace cpplogging
  4. {
  5. namespace __impl
  6. {
  7. /* stream_setter */
  8. template<typename T_pred>
  9. std::ostream& operator<<(std::ostream &os, const stream_setter<T_pred>& x)
  10. {
  11. auto lh = dynamic_cast<log_helper*>(&os);
  12. if (lh)
  13. x.predicate(*lh->entry);
  14. return os;
  15. }
  16. template<typename T_pred>
  17. constexpr decltype(auto) make_stream_setter(T_pred&& pred)
  18. { return stream_setter<T_pred> { std::forward<T_pred>(pred) }; }
  19. }
  20. auto level(log_level level)
  21. {
  22. return __impl::make_stream_setter([=](log_entry& e){
  23. e.level = level;
  24. });
  25. }
  26. template<typename T_sender>
  27. auto sender(const T_sender* sender)
  28. {
  29. return __impl::make_stream_setter([=](log_entry& e){
  30. int status;
  31. auto name = abi::__cxa_demangle(typeid(T_sender).name(), 0, 0, &status);
  32. e.sender_type = std::string(name ? name : typeid(T_sender).name());
  33. e.sender = sender;
  34. });
  35. }
  36. auto sender_type(const std::string& sender_type)
  37. {
  38. return __impl::make_stream_setter([=](log_entry& e){
  39. e.sender_type = sender_type;
  40. });
  41. }
  42. auto file(const char * file)
  43. {
  44. return __impl::make_stream_setter([=](log_entry& e){
  45. e.file = file;
  46. });
  47. }
  48. auto line(int line)
  49. {
  50. return __impl::make_stream_setter([=](log_entry& e){
  51. e.line = line;
  52. });
  53. }
  54. template<typename T_pred>
  55. auto manipulate(T_pred&& pred)
  56. {
  57. return __impl::make_stream_setter([p=std::forward<T_pred>(pred)](log_entry& e){
  58. p(e);
  59. });
  60. }
  61. }