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

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

_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.27k|SPDLOG_INLINE void logger::set_formatter(std::unique_ptr<formatter> f) {
   73|  3.27k|    for (auto it = sinks_.begin(); it != sinks_.end(); ++it) {
  ------------------
  |  Branch (73:36): [True: 3.27k, False: 0]
  ------------------
   74|  3.27k|        if (std::next(it) == sinks_.end()) {
  ------------------
  |  Branch (74:13): [True: 3.27k, False: 0]
  ------------------
   75|       |            // last element - we can be move it.
   76|  3.27k|            (*it)->set_formatter(std::move(f));
   77|  3.27k|            break;  // to prevent clang-tidy warning
   78|  3.27k|        } else {
   79|      0|            (*it)->set_formatter(f->clone());
   80|      0|        }
   81|  3.27k|    }
   82|  3.27k|}
_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.27k|SPDLOG_INLINE std::unique_ptr<formatter> pattern_formatter::clone() const {
  975|  3.27k|    custom_flags cloned_custom_formatters;
  976|  3.27k|    for (auto &it : custom_handlers_) {
  ------------------
  |  Branch (976:19): [True: 0, False: 3.27k]
  ------------------
  977|      0|        cloned_custom_formatters[it.first] = it.second->clone();
  978|      0|    }
  979|  3.27k|    auto cloned = details::make_unique<pattern_formatter>(pattern_, pattern_time_type_, eol_,
  980|  3.27k|                                                          std::move(cloned_custom_formatters));
  981|  3.27k|    cloned->need_localtime(need_localtime_);
  982|  3.27k|#if defined(__GNUC__) && __GNUC__ < 5
  983|  3.27k|    return std::move(cloned);
  984|       |#else
  985|       |    return cloned;
  986|       |#endif
  987|  3.27k|}
_ZN6spdlog17pattern_formatter14need_localtimeEb:
 1012|  3.27k|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.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details13mdc_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  813|  5.15M|        : 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|  4.91k|    : pattern_(std::move(pattern)),
  954|  4.91k|      eol_(std::move(eol)),
  955|  4.91k|      pattern_time_type_(time_type),
  956|  4.91k|      need_localtime_(false),
  957|  4.91k|      last_log_secs_(0),
  958|  4.91k|      custom_handlers_(std::move(custom_user_flags)) {
  959|  4.91k|    std::memset(&cached_tm_, 0, sizeof(cached_tm_));
  960|  4.91k|    compile_pattern_(pattern_);
  961|  4.91k|}
_ZN6spdlog17pattern_formatter16compile_pattern_ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
 1315|  4.91k|SPDLOG_INLINE void pattern_formatter::compile_pattern_(const std::string &pattern) {
 1316|  4.91k|    auto end = pattern.end();
 1317|  4.91k|    std::unique_ptr<details::aggregate_formatter> user_chars;
 1318|  4.91k|    formatters_.clear();
 1319|  52.6M|    for (auto it = pattern.begin(); it != end; ++it) {
  ------------------
  |  Branch (1319:37): [True: 52.6M, False: 4.07k]
  ------------------
 1320|  52.6M|        if (*it == '%') {
  ------------------
  |  Branch (1320:13): [True: 9.79M, False: 42.8M]
  ------------------
 1321|  9.79M|            if (user_chars)  // append user chars found so far
  ------------------
  |  Branch (1321:17): [True: 3.34M, False: 6.45M]
  ------------------
 1322|  3.34M|            {
 1323|  3.34M|                formatters_.push_back(std::move(user_chars));
 1324|  3.34M|            }
 1325|       |
 1326|  9.79M|            auto padding = handle_padspec_(++it, end);
 1327|       |
 1328|  9.79M|            if (it != end) {
  ------------------
  |  Branch (1328:17): [True: 9.79M, False: 843]
  ------------------
 1329|  9.79M|                if (padding.enabled()) {
  ------------------
  |  Branch (1329:21): [True: 1.32M, False: 8.46M]
  ------------------
 1330|  1.32M|                    handle_flag_<details::scoped_padder>(*it, padding);
 1331|  8.46M|                } else {
 1332|  8.46M|                    handle_flag_<details::null_scoped_padder>(*it, padding);
 1333|  8.46M|                }
 1334|  9.79M|            } else {
 1335|    843|                break;
 1336|    843|            }
 1337|  9.79M|        } else  // chars not following the % sign should be displayed as is
 1338|  42.8M|        {
 1339|  42.8M|            if (!user_chars) {
  ------------------
  |  Branch (1339:17): [True: 3.34M, False: 39.4M]
  ------------------
 1340|  3.34M|                user_chars = details::make_unique<details::aggregate_formatter>();
 1341|  3.34M|            }
 1342|  42.8M|            user_chars->add_ch(*it);
 1343|  42.8M|        }
 1344|  52.6M|    }
 1345|  4.91k|    if (user_chars)  // append raw chars found so far
  ------------------
  |  Branch (1345:9): [True: 789, False: 4.12k]
  ------------------
 1346|    789|    {
 1347|    789|        formatters_.push_back(std::move(user_chars));
 1348|    789|    }
 1349|  4.91k|}
