LLVMFuzzerTestOneInput:
   22|  1.71k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   23|  1.71k|  static std::shared_ptr<spdlog::logger> my_logger;
   24|  1.71k|  if (!my_logger.get()) {
  ------------------
  |  Branch (24:7): [True: 1, False: 1.71k]
  ------------------
   25|      1|    my_logger = spdlog::basic_logger_mt("basic_logger", "/dev/null");
   26|      1|    spdlog::set_default_logger(my_logger);
   27|      1|  }
   28|       |
   29|  1.71k|  if (size == 0) {
  ------------------
  |  Branch (29:7): [True: 0, False: 1.71k]
  ------------------
   30|      0|    return 0;
   31|      0|  }
   32|       |
   33|  1.71k|  FuzzedDataProvider stream(data, size);
   34|  1.71k|  const std::string str = stream.ConsumeRemainingBytesAsString();
   35|  1.71k|  spdlog::set_pattern(str);
   36|       |
   37|  1.71k|  return 0;
   38|  1.71k|}

_ZN6spdlog19file_event_handlersC2Ev:
  332|      1|        : before_open(nullptr),
  333|      1|          after_open(nullptr),
  334|      1|          before_close(nullptr),
  335|      1|          after_close(nullptr) {}

_ZN6spdlog7details10backtracerC2Ev:
   24|      2|    backtracer() = default;

_ZN6spdlog7details10circular_qINS0_14log_msg_bufferEEC2Ev:
   26|      2|    circular_q() = default;

_ZN6spdlog7details13console_mutex5mutexEv:
   14|      1|    static mutex_t &mutex() {
   15|      1|        static mutex_t s_mutex;
   16|      1|        return s_mutex;
   17|      1|    }

_ZN6spdlog7details11file_helperC2ERKNS_19file_event_handlersE:
   22|      1|    : event_handlers_(event_handlers) {}
_ZN6spdlog7details11file_helper15set_buffer_sizeEm:
  106|      1|SPDLOG_INLINE void file_helper::set_buffer_size(size_t buffer_size) {
  107|       |    // Reopen to configure setvbuf before I/O while preserving pending output.
  108|      1|    if (custom_buffer_size_ == buffer_size) {
  ------------------
  |  Branch (108:9): [True: 1, False: 0]
  ------------------
  109|      1|        return;
  110|      1|    }
  111|      0|    if (fd_ != nullptr) {
  ------------------
  |  Branch (111:9): [True: 0, False: 0]
  ------------------
  112|      0|        flush();
  113|      0|    }
  114|      0|    custom_buffer_size_ = buffer_size;
  115|      0|    if (fd_ != nullptr) {
  ------------------
  |  Branch (115:9): [True: 0, False: 0]
  ------------------
  116|      0|        reopen(false);
  117|      0|    }
  118|      0|}
_ZN6spdlog7details11file_helper4openERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb:
   26|      1|SPDLOG_INLINE void file_helper::open(const filename_t &fname, bool truncate) {
   27|      1|    close();
   28|      1|    filename_ = fname;
   29|       |
   30|      1|    auto *mode = SPDLOG_FILENAME_T("ab");
  ------------------
  |  |  140|      1|#define SPDLOG_FILENAME_T(s) s
  ------------------
   31|      1|    auto *trunc_mode = SPDLOG_FILENAME_T("wb");
  ------------------
  |  |  140|      1|#define SPDLOG_FILENAME_T(s) s
  ------------------
   32|       |
   33|      1|    if (event_handlers_.before_open) {
  ------------------
  |  Branch (33:9): [True: 0, False: 1]
  ------------------
   34|      0|        event_handlers_.before_open(filename_);
   35|      0|    }
   36|      1|    for (int tries = 0; tries < open_tries_; ++tries) {
  ------------------
  |  Branch (36:25): [True: 1, False: 0]
  ------------------
   37|       |        // create containing folder if not exists already.
   38|      1|        os::create_dir(os::dir_name(fname));
   39|      1|        if (truncate) {
  ------------------
  |  Branch (39:13): [True: 0, False: 1]
  ------------------
   40|       |            // Truncate by opening-and-closing a tmp file in "wb" mode, always
   41|       |            // opening the actual log-we-write-to in "ab" mode, since that
   42|       |            // interacts more politely with eternal processes that might
   43|       |            // rotate/truncate the file underneath us.
   44|      0|            std::FILE *tmp;
   45|      0|            if (os::fopen_s(&tmp, fname, trunc_mode)) {
  ------------------
  |  Branch (45:17): [True: 0, False: 0]
  ------------------
   46|      0|                continue;
   47|      0|            }
   48|      0|            std::fclose(tmp);
   49|      0|        }
   50|      1|        if (!os::fopen_s(&fd_, fname, mode)) {
  ------------------
  |  Branch (50:13): [True: 1, False: 0]
  ------------------
   51|      1|            if (custom_buffer_size_ > 0) {
  ------------------
  |  Branch (51:17): [True: 0, False: 1]
  ------------------
   52|      0|                custom_buf_.resize(custom_buffer_size_);
   53|      0|                if (std::setvbuf(fd_, custom_buf_.data(), _IOFBF, custom_buffer_size_) != 0) {
  ------------------
  |  Branch (53:21): [True: 0, False: 0]
  ------------------
   54|      0|                    throw_spdlog_ex("Failed to setvbuf on file " + os::filename_to_str(filename_), errno);
   55|      0|                }
   56|      0|            }
   57|      1|            if (event_handlers_.after_open) {
  ------------------
  |  Branch (57:17): [True: 0, False: 1]
  ------------------
   58|      0|                event_handlers_.after_open(filename_, fd_);
   59|      0|            }
   60|      1|            return;
   61|      1|        }
   62|       |
   63|      0|        details::os::sleep_for_millis(open_interval_);
   64|      0|    }
   65|       |
   66|      0|    throw_spdlog_ex("Failed opening file " + os::filename_to_str(filename_) + " for writing",
   67|       |                    errno);
   68|      0|}
_ZN6spdlog7details11file_helper5closeEv:
   89|      2|SPDLOG_INLINE void file_helper::close() {
   90|      2|    if (fd_ != nullptr) {
  ------------------
  |  Branch (90:9): [True: 1, False: 1]
  ------------------
   91|      1|        if (event_handlers_.before_close) {
  ------------------
  |  Branch (91:13): [True: 0, False: 1]
  ------------------
   92|      0|            event_handlers_.before_close(filename_, fd_);
   93|      0|        }
   94|       |
   95|      1|        std::fclose(fd_);
   96|      1|        fd_ = nullptr;
   97|      1|        custom_buf_.clear();
   98|      1|        custom_buf_.shrink_to_fit();
   99|       |
  100|      1|        if (event_handlers_.after_close) {
  ------------------
  |  Branch (100:13): [True: 0, False: 1]
  ------------------
  101|      0|            event_handlers_.after_close(filename_);
  102|      0|        }
  103|      1|    }
  104|      2|}
_ZN6spdlog7details11file_helperD2Ev:
   24|      1|SPDLOG_INLINE file_helper::~file_helper() { close(); }

_ZN6spdlog7details2os11in_terminalEP8_IO_FILE:
  399|      1|SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT {
  400|       |#ifdef _WIN32
  401|       |    return ::_isatty(_fileno(file)) != 0;
  402|       |#else
  403|      1|    return ::isatty(fileno(file)) != 0;
  404|      1|#endif
  405|      1|}
