LLVMFuzzerTestOneInput:
   22|  1.64k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   23|  1.64k|  static std::shared_ptr<spdlog::logger> my_logger;
   24|  1.64k|  if (!my_logger.get()) {
  ------------------
  |  Branch (24:7): [True: 1, False: 1.64k]
  ------------------
   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.64k|  if (size == 0) {
  ------------------
  |  Branch (29:7): [True: 0, False: 1.64k]
  ------------------
   30|      0|    return 0;
   31|      0|  }
   32|       |
   33|  1.64k|  FuzzedDataProvider stream(data, size);
   34|  1.64k|  const std::string str = stream.ConsumeRemainingBytesAsString();
   35|  1.64k|  spdlog::set_pattern(str);
   36|       |
   37|  1.64k|  return 0;
   38|  1.64k|}

_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.64k|SPDLOG_INLINE registry &registry::instance() {
  242|  1.64k|    static registry s_instance;
  243|  1.64k|    return s_instance;
  244|  1.64k|}
_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.64k|SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter) {
  125|  1.64k|    std::lock_guard<std::mutex> lock(logger_map_mutex_);
  126|  1.64k|    formatter_ = std::move(formatter);
  127|  3.28k|    for (auto &l : loggers_) {
  ------------------
  |  Branch (127:18): [True: 3.28k, False: 1.64k]
  ------------------
  128|  3.28k|        l.second->set_formatter(formatter_->clone());
  129|  3.28k|    }
  130|  1.64k|}
_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|  8.95k|  FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; }
_ZN3fmt3v126detail6bufferIcEC2EPFvRS3_mEPcmm:
 1790|  8.95k|      : ptr_(p), size_(sz), capacity_(cap), grow_(grow) {}
_ZN3fmt3v126detail6bufferIcE3setEPcm:
 1796|  8.95k|  FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept {
 1797|  8.95k|    ptr_ = buf_data;
 1798|  8.95k|    capacity_ = buf_capacity;
 1799|  8.95k|  }
_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|  8.95k|      : detail::buffer<T>(grow), alloc_(alloc) {
  841|  8.95k|    this->set(store_, SIZE);
  842|  8.95k|    if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T());
  ------------------
  |  Branch (842:9): [Folded, False: 8.95k]
  ------------------
  843|  8.95k|  }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEED2Ev:
  844|  8.95k|  FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEE10deallocateEv:
  805|  8.95k|  FMT_CONSTEXPR20 void deallocate() {
  806|  8.95k|    T* data = this->data();
  807|  8.95k|    if (data != store_) alloc_.deallocate(data, this->capacity());
  ------------------
  |  Branch (807:9): [True: 0, False: 8.95k]
  ------------------
  808|  8.95k|  }

_ZN6spdlog9formatterD2Ev:
   13|  4.92k|    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.28k|SPDLOG_INLINE void logger::set_formatter(std::unique_ptr<formatter> f) {
   73|  3.28k|    for (auto it = sinks_.begin(); it != sinks_.end(); ++it) {
  ------------------
  |  Branch (73:36): [True: 3.28k, False: 0]
  ------------------
   74|  3.28k|        if (std::next(it) == sinks_.end()) {
  ------------------
  |  Branch (74:13): [True: 3.28k, False: 0]
  ------------------
   75|       |            // last element - we can be move it.
   76|  3.28k|            (*it)->set_formatter(std::move(f));
   77|  3.28k|            break;  // to prevent clang-tidy warning
   78|  3.28k|        } else {
   79|      0|            (*it)->set_formatter(f->clone());
   80|      0|        }
   81|  3.28k|    }
   82|  3.28k|}
_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:
  980|  3.28k|SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const {
  981|  3.28k|    custom_flags cloned_custom_formatters;
  982|  3.28k|    for (auto &it : custom_handlers_) {
  ------------------
  |  Branch (982:19): [True: 0, False: 3.28k]
  ------------------
  983|      0|        cloned_custom_formatters[it.first] = it.second->clone();
  984|      0|    }
  985|  3.28k|    auto cloned = details::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_,
  986|  3.28k|                                                          std::move(cloned_custom_formatters));
  987|  3.28k|    cloned->need_localtime(need_localtime_);
  988|  3.28k|#if defined(__GNUC__) && __GNUC__ < 5
  989|  3.28k|    return std::move(cloned);
  990|       |#else
  991|       |    return cloned;
  992|       |#endif
  993|  3.28k|}
_ZN6spdlog17pattern_formatter14need_localtimeEb:
 1018|  3.28k|SPDLOG_INLINE void pattern_formatter::need_localtime(bool need) { need_localtime_ = need; }
_ZN6spdlog17pattern_formatterC2ENS_17pattern_time_typeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  971|      3|    : pattern_("%+"),
  972|      3|      eol_(std::move(eol)),
  973|      3|      pattern_time_type_(time_type),
  974|      3|      need_localtime_(true),
  975|      3|      last_log_secs_(0) {
  976|      3|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  977|      3|    formatters_.push_back(details::make_unique<details::full_formatter>(details::padding_info{}));
  978|      3|}
