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

_ZN6spdlog19file_event_handlersC2Ev:
  330|      1|        : before_open(nullptr),
  331|      1|          after_open(nullptr),
  332|      1|          before_close(nullptr),
  333|      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_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");
  ------------------
  |  |  138|      1|#define SPDLOG_FILENAME_T(s) s
  ------------------
   31|      1|    auto *trunc_mode = SPDLOG_FILENAME_T("wb");
  ------------------
  |  |  138|      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 (event_handlers_.after_open) {
  ------------------
  |  Branch (51:17): [True: 0, False: 1]
  ------------------
   52|      0|                event_handlers_.after_open(filename_, fd_);
   53|      0|            }
   54|      1|            return;
   55|      1|        }
   56|       |
   57|      0|        details::os::sleep_for_millis(open_interval_);
   58|      0|    }
   59|       |
   60|      0|    throw_spdlog_ex("Failed opening file " + os::filename_to_str(filename_) + " for writing",
   61|       |                    errno);
   62|      0|}
_ZN6spdlog7details11file_helper5closeEv:
   83|      2|SPDLOG_INLINE void file_helper::close() {
   84|      2|    if (fd_ != nullptr) {
  ------------------
  |  Branch (84:9): [True: 1, False: 1]
  ------------------
   85|      1|        if (event_handlers_.before_close) {
  ------------------
  |  Branch (85:13): [True: 0, False: 1]
  ------------------
   86|      0|            event_handlers_.before_close(filename_, fd_);
   87|      0|        }
   88|       |
   89|      1|        std::fclose(fd_);
   90|      1|        fd_ = nullptr;
   91|       |
   92|      1|        if (event_handlers_.after_close) {
  ------------------
  |  Branch (92:13): [True: 0, False: 1]
  ------------------
   93|      0|            event_handlers_.after_close(filename_);
   94|      0|        }
   95|      1|    }
   96|      2|}
_ZN6spdlog7details11file_helperD2Ev:
   24|      1|SPDLOG_INLINE file_helper::~file_helper() { close(); }

_ZN6spdlog7details2os11in_terminalEP8_IO_FILE:
  396|      1|SPDLOG_INLINE bool in_terminal(FILE *file) SPDLOG_NOEXCEPT {
  397|       |#ifdef _WIN32
  398|       |    return ::_isatty(_fileno(file)) != 0;
  399|       |#else
  400|      1|    return ::isatty(fileno(file)) != 0;
  401|      1|#endif
  402|      1|}
_ZN6spdlog7details2os10create_dirERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  482|      1|SPDLOG_INLINE bool create_dir(const filename_t &path) {
  483|      1|    if (path_exists(path)) {
  ------------------
  |  Branch (483:9): [True: 1, False: 0]
  ------------------
  484|      1|        return true;
  485|      1|    }
  486|       |
  487|      0|    if (path.empty()) {
  ------------------
  |  Branch (487:9): [True: 0, False: 0]
  ------------------
  488|      0|        return false;
  489|      0|    }
  490|       |
  491|      0|    size_t search_offset = 0;
  492|      0|    do {
  493|      0|        auto token_pos = path.find_first_of(folder_seps_filename, search_offset);
  494|       |        // treat the entire path as a folder if no folder separator not found
  495|      0|        if (token_pos == filename_t::npos) {
  ------------------
  |  Branch (495:13): [True: 0, False: 0]
  ------------------
  496|      0|            token_pos = path.size();
  497|      0|        }
  498|       |
  499|      0|        auto subdir = path.substr(0, token_pos);
  500|       |#ifdef _WIN32
  501|       |        // if subdir is just a drive letter, add a slash e.g. "c:"=>"c:\",
  502|       |        // otherwise path_exists(subdir) returns false (issue #3079)
  503|       |        const bool is_drive = subdir.length() == 2 && subdir[1] == ':';
  504|       |        if (is_drive) {
  505|       |            subdir += '\\';
  506|       |            token_pos++;
  507|       |        }
  508|       |#endif
  509|       |
  510|      0|        if (!subdir.empty() && !path_exists(subdir) && !mkdir_(subdir)) {
  ------------------
  |  Branch (510:13): [True: 0, False: 0]
  |  Branch (510:32): [True: 0, False: 0]
  |  Branch (510:56): [True: 0, False: 0]
  ------------------
  511|      0|            return false;  // return error if failed creating dir
  512|      0|        }
  513|      0|        search_offset = token_pos + 1;
  514|      0|    } while (search_offset < path.size());
  ------------------
  |  Branch (514:14): [True: 0, False: 0]
  ------------------
  515|       |
  516|      0|    return true;
  517|      0|}
_ZN6spdlog7details2os11path_existsERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  177|      1|SPDLOG_INLINE bool path_exists(const filename_t &filename) SPDLOG_NOEXCEPT {
  178|       |#ifdef _WIN32
  179|       |    struct _stat buffer;
  180|       |#ifdef SPDLOG_WCHAR_FILENAMES
  181|       |    return (::_wstat(filename.c_str(), &buffer) == 0);
  182|       |#else
  183|       |    return (::_stat(filename.c_str(), &buffer) == 0);
  184|       |#endif
  185|       |#else  // common linux/unix all have the stat system call
  186|      1|    struct stat buffer;
  187|      1|    return (::stat(filename.c_str(), &buffer) == 0);
  188|      1|#endif
  189|      1|}