_ZN6spdlog7details2os10create_dirERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  485|      1|SPDLOG_INLINE bool create_dir(const filename_t &path) {
  486|      1|    if (path_exists(path)) {
  ------------------
  |  Branch (486:9): [True: 1, False: 0]
  ------------------
  487|      1|        return true;
  488|      1|    }
  489|       |
  490|      0|    if (path.empty()) {
  ------------------
  |  Branch (490:9): [True: 0, False: 0]
  ------------------
  491|      0|        return false;
  492|      0|    }
  493|       |
  494|      0|    size_t search_offset = 0;
  495|      0|    do {
  496|      0|        auto token_pos = path.find_first_of(folder_seps_filename, search_offset);
  497|       |        // treat the entire path as a folder if no folder separator not found
  498|      0|        if (token_pos == filename_t::npos) {
  ------------------
  |  Branch (498:13): [True: 0, False: 0]
  ------------------
  499|      0|            token_pos = path.size();
  500|      0|        }
  501|       |
  502|      0|        auto subdir = path.substr(0, token_pos);
  503|       |#ifdef _WIN32
  504|       |        // if subdir is just a drive letter, add a slash e.g. "c:"=>"c:\",
  505|       |        // otherwise path_exists(subdir) returns false (issue #3079)
  506|       |        const bool is_drive = subdir.length() == 2 && subdir[1] == ':';
  507|       |        if (is_drive) {
  508|       |            subdir += '\\';
  509|       |            token_pos++;
  510|       |        }
  511|       |#endif
  512|       |
  513|      0|        if (!subdir.empty() && !path_exists(subdir) && !mkdir_(subdir)) {
  ------------------
  |  Branch (513:13): [True: 0, False: 0]
  |  Branch (513:32): [True: 0, False: 0]
  |  Branch (513:56): [True: 0, False: 0]
  ------------------
  514|      0|                if (errno != EEXIST) {
  ------------------
  |  Branch (514:21): [True: 0, False: 0]
  ------------------
  515|      0|                        return false;  // return error if failed creating dir
  516|      0|                }
  517|      0|    }
  518|      0|        search_offset = token_pos + 1;
  519|      0|    } while (search_offset < path.size());
  ------------------
  |  Branch (519:14): [True: 0, False: 0]
  ------------------
  520|       |
  521|      0|    return true;
  522|      0|}
_ZN6spdlog7details2os11path_existsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  180|      1|SPDLOG_INLINE bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT {
  181|       |#ifdef _WIN32
  182|       |    struct _stat buffer;
  183|       |#ifdef SPDLOG_WCHAR_FILENAMES
  184|       |    return (::_wstat(filename.c_str(), &buffer) == 0);
  185|       |#else
  186|       |    return (::_stat(filename.c_str(), &buffer) == 0);
  187|       |#endif
  188|       |#else  // common linux/unix all have the stat system call
  189|      1|    struct stat buffer;
  190|      1|    return (::stat(filename.c_str(), &buffer) == 0);
  191|      1|#endif
  192|      1|}
_ZN6spdlog7details2os8dir_nameERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  529|      1|SPDLOG_INLINE filename_t dir_name(const filename_t &path) {
  530|      1|    auto pos = path.find_last_of(folder_seps_filename);
  531|      1|    return pos != filename_t::npos ? path.substr(0, pos) : filename_t{};
  ------------------
  |  Branch (531:12): [True: 1, False: 0]
  ------------------
  532|      1|}
_ZN6spdlog7details2os7fopen_sEPP8_IO_FILERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEESD_:
  120|      1|SPDLOG_INLINE bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode) {
  121|       |#ifdef _WIN32
  122|       |#ifdef SPDLOG_WCHAR_FILENAMES
  123|       |    *fp = ::_wfsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
  124|       |#else
  125|       |    *fp = ::_fsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
  126|       |#endif
  127|       |#if defined(SPDLOG_PREVENT_CHILD_FD)
  128|       |    if (*fp != nullptr) {
  129|       |        auto file_handle = reinterpret_cast<HANDLE>(_get_osfhandle(::_fileno(*fp)));
  130|       |        if (!::SetHandleInformation(file_handle, HANDLE_FLAG_INHERIT, 0)) {
  131|       |            ::fclose(*fp);
  132|       |            *fp = nullptr;
  133|       |        }
  134|       |    }
  135|       |#endif
  136|       |#else  // unix
  137|       |#if defined(SPDLOG_PREVENT_CHILD_FD)
  138|       |    const int mode_flag = mode == SPDLOG_FILENAME_T("ab") ? O_APPEND : O_TRUNC;
  139|       |    const int fd =
  140|       |        ::open((filename.c_str()), O_CREAT | O_WRONLY | O_CLOEXEC | mode_flag, mode_t(0644));
  141|       |    if (fd == -1) {
  142|       |        return true;
  143|       |    }
  144|       |    *fp = ::fdopen(fd, mode.c_str());
  145|       |    if (*fp == nullptr) {
  146|       |        ::close(fd);
  147|       |    }
  148|       |#else
  149|      1|    *fp = ::fopen((filename.c_str()), mode.c_str());
  150|      1|#endif
  151|      1|#endif
  152|       |
  153|      1|    return *fp == nullptr;
  154|      1|}

_ZN6spdlog7details8registry8instanceEv:
  241|  1.71k|SPDLOG_INLINE registry &registry::instance() {
  242|  1.71k|    static registry s_instance;
  243|  1.71k|    return s_instance;
  244|  1.71k|}
_ZN6spdlog7details8registryC2Ev:
   34|      1|    : formatter_(new pattern_formatter()) {
   35|      1|#ifndef SPDLOG_DISABLE_DEFAULT_LOGGER
   36|       |// create default logger (ansicolor_stdout_sink_mt or wincolor_stdout_sink_mt in windows).
   37|       |#ifdef _WIN32
   38|       |    auto color_sink = std::make_shared<sinks::wincolor_stdout_sink_mt>();
   39|       |#else
   40|      1|    auto color_sink = std::make_shared<sinks::ansicolor_stdout_sink_mt>();
   41|      1|#endif
   42|       |
   43|      1|    const char *default_logger_name = "";
   44|      1|    default_logger_ = std::make_shared<logger>(default_logger_name, std::move(color_sink));
   45|      1|    loggers_[default_logger_name] = default_logger_;
   46|       |
   47|      1|#endif  // SPDLOG_DISABLE_DEFAULT_LOGGER
   48|      1|}
_ZN6spdlog7details8registryD2Ev:
   50|      1|SPDLOG_INLINE registry::~registry() = default;
_ZN6spdlog7details8registry18set_default_loggerENSt3__110shared_ptrINS_6loggerEEE:
  105|      1|SPDLOG_INLINE void registry::set_default_logger(std::shared_ptr<logger> new_default_logger) {
  106|      1|    std::lock_guard<std::mutex> lock(logger_map_mutex_);
  107|      1|    if (new_default_logger != nullptr) {
  ------------------
  |  Branch (107:9): [True: 1, False: 0]
  ------------------
  108|      1|        loggers_[new_default_logger->name()] = new_default_logger;
  109|      1|    }
  110|      1|    default_logger_ = std::move(new_default_logger);
  111|      1|}
_ZN6spdlog7details8registry13set_formatterENSt3__110unique_ptrINS_9formatterENS2_14default_deleteIS4_EEEE:
  124|  1.71k|SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter) {
  125|  1.71k|    std::lock_guard<std::mutex> lock(logger_map_mutex_);
  126|  1.71k|    formatter_ = std::move(formatter);
  127|  3.42k|    for (auto &l : loggers_) {
  ------------------
  |  Branch (127:18): [True: 3.42k, False: 1.71k]
  ------------------
  128|  3.42k|        l.second->set_formatter(formatter_->clone());
  129|  3.42k|    }
  130|  1.71k|}
_ZN6spdlog7details8registry17initialize_loggerENSt3__110shared_ptrINS_6loggerEEE:
   62|      1|SPDLOG_INLINE void registry::initialize_logger(std::shared_ptr<logger> new_logger) {
   63|      1|    std::lock_guard<std::mutex> lock(logger_map_mutex_);
   64|      1|    new_logger->set_formatter(formatter_->clone());
   65|       |
   66|      1|    if (err_handler_) {
  ------------------
  |  Branch (66:9): [True: 0, False: 1]
  ------------------
   67|      0|        new_logger->set_error_handler(err_handler_);
   68|      0|    }
   69|       |
   70|       |    // set new level according to previously configured level or default level
   71|      1|    auto it = log_levels_.find(new_logger->name());
   72|      1|    auto new_level = it != log_levels_.end() ? it->second : global_log_level_;
  ------------------
  |  Branch (72:22): [True: 0, False: 1]
  ------------------
   73|      1|    new_logger->set_level(new_level);
   74|       |
   75|      1|    new_logger->flush_on(flush_level_);
   76|       |
   77|      1|    if (backtrace_n_messages_ > 0) {
  ------------------
  |  Branch (77:9): [True: 0, False: 1]
  ------------------
   78|      0|        new_logger->enable_backtrace(backtrace_n_messages_);
   79|      0|    }
   80|       |
   81|      1|    if (automatic_registration_) {
  ------------------
  |  Branch (81:9): [True: 1, False: 0]
  ------------------
   82|      1|        register_logger_(std::move(new_logger));
   83|      1|    }
   84|      1|}