_ZN6spdlog7details14full_formatterC2ENS0_12padding_infoE:
  856|  8.95k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details13mdc_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  816|  2.75M|        : 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:
  959|  4.92k|    : pattern_(std::move(pattern)),
  960|  4.92k|      eol_(std::move(eol)),
  961|  4.92k|      pattern_time_type_(time_type),
  962|  4.92k|      need_localtime_(false),
  963|  4.92k|      last_log_secs_(0),
  964|  4.92k|      custom_handlers_(std::move(custom_user_flags)) {
  965|  4.92k|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  966|  4.92k|    compile_pattern_(pattern_);
  967|  4.92k|}
_ZN6spdlog17pattern_formatter16compile_pattern_ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1321|  4.92k|SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &pattern) {
 1322|  4.92k|    auto end = pattern.end();
 1323|  4.92k|    std::unique_ptr<details::aggregate_formatter> user_chars;
 1324|  4.92k|    formatters_.clear();
 1325|  56.0M|    for (auto it = pattern.begin(); it != end; ++it) {
  ------------------
  |  Branch (1325:37): [True: 56.0M, False: 4.04k]
  ------------------
 1326|  56.0M|        if (*it == '%') {
  ------------------
  |  Branch (1326:13): [True: 6.81M, False: 49.2M]
  ------------------
 1327|  6.81M|            if (user_chars)  // append user chars found so far
  ------------------
  |  Branch (1327:17): [True: 3.03M, False: 3.78M]
  ------------------
 1328|  3.03M|            {
 1329|  3.03M|                formatters_.push_back(std::move(user_chars));
 1330|  3.03M|            }
 1331|       |
 1332|  6.81M|            auto padding = handle_padspec_(++it, end);
 1333|       |
 1334|  6.81M|            if (it != end) {
  ------------------
  |  Branch (1334:17): [True: 6.81M, False: 882]
  ------------------
 1335|  6.81M|                if (padding.enabled()) {
  ------------------
  |  Branch (1335:21): [True: 987k, False: 5.82M]
  ------------------
 1336|   987k|                    handle_flag_<details::scoped_padder>(*it, padding);
 1337|  5.82M|                } else {
 1338|  5.82M|                    handle_flag_<details::null_scoped_padder>(*it, padding);
 1339|  5.82M|                }
 1340|  6.81M|            } else {
 1341|    882|                break;
 1342|    882|            }
 1343|  6.81M|        } else  // chars not following the % sign should be displayed as is
 1344|  49.2M|        {
 1345|  49.2M|            if (!user_chars) {
  ------------------
  |  Branch (1345:17): [True: 3.03M, False: 46.2M]
  ------------------
 1346|  3.03M|                user_chars = details::make_unique<details::aggregate_formatter>();
 1347|  3.03M|            }
 1348|  49.2M|            user_chars->add_ch(*it);
 1349|  49.2M|        }
 1350|  56.0M|    }
 1351|  4.92k|    if (user_chars)  // append raw chars found so far
  ------------------
  |  Branch (1351:9): [True: 771, False: 4.15k]
  ------------------
 1352|    771|    {
 1353|    771|        formatters_.push_back(std::move(user_chars));
 1354|    771|    }
 1355|  4.92k|}