_ZN6spdlog7details2os8dir_nameERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  524|      1|SPDLOG_INLINE filename_t dir_name(const filename_t &path) {
  525|      1|    auto pos = path.find_last_of(folder_seps_filename);
  526|      1|    return pos != filename_t::npos ? path.substr(0, pos) : filename_t{};
  ------------------
  |  Branch (526:12): [True: 1, False: 0]
  ------------------
  527|      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.70k|SPDLOG_INLINE registry &registry::instance() {
  242|  1.70k|    static registry s_instance;
  243|  1.70k|    return s_instance;
  244|  1.70k|}
_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<spdlog::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.70k|SPDLOG_INLINE void registry::set_formatter(std::unique_ptr<formatter> formatter) {
  125|  1.70k|    std::lock_guard<std::mutex> lock(logger_map_mutex_);
  126|  1.70k|    formatter_ = std::move(formatter);
  127|  3.41k|    for (auto &l : loggers_) {
  ------------------
  |  Branch (127:18): [True: 3.41k, False: 1.70k]
  ------------------
  128|  3.41k|        l.second->set_formatter(formatter_->clone());
  129|  3.41k|    }
  130|  1.70k|}
_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_handlersEEEENS4_10shared_ptrINS_6loggerEEESC_DpOT0_:
   15|      1|    static std::shared_ptr<spdlog::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<spdlog::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|  19.3k|  FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; }
_ZN3fmt3v126detail6bufferIcEC2EPFvRS3_mEPcmm:
 1790|  19.3k|      : ptr_(p), size_(sz), capacity_(cap), grow_(grow) {}
_ZN3fmt3v126detail6bufferIcE3setEPcm:
 1796|  19.3k|  FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept {
 1797|  19.3k|    ptr_ = buf_data;
 1798|  19.3k|    capacity_ = buf_capacity;
 1799|  19.3k|  }
_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|  19.3k|      : detail::buffer<T>(grow), alloc_(alloc) {
  841|  19.3k|    this->set(store_, SIZE);
  842|  19.3k|    if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T());
  ------------------
  |  Branch (842:9): [Folded, False: 19.3k]
  ------------------
  843|  19.3k|  }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEED2Ev:
  844|  19.3k|  FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); }
_ZN3fmt3v1219basic_memory_bufferIcLm250ENS0_6detail9allocatorIcEEE10deallocateEv:
  805|  19.3k|  FMT_CONSTEXPR20 void deallocate() {
  806|  19.3k|    T* data = this->data();
  807|  19.3k|    if (data != store_) alloc_.deallocate(data, this->capacity());
  ------------------
  |  Branch (807:9): [True: 0, False: 19.3k]
  ------------------
  808|  19.3k|  }

_ZN6spdlog9formatterD2Ev:
   13|  5.11k|    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.41k|SPDLOG_INLINE void logger::set_formatter(std::unique_ptr<formatter> f) {
   73|  3.41k|    for (auto it = sinks_.begin(); it != sinks_.end(); ++it) {
  ------------------
  |  Branch (73:36): [True: 3.41k, False: 0]
  ------------------
   74|  3.41k|        if (std::next(it) == sinks_.end()) {
  ------------------
  |  Branch (74:13): [True: 3.41k, False: 0]
  ------------------
   75|       |            // last element - we can be move it.
   76|  3.41k|            (*it)->set_formatter(std::move(f));
   77|  3.41k|            break;  // to prevent clang-tidy warning
   78|  3.41k|        } else {
   79|      0|            (*it)->set_formatter(f->clone());
   80|      0|        }
   81|  3.41k|    }
   82|  3.41k|}
_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:
  974|  3.41k|SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const {
  975|  3.41k|    custom_flags cloned_custom_formatters;
  976|  3.41k|    for (auto &it : custom_handlers_) {
  ------------------
  |  Branch (976:19): [True: 0, False: 3.41k]
  ------------------
  977|      0|        cloned_custom_formatters[it.first] = it.second->clone();
  978|      0|    }
  979|  3.41k|    auto cloned = details::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_,
  980|  3.41k|                                                          std::move(cloned_custom_formatters));
  981|  3.41k|    cloned->need_localtime(need_localtime_);
  982|  3.41k|#if defined(__GNUC__) && __GNUC__ < 5
  983|  3.41k|    return std::move(cloned);
  984|       |#else
  985|       |    return cloned;
  986|       |#endif
  987|  3.41k|}
_ZN6spdlog17pattern_formatter14need_localtimeEb:
 1012|  3.41k|SPDLOG_INLINE void pattern_formatter::need_localtime(bool need) { need_localtime_ = need; }
_ZN6spdlog17pattern_formatterC2ENS_17pattern_time_typeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  965|      3|    : pattern_("%+"),
  966|      3|      eol_(std::move(eol)),
  967|      3|      pattern_time_type_(time_type),
  968|      3|      need_localtime_(true),
  969|      3|      last_log_secs_(0) {
  970|      3|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  971|      3|    formatters_.push_back(details::make_unique<details::full_formatter>(details::padding_info{}));
  972|      3|}
_ZN6spdlog7details14full_formatterC2ENS0_12padding_infoE:
  853|  19.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details13mdc_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  813|  3.26M|        : 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:
  953|  5.11k|    : pattern_(std::move(pattern)),
  954|  5.11k|      eol_(std::move(eol)),
  955|  5.11k|      pattern_time_type_(time_type),
  956|  5.11k|      need_localtime_(false),
  957|  5.11k|      last_log_secs_(0),
  958|  5.11k|      custom_handlers_(std::move(custom_user_flags)) {
  959|  5.11k|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  960|  5.11k|    compile_pattern_(pattern_);
  961|  5.11k|}