_ZN6spdlog17pattern_formatter15handle_padspec_ERNSt3__111__wrap_iterIPKcEES5_:
 1271|  9.79M|    std::string::const_iterator &it, std::string::const_iterator end) {
 1272|  9.79M|    using details::padding_info;
 1273|  9.79M|    using details::scoped_padder;
 1274|  9.79M|    const size_t max_width = 64;
 1275|  9.79M|    if (it == end) {
  ------------------
  |  Branch (1275:9): [True: 213, False: 9.79M]
  ------------------
 1276|    213|        return padding_info{};
 1277|    213|    }
 1278|       |
 1279|  9.79M|    padding_info::pad_side side;
 1280|  9.79M|    switch (*it) {
 1281|  31.4k|        case '-':
  ------------------
  |  Branch (1281:9): [True: 31.4k, False: 9.76M]
  ------------------
 1282|  31.4k|            side = padding_info::pad_side::right;
 1283|  31.4k|            ++it;
 1284|  31.4k|            break;
 1285|  18.4k|        case '=':
  ------------------
  |  Branch (1285:9): [True: 18.4k, False: 9.78M]
  ------------------
 1286|  18.4k|            side = padding_info::pad_side::center;
 1287|  18.4k|            ++it;
 1288|  18.4k|            break;
 1289|  9.74M|        default:
  ------------------
  |  Branch (1289:9): [True: 9.74M, False: 49.8k]
  ------------------
 1290|  9.74M|            side = details::padding_info::pad_side::left;
 1291|  9.74M|            break;
 1292|  9.79M|    }
 1293|       |
 1294|  9.79M|    if (it == end || !std::isdigit(static_cast<unsigned char>(*it))) {
  ------------------
  |  Branch (1294:9): [True: 60, False: 9.79M]
  |  Branch (1294:22): [True: 8.46M, False: 1.33M]
  ------------------
 1295|  8.46M|        return padding_info{};  // no padding if no digit found here
 1296|  8.46M|    }
 1297|       |
 1298|  1.33M|    auto width = static_cast<size_t>(*it) - '0';
 1299|  2.51M|    for (++it; it != end && std::isdigit(static_cast<unsigned char>(*it)); ++it) {
  ------------------
  |  Branch (1299:16): [True: 2.51M, False: 546]
  |  Branch (1299:29): [True: 1.18M, False: 1.32M]
  ------------------
 1300|  1.18M|        auto digit = static_cast<size_t>(*it) - '0';
 1301|  1.18M|        width = width * 10 + digit;
 1302|  1.18M|    }
 1303|       |
 1304|       |    // search for the optional truncate marker '!'
 1305|  1.33M|    bool truncate;
 1306|  1.33M|    if (it != end && *it == '!') {
  ------------------
  |  Branch (1306:9): [True: 1.32M, False: 546]
  |  Branch (1306:22): [True: 45.3k, False: 1.28M]
  ------------------
 1307|  45.3k|        truncate = true;
 1308|  45.3k|        ++it;
 1309|  1.28M|    } else {
 1310|  1.28M|        truncate = false;
 1311|  1.28M|    }
 1312|  1.33M|    return details::padding_info{std::min<size_t>(width, max_width), side, truncate};
 1313|  9.79M|}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details13scoped_padderEEEvcNS2_12padding_infoE:
 1022|  1.32M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1023|       |    // process custom flags
 1024|  1.32M|    auto it = custom_handlers_.find(flag);
 1025|  1.32M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1025:9): [True: 0, False: 1.32M]
  ------------------
 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.32M|    switch (flag) {
 1034|  7.31k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1034:9): [True: 7.31k, False: 1.32M]
  ------------------
 1035|  7.31k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1036|  7.31k|            need_localtime_ = true;
 1037|  7.31k|            break;
 1038|       |
 1039|  5.62k|        case 'n':  // logger name
  ------------------
  |  Branch (1039:9): [True: 5.62k, False: 1.32M]
  ------------------
 1040|  5.62k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1041|  5.62k|            break;
 1042|       |
 1043|  13.9k|        case 'l':  // level
  ------------------
  |  Branch (1043:9): [True: 13.9k, False: 1.31M]
  ------------------
 1044|  13.9k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1045|  13.9k|            break;
 1046|       |
 1047|  1.90k|        case 'L':  // short level
  ------------------
  |  Branch (1047:9): [True: 1.90k, False: 1.32M]
  ------------------
 1048|  1.90k|            formatters_.push_back(
 1049|  1.90k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1050|  1.90k|            break;
 1051|       |
 1052|  31.4k|        case ('t'):  // thread id
  ------------------
  |  Branch (1052:9): [True: 31.4k, False: 1.29M]
  ------------------
 1053|  31.4k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1054|  31.4k|            break;
 1055|       |
 1056|  9.66k|        case ('v'):  // the message text
  ------------------
  |  Branch (1056:9): [True: 9.66k, False: 1.32M]
  ------------------
 1057|  9.66k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1058|  9.66k|            break;
 1059|       |
 1060|  22.6k|        case ('a'):  // weekday
  ------------------
  |  Branch (1060:9): [True: 22.6k, False: 1.30M]
  ------------------
 1061|  22.6k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1062|  22.6k|            need_localtime_ = true;
 1063|  22.6k|            break;
 1064|       |
 1065|  7.09k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1065:9): [True: 7.09k, False: 1.32M]
  ------------------
 1066|  7.09k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1067|  7.09k|            need_localtime_ = true;
 1068|  7.09k|            break;
 1069|       |
 1070|  10.8k|        case ('b'):
  ------------------
  |  Branch (1070:9): [True: 10.8k, False: 1.31M]
  ------------------
 1071|  27.2k|        case ('h'):  // month
  ------------------
  |  Branch (1071:9): [True: 16.3k, False: 1.31M]
  ------------------
 1072|  27.2k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1073|  27.2k|            need_localtime_ = true;
 1074|  27.2k|            break;
 1075|       |
 1076|  9.20k|        case ('B'):  // short month
  ------------------
  |  Branch (1076:9): [True: 9.20k, False: 1.32M]
  ------------------
 1077|  9.20k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1078|  9.20k|            need_localtime_ = true;
 1079|  9.20k|            break;
 1080|       |
 1081|  4.63k|        case ('c'):  // datetime
  ------------------
  |  Branch (1081:9): [True: 4.63k, False: 1.32M]
  ------------------
 1082|  4.63k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1083|  4.63k|            need_localtime_ = true;
 1084|  4.63k|            break;
 1085|       |
 1086|  3.17k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1086:9): [True: 3.17k, False: 1.32M]
  ------------------
 1087|  3.17k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1088|  3.17k|            need_localtime_ = true;
 1089|  3.17k|            break;
 1090|       |
 1091|  9.27k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1091:9): [True: 9.27k, False: 1.32M]
  ------------------
 1092|  9.27k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1093|  9.27k|            need_localtime_ = true;
 1094|  9.27k|            break;
 1095|       |
 1096|  6.06k|        case ('D'):
  ------------------
  |  Branch (1096:9): [True: 6.06k, False: 1.32M]
  ------------------
 1097|  33.1k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1097:9): [True: 27.0k, False: 1.30M]
  ------------------
 1098|  33.1k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1099|  33.1k|            need_localtime_ = true;
 1100|  33.1k|            break;
 1101|       |
 1102|  55.0k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1102:9): [True: 55.0k, False: 1.27M]
  ------------------
 1103|  55.0k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1104|  55.0k|            need_localtime_ = true;
 1105|  55.0k|            break;
 1106|       |
 1107|  10.9k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1107:9): [True: 10.9k, False: 1.31M]
  ------------------
 1108|  10.9k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1109|  10.9k|            need_localtime_ = true;
 1110|  10.9k|            break;
 1111|       |
 1112|  6.13k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1112:9): [True: 6.13k, False: 1.32M]
  ------------------
 1113|  6.13k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1114|  6.13k|            need_localtime_ = true;
 1115|  6.13k|            break;
 1116|       |
 1117|  31.7k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1117:9): [True: 31.7k, False: 1.29M]
  ------------------
 1118|  31.7k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1119|  31.7k|            need_localtime_ = true;
 1120|  31.7k|            break;
 1121|       |
 1122|  70.5k|        case ('M'):  // minutes
  ------------------
  |  Branch (1122:9): [True: 70.5k, False: 1.25M]
  ------------------
 1123|  70.5k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1124|  70.5k|            need_localtime_ = true;
 1125|  70.5k|            break;
 1126|       |
 1127|  6.33k|        case ('S'):  // seconds
  ------------------
  |  Branch (1127:9): [True: 6.33k, False: 1.32M]
  ------------------
 1128|  6.33k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1129|  6.33k|            need_localtime_ = true;
 1130|  6.33k|            break;
 1131|       |
 1132|  15.5k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1132:9): [True: 15.5k, False: 1.31M]
  ------------------
 1133|  15.5k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1134|  15.5k|            break;
 1135|       |
 1136|  36.3k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1136:9): [True: 36.3k, False: 1.29M]
  ------------------
 1137|  36.3k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1138|  36.3k|            break;
 1139|       |
 1140|  82.7k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1140:9): [True: 82.7k, False: 1.24M]
  ------------------
 1141|  82.7k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1142|  82.7k|            break;
 1143|       |
 1144|  65.6k|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1144:9): [True: 65.6k, False: 1.26M]
  ------------------
 1145|  65.6k|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1146|  65.6k|            break;
 1147|       |
 1148|  22.5k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1148:9): [True: 22.5k, False: 1.30M]
  ------------------
 1149|  22.5k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1150|  22.5k|            need_localtime_ = true;
 1151|  22.5k|            break;
 1152|       |
 1153|  39.5k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1153:9): [True: 39.5k, False: 1.29M]
  ------------------
 1154|  39.5k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1155|  39.5k|            need_localtime_ = true;
 1156|  39.5k|            break;
 1157|       |
 1158|   155k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1158:9): [True: 155k, False: 1.17M]
  ------------------
 1159|   155k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1160|   155k|            need_localtime_ = true;
 1161|   155k|            break;
 1162|       |
 1163|  5.40k|        case ('T'):
  ------------------
  |  Branch (1163:9): [True: 5.40k, False: 1.32M]
  ------------------
 1164|  34.8k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1164:9): [True: 29.4k, False: 1.30M]
  ------------------
 1165|  34.8k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1166|  34.8k|            need_localtime_ = true;
 1167|  34.8k|            break;
 1168|  4.95k|        case ('z'):  // timezone
  ------------------
  |  Branch (1168:9): [True: 4.95k, False: 1.32M]
  ------------------
 1169|  4.95k|            formatters_.push_back(
 1170|  4.95k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1171|  4.95k|            need_localtime_ = true;
 1172|  4.95k|            break;
 1173|  67.2k|        case ('P'):  // pid
  ------------------
  |  Branch (1173:9): [True: 67.2k, False: 1.26M]
  ------------------
 1174|  67.2k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1175|  67.2k|            break;
 1176|       |
 1177|  2.16k|        case ('^'):  // color range start
  ------------------
  |  Branch (1177:9): [True: 2.16k, False: 1.32M]
  ------------------
 1178|  2.16k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1179|  2.16k|            break;
 1180|       |
 1181|  24.1k|        case ('$'):  // color range end
  ------------------
  |  Branch (1181:9): [True: 24.1k, False: 1.30M]
  ------------------
 1182|  24.1k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1183|  24.1k|            break;
 1184|       |
 1185|  5.04k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1185:9): [True: 5.04k, False: 1.32M]
  ------------------
 1186|  5.04k|            formatters_.push_back(
 1187|  5.04k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1188|  5.04k|            break;
 1189|       |
 1190|  5.14k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1190:9): [True: 5.14k, False: 1.32M]
  ------------------
 1191|  5.14k|            formatters_.push_back(
 1192|  5.14k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1193|  5.14k|            break;
 1194|       |
 1195|  32.3k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1195:9): [True: 32.3k, False: 1.29M]
  ------------------
 1196|  32.3k|            formatters_.push_back(
 1197|  32.3k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1198|  32.3k|            break;
 1199|       |
 1200|  37.0k|        case ('#'):  // source line number
  ------------------
  |  Branch (1200:9): [True: 37.0k, False: 1.29M]
  ------------------
 1201|  37.0k|            formatters_.push_back(
 1202|  37.0k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1203|  37.0k|            break;
 1204|       |
 1205|  17.4k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1205:9): [True: 17.4k, False: 1.31M]
  ------------------
 1206|  17.4k|            formatters_.push_back(
 1207|  17.4k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1208|  17.4k|            break;
 1209|       |
 1210|   103k|        case ('%'):  // % char
  ------------------
  |  Branch (1210:9): [True: 103k, False: 1.22M]
  ------------------
 1211|   103k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1212|   103k|            break;
 1213|       |
 1214|  10.4k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1214:9): [True: 10.4k, False: 1.31M]
  ------------------
 1215|  10.4k|            formatters_.push_back(
 1216|  10.4k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1217|  10.4k|                    padding));
 1218|  10.4k|            break;
 1219|       |
 1220|  3.72k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1220:9): [True: 3.72k, False: 1.32M]
  ------------------
 1221|  3.72k|            formatters_.push_back(
 1222|  3.72k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1223|  3.72k|                    padding));
 1224|  3.72k|            break;
 1225|       |
 1226|  15.7k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1226:9): [True: 15.7k, False: 1.31M]
  ------------------
 1227|  15.7k|            formatters_.push_back(
 1228|  15.7k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1229|  15.7k|                    padding));
 1230|  15.7k|            break;
 1231|       |
 1232|  38.6k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1232:9): [True: 38.6k, False: 1.29M]
  ------------------
 1233|  38.6k|            formatters_.push_back(
 1234|  38.6k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1235|  38.6k|                    padding));
 1236|  38.6k|            break;
 1237|       |
 1238|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1239|  3.06k|        case ('&'):
  ------------------
  |  Branch (1239:9): [True: 3.06k, False: 1.32M]
  ------------------
 1240|  3.06k|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1241|  3.06k|            break;
 1242|      0|#endif
 1243|       |
 1244|   138k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1244:9): [True: 138k, False: 1.19M]
  ------------------
 1245|   138k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1246|       |
 1247|   138k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1247:17): [True: 122k, False: 16.2k]
  ------------------
 1248|   122k|                unknown_flag->add_ch('%');
 1249|   122k|                unknown_flag->add_ch(flag);
 1250|   122k|                formatters_.push_back((std::move(unknown_flag)));
 1251|   122k|            }
 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|  16.2k|            else {
 1256|  16.2k|                padding.truncate_ = false;
 1257|  16.2k|                formatters_.push_back(
 1258|  16.2k|                    details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1259|  16.2k|                unknown_flag->add_ch(flag);
 1260|  16.2k|                formatters_.push_back((std::move(unknown_flag)));
 1261|  16.2k|            }
 1262|       |
 1263|   138k|            break;
 1264|  1.32M|    }
 1265|  1.32M|}