_ZN6spdlog17pattern_formatter15handle_padspec_ERNSt3__111__wrap_iterIPKcEES5_:
 1277|  6.81M|    std::string::const_iterator &it, std::string::const_iterator end) {
 1278|  6.81M|    using details::padding_info;
 1279|  6.81M|    using details::scoped_padder;
 1280|  6.81M|    const size_t max_width = 64;
 1281|  6.81M|    if (it == end) {
  ------------------
  |  Branch (1281:9): [True: 243, False: 6.81M]
  ------------------
 1282|    243|        return padding_info{};
 1283|    243|    }
 1284|       |
 1285|  6.81M|    padding_info::pad_side side;
 1286|  6.81M|    switch (*it) {
 1287|  24.7k|        case '-':
  ------------------
  |  Branch (1287:9): [True: 24.7k, False: 6.79M]
  ------------------
 1288|  24.7k|            side = padding_info::pad_side::right;
 1289|  24.7k|            ++it;
 1290|  24.7k|            break;
 1291|  4.66k|        case '=':
  ------------------
  |  Branch (1291:9): [True: 4.66k, False: 6.81M]
  ------------------
 1292|  4.66k|            side = padding_info::pad_side::center;
 1293|  4.66k|            ++it;
 1294|  4.66k|            break;
 1295|  6.78M|        default:
  ------------------
  |  Branch (1295:9): [True: 6.78M, False: 29.4k]
  ------------------
 1296|  6.78M|            side = details::padding_info::pad_side::left;
 1297|  6.78M|            break;
 1298|  6.81M|    }
 1299|       |
 1300|  6.81M|    if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
  ------------------
  |  Branch (1300:9): [True: 63, False: 6.81M]
  |  Branch (1300:22): [True: 5.82M, False: 988k]
  ------------------
 1301|  5.82M|        return padding_info{};  // no padding if no digit found here
 1302|  5.82M|    }
 1303|       |
 1304|   988k|    auto width = static_cast<size_t>(*it) - '0';
 1305|  2.00M|    for (++it; it != end && std::isdigit(static_cast<unsigned char>(*it)); ++it) {
  ------------------
  |  Branch (1305:16): [True: 2.00M, False: 558]
  |  Branch (1305:29): [True: 1.01M, False: 987k]
  ------------------
 1306|  1.01M|        auto digit = static_cast<size_t>(*it) - '0';
 1307|  1.01M|        width = width * 10 + digit;
 1308|  1.01M|    }
 1309|       |
 1310|       |    // search for the optional truncate marker '!'
 1311|   988k|    bool truncate;
 1312|   988k|    if (it != end && *it == '!') {
  ------------------
  |  Branch (1312:9): [True: 987k, False: 558]
  |  Branch (1312:22): [True: 23.3k, False: 964k]
  ------------------
 1313|  23.3k|        truncate = true;
 1314|  23.3k|        ++it;
 1315|   965k|    } else {
 1316|   965k|        truncate = false;
 1317|   965k|    }
 1318|   988k|    return details::padding_info{std::min<size_t>(width, max_width), side, truncate};
 1319|  6.81M|}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details13scoped_padderEEEvcNS2_12padding_infoE:
 1028|   987k|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1029|       |    // process custom flags
 1030|   987k|    auto it = custom_handlers_.find(flag);
 1031|   987k|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1031:9): [True: 0, False: 987k]
  ------------------
 1032|      0|        auto custom_handler = it->second->clone();
 1033|      0|        custom_handler->set_padding_info(padding);
 1034|      0|        formatters_.push_back(std::move(custom_handler));
 1035|      0|        return;
 1036|      0|    }
 1037|       |
 1038|       |    // process built-in flags
 1039|   987k|    switch (flag) {
 1040|  3.38k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1040:9): [True: 3.38k, False: 984k]
  ------------------
 1041|  3.38k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1042|  3.38k|            need_localtime_ = true;
 1043|  3.38k|            break;
 1044|       |
 1045|  2.73k|        case 'n':  // logger name
  ------------------
  |  Branch (1045:9): [True: 2.73k, False: 985k]
  ------------------
 1046|  2.73k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1047|  2.73k|            break;
 1048|       |
 1049|  19.1k|        case 'l':  // level
  ------------------
  |  Branch (1049:9): [True: 19.1k, False: 968k]
  ------------------
 1050|  19.1k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1051|  19.1k|            break;
 1052|       |
 1053|  4.95k|        case 'L':  // short level
  ------------------
  |  Branch (1053:9): [True: 4.95k, False: 982k]
  ------------------
 1054|  4.95k|            formatters_.push_back(
 1055|  4.95k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1056|  4.95k|            break;
 1057|       |
 1058|  19.0k|        case ('t'):  // thread id
  ------------------
  |  Branch (1058:9): [True: 19.0k, False: 968k]
  ------------------
 1059|  19.0k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1060|  19.0k|            break;
 1061|       |
 1062|  22.4k|        case ('v'):  // the message text
  ------------------
  |  Branch (1062:9): [True: 22.4k, False: 965k]
  ------------------
 1063|  22.4k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1064|  22.4k|            break;
 1065|       |
 1066|  16.1k|        case ('a'):  // weekday
  ------------------
  |  Branch (1066:9): [True: 16.1k, False: 971k]
  ------------------
 1067|  16.1k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1068|  16.1k|            need_localtime_ = true;
 1069|  16.1k|            break;
 1070|       |
 1071|  9.79k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1071:9): [True: 9.79k, False: 978k]
  ------------------
 1072|  9.79k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1073|  9.79k|            need_localtime_ = true;
 1074|  9.79k|            break;
 1075|       |
 1076|  3.84k|        case ('b'):
  ------------------
  |  Branch (1076:9): [True: 3.84k, False: 984k]
  ------------------
 1077|  6.42k|        case ('h'):  // month
  ------------------
  |  Branch (1077:9): [True: 2.58k, False: 985k]
  ------------------
 1078|  6.42k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1079|  6.42k|            need_localtime_ = true;
 1080|  6.42k|            break;
 1081|       |
 1082|  13.2k|        case ('B'):  // short month
  ------------------
  |  Branch (1082:9): [True: 13.2k, False: 974k]
  ------------------
 1083|  13.2k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1084|  13.2k|            need_localtime_ = true;
 1085|  13.2k|            break;
 1086|       |
 1087|  10.3k|        case ('c'):  // datetime
  ------------------
  |  Branch (1087:9): [True: 10.3k, False: 977k]
  ------------------
 1088|  10.3k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1089|  10.3k|            need_localtime_ = true;
 1090|  10.3k|            break;
 1091|       |
 1092|  2.27k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1092:9): [True: 2.27k, False: 985k]
  ------------------
 1093|  2.27k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1094|  2.27k|            need_localtime_ = true;
 1095|  2.27k|            break;
 1096|       |
 1097|  22.1k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1097:9): [True: 22.1k, False: 965k]
  ------------------
 1098|  22.1k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1099|  22.1k|            need_localtime_ = true;
 1100|  22.1k|            break;
 1101|       |
 1102|  7.61k|        case ('D'):
  ------------------
  |  Branch (1102:9): [True: 7.61k, False: 980k]
  ------------------
 1103|  39.3k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1103:9): [True: 31.7k, False: 956k]
  ------------------
 1104|  39.3k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1105|  39.3k|            need_localtime_ = true;
 1106|  39.3k|            break;
 1107|       |
 1108|  36.1k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1108:9): [True: 36.1k, False: 951k]
  ------------------
 1109|  36.1k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1110|  36.1k|            need_localtime_ = true;
 1111|  36.1k|            break;
 1112|       |
 1113|  8.76k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1113:9): [True: 8.76k, False: 979k]
  ------------------
 1114|  8.76k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1115|  8.76k|            need_localtime_ = true;
 1116|  8.76k|            break;
 1117|       |
 1118|  8.56k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1118:9): [True: 8.56k, False: 979k]
  ------------------
 1119|  8.56k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1120|  8.56k|            need_localtime_ = true;
 1121|  8.56k|            break;
 1122|       |
 1123|  22.1k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1123:9): [True: 22.1k, False: 965k]
  ------------------
 1124|  22.1k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1125|  22.1k|            need_localtime_ = true;
 1126|  22.1k|            break;
 1127|       |
 1128|  57.5k|        case ('M'):  // minutes
  ------------------
  |  Branch (1128:9): [True: 57.5k, False: 930k]
  ------------------
 1129|  57.5k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1130|  57.5k|            need_localtime_ = true;
 1131|  57.5k|            break;
 1132|       |
 1133|  7.08k|        case ('S'):  // seconds
  ------------------
  |  Branch (1133:9): [True: 7.08k, False: 980k]
  ------------------
 1134|  7.08k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1135|  7.08k|            need_localtime_ = true;
 1136|  7.08k|            break;
 1137|       |
 1138|  10.7k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1138:9): [True: 10.7k, False: 977k]
  ------------------
 1139|  10.7k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1140|  10.7k|            break;
 1141|       |
 1142|  25.9k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1142:9): [True: 25.9k, False: 961k]
  ------------------
 1143|  25.9k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1144|  25.9k|            break;
 1145|       |
 1146|  41.1k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1146:9): [True: 41.1k, False: 946k]
  ------------------
 1147|  41.1k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1148|  41.1k|            break;
 1149|       |
 1150|  52.2k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1150:9): [True: 52.2k, False: 935k]
  ------------------
 1151|  52.2k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1152|  52.2k|            break;
 1153|       |
 1154|  19.1k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1154:9): [True: 19.1k, False: 968k]
  ------------------
 1155|  19.1k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1156|  19.1k|            need_localtime_ = true;
 1157|  19.1k|            break;
 1158|       |
 1159|  20.8k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1159:9): [True: 20.8k, False: 967k]
  ------------------
 1160|  20.8k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1161|  20.8k|            need_localtime_ = true;
 1162|  20.8k|            break;
 1163|       |
 1164|  5.41k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1164:9): [True: 5.41k, False: 982k]
  ------------------
 1165|  5.41k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1166|  5.41k|            need_localtime_ = true;
 1167|  5.41k|            break;
 1168|       |
 1169|  10.9k|        case ('T'):
  ------------------
  |  Branch (1169:9): [True: 10.9k, False: 976k]
  ------------------
 1170|  36.7k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1170:9): [True: 25.8k, False: 962k]
  ------------------
 1171|  36.7k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1172|  36.7k|            need_localtime_ = true;
 1173|  36.7k|            break;
 1174|  4.45k|        case ('z'):  // timezone
  ------------------
  |  Branch (1174:9): [True: 4.45k, False: 983k]
  ------------------
 1175|  4.45k|            formatters_.push_back(
 1176|  4.45k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1177|  4.45k|            need_localtime_ = true;
 1178|  4.45k|            break;
 1179|  91.9k|        case ('P'):  // pid
  ------------------
  |  Branch (1179:9): [True: 91.9k, False: 896k]
  ------------------
 1180|  91.9k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1181|  91.9k|            break;
 1182|       |
 1183|  1.86k|        case ('^'):  // color range start
  ------------------
  |  Branch (1183:9): [True: 1.86k, False: 986k]
  ------------------
 1184|  1.86k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1185|  1.86k|            break;
 1186|       |
 1187|  19.1k|        case ('$'):  // color range end
  ------------------
  |  Branch (1187:9): [True: 19.1k, False: 968k]
  ------------------
 1188|  19.1k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1189|  19.1k|            break;
 1190|       |
 1191|  3.63k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1191:9): [True: 3.63k, False: 984k]
  ------------------
 1192|  3.63k|            formatters_.push_back(
 1193|  3.63k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1194|  3.63k|            break;
 1195|       |
 1196|  4.34k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1196:9): [True: 4.34k, False: 983k]
  ------------------
 1197|  4.34k|            formatters_.push_back(
 1198|  4.34k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1199|  4.34k|            break;
 1200|       |
 1201|  11.8k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1201:9): [True: 11.8k, False: 976k]
  ------------------
 1202|  11.8k|            formatters_.push_back(
 1203|  11.8k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1204|  11.8k|            break;
 1205|       |
 1206|  41.7k|        case ('#'):  // source line number
  ------------------
  |  Branch (1206:9): [True: 41.7k, False: 946k]
  ------------------
 1207|  41.7k|            formatters_.push_back(
 1208|  41.7k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1209|  41.7k|            break;
 1210|       |
 1211|  11.0k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1211:9): [True: 11.0k, False: 976k]
  ------------------
 1212|  11.0k|            formatters_.push_back(
 1213|  11.0k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1214|  11.0k|            break;
 1215|       |
 1216|  91.8k|        case ('%'):  // % char
  ------------------
  |  Branch (1216:9): [True: 91.8k, False: 896k]
  ------------------
 1217|  91.8k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1218|  91.8k|            break;
 1219|       |
 1220|  8.96k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1220:9): [True: 8.96k, False: 978k]
  ------------------
 1221|  8.96k|            formatters_.push_back(
 1222|  8.96k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1223|  8.96k|                    padding));
 1224|  8.96k|            break;
 1225|       |
 1226|  4.55k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1226:9): [True: 4.55k, False: 983k]
  ------------------
 1227|  4.55k|            formatters_.push_back(
 1228|  4.55k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1229|  4.55k|                    padding));
 1230|  4.55k|            break;
 1231|       |
 1232|  13.1k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1232:9): [True: 13.1k, False: 974k]
  ------------------
 1233|  13.1k|            formatters_.push_back(
 1234|  13.1k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1235|  13.1k|                    padding));
 1236|  13.1k|            break;
 1237|       |
 1238|  26.8k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1238:9): [True: 26.8k, False: 961k]
  ------------------
 1239|  26.8k|            formatters_.push_back(
 1240|  26.8k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1241|  26.8k|                    padding));
 1242|  26.8k|            break;
 1243|       |
 1244|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1245|  2.60k|        case ('&'):
  ------------------
  |  Branch (1245:9): [True: 2.60k, False: 985k]
  ------------------
 1246|  2.60k|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1247|  2.60k|            break;
 1248|      0|#endif
 1249|       |
 1250|   105k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1250:9): [True: 105k, False: 882k]
  ------------------
 1251|   105k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1252|       |
 1253|   105k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1253:17): [True: 98.7k, False: 7.11k]
  ------------------
 1254|  98.7k|                unknown_flag->add_ch('%');
 1255|  98.7k|                unknown_flag->add_ch(flag);
 1256|  98.7k|                formatters_.push_back((std::move(unknown_flag)));
 1257|  98.7k|            }
 1258|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1259|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1260|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1261|  7.11k|            else {
 1262|  7.11k|                padding.truncate_ = false;
 1263|  7.11k|                formatters_.push_back(
 1264|  7.11k|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1265|  7.11k|                unknown_flag->add_ch(flag);
 1266|  7.11k|                formatters_.push_back((std::move(unknown_flag)));
 1267|  7.11k|            }
 1268|       |
 1269|   105k|            break;
 1270|   987k|    }
 1271|   987k|}