_ZN6spdlog17pattern_formatter16compile_pattern_ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1315|  5.11k|SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &pattern) {
 1316|  5.11k|    auto end = pattern.end();
 1317|  5.11k|    std::unique_ptr<details::aggregate_formatter> user_chars;
 1318|  5.11k|    formatters_.clear();
 1319|  50.1M|    for (auto it = pattern.begin(); it != end; ++it) {
  ------------------
  |  Branch (1319:37): [True: 50.1M, False: 4.20k]
  ------------------
 1320|  50.1M|        if (*it == '%') {
  ------------------
  |  Branch (1320:13): [True: 8.83M, False: 41.3M]
  ------------------
 1321|  8.83M|            if (user_chars)  // append user chars found so far
  ------------------
  |  Branch (1321:17): [True: 3.47M, False: 5.36M]
  ------------------
 1322|  3.47M|            {
 1323|  3.47M|                formatters_.push_back(std::move(user_chars));
 1324|  3.47M|            }
 1325|       |
 1326|  8.83M|            auto padding = handle_padspec_(++it, end);
 1327|       |
 1328|  8.83M|            if (it != end) {
  ------------------
  |  Branch (1328:17): [True: 8.83M, False: 909]
  ------------------
 1329|  8.83M|                if (padding.enabled()) {
  ------------------
  |  Branch (1329:21): [True: 1.60M, False: 7.23M]
  ------------------
 1330|  1.60M|                    handle_flag_<details::scoped_padder>(*it, padding);
 1331|  7.23M|                } else {
 1332|  7.23M|                    handle_flag_<details::null_scoped_padder>(*it, padding);
 1333|  7.23M|                }
 1334|  8.83M|            } else {
 1335|    909|                break;
 1336|    909|            }
 1337|  8.83M|        } else  // chars not following the % sign should be displayed as is
 1338|  41.3M|        {
 1339|  41.3M|            if (!user_chars) {
  ------------------
  |  Branch (1339:17): [True: 3.47M, False: 37.8M]
  ------------------
 1340|  3.47M|                user_chars = details::make_unique<details::aggregate_formatter>();
 1341|  3.47M|            }
 1342|  41.3M|            user_chars->add_ch(*it);
 1343|  41.3M|        }
 1344|  50.1M|    }
 1345|  5.11k|    if (user_chars)  // append raw chars found so far
  ------------------
  |  Branch (1345:9): [True: 1.01k, False: 4.09k]
  ------------------
 1346|  1.01k|    {
 1347|  1.01k|        formatters_.push_back(std::move(user_chars));
 1348|  1.01k|    }
 1349|  5.11k|}