_ZN6spdlog7details8registry16register_logger_ENSt3__110shared_ptrINS_6loggerEEE:
  259|      1|SPDLOG_INLINE void registry::register_logger_(std::shared_ptr<logger> new_logger) {
  260|      1|    const auto &logger_name = new_logger->name();
  261|      1|    throw_if_exists_(logger_name);
  262|      1|    loggers_[logger_name] = std::move(new_logger);
  263|      1|}
_ZN6spdlog7details8registry16throw_if_exists_ERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  253|      1|SPDLOG_INLINE void registry::throw_if_exists_(const std::string &logger_name) {
  254|      1|    if (loggers_.find(logger_name) != loggers_.end()) {
  ------------------
  |  Branch (254:9): [True: 0, False: 1]
  ------------------
  255|      0|        throw_spdlog_ex("logger with name '" + logger_name + "' already exists");
  256|      0|    }
  257|      1|}

_ZN6spdlog19synchronous_factory6createINS_5sinks15basic_file_sinkINSt3__15mutexEEEJRKNS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERbRKNS_19file_event_handlersERmEEENS4_10shared_ptrINS_6loggerEEESC_DpOT0_:
   15|      1|    static std::shared_ptr<logger> create(std::string logger_name, SinkArgs &&...args) {
   16|      1|        auto sink = std::make_shared<Sink>(std::forward<SinkArgs>(args)...);
   17|      1|        auto new_logger = std::make_shared<logger>(std::move(logger_name), std::move(sink));
   18|      1|        details::registry::instance().initialize_logger(new_logger);
   19|      1|        return new_logger;
   20|      1|    }

_ZN3fmt3v126detail6bufferIcE4dataEv:
 1821|  10.2k|  FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; }
_ZN3fmt3v126detail6bufferIcEC2EPFvRS3_mEPcmm:
 1790|  10.2k|      : ptr_(p), size_(sz), capacity_(cap), grow_(grow) {}
_ZN3fmt3v126detail6bufferIcE3setEPcm:
 1796|  10.2k|  FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept {
 1797|  10.2k|    ptr_ = buf_data;
 1798|  10.2k|    capacity_ = buf_capacity;
 1799|  10.2k|  }
_ZNK3fmt3v1217basic_string_viewIcE4dataEv:
  564|      7|  constexpr auto data() const noexcept -> const Char* { return data_; }
_ZNK3fmt3v1217basic_string_viewIcE4sizeEv:
  567|      7|  constexpr auto size() const noexcept -> size_t { return size_; }
_ZN3fmt3v1217basic_string_viewIcEC2EPKc:
  543|     27|  FMT_CONSTEXPR20 basic_string_view(const Char* s) : data_(s) {
  544|     27|#if FMT_HAS_BUILTIN(__builtin_strlen) || FMT_GCC_VERSION || FMT_CLANG_VERSION
  545|     27|    if (std::is_same<Char, char>::value && !detail::is_constant_evaluated()) {
  ------------------
  |  Branch (545:9): [True: 0, Folded]
  |  Branch (545:44): [True: 0, Folded]
  ------------------
  546|     27|      size_ = __builtin_strlen(detail::narrow(s));  // strlen is not constexpr.
  547|     27|      return;
  548|     27|    }
  549|      0|#endif
  550|      0|    size_t len = 0;
  551|      0|    while (*s++) ++len;
  ------------------
  |  Branch (551:12): [True: 0, False: 0]
  ------------------
  552|      0|    size_ = len;
  553|      0|  }
_ZN3fmt3v126detail6narrowEPKc:
  469|     27|constexpr FMT_ALWAYS_INLINE auto narrow(const char* s) -> const char* {
  470|     27|  return s;
  471|     27|}

_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEEC2ERKS4_:
  840|  10.2k|      : detail::buffer<T>(grow), alloc_(alloc) {
  841|  10.2k|    this->set(store_, SIZE);
  842|  10.2k|    if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T());
  ------------------
  |  Branch (842:9): [Folded, False: 10.2k]
  ------------------
  843|  10.2k|  }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEED2Ev:
  844|  10.2k|  FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEE10deallocateEv:
  805|  10.2k|  FMT_CONSTEXPR20 void deallocate() {
  806|  10.2k|    T* data = this->data();
  807|  10.2k|    if (data != store_) alloc_.deallocate(data, this->capacity());
  ------------------
  |  Branch (807:9): [True: 0, False: 10.2k]
  ------------------
  808|  10.2k|  }

_ZN6spdlog9formatterD2Ev:
   13|  5.13k|    virtual ~formatter() = default;

_ZNK6spdlog6logger4nameEv:
   68|      3|SPDLOG_INLINE const std::string &logger::name() const { return name_; }
_ZN6spdlog6logger13set_formatterENSt3__110unique_ptrINS_9formatterENS1_14default_deleteIS3_EEEE:
   72|  3.42k|SPDLOG_INLINE void logger::set_formatter(std::unique_ptr<formatter> f) {
   73|  3.42k|    for (auto it = sinks_.begin(); it != sinks_.end(); ++it) {
  ------------------
  |  Branch (73:36): [True: 3.42k, False: 0]
  ------------------
   74|  3.42k|        if (std::next(it) == sinks_.end()) {
  ------------------
  |  Branch (74:13): [True: 3.42k, False: 0]
  ------------------
   75|       |            // last element - we can be move it.
   76|  3.42k|            (*it)->set_formatter(std::move(f));
   77|  3.42k|            break;  // to prevent clang-tidy warning
   78|  3.42k|        } else {
   79|      0|            (*it)->set_formatter(f->clone());
   80|      0|        }
   81|  3.42k|    }
   82|  3.42k|}
_ZN6spdlog6logger9set_levelENS_5level10level_enumE:
   62|      1|SPDLOG_INLINE void logger::set_level(level::level_enum log_level) { level_.store(log_level); }
_ZN6spdlog6logger8flush_onENS_5level10level_enumE:
  100|      1|SPDLOG_INLINE void logger::flush_on(level::level_enum log_level) { flush_level_.store(log_level); }

_ZN6spdlog6loggerC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_10shared_ptrINS_5sinks4sinkEEE:
   65|      2|        : logger(std::move(name), {std::move(single_sink)}) {}
_ZN6spdlog6loggerC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEESt16initializer_listINS1_10shared_ptrINS_5sinks4sinkEEEE:
   69|      2|        : logger(std::move(name), sinks.begin(), sinks.end()) {}
_ZN6spdlog6loggerC2IPKNSt3__110shared_ptrINS_5sinks4sinkEEEEENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEET_SF_:
   60|      2|        : name_(std::move(name)),
   61|      2|          sinks_(begin, end) {}
_ZN6spdlog6loggerD2Ev:
   71|      2|    virtual ~logger() = default;

_ZNK6spdlog17pattern_formatter5cloneEv:
  977|  3.42k|SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const {
  978|  3.42k|    custom_flags cloned_custom_formatters;
  979|  3.42k|    for (auto &it : custom_handlers_) {
  ------------------
  |  Branch (979:19): [True: 0, False: 3.42k]
  ------------------
  980|      0|        cloned_custom_formatters[it.first] = it.second->clone();
  981|      0|    }
  982|  3.42k|    auto cloned = details::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_,
  983|  3.42k|                                                          std::move(cloned_custom_formatters));
  984|  3.42k|    cloned->need_localtime(need_localtime_);
  985|  3.42k|#if defined(__GNUC__) && __GNUC__ < 5
  986|  3.42k|    return std::move(cloned);
  987|       |#else
  988|       |    return cloned;
  989|       |#endif
  990|  3.42k|}
_ZN6spdlog17pattern_formatter14need_localtimeEb:
 1015|  3.42k|SPDLOG_INLINE void pattern_formatter::need_localtime(bool need) { need_localtime_ = need; }
_ZN6spdlog17pattern_formatterC2ENS_17pattern_time_typeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  968|      3|    : pattern_("%+"),
  969|      3|      eol_(std::move(eol)),
  970|      3|      pattern_time_type_(time_type),
  971|      3|      need_localtime_(true),
  972|      3|      last_log_secs_(0) {
  973|      3|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  974|      3|    formatters_.push_back(details::make_unique<details::full_formatter>(details::padding_info{}));
  975|      3|}