_ZN6spdlog7details14name_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  107|  2.73k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  120|  19.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  134|  4.95k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  575|  19.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  603|  22.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  158|  16.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  175|  9.79k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  192|  6.42k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  210|  13.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  224|  10.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  254|  2.27k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  287|  22.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  268|  39.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  301|  36.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  315|  8.76k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  329|  8.56k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  343|  22.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  357|  57.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  371|  7.08k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  385|  10.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  400|  25.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  416|  41.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  431|  52.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  447|  19.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  461|  20.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  482|  5.41k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  499|  36.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  519|  4.45k|        : flag_formatter(padinfo),
  520|  4.45k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  589|  91.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21color_start_formatterC2ENS0_12padding_infoE:
  642|  24.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details20color_stop_formatterC2ENS0_12padding_infoE:
  652|  56.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  664|  3.63k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  711|  4.34k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  693|  11.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  752|  41.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  771|  18.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details12ch_formatterC2Ec:
  614|   487k|        : ch_(ch) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  792|  8.96k|        : flag_formatter(padinfo),
  793|  8.96k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  792|  4.55k|        : flag_formatter(padinfo),
  793|  4.55k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  792|  13.1k|        : flag_formatter(padinfo),
  793|  13.1k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  792|  26.8k|        : flag_formatter(padinfo),
  793|  26.8k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details13mdc_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  816|  2.60k|        : flag_formatter(padinfo) {}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details18null_scoped_padderEEEvcNS2_12padding_infoE:
 1028|  5.82M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1029|       |    // process custom flags
 1030|  5.82M|    auto it = custom_handlers_.find(flag);
 1031|  5.82M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1031:9): [True: 0, False: 5.82M]
  ------------------
 1032|      0|        auto custom_handler = it->second->clone();
 1033|      0|        custom_handler->set_padding_info(padding);
 1034|      0|        formatters_.push_back(std::move(custom_handler));
 1035|      0|        return;
 1036|      0|    }
 1037|       |
 1038|       |    // process built-in flags
 1039|  5.82M|    switch (flag) {
 1040|  5.56k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1040:9): [True: 5.56k, False: 5.82M]
  ------------------
 1041|  5.56k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1042|  5.56k|            need_localtime_ = true;
 1043|  5.56k|            break;
 1044|       |
 1045|  9.57k|        case 'n':  // logger name
  ------------------
  |  Branch (1045:9): [True: 9.57k, False: 5.81M]
  ------------------
 1046|  9.57k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1047|  9.57k|            break;
 1048|       |
 1049|  3.90k|        case 'l':  // level
  ------------------
  |  Branch (1049:9): [True: 3.90k, False: 5.82M]
  ------------------
 1050|  3.90k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1051|  3.90k|            break;
 1052|       |
 1053|  39.8k|        case 'L':  // short level
  ------------------
  |  Branch (1053:9): [True: 39.8k, False: 5.78M]
  ------------------
 1054|  39.8k|            formatters_.push_back(
 1055|  39.8k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1056|  39.8k|            break;
 1057|       |
 1058|  83.6k|        case ('t'):  // thread id
  ------------------
  |  Branch (1058:9): [True: 83.6k, False: 5.74M]
  ------------------
 1059|  83.6k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1060|  83.6k|            break;
 1061|       |
 1062|  2.76k|        case ('v'):  // the message text
  ------------------
  |  Branch (1062:9): [True: 2.76k, False: 5.82M]
  ------------------
 1063|  2.76k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1064|  2.76k|            break;
 1065|       |
 1066|  9.49k|        case ('a'):  // weekday
  ------------------
  |  Branch (1066:9): [True: 9.49k, False: 5.81M]
  ------------------
 1067|  9.49k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1068|  9.49k|            need_localtime_ = true;
 1069|  9.49k|            break;
 1070|       |
 1071|  3.33k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1071:9): [True: 3.33k, False: 5.82M]
  ------------------
 1072|  3.33k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1073|  3.33k|            need_localtime_ = true;
 1074|  3.33k|            break;
 1075|       |
 1076|  6.38k|        case ('b'):
  ------------------
  |  Branch (1076:9): [True: 6.38k, False: 5.82M]
  ------------------
 1077|  9.43k|        case ('h'):  // month
  ------------------
  |  Branch (1077:9): [True: 3.04k, False: 5.82M]
  ------------------
 1078|  9.43k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1079|  9.43k|            need_localtime_ = true;
 1080|  9.43k|            break;
 1081|       |
 1082|  5.84k|        case ('B'):  // short month
  ------------------
  |  Branch (1082:9): [True: 5.84k, False: 5.82M]
  ------------------
 1083|  5.84k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1084|  5.84k|            need_localtime_ = true;
 1085|  5.84k|            break;
 1086|       |
 1087|  7.30k|        case ('c'):  // datetime
  ------------------
  |  Branch (1087:9): [True: 7.30k, False: 5.82M]
  ------------------
 1088|  7.30k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1089|  7.30k|            need_localtime_ = true;
 1090|  7.30k|            break;
 1091|       |
 1092|  3.36k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1092:9): [True: 3.36k, False: 5.82M]
  ------------------
 1093|  3.36k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1094|  3.36k|            need_localtime_ = true;
 1095|  3.36k|            break;
 1096|       |
 1097|  1.20k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1097:9): [True: 1.20k, False: 5.82M]
  ------------------
 1098|  1.20k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1099|  1.20k|            need_localtime_ = true;
 1100|  1.20k|            break;
 1101|       |
 1102|  27.2k|        case ('D'):
  ------------------
  |  Branch (1102:9): [True: 27.2k, False: 5.80M]
  ------------------
 1103|  40.9k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1103:9): [True: 13.6k, False: 5.81M]
  ------------------
 1104|  40.9k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1105|  40.9k|            need_localtime_ = true;
 1106|  40.9k|            break;
 1107|       |
 1108|  6.01k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1108:9): [True: 6.01k, False: 5.82M]
  ------------------
 1109|  6.01k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1110|  6.01k|            need_localtime_ = true;
 1111|  6.01k|            break;
 1112|       |
 1113|  32.8k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1113:9): [True: 32.8k, False: 5.79M]
  ------------------
 1114|  32.8k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1115|  32.8k|            need_localtime_ = true;
 1116|  32.8k|            break;
 1117|       |
 1118|   463k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1118:9): [True: 463k, False: 5.36M]
  ------------------
 1119|   463k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1120|   463k|            need_localtime_ = true;
 1121|   463k|            break;
 1122|       |
 1123|  8.66k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1123:9): [True: 8.66k, False: 5.82M]
  ------------------
 1124|  8.66k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1125|  8.66k|            need_localtime_ = true;
 1126|  8.66k|            break;
 1127|       |
 1128|   475k|        case ('M'):  // minutes
  ------------------
  |  Branch (1128:9): [True: 475k, False: 5.35M]
  ------------------
 1129|   475k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1130|   475k|            need_localtime_ = true;
 1131|   475k|            break;
 1132|       |
 1133|   459k|        case ('S'):  // seconds
  ------------------
  |  Branch (1133:9): [True: 459k, False: 5.37M]
  ------------------
 1134|   459k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1135|   459k|            need_localtime_ = true;
 1136|   459k|            break;
 1137|       |
 1138|  19.0k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1138:9): [True: 19.0k, False: 5.81M]
  ------------------
 1139|  19.0k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1140|  19.0k|            break;
 1141|       |
 1142|  83.7k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1142:9): [True: 83.7k, False: 5.74M]
  ------------------
 1143|  83.7k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1144|  83.7k|            break;
 1145|       |
 1146|  6.60k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1146:9): [True: 6.60k, False: 5.82M]
  ------------------
 1147|  6.60k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1148|  6.60k|            break;
 1149|       |
 1150|  10.3k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1150:9): [True: 10.3k, False: 5.81M]
  ------------------
 1151|  10.3k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1152|  10.3k|            break;
 1153|       |
 1154|  2.91k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1154:9): [True: 2.91k, False: 5.82M]
  ------------------
 1155|  2.91k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1156|  2.91k|            need_localtime_ = true;
 1157|  2.91k|            break;
 1158|       |
 1159|  17.4k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1159:9): [True: 17.4k, False: 5.81M]
  ------------------
 1160|  17.4k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1161|  17.4k|            need_localtime_ = true;
 1162|  17.4k|            break;
 1163|       |
 1164|  5.18k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1164:9): [True: 5.18k, False: 5.82M]
  ------------------
 1165|  5.18k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1166|  5.18k|            need_localtime_ = true;
 1167|  5.18k|            break;
 1168|       |
 1169|  3.36k|        case ('T'):
  ------------------
  |  Branch (1169:9): [True: 3.36k, False: 5.82M]
  ------------------
 1170|  23.4k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1170:9): [True: 20.1k, False: 5.80M]
  ------------------
 1171|  23.4k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1172|  23.4k|            need_localtime_ = true;
 1173|  23.4k|            break;
 1174|   482k|        case ('z'):  // timezone
  ------------------
  |  Branch (1174:9): [True: 482k, False: 5.34M]
  ------------------
 1175|   482k|            formatters_.push_back(
 1176|   482k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1177|   482k|            need_localtime_ = true;
 1178|   482k|            break;
 1179|  15.5k|        case ('P'):  // pid
  ------------------
  |  Branch (1179:9): [True: 15.5k, False: 5.81M]
  ------------------
 1180|  15.5k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1181|  15.5k|            break;
 1182|       |
 1183|  22.6k|        case ('^'):  // color range start
  ------------------
  |  Branch (1183:9): [True: 22.6k, False: 5.80M]
  ------------------
 1184|  22.6k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1185|  22.6k|            break;
 1186|       |
 1187|  37.5k|        case ('$'):  // color range end
  ------------------
  |  Branch (1187:9): [True: 37.5k, False: 5.79M]
  ------------------
 1188|  37.5k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1189|  37.5k|            break;
 1190|       |
 1191|  9.35k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1191:9): [True: 9.35k, False: 5.81M]
  ------------------
 1192|  9.35k|            formatters_.push_back(
 1193|  9.35k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1194|  9.35k|            break;
 1195|       |
 1196|  7.39k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1196:9): [True: 7.39k, False: 5.82M]
  ------------------
 1197|  7.39k|            formatters_.push_back(
 1198|  7.39k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1199|  7.39k|            break;
 1200|       |
 1201|  3.91k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1201:9): [True: 3.91k, False: 5.82M]
  ------------------
 1202|  3.91k|            formatters_.push_back(
 1203|  3.91k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1204|  3.91k|            break;
 1205|       |
 1206|  4.07k|        case ('#'):  // source line number
  ------------------
  |  Branch (1206:9): [True: 4.07k, False: 5.82M]
  ------------------
 1207|  4.07k|            formatters_.push_back(
 1208|  4.07k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1209|  4.07k|            break;
 1210|       |
 1211|  31.9k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1211:9): [True: 31.9k, False: 5.79M]
  ------------------
 1212|  31.9k|            formatters_.push_back(
 1213|  31.9k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1214|  31.9k|            break;
 1215|       |
 1216|   395k|        case ('%'):  // % char
  ------------------
  |  Branch (1216:9): [True: 395k, False: 5.43M]
  ------------------
 1217|   395k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1218|   395k|            break;
 1219|       |
 1220|  23.1k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1220:9): [True: 23.1k, False: 5.80M]
  ------------------
 1221|  23.1k|            formatters_.push_back(
 1222|  23.1k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1223|  23.1k|                    padding));
 1224|  23.1k|            break;
 1225|       |
 1226|  6.94k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1226:9): [True: 6.94k, False: 5.82M]
  ------------------
 1227|  6.94k|            formatters_.push_back(
 1228|  6.94k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1229|  6.94k|                    padding));
 1230|  6.94k|            break;
 1231|       |
 1232|  32.3k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1232:9): [True: 32.3k, False: 5.79M]
  ------------------
 1233|  32.3k|            formatters_.push_back(
 1234|  32.3k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1235|  32.3k|                    padding));
 1236|  32.3k|            break;
 1237|       |
 1238|  7.50k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1238:9): [True: 7.50k, False: 5.82M]
  ------------------
 1239|  7.50k|            formatters_.push_back(
 1240|  7.50k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1241|  7.50k|                    padding));
 1242|  7.50k|            break;
 1243|       |
 1244|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1245|  2.74M|        case ('&'):
  ------------------
  |  Branch (1245:9): [True: 2.74M, False: 3.08M]
  ------------------
 1246|  2.74M|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1247|  2.74M|            break;
 1248|      0|#endif
 1249|       |
 1250|   161k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1250:9): [True: 161k, False: 5.66M]
  ------------------
 1251|   161k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1252|       |
 1253|   161k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1253:17): [True: 161k, False: 0]
  ------------------
 1254|   161k|                unknown_flag->add_ch('%');
 1255|   161k|                unknown_flag->add_ch(flag);
 1256|   161k|                formatters_.push_back((std::move(unknown_flag)));
 1257|   161k|            }
 1258|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1259|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1260|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1261|      0|            else {
 1262|      0|                padding.truncate_ = false;
 1263|      0|                formatters_.push_back(
 1264|      0|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1265|      0|                unknown_flag->add_ch(flag);
 1266|      0|                formatters_.push_back((std::move(unknown_flag)));
 1267|      0|            }
 1268|       |
 1269|   161k|            break;
 1270|  5.82M|    }
 1271|  5.82M|}