_ZN6spdlog17pattern_formatter15handle_padspec_ERNSt3__111__wrap_iterIPKcEES5_:
 1271|  8.83M|    std::string::const_iterator &it, std::string::const_iterator end) {
 1272|  8.83M|    using details::padding_info;
 1273|  8.83M|    using details::scoped_padder;
 1274|  8.83M|    const size_t max_width = 64;
 1275|  8.83M|    if (it == end) {
  ------------------
  |  Branch (1275:9): [True: 270, False: 8.83M]
  ------------------
 1276|    270|        return padding_info{};
 1277|    270|    }
 1278|       |
 1279|  8.83M|    padding_info::pad_side side;
 1280|  8.83M|    switch (*it) {
 1281|  40.9k|        case '-':
  ------------------
  |  Branch (1281:9): [True: 40.9k, False: 8.79M]
  ------------------
 1282|  40.9k|            side = padding_info::pad_side::right;
 1283|  40.9k|            ++it;
 1284|  40.9k|            break;
 1285|  10.1k|        case '=':
  ------------------
  |  Branch (1285:9): [True: 10.1k, False: 8.82M]
  ------------------
 1286|  10.1k|            side = padding_info::pad_side::center;
 1287|  10.1k|            ++it;
 1288|  10.1k|            break;
 1289|  8.78M|        default:
  ------------------
  |  Branch (1289:9): [True: 8.78M, False: 51.0k]
  ------------------
 1290|  8.78M|            side = details::padding_info::pad_side::left;
 1291|  8.78M|            break;
 1292|  8.83M|    }
 1293|       |
 1294|  8.83M|    if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
  ------------------
  |  Branch (1294:9): [True: 75, False: 8.83M]
  |  Branch (1294:22): [True: 7.23M, False: 1.60M]
  ------------------
 1295|  7.23M|        return padding_info{};  // no padding if no digit found here
 1296|  7.23M|    }
 1297|       |
 1298|  1.60M|    auto width = static_cast<size_t>(*it) - '0';
 1299|  3.17M|    for (++it; it != end && std::isdigit(static_cast<unsigned char>(*it)); ++it) {
  ------------------
  |  Branch (1299:16): [True: 3.17M, False: 534]
  |  Branch (1299:29): [True: 1.57M, False: 1.60M]
  ------------------
 1300|  1.57M|        auto digit = static_cast<size_t>(*it) - '0';
 1301|  1.57M|        width = width * 10 + digit;
 1302|  1.57M|    }
 1303|       |
 1304|       |    // search for the optional truncate marker '!'
 1305|  1.60M|    bool truncate;
 1306|  1.60M|    if (it != end && *it == '!') {
  ------------------
  |  Branch (1306:9): [True: 1.60M, False: 534]
  |  Branch (1306:22): [True: 31.2k, False: 1.57M]
  ------------------
 1307|  31.2k|        truncate = true;
 1308|  31.2k|        ++it;
 1309|  1.57M|    } else {
 1310|  1.57M|        truncate = false;
 1311|  1.57M|    }
 1312|  1.60M|    return details::padding_info{std::min<size_t>(width, max_width), side, truncate};
 1313|  8.83M|}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details13scoped_padderEEEvcNS2_12padding_infoE:
 1022|  1.60M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1023|       |    // process custom flags
 1024|  1.60M|    auto it = custom_handlers_.find(flag);
 1025|  1.60M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1025:9): [True: 0, False: 1.60M]
  ------------------
 1026|      0|        auto custom_handler = it->second->clone();
 1027|      0|        custom_handler->set_padding_info(padding);
 1028|      0|        formatters_.push_back(std::move(custom_handler));
 1029|      0|        return;
 1030|      0|    }
 1031|       |
 1032|       |    // process built-in flags
 1033|  1.60M|    switch (flag) {
 1034|  6.41k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1034:9): [True: 6.41k, False: 1.60M]
  ------------------
 1035|  6.41k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1036|  6.41k|            need_localtime_ = true;
 1037|  6.41k|            break;
 1038|       |
 1039|  7.00k|        case 'n':  // logger name
  ------------------
  |  Branch (1039:9): [True: 7.00k, False: 1.59M]
  ------------------
 1040|  7.00k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1041|  7.00k|            break;
 1042|       |
 1043|  18.9k|        case 'l':  // level
  ------------------
  |  Branch (1043:9): [True: 18.9k, False: 1.58M]
  ------------------
 1044|  18.9k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1045|  18.9k|            break;
 1046|       |
 1047|  3.34k|        case 'L':  // short level
  ------------------
  |  Branch (1047:9): [True: 3.34k, False: 1.60M]
  ------------------
 1048|  3.34k|            formatters_.push_back(
 1049|  3.34k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1050|  3.34k|            break;
 1051|       |
 1052|  37.9k|        case ('t'):  // thread id
  ------------------
  |  Branch (1052:9): [True: 37.9k, False: 1.56M]
  ------------------
 1053|  37.9k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1054|  37.9k|            break;
 1055|       |
 1056|  11.1k|        case ('v'):  // the message text
  ------------------
  |  Branch (1056:9): [True: 11.1k, False: 1.59M]
  ------------------
 1057|  11.1k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1058|  11.1k|            break;
 1059|       |
 1060|  24.4k|        case ('a'):  // weekday
  ------------------
  |  Branch (1060:9): [True: 24.4k, False: 1.58M]
  ------------------
 1061|  24.4k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1062|  24.4k|            need_localtime_ = true;
 1063|  24.4k|            break;
 1064|       |
 1065|  9.35k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1065:9): [True: 9.35k, False: 1.59M]
  ------------------
 1066|  9.35k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1067|  9.35k|            need_localtime_ = true;
 1068|  9.35k|            break;
 1069|       |
 1070|  6.18k|        case ('b'):
  ------------------
  |  Branch (1070:9): [True: 6.18k, False: 1.60M]
  ------------------
 1071|  24.1k|        case ('h'):  // month
  ------------------
  |  Branch (1071:9): [True: 18.0k, False: 1.58M]
  ------------------
 1072|  24.1k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1073|  24.1k|            need_localtime_ = true;
 1074|  24.1k|            break;
 1075|       |
 1076|  9.45k|        case ('B'):  // short month
  ------------------
  |  Branch (1076:9): [True: 9.45k, False: 1.59M]
  ------------------
 1077|  9.45k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1078|  9.45k|            need_localtime_ = true;
 1079|  9.45k|            break;
 1080|       |
 1081|  5.11k|        case ('c'):  // datetime
  ------------------
  |  Branch (1081:9): [True: 5.11k, False: 1.60M]
  ------------------
 1082|  5.11k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1083|  5.11k|            need_localtime_ = true;
 1084|  5.11k|            break;
 1085|       |
 1086|  3.16k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1086:9): [True: 3.16k, False: 1.60M]
  ------------------
 1087|  3.16k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1088|  3.16k|            need_localtime_ = true;
 1089|  3.16k|            break;
 1090|       |
 1091|  8.57k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1091:9): [True: 8.57k, False: 1.59M]
  ------------------
 1092|  8.57k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1093|  8.57k|            need_localtime_ = true;
 1094|  8.57k|            break;
 1095|       |
 1096|  4.91k|        case ('D'):
  ------------------
  |  Branch (1096:9): [True: 4.91k, False: 1.60M]
  ------------------
 1097|  43.5k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1097:9): [True: 38.6k, False: 1.56M]
  ------------------
 1098|  43.5k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1099|  43.5k|            need_localtime_ = true;
 1100|  43.5k|            break;
 1101|       |
 1102|  69.9k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1102:9): [True: 69.9k, False: 1.53M]
  ------------------
 1103|  69.9k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1104|  69.9k|            need_localtime_ = true;
 1105|  69.9k|            break;
 1106|       |
 1107|  12.4k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1107:9): [True: 12.4k, False: 1.59M]
  ------------------
 1108|  12.4k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1109|  12.4k|            need_localtime_ = true;
 1110|  12.4k|            break;
 1111|       |
 1112|  3.63k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1112:9): [True: 3.63k, False: 1.60M]
  ------------------
 1113|  3.63k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1114|  3.63k|            need_localtime_ = true;
 1115|  3.63k|            break;
 1116|       |
 1117|  41.1k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1117:9): [True: 41.1k, False: 1.56M]
  ------------------
 1118|  41.1k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1119|  41.1k|            need_localtime_ = true;
 1120|  41.1k|            break;
 1121|       |
 1122|  91.1k|        case ('M'):  // minutes
  ------------------
  |  Branch (1122:9): [True: 91.1k, False: 1.51M]
  ------------------
 1123|  91.1k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1124|  91.1k|            need_localtime_ = true;
 1125|  91.1k|            break;
 1126|       |
 1127|  2.45k|        case ('S'):  // seconds
  ------------------
  |  Branch (1127:9): [True: 2.45k, False: 1.60M]
  ------------------
 1128|  2.45k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1129|  2.45k|            need_localtime_ = true;
 1130|  2.45k|            break;
 1131|       |
 1132|  19.6k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1132:9): [True: 19.6k, False: 1.58M]
  ------------------
 1133|  19.6k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1134|  19.6k|            break;
 1135|       |
 1136|  45.3k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1136:9): [True: 45.3k, False: 1.56M]
  ------------------
 1137|  45.3k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1138|  45.3k|            break;
 1139|       |
 1140|   117k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1140:9): [True: 117k, False: 1.48M]
  ------------------
 1141|   117k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1142|   117k|            break;
 1143|       |
 1144|  91.5k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1144:9): [True: 91.5k, False: 1.51M]
  ------------------
 1145|  91.5k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1146|  91.5k|            break;
 1147|       |
 1148|  28.4k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1148:9): [True: 28.4k, False: 1.57M]
  ------------------
 1149|  28.4k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1150|  28.4k|            need_localtime_ = true;
 1151|  28.4k|            break;
 1152|       |
 1153|  54.2k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1153:9): [True: 54.2k, False: 1.55M]
  ------------------
 1154|  54.2k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1155|  54.2k|            need_localtime_ = true;
 1156|  54.2k|            break;
 1157|       |
 1158|   155k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1158:9): [True: 155k, False: 1.45M]
  ------------------
 1159|   155k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1160|   155k|            need_localtime_ = true;
 1161|   155k|            break;
 1162|       |
 1163|  7.77k|        case ('T'):
  ------------------
  |  Branch (1163:9): [True: 7.77k, False: 1.59M]
  ------------------
 1164|  41.0k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1164:9): [True: 33.3k, False: 1.57M]
  ------------------
 1165|  41.0k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1166|  41.0k|            need_localtime_ = true;
 1167|  41.0k|            break;
 1168|  6.38k|        case ('z'):  // timezone
  ------------------
  |  Branch (1168:9): [True: 6.38k, False: 1.60M]
  ------------------
 1169|  6.38k|            formatters_.push_back(
 1170|  6.38k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1171|  6.38k|            need_localtime_ = true;
 1172|  6.38k|            break;
 1173|  85.4k|        case ('P'):  // pid
  ------------------
  |  Branch (1173:9): [True: 85.4k, False: 1.52M]
  ------------------
 1174|  85.4k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1175|  85.4k|            break;
 1176|       |
 1177|  3.03k|        case ('^'):  // color range start
  ------------------
  |  Branch (1177:9): [True: 3.03k, False: 1.60M]
  ------------------
 1178|  3.03k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1179|  3.03k|            break;
 1180|       |
 1181|  30.3k|        case ('$'):  // color range end
  ------------------
  |  Branch (1181:9): [True: 30.3k, False: 1.57M]
  ------------------
 1182|  30.3k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1183|  30.3k|            break;
 1184|       |
 1185|  4.62k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1185:9): [True: 4.62k, False: 1.60M]
  ------------------
 1186|  4.62k|            formatters_.push_back(
 1187|  4.62k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1188|  4.62k|            break;
 1189|       |
 1190|  5.94k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1190:9): [True: 5.94k, False: 1.60M]
  ------------------
 1191|  5.94k|            formatters_.push_back(
 1192|  5.94k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1193|  5.94k|            break;
 1194|       |
 1195|  42.5k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1195:9): [True: 42.5k, False: 1.56M]
  ------------------
 1196|  42.5k|            formatters_.push_back(
 1197|  42.5k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1198|  42.5k|            break;
 1199|       |
 1200|  54.0k|        case ('#'):  // source line number
  ------------------
  |  Branch (1200:9): [True: 54.0k, False: 1.55M]
  ------------------
 1201|  54.0k|            formatters_.push_back(
 1202|  54.0k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1203|  54.0k|            break;
 1204|       |
 1205|  9.71k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1205:9): [True: 9.71k, False: 1.59M]
  ------------------
 1206|  9.71k|            formatters_.push_back(
 1207|  9.71k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1208|  9.71k|            break;
 1209|       |
 1210|   129k|        case ('%'):  // % char
  ------------------
  |  Branch (1210:9): [True: 129k, False: 1.47M]
  ------------------
 1211|   129k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1212|   129k|            break;
 1213|       |
 1214|  12.3k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1214:9): [True: 12.3k, False: 1.59M]
  ------------------
 1215|  12.3k|            formatters_.push_back(
 1216|  12.3k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1217|  12.3k|                    padding));
 1218|  12.3k|            break;
 1219|       |
 1220|  6.37k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1220:9): [True: 6.37k, False: 1.60M]
  ------------------
 1221|  6.37k|            formatters_.push_back(
 1222|  6.37k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1223|  6.37k|                    padding));
 1224|  6.37k|            break;
 1225|       |
 1226|  19.5k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1226:9): [True: 19.5k, False: 1.58M]
  ------------------
 1227|  19.5k|            formatters_.push_back(
 1228|  19.5k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1229|  19.5k|                    padding));
 1230|  19.5k|            break;
 1231|       |
 1232|  52.4k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1232:9): [True: 52.4k, False: 1.55M]
  ------------------
 1233|  52.4k|            formatters_.push_back(
 1234|  52.4k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1235|  52.4k|                    padding));
 1236|  52.4k|            break;
 1237|       |
 1238|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1239|  1.89k|        case ('&'):
  ------------------
  |  Branch (1239:9): [True: 1.89k, False: 1.60M]
  ------------------
 1240|  1.89k|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1241|  1.89k|            break;
 1242|      0|#endif
 1243|       |
 1244|   155k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1244:9): [True: 155k, False: 1.45M]
  ------------------
 1245|   155k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1246|       |
 1247|   155k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1247:17): [True: 146k, False: 9.71k]
  ------------------
 1248|   146k|                unknown_flag->add_ch('%');
 1249|   146k|                unknown_flag->add_ch(flag);
 1250|   146k|                formatters_.push_back((std::move(unknown_flag)));
 1251|   146k|            }
 1252|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1253|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1254|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1255|  9.71k|            else {
 1256|  9.71k|                padding.truncate_ = false;
 1257|  9.71k|                formatters_.push_back(
 1258|  9.71k|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1259|  9.71k|                unknown_flag->add_ch(flag);
 1260|  9.71k|                formatters_.push_back((std::move(unknown_flag)));
 1261|  9.71k|            }
 1262|       |
 1263|   155k|            break;
 1264|  1.60M|    }
 1265|  1.60M|}