_ZN6spdlog7details14full_formatterC2ENS0_12padding_infoE:
  856|  10.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details13mdc_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  816|  2.76M|        : flag_formatter(padinfo) {}
_ZN6spdlog17pattern_formatterC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_17pattern_time_typeES7_NS1_13unordered_mapIcNS1_10unique_ptrINS_21custom_flag_formatterENS1_14default_deleteISB_EEEENS1_4hashIcEENS1_8equal_toIcEENS5_INS1_4pairIKcSE_EEEEEE:
  956|  5.13k|    : pattern_(std::move(pattern)),
  957|  5.13k|      eol_(std::move(eol)),
  958|  5.13k|      pattern_time_type_(time_type),
  959|  5.13k|      need_localtime_(false),
  960|  5.13k|      last_log_secs_(0),
  961|  5.13k|      custom_handlers_(std::move(custom_user_flags)) {
  962|  5.13k|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  963|  5.13k|    compile_pattern_(pattern_);
  964|  5.13k|}
_ZN6spdlog17pattern_formatter16compile_pattern_ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1318|  5.13k|SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &pattern) {
 1319|  5.13k|    auto end = pattern.end();
 1320|  5.13k|    std::unique_ptr<details::aggregate_formatter> user_chars;
 1321|  5.13k|    formatters_.clear();
 1322|  54.1M|    for (auto it = pattern.begin(); it != end; ++it) {
  ------------------
  |  Branch (1322:37): [True: 54.1M, False: 4.21k]
  ------------------
 1323|  54.1M|        if (*it == '%') {
  ------------------
  |  Branch (1323:13): [True: 7.55M, False: 46.5M]
  ------------------
 1324|  7.55M|            if (user_chars)  // append user chars found so far
  ------------------
  |  Branch (1324:17): [True: 3.37M, False: 4.17M]
  ------------------
 1325|  3.37M|            {
 1326|  3.37M|                formatters_.push_back(std::move(user_chars));
 1327|  3.37M|            }
 1328|       |
 1329|  7.55M|            auto padding = handle_padspec_(++it, end);
 1330|       |
 1331|  7.55M|            if (it != end) {
  ------------------
  |  Branch (1331:17): [True: 7.55M, False: 921]
  ------------------
 1332|  7.55M|                if (padding.enabled()) {
  ------------------
  |  Branch (1332:21): [True: 1.47M, False: 6.07M]
  ------------------
 1333|  1.47M|                    handle_flag_<details::scoped_padder>(*it, padding);
 1334|  6.07M|                } else {
 1335|  6.07M|                    handle_flag_<details::null_scoped_padder>(*it, padding);
 1336|  6.07M|                }
 1337|  7.55M|            } else {
 1338|    921|                break;
 1339|    921|            }
 1340|  7.55M|        } else  // chars not following the % sign should be displayed as is
 1341|  46.5M|        {
 1342|  46.5M|            if (!user_chars) {
  ------------------
  |  Branch (1342:17): [True: 3.37M, False: 43.1M]
  ------------------
 1343|  3.37M|                user_chars = details::make_unique<details::aggregate_formatter>();
 1344|  3.37M|            }
 1345|  46.5M|            user_chars->add_ch(*it);
 1346|  46.5M|        }
 1347|  54.1M|    }
 1348|  5.13k|    if (user_chars)  // append raw chars found so far
  ------------------
  |  Branch (1348:9): [True: 954, False: 4.18k]
  ------------------
 1349|    954|    {
 1350|    954|        formatters_.push_back(std::move(user_chars));
 1351|    954|    }
 1352|  5.13k|}
