|
- #pragma once
-
- #include "iomanip.h"
-
- namespace cpplogging
- {
-
- namespace __impl
- {
-
- /* stream_setter */
-
- template<typename T_pred>
- std::ostream& operator<<(std::ostream &os, const stream_setter<T_pred>& x)
- {
- auto lh = dynamic_cast<log_helper*>(&os);
- if (lh)
- x.predicate(*lh->entry);
- return os;
- }
-
- template<typename T_pred>
- constexpr decltype(auto) make_stream_setter(T_pred&& pred)
- { return stream_setter<T_pred> { std::forward<T_pred>(pred) }; }
-
- }
-
- auto level(log_level level)
- {
- return __impl::make_stream_setter([=](log_entry& e){
- e.level = level;
- });
- }
-
- template<typename T_sender>
- auto sender(const T_sender* sender)
- {
- return __impl::make_stream_setter([=](log_entry& e){
- int status;
- auto name = abi::__cxa_demangle(typeid(T_sender).name(), 0, 0, &status);
- e.sender_type = std::string(name ? name : typeid(T_sender).name());
- e.sender = sender;
- });
- }
-
- auto sender_type(const std::string& sender_type)
- {
- return __impl::make_stream_setter([=](log_entry& e){
- e.sender_type = sender_type;
- });
- }
-
- auto file(const char * file)
- {
- return __impl::make_stream_setter([=](log_entry& e){
- e.file = file;
- });
- }
-
- auto line(int line)
- {
- return __impl::make_stream_setter([=](log_entry& e){
- e.line = line;
- });
- }
-
- template<typename T_pred>
- auto manipulate(T_pred&& pred)
- {
- return __impl::make_stream_setter([p=std::forward<T_pred>(pred)](log_entry& e){
- p(e);
- });
- }
-
- }
|