_ZN6spdlog7details14name_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  107|  7.00k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  120|  18.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  134|  3.34k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  572|  37.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  600|  11.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  158|  24.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  175|  9.35k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  192|  24.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  210|  9.45k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  224|  5.11k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  253|  3.16k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  286|  8.57k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  267|  43.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  300|  69.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  314|  12.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  328|  3.63k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  342|  41.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  356|  91.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  370|  2.45k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  384|  19.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  399|  45.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  415|   117k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  430|  91.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  446|  28.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  460|  54.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  481|   155k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  498|  41.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  518|  6.38k|        : flag_formatter(padinfo),
  519|  6.38k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  586|  85.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21color_start_formatterC2ENS0_12padding_infoE:
  639|  38.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details20color_stop_formatterC2ENS0_12padding_infoE:
  649|  80.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  661|  4.62k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  708|  5.94k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  690|  42.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  749|  54.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  768|  19.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details12ch_formatterC2Ec:
  611|  1.14M|        : ch_(ch) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  789|  12.3k|        : flag_formatter(padinfo),
  790|  12.3k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  789|  6.37k|        : flag_formatter(padinfo),
  790|  6.37k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  789|  19.5k|        : flag_formatter(padinfo),
  790|  19.5k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  789|  52.4k|        : flag_formatter(padinfo),
  790|  52.4k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details13mdc_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  813|  1.89k|        : flag_formatter(padinfo) {}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details18null_scoped_padderEEEvcNS2_12padding_infoE:
 1022|  7.23M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1023|       |    // process custom flags
 1024|  7.23M|    auto it = custom_handlers_.find(flag);
 1025|  7.23M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1025:9): [True: 0, False: 7.23M]
  ------------------
 1026|      0|        auto custom_handler = it->second->clone();
 1027|      0|        custom_handler->set_padding_info(padding);
 1028|      0|        formatters_.push_back(std::move(custom_handler));
 1029|      0|        return;
 1030|      0|    }
 1031|       |
 1032|       |    // process built-in flags
 1033|  7.23M|    switch (flag) {
 1034|  12.9k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1034:9): [True: 12.9k, False: 7.21M]
  ------------------
 1035|  12.9k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1036|  12.9k|            need_localtime_ = true;
 1037|  12.9k|            break;
 1038|       |
 1039|  14.7k|        case 'n':  // logger name
  ------------------
  |  Branch (1039:9): [True: 14.7k, False: 7.21M]
  ------------------
 1040|  14.7k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1041|  14.7k|            break;
 1042|       |
 1043|  3.76k|        case 'l':  // level
  ------------------
  |  Branch (1043:9): [True: 3.76k, False: 7.22M]
  ------------------
 1044|  3.76k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1045|  3.76k|            break;
 1046|       |
 1047|  58.4k|        case 'L':  // short level
  ------------------
  |  Branch (1047:9): [True: 58.4k, False: 7.17M]
  ------------------
 1048|  58.4k|            formatters_.push_back(
 1049|  58.4k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1050|  58.4k|            break;
 1051|       |
 1052|  90.9k|        case ('t'):  // thread id
  ------------------
  |  Branch (1052:9): [True: 90.9k, False: 7.14M]
  ------------------
 1053|  90.9k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1054|  90.9k|            break;
 1055|       |
 1056|  3.13k|        case ('v'):  // the message text
  ------------------
  |  Branch (1056:9): [True: 3.13k, False: 7.22M]
  ------------------
 1057|  3.13k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1058|  3.13k|            break;
 1059|       |
 1060|  15.2k|        case ('a'):  // weekday
  ------------------
  |  Branch (1060:9): [True: 15.2k, False: 7.21M]
  ------------------
 1061|  15.2k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1062|  15.2k|            need_localtime_ = true;
 1063|  15.2k|            break;
 1064|       |
 1065|  10.8k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1065:9): [True: 10.8k, False: 7.22M]
  ------------------
 1066|  10.8k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1067|  10.8k|            need_localtime_ = true;
 1068|  10.8k|            break;
 1069|       |
 1070|  19.8k|        case ('b'):
  ------------------
  |  Branch (1070:9): [True: 19.8k, False: 7.21M]
  ------------------
 1071|  28.8k|        case ('h'):  // month
  ------------------
  |  Branch (1071:9): [True: 9.00k, False: 7.22M]
  ------------------
 1072|  28.8k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1073|  28.8k|            need_localtime_ = true;
 1074|  28.8k|            break;
 1075|       |
 1076|  79.2k|        case ('B'):  // short month
  ------------------
  |  Branch (1076:9): [True: 79.2k, False: 7.15M]
  ------------------
 1077|  79.2k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1078|  79.2k|            need_localtime_ = true;
 1079|  79.2k|            break;
 1080|       |
 1081|  13.9k|        case ('c'):  // datetime
  ------------------
  |  Branch (1081:9): [True: 13.9k, False: 7.21M]
  ------------------
 1082|  13.9k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1083|  13.9k|            need_localtime_ = true;
 1084|  13.9k|            break;
 1085|       |
 1086|  4.55k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1086:9): [True: 4.55k, False: 7.22M]
  ------------------
 1087|  4.55k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1088|  4.55k|            need_localtime_ = true;
 1089|  4.55k|            break;
 1090|       |
 1091|  4.03k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1091:9): [True: 4.03k, False: 7.22M]
  ------------------
 1092|  4.03k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1093|  4.03k|            need_localtime_ = true;
 1094|  4.03k|            break;
 1095|       |
 1096|  21.7k|        case ('D'):
  ------------------
  |  Branch (1096:9): [True: 21.7k, False: 7.21M]
  ------------------
 1097|  46.9k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1097:9): [True: 25.1k, False: 7.20M]
  ------------------
 1098|  46.9k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1099|  46.9k|            need_localtime_ = true;
 1100|  46.9k|            break;
 1101|       |
 1102|  9.00k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1102:9): [True: 9.00k, False: 7.22M]
  ------------------
 1103|  9.00k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1104|  9.00k|            need_localtime_ = true;
 1105|  9.00k|            break;
 1106|       |
 1107|  53.0k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1107:9): [True: 53.0k, False: 7.17M]
  ------------------
 1108|  53.0k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1109|  53.0k|            need_localtime_ = true;
 1110|  53.0k|            break;
 1111|       |
 1112|  81.4k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1112:9): [True: 81.4k, False: 7.15M]
  ------------------
 1113|  81.4k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1114|  81.4k|            need_localtime_ = true;
 1115|  81.4k|            break;
 1116|       |
 1117|  12.8k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1117:9): [True: 12.8k, False: 7.21M]
  ------------------
 1118|  12.8k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1119|  12.8k|            need_localtime_ = true;
 1120|  12.8k|            break;
 1121|       |
 1122|  88.7k|        case ('M'):  // minutes
  ------------------
  |  Branch (1122:9): [True: 88.7k, False: 7.14M]
  ------------------
 1123|  88.7k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1124|  88.7k|            need_localtime_ = true;
 1125|  88.7k|            break;
 1126|       |
 1127|  75.9k|        case ('S'):  // seconds
  ------------------
  |  Branch (1127:9): [True: 75.9k, False: 7.15M]
  ------------------
 1128|  75.9k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1129|  75.9k|            need_localtime_ = true;
 1130|  75.9k|            break;
 1131|       |
 1132|  22.1k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1132:9): [True: 22.1k, False: 7.20M]
  ------------------
 1133|  22.1k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1134|  22.1k|            break;
 1135|       |
 1136|   176k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1136:9): [True: 176k, False: 7.05M]
  ------------------
 1137|   176k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1138|   176k|            break;
 1139|       |
 1140|  7.22k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1140:9): [True: 7.22k, False: 7.22M]
  ------------------
 1141|  7.22k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1142|  7.22k|            break;
 1143|       |
 1144|  1.29M|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1144:9): [True: 1.29M, False: 5.93M]
  ------------------
 1145|  1.29M|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1146|  1.29M|            break;
 1147|       |
 1148|  2.58k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1148:9): [True: 2.58k, False: 7.22M]
  ------------------
 1149|  2.58k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1150|  2.58k|            need_localtime_ = true;
 1151|  2.58k|            break;
 1152|       |
 1153|  34.4k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1153:9): [True: 34.4k, False: 7.19M]
  ------------------
 1154|  34.4k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1155|  34.4k|            need_localtime_ = true;
 1156|  34.4k|            break;
 1157|       |
 1158|  6.77k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1158:9): [True: 6.77k, False: 7.22M]
  ------------------
 1159|  6.77k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1160|  6.77k|            need_localtime_ = true;
 1161|  6.77k|            break;
 1162|       |
 1163|  22.2k|        case ('T'):
  ------------------
  |  Branch (1163:9): [True: 22.2k, False: 7.20M]
  ------------------
 1164|  48.4k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1164:9): [True: 26.1k, False: 7.20M]
  ------------------
 1165|  48.4k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1166|  48.4k|            need_localtime_ = true;
 1167|  48.4k|            break;
 1168|   144k|        case ('z'):  // timezone
  ------------------
  |  Branch (1168:9): [True: 144k, False: 7.08M]
  ------------------
 1169|   144k|            formatters_.push_back(
 1170|   144k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1171|   144k|            need_localtime_ = true;
 1172|   144k|            break;
 1173|  28.4k|        case ('P'):  // pid
  ------------------
  |  Branch (1173:9): [True: 28.4k, False: 7.20M]
  ------------------
 1174|  28.4k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1175|  28.4k|            break;
 1176|       |
 1177|  35.1k|        case ('^'):  // color range start
  ------------------
  |  Branch (1177:9): [True: 35.1k, False: 7.19M]
  ------------------
 1178|  35.1k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1179|  35.1k|            break;
 1180|       |
 1181|  50.3k|        case ('$'):  // color range end
  ------------------
  |  Branch (1181:9): [True: 50.3k, False: 7.18M]
  ------------------
 1182|  50.3k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1183|  50.3k|            break;
 1184|       |
 1185|  14.2k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1185:9): [True: 14.2k, False: 7.21M]
  ------------------
 1186|  14.2k|            formatters_.push_back(
 1187|  14.2k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1188|  14.2k|            break;
 1189|       |
 1190|  4.50k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1190:9): [True: 4.50k, False: 7.22M]
  ------------------
 1191|  4.50k|            formatters_.push_back(
 1192|  4.50k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1193|  4.50k|            break;
 1194|       |
 1195|  7.42k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1195:9): [True: 7.42k, False: 7.22M]
  ------------------
 1196|  7.42k|            formatters_.push_back(
 1197|  7.42k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1198|  7.42k|            break;
 1199|       |
 1200|  3.59k|        case ('#'):  // source line number
  ------------------
  |  Branch (1200:9): [True: 3.59k, False: 7.22M]
  ------------------
 1201|  3.59k|            formatters_.push_back(
 1202|  3.59k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1203|  3.59k|            break;
 1204|       |
 1205|  38.3k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1205:9): [True: 38.3k, False: 7.19M]
  ------------------
 1206|  38.3k|            formatters_.push_back(
 1207|  38.3k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1208|  38.3k|            break;
 1209|       |
 1210|  1.01M|        case ('%'):  // % char
  ------------------
  |  Branch (1210:9): [True: 1.01M, False: 6.21M]
  ------------------
 1211|  1.01M|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1212|  1.01M|            break;
 1213|       |
 1214|  17.6k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1214:9): [True: 17.6k, False: 7.21M]
  ------------------
 1215|  17.6k|            formatters_.push_back(
 1216|  17.6k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1217|  17.6k|                    padding));
 1218|  17.6k|            break;
 1219|       |
 1220|  7.41k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1220:9): [True: 7.41k, False: 7.22M]
  ------------------
 1221|  7.41k|            formatters_.push_back(
 1222|  7.41k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1223|  7.41k|                    padding));
 1224|  7.41k|            break;
 1225|       |
 1226|  50.6k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1226:9): [True: 50.6k, False: 7.18M]
  ------------------
 1227|  50.6k|            formatters_.push_back(
 1228|  50.6k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1229|  50.6k|                    padding));
 1230|  50.6k|            break;
 1231|       |
 1232|  7.66k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1232:9): [True: 7.66k, False: 7.22M]
  ------------------
 1233|  7.66k|            formatters_.push_back(
 1234|  7.66k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1235|  7.66k|                    padding));
 1236|  7.66k|            break;
 1237|       |
 1238|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1239|  3.24M|        case ('&'):
  ------------------
  |  Branch (1239:9): [True: 3.24M, False: 3.98M]
  ------------------
 1240|  3.24M|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1241|  3.24M|            break;
 1242|      0|#endif
 1243|       |
 1244|   260k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1244:9): [True: 260k, False: 6.97M]
  ------------------
 1245|   260k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1246|       |
 1247|   260k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1247:17): [True: 260k, False: 0]
  ------------------
 1248|   260k|                unknown_flag->add_ch('%');
 1249|   260k|                unknown_flag->add_ch(flag);
 1250|   260k|                formatters_.push_back((std::move(unknown_flag)));
 1251|   260k|            }
 1252|       |            // fix issue #1617 (prev char was '!' and should have been treated as funcname flag
 1253|       |            // instead of truncating flag) spdlog::set_pattern("[%10!] %v") => "[      main] some
 1254|       |            // message" spdlog::set_pattern("[%3!!] %v") => "[mai] some message"
 1255|      0|            else {
 1256|      0|                padding.truncate_ = false;
 1257|      0|                formatters_.push_back(
 1258|      0|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1259|      0|                unknown_flag->add_ch(flag);
 1260|      0|                formatters_.push_back((std::move(unknown_flag)));
 1261|      0|            }
 1262|       |
 1263|   260k|            break;
 1264|  7.23M|    }
 1265|  7.23M|}