_ZN6spdlog17pattern_formatter15handle_padspec_ERNSt3__111__wrap_iterIPKcEES5_:
 1274|  7.55M|    std::string::const_iterator &it, std::string::const_iterator end) {
 1275|  7.55M|    using details::padding_info;
 1276|  7.55M|    using details::scoped_padder;
 1277|  7.55M|    const size_t max_width = 64;
 1278|  7.55M|    if (it == end) {
  ------------------
  |  Branch (1278:9): [True: 288, False: 7.55M]
  ------------------
 1279|    288|        return padding_info{};
 1280|    288|    }
 1281|       |
 1282|  7.55M|    padding_info::pad_side side;
 1283|  7.55M|    switch (*it) {
 1284|  43.0k|        case '-':
  ------------------
  |  Branch (1284:9): [True: 43.0k, False: 7.51M]
  ------------------
 1285|  43.0k|            side = padding_info::pad_side::right;
 1286|  43.0k|            ++it;
 1287|  43.0k|            break;
 1288|  4.82k|        case '=':
  ------------------
  |  Branch (1288:9): [True: 4.82k, False: 7.54M]
  ------------------
 1289|  4.82k|            side = padding_info::pad_side::center;
 1290|  4.82k|            ++it;
 1291|  4.82k|            break;
 1292|  7.50M|        default:
  ------------------
  |  Branch (1292:9): [True: 7.50M, False: 47.8k]
  ------------------
 1293|  7.50M|            side = details::padding_info::pad_side::left;
 1294|  7.50M|            break;
 1295|  7.55M|    }
 1296|       |
 1297|  7.55M|    if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
  ------------------
  |  Branch (1297:9): [True: 54, False: 7.55M]
  |  Branch (1297:22): [True: 6.07M, False: 1.47M]
  ------------------
 1298|  6.07M|        return padding_info{};  // no padding if no digit found here
 1299|  6.07M|    }
 1300|       |
 1301|  1.47M|    auto width = static_cast<size_t>(*it) - '0';
 1302|  3.29M|    for (++it; it != end && std::isdigit(static_cast<unsigned char>(*it)); ++it) {
  ------------------
  |  Branch (1302:16): [True: 3.29M, False: 552]
  |  Branch (1302:29): [True: 1.81M, False: 1.47M]
  ------------------
 1303|  1.81M|        auto digit = static_cast<size_t>(*it) - '0';
 1304|  1.81M|        width = width * 10 + digit;
 1305|  1.81M|    }
 1306|       |
 1307|       |    // search for the optional truncate marker '!'
 1308|  1.47M|    bool truncate;
 1309|  1.47M|    if (it != end && *it == '!') {
  ------------------
  |  Branch (1309:9): [True: 1.47M, False: 552]
  |  Branch (1309:22): [True: 49.7k, False: 1.42M]
  ------------------
 1310|  49.7k|        truncate = true;
 1311|  49.7k|        ++it;
 1312|  1.42M|    } else {
 1313|  1.42M|        truncate = false;
 1314|  1.42M|    }
 1315|  1.47M|    return details::padding_info{std::min<size_t>(width, max_width), side, truncate};
 1316|  7.55M|}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details13scoped_padderEEEvcNS2_12padding_infoE:
 1025|  1.47M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1026|       |    // process custom flags
 1027|  1.47M|    auto it = custom_handlers_.find(flag);
 1028|  1.47M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 1.47M]
  ------------------
 1029|      0|        auto custom_handler = it->second->clone();
 1030|      0|        custom_handler->set_padding_info(padding);
 1031|      0|        formatters_.push_back(std::move(custom_handler));
 1032|      0|        return;
 1033|      0|    }
 1034|       |
 1035|       |    // process built-in flags
 1036|  1.47M|    switch (flag) {
 1037|  4.90k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1037:9): [True: 4.90k, False: 1.47M]
  ------------------
 1038|  4.90k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1039|  4.90k|            need_localtime_ = true;
 1040|  4.90k|            break;
 1041|       |
 1042|  4.87k|        case 'n':  // logger name
  ------------------
  |  Branch (1042:9): [True: 4.87k, False: 1.47M]
  ------------------
 1043|  4.87k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1044|  4.87k|            break;
 1045|       |
 1046|  18.9k|        case 'l':  // level
  ------------------
  |  Branch (1046:9): [True: 18.9k, False: 1.45M]
  ------------------
 1047|  18.9k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1048|  18.9k|            break;
 1049|       |
 1050|  4.65k|        case 'L':  // short level
  ------------------
  |  Branch (1050:9): [True: 4.65k, False: 1.47M]
  ------------------
 1051|  4.65k|            formatters_.push_back(
 1052|  4.65k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1053|  4.65k|            break;
 1054|       |
 1055|  18.8k|        case ('t'):  // thread id
  ------------------
  |  Branch (1055:9): [True: 18.8k, False: 1.45M]
  ------------------
 1056|  18.8k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1057|  18.8k|            break;
 1058|       |
 1059|  23.7k|        case ('v'):  // the message text
  ------------------
  |  Branch (1059:9): [True: 23.7k, False: 1.45M]
  ------------------
 1060|  23.7k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1061|  23.7k|            break;
 1062|       |
 1063|  24.7k|        case ('a'):  // weekday
  ------------------
  |  Branch (1063:9): [True: 24.7k, False: 1.45M]
  ------------------
 1064|  24.7k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1065|  24.7k|            need_localtime_ = true;
 1066|  24.7k|            break;
 1067|       |
 1068|  7.04k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1068:9): [True: 7.04k, False: 1.46M]
  ------------------
 1069|  7.04k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1070|  7.04k|            need_localtime_ = true;
 1071|  7.04k|            break;
 1072|       |
 1073|  3.79k|        case ('b'):
  ------------------
  |  Branch (1073:9): [True: 3.79k, False: 1.47M]
  ------------------
 1074|  6.16k|        case ('h'):  // month
  ------------------
  |  Branch (1074:9): [True: 2.37k, False: 1.47M]
  ------------------
 1075|  6.16k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1076|  6.16k|            need_localtime_ = true;
 1077|  6.16k|            break;
 1078|       |
 1079|  17.1k|        case ('B'):  // short month
  ------------------
  |  Branch (1079:9): [True: 17.1k, False: 1.45M]
  ------------------
 1080|  17.1k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1081|  17.1k|            need_localtime_ = true;
 1082|  17.1k|            break;
 1083|       |
 1084|  5.19k|        case ('c'):  // datetime
  ------------------
  |  Branch (1084:9): [True: 5.19k, False: 1.47M]
  ------------------
 1085|  5.19k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1086|  5.19k|            need_localtime_ = true;
 1087|  5.19k|            break;
 1088|       |
 1089|  2.14k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1089:9): [True: 2.14k, False: 1.47M]
  ------------------
 1090|  2.14k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1091|  2.14k|            need_localtime_ = true;
 1092|  2.14k|            break;
 1093|       |
 1094|  19.6k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1094:9): [True: 19.6k, False: 1.45M]
  ------------------
 1095|  19.6k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1096|  19.6k|            need_localtime_ = true;
 1097|  19.6k|            break;
 1098|       |
 1099|  8.32k|        case ('D'):
  ------------------
  |  Branch (1099:9): [True: 8.32k, False: 1.46M]
  ------------------
 1100|  33.0k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1100:9): [True: 24.7k, False: 1.45M]
  ------------------
 1101|  33.0k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1102|  33.0k|            need_localtime_ = true;
 1103|  33.0k|            break;
 1104|       |
 1105|  44.4k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1105:9): [True: 44.4k, False: 1.43M]
  ------------------
 1106|  44.4k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1107|  44.4k|            need_localtime_ = true;
 1108|  44.4k|            break;
 1109|       |
 1110|  8.63k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1110:9): [True: 8.63k, False: 1.46M]
  ------------------
 1111|  8.63k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1112|  8.63k|            need_localtime_ = true;
 1113|  8.63k|            break;
 1114|       |
 1115|  4.58k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1115:9): [True: 4.58k, False: 1.47M]
  ------------------
 1116|  4.58k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1117|  4.58k|            need_localtime_ = true;
 1118|  4.58k|            break;
 1119|       |
 1120|  48.0k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1120:9): [True: 48.0k, False: 1.42M]
  ------------------
 1121|  48.0k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1122|  48.0k|            need_localtime_ = true;
 1123|  48.0k|            break;
 1124|       |
 1125|  43.4k|        case ('M'):  // minutes
  ------------------
  |  Branch (1125:9): [True: 43.4k, False: 1.43M]
  ------------------
 1126|  43.4k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1127|  43.4k|            need_localtime_ = true;
 1128|  43.4k|            break;
 1129|       |
 1130|  9.78k|        case ('S'):  // seconds
  ------------------
  |  Branch (1130:9): [True: 9.78k, False: 1.46M]
  ------------------
 1131|  9.78k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1132|  9.78k|            need_localtime_ = true;
 1133|  9.78k|            break;
 1134|       |
 1135|  21.6k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1135:9): [True: 21.6k, False: 1.45M]
  ------------------
 1136|  21.6k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1137|  21.6k|            break;
 1138|       |
 1139|  50.3k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1139:9): [True: 50.3k, False: 1.42M]
  ------------------
 1140|  50.3k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1141|  50.3k|            break;
 1142|       |
 1143|   144k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1143:9): [True: 144k, False: 1.33M]
  ------------------
 1144|   144k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1145|   144k|            break;
 1146|       |
 1147|   108k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1147:9): [True: 108k, False: 1.36M]
  ------------------
 1148|   108k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1149|   108k|            break;
 1150|       |
 1151|  26.4k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1151:9): [True: 26.4k, False: 1.45M]
  ------------------
 1152|  26.4k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1153|  26.4k|            need_localtime_ = true;
 1154|  26.4k|            break;
 1155|       |
 1156|  58.2k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1156:9): [True: 58.2k, False: 1.41M]
  ------------------
 1157|  58.2k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1158|  58.2k|            need_localtime_ = true;
 1159|  58.2k|            break;
 1160|       |
 1161|  12.3k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1161:9): [True: 12.3k, False: 1.46M]
  ------------------
 1162|  12.3k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1163|  12.3k|            need_localtime_ = true;
 1164|  12.3k|            break;
 1165|       |
 1166|  8.92k|        case ('T'):
  ------------------
  |  Branch (1166:9): [True: 8.92k, False: 1.46M]
  ------------------
 1167|  51.4k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1167:9): [True: 42.5k, False: 1.43M]
  ------------------
 1168|  51.4k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1169|  51.4k|            need_localtime_ = true;
 1170|  51.4k|            break;
 1171|  6.46k|        case ('z'):  // timezone
  ------------------
  |  Branch (1171:9): [True: 6.46k, False: 1.47M]
  ------------------
 1172|  6.46k|            formatters_.push_back(
 1173|  6.46k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1174|  6.46k|            need_localtime_ = true;
 1175|  6.46k|            break;
 1176|  91.3k|        case ('P'):  // pid
  ------------------
  |  Branch (1176:9): [True: 91.3k, False: 1.38M]
  ------------------
 1177|  91.3k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1178|  91.3k|            break;
 1179|       |
 1180|  1.24k|        case ('^'):  // color range start
  ------------------
  |  Branch (1180:9): [True: 1.24k, False: 1.47M]
  ------------------
 1181|  1.24k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1182|  1.24k|            break;
 1183|       |
 1184|  29.4k|        case ('$'):  // color range end
  ------------------
  |  Branch (1184:9): [True: 29.4k, False: 1.44M]
  ------------------
 1185|  29.4k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1186|  29.4k|            break;
 1187|       |
 1188|  5.62k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1188:9): [True: 5.62k, False: 1.47M]
  ------------------
 1189|  5.62k|            formatters_.push_back(
 1190|  5.62k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1191|  5.62k|            break;
 1192|       |
 1193|  4.30k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1193:9): [True: 4.30k, False: 1.47M]
  ------------------
 1194|  4.30k|            formatters_.push_back(
 1195|  4.30k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1196|  4.30k|            break;
 1197|       |
 1198|  10.4k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1198:9): [True: 10.4k, False: 1.46M]
  ------------------
 1199|  10.4k|            formatters_.push_back(
 1200|  10.4k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1201|  10.4k|            break;
 1202|       |
 1203|  83.8k|        case ('#'):  // source line number
  ------------------
  |  Branch (1203:9): [True: 83.8k, False: 1.39M]
  ------------------
 1204|  83.8k|            formatters_.push_back(
 1205|  83.8k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1206|  83.8k|            break;
 1207|       |
 1208|  22.9k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1208:9): [True: 22.9k, False: 1.45M]
  ------------------
 1209|  22.9k|            formatters_.push_back(
 1210|  22.9k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1211|  22.9k|            break;
 1212|       |
 1213|   168k|        case ('%'):  // % char
  ------------------
  |  Branch (1213:9): [True: 168k, False: 1.30M]
  ------------------
 1214|   168k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1215|   168k|            break;
 1216|       |
 1217|  6.83k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1217:9): [True: 6.83k, False: 1.46M]
  ------------------
 1218|  6.83k|            formatters_.push_back(
 1219|  6.83k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1220|  6.83k|                    padding));
 1221|  6.83k|            break;
 1222|       |
 1223|  3.57k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1223:9): [True: 3.57k, False: 1.47M]
  ------------------
 1224|  3.57k|            formatters_.push_back(
 1225|  3.57k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1226|  3.57k|                    padding));
 1227|  3.57k|            break;
 1228|       |
 1229|  18.6k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1229:9): [True: 18.6k, False: 1.45M]
  ------------------
 1230|  18.6k|            formatters_.push_back(
 1231|  18.6k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1232|  18.6k|                    padding));
 1233|  18.6k|            break;
 1234|       |
 1235|  58.2k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1235:9): [True: 58.2k, False: 1.41M]
  ------------------
 1236|  58.2k|            formatters_.push_back(
 1237|  58.2k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1238|  58.2k|                    padding));
 1239|  58.2k|            break;
 1240|       |
 1241|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1242|  1.84k|        case ('&'):
  ------------------
  |  Branch (1242:9): [True: 1.84k, False: 1.47M]
  ------------------
 1243|  1.84k|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1244|  1.84k|            break;
 1245|      0|#endif
 1246|       |
 1247|   140k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1247:9): [True: 140k, False: 1.33M]
  ------------------
 1248|   140k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1249|       |
 1250|   140k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1250:17): [True: 129k, False: 11.5k]
  ------------------
 1251|   129k|                unknown_flag->add_ch('%');
 1252|   129k|                unknown_flag->add_ch(flag);
 1253|   129k|                formatters_.push_back((std::move(unknown_flag)));
 1254|   129k|            }
 1255|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1256|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1257|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1258|  11.5k|            else {
 1259|  11.5k|                padding.truncate_ = false;
 1260|  11.5k|                formatters_.push_back(
 1261|  11.5k|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1262|  11.5k|                unknown_flag->add_ch(flag);
 1263|  11.5k|                formatters_.push_back((std::move(unknown_flag)));
 1264|  11.5k|            }
 1265|       |
 1266|   140k|            break;
 1267|  1.47M|    }
 1268|  1.47M|}