_ZN6spdlog7details14name_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  107|  5.62k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  120|  13.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  134|  1.90k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  572|  31.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  600|  9.66k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  158|  22.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  175|  7.09k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  192|  27.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  210|  9.20k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  224|  4.63k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  253|  3.17k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  286|  9.27k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  267|  33.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  300|  55.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  314|  10.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  328|  6.13k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  342|  31.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  356|  70.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  370|  6.33k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  384|  15.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  399|  36.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  415|  82.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11E_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  430|  65.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11p_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  446|  22.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  460|  39.5k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  481|   155k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  498|  34.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  518|  4.95k|        : flag_formatter(padinfo),
  519|  4.95k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  586|  67.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21color_start_formatterC2ENS0_12padding_infoE:
  639|  34.8k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details20color_stop_formatterC2ENS0_12padding_infoE:
  649|  69.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  661|  5.04k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  708|  5.14k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  690|  32.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  749|  37.0k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  768|  33.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details12ch_formatterC2Ec:
  611|   631k|        : ch_(ch) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  789|  10.4k|        : flag_formatter(padinfo),
  790|  10.4k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  789|  3.72k|        : flag_formatter(padinfo),
  790|  3.72k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  789|  15.7k|        : flag_formatter(padinfo),
  790|  15.7k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_13scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  789|  38.6k|        : flag_formatter(padinfo),
  790|  38.6k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details13mdc_formatterINS0_13scoped_padderEEC2ENS0_12padding_infoE:
  813|  3.06k|        : flag_formatter(padinfo) {}