_ZN6spdlog7details14name_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  107|  14.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  120|  3.76k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  134|  58.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  572|  90.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  600|  3.13k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  158|  15.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  175|  10.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  192|  28.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  210|  79.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  224|  13.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  253|  4.55k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  286|  4.03k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  267|  46.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  300|  9.00k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  314|  53.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  328|  81.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  342|  12.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  356|  88.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  370|  75.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  384|  22.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  399|   176k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  415|  7.22k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  430|  1.29M|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  446|  2.58k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  460|  34.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  481|  6.77k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  498|  48.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  518|   144k|        : flag_formatter(padinfo),
  519|   144k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  586|  28.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  661|  14.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  708|  4.50k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  690|  7.42k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  749|  3.59k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  768|  38.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  789|  17.6k|        : flag_formatter(padinfo),
  790|  17.6k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  789|  7.41k|        : flag_formatter(padinfo),
  790|  7.41k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  789|  50.6k|        : flag_formatter(padinfo),
  790|  50.6k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  789|  7.66k|        : flag_formatter(padinfo),
  790|  7.66k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details19aggregate_formatterC2Ev:
  624|  3.89M|    aggregate_formatter() = default;
_ZN6spdlog7details19aggregate_formatter6add_chEc:
  626|  42.1M|    void add_ch(char ch) { str_ += ch; }