_ZN6spdlog7details14name_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  107|  4.87k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  120|  18.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  134|  4.65k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  575|  18.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  603|  23.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  158|  24.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  175|  7.04k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  192|  6.16k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  210|  17.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  224|  5.19k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  254|  2.14k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  287|  19.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  268|  33.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  301|  44.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  315|  8.63k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  329|  4.58k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  343|  48.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  357|  43.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  371|  9.78k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  385|  21.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  400|  50.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  416|   144k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  431|   108k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  447|  26.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  461|  58.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  482|  12.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  499|  51.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  519|  6.46k|        : flag_formatter(padinfo),
  520|  6.46k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  589|  91.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21color_start_formatterC2ENS0_12padding_infoE:
  642|  38.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details20color_stop_formatterC2ENS0_12padding_infoE:
  652|  81.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  664|  5.62k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  711|  4.30k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  693|  10.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  752|  83.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  771|  34.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details12ch_formatterC2Ec:
  614|   604k|        : ch_(ch) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  792|  6.83k|        : flag_formatter(padinfo),
  793|  6.83k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  792|  3.57k|        : flag_formatter(padinfo),
  793|  3.57k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  792|  18.6k|        : flag_formatter(padinfo),
  793|  18.6k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  792|  58.2k|        : flag_formatter(padinfo),
  793|  58.2k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details13mdc_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  816|  1.84k|        : flag_formatter(padinfo) {}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details18null_scoped_padderEEEvcNS2_12padding_infoE:
 1025|  6.07M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1026|       |    // process custom flags
 1027|  6.07M|    auto it = custom_handlers_.find(flag);
 1028|  6.07M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1028:9): [True: 0, False: 6.07M]
  ------------------
 1029|      0|        auto custom_handler = it->second->clone();
 1030|      0|        custom_handler->set_padding_info(padding);
 1031|      0|        formatters_.push_back(std::move(custom_handler));
 1032|      0|        return;
 1033|      0|    }
 1034|       |
 1035|       |    // process built-in flags
 1036|  6.07M|    switch (flag) {
 1037|  5.29k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1037:9): [True: 5.29k, False: 6.07M]
  ------------------
 1038|  5.29k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1039|  5.29k|            need_localtime_ = true;
 1040|  5.29k|            break;
 1041|       |
 1042|  15.7k|        case 'n':  // logger name
  ------------------
  |  Branch (1042:9): [True: 15.7k, False: 6.06M]
  ------------------
 1043|  15.7k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1044|  15.7k|            break;
 1045|       |
 1046|  3.89k|        case 'l':  // level
  ------------------
  |  Branch (1046:9): [True: 3.89k, False: 6.07M]
  ------------------
 1047|  3.89k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1048|  3.89k|            break;
 1049|       |
 1050|  48.7k|        case 'L':  // short level
  ------------------
  |  Branch (1050:9): [True: 48.7k, False: 6.02M]
  ------------------
 1051|  48.7k|            formatters_.push_back(
 1052|  48.7k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1053|  48.7k|            break;
 1054|       |
 1055|  73.5k|        case ('t'):  // thread id
  ------------------
  |  Branch (1055:9): [True: 73.5k, False: 6.00M]
  ------------------
 1056|  73.5k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1057|  73.5k|            break;
 1058|       |
 1059|  3.46k|        case ('v'):  // the message text
  ------------------
  |  Branch (1059:9): [True: 3.46k, False: 6.07M]
  ------------------
 1060|  3.46k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1061|  3.46k|            break;
 1062|       |
 1063|  11.6k|        case ('a'):  // weekday
  ------------------
  |  Branch (1063:9): [True: 11.6k, False: 6.06M]
  ------------------
 1064|  11.6k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1065|  11.6k|            need_localtime_ = true;
 1066|  11.6k|            break;
 1067|       |
 1068|  4.00k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1068:9): [True: 4.00k, False: 6.07M]
  ------------------
 1069|  4.00k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1070|  4.00k|            need_localtime_ = true;
 1071|  4.00k|            break;
 1072|       |
 1073|  5.25k|        case ('b'):
  ------------------
  |  Branch (1073:9): [True: 5.25k, False: 6.07M]
  ------------------
 1074|  10.6k|        case ('h'):  // month
  ------------------
  |  Branch (1074:9): [True: 5.35k, False: 6.07M]
  ------------------
 1075|  10.6k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1076|  10.6k|            need_localtime_ = true;
 1077|  10.6k|            break;
 1078|       |
 1079|  8.07k|        case ('B'):  // short month
  ------------------
  |  Branch (1079:9): [True: 8.07k, False: 6.06M]
  ------------------
 1080|  8.07k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1081|  8.07k|            need_localtime_ = true;
 1082|  8.07k|            break;
 1083|       |
 1084|  11.0k|        case ('c'):  // datetime
  ------------------
  |  Branch (1084:9): [True: 11.0k, False: 6.06M]
  ------------------
 1085|  11.0k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1086|  11.0k|            need_localtime_ = true;
 1087|  11.0k|            break;
 1088|       |
 1089|  4.09k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1089:9): [True: 4.09k, False: 6.07M]
  ------------------
 1090|  4.09k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1091|  4.09k|            need_localtime_ = true;
 1092|  4.09k|            break;
 1093|       |
 1094|  2.16k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1094:9): [True: 2.16k, False: 6.07M]
  ------------------
 1095|  2.16k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1096|  2.16k|            need_localtime_ = true;
 1097|  2.16k|            break;
 1098|       |
 1099|  36.7k|        case ('D'):
  ------------------
  |  Branch (1099:9): [True: 36.7k, False: 6.03M]
  ------------------
 1100|  53.6k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1100:9): [True: 16.8k, False: 6.05M]
  ------------------
 1101|  53.6k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1102|  53.6k|            need_localtime_ = true;
 1103|  53.6k|            break;
 1104|       |
 1105|  8.43k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1105:9): [True: 8.43k, False: 6.06M]
  ------------------
 1106|  8.43k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1107|  8.43k|            need_localtime_ = true;
 1108|  8.43k|            break;
 1109|       |
 1110|  56.3k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1110:9): [True: 56.3k, False: 6.01M]
  ------------------
 1111|  56.3k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1112|  56.3k|            need_localtime_ = true;
 1113|  56.3k|            break;
 1114|       |
 1115|   403k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1115:9): [True: 403k, False: 5.67M]
  ------------------
 1116|   403k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1117|   403k|            need_localtime_ = true;
 1118|   403k|            break;
 1119|       |
 1120|  12.5k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1120:9): [True: 12.5k, False: 6.06M]
  ------------------
 1121|  12.5k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1122|  12.5k|            need_localtime_ = true;
 1123|  12.5k|            break;
 1124|       |
 1125|   408k|        case ('M'):  // minutes
  ------------------
  |  Branch (1125:9): [True: 408k, False: 5.66M]
  ------------------
 1126|   408k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1127|   408k|            need_localtime_ = true;
 1128|   408k|            break;
 1129|       |
 1130|   402k|        case ('S'):  // seconds
  ------------------
  |  Branch (1130:9): [True: 402k, False: 5.67M]
  ------------------
 1131|   402k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1132|   402k|            need_localtime_ = true;
 1133|   402k|            break;
 1134|       |
 1135|  25.1k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1135:9): [True: 25.1k, False: 6.05M]
  ------------------
 1136|  25.1k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1137|  25.1k|            break;
 1138|       |
 1139|   207k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1139:9): [True: 207k, False: 5.86M]
  ------------------
 1140|   207k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1141|   207k|            break;
 1142|       |
 1143|  7.04k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1143:9): [True: 7.04k, False: 6.06M]
  ------------------
 1144|  7.04k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1145|  7.04k|            break;
 1146|       |
 1147|  14.5k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1147:9): [True: 14.5k, False: 6.06M]
  ------------------
 1148|  14.5k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1149|  14.5k|            break;
 1150|       |
 1151|  1.65k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1151:9): [True: 1.65k, False: 6.07M]
  ------------------
 1152|  1.65k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1153|  1.65k|            need_localtime_ = true;
 1154|  1.65k|            break;
 1155|       |
 1156|  37.0k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1156:9): [True: 37.0k, False: 6.03M]
  ------------------
 1157|  37.0k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1158|  37.0k|            need_localtime_ = true;
 1159|  37.0k|            break;
 1160|       |
 1161|  2.77k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1161:9): [True: 2.77k, False: 6.07M]
  ------------------
 1162|  2.77k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1163|  2.77k|            need_localtime_ = true;
 1164|  2.77k|            break;
 1165|       |
 1166|  4.31k|        case ('T'):
  ------------------
  |  Branch (1166:9): [True: 4.31k, False: 6.07M]
  ------------------
 1167|  34.6k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1167:9): [True: 30.3k, False: 6.04M]
  ------------------
 1168|  34.6k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1169|  34.6k|            need_localtime_ = true;
 1170|  34.6k|            break;
 1171|   473k|        case ('z'):  // timezone
  ------------------
  |  Branch (1171:9): [True: 473k, False: 5.60M]
  ------------------
 1172|   473k|            formatters_.push_back(
 1173|   473k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1174|   473k|            need_localtime_ = true;
 1175|   473k|            break;
 1176|  26.5k|        case ('P'):  // pid
  ------------------
  |  Branch (1176:9): [True: 26.5k, False: 6.04M]
  ------------------
 1177|  26.5k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1178|  26.5k|            break;
 1179|       |
 1180|  37.0k|        case ('^'):  // color range start
  ------------------
  |  Branch (1180:9): [True: 37.0k, False: 6.03M]
  ------------------
 1181|  37.0k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1182|  37.0k|            break;
 1183|       |
 1184|  52.2k|        case ('$'):  // color range end
  ------------------
  |  Branch (1184:9): [True: 52.2k, False: 6.02M]
  ------------------
 1185|  52.2k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1186|  52.2k|            break;
 1187|       |
 1188|  15.1k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1188:9): [True: 15.1k, False: 6.06M]
  ------------------
 1189|  15.1k|            formatters_.push_back(
 1190|  15.1k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1191|  15.1k|            break;
 1192|       |
 1193|  7.78k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1193:9): [True: 7.78k, False: 6.06M]
  ------------------
 1194|  7.78k|            formatters_.push_back(
 1195|  7.78k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1196|  7.78k|            break;
 1197|       |
 1198|  6.83k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1198:9): [True: 6.83k, False: 6.06M]
  ------------------
 1199|  6.83k|            formatters_.push_back(
 1200|  6.83k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1201|  6.83k|            break;
 1202|       |
 1203|  3.27k|        case ('#'):  // source line number
  ------------------
  |  Branch (1203:9): [True: 3.27k, False: 6.07M]
  ------------------
 1204|  3.27k|            formatters_.push_back(
 1205|  3.27k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1206|  3.27k|            break;
 1207|       |
 1208|  53.3k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1208:9): [True: 53.3k, False: 6.02M]
  ------------------
 1209|  53.3k|            formatters_.push_back(
 1210|  53.3k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1211|  53.3k|            break;
 1212|       |
 1213|   435k|        case ('%'):  // % char
  ------------------
  |  Branch (1213:9): [True: 435k, False: 5.64M]
  ------------------
 1214|   435k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1215|   435k|            break;
 1216|       |
 1217|  24.5k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1217:9): [True: 24.5k, False: 6.05M]
  ------------------
 1218|  24.5k|            formatters_.push_back(
 1219|  24.5k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1220|  24.5k|                    padding));
 1221|  24.5k|            break;
 1222|       |
 1223|  10.2k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1223:9): [True: 10.2k, False: 6.06M]
  ------------------
 1224|  10.2k|            formatters_.push_back(
 1225|  10.2k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1226|  10.2k|                    padding));
 1227|  10.2k|            break;
 1228|       |
 1229|  40.3k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1229:9): [True: 40.3k, False: 6.03M]
  ------------------
 1230|  40.3k|            formatters_.push_back(
 1231|  40.3k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1232|  40.3k|                    padding));
 1233|  40.3k|            break;
 1234|       |
 1235|  9.52k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1235:9): [True: 9.52k, False: 6.06M]
  ------------------
 1236|  9.52k|            formatters_.push_back(
 1237|  9.52k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1238|  9.52k|                    padding));
 1239|  9.52k|            break;
 1240|       |
 1241|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1242|  2.74M|        case ('&'):
  ------------------
  |  Branch (1242:9): [True: 2.74M, False: 3.32M]
  ------------------
 1243|  2.74M|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1244|  2.74M|            break;
 1245|      0|#endif
 1246|       |
 1247|   250k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1247:9): [True: 250k, False: 5.82M]
  ------------------
 1248|   250k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1249|       |
 1250|   250k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1250:17): [True: 250k, False: 0]
  ------------------
 1251|   250k|                unknown_flag->add_ch('%');
 1252|   250k|                unknown_flag->add_ch(flag);
 1253|   250k|                formatters_.push_back((std::move(unknown_flag)));
 1254|   250k|            }
 1255|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1256|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1257|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1258|      0|            else {
 1259|      0|                padding.truncate_ = false;
 1260|      0|                formatters_.push_back(
 1261|      0|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1262|      0|                unknown_flag->add_ch(flag);
 1263|      0|                formatters_.push_back((std::move(unknown_flag)));
 1264|      0|            }
 1265|       |
 1266|   250k|            break;
 1267|  6.07M|    }
 1268|  6.07M|}