_ZN6spdlog7details14name_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  107|  9.57k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  120|  3.90k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  134|  39.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  575|  83.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  603|  2.76k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  158|  9.49k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  175|  3.33k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  192|  9.43k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  210|  5.84k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  224|  7.30k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  254|  3.36k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  287|  1.20k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  268|  40.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  301|  6.01k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  315|  32.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  329|   463k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  343|  8.66k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  357|   475k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  371|   459k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  385|  19.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  400|  83.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  416|  6.60k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  431|  10.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  447|  2.91k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  461|  17.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  482|  5.18k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  499|  23.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  519|   482k|        : flag_formatter(padinfo),
  520|   482k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  589|  15.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  664|  9.35k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  711|  7.39k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  693|  3.91k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  752|  4.07k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  771|  31.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  792|  23.1k|        : flag_formatter(padinfo),
  793|  23.1k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  792|  6.94k|        : flag_formatter(padinfo),
  793|  6.94k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  792|  32.3k|        : flag_formatter(padinfo),
  793|  32.3k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  792|  7.50k|        : flag_formatter(padinfo),
  793|  7.50k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details19aggregate_formatterC2Ev:
  627|  3.30M|    aggregate_formatter() = default;
_ZN6spdlog7details19aggregate_formatter6add_chEc:
  629|  49.8M|    void add_ch(char ch) { str_ += ch; }