_ZN6spdlog7details14flag_formatterC2ENS0_12padding_infoE:
   43|  7.30M|        : padinfo_(padinfo) {}
_ZN6spdlog7details14flag_formatterD2Ev:
   45|  12.3M|    virtual ~flag_formatter() = default;
_ZN6spdlog7details12padding_infoC2Ev:
   26|  12.2M|    padding_info() = default;
_ZN6spdlog7details12padding_infoC2EmNS1_8pad_sideEb:
   28|  1.60M|        : width_(width),
   29|  1.60M|          side_(side),
   30|  1.60M|          truncate_(truncate),
   31|  1.60M|          enabled_(true) {}
_ZNK6spdlog7details12padding_info7enabledEv:
   33|  8.83M|    bool enabled() const { return enabled_; }
_ZN6spdlog7details14flag_formatterC2Ev:
   44|  5.03M|    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<spdlog::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.70k|    std::unique_ptr<spdlog::formatter> sink_formatter) {
   80|  1.70k|    std::lock_guard<mutex_t> lock(mutex_);
   81|  1.70k|    formatter_ = std::move(sink_formatter);
   82|  1.70k|}

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

_ZN6spdlog5sinks9base_sinkINSt3__15mutexEEC2Ev:
   18|      1|    : formatter_{details::make_unique<spdlog::pattern_formatter>()} {}