_ZN6spdlog7details14name_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  107|  15.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  120|  3.89k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  134|  48.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  575|  73.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  603|  3.46k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  158|  11.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  175|  4.00k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  192|  10.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  210|  8.07k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  224|  11.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  254|  4.09k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  287|  2.16k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  268|  53.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  301|  8.43k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  315|  56.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  329|   403k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  343|  12.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  357|   408k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  371|   402k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  385|  25.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  400|   207k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  416|  7.04k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  431|  14.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  447|  1.65k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  461|  37.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  482|  2.77k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  499|  34.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  519|   473k|        : flag_formatter(padinfo),
  520|   473k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  589|  26.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  664|  15.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  711|  7.78k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  693|  6.83k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  752|  3.27k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  771|  53.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  792|  24.5k|        : flag_formatter(padinfo),
  793|  24.5k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  792|  10.2k|        : flag_formatter(padinfo),
  793|  10.2k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  792|  40.3k|        : flag_formatter(padinfo),
  793|  40.3k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  792|  9.52k|        : flag_formatter(padinfo),
  793|  9.52k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details19aggregate_formatterC2Ev:
  627|  3.76M|    aggregate_formatter() = default;
_ZN6spdlog7details19aggregate_formatter6add_chEc:
  629|  47.3M|    void add_ch(char ch) { str_ += ch; }