_ZN6spdlog7details14flag_formatterC2ENS0_12padding_infoE:
   43|  6.07M|        : padinfo_(padinfo) {}
_ZN6spdlog7details14flag_formatterD2Ev:
   45|  9.86M|    virtual ~flag_formatter() = default;
_ZN6spdlog7details12padding_infoC2Ev:
   26|  9.62M|    padding_info() = default;
_ZN6spdlog7details12padding_infoC2EmNS1_8pad_sideEb:
   28|   988k|        : width_(width),
   29|   988k|          side_(side),
   30|   988k|          truncate_(truncate),
   31|   988k|          enabled_(true) {}
_ZNK6spdlog7details12padding_info7enabledEv:
   33|  6.81M|    bool enabled() const { return enabled_; }
_ZN6spdlog7details14flag_formatterC2Ev:
   44|  3.78M|    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.64k|    std::unique_ptr<formatter> sink_formatter) {
   80|  1.64k|    std::lock_guard<mutex_t> lock(mutex_);
   81|  1.64k|    formatter_ = std::move(sink_formatter);
   82|  1.64k|}

_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.64k|sinks::base_sink<Mutex>::set_formatter(std::unique_ptr<formatter> sink_formatter) {
   48|  1.64k|    std::lock_guard<Mutex> lock(mutex_);
   49|  1.64k|    set_formatter_(std::move(sink_formatter));
   50|  1.64k|}
_ZN6spdlog5sinks9base_sinkINSt3__15mutexEE14set_formatter_ENS2_10unique_ptrINS_9formatterENS2_14default_deleteIS6_EEEE:
   59|  1.64k|sinks::base_sink<Mutex>::set_formatter_(std::unique_ptr<formatter> sink_formatter) {
   60|  1.64k|    formatter_ = std::move(sink_formatter);
   61|  1.64k|}

_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.64k|SPDLOG_INLINE void set_pattern(std::string pattern, pattern_time_type time_type) {
   28|  1.64k|    set_formatter(
   29|  1.64k|        std::unique_ptr<formatter>(new pattern_formatter(std::move(pattern), time_type)));
   30|  1.64k|}
_ZN6spdlog13set_formatterENSt3__110unique_ptrINS_9formatterENS0_14default_deleteIS2_EEEE:
   23|  1.64k|SPDLOG_INLINE void set_formatter(std::unique_ptr<formatter> formatter) {
   24|  1.64k|    details::registry::instance().set_formatter(std::move(formatter));
   25|  1.64k|}