_ZN6spdlog17pattern_formatter12handle_flag_INS_7details18null_scoped_padderEEEvcNS2_12padding_infoE:
 1022|  8.46M|SPDLOG_INLINE void pattern_formatter::handle_flag_(char flag, details::padding_info padding) {
 1023|       |    // process custom flags
 1024|  8.46M|    auto it = custom_handlers_.find(flag);
 1025|  8.46M|    if (it != custom_handlers_.end()) {
  ------------------
  |  Branch (1025:9): [True: 0, False: 8.46M]
  ------------------
 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|  8.46M|    switch (flag) {
 1034|  11.7k|        case ('+'):  // default formatter
  ------------------
  |  Branch (1034:9): [True: 11.7k, False: 8.45M]
  ------------------
 1035|  11.7k|            formatters_.push_back(details::make_unique<details::full_formatter>(padding));
 1036|  11.7k|            need_localtime_ = true;
 1037|  11.7k|            break;
 1038|       |
 1039|  11.2k|        case 'n':  // logger name
  ------------------
  |  Branch (1039:9): [True: 11.2k, False: 8.45M]
  ------------------
 1040|  11.2k|            formatters_.push_back(details::make_unique<details::name_formatter<Padder>>(padding));
 1041|  11.2k|            break;
 1042|       |
 1043|  3.33k|        case 'l':  // level
  ------------------
  |  Branch (1043:9): [True: 3.33k, False: 8.46M]
  ------------------
 1044|  3.33k|            formatters_.push_back(details::make_unique<details::level_formatter<Padder>>(padding));
 1045|  3.33k|            break;
 1046|       |
 1047|  48.1k|        case 'L':  // short level
  ------------------
  |  Branch (1047:9): [True: 48.1k, False: 8.42M]
  ------------------
 1048|  48.1k|            formatters_.push_back(
 1049|  48.1k|                details::make_unique<details::short_level_formatter<Padder>>(padding));
 1050|  48.1k|            break;
 1051|       |
 1052|  73.3k|        case ('t'):  // thread id
  ------------------
  |  Branch (1052:9): [True: 73.3k, False: 8.39M]
  ------------------
 1053|  73.3k|            formatters_.push_back(details::make_unique<details::t_formatter<Padder>>(padding));
 1054|  73.3k|            break;
 1055|       |
 1056|  3.83k|        case ('v'):  // the message text
  ------------------
  |  Branch (1056:9): [True: 3.83k, False: 8.46M]
  ------------------
 1057|  3.83k|            formatters_.push_back(details::make_unique<details::v_formatter<Padder>>(padding));
 1058|  3.83k|            break;
 1059|       |
 1060|  11.2k|        case ('a'):  // weekday
  ------------------
  |  Branch (1060:9): [True: 11.2k, False: 8.45M]
  ------------------
 1061|  11.2k|            formatters_.push_back(details::make_unique<details::a_formatter<Padder>>(padding));
 1062|  11.2k|            need_localtime_ = true;
 1063|  11.2k|            break;
 1064|       |
 1065|  9.00k|        case ('A'):  // short weekday
  ------------------
  |  Branch (1065:9): [True: 9.00k, False: 8.45M]
  ------------------
 1066|  9.00k|            formatters_.push_back(details::make_unique<details::A_formatter<Padder>>(padding));
 1067|  9.00k|            need_localtime_ = true;
 1068|  9.00k|            break;
 1069|       |
 1070|  9.41k|        case ('b'):
  ------------------
  |  Branch (1070:9): [True: 9.41k, False: 8.45M]
  ------------------
 1071|  18.1k|        case ('h'):  // month
  ------------------
  |  Branch (1071:9): [True: 8.76k, False: 8.45M]
  ------------------
 1072|  18.1k|            formatters_.push_back(details::make_unique<details::b_formatter<Padder>>(padding));
 1073|  18.1k|            need_localtime_ = true;
 1074|  18.1k|            break;
 1075|       |
 1076|  78.6k|        case ('B'):  // short month
  ------------------
  |  Branch (1076:9): [True: 78.6k, False: 8.38M]
  ------------------
 1077|  78.6k|            formatters_.push_back(details::make_unique<details::B_formatter<Padder>>(padding));
 1078|  78.6k|            need_localtime_ = true;
 1079|  78.6k|            break;
 1080|       |
 1081|  12.3k|        case ('c'):  // datetime
  ------------------
  |  Branch (1081:9): [True: 12.3k, False: 8.45M]
  ------------------
 1082|  12.3k|            formatters_.push_back(details::make_unique<details::c_formatter<Padder>>(padding));
 1083|  12.3k|            need_localtime_ = true;
 1084|  12.3k|            break;
 1085|       |
 1086|  6.94k|        case ('C'):  // year 2 digits
  ------------------
  |  Branch (1086:9): [True: 6.94k, False: 8.46M]
  ------------------
 1087|  6.94k|            formatters_.push_back(details::make_unique<details::C_formatter<Padder>>(padding));
 1088|  6.94k|            need_localtime_ = true;
 1089|  6.94k|            break;
 1090|       |
 1091|  3.27k|        case ('Y'):  // year 4 digits
  ------------------
  |  Branch (1091:9): [True: 3.27k, False: 8.46M]
  ------------------
 1092|  3.27k|            formatters_.push_back(details::make_unique<details::Y_formatter<Padder>>(padding));
 1093|  3.27k|            need_localtime_ = true;
 1094|  3.27k|            break;
 1095|       |
 1096|  52.9k|        case ('D'):
  ------------------
  |  Branch (1096:9): [True: 52.9k, False: 8.41M]
  ------------------
 1097|  78.6k|        case ('x'):  // datetime MM/DD/YY
  ------------------
  |  Branch (1097:9): [True: 25.6k, False: 8.44M]
  ------------------
 1098|  78.6k|            formatters_.push_back(details::make_unique<details::D_formatter<Padder>>(padding));
 1099|  78.6k|            need_localtime_ = true;
 1100|  78.6k|            break;
 1101|       |
 1102|  8.71k|        case ('m'):  // month 1-12
  ------------------
  |  Branch (1102:9): [True: 8.71k, False: 8.45M]
  ------------------
 1103|  8.71k|            formatters_.push_back(details::make_unique<details::m_formatter<Padder>>(padding));
 1104|  8.71k|            need_localtime_ = true;
 1105|  8.71k|            break;
 1106|       |
 1107|  42.3k|        case ('d'):  // day of month 1-31
  ------------------
  |  Branch (1107:9): [True: 42.3k, False: 8.42M]
  ------------------
 1108|  42.3k|            formatters_.push_back(details::make_unique<details::d_formatter<Padder>>(padding));
 1109|  42.3k|            need_localtime_ = true;
 1110|  42.3k|            break;
 1111|       |
 1112|  82.6k|        case ('H'):  // hours 24
  ------------------
  |  Branch (1112:9): [True: 82.6k, False: 8.38M]
  ------------------
 1113|  82.6k|            formatters_.push_back(details::make_unique<details::H_formatter<Padder>>(padding));
 1114|  82.6k|            need_localtime_ = true;
 1115|  82.6k|            break;
 1116|       |
 1117|  10.3k|        case ('I'):  // hours 12
  ------------------
  |  Branch (1117:9): [True: 10.3k, False: 8.45M]
  ------------------
 1118|  10.3k|            formatters_.push_back(details::make_unique<details::I_formatter<Padder>>(padding));
 1119|  10.3k|            need_localtime_ = true;
 1120|  10.3k|            break;
 1121|       |
 1122|  91.4k|        case ('M'):  // minutes
  ------------------
  |  Branch (1122:9): [True: 91.4k, False: 8.37M]
  ------------------
 1123|  91.4k|            formatters_.push_back(details::make_unique<details::M_formatter<Padder>>(padding));
 1124|  91.4k|            need_localtime_ = true;
 1125|  91.4k|            break;
 1126|       |
 1127|  78.2k|        case ('S'):  // seconds
  ------------------
  |  Branch (1127:9): [True: 78.2k, False: 8.39M]
  ------------------
 1128|  78.2k|            formatters_.push_back(details::make_unique<details::S_formatter<Padder>>(padding));
 1129|  78.2k|            need_localtime_ = true;
 1130|  78.2k|            break;
 1131|       |
 1132|  20.1k|        case ('e'):  // milliseconds
  ------------------
  |  Branch (1132:9): [True: 20.1k, False: 8.44M]
  ------------------
 1133|  20.1k|            formatters_.push_back(details::make_unique<details::e_formatter<Padder>>(padding));
 1134|  20.1k|            break;
 1135|       |
 1136|   156k|        case ('f'):  // microseconds
  ------------------
  |  Branch (1136:9): [True: 156k, False: 8.31M]
  ------------------
 1137|   156k|            formatters_.push_back(details::make_unique<details::f_formatter<Padder>>(padding));
 1138|   156k|            break;
 1139|       |
 1140|  10.3k|        case ('F'):  // nanoseconds
  ------------------
  |  Branch (1140:9): [True: 10.3k, False: 8.45M]
  ------------------
 1141|  10.3k|            formatters_.push_back(details::make_unique<details::F_formatter<Padder>>(padding));
 1142|  10.3k|            break;
 1143|       |
 1144|  1.29M|        case ('E'):  // seconds since epoch
  ------------------
  |  Branch (1144:9): [True: 1.29M, False: 7.17M]
  ------------------
 1145|  1.29M|            formatters_.push_back(details::make_unique<details::E_formatter<Padder>>(padding));
 1146|  1.29M|            break;
 1147|       |
 1148|  2.31k|        case ('p'):  // am/pm
  ------------------
  |  Branch (1148:9): [True: 2.31k, False: 8.46M]
  ------------------
 1149|  2.31k|            formatters_.push_back(details::make_unique<details::p_formatter<Padder>>(padding));
 1150|  2.31k|            need_localtime_ = true;
 1151|  2.31k|            break;
 1152|       |
 1153|  23.6k|        case ('r'):  // 12 hour clock 02:55:02 pm
  ------------------
  |  Branch (1153:9): [True: 23.6k, False: 8.44M]
  ------------------
 1154|  23.6k|            formatters_.push_back(details::make_unique<details::r_formatter<Padder>>(padding));
 1155|  23.6k|            need_localtime_ = true;
 1156|  23.6k|            break;
 1157|       |
 1158|  6.24k|        case ('R'):  // 24-hour HH:MM time
  ------------------
  |  Branch (1158:9): [True: 6.24k, False: 8.46M]
  ------------------
 1159|  6.24k|            formatters_.push_back(details::make_unique<details::R_formatter<Padder>>(padding));
 1160|  6.24k|            need_localtime_ = true;
 1161|  6.24k|            break;
 1162|       |
 1163|  4.41k|        case ('T'):
  ------------------
  |  Branch (1163:9): [True: 4.41k, False: 8.46M]
  ------------------
 1164|  27.9k|        case ('X'):  // ISO 8601 time format (HH:MM:SS)
  ------------------
  |  Branch (1164:9): [True: 23.4k, False: 8.44M]
  ------------------
 1165|  27.9k|            formatters_.push_back(details::make_unique<details::T_formatter<Padder>>(padding));
 1166|  27.9k|            need_localtime_ = true;
 1167|  27.9k|            break;
 1168|   128k|        case ('z'):  // timezone
  ------------------
  |  Branch (1168:9): [True: 128k, False: 8.33M]
  ------------------
 1169|   128k|            formatters_.push_back(
 1170|   128k|                details::make_unique<details::z_formatter<Padder>>(padding, pattern_time_type_));
 1171|   128k|            need_localtime_ = true;
 1172|   128k|            break;
 1173|  20.7k|        case ('P'):  // pid
  ------------------
  |  Branch (1173:9): [True: 20.7k, False: 8.44M]
  ------------------
 1174|  20.7k|            formatters_.push_back(details::make_unique<details::pid_formatter<Padder>>(padding));
 1175|  20.7k|            break;
 1176|       |
 1177|  32.6k|        case ('^'):  // color range start
  ------------------
  |  Branch (1177:9): [True: 32.6k, False: 8.43M]
  ------------------
 1178|  32.6k|            formatters_.push_back(details::make_unique<details::color_start_formatter>(padding));
 1179|  32.6k|            break;
 1180|       |
 1181|  45.0k|        case ('$'):  // color range end
  ------------------
  |  Branch (1181:9): [True: 45.0k, False: 8.42M]
  ------------------
 1182|  45.0k|            formatters_.push_back(details::make_unique<details::color_stop_formatter>(padding));
 1183|  45.0k|            break;
 1184|       |
 1185|  11.3k|        case ('@'):  // source location (filename:filenumber)
  ------------------
  |  Branch (1185:9): [True: 11.3k, False: 8.45M]
  ------------------
 1186|  11.3k|            formatters_.push_back(
 1187|  11.3k|                details::make_unique<details::source_location_formatter<Padder>>(padding));
 1188|  11.3k|            break;
 1189|       |
 1190|  3.55k|        case ('s'):  // short source filename - without directory name
  ------------------
  |  Branch (1190:9): [True: 3.55k, False: 8.46M]
  ------------------
 1191|  3.55k|            formatters_.push_back(
 1192|  3.55k|                details::make_unique<details::short_filename_formatter<Padder>>(padding));
 1193|  3.55k|            break;
 1194|       |
 1195|  6.75k|        case ('g'):  // full source filename
  ------------------
  |  Branch (1195:9): [True: 6.75k, False: 8.46M]
  ------------------
 1196|  6.75k|            formatters_.push_back(
 1197|  6.75k|                details::make_unique<details::source_filename_formatter<Padder>>(padding));
 1198|  6.75k|            break;
 1199|       |
 1200|  3.32k|        case ('#'):  // source line number
  ------------------
  |  Branch (1200:9): [True: 3.32k, False: 8.46M]
  ------------------
 1201|  3.32k|            formatters_.push_back(
 1202|  3.32k|                details::make_unique<details::source_linenum_formatter<Padder>>(padding));
 1203|  3.32k|            break;
 1204|       |
 1205|  35.2k|        case ('!'):  // source funcname
  ------------------
  |  Branch (1205:9): [True: 35.2k, False: 8.43M]
  ------------------
 1206|  35.2k|            formatters_.push_back(
 1207|  35.2k|                details::make_unique<details::source_funcname_formatter<Padder>>(padding));
 1208|  35.2k|            break;
 1209|       |
 1210|   527k|        case ('%'):  // % char
  ------------------
  |  Branch (1210:9): [True: 527k, False: 7.94M]
  ------------------
 1211|   527k|            formatters_.push_back(details::make_unique<details::ch_formatter>('%'));
 1212|   527k|            break;
 1213|       |
 1214|  11.3k|        case ('u'):  // elapsed time since last log message in nanos
  ------------------
  |  Branch (1214:9): [True: 11.3k, False: 8.45M]
  ------------------
 1215|  11.3k|            formatters_.push_back(
 1216|  11.3k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::nanoseconds>>(
 1217|  11.3k|                    padding));
 1218|  11.3k|            break;
 1219|       |
 1220|  6.43k|        case ('i'):  // elapsed time since last log message in micros
  ------------------
  |  Branch (1220:9): [True: 6.43k, False: 8.46M]
  ------------------
 1221|  6.43k|            formatters_.push_back(
 1222|  6.43k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::microseconds>>(
 1223|  6.43k|                    padding));
 1224|  6.43k|            break;
 1225|       |
 1226|  37.5k|        case ('o'):  // elapsed time since last log message in millis
  ------------------
  |  Branch (1226:9): [True: 37.5k, False: 8.43M]
  ------------------
 1227|  37.5k|            formatters_.push_back(
 1228|  37.5k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::milliseconds>>(
 1229|  37.5k|                    padding));
 1230|  37.5k|            break;
 1231|       |
 1232|  19.3k|        case ('O'):  // elapsed time since last log message in seconds
  ------------------
  |  Branch (1232:9): [True: 19.3k, False: 8.44M]
  ------------------
 1233|  19.3k|            formatters_.push_back(
 1234|  19.3k|                details::make_unique<details::elapsed_formatter<Padder, std::chrono::seconds>>(
 1235|  19.3k|                    padding));
 1236|  19.3k|            break;
 1237|       |
 1238|      0|#ifndef SPDLOG_NO_TLS  // mdc formatter requires TLS support
 1239|  5.13M|        case ('&'):
  ------------------
  |  Branch (1239:9): [True: 5.13M, False: 3.33M]
  ------------------
 1240|  5.13M|            formatters_.push_back(details::make_unique<details::mdc_formatter<Padder>>(padding));
 1241|  5.13M|            break;
 1242|      0|#endif
 1243|       |
 1244|   223k|        default:  // Unknown flag appears as is
  ------------------
  |  Branch (1244:9): [True: 223k, False: 8.24M]
  ------------------
 1245|   223k|            auto unknown_flag = details::make_unique<details::aggregate_formatter>();
 1246|       |
 1247|   223k|            if (!padding.truncate_) {
  ------------------
  |  Branch (1247:17): [True: 223k, False: 0]
  ------------------
 1248|   223k|                unknown_flag->add_ch('%');
 1249|   223k|                unknown_flag->add_ch(flag);
 1250|   223k|                formatters_.push_back((std::move(unknown_flag)));
 1251|   223k|            }
 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|   223k|            break;
 1264|  8.46M|    }
 1265|  8.46M|}
_ZN6spdlog7details14name_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  107|  11.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details15level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  120|  3.33k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details21short_level_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  134|  48.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11t_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  572|  73.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11v_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  600|  3.83k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11a_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  158|  11.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11A_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  175|  9.00k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11b_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  192|  18.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11B_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  210|  78.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11c_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  224|  12.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11C_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  253|  6.94k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11Y_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  286|  3.27k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11D_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  267|  78.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11m_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  300|  8.71k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11d_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  314|  42.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11H_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  328|  82.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11I_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  342|  10.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11M_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  356|  91.4k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11S_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  370|  78.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11e_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  384|  20.1k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11f_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  399|   156k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11F_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  415|  10.3k|        : 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.31k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11r_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  460|  23.6k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11R_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  481|  6.24k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11T_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  498|  27.9k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details11z_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoENS_17pattern_time_typeE:
  518|   128k|        : flag_formatter(padinfo),
  519|   128k|          time_type_(time_type) {}
_ZN6spdlog7details13pid_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  586|  20.7k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_location_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  661|  11.3k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24short_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  708|  3.55k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_filename_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  690|  6.75k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details24source_linenum_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  749|  3.32k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details25source_funcname_formatterINS0_18null_scoped_padderEEC2ENS0_12padding_infoE:
  768|  35.2k|        : flag_formatter(padinfo) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000000EEEEEEC2ENS0_12padding_infoE:
  789|  11.3k|        : flag_formatter(padinfo),
  790|  11.3k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000000EEEEEEC2ENS0_12padding_infoE:
  789|  6.43k|        : flag_formatter(padinfo),
  790|  6.43k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1000EEEEEEC2ENS0_12padding_infoE:
  789|  37.5k|        : flag_formatter(padinfo),
  790|  37.5k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details17elapsed_formatterINS0_18null_scoped_padderENSt3__16chrono8durationIxNS3_5ratioILl1ELl1EEEEEEC2ENS0_12padding_infoE:
  789|  19.3k|        : flag_formatter(padinfo),
  790|  19.3k|          last_message_time_(log_clock::now()) {}
_ZN6spdlog7details19aggregate_formatterC2Ev:
  624|  3.71M|    aggregate_formatter() = default;
_ZN6spdlog7details19aggregate_formatter6add_chEc:
  626|  43.5M|    void add_ch(char ch) { str_ += ch; }

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

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