_ZN6spdlog7details14flag_formatterC2ENS0_12padding_infoE:
   43|  6.57M|        : padinfo_(padinfo) {}
_ZN6spdlog7details14flag_formatterD2Ev:
   45|  10.9M|    virtual ~flag_formatter() = default;
_ZN6spdlog7details12padding_infoC2Ev:
   26|  10.4M|    padding_info() = default;
_ZN6spdlog7details12padding_infoC2EmNS1_8pad_sideEb:
   28|  1.47M|        : width_(width),
   29|  1.47M|          side_(side),
   30|  1.47M|          truncate_(truncate),
   31|  1.47M|          enabled_(true) {}
_ZNK6spdlog7details12padding_info7enabledEv:
   33|  7.55M|    bool enabled() const { return enabled_; }
_ZN6spdlog7details14flag_formatterC2Ev:
   44|  4.37M|    flag_formatter() = default;

_ZN6spdlog5sinks21ansicolor_stdout_sinkINS_7details13console_mutexEEC2ENS_10color_modeE:
  134|      1|    : ansicolor_sink<ConsoleMutex>(stdout, mode) {}
_ZN6spdlog5sinks14ansicolor_sinkINS_7details13console_mutexEEC2EP8_IO_FILENS_10color_modeE:
   18|      1|    : target_file_(target_file),
   19|      1|      mutex_(ConsoleMutex::mutex()),
   20|      1|      formatter_(details::make_unique<pattern_formatter>())
   21|       |
   22|      1|{
   23|      1|    set_color_mode_(mode);
   24|      1|    colors_.at(level::trace) = to_string_(white);
   25|      1|    colors_.at(level::debug) = to_string_(cyan);
   26|      1|    colors_.at(level::info) = to_string_(green);
   27|      1|    colors_.at(level::warn) = to_string_(yellow_bold);
   28|      1|    colors_.at(level::err) = to_string_(red_bold);
   29|      1|    colors_.at(level::critical) = to_string_(bold_on_red);
   30|      1|    colors_.at(level::off) = to_string_(reset);
   31|      1|}
_ZN6spdlog5sinks14ansicolor_sinkINS_7details13console_mutexEE15set_color_mode_ENS_10color_modeE:
   96|      1|SPDLOG_INLINE void ansicolor_sink<ConsoleMutex>::set_color_mode_(color_mode mode) {
   97|      1|    switch (mode) {
   98|      0|        case color_mode::always:
  ------------------
  |  Branch (98:9): [True: 0, False: 1]
  ------------------
   99|      0|            should_do_colors_ = true;
  100|      0|            return;
  101|      1|        case color_mode::automatic:
  ------------------
  |  Branch (101:9): [True: 1, False: 0]
  ------------------
  102|      1|            should_do_colors_ =
  103|      1|                details::os::in_terminal(target_file_) && details::os::is_color_terminal();
  ------------------
  |  Branch (103:17): [True: 0, False: 1]
  |  Branch (103:59): [True: 0, False: 0]
  ------------------
  104|      1|            return;
  105|      0|        case color_mode::never:
  ------------------
  |  Branch (105:9): [True: 0, False: 1]
  ------------------
  106|      0|            should_do_colors_ = false;
  107|      0|            return;
  108|      0|        default:
  ------------------
  |  Branch (108:9): [True: 0, False: 1]
  ------------------
  109|      0|            should_do_colors_ = false;
  110|      1|    }
  111|      1|}
_ZN6spdlog5sinks14ansicolor_sinkINS_7details13console_mutexEE10to_string_ERKN3fmt3v1217basic_string_viewIcEE:
  127|      7|SPDLOG_INLINE std::string ansicolor_sink<ConsoleMutex>::to_string_(const string_view_t &sv) {
  128|      7|    return std::string(sv.data(), sv.size());
  129|      7|}
_ZN6spdlog5sinks14ansicolor_sinkINS_7details13console_mutexEE13set_formatterENSt3__110unique_ptrINS_9formatterENS5_14default_deleteIS7_EEEE:
   79|  1.71k|    std::unique_ptr<formatter> sink_formatter) {
   80|  1.71k|    std::lock_guard<mutex_t> lock(mutex_);
   81|  1.71k|    formatter_ = std::move(sink_formatter);
   82|  1.71k|}

_ZN6spdlog5sinks14ansicolor_sinkINS_7details13console_mutexEED2Ev:
   29|      1|    ~ansicolor_sink() override = default;

_ZN6spdlog5sinks9base_sinkINSt3__15mutexEEC2Ev:
   20|      1|    : formatter_{details::make_unique<pattern_formatter>()} {}
_ZN6spdlog5sinks9base_sinkINSt3__15mutexEE13set_formatterENS2_10unique_ptrINS_9formatterENS2_14default_deleteIS6_EEEE:
   47|  1.71k|sinks::base_sink<Mutex>::set_formatter(std::unique_ptr<formatter> sink_formatter) {
   48|  1.71k|    std::lock_guard<Mutex> lock(mutex_);
   49|  1.71k|    set_formatter_(std::move(sink_formatter));
   50|  1.71k|}
_ZN6spdlog5sinks9base_sinkINSt3__15mutexEE14set_formatter_ENS2_10unique_ptrINS_9formatterENS2_14default_deleteIS6_EEEE:
   59|  1.71k|sinks::base_sink<Mutex>::set_formatter_(std::unique_ptr<formatter> sink_formatter) {
   60|  1.71k|    formatter_ = std::move(sink_formatter);
   61|  1.71k|}

_ZN6spdlog5sinks9base_sinkINSt3__15mutexEED2Ev:
   23|      1|    ~base_sink() override = default;

_ZN6spdlog5sinks15basic_file_sinkINSt3__15mutexEEC2ERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbRKNS_19file_event_handlersEm:
   21|      1|    : file_helper_{event_handlers} {
   22|      1|    file_helper_.set_buffer_size(buffer_size);
   23|      1|    file_helper_.open(filename, truncate);
   24|      1|}

_ZN6spdlog15basic_logger_mtINS_19synchronous_factoryEEENSt3__110shared_ptrINS_6loggerEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESD_bRKNS_19file_event_handlersEm:
   52|      1|                                               size_t buffer_size = 0) {
   53|      1|    return Factory::template create<sinks::basic_file_sink_mt>(logger_name, filename, truncate,
   54|      1|                                                               event_handlers, buffer_size);
   55|      1|}

_ZN6spdlog5sinks4sinkD2Ev:
   14|      2|    virtual ~sink() = default;

_ZN6spdlog18set_default_loggerENSt3__110shared_ptrINS_6loggerEEE:
   92|      1|SPDLOG_INLINE void set_default_logger(std::shared_ptr<logger> default_logger) {
   93|      1|    details::registry::instance().set_default_logger(std::move(default_logger));
   94|      1|}
_ZN6spdlog11set_patternENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEENS_17pattern_time_typeE:
   27|  1.71k|SPDLOG_INLINE void set_pattern(std::string pattern, pattern_time_type time_type) {
   28|  1.71k|    set_formatter(
   29|  1.71k|        std::unique_ptr<formatter>(new pattern_formatter(std::move(pattern), time_type)));
   30|  1.71k|}
_ZN6spdlog13set_formatterENSt3__110unique_ptrINS_9formatterENS0_14default_deleteIS2_EEEE:
   23|  1.71k|SPDLOG_INLINE void set_formatter(std::unique_ptr<formatter> formatter) {
   24|  1.71k|    details::registry::instance().set_formatter(std::move(formatter));
   25|  1.71k|}