_ZN6spdlog5sinks9base_sinkINSt3__15mutexEE13set_formatterENS2_10unique_ptrINS_9formatterENS2_14default_deleteIS6_EEEE:
   45|  1.70k|spdlog::sinks::base_sink<Mutex>::set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) {
   46|  1.70k|    std::lock_guard<Mutex> lock(mutex_);
   47|  1.70k|    set_formatter_(std::move(sink_formatter));
   48|  1.70k|}
_ZN6spdlog5sinks9base_sinkINSt3__15mutexEE14set_formatter_ENS2_10unique_ptrINS_9formatterENS2_14default_deleteIS6_EEEE:
   57|  1.70k|spdlog::sinks::base_sink<Mutex>::set_formatter_(std::unique_ptr<spdlog::formatter> sink_formatter) {
   58|  1.70k|    formatter_ = std::move(sink_formatter);
   59|  1.70k|}

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

_ZN6spdlog5sinks15basic_file_sinkINSt3__15mutexEEC2ERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbRKNS_19file_event_handlersE:
   20|      1|    : file_helper_{event_handlers} {
   21|      1|    file_helper_.open(filename, truncate);
   22|      1|}

_ZN6spdlog15basic_logger_mtINS_19synchronous_factoryEEENSt3__110shared_ptrINS_6loggerEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESD_bRKNS_19file_event_handlersE:
   48|      1|                                               const file_event_handlers &event_handlers = {}) {
   49|      1|    return Factory::template create<sinks::basic_file_sink_mt>(logger_name, filename, truncate,
   50|      1|                                                               event_handlers);
   51|      1|}

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

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

