Full Code of fmtlib/fmt for AI

master 4968433a6abe cached
134 files
2.9 MB
767.3k tokens
2552 symbols
1 requests
Download .txt
Showing preview only (3,067K chars total). Download the full file or copy to clipboard to get everything.
Repository: fmtlib/fmt
Branch: master
Commit: 4968433a6abe
Files: 134
Total size: 2.9 MB

Directory structure:
gitextract_t95f2iu3/

├── .clang-format
├── .clang-tidy
├── .cmake-format
├── .github/
│   ├── FUNDING.yml
│   ├── dependabot.yml
│   ├── issue_template.md
│   ├── pull_request_template.md
│   └── workflows/
│       ├── cifuzz.yml
│       ├── doc.yml
│       ├── lint.yml
│       ├── linux.yml
│       ├── macos.yml
│       ├── scorecard.yml
│       └── windows.yml
├── .gitignore
├── CMakeLists.txt
├── CONTRIBUTING.md
├── ChangeLog.md
├── LICENSE
├── README.md
├── doc/
│   ├── ChangeLog-old.md
│   ├── LICENSE-exception
│   ├── api.md
│   ├── fmt.css
│   ├── fmt.js
│   ├── get-started.md
│   ├── index.md
│   ├── python-license.txt
│   └── syntax.md
├── include/
│   └── fmt/
│       ├── args.h
│       ├── base.h
│       ├── chrono.h
│       ├── color.h
│       ├── compile.h
│       ├── core.h
│       ├── fmt-c.h
│       ├── format-inl.h
│       ├── format.h
│       ├── os.h
│       ├── ostream.h
│       ├── printf.h
│       ├── ranges.h
│       ├── std.h
│       └── xchar.h
├── src/
│   ├── fmt-c.cc
│   ├── fmt.cc
│   ├── format.cc
│   └── os.cc
├── support/
│   ├── Android.mk
│   ├── AndroidManifest.xml
│   ├── C++.sublime-syntax
│   ├── README
│   ├── Vagrantfile
│   ├── build.gradle
│   ├── check-commits
│   ├── cmake/
│   │   ├── FindSetEnv.cmake
│   │   ├── JoinPaths.cmake
│   │   ├── fmt-config.cmake.in
│   │   └── fmt.pc.in
│   ├── docopt.py
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── mkdocs
│   ├── mkdocs.yml
│   ├── printable.py
│   ├── python/
│   │   └── mkdocstrings_handlers/
│   │       └── cxx/
│   │           ├── __init__.py
│   │           └── templates/
│   │               └── README
│   └── release.py
└── test/
    ├── CMakeLists.txt
    ├── add-subdirectory-test/
    │   ├── CMakeLists.txt
    │   └── main.cc
    ├── args-test.cc
    ├── assert-test.cc
    ├── base-test.cc
    ├── c-test.c
    ├── chrono-test.cc
    ├── color-test.cc
    ├── compile-error-test/
    │   └── CMakeLists.txt
    ├── compile-test.cc
    ├── cuda-test/
    │   ├── CMakeLists.txt
    │   ├── cpp14.cc
    │   └── cuda-cpp14.cu
    ├── detect-stdfs.cc
    ├── enforce-checks-test.cc
    ├── find-package-test/
    │   ├── CMakeLists.txt
    │   └── main.cc
    ├── format-impl-test.cc
    ├── format-test.cc
    ├── fuzzing/
    │   ├── .gitignore
    │   ├── CMakeLists.txt
    │   ├── README.md
    │   ├── build.sh
    │   ├── chrono-duration.cc
    │   ├── chrono-timepoint.cc
    │   ├── float.cc
    │   ├── fuzzer-common.h
    │   ├── main.cc
    │   ├── named-arg.cc
    │   ├── one-arg.cc
    │   └── two-args.cc
    ├── gtest/
    │   ├── .clang-format
    │   ├── CMakeLists.txt
    │   ├── gmock/
    │   │   └── gmock.h
    │   ├── gmock-gtest-all.cc
    │   └── gtest/
    │       ├── gtest-spi.h
    │       └── gtest.h
    ├── gtest-extra-test.cc
    ├── gtest-extra.cc
    ├── gtest-extra.h
    ├── header-only-test.cc
    ├── mock-allocator.h
    ├── module-test.cc
    ├── no-builtin-types-test.cc
    ├── noexception-test.cc
    ├── os-test.cc
    ├── ostream-test.cc
    ├── perf-sanity.cc
    ├── posix-mock-test.cc
    ├── posix-mock.h
    ├── printf-test.cc
    ├── ranges-odr-test.cc
    ├── ranges-test.cc
    ├── scan-test.cc
    ├── scan.h
    ├── static-export-test/
    │   ├── CMakeLists.txt
    │   ├── library.cc
    │   └── main.cc
    ├── std-test.cc
    ├── test-assert.h
    ├── test-main.cc
    ├── unicode-test.cc
    ├── util.cc
    ├── util.h
    └── xchar-test.cc

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
# Run manually to reformat a file:
# clang-format -i --style=file <file>
Language: Cpp
BasedOnStyle: Google
IndentPPDirectives: AfterHash
IndentCaseLabels: false
AlwaysBreakTemplateDeclarations: false
DerivePointerAlignment: false
AllowShortCaseLabelsOnASingleLine: true
QualifierAlignment: Left
AlignConsecutiveShortCaseStatements:
  Enabled: true
  AcrossEmptyLines: true
  AcrossComments: true
  AlignCaseColons: false

================================================
FILE: .clang-tidy
================================================
Checks: modernize-use-trailing-return-type
CheckOptions:
  - key: modernize-use-trailing-return-type.TransformLambdas
    value: none


================================================
FILE: .cmake-format
================================================
format:
  separate_ctrl_name_with_space: true
markup:
  enable_markup: false


================================================
FILE: .github/FUNDING.yml
================================================
github: vitaut


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions" # Necessary to update action hashes.	
    directory: "/"
    schedule:
      interval: "monthly"
    # Allow up to 3 opened pull requests for github-actions versions.
    open-pull-requests-limit: 3


================================================
FILE: .github/issue_template.md
================================================
<!--
Please make sure that the problem reproduces on the current master before
submitting an issue.
If possible please provide a repro on Compiler Explorer:
https://godbolt.org/z/fxccbh53W.
-->


================================================
FILE: .github/pull_request_template.md
================================================
<!--
Please read the contribution guidelines before submitting a pull request:
https://github.com/fmtlib/fmt/blob/master/CONTRIBUTING.md.
By submitting this pull request, you agree to license your contribution(s)
under the terms outlined in LICENSE.rst and represent that you have the right
to do so.
-->


================================================
FILE: .github/workflows/cifuzz.yml
================================================
name: CIFuzz
on: [pull_request]

permissions:
  contents: read

jobs:
  Fuzzing:
    runs-on: ubuntu-latest
    steps:
    - name: Build fuzzers
      id: build
      uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@92182553173581f871130c71c71b17f003d47b0a
      with:
        oss-fuzz-project-name: 'fmt'
        dry-run: false
        language: c++

    - name: Run fuzzers
      uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@92182553173581f871130c71c71b17f003d47b0a
      with:
        oss-fuzz-project-name: 'fmt'
        fuzz-seconds: 300
        dry-run: false
        language: c++

    - name: Upload crash
      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
      if: failure() && steps.build.outcome == 'success'
      with:
        name: artifacts
        path: ./out/artifacts


================================================
FILE: .github/workflows/doc.yml
================================================
name: doc

on: [push, pull_request]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-22.04

    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Add Ubuntu mirrors
      run: |
        # Github Actions caching proxy is at times unreliable
        # see https://github.com/actions/runner-images/issues/7048
        printf 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
        curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
        sudo sed -i 's~http://azure.archive.ubuntu.com/ubuntu/~mirror+file:/etc/apt/mirrors.txt~' /etc/apt/sources.list

    - name: Create build environment
      run: |
        sudo apt update
        sudo apt install doxygen
        pip install mkdocs-material==9.7.0 mkdocstrings==1.0.0 mike==2.1.3 typing_extensions==4.15.0
        cmake -E make_directory ${{runner.workspace}}/build
        # Workaround https://github.com/actions/checkout/issues/13:
        git config --global user.name "$(git --no-pager log --format=format:'%an' -n 1)"
        git config --global user.email "$(git --no-pager log --format=format:'%ae' -n 1)"

    - name: Build
      working-directory: ${{runner.workspace}}/build
      run: $GITHUB_WORKSPACE/support/mkdocs deploy dev

    - name: Deploy
      env:
        KEY: "${{secrets.KEY}}"
      if: env.KEY != '' && github.ref == 'refs/heads/master'
      working-directory: ${{runner.workspace}}/fmt/build/fmt.dev
      run: git push https://$KEY@github.com/fmtlib/fmt.dev.git


================================================
FILE: .github/workflows/lint.yml
================================================
name: lint

on:
  pull_request:
    paths:
      - '**.h'
      - '**.cc'
      - '**.cmake'
      - '**/CMakeLists.txt'

permissions:
  contents: read

jobs:
  clang-format:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Install clang-format
      run: |
        wget https://apt.llvm.org/llvm.sh
        sudo bash ./llvm.sh 21
        sudo apt install clang-format-21

    - name: Run clang-format
      run: |
        find include src -name '*.h' -o -name '*.cc' | \
          xargs clang-format-21 -i -style=file -fallback-style=none
        git diff --exit-code

  cmake-format:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Install cmake-format
      run: pip install cmakelang

    - name: Run cmake-format
      run: |
        find . -name CMakeLists.txt -o -name '*.cmake' | \
          xargs cmake-format -i
        git diff --exit-code


================================================
FILE: .github/workflows/linux.yml
================================================
name: linux

on: [push, pull_request]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        cxx: [g++-4.9, g++-11, clang++-3.6, clang++-11]
        build_type: [Debug, Release]
        std: [11]
        shared: [""]
        include:
          - cxx: g++-4.9
          - cxx: clang++-3.6
          - cxx: g++-11
            build_type: Debug
            std: 14
            install: sudo apt install g++-11
          - cxx: g++-11
            build_type: Debug
            std: 17
          - cxx: g++-11
            build_type: Debug
            std: 20
            install: sudo apt install g++-11
          - cxx: g++-13
            build_type: Release
            std: 23
            install: sudo apt install g++-13
            shared: -DBUILD_SHARED_LIBS=ON
          - cxx: clang++-11
            build_type: Debug
            std: 17
            cxxflags: -stdlib=libc++
            install: sudo apt install clang-11 libc++-11-dev libc++abi-11-dev
          - cxx: clang++-11
            install: sudo apt install clang-11
          - cxx: clang++-11
            build_type: Debug
            fuzz: -DFMT_FUZZ=ON -DFMT_FUZZ_LINKMAIN=ON
            std: 17
            install: sudo apt install clang-11
          - cxx: clang++-14
            build_type: Debug
            std: 20
          - cxx: clang++-14
            build_type: Debug
            std: 20
            cxxflags: -stdlib=libc++
            install: sudo apt install libc++-14-dev libc++abi-14-dev

    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Set timezone
      run: sudo timedatectl set-timezone 'Europe/Kyiv'

    - name: Install GCC 4.9
      run: |
        sudo apt update
        sudo apt install libatomic1 libc6-dev libgomp1 libitm1 libmpc3
        # https://launchpad.net/ubuntu/xenial/amd64/g++-4.9/4.9.3-13ubuntu2
        wget --no-verbose \
          http://launchpadlibrarian.net/230069137/libmpfr4_3.1.3-2_amd64.deb \
          http://launchpadlibrarian.net/253728424/libasan1_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/445346135/libubsan0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346112/libcilkrts5_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/253728426/libgcc-4.9-dev_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/253728432/libstdc++-4.9-dev_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/253728314/gcc-4.9-base_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/445345919/gcc-5-base_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/253728399/cpp-4.9_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/253728404/gcc-4.9_4.9.3-13ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/253728401/g++-4.9_4.9.3-13ubuntu2_amd64.deb
        sudo dpkg -i \
          libmpfr4_3.1.3-2_amd64.deb \
          libasan1_4.9.3-13ubuntu2_amd64.deb \
          libubsan0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libcilkrts5_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libgcc-4.9-dev_4.9.3-13ubuntu2_amd64.deb \
          libstdc++-4.9-dev_4.9.3-13ubuntu2_amd64.deb \
          gcc-4.9-base_4.9.3-13ubuntu2_amd64.deb \
          gcc-5-base_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          cpp-4.9_4.9.3-13ubuntu2_amd64.deb \
          gcc-4.9_4.9.3-13ubuntu2_amd64.deb \
          g++-4.9_4.9.3-13ubuntu2_amd64.deb
      if: ${{ matrix.cxx == 'g++-4.9' }}

    - name: Install Clang 3.6
      run: |
        sudo apt update
        sudo apt install libtinfo5
        # https://code.launchpad.net/ubuntu/xenial/amd64/clang-3.6/1:3.6.2-3ubuntu2
        wget --no-verbose \
          http://launchpadlibrarian.net/230019046/libffi6_3.2.1-4_amd64.deb \
          http://launchpadlibrarian.net/445346109/libasan2_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346135/libubsan0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346112/libcilkrts5_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346128/libmpx0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346113/libgcc-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346131/libstdc++-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/445346022/libobjc-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/254405108/libllvm3.6v5_3.6.2-3ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/254405097/libclang-common-3.6-dev_3.6.2-3ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/254405101/libclang1-3.6_3.6.2-3ubuntu2_amd64.deb \
          http://launchpadlibrarian.net/445345919/gcc-5-base_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          http://launchpadlibrarian.net/254405091/clang-3.6_3.6.2-3ubuntu2_amd64.deb
        sudo dpkg -i \
          libffi6_3.2.1-4_amd64.deb \
          libasan2_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libubsan0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libcilkrts5_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libmpx0_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libgcc-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libstdc++-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libobjc-5-dev_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          libllvm3.6v5_3.6.2-3ubuntu2_amd64.deb \
          libclang-common-3.6-dev_3.6.2-3ubuntu2_amd64.deb \
          libclang1-3.6_3.6.2-3ubuntu2_amd64.deb \
          gcc-5-base_5.4.0-6ubuntu1~16.04.12_amd64.deb \
          clang-3.6_3.6.2-3ubuntu2_amd64.deb
      if: ${{ matrix.cxx == 'clang++-3.6' }}

    - name: Add repositories for newer GCC
      run: |
        sudo apt-add-repository ppa:ubuntu-toolchain-r/test
      if: ${{ matrix.cxx == 'g++-13' }}

    - name: Add Ubuntu mirrors
      run: |
        # GitHub Actions caching proxy is at times unreliable
        # see https://github.com/actions/runner-images/issues/7048.
        mirrors=/etc/apt/mirrors.txt
        printf 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | \
          sudo tee $mirrors
        curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append $mirrors
        sudo sed -i \
          "s~http://azure.archive.ubuntu.com/ubuntu/~mirror+file:$mirrors~" \
          /etc/apt/sources.list

    - name: Create build environment
      run: |
        sudo apt update
        ${{matrix.install}}
        sudo apt install locales-all
        cmake -E make_directory ${{runner.workspace}}/build

    - name: Configure
      working-directory: ${{runner.workspace}}/build
      env:
        CXX: ${{matrix.cxx}}
        CXXFLAGS: ${{matrix.cxxflags}}
      run: |
        cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
              -DCMAKE_CXX_STANDARD=${{matrix.std}} \
              -DCMAKE_CXX_VISIBILITY_PRESET=hidden \
              -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON \
              -DFMT_DOC=OFF -DFMT_PEDANTIC=ON -DFMT_WERROR=ON \
              ${{matrix.fuzz}} ${{matrix.shared}} $GITHUB_WORKSPACE

    - name: Build
      working-directory: ${{runner.workspace}}/build
      run: |
        threads=`nproc`
        cmake --build . --config ${{matrix.build_type}} --parallel $threads

    - name: Test
      working-directory: ${{runner.workspace}}/build
      run: ctest -C ${{matrix.build_type}}
      env:
        CTEST_OUTPUT_ON_FAILURE: True


================================================
FILE: .github/workflows/macos.yml
================================================
name: macos

on: [push, pull_request]

permissions:
  contents: read

jobs:
  build:
    strategy:
      matrix:
        os: [macos-14]
        build_type: [Debug, Release]
        std: [11, 17, 20, 23]
        shared: [""]
        include:
          - os: macos-14
            std: 23
            build_type: Release
            shared: -DBUILD_SHARED_LIBS=ON

    runs-on: '${{ matrix.os }}'

    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Set timezone
      run: sudo systemsetup -settimezone 'Europe/Minsk'

    - name: Select Xcode 14.3 (macOS 13)
      run: sudo xcode-select -s "/Applications/Xcode_14.3.app"
      if: ${{ matrix.os == 'macos-13' }}

    - name: Create Build Environment
      run: cmake -E make_directory ${{runner.workspace}}/build

    - name: Configure
      working-directory: ${{runner.workspace}}/build
      run: |
        cmake -DCMAKE_BUILD_TYPE=${{matrix.build_type}} ${{matrix.shared}} \
              -DCMAKE_CXX_STANDARD=${{matrix.std}} \
              -DCMAKE_CXX_VISIBILITY_PRESET=hidden -DCMAKE_VISIBILITY_INLINES_HIDDEN=ON \
              -DFMT_DOC=OFF -DFMT_PEDANTIC=ON -DFMT_WERROR=ON $GITHUB_WORKSPACE

    - name: Build
      working-directory: ${{runner.workspace}}/build
      run: |
        threads=`sysctl -n hw.logicalcpu`
        cmake --build . --config ${{matrix.build_type}} --parallel $threads

    - name: Test
      working-directory: ${{runner.workspace}}/build
      run: ctest -C ${{matrix.build_type}}
      env:
        CTEST_OUTPUT_ON_FAILURE: True


================================================
FILE: .github/workflows/scorecard.yml
================================================
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.

name: Scorecard supply-chain security
on:
  # For Branch-Protection check. Only the default branch is supported. See
  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
  branch_protection_rule:
  # To guarantee Maintained check is occasionally updated. See
  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
  schedule:
    - cron: '26 14 * * 5'
  push:
    branches: [ "master" ]

# Declare default permissions as read only.
permissions: read-all

jobs:
  analysis:
    name: Scorecard analysis
    runs-on: ubuntu-latest
    permissions:
      # Needed to upload the results to code-scanning dashboard.
      security-events: write
      # Needed to publish results and get a badge (see publish_results below).
      id-token: write

    steps:
      - name: "Checkout code"
        uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
        with:
          persist-credentials: false

      - name: "Run analysis"
        uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2
        with:
          results_file: results.sarif
          results_format: sarif
          # (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
          # - you want to enable the Branch-Protection check on a *public* repository, or
          # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
          # repo_token: ${{ secrets.SCORECARD_TOKEN }}

          # Public repositories:
          #   - Publish results to OpenSSF REST API for easy access by consumers
          #   - Allows the repository to include the Scorecard badge.
          #   - See https://github.com/ossf/scorecard-action#publishing-results.
          publish_results: true

      # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
      # format to the repository Actions tab.
      - name: "Upload artifact"
        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: SARIF file
          path: results.sarif
          retention-days: 5

      # Upload the results to GitHub's code scanning dashboard.
      - name: "Upload to code-scanning"
        uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v3.29.5
        with:
          sarif_file: results.sarif


================================================
FILE: .github/workflows/windows.yml
================================================
name: windows

on: [push, pull_request]

permissions:
  contents: read

jobs:
  build:
    runs-on: ${{matrix.os}}
    strategy:
      matrix:
        # windows-2022 has MSVC 2022 installed:
        # https://github.com/actions/virtual-environments.
        os: [windows-2022]
        platform: [Win32, x64]
        toolset: [v142]
        standard: [14, 17, 20]
        shared: ["", -DBUILD_SHARED_LIBS=ON]
        build_type: [Debug, Release]
        exclude:
          - { toolset: v142, standard: 14 }
          - { platform: Win32, standard: 14 }
          - { platform: Win32, standard: 20 }
          - { platform: x64, standard: 14, shared: -DBUILD_SHARED_LIBS=ON }
          - { platform: x64, standard: 20, shared: -DBUILD_SHARED_LIBS=ON }
        include:
          - os: windows-2022
            platform: x64
            toolset: v143
            build_type: Debug
            standard: 20

    steps:
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0

    - name: Set timezone
      run: tzutil /s "FLE Standard Time"

    - name: Create Build Environment
      run: cmake -E make_directory ${{runner.workspace}}/build

    - name: Configure
      # Use a bash shell for $GITHUB_WORKSPACE.
      shell: bash
      working-directory: ${{runner.workspace}}/build
      run: |
        cmake -A ${{matrix.platform}} -T ${{matrix.toolset}} \
              -DCMAKE_CXX_STANDARD=${{matrix.standard}} \
              ${{matrix.shared}} -DCMAKE_BUILD_TYPE=${{matrix.build_type}} \
              $GITHUB_WORKSPACE

    - name: Build
      working-directory: ${{runner.workspace}}/build
      run: |
        $threads = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
        cmake --build . --config ${{matrix.build_type}} --parallel $threads

    - name: Test
      working-directory: ${{runner.workspace}}/build
      run: ctest -C ${{matrix.build_type}} -V
      env:
        CTEST_OUTPUT_ON_FAILURE: True

  mingw:
    runs-on: windows-latest
    defaults:
      run:
        shell: msys2 {0}
    strategy:
      matrix:
        sys: [ mingw64, ucrt64 ]
    steps:
    - name: Set timezone
      run: tzutil /s "FLE Standard Time"
      shell: cmd
    - uses: msys2/setup-msys2@40677d36a502eb2cf0fb808cc9dec31bf6152638 # v2.28.0
      with:
        release: false
        msystem: ${{matrix.sys}}
        pacboy: cc:p cmake:p ninja:p lld:p
    - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
    - name: Configure
      run: cmake -B ../build -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Debug
      env: { LDFLAGS: -fuse-ld=lld }
    - name: Build
      run: cmake --build ../build
    - name: Test
      run: ctest -j `nproc` --test-dir ../build
      env:
        CTEST_OUTPUT_ON_FAILURE: True


================================================
FILE: .gitignore
================================================
*.a
*.so*
*.xcodeproj
*~
.vscode/
.cache/
.vs/
/CMakeScripts
/Testing
/_CPack_Packages
/install_manifest.txt
CMakeCache.txt
CMakeUserPresets.json
CMakeFiles
CPack*.cmake
CTestTestfile.cmake
FMT.build
Makefile
bin/
build/
cmake_install.cmake
fmt-*.cmake
fmt.pc


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.8...3.28)
include_guard(GLOBAL)

# Fallback for using newer policies on CMake <3.12.
if (${CMAKE_VERSION} VERSION_LESS 3.12)
  cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif ()

# Determine if fmt is built as a subproject (using add_subdirectory) or if it is
# the master project.
if (NOT DEFINED FMT_MASTER_PROJECT)
  set(FMT_MASTER_PROJECT OFF)
  # Checking project name is more reliable than checking source directories.
  if (NOT DEFINED PROJECT_NAME)
    set(FMT_MASTER_PROJECT ON)
    message(STATUS "CMake version: ${CMAKE_VERSION}")
  endif ()
endif ()

# Joins arguments and places the results in ${result_var}.
function (join result_var)
  set(result "")
  foreach (arg ${ARGN})
    set(result "${result}${arg}")
  endforeach ()
  set(${result_var}
      "${result}"
      PARENT_SCOPE)
endfunction ()

# Sets a cache variable with a docstring joined from multiple arguments:
#   set_verbose(<variable> <value> CACHE <type> <docstring>...)
# This allows splitting a long docstring for readability.
function (set_verbose variable value _cache type)
  join(doc ${ARGN})
  set(${variable}
      ${value}
      CACHE ${type} ${doc})
endfunction ()

# Set the default CMAKE_BUILD_TYPE to Release.
# This should be done before the project command since the latter can set
# CMAKE_BUILD_TYPE itself (it does so for nmake).
if (FMT_MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE)
  set_verbose(
    CMAKE_BUILD_TYPE Release CACHE STRING
    "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or "
    "CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
endif ()

project(FMT CXX)

# Determine support for the C++ module scanning and CXX_MODULE File_Sets
# Requires C++20, CMake >= 3.28 and
# Generators(Ninja >= 1.11 OR Visual Studio >= 17.4).
# Compilers GCC>=14, Clang>=16 or MSVC >= 17.4
# Source: https://cmake.org/cmake/help/latest/manual/cmake-cxxmodules.7.html
set(FMT_USE_CMAKE_MODULES FALSE)
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.28 AND CMAKE_CXX_STANDARD
                                                 GREATER_EQUAL 20)
  if (CMAKE_GENERATOR STREQUAL "Ninja")
    execute_process(COMMAND "${CMAKE_MAKE_PROGRAM}" "--version"
                    OUTPUT_VARIABLE NINJA_VERSION)
    if (NINJA_VERSION VERSION_GREATER_EQUAL 1.11)
      if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
                                                    GREATER_EQUAL 14)
          OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"
              AND CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 16)
          OR (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND MSVC_VERSION
                                                        GREATER_EQUAL 1934))
        set(FMT_USE_CMAKE_MODULES TRUE)
      endif ()
    endif ()
  elseif (CMAKE_GENERATOR MATCHES "^Visual Studio" AND MSVC_VERSION
                                                       GREATER_EQUAL 1934)
    set(FMT_USE_CMAKE_MODULES TRUE)
  endif ()
endif ()

option(FMT_DOC "Generate the doc target." ${FMT_MASTER_PROJECT})
option(FMT_INSTALL "Generate the install target." ${FMT_MASTER_PROJECT})
option(FMT_TEST "Generate the test target." ${FMT_MASTER_PROJECT})
option(FMT_FUZZ "Generate the fuzz target." OFF)
option(FMT_CUDA_TEST "Generate the cuda-test target." OFF)
option(FMT_OS "Include OS-specific APIs." ON)
option(FMT_MODULE "Build a module library." ${FMT_USE_CMAKE_MODULES})
option(FMT_SYSTEM_HEADERS "Expose headers with marking them as system." OFF)
option(FMT_UNICODE "Enable Unicode support." ON)
option(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF)
option(FMT_WERROR "Halt the compilation with an error on compiler warnings."
       OFF)

set(FMT_SYSTEM_HEADERS_ATTRIBUTE "")
if (FMT_SYSTEM_HEADERS)
  set(FMT_SYSTEM_HEADERS_ATTRIBUTE SYSTEM)
endif ()

include(GNUInstallDirs) # CMAKE_INSTALL_INCLUDEDIR

set_verbose(
  FMT_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING
  "Installation directory for include files, a relative path that "
  "will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute path.")

set(FMT_DEBUG_POSTFIX
    d
    CACHE STRING "Debug library postfix.")

# Get version from base.h.
file(READ include/fmt/base.h base_h)
if (NOT base_h MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])")
  message(FATAL_ERROR "Cannot get FMT_VERSION from base.h.")
endif ()
# Use math to skip leading zeros if any.
math(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
math(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
math(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
join(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.
     ${CPACK_PACKAGE_VERSION_PATCH})
message(STATUS "{fmt} version: ${FMT_VERSION}")

message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
endif ()

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/support/cmake")

include(CheckCXXCompilerFlag)
include(JoinPaths)

if (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)
  set_verbose(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING
              "Preset for the export of private symbols.")
  set_property(CACHE CMAKE_CXX_VISIBILITY_PRESET PROPERTY STRINGS hidden
                                                          default)
endif ()

if (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN)
  set_verbose(
    CMAKE_VISIBILITY_INLINES_HIDDEN ON CACHE BOOL
    "Whether to add a compile flag to hide symbols of inline " "functions.")
endif ()

if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
  set(PEDANTIC_COMPILE_FLAGS
      -pedantic-errors
      -Wall
      -Wextra
      -pedantic
      -Wold-style-cast
      -Wundef
      -Wredundant-decls
      -Wwrite-strings
      -Wpointer-arith
      -Wcast-qual
      -Wformat=2
      -Wmissing-include-dirs
      -Wcast-align
      -Wctor-dtor-privacy
      -Wdisabled-optimization
      -Winvalid-pch
      -Woverloaded-virtual
      -Wconversion
      -Wundef
      -Wno-ctor-dtor-privacy
      -Wno-format-nonliteral)
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
    set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wno-dangling-else
                               -Wno-unused-local-typedefs)
  endif ()
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
    set(PEDANTIC_COMPILE_FLAGS
        ${PEDANTIC_COMPILE_FLAGS}
        -Wdouble-promotion
        -Wtrampolines
        -Wzero-as-null-pointer-constant
        -Wuseless-cast
        -Wvector-operation-performance
        -Wsized-deallocation
        -Wshadow)
  endif ()
  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
    set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wshift-overflow=2
                               -Wduplicated-cond)
    # Workaround for GCC 12-15 regression:
    # a false positive null-dereference in vector.resize
    # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108860.
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0)
      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wnull-dereference)
    endif ()
  endif ()
  set(WERROR_FLAG -Werror)
endif ()

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  set(PEDANTIC_COMPILE_FLAGS
      -Wall
      -Wextra
      -pedantic
      -Wconversion
      -Wundef
      -Wdeprecated
      -Wweak-vtables
      -Wshadow
      -Wno-gnu-zero-variadic-macro-arguments)
  check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING)
  if (HAS_NULLPTR_WARNING)
    set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}
                               -Wzero-as-null-pointer-constant)
  endif ()
  set(WERROR_FLAG -Werror)
endif ()

if (MSVC)
  set(PEDANTIC_COMPILE_FLAGS /W3)
  set(WERROR_FLAG /WX)
endif ()

if (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio")
  # If Microsoft SDK is installed create script run-msbuild.bat that
  # calls SetEnv.cmd to set up build environment and runs msbuild.
  # It is useful when building Visual Studio projects with the SDK
  # toolchain rather than Visual Studio.
  include(FindSetEnv)
  if (WINSDK_SETENV)
    set(MSBUILD_SETUP "call \"${WINSDK_SETENV}\"")
  endif ()
  # Set FrameworkPathOverride to get rid of MSB3644 warnings.
  join(netfxpath
       "C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\"
       ".NETFramework\\v4.0")
  file(WRITE run-msbuild.bat "${MSBUILD_SETUP}
    ${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*")
endif ()

# Sets up a top-level fmt target. Targets that depend on other top-level targets
# should call this because they'll automatically get the required properties.
function (setup_target target kind)
  add_library(fmt::${target} ALIAS ${target})

  target_include_directories(
    ${target} ${FMT_SYSTEM_HEADERS_ATTRIBUTE} BEFORE ${kind}
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${FMT_INC_DIR}>)

  if (NOT MSVC)
    # Unicode is always supported on compilers other than MSVC.
  elseif (FMT_UNICODE)
    # Unicode support requires compiling with /utf-8.
    target_compile_options(
      ${target} ${kind}
      $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>>:/utf-8>)
  else ()
    target_compile_definitions(${target} ${kind} FMT_UNICODE=0)
  endif ()

  set_target_properties(
    ${target}
    PROPERTIES VERSION ${FMT_VERSION}
               SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}
               DEBUG_POSTFIX "${FMT_DEBUG_POSTFIX}")
endfunction ()

set(FMT_HEADERS)
foreach (
  header
  args.h
  base.h
  chrono.h
  color.h
  compile.h
  core.h
  format.h
  format-inl.h
  os.h
  ostream.h
  printf.h
  ranges.h
  std.h
  xchar.h)
  set(FMT_HEADERS ${FMT_HEADERS} include/fmt/${header})
endforeach ()

# Add the main fmt library.
add_library(fmt src/format.cc ${FMT_HEADERS} README.md ChangeLog.md)
setup_target(fmt PUBLIC)
set_target_properties(fmt PROPERTIES PUBLIC_HEADER "${FMT_HEADERS}")

if (FMT_OS)
  target_sources(fmt PRIVATE src/os.cc)
else ()
  target_compile_definitions(fmt PRIVATE FMT_OS=0)
endif ()

if (FMT_WERROR)
  target_compile_options(fmt PRIVATE ${WERROR_FLAG})
endif ()
if (FMT_PEDANTIC)
  target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS})
endif ()

if (cxx_std_11 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  target_compile_features(fmt PUBLIC cxx_std_11)
else ()
  message(WARNING "Feature cxx_std_11 is unknown for the CXX compiler")
endif ()

# Set FMT_LIB_NAME for pkg-config fmt.pc. We cannot use the OUTPUT_NAME target
# property because it's not set by default.
set(FMT_LIB_NAME fmt)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  set(FMT_LIB_NAME ${FMT_LIB_NAME}${FMT_DEBUG_POSTFIX})
endif ()

if (BUILD_SHARED_LIBS)
  target_compile_definitions(
    fmt
    PRIVATE FMT_LIB_EXPORT
    INTERFACE FMT_SHARED)
endif ()
if (FMT_SAFE_DURATION_CAST)
  target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST)
endif ()

# Adds a library compiled with C++20 module support.
#
# Usage:
#   add_module_library(<name> [sources...] [USE_CMAKE_MODULES TRUE])
function (add_module_library name)
  cmake_parse_arguments(AML "" "USE_CMAKE_MODULES" "" ${ARGN})
  set(sources ${AML_UNPARSED_ARGUMENTS})

  add_library(${name})
  set_target_properties(${name} PROPERTIES LINKER_LANGUAGE CXX)

  # Modules require C++20.
  target_compile_features(${name} PUBLIC cxx_std_20)

  if (MSVC)
    if (NOT CMAKE_GENERATOR STREQUAL "Ninja")
      set(BMI_DIR "${CMAKE_CURRENT_BINARY_DIR}")
      file(TO_NATIVE_PATH "${BMI_DIR}/${name}.ifc" BMI)
      target_compile_options(
        ${name}
        PRIVATE /interface /ifcOutput ${BMI}
        INTERFACE /reference fmt=${BMI})
      set_target_properties(${name} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI})
      set_source_files_properties(${BMI} PROPERTIES GENERATED ON)
    endif ()
  endif ()

  if (${AML_USE_CMAKE_MODULES})
    target_sources(${name} PUBLIC FILE_SET fmt TYPE CXX_MODULES FILES
                                  ${sources})
    return()
  endif ()

  if (CMAKE_COMPILER_IS_GNUCXX)
    target_compile_options(${name} PUBLIC -fmodules-ts)
  endif ()

  # `std` is affected by CMake options and may be higher than C++20.
  get_target_property(std ${name} CXX_STANDARD)

  if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    set(pcms)
    foreach (src ${sources})
      get_filename_component(pcm ${src} NAME_WE)
      set(pcm ${pcm}.pcm)

      # Propagate -fmodule-file=*.pcm to targets that link with this library.
      target_compile_options(
        ${name} PUBLIC -fmodule-file=${CMAKE_CURRENT_BINARY_DIR}/${pcm})

      # Use an absolute path to prevent target_link_libraries prepending -l
      # to it.
      set(pcms ${pcms} ${CMAKE_CURRENT_BINARY_DIR}/${pcm})
      add_custom_command(
        OUTPUT ${pcm}
        COMMAND
          ${CMAKE_CXX_COMPILER} -std=c++${std} -x c++-module --precompile -c -o
          ${pcm} ${CMAKE_CURRENT_SOURCE_DIR}/${src}
          "-I$<JOIN:$<TARGET_PROPERTY:${name},INCLUDE_DIRECTORIES>,;-I>"
        # Required by the -I generator expression above.
        COMMAND_EXPAND_LISTS
        DEPENDS ${src})
    endforeach ()

    # Add .pcm files as sources to make sure they are built before the library.
    set(sources)
    foreach (pcm ${pcms})
      get_filename_component(pcm_we ${pcm} NAME_WE)
      set(obj ${pcm_we}.o)
      # Use an absolute path to prevent target_link_libraries prepending -l.
      set(sources ${sources} ${pcm} ${CMAKE_CURRENT_BINARY_DIR}/${obj})
      add_custom_command(
        OUTPUT ${obj}
        COMMAND ${CMAKE_CXX_COMPILER} $<TARGET_PROPERTY:${name},COMPILE_OPTIONS>
                -c -o ${obj} ${pcm}
        DEPENDS ${pcm})
    endforeach ()
  endif ()
  target_sources(${name} PRIVATE ${sources})
endfunction ()

if (FMT_MODULE)
  add_module_library(fmt-module src/fmt.cc USE_CMAKE_MODULES
                     ${FMT_USE_CMAKE_MODULES})
  setup_target(fmt-module PUBLIC)
endif ()

add_library(fmt-header-only INTERFACE)

target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1)
target_compile_features(fmt-header-only INTERFACE cxx_std_11)
setup_target(fmt-header-only INTERFACE)

add_library(fmt-c STATIC src/fmt-c.cc)
target_compile_features(fmt-c INTERFACE c_std_11)
if (MSVC)
  target_compile_options(fmt-c PUBLIC /Zc:preprocessor)
endif ()
target_link_libraries(fmt-c PUBLIC fmt::fmt)
add_library(fmt::fmt-c ALIAS fmt-c)

set_target_properties(fmt-c PROPERTIES PUBLIC_HEADER include/fmt/fmt-c.h)

# Install targets.
if (FMT_INSTALL)
  include(CMakePackageConfigHelpers)
  set_verbose(
    FMT_CMAKE_DIR
    ${CMAKE_INSTALL_LIBDIR}/cmake/fmt
    CACHE
    STRING
    "Installation directory for cmake files, a relative path that "
    "will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute "
    "path.")
  set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake)
  set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake)
  set(pkgconfig ${PROJECT_BINARY_DIR}/fmt.pc)
  set(targets_export_name fmt-targets)

  set_verbose(
    FMT_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
    "Installation directory for libraries, a relative path that "
    "will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.")

  set_verbose(
    FMT_PKGCONFIG_DIR
    ${CMAKE_INSTALL_LIBDIR}/pkgconfig
    CACHE
    STRING
    "Installation directory for pkgconfig (.pc) files, a relative "
    "path that will be joined with ${CMAKE_INSTALL_PREFIX} or an "
    "absolute path.")

  # Generate the version, config and target files into the build directory.
  write_basic_package_version_file(
    ${version_config}
    VERSION ${FMT_VERSION}
    COMPATIBILITY AnyNewerVersion)

  join_paths(libdir_for_pc_file "\${exec_prefix}" "${FMT_LIB_DIR}")
  join_paths(includedir_for_pc_file "\${prefix}" "${FMT_INC_DIR}")

  configure_file("${PROJECT_SOURCE_DIR}/support/cmake/fmt.pc.in" "${pkgconfig}"
                 @ONLY)
  configure_package_config_file(
    ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in ${project_config}
    INSTALL_DESTINATION ${FMT_CMAKE_DIR})

  set(INSTALL_TARGETS fmt fmt-header-only fmt-c)

  if (FMT_MODULE)
    list(APPEND INSTALL_TARGETS fmt-module)
    if (FMT_USE_CMAKE_MODULES)
      set(INSTALL_FILE_SET FILE_SET fmt DESTINATION ${FMT_INC_DIR}/fmt)
    endif ()
  endif ()

  # Install the library and headers.
  install(
    TARGETS ${INSTALL_TARGETS}
    COMPONENT fmt_core
    EXPORT ${targets_export_name}
    LIBRARY DESTINATION ${FMT_LIB_DIR}
    ARCHIVE DESTINATION ${FMT_LIB_DIR}
    PUBLIC_HEADER DESTINATION ${FMT_INC_DIR}/fmt
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ${INSTALL_FILE_SET})

  # Use a namespace because CMake provides better diagnostics for namespaced
  # imported targets.
  export(
    TARGETS ${INSTALL_TARGETS}
    NAMESPACE fmt::
    FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)

  # Install version, config and target files.
  install(
    FILES ${project_config} ${version_config}
    DESTINATION ${FMT_CMAKE_DIR}
    COMPONENT fmt_core)
  install(
    EXPORT ${targets_export_name}
    DESTINATION ${FMT_CMAKE_DIR}
    NAMESPACE fmt::
    COMPONENT fmt_core)

  install(
    FILES "${pkgconfig}"
    DESTINATION "${FMT_PKGCONFIG_DIR}"
    COMPONENT fmt_core)
endif ()

function (add_doc_target)
  find_program(DOXYGEN doxygen PATHS "$ENV{ProgramFiles}/doxygen/bin"
                                     "$ENV{ProgramFiles\(x86\)}/doxygen/bin")
  if (NOT DOXYGEN)
    message(STATUS "Target 'doc' disabled because doxygen not found")
    return()
  endif ()

  find_program(MKDOCS mkdocs)
  if (NOT MKDOCS)
    message(STATUS "Target 'doc' disabled because mkdocs not found")
    return()
  endif ()

  set(sources)
  foreach (source api.md index.md syntax.md get-started.md fmt.css fmt.js)
    set(sources ${sources} doc/${source})
  endforeach ()

  add_custom_target(
    doc
    COMMAND
      ${CMAKE_COMMAND} -E env
      PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/support/python ${MKDOCS} build -f
      ${CMAKE_CURRENT_SOURCE_DIR}/support/mkdocs.yml
      # MkDocs requires the site dir to be outside of the doc dir.
      --site-dir ${CMAKE_CURRENT_BINARY_DIR}/doc-html --no-directory-urls
    SOURCES ${sources})

  install(
    DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc-html/
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/fmt
    COMPONENT fmt_doc
    OPTIONAL)
endfunction ()

if (FMT_DOC)
  add_doc_target()
endif ()

if (FMT_TEST)
  enable_testing()
  add_subdirectory(test)
endif ()

# Control fuzzing independent of the unit tests.
if (FMT_FUZZ)
  add_subdirectory(test/fuzzing)

  # The FMT_FUZZ macro is used to prevent resource exhaustion in fuzzing
  # mode and make fuzzing practically possible. It is similar to
  # FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION but uses a different name to
  # avoid interfering with fuzzing of projects that use {fmt}.
  # See also https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode.
  target_compile_definitions(fmt PUBLIC FMT_FUZZ)
endif ()

set(gitignore ${PROJECT_SOURCE_DIR}/.gitignore)
if (FMT_MASTER_PROJECT AND EXISTS ${gitignore})
  # Get the list of ignored files from .gitignore.
  file(STRINGS ${gitignore} lines)
  list(REMOVE_ITEM lines /doc/html)
  foreach (line ${lines})
    string(REPLACE "." "[.]" line "${line}")
    string(REPLACE "*" ".*" line "${line}")
    set(ignored_files ${ignored_files} "${line}$" "${line}/")
  endforeach ()
  set(ignored_files ${ignored_files} /.git /build/doxyxml .vagrant)

  set(CPACK_SOURCE_GENERATOR ZIP)
  set(CPACK_SOURCE_IGNORE_FILES ${ignored_files})
  set(CPACK_SOURCE_PACKAGE_FILE_NAME fmt-${FMT_VERSION})
  set(CPACK_PACKAGE_NAME fmt)
  set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.md)
  include(CPack)
endif ()


================================================
FILE: CONTRIBUTING.md
================================================
Contributing to {fmt}
=====================

By submitting a pull request or a patch, you represent that you have the right
to license your contribution to the {fmt} project owners and the community,
agree that your contributions are licensed under the {fmt} license, and agree
to future changes to the licensing.

All C++ code must adhere to [Google C++ Style Guide](
https://google.github.io/styleguide/cppguide.html) with the following
exceptions:

* Exceptions are permitted
* snake_case should be used instead of UpperCamelCase for function and type
  names

All documentation must adhere to the [Google Developer Documentation Style
Guide](https://developers.google.com/style).

Thanks for contributing!


================================================
FILE: ChangeLog.md
================================================
# 12.1.0 - 2025-10-29

- Optimized `buffer::append`, resulting in up to ~16% improvement on spdlog
  benchmarks (https://github.com/fmtlib/fmt/pull/4541). Thanks @fyrsta7.

- Worked around an ABI incompatibility in `std::locale_ref` between clang and
  gcc (https://github.com/fmtlib/fmt/issues/4573).

- Made `std::variant` and `std::expected` formatters work with `format_as`
  (https://github.com/fmtlib/fmt/issues/4574,
  https://github.com/fmtlib/fmt/pull/4575). Thanks @phprus.

- Made `fmt::join<string_view>` work with C++ modules
  (https://github.com/fmtlib/fmt/issues/4379,
  https://github.com/fmtlib/fmt/pull/4577). Thanks @Arghnews.

- Exported `fmt::is_compiled_string` and `operator""_cf` from the module
  (https://github.com/fmtlib/fmt/pull/4544). Thanks @CrackedMatter.

- Fixed a compatibility issue with C++ modules in clang
  (https://github.com/fmtlib/fmt/pull/4548). Thanks @tsarn.

- Added support for cv-qualified types to the `std::optional` formatter
  (https://github.com/fmtlib/fmt/issues/4561,
  https://github.com/fmtlib/fmt/pull/4562). Thanks @OleksandrKvl.

- Added demangling support (used in exception and `std::type_info` formatters)
  for libc++ and clang-cl
  (https://github.com/fmtlib/fmt/issues/4542,
  https://github.com/fmtlib/fmt/pull/4560,
  https://github.com/fmtlib/fmt/issues/4568,
  https://github.com/fmtlib/fmt/pull/4571).
  Thanks @FatihBAKIR and @rohitsutreja.

- Switched to global `malloc`/`free` to enable allocator customization
  (https://github.com/fmtlib/fmt/issues/4569,
  https://github.com/fmtlib/fmt/pull/4570). Thanks @rohitsutreja.

- Made the `FMT_USE_CONSTEVAL` macro configurable by users
  (https://github.com/fmtlib/fmt/pull/4546). Thanks @SnapperTT.

- Fixed compilation with locales disabled in the header-only mode
  (https://github.com/fmtlib/fmt/issues/4550).

- Fixed compilation with clang 21 and `-std=c++20`
  (https://github.com/fmtlib/fmt/issues/4552).

- Fixed a dynamic linking issue with clang-cl
  (https://github.com/fmtlib/fmt/issues/4576,
  https://github.com/fmtlib/fmt/pull/4584). Thanks @FatihBAKIR.

- Fixed a warning suppression leakage on gcc
  (https://github.com/fmtlib/fmt/pull/4588). Thanks @ZedThree.

- Made more internal color APIs `constexpr`
  (https://github.com/fmtlib/fmt/pull/4581). Thanks @ishani.

- Fixed compatibility with clang as a host compiler for NVCC
  (https://github.com/fmtlib/fmt/pull/4564). Thanks @valgur.

- Fixed various warnings and lint issues
  (https://github.com/fmtlib/fmt/issues/4565,
  https://github.com/fmtlib/fmt/pull/4572,
  https://github.com/fmtlib/fmt/pull/4557).
  Thanks @LiangHuDream and @teruyamato0731.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/4549,
  https://github.com/fmtlib/fmt/pull/4551,
  https://github.com/fmtlib/fmt/issues/4566,
  https://github.com/fmtlib/fmt/pull/4567,
  https://github.com/fmtlib/fmt/pull/4578,).
  Thanks @teruyamato0731, @petersteneteg and @zimmerman-dev.

# 12.0.0 - 2025-09-17

- Optimized the default floating point formatting
  (https://github.com/fmtlib/fmt/issues/3675,
  https://github.com/fmtlib/fmt/issues/4516). In particular, formatting a
  `double` with format string compilation into a stack allocated buffer is
  more than 60% faster in version 12.0 compared to 11.2 according to
  [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark):

  ```
  Function  Time (ns)  Speedup
  fmt11        34.471    1.00x
  fmt12        21.000    1.64x
  ```

  <img width="766" height="609" src="https://github.com/user-attachments/assets/d7d768ad-7543-468c-b0bb-449abf73b31b" />

- Added `constexpr` support to `fmt::format`. For example:

  ```c++
  #include <fmt/compile.h>

  using namespace fmt::literals;
  std::string s = fmt::format(""_cf, 42);
  ```

  now works at compile time provided that `std::string` supports `constexpr`
  (https://github.com/fmtlib/fmt/issues/3403,
  https://github.com/fmtlib/fmt/pull/4456). Thanks @msvetkin.

- Added `FMT_STATIC_FORMAT` that allows formatting into a string of the exact
  required size at compile time.

  For example:

  ```c++
  #include <fmt/compile.h>

  constexpr auto s = FMT_STATIC_FORMAT("{}", 42);
  ```

  compiles to just

  ```s
  __ZL1s:
        .asciiz "42"
  ```

  It can be accessed as a C string with `s.c_str()` or as a string view with
  `s.str()`.

- Improved C++20 module support
  (https://github.com/fmtlib/fmt/pull/4451,
  https://github.com/fmtlib/fmt/pull/4459,
  https://github.com/fmtlib/fmt/pull/4476,
  https://github.com/fmtlib/fmt/pull/4488,
  https://github.com/fmtlib/fmt/issues/4491,
  https://github.com/fmtlib/fmt/pull/4495).
  Thanks @arBmind, @tkhyn, @Mishura4, @anonymouspc and @autoantwort.

- Switched to using estimated display width in precision. For example:

  ```c++
  fmt::print("|{:.4}|\n|1234|\n", "🐱🐱🐱");
  ```

  prints

  ![](https://github.com/user-attachments/assets/6c4446b3-13eb-43b9-b74a-b4543540ad6a)

  because `🐱` has an estimated width of 2
  (https://github.com/fmtlib/fmt/issues/4272,
  https://github.com/fmtlib/fmt/pull/4443,
  https://github.com/fmtlib/fmt/pull/4475).
  Thanks @nikhilreddydev and @localspook.

- Fix interaction between debug presentation, precision, and width for strings
  (https://github.com/fmtlib/fmt/pull/4478). Thanks @localspook.

- Implemented allocator propagation on `basic_memory_buffer` move
  (https://github.com/fmtlib/fmt/issues/4487,
  https://github.com/fmtlib/fmt/pull/4490). Thanks @toprakmurat.

- Fixed an ambiguity between `std::reference_wrapper<T>` and `format_as`
  formatters (https://github.com/fmtlib/fmt/issues/4424,
  https://github.com/fmtlib/fmt/pull/4434). Thanks @jeremy-rifkin.

- Removed the following deprecated APIs:

  - `has_formatter`: use `is_formattable` instead,
  - `basic_format_args::parse_context_type`,
    `basic_format_args::formatter_type` and similar aliases in context types,
  - wide stream overload of `fmt::printf`,
  - wide stream overloads of `fmt::print` that take text styles,
  - `is_*char` traits,
  - `fmt::localtime`.

- Deprecated wide overloads of `fmt::fprintf` and `fmt::sprintf`.

- Improved diagnostics for the incorrect usage of `fmt::ptr`
  (https://github.com/fmtlib/fmt/pull/4453). Thanks @TobiSchluter.

- Made handling of ANSI escape sequences more efficient
  (https://github.com/fmtlib/fmt/pull/4511,
  https://github.com/fmtlib/fmt/pull/4528).
  Thanks @localspook and @Anas-Hamdane.

- Fixed a buffer overflow on all emphasis flags set
  (https://github.com/fmtlib/fmt/pull/4498). Thanks @dominicpoeschko.

- Fixed an integer overflow for precision close to the max `int` value.

- Fixed compatibility with WASI (https://github.com/fmtlib/fmt/issues/4496,
  https://github.com/fmtlib/fmt/pull/4497). Thanks @whitequark.

- Fixed `back_insert_iterator` detection, preventing a fallback on slower path
  that handles arbitrary iterators (https://github.com/fmtlib/fmt/issues/4454).

- Fixed handling of invalid glibc `FILE` buffers
  (https://github.com/fmtlib/fmt/issues/4469).

- Added `wchar_t` support to the `std::byte` formatter
  (https://github.com/fmtlib/fmt/issues/4479,
  https://github.com/fmtlib/fmt/pull/4480). Thanks @phprus.

- Changed component prefix from `fmt-` to `fmt_` for compatibility with
  NSIS/CPack on Windows, e.g. `fmt-doc` changed to `fmt_doc`
  (https://github.com/fmtlib/fmt/issues/4441,
  https://github.com/fmtlib/fmt/pull/4442). Thanks @n-stein.

- Added the `FMT_CUSTOM_ASSERT_FAIL` macro to simplify providing a custom
  `fmt::assert_fail` implementation (https://github.com/fmtlib/fmt/pull/4505).
  Thanks @HazardyKnusperkeks.

- Switched to `FMT_THROW` on reporting format errors so that it can be
  overriden by users when exceptions are disabled
  (https://github.com/fmtlib/fmt/pull/4521). Thanks @HazardyKnusperkeks.

- Improved master project detection and disabled install targets when using
  {fmt} as a subproject by default (https://github.com/fmtlib/fmt/pull/4536).
  Thanks @crueter.

- Made various code improvements
  (https://github.com/fmtlib/fmt/pull/4445,
  https://github.com/fmtlib/fmt/pull/4448,
  https://github.com/fmtlib/fmt/pull/4473,
  https://github.com/fmtlib/fmt/pull/4522).
  Thanks @localspook, @tchaikov and @way4sahil.

- Added Conan instructions to the docs
  (https://github.com/fmtlib/fmt/pull/4537). Thanks @uilianries.

- Removed Bazel files to avoid issues with downstream packaging
  (https://github.com/fmtlib/fmt/pull/4530). Thanks @mering.

- Added more entries for generated files to `.gitignore`
  (https://github.com/fmtlib/fmt/pull/4355,
  https://github.com/fmtlib/fmt/pull/4512).
  Thanks @dinomight and @localspook.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/pull/4447,
  https://github.com/fmtlib/fmt/issues/4470,
  https://github.com/fmtlib/fmt/pull/4474,
  https://github.com/fmtlib/fmt/pull/4477,
  https://github.com/fmtlib/fmt/pull/4471,
  https://github.com/fmtlib/fmt/pull/4483,
  https://github.com/fmtlib/fmt/pull/4515,
  https://github.com/fmtlib/fmt/issues/4533,
  https://github.com/fmtlib/fmt/pull/4534).
  Thanks @dodomorandi, @localspook, @remyjette, @Tomek-Stolarczyk, @Mishura4,
  @mattiasljungstrom and @FatihBAKIR.

# 11.2.0 - 2025-05-03

- Added the `s` specifier for `std::error_code`. It allows formatting an error
  message as a string. For example:

  ```c++
  #include <fmt/std.h>

  int main() {
    auto ec = std::make_error_code(std::errc::no_such_file_or_directory);
    fmt::print("{:s}\n", ec);
  }
  ```

  prints

  ```
  No such file or directory
  ```
  (The actual message is platform-specific.)

- Fixed formatting of `std::chrono::local_time` and `tm`
  (https://github.com/fmtlib/fmt/issues/3815,
  https://github.com/fmtlib/fmt/issues/4350).
  For example ([godbolt](https://www.godbolt.org/z/8o4b1PPn5)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    std::chrono::zoned_time zt(
      std::chrono::current_zone(),
      std::chrono::system_clock::now());
    fmt::print("{}", zt.get_local_time());
  }
  ```

  is now formatted consistenly across platforms.

- Added diagnostics for cases when timezone information is not available.
  For example:

  ```c++
  fmt::print("{:Z}", std::chrono::local_seconds());
  ```

  now gives a compile-time error.

- Deprecated `fmt::localtime` in favor of `std::localtime`.

- Fixed compilation with GCC 15 and C++20 modules enabled
  (https://github.com/fmtlib/fmt/pull/4347). Thanks @tkhyn.

- Fixed handling of named arguments in format specs
  (https://github.com/fmtlib/fmt/issues/4360,
  https://github.com/fmtlib/fmt/pull/4361). Thanks @dinomight.

- Added error reporting for duplicate named arguments
  (https://github.com/fmtlib/fmt/issues/4282,
  https://github.com/fmtlib/fmt/pull/4367). Thanks @dinomight.

- Fixed formatting of `long` with `FMT_BUILTIN_TYPES=0`
  (https://github.com/fmtlib/fmt/issues/4375,
  https://github.com/fmtlib/fmt/issues/4394).

- Optimized `text_style` using bit packing
  (https://github.com/fmtlib/fmt/pull/4363). Thanks @localspook.

- Added support for incomplete types (https://github.com/fmtlib/fmt/issues/3180,
  https://github.com/fmtlib/fmt/pull/4383). Thanks @localspook.

- Fixed a flush issue in `fmt::print` when using libstdc++
  (https://github.com/fmtlib/fmt/issues/4398).

- Fixed `fmt::println` usage with `FMT_ENFORCE_COMPILE_STRING` and legacy
  compile-time checks (https://github.com/fmtlib/fmt/pull/4407).
  Thanks @madmaxoft.

- Removed legacy header `fmt/core.h` from docs
  (https://github.com/fmtlib/fmt/pull/4421,
  https://github.com/fmtlib/fmt/pull/4422). Thanks @krzysztofkortas.

- Worked around limitations of `__builtin_strlen` during constant evaluation
  (https://github.com/fmtlib/fmt/issues/4423,
  https://github.com/fmtlib/fmt/pull/4429). Thanks @BRevzin.

- Worked around a bug in MSVC v141 (https://github.com/fmtlib/fmt/issues/4412,
  https://github.com/fmtlib/fmt/pull/4413). Thanks @hirohira9119.

- Removed the `fmt_detail` namespace
  (https://github.com/fmtlib/fmt/issues/4324).

- Removed specializations of `std::is_floating_point` in tests
  (https://github.com/fmtlib/fmt/issues/4417).

- Fixed a CMake error when setting `CMAKE_MODULE_PATH` in the pedantic mode
  (https://github.com/fmtlib/fmt/pull/4426). Thanks @rlalik.

- Updated the Bazel config (https://github.com/fmtlib/fmt/pull/4400).
  Thanks @Vertexwahn.

# 11.1.4 - 2025-02-26

- Fixed ABI compatibility with earlier 11.x versions on Windows
  (https://github.com/fmtlib/fmt/issues/4359).

- Improved the logic of switching between fixed and exponential format for
  `float` (https://github.com/fmtlib/fmt/issues/3649).

- Moved `is_compiled_string` to the public API
  (https://github.com/fmtlib/fmt/issues/4335,
  https://github.com/fmtlib/fmt/issues/4342). Thanks @SwooshyCueb.

- Simplified implementation of `operator""_cf`
  (https://github.com/fmtlib/fmt/pull/4349). Thanks @localspook.

- Fixed `__builtin_strlen` detection (https://github.com/fmtlib/fmt/pull/4329).
  Thanks @localspook.

- Fixed handling of BMI paths with the Ninja generator
  (https://github.com/fmtlib/fmt/pull/4344). Thanks @tkhyn.

- Fixed gcc 8.3 compile errors (https://github.com/fmtlib/fmt/issues/4331,
  https://github.com/fmtlib/fmt/pull/4336). Thanks @sergiud.

- Fixed a bogus MSVC warning (https://github.com/fmtlib/fmt/pull/4356).
  Thanks @dinomight.

# 11.1.3 - 2025-01-25

- Fixed compilation on GCC 9.4 (https://github.com/fmtlib/fmt/issues/4313).

- Worked around an internal compiler error when using C++20 modules with GCC
  14.2 and earlier (https://github.com/fmtlib/fmt/issues/4295).

- Worked around a bug in GCC 6 (https://github.com/fmtlib/fmt/issues/4318).

- Fixed an issue caused by instantiating `formatter<const T>`
  (https://github.com/fmtlib/fmt/issues/4303,
  https://github.com/fmtlib/fmt/pull/4325). Thanks @timsong-cpp.

- Fixed formatting into `std::ostreambuf_iterator` when using format string
  compilation (https://github.com/fmtlib/fmt/issues/4309,
  https://github.com/fmtlib/fmt/pull/4312). Thanks @phprus.

- Restored a constraint on the map formatter so that it correctly reports as
  unformattable when the element is (https://github.com/fmtlib/fmt/pull/4326).
  Thanks @timsong-cpp.

- Reduced the size of format specs (https://github.com/fmtlib/fmt/issues/4298).

- Readded `args()` to `fmt::format_context`
  (https://github.com/fmtlib/fmt/issues/4307,
  https://github.com/fmtlib/fmt/pull/4310). Thanks @Erroneous1.

- Fixed a bogus MSVC warning (https://github.com/fmtlib/fmt/issues/4314,
  https://github.com/fmtlib/fmt/pull/4322). Thanks @ZehMatt.

- Fixed a pedantic mode error in the CMake config
  (https://github.com/fmtlib/fmt/pull/4327). Thanks @rlalik.

# 11.1.2 - 2025-01-12

- Fixed ABI compatibility with earlier 11.x versions
  (https://github.com/fmtlib/fmt/issues/4292).

- Added `wchar_t` support to the `std::bitset` formatter
  (https://github.com/fmtlib/fmt/issues/4285,
  https://github.com/fmtlib/fmt/pull/4286,
  https://github.com/fmtlib/fmt/issues/4289,
  https://github.com/fmtlib/fmt/pull/4290). Thanks @phprus.

- Prefixed CMake components with `fmt-` to simplify usage of {fmt} via
  `add_subdirectory` (https://github.com/fmtlib/fmt/issues/4283).

- Updated docs for meson (https://github.com/fmtlib/fmt/pull/4291).
  Thanks @trim21.

- Fixed a compilation error in chrono on nvcc
  (https://github.com/fmtlib/fmt/issues/4297,
  https://github.com/fmtlib/fmt/pull/4301). Thanks @breyerml.

- Fixed various warnings
  (https://github.com/fmtlib/fmt/pull/4288,
  https://github.com/fmtlib/fmt/pull/4299). Thanks @GamesTrap and @edo9300.

# 11.1.1 - 2024-12-27

- Fixed ABI compatibility with earlier 11.x versions
  (https://github.com/fmtlib/fmt/issues/4278).

- Defined CMake components (`core` and `doc`) to allow docs to be installed
  separately (https://github.com/fmtlib/fmt/pull/4276).
  Thanks @carlsmedstad.

# 11.1.0 - 2024-12-25

- Improved C++20 module support
  (https://github.com/fmtlib/fmt/issues/4081,
  https://github.com/fmtlib/fmt/pull/4083,
  https://github.com/fmtlib/fmt/pull/4084,
  https://github.com/fmtlib/fmt/pull/4152,
  https://github.com/fmtlib/fmt/issues/4153,
  https://github.com/fmtlib/fmt/pull/4169,
  https://github.com/fmtlib/fmt/issues/4190,
  https://github.com/fmtlib/fmt/issues/4234,
  https://github.com/fmtlib/fmt/pull/4239).
  Thanks @kamrann and @Arghnews.

- Reduced debug (unoptimized) binary code size and the number of template
  instantiations when passing formatting arguments. For example, unoptimized
  binary code size for `fmt::print("{}", 42)` was reduced by ~40% on GCC and
  ~60% on clang (x86-64).

  GCC:
  - Before: 161 instructions of which 105 are in reusable functions
    ([godbolt](https://www.godbolt.org/z/s9bGoo4ze)).
  - After: 116 instructions of which 60 are in reusable functions
    ([godbolt](https://www.godbolt.org/z/r7GGGxMs6)).

  Clang:
  - Before: 310 instructions of which 251 are in reusable functions
    ([godbolt](https://www.godbolt.org/z/Ts88b7M9o)).
  - After: 194 instructions of which 135 are in reusable functions
    ([godbolt](https://www.godbolt.org/z/vcrjP8ceW)).

- Added an experimental `fmt::writer` API that can be used for writing to
  different destinations such as files or strings
  (https://github.com/fmtlib/fmt/issues/2354).
  For example ([godbolt](https://www.godbolt.org/z/rWoKfbP7e)):

  ```c++
  #include <fmt/os.h>

  void write_text(fmt::writer w) {
    w.print("The answer is {}.", 42);
  }

  int main() {
    // Write to FILE.
    write_text(stdout);

    // Write to fmt::ostream.
    auto f = fmt::output_file("myfile");
    write_text(f);

    // Write to std::string.
    auto sb = fmt::string_buffer();
    write_text(sb);
    std::string s = sb.str();
  }
  ```

- Added width and alignment support to the formatter of `std::error_code`.

- Made `std::expected<void, E>` formattable
  (https://github.com/fmtlib/fmt/issues/4145,
  https://github.com/fmtlib/fmt/pull/4148).
  For example ([godbolt](https://www.godbolt.org/z/hrj5c6G86)):

  ```c++
  fmt::print("{}", std::expected<void, int>());
  ```

  prints

  ```
  expected()
  ```

  Thanks @phprus.

- Made `fmt::is_formattable<void>` SFINAE-friendly
  (https://github.com/fmtlib/fmt/issues/4147).

- Added support for `_BitInt` formatting when using clang
  (https://github.com/fmtlib/fmt/issues/4007,
  https://github.com/fmtlib/fmt/pull/4072,
  https://github.com/fmtlib/fmt/issues/4140,
  https://github.com/fmtlib/fmt/issues/4173,
  https://github.com/fmtlib/fmt/pull/4176).
  For example ([godbolt](https://www.godbolt.org/z/KWjbWec5z)):

  ```c++
  using int42 = _BitInt(42);
  fmt::print("{}", int42(100));
  ```

  Thanks @Arghnews.

- Added the `n` specifier for tuples and pairs
  (https://github.com/fmtlib/fmt/pull/4107). Thanks @someonewithpc.

- Added support for tuple-like types to `fmt::join`
  (https://github.com/fmtlib/fmt/issues/4226,
  https://github.com/fmtlib/fmt/pull/4230). Thanks @phprus.

- Made more types formattable at compile time
  (https://github.com/fmtlib/fmt/pull/4127). Thanks @AnthonyVH.

- Implemented a more efficient compile-time `fmt::formatted_size`
  (https://github.com/fmtlib/fmt/issues/4102,
  https://github.com/fmtlib/fmt/pull/4103). Thanks @phprus.

- Fixed compile-time formatting of some string types
  (https://github.com/fmtlib/fmt/pull/4065). Thanks @torshepherd.

- Made compiled version of `fmt::format_to` work with
  `std::back_insert_iterator<std::vector<char>>`
  (https://github.com/fmtlib/fmt/issues/4206,
  https://github.com/fmtlib/fmt/pull/4211). Thanks @phprus.

- Added a formatter for `std::reference_wrapper`
  (https://github.com/fmtlib/fmt/pull/4163,
  https://github.com/fmtlib/fmt/pull/4164). Thanks @yfeldblum and @phprus.

- Added experimental padding support (glibc `strftime` extension) to `%m`, `%j`
  and `%Y` (https://github.com/fmtlib/fmt/pull/4161). Thanks @KKhanhH.

- Made microseconds formatted as `us` instead of `µs` if the Unicode support is
  disabled (https://github.com/fmtlib/fmt/issues/4088).

- Fixed an unreleased regression in transcoding of surrogate pairs
  (https://github.com/fmtlib/fmt/issues/4094,
  https://github.com/fmtlib/fmt/pull/4095). Thanks @phprus.

- Made `fmt::appender` satisfy `std::output_iterator` concept
  (https://github.com/fmtlib/fmt/issues/4092,
  https://github.com/fmtlib/fmt/pull/4093). Thanks @phprus.

- Made `std::iterator_traits<fmt::appender>` standard-conforming
  (https://github.com/fmtlib/fmt/pull/4185). Thanks @CaseyCarter.

- Made it easier to reuse `fmt::formatter<std::string_view>` for types with
  an implicit conversion to `std::string_view`
  (https://github.com/fmtlib/fmt/issues/4036,
  https://github.com/fmtlib/fmt/pull/4055). Thanks @Arghnews.

- Made it possible to disable `<filesystem>` use via `FMT_CPP_LIB_FILESYSTEM`
  for compatibility with some video game console SDKs, e.g. Nintendo Switch SDK
  (https://github.com/fmtlib/fmt/issues/4257,
  https://github.com/fmtlib/fmt/pull/4258,
  https://github.com/fmtlib/fmt/pull/4259). Thanks @W4RH4WK and @phprus.

- Fixed compatibility with platforms that use 80-bit `long double`
  (https://github.com/fmtlib/fmt/issues/4245,
  https://github.com/fmtlib/fmt/pull/4246). Thanks @jsirpoma.

- Added support for UTF-32 code units greater than `0xFFFF` in fill
  (https://github.com/fmtlib/fmt/issues/4201).

- Fixed handling of legacy encodings on Windows with GCC
  (https://github.com/fmtlib/fmt/issues/4162).

- Made `fmt::to_string` take `fmt::basic_memory_buffer` by const reference
  (https://github.com/fmtlib/fmt/issues/4261,
  https://github.com/fmtlib/fmt/pull/4262). Thanks @sascha-devel.

- Added `fmt::dynamic_format_arg_store::size`
  (https://github.com/fmtlib/fmt/pull/4270). Thanks @hannes-harnisch.

- Removed the ability to control locale usage via an undocumented
  `FMT_STATIC_THOUSANDS_SEPARATOR` in favor of `FMT_USE_LOCALE`.

- Renamed `FMT_EXCEPTIONS` to `FMT_USE_EXCEPTIONS` for consistency with other
  similar macros.

- Improved include directory ordering to reduce the chance of including
  incorrect headers when using multiple versions of {fmt}
  (https://github.com/fmtlib/fmt/pull/4116). Thanks @cdzhan.

- Made it possible to compile a subset of {fmt} without the C++ runtime.

- Improved documentation and README
  (https://github.com/fmtlib/fmt/pull/4066,
  https://github.com/fmtlib/fmt/issues/4117,
  https://github.com/fmtlib/fmt/issues/4203,
  https://github.com/fmtlib/fmt/pull/4235). Thanks @zyctree and @nikola-sh.

- Improved the documentation generator (https://github.com/fmtlib/fmt/pull/4110,
  https://github.com/fmtlib/fmt/pull/4115). Thanks @rturrado.

- Improved CI (https://github.com/fmtlib/fmt/pull/4155,
  https://github.com/fmtlib/fmt/pull/4151). Thanks @phprus.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/2708,
  https://github.com/fmtlib/fmt/issues/4091,
  https://github.com/fmtlib/fmt/issues/4109,
  https://github.com/fmtlib/fmt/issues/4113,
  https://github.com/fmtlib/fmt/issues/4125,
  https://github.com/fmtlib/fmt/issues/4129,
  https://github.com/fmtlib/fmt/pull/4130,
  https://github.com/fmtlib/fmt/pull/4131,
  https://github.com/fmtlib/fmt/pull/4132,
  https://github.com/fmtlib/fmt/issues/4133,
  https://github.com/fmtlib/fmt/issues/4144,
  https://github.com/fmtlib/fmt/issues/4150,
  https://github.com/fmtlib/fmt/issues/4158,
  https://github.com/fmtlib/fmt/pull/4159,
  https://github.com/fmtlib/fmt/issues/4160,
  https://github.com/fmtlib/fmt/pull/4170,
  https://github.com/fmtlib/fmt/issues/4177,
  https://github.com/fmtlib/fmt/pull/4187,
  https://github.com/fmtlib/fmt/pull/4188,
  https://github.com/fmtlib/fmt/pull/4194,
  https://github.com/fmtlib/fmt/pull/4200,
  https://github.com/fmtlib/fmt/issues/4205,
  https://github.com/fmtlib/fmt/issues/4207,
  https://github.com/fmtlib/fmt/pull/4208,
  https://github.com/fmtlib/fmt/pull/4210,
  https://github.com/fmtlib/fmt/issues/4220,
  https://github.com/fmtlib/fmt/issues/4231,
  https://github.com/fmtlib/fmt/issues/4232,
  https://github.com/fmtlib/fmt/pull/4233,
  https://github.com/fmtlib/fmt/pull/4236,
  https://github.com/fmtlib/fmt/pull/4267,
  https://github.com/fmtlib/fmt/pull/4271).
  Thanks @torsten48, @Arghnews, @tinfoilboy, @aminya, @Ottani, @zeroomega,
  @c4v4, @kongy, @vinayyadav3016, @sergio-nsk, @phprus and @YexuanXiao.

# 11.0.2 - 2024-07-20

- Fixed compatibility with non-POSIX systems
  (https://github.com/fmtlib/fmt/issues/4054,
  https://github.com/fmtlib/fmt/issues/4060).

- Fixed performance regressions when using `std::back_insert_iterator` with
  `fmt::format_to` (https://github.com/fmtlib/fmt/issues/4070).

- Fixed handling of `std::generator` and move-only iterators
  (https://github.com/fmtlib/fmt/issues/4053,
  https://github.com/fmtlib/fmt/pull/4057). Thanks @Arghnews.

- Made `formatter<std::string_view>::parse` work with types convertible to
  `std::string_view` (https://github.com/fmtlib/fmt/issues/4036,
  https://github.com/fmtlib/fmt/pull/4055). Thanks @Arghnews.

- Made `volatile void*` formattable
  (https://github.com/fmtlib/fmt/issues/4049,
  https://github.com/fmtlib/fmt/pull/4056). Thanks @Arghnews.

- Made `Glib::ustring` not be confused with `std::string`
  (https://github.com/fmtlib/fmt/issues/4052).

- Made `fmt::context` iterator compatible with STL algorithms that rely on
  iterator category (https://github.com/fmtlib/fmt/issues/4079).

# 11.0.1 - 2024-07-05

- Fixed version number in the inline namespace
  (https://github.com/fmtlib/fmt/issues/4047).

- Fixed disabling Unicode support via CMake
  (https://github.com/fmtlib/fmt/issues/4051).

- Fixed deprecated `visit_format_arg` (https://github.com/fmtlib/fmt/pull/4043).
  Thanks @nebkat.

- Fixed handling of a sign and improved the `std::complex` formater
  (https://github.com/fmtlib/fmt/pull/4034,
  https://github.com/fmtlib/fmt/pull/4050). Thanks @tesch1 and @phprus.

- Fixed ADL issues in `fmt::printf` when using C++20
  (https://github.com/fmtlib/fmt/pull/4042). Thanks @toge.

- Removed a redundant check in the formatter for `std::expected`
  (https://github.com/fmtlib/fmt/pull/4040). Thanks @phprus.

# 11.0.0 - 2024-07-01

- Added `fmt/base.h` which provides a subset of the API with minimal include
  dependencies and enough functionality to replace all uses of the `printf`
  family of functions. This brings the compile time of code using {fmt} much
  closer to the equivalent `printf` code as shown on the following benchmark
  that compiles 100 source files:

  | Method       | Compile Time (s) |
  |--------------|------------------|
  | printf       | 1.6              |
  | IOStreams    | 25.9             |
  | fmt 10.x     | 19.0             |
  | fmt 11.0     | 4.8              |
  | tinyformat   | 29.1             |
  | Boost Format | 55.0             |

  This gives almost 4x improvement in build speed compared to version 10.
  Note that the benchmark is purely formatting code and includes. In real
  projects the difference from `printf` will be smaller partly because common
  standard headers will be included in almost any translation unit (TU) anyway.
  In particular, in every case except `printf` above ~1s is spent in total on
  including `<type_traits>` in all TUs.

- Optimized includes in other headers such as `fmt/format.h` which is now
  roughly equivalent to the old `fmt/core.h` in terms of build speed.

- Migrated the documentation at https://fmt.dev/ from Sphinx to MkDocs.

- Improved C++20 module support
  (https://github.com/fmtlib/fmt/issues/3990,
  https://github.com/fmtlib/fmt/pull/3991,
  https://github.com/fmtlib/fmt/issues/3993,
  https://github.com/fmtlib/fmt/pull/3994,
  https://github.com/fmtlib/fmt/pull/3997,
  https://github.com/fmtlib/fmt/pull/3998,
  https://github.com/fmtlib/fmt/pull/4004,
  https://github.com/fmtlib/fmt/pull/4005,
  https://github.com/fmtlib/fmt/pull/4006,
  https://github.com/fmtlib/fmt/pull/4013,
  https://github.com/fmtlib/fmt/pull/4027,
  https://github.com/fmtlib/fmt/pull/4029). In particular, native CMake support
  for modules is now used if available. Thanks @yujincheng08 and @matt77hias.

- Added an option to replace standard includes with `import std` enabled via
  the `FMT_IMPORT_STD` macro (https://github.com/fmtlib/fmt/issues/3921,
  https://github.com/fmtlib/fmt/pull/3928). Thanks @matt77hias.

- Exported `fmt::range_format`, `fmt::range_format_kind` and
  `fmt::compiled_string` from the `fmt` module
  (https://github.com/fmtlib/fmt/pull/3970,
  https://github.com/fmtlib/fmt/pull/3999).
  Thanks @matt77hias and @yujincheng08.

- Improved integration with stdio in `fmt::print`, enabling direct writes
  into a C stream buffer in common cases. This may give significant
  performance improvements ranging from tens of percent to [2x](
  https://stackoverflow.com/a/78457454/471164) and eliminates dynamic memory
  allocations on the buffer level. It is currently enabled for built-in and
  string types with wider availability coming up in future releases.

  For example, it gives ~24% improvement on a [simple benchmark](
  https://isocpp.org/files/papers/P3107R5.html#perf) compiled with Apple clang
  version 15.0.0 (clang-1500.1.0.2.5) and run on macOS 14.2.1:

  ```
  -------------------------------------------------------
  Benchmark             Time             CPU   Iterations
  -------------------------------------------------------
  printf             81.8 ns         81.5 ns      8496899
  fmt::print (10.x)  63.8 ns         61.9 ns     11524151
  fmt::print (11.0)  51.3 ns         51.0 ns     13846580
  ```

- Improved safety of `fmt::format_to` when writing to an array
  (https://github.com/fmtlib/fmt/pull/3805).
  For example ([godbolt](https://www.godbolt.org/z/cYrn8dWY8)):

  ```c++
  auto volkswagen = char[4];
  auto result = fmt::format_to(volkswagen, "elephant");
  ```

  no longer results in a buffer overflow. Instead the output will be truncated
  and you can get the end iterator and whether truncation occurred from the
  `result` object. Thanks @ThePhD.

- Enabled Unicode support by default in MSVC, bringing it on par with other
  compilers and making it unnecessary for users to enable it explicitly.
  Most of {fmt} is encoding-agnostic but this prevents mojibake in places
  where encoding matters such as path formatting and terminal output.
  You can control the Unicode support via the CMake `FMT_UNICODE` option.
  Note that some {fmt} packages such as the one in vcpkg have already been
  compiled with Unicode enabled.

- Added a formatter for `std::expected`
  (https://github.com/fmtlib/fmt/pull/3834). Thanks @dominicpoeschko.

- Added a formatter for `std::complex`
  (https://github.com/fmtlib/fmt/issues/1467,
  https://github.com/fmtlib/fmt/issues/3886,
  https://github.com/fmtlib/fmt/pull/3892,
  https://github.com/fmtlib/fmt/pull/3900). Thanks @phprus.

- Added a formatter for `std::type_info`
  (https://github.com/fmtlib/fmt/pull/3978). Thanks @matt77hias.

- Specialized `formatter` for `std::basic_string` types with custom traits
  and allocators (https://github.com/fmtlib/fmt/issues/3938,
  https://github.com/fmtlib/fmt/pull/3943). Thanks @dieram3.

- Added formatters for `std::chrono::day`, `std::chrono::month`,
  `std::chrono::year` and `std::chrono::year_month_day`
  (https://github.com/fmtlib/fmt/issues/3758,
  https://github.com/fmtlib/fmt/issues/3772,
  https://github.com/fmtlib/fmt/pull/3906,
  https://github.com/fmtlib/fmt/pull/3913). For example:

  ```c++
  #include <fmt/chrono.h>
  #include <fmt/color.h>

  int main() {
    fmt::print(fg(fmt::color::green), "{}\n", std::chrono::day(7));
  }
  ```

  prints a green day:

  <img width="306" alt="image" src="https://github.com/fmtlib/fmt/assets/576385/6e395f8b-451a-4cf7-bccc-ee92ca0dec65">

  Thanks @zivshek.

- Fixed handling of precision in `%S` (https://github.com/fmtlib/fmt/issues/3794,
  https://github.com/fmtlib/fmt/pull/3814). Thanks @js324.

- Added support for the `-` specifier (glibc `strftime` extension) to day of
  the month (`%d`) and week of the year (`%W`, `%U`, `%V`) specifiers
  (https://github.com/fmtlib/fmt/pull/3976). Thanks @ZaheenJ.

- Fixed the scope of the `-` extension in chrono formatting so that it doesn't
  apply to subsequent specifiers (https://github.com/fmtlib/fmt/issues/3811,
  https://github.com/fmtlib/fmt/pull/3812). Thanks @phprus.

- Improved handling of `time_point::min()`
  (https://github.com/fmtlib/fmt/issues/3282).

- Added support for character range formatting
  (https://github.com/fmtlib/fmt/issues/3857,
  https://github.com/fmtlib/fmt/pull/3863). Thanks @js324.

- Added `string` and `debug_string` range formatters
  (https://github.com/fmtlib/fmt/pull/3973,
  https://github.com/fmtlib/fmt/pull/4024). Thanks @matt77hias.

- Enabled ADL for `begin` and `end` in `fmt::join`
  (https://github.com/fmtlib/fmt/issues/3813,
  https://github.com/fmtlib/fmt/pull/3824). Thanks @bbolli.

- Made contiguous iterator optimizations apply to `std::basic_string` iterators
  (https://github.com/fmtlib/fmt/pull/3798). Thanks @phprus.

- Added support for ranges with mutable `begin` and `end`
  (https://github.com/fmtlib/fmt/issues/3752,
  https://github.com/fmtlib/fmt/pull/3800,
  https://github.com/fmtlib/fmt/pull/3955). Thanks @tcbrindle and @Arghnews.

- Added support for move-only iterators to `fmt::join`
  (https://github.com/fmtlib/fmt/issues/3802,
  https://github.com/fmtlib/fmt/pull/3946). Thanks @Arghnews.

- Moved range and iterator overloads of `fmt::join` to `fmt/ranges.h`, next
  to other overloads.

- Fixed handling of types with `begin` returning `void` such as Eigen matrices
  (https://github.com/fmtlib/fmt/issues/3839,
  https://github.com/fmtlib/fmt/pull/3964). Thanks @Arghnews.

- Added an `fmt::formattable` concept (https://github.com/fmtlib/fmt/pull/3974).
  Thanks @matt77hias.

- Added support for `__float128` (https://github.com/fmtlib/fmt/issues/3494).

- Fixed rounding issues when formatting `long double` with fixed precision
  (https://github.com/fmtlib/fmt/issues/3539).

- Made `fmt::isnan` not trigger floating-point exception for NaN values
  (https://github.com/fmtlib/fmt/issues/3948,
  https://github.com/fmtlib/fmt/pull/3951). Thanks @alexdewar.

- Removed dependency on `<memory>` for `std::allocator_traits` when possible
  (https://github.com/fmtlib/fmt/pull/3804). Thanks @phprus.

- Enabled compile-time checks in formatting functions that take text colors and
  styles.

- Deprecated wide stream overloads of `fmt::print` that take text styles.

- Made format string compilation work with clang 12 and later despite
  only partial non-type template parameter support
  (https://github.com/fmtlib/fmt/issues/4000,
  https://github.com/fmtlib/fmt/pull/4001). Thanks @yujincheng08.

- Made `fmt::iterator_buffer`'s move constructor `noexcept`
  (https://github.com/fmtlib/fmt/pull/3808). Thanks @waywardmonkeys.

- Started enforcing that `formatter::format` is const for compatibility
  with `std::format` (https://github.com/fmtlib/fmt/issues/3447).

- Added `fmt::basic_format_arg::visit` and deprecated `fmt::visit_format_arg`.

- Made `fmt::basic_string_view` not constructible from `nullptr` for
  consistency with `std::string_view` in C++23
  (https://github.com/fmtlib/fmt/pull/3846). Thanks @dalle.

- Fixed `fmt::group_digits` for negative integers
  (https://github.com/fmtlib/fmt/issues/3891,
  https://github.com/fmtlib/fmt/pull/3901). Thanks @phprus.

- Fixed handling of negative ids in `fmt::basic_format_args::get`
  (https://github.com/fmtlib/fmt/pull/3945). Thanks @marlenecota.

- Fixed handling of a buffer boundary on flush
  (https://github.com/fmtlib/fmt/issues/4229).

- Improved named argument validation
  (https://github.com/fmtlib/fmt/issues/3817).

- Disabled copy construction/assignment for `fmt::format_arg_store` and
  fixed moved construction (https://github.com/fmtlib/fmt/pull/3833).
  Thanks @ivafanas.

- Worked around a locale issue in RHEL/devtoolset
  (https://github.com/fmtlib/fmt/issues/3858,
  https://github.com/fmtlib/fmt/pull/3859). Thanks @g199209.

- Added RTTI detection for MSVC (https://github.com/fmtlib/fmt/pull/3821,
  https://github.com/fmtlib/fmt/pull/3963). Thanks @edo9300.

- Migrated the documentation from Sphinx to MkDocs.

- Improved documentation and README
  (https://github.com/fmtlib/fmt/issues/3775,
  https://github.com/fmtlib/fmt/pull/3784,
  https://github.com/fmtlib/fmt/issues/3788,
  https://github.com/fmtlib/fmt/pull/3789,
  https://github.com/fmtlib/fmt/pull/3793,
  https://github.com/fmtlib/fmt/issues/3818,
  https://github.com/fmtlib/fmt/pull/3820,
  https://github.com/fmtlib/fmt/pull/3822,
  https://github.com/fmtlib/fmt/pull/3843,
  https://github.com/fmtlib/fmt/pull/3890,
  https://github.com/fmtlib/fmt/issues/3894,
  https://github.com/fmtlib/fmt/pull/3895,
  https://github.com/fmtlib/fmt/pull/3905,
  https://github.com/fmtlib/fmt/issues/3942,
  https://github.com/fmtlib/fmt/pull/4008).
  Thanks @zencatalyst, WolleTD, @tupaschoal, @Dobiasd, @frank-weinberg, @bbolli,
  @phprus, @waywardmonkeys, @js324 and @tchaikov.

- Improved CI and tests
  (https://github.com/fmtlib/fmt/issues/3878,
  https://github.com/fmtlib/fmt/pull/3883,
  https://github.com/fmtlib/fmt/issues/3897,
  https://github.com/fmtlib/fmt/pull/3979,
  https://github.com/fmtlib/fmt/pull/3980,
  https://github.com/fmtlib/fmt/pull/3988,
  https://github.com/fmtlib/fmt/pull/4010,
  https://github.com/fmtlib/fmt/pull/4012,
  https://github.com/fmtlib/fmt/pull/4038).
  Thanks @vgorrX, @waywardmonkeys, @tchaikov and @phprus.

- Fixed buffer overflow when using format string compilation with debug format
  and `std::back_insert_iterator` (https://github.com/fmtlib/fmt/issues/3795,
  https://github.com/fmtlib/fmt/pull/3797). Thanks @phprus.

- Improved Bazel support
  (https://github.com/fmtlib/fmt/pull/3792,
  https://github.com/fmtlib/fmt/pull/3801,
  https://github.com/fmtlib/fmt/pull/3962,
  https://github.com/fmtlib/fmt/pull/3965). Thanks @Vertexwahn.

- Improved/fixed the CMake config
  (https://github.com/fmtlib/fmt/issues/3777,
  https://github.com/fmtlib/fmt/pull/3783,
  https://github.com/fmtlib/fmt/issues/3847,
  https://github.com/fmtlib/fmt/pull/3907). Thanks @phprus and @xTachyon.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/3685,
  https://github.com/fmtlib/fmt/issues/3769,
  https://github.com/fmtlib/fmt/issues/3796,
  https://github.com/fmtlib/fmt/issues/3803,
  https://github.com/fmtlib/fmt/pull/3806,
  https://github.com/fmtlib/fmt/pull/3807,
  https://github.com/fmtlib/fmt/issues/3809,
  https://github.com/fmtlib/fmt/pull/3810,
  https://github.com/fmtlib/fmt/issues/3830,
  https://github.com/fmtlib/fmt/pull/3832,
  https://github.com/fmtlib/fmt/issues/3835,
  https://github.com/fmtlib/fmt/pull/3844,
  https://github.com/fmtlib/fmt/issues/3854,
  https://github.com/fmtlib/fmt/pull/3856,
  https://github.com/fmtlib/fmt/pull/3865,
  https://github.com/fmtlib/fmt/pull/3866,
  https://github.com/fmtlib/fmt/pull/3880,
  https://github.com/fmtlib/fmt/issues/3881,
  https://github.com/fmtlib/fmt/issues/3884,
  https://github.com/fmtlib/fmt/issues/3898,
  https://github.com/fmtlib/fmt/pull/3899,
  https://github.com/fmtlib/fmt/pull/3909,
  https://github.com/fmtlib/fmt/pull/3917,
  https://github.com/fmtlib/fmt/pull/3923,
  https://github.com/fmtlib/fmt/pull/3924,
  https://github.com/fmtlib/fmt/issues/3925,
  https://github.com/fmtlib/fmt/pull/3930,
  https://github.com/fmtlib/fmt/pull/3931,
  https://github.com/fmtlib/fmt/pull/3933,
  https://github.com/fmtlib/fmt/issues/3935,
  https://github.com/fmtlib/fmt/pull/3937,
  https://github.com/fmtlib/fmt/pull/3967,
  https://github.com/fmtlib/fmt/pull/3968,
  https://github.com/fmtlib/fmt/pull/3972,
  https://github.com/fmtlib/fmt/pull/3983,
  https://github.com/fmtlib/fmt/issues/3992,
  https://github.com/fmtlib/fmt/pull/3995,
  https://github.com/fmtlib/fmt/pull/4009,
  https://github.com/fmtlib/fmt/pull/4023).
  Thanks @hmbj, @phprus, @res2k, @Baardi, @matt77hias, @waywardmonkeys, @hmbj,
  @yakra, @prlw1, @Arghnews, @mtillmann0, @ShifftC, @eepp, @jimmy-park and
  @ChristianGebhardt.

# 10.2.1 - 2024-01-04

- Fixed ABI compatibility with earlier 10.x versions
  (https://github.com/fmtlib/fmt/issues/3785,
  https://github.com/fmtlib/fmt/pull/3786). Thanks @saraedum.

# 10.2.0 - 2024-01-01

- Added support for the `%j` specifier (the number of days) for
  `std::chrono::duration` (https://github.com/fmtlib/fmt/issues/3643,
  https://github.com/fmtlib/fmt/pull/3732). Thanks @intelfx.

- Added support for the chrono suffix for days and changed
  the suffix for minutes from "m" to the correct "min"
  (https://github.com/fmtlib/fmt/issues/3662,
  https://github.com/fmtlib/fmt/pull/3664).
  For example ([godbolt](https://godbolt.org/z/9KhMnq9ba)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    fmt::print("{}\n", std::chrono::days(42)); // prints "42d"
  }
  ```

  Thanks @Richardk2n.

- Fixed an overflow in `std::chrono::time_point` formatting with large dates
  (https://github.com/fmtlib/fmt/issues/3725,
  https://github.com/fmtlib/fmt/pull/3727). Thanks @cschreib.

- Added a formatter for `std::source_location`
  (https://github.com/fmtlib/fmt/pull/3730).
  For example ([godbolt](https://godbolt.org/z/YajfKjhhr)):

  ```c++
  #include <source_location>
  #include <fmt/std.h>

  int main() {
    fmt::print("{}\n", std::source_location::current());
  }
  ```

  prints

  ```
  /app/example.cpp:5:51: int main()
  ```

  Thanks @felix642.

- Added a formatter for `std::bitset`
  (https://github.com/fmtlib/fmt/pull/3660).
  For example ([godbolt](https://godbolt.org/z/bdEaGeYxe)):

  ```c++
  #include <bitset>
  #include <fmt/std.h>

  int main() {
    fmt::print("{}\n", std::bitset<6>(42)); // prints "101010"
  }
  ```

  Thanks @muggenhor.

- Added an experimental `nested_formatter` that provides an easy way of
  applying a formatter to one or more subobjects while automatically handling
  width, fill and alignment. For example:

  ```c++
  #include <fmt/format.h>

  struct point {
    double x, y;
  };

  template <>
  struct fmt::formatter<point> : nested_formatter<double> {
    auto format(point p, format_context& ctx) const {
      return write_padded(ctx, [=](auto out) {
        return format_to(out, "({}, {})", nested(p.x), nested(p.y));
      });
    }
  };

  int main() {
    fmt::print("[{:>20.2f}]", point{1, 2});
  }
  ```

  prints

  ```
  [          (1.00, 2.00)]
  ```

- Added the generic representation (`g`) to `std::filesystem::path`
  (https://github.com/fmtlib/fmt/issues/3715,
  https://github.com/fmtlib/fmt/pull/3729). For example:

  ```c++
  #include <filesystem>
  #include <fmt/std.h>

  int main() {
    fmt::print("{:g}\n", std::filesystem::path("C:\\foo"));
  }
  ```

  prints `"C:/foo"` on Windows.

  Thanks @js324.

- Made `format_as` work with references
  (https://github.com/fmtlib/fmt/pull/3739). Thanks @tchaikov.

- Fixed formatting of invalid UTF-8 with precision
  (https://github.com/fmtlib/fmt/issues/3284).

- Fixed an inconsistency between `fmt::to_string` and `fmt::format`
  (https://github.com/fmtlib/fmt/issues/3684).

- Disallowed unsafe uses of `fmt::styled`
  (https://github.com/fmtlib/fmt/issues/3625):

  ```c++
  auto s = fmt::styled(std::string("dangle"), fmt::emphasis::bold);
  fmt::print("{}\n", s); // compile error
  ```

  Pass `fmt::styled(...)` as a parameter instead.

- Added a null check when formatting a C string with the `s` specifier
  (https://github.com/fmtlib/fmt/issues/3706).

- Disallowed the `c` specifier for `bool`
  (https://github.com/fmtlib/fmt/issues/3726,
  https://github.com/fmtlib/fmt/pull/3734). Thanks @js324.

- Made the default formatting unlocalized in `fmt::ostream_formatter` for
  consistency with the rest of the library
  (https://github.com/fmtlib/fmt/issues/3460).

- Fixed localized formatting in bases other than decimal
  (https://github.com/fmtlib/fmt/issues/3693,
  https://github.com/fmtlib/fmt/pull/3750). Thanks @js324.

- Fixed a performance regression in experimental `fmt::ostream::print`
  (https://github.com/fmtlib/fmt/issues/3674).

- Added synchronization with the underlying output stream when writing to
  the Windows console
  (https://github.com/fmtlib/fmt/pull/3668,
  https://github.com/fmtlib/fmt/issues/3688,
  https://github.com/fmtlib/fmt/pull/3689).
  Thanks @Roman-Koshelev and @dimztimz.

- Changed to only export `format_error` when {fmt} is built as a shared
  library (https://github.com/fmtlib/fmt/issues/3626,
  https://github.com/fmtlib/fmt/pull/3627). Thanks @phprus.

- Made `fmt::streamed` `constexpr`.
  (https://github.com/fmtlib/fmt/pull/3650). Thanks @muggenhor.

- Made `fmt::format_int` `constexpr`
  (https://github.com/fmtlib/fmt/issues/4031,
  https://github.com/fmtlib/fmt/pull/4032). Thanks @dixlorenz.

- Enabled `consteval` on older versions of MSVC
  (https://github.com/fmtlib/fmt/pull/3757). Thanks @phprus.

- Added an option to build without `wchar_t` support on Windows
  (https://github.com/fmtlib/fmt/issues/3631,
  https://github.com/fmtlib/fmt/pull/3636). Thanks @glebm.

- Improved build and CI configuration
  (https://github.com/fmtlib/fmt/pull/3679,
  https://github.com/fmtlib/fmt/issues/3701,
  https://github.com/fmtlib/fmt/pull/3702,
  https://github.com/fmtlib/fmt/pull/3749).
  Thanks @jcar87, @pklima and @tchaikov.

- Fixed various warnings, compilation and test issues
  (https://github.com/fmtlib/fmt/issues/3607,
  https://github.com/fmtlib/fmt/pull/3610,
  https://github.com/fmtlib/fmt/pull/3624,
  https://github.com/fmtlib/fmt/pull/3630,
  https://github.com/fmtlib/fmt/pull/3634,
  https://github.com/fmtlib/fmt/pull/3638,
  https://github.com/fmtlib/fmt/issues/3645,
  https://github.com/fmtlib/fmt/issues/3646,
  https://github.com/fmtlib/fmt/pull/3647,
  https://github.com/fmtlib/fmt/pull/3652,
  https://github.com/fmtlib/fmt/issues/3654,
  https://github.com/fmtlib/fmt/pull/3663,
  https://github.com/fmtlib/fmt/issues/3670,
  https://github.com/fmtlib/fmt/pull/3680,
  https://github.com/fmtlib/fmt/issues/3694,
  https://github.com/fmtlib/fmt/pull/3695,
  https://github.com/fmtlib/fmt/pull/3699,
  https://github.com/fmtlib/fmt/issues/3705,
  https://github.com/fmtlib/fmt/issues/3710,
  https://github.com/fmtlib/fmt/issues/3712,
  https://github.com/fmtlib/fmt/pull/3713,
  https://github.com/fmtlib/fmt/issues/3714,
  https://github.com/fmtlib/fmt/pull/3716,
  https://github.com/fmtlib/fmt/pull/3723,
  https://github.com/fmtlib/fmt/issues/3738,
  https://github.com/fmtlib/fmt/issues/3740,
  https://github.com/fmtlib/fmt/pull/3741,
  https://github.com/fmtlib/fmt/pull/3743,
  https://github.com/fmtlib/fmt/issues/3745,
  https://github.com/fmtlib/fmt/pull/3747,
  https://github.com/fmtlib/fmt/pull/3748,
  https://github.com/fmtlib/fmt/pull/3751,
  https://github.com/fmtlib/fmt/pull/3754,
  https://github.com/fmtlib/fmt/pull/3755,
  https://github.com/fmtlib/fmt/issues/3760,
  https://github.com/fmtlib/fmt/pull/3762,
  https://github.com/fmtlib/fmt/issues/3763,
  https://github.com/fmtlib/fmt/pull/3764,
  https://github.com/fmtlib/fmt/issues/3774,
  https://github.com/fmtlib/fmt/pull/3779).
  Thanks @danakj, @vinayyadav3016, @cyyever, @phprus, @qimiko, @saschasc,
  @gsjaardema, @lazka, @Zhaojun-Liu, @carlsmedstad, @hotwatermorning,
  @cptFracassa, @kuguma, @PeterJohnson, @H1X4Dev, @asantoni, @eltociear,
  @msimberg, @tchaikov, @waywardmonkeys.

- Improved documentation and README
  (https://github.com/fmtlib/fmt/issues/2086,
  https://github.com/fmtlib/fmt/issues/3637,
  https://github.com/fmtlib/fmt/pull/3642,
  https://github.com/fmtlib/fmt/pull/3653,
  https://github.com/fmtlib/fmt/pull/3655,
  https://github.com/fmtlib/fmt/pull/3661,
  https://github.com/fmtlib/fmt/issues/3673,
  https://github.com/fmtlib/fmt/pull/3677,
  https://github.com/fmtlib/fmt/pull/3737,
  https://github.com/fmtlib/fmt/issues/3742,
  https://github.com/fmtlib/fmt/pull/3744).
  Thanks @idzm, @perlun, @joycebrum, @fennewald, @reinhardt1053, @GeorgeLS.

- Updated CI dependencies
  (https://github.com/fmtlib/fmt/pull/3615,
  https://github.com/fmtlib/fmt/pull/3622,
  https://github.com/fmtlib/fmt/pull/3623,
  https://github.com/fmtlib/fmt/pull/3666,
  https://github.com/fmtlib/fmt/pull/3696,
  https://github.com/fmtlib/fmt/pull/3697,
  https://github.com/fmtlib/fmt/pull/3759,
  https://github.com/fmtlib/fmt/pull/3782).

# 10.1.1 - 2023-08-28

- Added formatters for `std::atomic` and `atomic_flag`
  (https://github.com/fmtlib/fmt/pull/3574,
  https://github.com/fmtlib/fmt/pull/3594).
  Thanks @wangzw and @AlexGuteniev.
- Fixed an error about partial specialization of `formatter<string>`
  after instantiation when compiled with gcc and C++20
  (https://github.com/fmtlib/fmt/issues/3584).
- Fixed compilation as a C++20 module with gcc and clang
  (https://github.com/fmtlib/fmt/issues/3587,
  https://github.com/fmtlib/fmt/pull/3597,
  https://github.com/fmtlib/fmt/pull/3605).
  Thanks @MathewBensonCode.
- Made `fmt::to_string` work with types that have `format_as`
  overloads (https://github.com/fmtlib/fmt/pull/3575). Thanks @phprus.
- Made `formatted_size` work with integral format specifiers at
  compile time (https://github.com/fmtlib/fmt/pull/3591).
  Thanks @elbeno.
- Fixed a warning about the `no_unique_address` attribute on clang-cl
  (https://github.com/fmtlib/fmt/pull/3599). Thanks @lukester1975.
- Improved compatibility with the legacy GBK encoding
  (https://github.com/fmtlib/fmt/issues/3598,
  https://github.com/fmtlib/fmt/pull/3599). Thanks @YuHuanTin.
- Added OpenSSF Scorecard analysis
  (https://github.com/fmtlib/fmt/issues/3530,
  https://github.com/fmtlib/fmt/pull/3571). Thanks @joycebrum.
- Updated CI dependencies
  (https://github.com/fmtlib/fmt/pull/3591,
  https://github.com/fmtlib/fmt/pull/3592,
  https://github.com/fmtlib/fmt/pull/3593,
  https://github.com/fmtlib/fmt/pull/3602).

# 10.1.0 - 2023-08-12

- Optimized format string compilation resulting in up to 40% speed up
  in compiled `format_to` and \~4x speed up in compiled `format_to_n`
  on a concatenation benchmark
  (https://github.com/fmtlib/fmt/issues/3133,
  https://github.com/fmtlib/fmt/issues/3484).

  {fmt} 10.0:

      ---------------------------------------------------------
      Benchmark               Time             CPU   Iterations
      ---------------------------------------------------------
      BM_format_to         78.9 ns         78.9 ns      8881746
      BM_format_to_n        568 ns          568 ns      1232089

  {fmt} 10.1:

      ---------------------------------------------------------
      Benchmark               Time             CPU   Iterations
      ---------------------------------------------------------
      BM_format_to         54.9 ns         54.9 ns     12727944
      BM_format_to_n        133 ns          133 ns      5257795

- Optimized storage of an empty allocator in `basic_memory_buffer`
  (https://github.com/fmtlib/fmt/pull/3485). Thanks @Minty-Meeo.

- Added formatters for proxy references to elements of
  `std::vector<bool>` and `std::bitset<N>`
  (https://github.com/fmtlib/fmt/issues/3567,
  https://github.com/fmtlib/fmt/pull/3570). For example
  ([godbolt](https://godbolt.org/z/zYb79Pvn8)):

  ```c++
  #include <vector>
  #include <fmt/std.h>

  int main() {
    auto v = std::vector<bool>{true};
    fmt::print("{}", v[0]);
  }
  ```

  Thanks @phprus and @felix642.

- Fixed an ambiguous formatter specialization for containers that look
  like container adaptors such as `boost::flat_set`
  (https://github.com/fmtlib/fmt/issues/3556,
  https://github.com/fmtlib/fmt/pull/3561). Thanks @5chmidti.

- Fixed compilation when formatting durations not convertible from
  `std::chrono::seconds`
  (https://github.com/fmtlib/fmt/pull/3430). Thanks @patlkli.

- Made the `formatter` specialization for `char*` const-correct
  (https://github.com/fmtlib/fmt/pull/3432). Thanks @timsong-cpp.

- Made `{}` and `{:}` handled consistently during compile-time checks
  (https://github.com/fmtlib/fmt/issues/3526).

- Disallowed passing temporaries to `make_format_args` to improve API
  safety by preventing dangling references.

- Improved the compile-time error for unformattable types
  (https://github.com/fmtlib/fmt/pull/3478). Thanks @BRevzin.

- Improved the floating-point formatter
  (https://github.com/fmtlib/fmt/pull/3448,
  https://github.com/fmtlib/fmt/pull/3450).
  Thanks @florimond-collette.

- Fixed handling of precision for `long double` larger than 64 bits.
  (https://github.com/fmtlib/fmt/issues/3539,
  https://github.com/fmtlib/fmt/issues/3564).

- Made floating-point and chrono tests less platform-dependent
  (https://github.com/fmtlib/fmt/issues/3337,
  https://github.com/fmtlib/fmt/issues/3433,
  https://github.com/fmtlib/fmt/pull/3434). Thanks @phprus.

- Removed the remnants of the Grisu floating-point formatter that has
  been replaced by Dragonbox in earlier versions.

- Added `throw_format_error` to the public API
  (https://github.com/fmtlib/fmt/pull/3551). Thanks @mjerabek.

- Made `FMT_THROW` assert even if assertions are disabled when
  compiling with exceptions disabled
  (https://github.com/fmtlib/fmt/issues/3418,
  https://github.com/fmtlib/fmt/pull/3439). Thanks @BRevzin.

- Made `format_as` and `std::filesystem::path` formatter work with
  exotic code unit types.
  (https://github.com/fmtlib/fmt/pull/3457,
  https://github.com/fmtlib/fmt/pull/3476). Thanks @gix and @hmbj.

- Added support for the `?` format specifier to
  `std::filesystem::path` and made the default unescaped for
  consistency with strings.

- Deprecated the wide stream overload of `printf`.

- Removed unused `basic_printf_parse_context`.

- Improved RTTI detection used when formatting exceptions
  (https://github.com/fmtlib/fmt/pull/3468). Thanks @danakj.

- Improved compatibility with VxWorks7
  (https://github.com/fmtlib/fmt/pull/3467). Thanks @wenshan1.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/3174,
  https://github.com/fmtlib/fmt/issues/3423,
  https://github.com/fmtlib/fmt/pull/3454,
  https://github.com/fmtlib/fmt/issues/3458,
  https://github.com/fmtlib/fmt/pull/3461,
  https://github.com/fmtlib/fmt/issues/3487,
  https://github.com/fmtlib/fmt/pull/3515).
  Thanks @zencatalyst, @rlalik and @mikecrowe.

- Improved build and CI configurations
  (https://github.com/fmtlib/fmt/issues/3449,
  https://github.com/fmtlib/fmt/pull/3451,
  https://github.com/fmtlib/fmt/pull/3452,
  https://github.com/fmtlib/fmt/pull/3453,
  https://github.com/fmtlib/fmt/pull/3459,
  https://github.com/fmtlib/fmt/issues/3481,
  https://github.com/fmtlib/fmt/pull/3486,
  https://github.com/fmtlib/fmt/issues/3489,
  https://github.com/fmtlib/fmt/pull/3496,
  https://github.com/fmtlib/fmt/issues/3517,
  https://github.com/fmtlib/fmt/pull/3523,
  https://github.com/fmtlib/fmt/pull/3563).
  Thanks @joycebrum, @glebm, @phprus, @petrmanek, @setoye and @abouvier.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/3408,
  https://github.com/fmtlib/fmt/issues/3424,
  https://github.com/fmtlib/fmt/issues/3444,
  https://github.com/fmtlib/fmt/pull/3446,
  https://github.com/fmtlib/fmt/pull/3475,
  https://github.com/fmtlib/fmt/pull/3482,
  https://github.com/fmtlib/fmt/issues/3492,
  https://github.com/fmtlib/fmt/pull/3493,
  https://github.com/fmtlib/fmt/pull/3508,
  https://github.com/fmtlib/fmt/issues/3509,
  https://github.com/fmtlib/fmt/issues/3533,
  https://github.com/fmtlib/fmt/pull/3542,
  https://github.com/fmtlib/fmt/issues/3543,
  https://github.com/fmtlib/fmt/issues/3540,
  https://github.com/fmtlib/fmt/pull/3544,
  https://github.com/fmtlib/fmt/issues/3548,
  https://github.com/fmtlib/fmt/pull/3549,
  https://github.com/fmtlib/fmt/pull/3550,
  https://github.com/fmtlib/fmt/pull/3552).
  Thanks @adesitter, @hmbj, @Minty-Meeo, @phprus, @TobiSchluter,
  @kieranclancy, @alexeedm, @jurihock, @Ozomahtli and @razaqq.

# 10.0.0 - 2023-05-09

- Replaced Grisu with a new floating-point formatting algorithm for
  given precision (https://github.com/fmtlib/fmt/issues/3262,
  https://github.com/fmtlib/fmt/issues/2750,
  https://github.com/fmtlib/fmt/pull/3269,
  https://github.com/fmtlib/fmt/pull/3276). The new algorithm
  is based on Dragonbox already used for the shortest representation
  and gives substantial performance improvement:

  ![](https://user-images.githubusercontent.com/33922675/211956670-84891a09-6867-47d9-82fc-3230da7abe0f.png)

  -   Red: new algorithm
  -   Green: new algorithm with `FMT_USE_FULL_CACHE_DRAGONBOX` defined
      to 1
  -   Blue: old algorithm

  Thanks @jk-jeon.

- Replaced `snprintf`-based hex float formatter with an internal
  implementation (https://github.com/fmtlib/fmt/pull/3179,
  https://github.com/fmtlib/fmt/pull/3203). This removes the
  last usage of `s(n)printf` in {fmt}. Thanks @phprus.

- Fixed alignment of floating-point numbers with localization
  (https://github.com/fmtlib/fmt/issues/3263,
  https://github.com/fmtlib/fmt/pull/3272). Thanks @ShawnZhong.

- Made handling of `#` consistent with `std::format`.

- Improved C++20 module support
  (https://github.com/fmtlib/fmt/pull/3134,
  https://github.com/fmtlib/fmt/pull/3254,
  https://github.com/fmtlib/fmt/pull/3386,
  https://github.com/fmtlib/fmt/pull/3387,
  https://github.com/fmtlib/fmt/pull/3388,
  https://github.com/fmtlib/fmt/pull/3392,
  https://github.com/fmtlib/fmt/pull/3397,
  https://github.com/fmtlib/fmt/pull/3399,
  https://github.com/fmtlib/fmt/pull/3400).
  Thanks @laitingsheng, @Orvid and @DanielaE.
  
- Switched to the [modules CMake library](https://github.com/vitaut/modules)
  which allows building {fmt} as a C++20 module with clang:

      CXX=clang++ cmake -DFMT_MODULE=ON .
      make

- Made `format_as` work with any user-defined type and not just enums.
  For example ([godbolt](https://godbolt.org/z/b7rqhq5Kh)):

  ```c++
  #include <fmt/format.h>

  struct floaty_mc_floatface {
    double value;
  };

  auto format_as(floaty_mc_floatface f) { return f.value; }

  int main() {
    fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints "    0.42"
  }
  ```

- Removed deprecated implicit conversions for enums and conversions to
  primitive types for compatibility with `std::format` and to prevent
  potential ODR violations. Use `format_as` instead.

- Added support for fill, align and width to the time point formatter
  (https://github.com/fmtlib/fmt/issues/3237,
  https://github.com/fmtlib/fmt/pull/3260,
  https://github.com/fmtlib/fmt/pull/3275). For example
  ([godbolt](https://godbolt.org/z/rKP6MGz6c)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    // prints "    2023"
    fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
  }
  ```

  Thanks @ShawnZhong.

- Implemented formatting of subseconds
  (https://github.com/fmtlib/fmt/issues/2207,
  https://github.com/fmtlib/fmt/issues/3117,
  https://github.com/fmtlib/fmt/pull/3115,
  https://github.com/fmtlib/fmt/pull/3143,
  https://github.com/fmtlib/fmt/pull/3144,
  https://github.com/fmtlib/fmt/pull/3349). For example
  ([godbolt](https://godbolt.org/z/45738oGEo)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    // prints 01.234567
    fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
  }
  ```

  Thanks @patrickroocks @phprus and @BRevzin.

- Added precision support to `%S`
  (https://github.com/fmtlib/fmt/pull/3148). Thanks @SappyJoy

- Added support for `std::utc_time`
  (https://github.com/fmtlib/fmt/issues/3098,
  https://github.com/fmtlib/fmt/pull/3110). Thanks @patrickroocks.

- Switched formatting of `std::chrono::system_clock` from local time
  to UTC for compatibility with the standard
  (https://github.com/fmtlib/fmt/issues/3199,
  https://github.com/fmtlib/fmt/pull/3230). Thanks @ned14.

- Added support for `%Ez` and `%Oz` to chrono formatters.
  (https://github.com/fmtlib/fmt/issues/3220,
  https://github.com/fmtlib/fmt/pull/3222). Thanks @phprus.

- Improved validation of format specifiers for `std::chrono::duration`
  (https://github.com/fmtlib/fmt/issues/3219,
  https://github.com/fmtlib/fmt/pull/3232). Thanks @ShawnZhong.

- Fixed formatting of time points before the epoch
  (https://github.com/fmtlib/fmt/issues/3117,
  https://github.com/fmtlib/fmt/pull/3261). For example
  ([godbolt](https://godbolt.org/z/f7bcznb3W)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    auto t = std::chrono::system_clock::from_time_t(0) -
             std::chrono::milliseconds(250);
    fmt::print("{:%S}\n", t); // prints 59.750000000
  }
  ```

  Thanks @ShawnZhong.

- Experimental: implemented glibc extension for padding seconds,
  minutes and hours
  (https://github.com/fmtlib/fmt/issues/2959,
  https://github.com/fmtlib/fmt/pull/3271). Thanks @ShawnZhong.

- Added a formatter for `std::exception`
  (https://github.com/fmtlib/fmt/issues/2977,
  https://github.com/fmtlib/fmt/issues/3012,
  https://github.com/fmtlib/fmt/pull/3062,
  https://github.com/fmtlib/fmt/pull/3076,
  https://github.com/fmtlib/fmt/pull/3119). For example
  ([godbolt](https://godbolt.org/z/8xoWGs9e4)):

  ```c++
  #include <fmt/std.h>
  #include <vector>

  int main() {
    try {
      std::vector<bool>().at(0);
    } catch(const std::exception& e) {
      fmt::print("{}", e);
    }
  }
  ```

  prints:

      vector<bool>::_M_range_check: __n (which is 0) >= this->size() (which is 0)

  on libstdc++. Thanks @zach2good and @phprus.

- Moved `std::error_code` formatter from `fmt/os.h` to `fmt/std.h`.
  (https://github.com/fmtlib/fmt/pull/3125). Thanks @phprus.

- Added formatters for standard container adapters:
  `std::priority_queue`, `std::queue` and `std::stack`
  (https://github.com/fmtlib/fmt/issues/3215,
  https://github.com/fmtlib/fmt/pull/3279). For example
  ([godbolt](https://godbolt.org/z/74h1xY9qK)):

  ```c++
  #include <fmt/ranges.h>
  #include <stack>
  #include <vector>

  int main() {
    auto s = std::stack<bool, std::vector<bool>>();
    for (auto b: {true, false, true}) s.push(b);
    fmt::print("{}\n", s); // prints [true, false, true]
  }
  ```

  Thanks @ShawnZhong.

- Added a formatter for `std::optional` to `fmt/std.h`
  (https://github.com/fmtlib/fmt/issues/1367,
  https://github.com/fmtlib/fmt/pull/3303).
  Thanks @tom-huntington.

- Fixed formatting of valueless by exception variants
  (https://github.com/fmtlib/fmt/pull/3347). Thanks @TheOmegaCarrot.

- Made `fmt::ptr` accept `unique_ptr` with a custom deleter
  (https://github.com/fmtlib/fmt/pull/3177). Thanks @hmbj.

- Fixed formatting of noncopyable ranges and nested ranges of chars
  (https://github.com/fmtlib/fmt/pull/3158
  https://github.com/fmtlib/fmt/issues/3286,
  https://github.com/fmtlib/fmt/pull/3290). Thanks @BRevzin.

- Fixed issues with formatting of paths and ranges of paths
  (https://github.com/fmtlib/fmt/issues/3319,
  https://github.com/fmtlib/fmt/pull/3321
  https://github.com/fmtlib/fmt/issues/3322). Thanks @phprus.

- Improved handling of invalid Unicode in paths.

- Enabled compile-time checks on Apple clang 14 and later
  (https://github.com/fmtlib/fmt/pull/3331). Thanks @cloyce.

- Improved compile-time checks of named arguments
  (https://github.com/fmtlib/fmt/issues/3105,
  https://github.com/fmtlib/fmt/pull/3214). Thanks @rbrich.

- Fixed formatting when both alignment and `0` are given
  (https://github.com/fmtlib/fmt/issues/3236,
  https://github.com/fmtlib/fmt/pull/3248). Thanks @ShawnZhong.

- Improved Unicode support in the experimental file API on Windows
  (https://github.com/fmtlib/fmt/issues/3234,
  https://github.com/fmtlib/fmt/pull/3293). Thanks @Fros1er.

- Unified UTF transcoding
  (https://github.com/fmtlib/fmt/pull/3416). Thanks @phprus.

- Added support for UTF-8 digit separators via an experimental locale
  facet (https://github.com/fmtlib/fmt/issues/1861). For
  example ([godbolt](https://godbolt.org/z/f7bcznb3W)):

  ```c++
  auto loc = std::locale(
    std::locale(), new fmt::format_facet<std::locale>("’"));
  auto s = fmt::format(loc, "{:L}", 1000);
  ```

  where `’` is U+2019 used as a digit separator in the de_CH locale.

- Added an overload of `formatted_size` that takes a locale
  (https://github.com/fmtlib/fmt/issues/3084,
  https://github.com/fmtlib/fmt/pull/3087). Thanks @gerboengels.

- Removed the deprecated `FMT_DEPRECATED_OSTREAM`.

- Fixed a UB when using a null `std::string_view` with
  `fmt::to_string` or format string compilation
  (https://github.com/fmtlib/fmt/issues/3241,
  https://github.com/fmtlib/fmt/pull/3244). Thanks @phprus.

- Added `starts_with` to the fallback `string_view` implementation
  (https://github.com/fmtlib/fmt/pull/3080). Thanks @phprus.

- Added `fmt::basic_format_string::get()` for compatibility with
  `basic_format_string`
  (https://github.com/fmtlib/fmt/pull/3111). Thanks @huangqinjin.

- Added `println` for compatibility with C++23
  (https://github.com/fmtlib/fmt/pull/3267). Thanks @ShawnZhong.

- Renamed the `FMT_EXPORT` macro for shared library usage to
  `FMT_LIB_EXPORT`.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/3108,
  https://github.com/fmtlib/fmt/issues/3169,
  https://github.com/fmtlib/fmt/pull/3243).
  https://github.com/fmtlib/fmt/pull/3404,
  https://github.com/fmtlib/fmt/pull/4002).
  Thanks @Cleroth, @Vertexwahn and @yujincheng08.

- Improved build configuration and tests
  (https://github.com/fmtlib/fmt/pull/3118,
  https://github.com/fmtlib/fmt/pull/3120,
  https://github.com/fmtlib/fmt/pull/3188,
  https://github.com/fmtlib/fmt/issues/3189,
  https://github.com/fmtlib/fmt/pull/3198,
  https://github.com/fmtlib/fmt/pull/3205,
  https://github.com/fmtlib/fmt/pull/3207,
  https://github.com/fmtlib/fmt/pull/3210,
  https://github.com/fmtlib/fmt/pull/3240,
  https://github.com/fmtlib/fmt/pull/3256,
  https://github.com/fmtlib/fmt/pull/3264,
  https://github.com/fmtlib/fmt/issues/3299,
  https://github.com/fmtlib/fmt/pull/3302,
  https://github.com/fmtlib/fmt/pull/3312,
  https://github.com/fmtlib/fmt/issues/3317,
  https://github.com/fmtlib/fmt/pull/3328,
  https://github.com/fmtlib/fmt/pull/3333,
  https://github.com/fmtlib/fmt/pull/3369,
  https://github.com/fmtlib/fmt/issues/3373,
  https://github.com/fmtlib/fmt/pull/3395,
  https://github.com/fmtlib/fmt/pull/3406,
  https://github.com/fmtlib/fmt/pull/3411).
  Thanks @dimztimz, @phprus, @DavidKorczynski, @ChrisThrasher,
  @FrancoisCarouge, @kennyweiss, @luzpaz, @codeinred, @Mixaill, @joycebrum,
  @kevinhwang and @Vertexwahn.

- Fixed a regression in handling empty format specifiers after a colon
  (`{:}`) (https://github.com/fmtlib/fmt/pull/3086). Thanks @oxidase.

- Worked around a broken implementation of
  `std::is_constant_evaluated` in some versions of libstdc++ on clang
  (https://github.com/fmtlib/fmt/issues/3247,
  https://github.com/fmtlib/fmt/pull/3281). Thanks @phprus.

- Fixed formatting of volatile variables
  (https://github.com/fmtlib/fmt/pull/3068).

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/pull/3057,
  https://github.com/fmtlib/fmt/pull/3066,
  https://github.com/fmtlib/fmt/pull/3072,
  https://github.com/fmtlib/fmt/pull/3082,
  https://github.com/fmtlib/fmt/pull/3091,
  https://github.com/fmtlib/fmt/issues/3092,
  https://github.com/fmtlib/fmt/pull/3093,
  https://github.com/fmtlib/fmt/pull/3095,
  https://github.com/fmtlib/fmt/issues/3096,
  https://github.com/fmtlib/fmt/pull/3097,
  https://github.com/fmtlib/fmt/issues/3128,
  https://github.com/fmtlib/fmt/pull/3129,
  https://github.com/fmtlib/fmt/pull/3137,
  https://github.com/fmtlib/fmt/pull/3139,
  https://github.com/fmtlib/fmt/issues/3140,
  https://github.com/fmtlib/fmt/pull/3142,
  https://github.com/fmtlib/fmt/issues/3149,
  https://github.com/fmtlib/fmt/pull/3150,
  https://github.com/fmtlib/fmt/issues/3154,
  https://github.com/fmtlib/fmt/issues/3163,
  https://github.com/fmtlib/fmt/issues/3178,
  https://github.com/fmtlib/fmt/pull/3184,
  https://github.com/fmtlib/fmt/pull/3196,
  https://github.com/fmtlib/fmt/issues/3204,
  https://github.com/fmtlib/fmt/pull/3206,
  https://github.com/fmtlib/fmt/pull/3208,
  https://github.com/fmtlib/fmt/issues/3213,
  https://github.com/fmtlib/fmt/pull/3216,
  https://github.com/fmtlib/fmt/issues/3224,
  https://github.com/fmtlib/fmt/issues/3226,
  https://github.com/fmtlib/fmt/issues/3228,
  https://github.com/fmtlib/fmt/pull/3229,
  https://github.com/fmtlib/fmt/pull/3259,
  https://github.com/fmtlib/fmt/issues/3274,
  https://github.com/fmtlib/fmt/issues/3287,
  https://github.com/fmtlib/fmt/pull/3288,
  https://github.com/fmtlib/fmt/issues/3292,
  https://github.com/fmtlib/fmt/pull/3295,
  https://github.com/fmtlib/fmt/pull/3296,
  https://github.com/fmtlib/fmt/issues/3298,
  https://github.com/fmtlib/fmt/issues/3325,
  https://github.com/fmtlib/fmt/pull/3326,
  https://github.com/fmtlib/fmt/issues/3334,
  https://github.com/fmtlib/fmt/issues/3342,
  https://github.com/fmtlib/fmt/pull/3343,
  https://github.com/fmtlib/fmt/issues/3351,
  https://github.com/fmtlib/fmt/pull/3352,
  https://github.com/fmtlib/fmt/pull/3362,
  https://github.com/fmtlib/fmt/issues/3365,
  https://github.com/fmtlib/fmt/pull/3366,
  https://github.com/fmtlib/fmt/pull/3374,
  https://github.com/fmtlib/fmt/issues/3377,
  https://github.com/fmtlib/fmt/pull/3378,
  https://github.com/fmtlib/fmt/issues/3381,
  https://github.com/fmtlib/fmt/pull/3398,
  https://github.com/fmtlib/fmt/pull/3413,
  https://github.com/fmtlib/fmt/issues/3415).
  Thanks @phprus, @gsjaardema, @NewbieOrange, @EngineLessCC, @asmaloney,
  @HazardyKnusperkeks, @sergiud, @Youw, @thesmurph, @czudziakm,
  @Roman-Koshelev, @chronoxor, @ShawnZhong, @russelltg, @glebm, @tmartin-gh,
  @Zhaojun-Liu, @louiswins and @mogemimi.

# 9.1.0 - 2022-08-27

- `fmt::formatted_size` now works at compile time
  (https://github.com/fmtlib/fmt/pull/3026). For example
  ([godbolt](https://godbolt.org/z/1MW5rMdf8)):

  ```c++
  #include <fmt/compile.h>

  int main() {
    using namespace fmt::literals;
    constexpr size_t n = fmt::formatted_size("{}"_cf, 42);
    fmt::print("{}\n", n); // prints 2
  }
  ```

  Thanks @marksantaniello.

- Fixed handling of invalid UTF-8
  (https://github.com/fmtlib/fmt/pull/3038,
  https://github.com/fmtlib/fmt/pull/3044,
  https://github.com/fmtlib/fmt/pull/3056).
  Thanks @phprus and @skeeto.

- Improved Unicode support in `ostream` overloads of `print`
  (https://github.com/fmtlib/fmt/pull/2994,
  https://github.com/fmtlib/fmt/pull/3001,
  https://github.com/fmtlib/fmt/pull/3025). Thanks @dimztimz.

- Fixed handling of the sign specifier in localized formatting on
  systems with 32-bit `wchar_t`
  (https://github.com/fmtlib/fmt/issues/3041).

- Added support for wide streams to `fmt::streamed`
  (https://github.com/fmtlib/fmt/pull/2994). Thanks @phprus.

- Added the `n` specifier that disables the output of delimiters when
  formatting ranges (https://github.com/fmtlib/fmt/pull/2981,
  https://github.com/fmtlib/fmt/pull/2983). For example
  ([godbolt](https://godbolt.org/z/roKqGdj8c)):

  ```c++
  #include <fmt/ranges.h>
  #include <vector>

  int main() {
    auto v = std::vector{1, 2, 3};
    fmt::print("{:n}\n", v); // prints 1, 2, 3
  }
  ```

  Thanks @BRevzin.

- Worked around problematic `std::string_view` constructors introduced
  in C++23 (https://github.com/fmtlib/fmt/issues/3030,
  https://github.com/fmtlib/fmt/issues/3050). Thanks @strega-nil-ms.

- Improve handling (exclusion) of recursive ranges
  (https://github.com/fmtlib/fmt/issues/2968,
  https://github.com/fmtlib/fmt/pull/2974). Thanks @Dani-Hub.

- Improved error reporting in format string compilation
  (https://github.com/fmtlib/fmt/issues/3055).

- Improved the implementation of
  [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
  used for the default floating-point formatting
  (https://github.com/fmtlib/fmt/pull/2984). Thanks @jk-jeon.

- Fixed issues with floating-point formatting on exotic platforms.

- Improved the implementation of chrono formatting
  (https://github.com/fmtlib/fmt/pull/3010). Thanks @phprus.

- Improved documentation
  (https://github.com/fmtlib/fmt/pull/2966,
  https://github.com/fmtlib/fmt/pull/3009,
  https://github.com/fmtlib/fmt/issues/3020,
  https://github.com/fmtlib/fmt/pull/3037).
  Thanks @mwinterb, @jcelerier and @remiburtin.

- Improved build configuration
  (https://github.com/fmtlib/fmt/pull/2991,
  https://github.com/fmtlib/fmt/pull/2995,
  https://github.com/fmtlib/fmt/issues/3004,
  https://github.com/fmtlib/fmt/pull/3007,
  https://github.com/fmtlib/fmt/pull/3040).
  Thanks @dimztimz and @hwhsu1231.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/2969,
  https://github.com/fmtlib/fmt/pull/2971,
  https://github.com/fmtlib/fmt/issues/2975,
  https://github.com/fmtlib/fmt/pull/2982,
  https://github.com/fmtlib/fmt/pull/2985,
  https://github.com/fmtlib/fmt/issues/2988,
  https://github.com/fmtlib/fmt/issues/2989,
  https://github.com/fmtlib/fmt/issues/3000,
  https://github.com/fmtlib/fmt/issues/3006,
  https://github.com/fmtlib/fmt/issues/3014,
  https://github.com/fmtlib/fmt/issues/3015,
  https://github.com/fmtlib/fmt/pull/3021,
  https://github.com/fmtlib/fmt/issues/3023,
  https://github.com/fmtlib/fmt/pull/3024,
  https://github.com/fmtlib/fmt/pull/3029,
  https://github.com/fmtlib/fmt/pull/3043,
  https://github.com/fmtlib/fmt/issues/3052,
  https://github.com/fmtlib/fmt/pull/3053,
  https://github.com/fmtlib/fmt/pull/3054).
  Thanks @h-friederich, @dimztimz, @olupton, @bernhardmgruber and @phprus.

# 9.0.0 - 2022-07-04

- Switched to the internal floating point formatter for all decimal
  presentation formats. In particular this results in consistent
  rounding on all platforms and removing the `s[n]printf` fallback for
  decimal FP formatting.

- Compile-time floating point formatting no longer requires the
  header-only mode. For example
  ([godbolt](https://godbolt.org/z/G37PTeG3b)):

  ```c++
  #include <array>
  #include <fmt/compile.h>

  consteval auto compile_time_dtoa(double value) -> std::array<char, 10> {
    auto result = std::array<char, 10>();
    fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
    return result;
  }

  constexpr auto answer = compile_time_dtoa(0.42);
  ```

  works with the default settings.

- Improved the implementation of
  [Dragonbox](https://github.com/jk-jeon/dragonbox), the algorithm
  used for the default floating-point formatting
  (https://github.com/fmtlib/fmt/pull/2713,
  https://github.com/fmtlib/fmt/pull/2750). Thanks @jk-jeon.

- Made `fmt::to_string` work with `__float128`. This uses the internal
  FP formatter and works even on system without `__float128` support
  in `[s]printf`.

- Disabled automatic `std::ostream` insertion operator (`operator<<`)
  discovery when `fmt/ostream.h` is included to prevent ODR
  violations. You can get the old behavior by defining
  `FMT_DEPRECATED_OSTREAM` but this will be removed in the next major
  release. Use `fmt::streamed` or `fmt::ostream_formatter` to enable
  formatting via `std::ostream` instead.

- Added `fmt::ostream_formatter` that can be used to write `formatter`
  specializations that perform formatting via `std::ostream`. For
  example ([godbolt](https://godbolt.org/z/5sEc5qMsf)):

  ```c++
  #include <fmt/ostream.h>

  struct date {
    int year, month, day;

    friend std::ostream& operator<<(std::ostream& os, const date& d) {
      return os << d.year << '-' << d.month << '-' << d.day;
    }
  };

  template <> struct fmt::formatter<date> : ostream_formatter {};

  std::string s = fmt::format("The date is {}", date{2012, 12, 9});
  // s == "The date is 2012-12-9"
  ```

- Added the `fmt::streamed` function that takes an object and formats
  it via `std::ostream`. For example
  ([godbolt](https://godbolt.org/z/5G3346G1f)):

  ```c++
  #include <thread>
  #include <fmt/ostream.h>

  int main() {
    fmt::print("Current thread id: {}\n",
               fmt::streamed(std::this_thread::get_id()));
  }
  ```

  Note that `fmt/std.h` provides a `formatter` specialization for
  `std::thread::id` so you don\'t need to format it via
  `std::ostream`.

- Deprecated implicit conversions of unscoped enums to integers for
  consistency with scoped enums.

- Added an argument-dependent lookup based `format_as` extension API
  to simplify formatting of enums.

- Added experimental `std::variant` formatting support
  (https://github.com/fmtlib/fmt/pull/2941). For example
  ([godbolt](https://godbolt.org/z/KG9z6cq68)):

  ```c++
  #include <variant>
  #include <fmt/std.h>

  int main() {
    auto v = std::variant<int, std::string>(42);
    fmt::print("{}\n", v);
  }
  ```

  prints:

      variant(42)

  Thanks @jehelset.

- Added experimental `std::filesystem::path` formatting support
  (https://github.com/fmtlib/fmt/issues/2865,
  https://github.com/fmtlib/fmt/pull/2902,
  https://github.com/fmtlib/fmt/issues/2917,
  https://github.com/fmtlib/fmt/pull/2918). For example
  ([godbolt](https://godbolt.org/z/o44dMexEb)):

  ```c++
  #include <filesystem>
  #include <fmt/std.h>

  int main() {
    fmt::print("There is no place like {}.", std::filesystem::path("/home"));
  }
  ```

  prints:

      There is no place like "/home".

  Thanks @phprus.

- Added a `std::thread::id` formatter to `fmt/std.h`. For example
  ([godbolt](https://godbolt.org/z/j1azbYf3E)):

  ```c++
  #include <thread>
  #include <fmt/std.h>

  int main() {
    fmt::print("Current thread id: {}\n", std::this_thread::get_id());
  }
  ```

- Added `fmt::styled` that applies a text style to an individual
  argument (https://github.com/fmtlib/fmt/pull/2793). For
  example ([godbolt](https://godbolt.org/z/vWGW7v5M6)):

  ```c++
  #include <fmt/chrono.h>
  #include <fmt/color.h>

  int main() {
    auto now = std::chrono::system_clock::now();
    fmt::print(
      "[{}] {}: {}\n",
      fmt::styled(now, fmt::emphasis::bold),
      fmt::styled("error", fg(fmt::color::red)),
      "something went wrong");
  }
  ```

  prints

  ![](https://user-images.githubusercontent.com/576385/175071215-12809244-dab0-4005-96d8-7cd911c964d5.png)

  Thanks @rbrugo.

- Made `fmt::print` overload for text styles correctly handle UTF-8
  (https://github.com/fmtlib/fmt/issues/2681,
  https://github.com/fmtlib/fmt/pull/2701). Thanks @AlexGuteniev.

- Fixed Unicode handling when writing to an ostream.

- Added support for nested specifiers to range formatting
  (https://github.com/fmtlib/fmt/pull/2673). For example
  ([godbolt](https://godbolt.org/z/xd3Gj38cf)):

  ```c++
  #include <vector>
  #include <fmt/ranges.h>

  int main() {
    fmt::print("{::#x}\n", std::vector{10, 20, 30});
  }
  ```

  prints `[0xa, 0x14, 0x1e]`.

  Thanks @BRevzin.

- Implemented escaping of wide strings in ranges
  (https://github.com/fmtlib/fmt/pull/2904). Thanks @phprus.

- Added support for ranges with `begin` / `end` found via the
  argument-dependent lookup
  (https://github.com/fmtlib/fmt/pull/2807). Thanks @rbrugo.

- Fixed formatting of certain kinds of ranges of ranges
  (https://github.com/fmtlib/fmt/pull/2787). Thanks @BRevzin.

- Fixed handling of maps with element types other than `std::pair`
  (https://github.com/fmtlib/fmt/pull/2944). Thanks @BrukerJWD.

- Made tuple formatter enabled only if elements are formattable
  (https://github.com/fmtlib/fmt/issues/2939,
  https://github.com/fmtlib/fmt/pull/2940). Thanks @jehelset.

- Made `fmt::join` compatible with format string compilation
  (https://github.com/fmtlib/fmt/issues/2719,
  https://github.com/fmtlib/fmt/pull/2720). Thanks @phprus.

- Made compile-time checks work with named arguments of custom types
  and `std::ostream` `print` overloads
  (https://github.com/fmtlib/fmt/issues/2816,
  https://github.com/fmtlib/fmt/issues/2817,
  https://github.com/fmtlib/fmt/pull/2819). Thanks @timsong-cpp.

- Removed `make_args_checked` because it is no longer needed for
  compile-time checks
  (https://github.com/fmtlib/fmt/pull/2760). Thanks @phprus.

- Removed the following deprecated APIs: `_format`, `arg_join`, the
  `format_to` overload that takes a memory buffer, `[v]fprintf` that
  takes an `ostream`.

- Removed the deprecated implicit conversion of `[const] signed char*`
  and `[const] unsigned char*` to C strings.

- Removed the deprecated `fmt/locale.h`.

- Replaced the deprecated `fileno()` with `descriptor()` in
  `buffered_file`.

- Moved `to_string_view` to the `detail` namespace since it\'s an
  implementation detail.

- Made access mode of a created file consistent with `fopen` by
  setting `S_IWGRP` and `S_IWOTH`
  (https://github.com/fmtlib/fmt/pull/2733). Thanks @arogge.

- Removed a redundant buffer resize when formatting to `std::ostream`
  (https://github.com/fmtlib/fmt/issues/2842,
  https://github.com/fmtlib/fmt/pull/2843). Thanks @jcelerier.

- Made precision computation for strings consistent with width
  (https://github.com/fmtlib/fmt/issues/2888).

- Fixed handling of locale separators in floating point formatting
  (https://github.com/fmtlib/fmt/issues/2830).

- Made sign specifiers work with `__int128_t`
  (https://github.com/fmtlib/fmt/issues/2773).

- Improved support for systems such as CHERI with extra data stored in
  pointers (https://github.com/fmtlib/fmt/pull/2932).
  Thanks @davidchisnall.

- Improved documentation
  (https://github.com/fmtlib/fmt/pull/2706,
  https://github.com/fmtlib/fmt/pull/2712,
  https://github.com/fmtlib/fmt/pull/2789,
  https://github.com/fmtlib/fmt/pull/2803,
  https://github.com/fmtlib/fmt/pull/2805,
  https://github.com/fmtlib/fmt/pull/2815,
  https://github.com/fmtlib/fmt/pull/2924).
  Thanks @BRevzin, @Pokechu22, @setoye, @rtobar, @rbrugo, @anoonD and
  @leha-bot.

- Improved build configuration
  (https://github.com/fmtlib/fmt/pull/2766,
  https://github.com/fmtlib/fmt/pull/2772,
  https://github.com/fmtlib/fmt/pull/2836,
  https://github.com/fmtlib/fmt/pull/2852,
  https://github.com/fmtlib/fmt/pull/2907,
  https://github.com/fmtlib/fmt/pull/2913,
  https://github.com/fmtlib/fmt/pull/2914).
  Thanks @kambala-decapitator, @mattiasljungstrom, @kieselnb, @nathannaveen
  and @Vertexwahn.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/2408,
  https://github.com/fmtlib/fmt/issues/2507,
  https://github.com/fmtlib/fmt/issues/2697,
  https://github.com/fmtlib/fmt/issues/2715,
  https://github.com/fmtlib/fmt/issues/2717,
  https://github.com/fmtlib/fmt/pull/2722,
  https://github.com/fmtlib/fmt/pull/2724,
  https://github.com/fmtlib/fmt/pull/2725,
  https://github.com/fmtlib/fmt/issues/2726,
  https://github.com/fmtlib/fmt/pull/2728,
  https://github.com/fmtlib/fmt/pull/2732,
  https://github.com/fmtlib/fmt/issues/2738,
  https://github.com/fmtlib/fmt/pull/2742,
  https://github.com/fmtlib/fmt/issues/2744,
  https://github.com/fmtlib/fmt/issues/2745,
  https://github.com/fmtlib/fmt/issues/2746,
  https://github.com/fmtlib/fmt/issues/2754,
  https://github.com/fmtlib/fmt/pull/2755,
  https://github.com/fmtlib/fmt/issues/2757,
  https://github.com/fmtlib/fmt/pull/2758,
  https://github.com/fmtlib/fmt/issues/2761,
  https://github.com/fmtlib/fmt/pull/2762,
  https://github.com/fmtlib/fmt/issues/2763,
  https://github.com/fmtlib/fmt/pull/2765,
  https://github.com/fmtlib/fmt/issues/2769,
  https://github.com/fmtlib/fmt/pull/2770,
  https://github.com/fmtlib/fmt/issues/2771,
  https://github.com/fmtlib/fmt/issues/2777,
  https://github.com/fmtlib/fmt/pull/2779,
  https://github.com/fmtlib/fmt/pull/2782,
  https://github.com/fmtlib/fmt/pull/2783,
  https://github.com/fmtlib/fmt/issues/2794,
  https://github.com/fmtlib/fmt/issues/2796,
  https://github.com/fmtlib/fmt/pull/2797,
  https://github.com/fmtlib/fmt/pull/2801,
  https://github.com/fmtlib/fmt/pull/2802,
  https://github.com/fmtlib/fmt/issues/2808,
  https://github.com/fmtlib/fmt/issues/2818,
  https://github.com/fmtlib/fmt/pull/2819,
  https://github.com/fmtlib/fmt/issues/2829,
  https://github.com/fmtlib/fmt/issues/2835,
  https://github.com/fmtlib/fmt/issues/2848,
  https://github.com/fmtlib/fmt/issues/2860,
  https://github.com/fmtlib/fmt/pull/2861,
  https://github.com/fmtlib/fmt/pull/2882,
  https://github.com/fmtlib/fmt/issues/2886,
  https://github.com/fmtlib/fmt/issues/2891,
  https://github.com/fmtlib/fmt/pull/2892,
  https://github.com/fmtlib/fmt/issues/2895,
  https://github.com/fmtlib/fmt/issues/2896,
  https://github.com/fmtlib/fmt/pull/2903,
  https://github.com/fmtlib/fmt/issues/2906,
  https://github.com/fmtlib/fmt/issues/2908,
  https://github.com/fmtlib/fmt/pull/2909,
  https://github.com/fmtlib/fmt/issues/2920,
  https://github.com/fmtlib/fmt/pull/2922,
  https://github.com/fmtlib/fmt/pull/2927,
  https://github.com/fmtlib/fmt/pull/2929,
  https://github.com/fmtlib/fmt/issues/2936,
  https://github.com/fmtlib/fmt/pull/2937,
  https://github.com/fmtlib/fmt/pull/2938,
  https://github.com/fmtlib/fmt/pull/2951,
  https://github.com/fmtlib/fmt/issues/2954,
  https://github.com/fmtlib/fmt/pull/2957,
  https://github.com/fmtlib/fmt/issues/2958,
  https://github.com/fmtlib/fmt/pull/2960).
  Thanks @matrackif @Tobi823, @ivan-volnov, @VasiliPupkin256,
  @federico-busato, @barcharcraz, @jk-jeon, @HazardyKnusperkeks, @dalboris,
  @seanm, @gsjaardema, @timsong-cpp, @seanm, @frithrah, @chronoxor, @Agga,
  @madmaxoft, @JurajX, @phprus and @Dani-Hub.

# 8.1.1 - 2022-01-06

- Restored ABI compatibility with version 8.0.x
  (https://github.com/fmtlib/fmt/issues/2695,
  https://github.com/fmtlib/fmt/pull/2696). Thanks @saraedum.
- Fixed chrono formatting on big endian systems
  (https://github.com/fmtlib/fmt/issues/2698,
  https://github.com/fmtlib/fmt/pull/2699).
  Thanks @phprus and @xvitaly.
- Fixed a linkage error with mingw
  (https://github.com/fmtlib/fmt/issues/2691,
  https://github.com/fmtlib/fmt/pull/2692). Thanks @rbberger.

# 8.1.0 - 2022-01-02

- Optimized chrono formatting
  (https://github.com/fmtlib/fmt/pull/2500,
  https://github.com/fmtlib/fmt/pull/2537,
  https://github.com/fmtlib/fmt/issues/2541,
  https://github.com/fmtlib/fmt/pull/2544,
  https://github.com/fmtlib/fmt/pull/2550,
  https://github.com/fmtlib/fmt/pull/2551,
  https://github.com/fmtlib/fmt/pull/2576,
  https://github.com/fmtlib/fmt/issues/2577,
  https://github.com/fmtlib/fmt/pull/2586,
  https://github.com/fmtlib/fmt/pull/2591,
  https://github.com/fmtlib/fmt/pull/2594,
  https://github.com/fmtlib/fmt/pull/2602,
  https://github.com/fmtlib/fmt/pull/2617,
  https://github.com/fmtlib/fmt/issues/2628,
  https://github.com/fmtlib/fmt/pull/2633,
  https://github.com/fmtlib/fmt/issues/2670,
  https://github.com/fmtlib/fmt/pull/2671).

  Processing of some specifiers such as `%z` and `%Y` is now up to
  10-20 times faster, for example on GCC 11 with libstdc++:

      ----------------------------------------------------------------------------
      Benchmark                                  Before             After
      ----------------------------------------------------------------------------
      FMTFormatter_z                             261 ns             26.3 ns
      FMTFormatterCompile_z                      246 ns             11.6 ns
      FMTFormatter_Y                             263 ns             26.1 ns
      FMTFormatterCompile_Y                      244 ns             10.5 ns
      ----------------------------------------------------------------------------

  Thanks @phprus and @toughengineer.

- Implemented subsecond formatting for chrono durations
  (https://github.com/fmtlib/fmt/pull/2623). For example
  ([godbolt](https://godbolt.org/z/es7vWTETe)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    fmt::print("{:%S}", std::chrono::milliseconds(1234));
  }
  ```

  prints \"01.234\".

  Thanks @matrackif.

- Fixed handling of precision 0 when formatting chrono durations
  (https://github.com/fmtlib/fmt/issues/2587,
  https://github.com/fmtlib/fmt/pull/2588). Thanks @lukester1975.

- Fixed an overflow on invalid inputs in the `tm` formatter
  (https://github.com/fmtlib/fmt/pull/2564). Thanks @phprus.

- Added `fmt::group_digits` that formats integers with a non-localized
  digit separator (comma) for groups of three digits. For example
  ([godbolt](https://godbolt.org/z/TxGxG9Poq)):

  ```c++
  #include <fmt/format.h>

  int main() {
    fmt::print("{} dollars", fmt::group_digits(1000000));
  }
  ```

  prints \"1,000,000 dollars\".

- Added support for faint, conceal, reverse and blink text styles
  (https://github.com/fmtlib/fmt/pull/2394):

  <https://user-images.githubusercontent.com/576385/147710227-c68f5317-f8fa-42c3-9123-7c4ba3c398cb.mp4>

  Thanks @benit8 and @data-man.

- Added experimental support for compile-time floating point
  formatting (https://github.com/fmtlib/fmt/pull/2426,
  https://github.com/fmtlib/fmt/pull/2470). It is currently
  limited to the header-only mode. Thanks @alexezeder.

- Added UDL-based named argument support to compile-time format string
  checks (https://github.com/fmtlib/fmt/issues/2640,
  https://github.com/fmtlib/fmt/pull/2649). For example
  ([godbolt](https://godbolt.org/z/ohGbbvonv)):

  ```c++
  #include <fmt/format.h>

  int main() {
    using namespace fmt::literals;
    fmt::print("{answer:s}", "answer"_a=42);
  }
  ```

  gives a compile-time error on compilers with C++20 `consteval` and
  non-type template parameter support (gcc 10+) because `s` is not a
  valid format specifier for an integer.

  Thanks @alexezeder.

- Implemented escaping of string range elements. For example
  ([godbolt](https://godbolt.org/z/rKvM1vKf3)):

  ```c++
  #include <fmt/ranges.h>
  #include <vector>

  int main() {
    fmt::print("{}", std::vector<std::string>{"\naan"});
  }
  ```

  is now printed as:

      ["\naan"]

  instead of:

      ["
      aan"]

- Added an experimental `?` specifier for escaping strings.
  (https://github.com/fmtlib/fmt/pull/2674). Thanks @BRevzin.

- Switched to JSON-like representation of maps and sets for
  consistency with Python\'s `str.format`. For example
  ([godbolt](https://godbolt.org/z/seKjoY9W5)):

  ```c++
  #include <fmt/ranges.h>
  #include <map>

  int main() {
    fmt::print("{}", std::map<std::string, int>{{"answer", 42}});
  }
  ```

  is now printed as:

      {"answer": 42}

- Extended `fmt::join` to support C++20-only ranges
  (https://github.com/fmtlib/fmt/pull/2549). Thanks @BRevzin.

- Optimized handling of non-const-iterable ranges and implemented
  initial support for non-const-formattable types.

- Disabled implicit conversions of scoped enums to integers that was
  accidentally introduced in earlier versions
  (https://github.com/fmtlib/fmt/pull/1841).

- Deprecated implicit conversion of `[const] signed char*` and
  `[const] unsigned char*` to C strings.

- Deprecated `_format`, a legacy UDL-based format API
  (https://github.com/fmtlib/fmt/pull/2646). Thanks @alexezeder.

- Marked `format`, `formatted_size` and `to_string` as `[[nodiscard]]`
  (https://github.com/fmtlib/fmt/pull/2612). @0x8000-0000.

- Added missing diagnostic when trying to format function and member
  pointers as well as objects convertible to pointers which is
  explicitly disallowed
  (https://github.com/fmtlib/fmt/issues/2598,
  https://github.com/fmtlib/fmt/pull/2609,
  https://github.com/fmtlib/fmt/pull/2610). Thanks @AlexGuteniev.

- Optimized writing to a contiguous buffer with `format_to_n`
  (https://github.com/fmtlib/fmt/pull/2489). Thanks @Roman-Koshelev.

- Optimized writing to non-`char` buffers
  (https://github.com/fmtlib/fmt/pull/2477). Thanks @Roman-Koshelev.

- Decimal point is now localized when using the `L` specifier.

- Improved floating point formatter implementation
  (https://github.com/fmtlib/fmt/pull/2498,
  https://github.com/fmtlib/fmt/pull/2499). Thanks @Roman-Koshelev.

- Fixed handling of very large precision in fixed format
  (https://github.com/fmtlib/fmt/pull/2616).

- Made a table of cached powers used in FP formatting static
  (https://github.com/fmtlib/fmt/pull/2509). Thanks @jk-jeon.

- Resolved a lookup ambiguity with C++20 format-related functions due
  to ADL (https://github.com/fmtlib/fmt/issues/2639,
  https://github.com/fmtlib/fmt/pull/2641). Thanks @mkurdej.

- Removed unnecessary inline namespace qualification
  (https://github.com/fmtlib/fmt/issues/2642,
  https://github.com/fmtlib/fmt/pull/2643). Thanks @mkurdej.

- Implemented argument forwarding in `format_to_n`
  (https://github.com/fmtlib/fmt/issues/2462,
  https://github.com/fmtlib/fmt/pull/2463). Thanks @owent.

- Fixed handling of implicit conversions in `fmt::to_string` and
  format string compilation
  (https://github.com/fmtlib/fmt/issues/2565).

- Changed the default access mode of files created by
  `fmt::output_file` to `-rw-r--r--` for consistency with `fopen`
  (https://github.com/fmtlib/fmt/issues/2530).

- Make `fmt::ostream::flush` public
  (https://github.com/fmtlib/fmt/issues/2435).

- Improved C++14/17 attribute detection
  (https://github.com/fmtlib/fmt/pull/2615). Thanks @AlexGuteniev.

- Improved `consteval` detection for MSVC
  (https://github.com/fmtlib/fmt/pull/2559). Thanks @DanielaE.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/2406,
  https://github.com/fmtlib/fmt/pull/2446,
  https://github.com/fmtlib/fmt/issues/2493,
  https://github.com/fmtlib/fmt/issues/2513,
  https://github.com/fmtlib/fmt/pull/2515,
  https://github.com/fmtlib/fmt/issues/2522,
  https://github.com/fmtlib/fmt/pull/2562,
  https://github.com/fmtlib/fmt/pull/2575,
  https://github.com/fmtlib/fmt/pull/2606,
  https://github.com/fmtlib/fmt/pull/2620,
  https://github.com/fmtlib/fmt/issues/2676).
  Thanks @sobolevn, @UnePierre, @zhsj, @phprus, @ericcurtin and @Lounarok.

- Improved fuzzers and added a fuzzer for chrono timepoint formatting
  (https://github.com/fmtlib/fmt/pull/2461,
  https://github.com/fmtlib/fmt/pull/2469). @pauldreik,

- Added the `FMT_SYSTEM_HEADERS` CMake option setting which marks
  {fmt}\'s headers as system. It can be used to suppress warnings
  (https://github.com/fmtlib/fmt/issues/2644,
  https://github.com/fmtlib/fmt/pull/2651). Thanks @alexezeder.

- Added the Bazel build system support
  (https://github.com/fmtlib/fmt/pull/2505,
  https://github.com/fmtlib/fmt/pull/2516). Thanks @Vertexwahn.

- Improved build configuration and tests
  (https://github.com/fmtlib/fmt/issues/2437,
  https://github.com/fmtlib/fmt/pull/2558,
  https://github.com/fmtlib/fmt/pull/2648,
  https://github.com/fmtlib/fmt/pull/2650,
  https://github.com/fmtlib/fmt/pull/2663,
  https://github.com/fmtlib/fmt/pull/2677).
  Thanks @DanielaE, @alexezeder and @phprus.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/pull/2353,
  https://github.com/fmtlib/fmt/pull/2356,
  https://github.com/fmtlib/fmt/pull/2399,
  https://github.com/fmtlib/fmt/issues/2408,
  https://github.com/fmtlib/fmt/pull/2414,
  https://github.com/fmtlib/fmt/pull/2427,
  https://github.com/fmtlib/fmt/pull/2432,
  https://github.com/fmtlib/fmt/pull/2442,
  https://github.com/fmtlib/fmt/pull/2434,
  https://github.com/fmtlib/fmt/issues/2439,
  https://github.com/fmtlib/fmt/pull/2447,
  https://github.com/fmtlib/fmt/pull/2450,
  https://github.com/fmtlib/fmt/issues/2455,
  https://github.com/fmtlib/fmt/issues/2465,
  https://github.com/fmtlib/fmt/issues/2472,
  https://github.com/fmtlib/fmt/issues/2474,
  https://github.com/fmtlib/fmt/pull/2476,
  https://github.com/fmtlib/fmt/issues/2478,
  https://github.com/fmtlib/fmt/issues/2479,
  https://github.com/fmtlib/fmt/issues/2481,
  https://github.com/fmtlib/fmt/pull/2482,
  https://github.com/fmtlib/fmt/pull/2483,
  https://github.com/fmtlib/fmt/issues/2490,
  https://github.com/fmtlib/fmt/pull/2491,
  https://github.com/fmtlib/fmt/pull/2510,
  https://github.com/fmtlib/fmt/pull/2518,
  https://github.com/fmtlib/fmt/issues/2528,
  https://github.com/fmtlib/fmt/pull/2529,
  https://github.com/fmtlib/fmt/pull/2539,
  https://github.com/fmtlib/fmt/issues/2540,
  https://github.com/fmtlib/fmt/pull/2545,
  https://github.com/fmtlib/fmt/pull/2555,
  https://github.com/fmtlib/fmt/issues/2557,
  https://github.com/fmtlib/fmt/issues/2570,
  https://github.com/fmtlib/fmt/pull/2573,
  https://github.com/fmtlib/fmt/pull/2582,
  https://github.com/fmtlib/fmt/issues/2605,
  https://github.com/fmtlib/fmt/pull/2611,
  https://github.com/fmtlib/fmt/pull/2647,
  https://github.com/fmtlib/fmt/issues/2627,
  https://github.com/fmtlib/fmt/pull/2630,
  https://github.com/fmtlib/fmt/issues/2635,
  https://github.com/fmtlib/fmt/issues/2638,
  https://github.com/fmtlib/fmt/issues/2653,
  https://github.com/fmtlib/fmt/issues/2654,
  https://github.com/fmtlib/fmt/issues/2661,
  https://github.com/fmtlib/fmt/pull/2664,
  https://github.com/fmtlib/fmt/pull/2684).
  Thanks @DanielaE, @mwinterb, @cdacamar, @TrebledJ, @bodomartin, @cquammen,
  @white238, @mmarkeloff, @palacaze, @jcelerier, @mborn-adi, @BrukerJWD,
  @spyridon97, @phprus, @oliverlee, @joshessman-llnl, @akohlmey, @timkalu,
  @olupton, @Acretock, @alexezeder, @andrewcorrigan, @lucpelletier and
  @HazardyKnusperkeks.

# 8.0.1 - 2021-07-02

- Fixed the version number in the inline namespace
  (https://github.com/fmtlib/fmt/issues/2374).
- Added a missing presentation type check for `std::string`
  (https://github.com/fmtlib/fmt/issues/2402).
- Fixed a linkage error when mixing code built with clang and gcc
  (https://github.com/fmtlib/fmt/issues/2377).
- Fixed documentation issues
  (https://github.com/fmtlib/fmt/pull/2396,
  https://github.com/fmtlib/fmt/issues/2403,
  https://github.com/fmtlib/fmt/issues/2406). Thanks @mkurdej.
- Removed dead code in FP formatter (
  https://github.com/fmtlib/fmt/pull/2398). Thanks @javierhonduco.
- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/2351,
  https://github.com/fmtlib/fmt/issues/2359,
  https://github.com/fmtlib/fmt/pull/2365,
  https://github.com/fmtlib/fmt/issues/2368,
  https://github.com/fmtlib/fmt/pull/2370,
  https://github.com/fmtlib/fmt/pull/2376,
  https://github.com/fmtlib/fmt/pull/2381,
  https://github.com/fmtlib/fmt/pull/2382,
  https://github.com/fmtlib/fmt/issues/2386,
  https://github.com/fmtlib/fmt/pull/2389,
  https://github.com/fmtlib/fmt/pull/2395,
  https://github.com/fmtlib/fmt/pull/2397,
  https://github.com/fmtlib/fmt/issues/2400,
  https://github.com/fmtlib/fmt/issues/2401,
  https://github.com/fmtlib/fmt/pull/2407).
  Thanks @zx2c4, @AidanSun05, @mattiasljungstrom, @joemmett, @erengy,
  @patlkli, @gsjaardema and @phprus.

# 8.0.0 - 2021-06-21

- Enabled compile-time format string checks by default. For example
  ([godbolt](https://godbolt.org/z/sMxcohGjz)):

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{:d}", "I am not a number");
  }
  ```

  gives a compile-time error on compilers with C++20 `consteval`
  support (gcc 10+, clang 11+) because `d` is not a valid format
  specifier for a string.

  To pass a runtime string wrap it in `fmt::runtime`:

  ```c++
  fmt::print(fmt::runtime("{:d}"), "I am not a number");
  ```

- Added compile-time formatting
  (https://github.com/fmtlib/fmt/pull/2019,
  https://github.com/fmtlib/fmt/pull/2044,
  https://github.com/fmtlib/fmt/pull/2056,
  https://github.com/fmtlib/fmt/pull/2072,
  https://github.com/fmtlib/fmt/pull/2075,
  https://github.com/fmtlib/fmt/issues/2078,
  https://github.com/fmtlib/fmt/pull/2129,
  https://github.com/fmtlib/fmt/pull/2326). For example
  ([godbolt](https://godbolt.org/z/Mxx9d89jM)):

  ```c++
  #include <fmt/compile.h>

  consteval auto compile_time_itoa(int value) -> std::array<char, 10> {
    auto result = std::array<char, 10>();
    fmt::format_to(result.data(), FMT_COMPILE("{}"), value);
    return result;
  }

  constexpr auto answer = compile_time_itoa(42);
  ```

  Most of the formatting functionality is available at compile time
  with a notable exception of floating-point numbers and pointers.
  Thanks @alexezeder.

- Optimized handling of format specifiers during format string
  compilation. For example, hexadecimal formatting (`"{:x}"`) is now
  3-7x faster than before when using `format_to` with format string
  compilation and a stack-allocated buffer
  (https://github.com/fmtlib/fmt/issues/1944).

  Before (7.1.3):

      ----------------------------------------------------------------------------
      Benchmark                                  Time             CPU   Iterations
      ----------------------------------------------------------------------------
      FMTCompileOld/0                         15.5 ns         15.5 ns     43302898
      FMTCompileOld/42                        16.6 ns         16.6 ns     43278267
      FMTCompileOld/273123                    18.7 ns         18.6 ns     37035861
      FMTCompileOld/9223372036854775807       19.4 ns         19.4 ns     35243000
      ----------------------------------------------------------------------------

  After (8.x):

      ----------------------------------------------------------------------------
      Benchmark                                  Time             CPU   Iterations
      ----------------------------------------------------------------------------
      FMTCompileNew/0                         1.99 ns         1.99 ns    360523686
      FMTCompileNew/42                        2.33 ns         2.33 ns    279865664
      FMTCompileNew/273123                    3.72 ns         3.71 ns    190230315
      FMTCompileNew/9223372036854775807       5.28 ns         5.26 ns    130711631
      ----------------------------------------------------------------------------

  It is even faster than `std::to_chars` from libc++ compiled with
  clang on macOS:

      ----------------------------------------------------------------------------
      Benchmark                                  Time             CPU   Iterations
      ----------------------------------------------------------------------------
      ToChars/0                               4.42 ns         4.41 ns    160196630
      ToChars/42                              5.00 ns         4.98 ns    140735201
      ToChars/273123                          7.26 ns         7.24 ns     95784130
      ToChars/9223372036854775807             8.77 ns         8.75 ns     75872534
      ----------------------------------------------------------------------------

  In other cases, especially involving `std::string` construction, the
  speed up is usually lower because handling format specifiers takes a
  smaller fraction of the total time.

- Added the `_cf` user-defined literal to represent a compiled format
  string. It can be used instead of the `FMT_COMPILE` macro
  (https://github.com/fmtlib/fmt/pull/2043,
  https://github.com/fmtlib/fmt/pull/2242):

  ```c++
  #include <fmt/compile.h>

  using namespace fmt::literals;
  auto s = fmt::format(FMT_COMPILE("{}"), 42); // 🙁 not modern
  auto s = fmt::format("{}"_cf, 42);           // 🙂 modern as hell
  ```

  It requires compiler support for class types in non-type template
  parameters (a C++20 feature) which is available in GCC 9.3+.
  Thanks @alexezeder.

- Format string compilation now requires `format` functions of
  `formatter` specializations for user-defined types to be `const`:

  ```c++
  template <> struct fmt::formatter<my_type>: formatter<string_view> {
    template <typename FormatContext>
    auto format(my_type obj, FormatContext& ctx) const {  // Note const here.
      // ...
    }
  };
  ```

- Added UDL-based named argument support to format string compilation
  (https://github.com/fmtlib/fmt/pull/2243,
  https://github.com/fmtlib/fmt/pull/2281). For example:

  ```c++
  #include <fmt/compile.h>

  using namespace fmt::literals;
  auto s = fmt::format(FMT_COMPILE("{answer}"), "answer"_a = 42);
  ```

  Here the argument named \"answer\" is resolved at compile time with
  no runtime overhead. Thanks @alexezeder.

- Added format string compilation support to `fmt::print`
  (https://github.com/fmtlib/fmt/issues/2280,
  https://github.com/fmtlib/fmt/pull/2304). Thanks @alexezeder.

- Added initial support for compiling {fmt} as a C++20 module
  (https://github.com/fmtlib/fmt/pull/2235,
  https://github.com/fmtlib/fmt/pull/2240,
  https://github.com/fmtlib/fmt/pull/2260,
  https://github.com/fmtlib/fmt/pull/2282,
  https://github.com/fmtlib/fmt/pull/2283,
  https://github.com/fmtlib/fmt/pull/2288,
  https://github.com/fmtlib/fmt/pull/2298,
  https://github.com/fmtlib/fmt/pull/2306,
  https://github.com/fmtlib/fmt/pull/2307,
  https://github.com/fmtlib/fmt/pull/2309,
  https://github.com/fmtlib/fmt/pull/2318,
  https://github.com/fmtlib/fmt/pull/2324,
  https://github.com/fmtlib/fmt/pull/2332,
  https://github.com/fmtlib/fmt/pull/2340). Thanks @DanielaE.

- Made symbols private by default reducing shared library size
  (https://github.com/fmtlib/fmt/pull/2301). For example
  there was a \~15% reported reduction on one platform. Thanks @sergiud.

- Optimized includes making the result of preprocessing `fmt/format.h`
  \~20% smaller with libstdc++/C++20 and slightly improving build
  times (https://github.com/fmtlib/fmt/issues/1998).

- Added support of ranges with non-const `begin` / `end`
  (https://github.com/fmtlib/fmt/pull/1953). Thanks @kitegi.

- Added support of `std::byte` and other formattable types to
  `fmt::join` (https://github.com/fmtlib/fmt/issues/1981,
  https://github.com/fmtlib/fmt/issues/2040,
  https://github.com/fmtlib/fmt/pull/2050,
  https://github.com/fmtlib/fmt/issues/2262). For example:

  ```c++
  #include <fmt/format.h>
  #include <cstddef>
  #include <vector>

  int main() {
    auto bytes = std::vector{std::byte(4), std::byte(2)};
    fmt::print("{}", fmt::join(bytes, ""));
  }
  ```

  prints \"42\".

  Thanks @kamibo.

- Implemented the default format for `std::chrono::system_clock`
  (https://github.com/fmtlib/fmt/issues/2319,
  https://github.com/fmtlib/fmt/pull/2345). For example:

  ```c++
  #include <fmt/chrono.h>

  int main() {
    fmt::print("{}", std::chrono::system_clock::now());
  }
  ```

  prints \"2021-06-18 15:22:00\" (the output depends on the current
  date and time). Thanks @sunmy2019.

- Made more chrono specifiers locale independent by default. Use the
  `'L'` specifier to get localized formatting. For example:

  ```c++
  #include <fmt/chrono.h>

  int main() {
    std::locale::global(std::locale("ru_RU.UTF-8"));
    auto monday = std::chrono::weekday(1);
    fmt::print("{}\n", monday);   // prints "Mon"
    fmt::print("{:L}\n", monday); // prints "пн"
  }
  ```

- Improved locale handling in chrono formatting
  (https://github.com/fmtlib/fmt/issues/2337,
  https://github.com/fmtlib/fmt/pull/2349,
  https://github.com/fmtlib/fmt/pull/2350). Thanks @phprus.

- Deprecated `fmt/locale.h` moving the formatting functions that take
  a locale to `fmt/format.h` (`char`) and `fmt/xchar` (other
  overloads). This doesn\'t introduce a dependency on `<locale>` so
  there is virtually no compile time effect.

- Deprecated an undocumented `format_to` overload that takes
  `basic_memory_buffer`.

- Made parameter order in `vformat_to` consistent with `format_to`
  (https://github.com/fmtlib/fmt/issues/2327).

- Added support for time points with arbitrary durations
  (https://github.com/fmtlib/fmt/issues/2208). For example:

  ```c++
  #include <fmt/chrono.h>

  int main() {
    using tp = std::chrono::time_point<
      std::chrono::system_clock, std::chrono::seconds>;
    fmt::print("{:%S}", tp(std::chrono::seconds(42)));
  }
  ```

  prints \"42\".

- Formatting floating-point numbers no longer produces trailing zeros
  by default for consistency with `std::format`. For example:

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{0:.3}", 1.1);
  }
  ```

  prints \"1.1\". Use the `'#'` specifier to keep trailing zeros.

- Dropped a limit on the number of elements in a range and replaced
  `{}` with `[]` as range delimiters for consistency with Python\'s
  `str.format`.

- The `'L'` specifier for locale-specific numeric formatting can now
  be combined with presentation specifiers as in `std::format`. For
  example:

  ```c++
  #include <fmt/core.h>
  #include <locale>

  int main() {
    std::locale::global(std::locale("fr_FR.UTF-8"));
    fmt::print("{0:.2Lf}", 0.42);
  }
  ```

  prints \"0,42\". The deprecated `'n'` specifier has been removed.

- Made the `0` specifier ignored for infinity and NaN
  (https://github.com/fmtlib/fmt/issues/2305,
  https://github.com/fmtlib/fmt/pull/2310). Thanks @Liedtke.

- Made the hexfloat formatting use the right alignment by default
  (https://github.com/fmtlib/fmt/issues/2308,
  https://github.com/fmtlib/fmt/pull/2317). Thanks @Liedtke.

- Removed the deprecated numeric alignment (`'='`). Use the `'0'`
  specifier instead.

- Removed the deprecated `fmt/posix.h` header that has been replaced
  with `fmt/os.h`.

- Removed the deprecated `format_to_n_context`, `format_to_n_args` and
  `make_format_to_n_args`. They have been replaced with
  `format_context`, `` format_args` and ``make_format_args\`\`
  respectively.

- Moved `wchar_t`-specific functions and types to `fmt/xchar.h`. You
  can define `FMT_DEPRECATED_INCLUDE_XCHAR` to automatically include
  `fmt/xchar.h` from `fmt/format.h` but this will be disabled in the
  next major release.

- Fixed handling of the `'+'` specifier in localized formatting
  (https://github.com/fmtlib/fmt/issues/2133).

- Added support for the `'s'` format specifier that gives textual
  representation of `bool`
  (https://github.com/fmtlib/fmt/issues/2094,
  https://github.com/fmtlib/fmt/pull/2109). For example:

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{:s}", true);
  }
  ```

  prints \"true\". Thanks @powercoderlol.

- Made `fmt::ptr` work with function pointers
  (https://github.com/fmtlib/fmt/pull/2131). For example:

  ```c++
  #include <fmt/format.h>

  int main() {
    fmt::print("My main: {}\n", fmt::ptr(main));
  }
  ```

  Thanks @mikecrowe.

- The undocumented support for specializing `formatter` for pointer
  types has been removed.

- Fixed `fmt::formatted_size` with format string compilation
  (https://github.com/fmtlib/fmt/pull/2141,
  https://github.com/fmtlib/fmt/pull/2161). Thanks @alexezeder.

- Fixed handling of empty format strings during format string
  compilation (https://github.com/fmtlib/fmt/issues/2042):

  ```c++
  auto s = fmt::format(FMT_COMPILE(""));
  ```

  Thanks @alexezeder.

- Fixed handling of enums in `fmt::to_string`
  (https://github.com/fmtlib/fmt/issues/2036).

- Improved width computation
  (https://github.com/fmtlib/fmt/issues/2033,
  https://github.com/fmtlib/fmt/issues/2091). For example:

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{:-<10}{}\n", "你好", "世界");
    fmt::print("{:-<10}{}\n", "hello", "world");
  }
  ```

  prints

  ![](https://user-images.githubusercontent.com/576385/119840373-cea3ca80-beb9-11eb-91e0-54266c48e181.png)

  on a modern terminal.

- The experimental fast output stream (`fmt::ostream`) is now
  truncated by default for consistency with `fopen`
  (https://github.com/fmtlib/fmt/issues/2018). For example:

  ```c++
  #include <fmt/os.h>

  int main() {
    fmt::ostream out1 = fmt::output_file("guide");
    out1.print("Zaphod");
    out1.close();
    fmt::ostream out2 = fmt::output_file("guide");
    out2.print("Ford");
  }
  ```

  writes \"Ford\" to the file \"guide\". To preserve the old file
  content if any pass `fmt::file::WRONLY | fmt::file::CREATE` flags to
  `fmt::output_file`.

- Fixed moving of `fmt::ostream` that holds buffered data
  (https://github.com/fmtlib/fmt/issues/2197,
  https://github.com/fmtlib/fmt/pull/2198). Thanks @vtta.

- Replaced the `fmt::system_error` exception with a function of the
  same name that constructs `std::system_error`
  (https://github.com/fmtlib/fmt/issues/2266).

- Replaced the `fmt::windows_error` exception with a function of the
  same name that constructs `std::system_error` with the category
  returned by `fmt::system_category()`
  (https://github.com/fmtlib/fmt/issues/2274,
  https://github.com/fmtlib/fmt/pull/2275). The latter is
  similar to `std::system_category` but correctly handles UTF-8.
  Thanks @phprus.

- Replaced `fmt::error_code` with `std::error_code` and made it
  formattable (https://github.com/fmtlib/fmt/issues/2269,
  https://github.com/fmtlib/fmt/pull/2270,
  https://github.com/fmtlib/fmt/pull/2273). Thanks @phprus.

- Added speech synthesis support
  (https://github.com/fmtlib/fmt/pull/2206).

- Made `format_to` work with a memory buffer that has a custom
  allocator (https://github.com/fmtlib/fmt/pull/2300).
  Thanks @voxmea.

- Added `Allocator::max_size` support to `basic_memory_buffer`.
  (https://github.com/fmtlib/fmt/pull/1960). Thanks @phprus.

- Added wide string support to `fmt::join`
  (https://github.com/fmtlib/fmt/pull/2236). Thanks @crbrz.

- Made iterators passed to `formatter` specializations via a format
  context satisfy C++20 `std::output_iterator` requirements
  (https://github.com/fmtlib/fmt/issues/2156,
  https://github.com/fmtlib/fmt/pull/2158,
  https://github.com/fmtlib/fmt/issues/2195,
  https://github.com/fmtlib/fmt/pull/2204). Thanks @randomnetcat.

- Optimized the `printf` implementation
  (https://github.com/fmtlib/fmt/pull/1982,
  https://github.com/fmtlib/fmt/pull/1984,
  https://github.com/fmtlib/fmt/pull/2016,
  https://github.com/fmtlib/fmt/pull/2164).
  Thanks @rimathia and @moiwi.

- Improved detection of `constexpr` `char_traits`
  (https://github.com/fmtlib/fmt/pull/2246,
  https://github.com/fmtlib/fmt/pull/2257). Thanks @phprus.

- Fixed writing to `stdout` when it is redirected to `NUL` on Windows
  (https://github.com/fmtlib/fmt/issues/2080).

- Fixed exception propagation from iterators
  (https://github.com/fmtlib/fmt/issues/2097).

- Improved `strftime` error handling
  (https://github.com/fmtlib/fmt/issues/2238,
  https://github.com/fmtlib/fmt/pull/2244). Thanks @yumeyao.

- Stopped using deprecated GCC UDL template extension.

- Added `fmt/args.h` to the install target
  (https://github.com/fmtlib/fmt/issues/2096).

- Error messages are now passed to assert when exceptions are disabled
  (https://github.com/fmtlib/fmt/pull/2145). Thanks @NobodyXu.

- Added the `FMT_MASTER_PROJECT` CMake option to control build and
  install targets when {fmt} is included via `add_subdirectory`
  (https://github.com/fmtlib/fmt/issues/2098,
  https://github.com/fmtlib/fmt/pull/2100).
  Thanks @randomizedthinking.

- Improved build configuration
  (https://github.com/fmtlib/fmt/pull/2026,
  https://github.com/fmtlib/fmt/pull/2122).
  Thanks @luncliff and @ibaned.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/issues/1947,
  https://github.com/fmtlib/fmt/pull/1959,
  https://github.com/fmtlib/fmt/pull/1963,
  https://github.com/fmtlib/fmt/pull/1965,
  https://github.com/fmtlib/fmt/issues/1966,
  https://github.com/fmtlib/fmt/pull/1974,
  https://github.com/fmtlib/fmt/pull/1975,
  https://github.com/fmtlib/fmt/pull/1990,
  https://github.com/fmtlib/fmt/issues/2000,
  https://github.com/fmtlib/fmt/pull/2001,
  https://github.com/fmtlib/fmt/issues/2002,
  https://github.com/fmtlib/fmt/issues/2004,
  https://github.com/fmtlib/fmt/pull/2006,
  https://github.com/fmtlib/fmt/pull/2009,
  https://github.com/fmtlib/fmt/pull/2010,
  https://github.com/fmtlib/fmt/issues/2038,
  https://github.com/fmtlib/fmt/issues/2039,
  https://github.com/fmtlib/fmt/issues/2047,
  https://github.com/fmtlib/fmt/pull/2053,
  https://github.com/fmtlib/fmt/issues/2059,
  https://github.com/fmtlib/fmt/pull/2065,
  https://github.com/fmtlib/fmt/pull/2067,
  https://github.com/fmtlib/fmt/pull/2068,
  https://github.com/fmtlib/fmt/pull/2073,
  https://github.com/fmtlib/fmt/issues/2103,
  https://github.com/fmtlib/fmt/issues/2105,
  https://github.com/fmtlib/fmt/pull/2106,
  https://github.com/fmtlib/fmt/pull/2107,
  https://github.com/fmtlib/fmt/issues/2116,
  https://github.com/fmtlib/fmt/pull/2117,
  https://github.com/fmtlib/fmt/issues/2118,
  https://github.com/fmtlib/fmt/pull/2119,
  https://github.com/fmtlib/fmt/issues/2127,
  https://github.com/fmtlib/fmt/pull/2128,
  https://github.com/fmtlib/fmt/issues/2140,
  https://github.com/fmtlib/fmt/issues/2142,
  https://github.com/fmtlib/fmt/pull/2143,
  https://github.com/fmtlib/fmt/pull/2144,
  https://github.com/fmtlib/fmt/issues/2147,
  https://github.com/fmtlib/fmt/issues/2148,
  https://github.com/fmtlib/fmt/issues/2149,
  https://github.com/fmtlib/fmt/pull/2152,
  https://github.com/fmtlib/fmt/pull/2160,
  https://github.com/fmtlib/fmt/issues/2170,
  https://github.com/fmtlib/fmt/issues/2175,
  https://github.com/fmtlib/fmt/issues/2176,
  https://github.com/fmtlib/fmt/pull/2177,
  https://github.com/fmtlib/fmt/issues/2178,
  https://github.com/fmtlib/fmt/pull/2179,
  https://github.com/fmtlib/fmt/issues/2180,
  https://github.com/fmtlib/fmt/issues/2181,
  https://github.com/fmtlib/fmt/pull/2183,
  https://github.com/fmtlib/fmt/issues/2184,
  https://github.com/fmtlib/fmt/issues/2185,
  https://github.com/fmtlib/fmt/pull/2186,
  https://github.com/fmtlib/fmt/pull/2187,
  https://github.com/fmtlib/fmt/pull/2190,
  https://github.com/fmtlib/fmt/pull/2192,
  https://github.com/fmtlib/fmt/pull/2194,
  https://github.com/fmtlib/fmt/pull/2205,
  https://github.com/fmtlib/fmt/issues/2210,
  https://github.com/fmtlib/fmt/pull/2211,
  https://github.com/fmtlib/fmt/pull/2215,
  https://github.com/fmtlib/fmt/pull/2216,
  https://github.com/fmtlib/fmt/pull/2218,
  https://github.com/fmtlib/fmt/pull/2220,
  https://github.com/fmtlib/fmt/issues/2228,
  https://github.com/fmtlib/fmt/pull/2229,
  https://github.com/fmtlib/fmt/pull/2230,
  https://github.com/fmtlib/fmt/issues/2233,
  https://github.com/fmtlib/fmt/pull/2239,
  https://github.com/fmtlib/fmt/issues/2248,
  https://github.com/fmtlib/fmt/issues/2252,
  https://github.com/fmtlib/fmt/pull/2253,
  https://github.com/fmtlib/fmt/pull/2255,
  https://github.com/fmtlib/fmt/issues/2261,
  https://github.com/fmtlib/fmt/issues/2278,
  https://github.com/fmtlib/fmt/issues/2284,
  https://github.com/fmtlib/fmt/pull/2287,
  https://github.com/fmtlib/fmt/pull/2289,
  https://github.com/fmtlib/fmt/pull/2290,
  https://github.com/fmtlib/fmt/pull/2293,
  https://github.com/fmtlib/fmt/issues/2295,
  https://github.com/fmtlib/fmt/pull/2296,
  https://github.com/fmtlib/fmt/pull/2297,
  https://github.com/fmtlib/fmt/issues/2311,
  https://github.com/fmtlib/fmt/pull/2313,
  https://github.com/fmtlib/fmt/pull/2315,
  https://github.com/fmtlib/fmt/issues/2320,
  https://github.com/fmtlib/fmt/pull/2321,
  https://github.com/fmtlib/fmt/pull/2323,
  https://github.com/fmtlib/fmt/issues/2328,
  https://github.com/fmtlib/fmt/pull/2329,
  https://github.com/fmtlib/fmt/pull/2333,
  https://github.com/fmtlib/fmt/pull/2338,
  https://github.com/fmtlib/fmt/pull/2341).
  Thanks @darklukee, @fagg, @killerbot242, @jgopel, @yeswalrus, @Finkman,
  @HazardyKnusperkeks, @dkavolis, @concatime, @chronoxor, @summivox, @yNeo,
  @Apache-HB, @alexezeder, @toojays, @Brainy0207, @vadz, @imsherlock, @phprus,
  @white238, @yafshar, @BillyDonahue, @jstaahl, @denchat, @DanielaE,
  @ilyakurdyukov, @ilmai, @JessyDL, @sergiud, @mwinterb, @sven-herrmann,
  @jmelas, @twoixter, @crbrz and @upsj.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/1986,
  https://github.com/fmtlib/fmt/pull/2051,
  https://github.com/fmtlib/fmt/issues/2057,
  https://github.com/fmtlib/fmt/pull/2081,
  https://github.com/fmtlib/fmt/issues/2084,
  https://github.com/fmtlib/fmt/pull/2312).
  Thanks @imba-tjd, @0x416c69 and @mordante.

- Continuous integration and test improvements
  (https://github.com/fmtlib/fmt/issues/1969,
  https://github.com/fmtlib/fmt/pull/1991,
  https://github.com/fmtlib/fmt/pull/2020,
  https://github.com/fmtlib/fmt/pull/2110,
  https://github.com/fmtlib/fmt/pull/2114,
  https://github.com/fmtlib/fmt/issues/2196,
  https://github.com/fmtlib/fmt/pull/2217,
  https://github.com/fmtlib/fmt/pull/2247,
  https://github.com/fmtlib/fmt/pull/2256,
  https://github.com/fmtlib/fmt/pull/2336,
  https://github.com/fmtlib/fmt/pull/2346).
  Thanks @jgopel, @alexezeder and @DanielaE.

The change log for versions 0.8.0 - 7.1.3 is available [here](
doc/ChangeLog-old.md).


================================================
FILE: LICENSE
================================================
Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
<img src="https://user-images.githubusercontent.com/576385/156254208-f5b743a9-88cf-439d-b0c0-923d53e8d551.png" alt="{fmt}" width="25%"/>

[![image](https://github.com/fmtlib/fmt/actions/workflows/linux.yml/badge.svg?branch=master)](https://github.com/fmtlib/fmt/actions?query=workflow%3Alinux)
[![image](https://github.com/fmtlib/fmt/actions/workflows/macos.yml/badge.svg?branch=master)](https://github.com/fmtlib/fmt/actions?query=workflow%3Amacos)
[![image](https://github.com/fmtlib/fmt/actions/workflows/windows.yml/badge.svg?branch=master)](https://github.com/fmtlib/fmt/actions?query=workflow%3Awindows)
[![fmt is continuously fuzzed at oss-fuzz](https://oss-fuzz-build-logs.storage.googleapis.com/badges/fmt.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?\%0Acolspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20\%0ASummary&q=proj%3Dfmt&can=1)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8880/badge)](https://www.bestpractices.dev/projects/8880)
[![image](https://api.securityscorecards.dev/projects/github.com/fmtlib/fmt/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fmtlib/fmt)
[![Ask questions at StackOverflow with the tag fmt](https://img.shields.io/badge/stackoverflow-fmt-blue.svg)](https://stackoverflow.com/questions/tagged/fmt)

**{fmt}** is an open-source formatting library providing a fast and safe
alternative to C stdio and C++ iostreams.

If you like this project, please consider donating to one of the funds
that help victims of the war in Ukraine: <https://u24.gov.ua/>.

[Documentation](https://fmt.dev)

[Cheat Sheets](https://hackingcpp.com/cpp/libs/fmt.html)

Q&A: ask questions on [StackOverflow with the tag
fmt](https://stackoverflow.com/questions/tagged/fmt).

Try {fmt} in [Compiler Explorer](https://godbolt.org/z/8Mx1EW73v).

# Features

- Simple [format API](https://fmt.dev/latest/api/) with positional
  arguments for localization
- Implementation of [C++20
  std::format](https://en.cppreference.com/w/cpp/utility/format) and
  [C++23 std::print](https://en.cppreference.com/w/cpp/io/print)
- [Format string syntax](https://fmt.dev/latest/syntax/) similar
  to Python\'s
  [format](https://docs.python.org/3/library/stdtypes.html#str.format)
- Fast IEEE 754 floating-point formatter with correct rounding,
  shortness and round-trip guarantees using the
  [Dragonbox](https://github.com/jk-jeon/dragonbox) algorithm
- Portable Unicode support
- Safe [printf
  implementation](https://fmt.dev/latest/api/#printf-formatting)
  including the POSIX extension for positional arguments
- Extensibility: [support for user-defined
  types](https://fmt.dev/latest/api/#formatting-user-defined-types)
- High performance: faster than common standard library
  implementations of `(s)printf`, iostreams, `to_string` and
  `to_chars`, see [Speed tests](#speed-tests) and [Converting a
  hundred million integers to strings per
  second](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html)
- Small code size both in terms of source code with the minimum
  configuration consisting of just three files, `base.h`, `format.h`
  and `format-inl.h`, and compiled code; see [Compile time and code
  bloat](#compile-time-and-code-bloat)
- Reliability: the library has an extensive set of
  [tests](https://github.com/fmtlib/fmt/tree/master/test) and is
  [continuously fuzzed](https://bugs.chromium.org/p/oss-fuzz/issues/list?colspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20Summary&q=proj%3Dfmt&can=1)
- Safety: the library is fully type-safe, errors in format strings can
  be reported at compile time, automatic memory management prevents
  buffer overflow errors
- Ease of use: small self-contained code base, no external
  dependencies, permissive MIT
  [license](https://github.com/fmtlib/fmt/blob/master/LICENSE)
- [Portability](https://fmt.dev/latest/#portability) with
  consistent output across platforms and support for older compilers
- Clean warning-free codebase even on high warning levels such as
  `-Wall -Wextra -pedantic`
- Locale independence by default
- Optional header-only configuration enabled with the
  `FMT_HEADER_ONLY` macro

See the [documentation](https://fmt.dev) for more details.

# Examples

**Print to stdout** ([run](https://godbolt.org/z/Tevcjh))

``` c++
#include <fmt/base.h>

int main() {
  fmt::print("Hello, world!\n");
}
```

**Format a string** ([run](https://godbolt.org/z/oK8h33))

``` c++
std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."
```

**Format a string using positional arguments**
([run](https://godbolt.org/z/Yn7Txe))

``` c++
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
// s == "I'd rather be happy than right."
```

**Print dates and times** ([run](https://godbolt.org/z/c31ExdY3W))

``` c++
#include <fmt/chrono.h>

int main() {
  auto now = std::chrono::system_clock::now();
  fmt::print("Date and time: {}\n", now);
  fmt::print("Time: {:%H:%M}\n", now);
}
```

Output:

    Date and time: 2023-12-26 19:10:31.557195597
    Time: 19:10

**Print a container** ([run](https://godbolt.org/z/MxM1YqjE7))

``` c++
#include <vector>
#include <fmt/ranges.h>

int main() {
  std::vector<int> v = {1, 2, 3};
  fmt::print("{}\n", v);
}
```

Output:

    [1, 2, 3]

**Check a format string at compile time**

``` c++
std::string s = fmt::format("{:d}", "I am not a number");
```

This gives a compile-time error in C++20 because `d` is an invalid
format specifier for a string.

**Write a file from a single thread**

``` c++
#include <fmt/os.h>

int main() {
  auto out = fmt::output_file("guide.txt");
  out.print("Don't {}", "Panic");
}
```

This can be [up to 9 times faster than `fprintf`](
http://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html).

**Print with colors and text styles**

``` c++
#include <fmt/color.h>

int main() {
  fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
             "Hello, {}!\n", "world");
  fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
             fmt::emphasis::underline, "Olá, {}!\n", "Mundo");
  fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
             "你好{}!\n", "世界");
}
```

Output on a modern terminal with Unicode support:

![image](https://github.com/fmtlib/fmt/assets/%0A576385/2a93c904-d6fa-4aa6-b453-2618e1c327d7)

# Benchmarks

## Speed tests

| Library           | Method        | Run Time, s |
|-------------------|---------------|-------------|
| libc              | printf        |   0.66      |
| libc++            | std::ostream  |   1.63      |
| {fmt} 12.1        | fmt::print    |   0.44      |
| Boost Format 1.88 | boost::format |   3.89      |
| Folly Format      | folly::format |   1.28      |

{fmt} is the fastest of the benchmarked methods, \~50% faster than
`printf`.

The above results were generated by building `tinyformat_test.cpp` on
macOS 15.6.1 with `clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT`, and
taking the best of three runs. In the test, the format string
`"%0.10f:%04d:%+g:%s:%p:%c:%%\n"` or equivalent is filled 2,000,000
times with output sent to `/dev/null`; for further details refer to the
[source](https://github.com/fmtlib/format-benchmark/blob/master/src/tinyformat-test.cc).

{fmt} is up to 20-30x faster than `std::ostringstream` and `sprintf` on
IEEE754 `float` and `double` formatting
([dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark)) and faster
than [double-conversion](https://github.com/google/double-conversion)
and [ryu](https://github.com/ulfjack/ryu):

[![image](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png)](https://fmt.dev/unknown_mac64_clang12.0.html)

## Compile time and code bloat

The script [bloat-test.py][test] from [format-benchmark][bench] tests compile
time and code bloat for nontrivial projects. It generates 100 translation units
and uses `printf()` or its alternative five times in each to simulate a
medium-sized project. The resulting executable size and compile time (Apple
clang version 15.0.0 (clang-1500.1.0.2.5), macOS Sonoma, best of three) is shown
in the following tables.

[test]: https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py
[bench]: https://github.com/fmtlib/format-benchmark

**Optimized build (-O3)**

| Method          | Compile Time, s | Executable size, KiB | Stripped size, KiB |
|-----------------|-----------------|----------------------|--------------------|
| printf          |             1.6 |                   54 |                 50 |
| IOStreams       |            28.4 |                   98 |                 84 |
| {fmt} `1122268` |             5.0 |                   54 |                 50 |
| tinyformat      |            32.6 |                  164 |                136 |
| Boost Format    |            55.0 |                  530 |                317 |

{fmt} is fast to compile and is comparable to `printf` in terms of per-call
binary size (within a rounding error on this system).

**Non-optimized build**

| Method          | Compile Time, s | Executable size, KiB | Stripped size, KiB |
|-----------------|-----------------|----------------------|--------------------|
| printf          |             1.4 |                   54 |                 50 |
| IOStreams       |            27.0 |                   88 |                 68 |
| {fmt} `1122268` |             4.7 |                   87 |                 84 |
| tinyformat      |            28.1 |                  185 |                145 |
| Boost Format    |            38.9 |                  678 |                381 |

`libc`, `lib(std)c++`, and `libfmt` are all linked as shared libraries
to compare formatting function overhead only. Boost Format is a
header-only library so it doesn\'t provide any linkage options.

## Running the tests

Please refer to [Building the
library](https://fmt.dev/latest/get-started/#building-from-source) for
instructions on how to build the library and run the unit tests.

Benchmarks reside in a separate repository,
[format-benchmarks](https://github.com/fmtlib/format-benchmark), so to
run the benchmarks you first need to clone this repository and generate
Makefiles with CMake:

    $ git clone --recursive https://github.com/fmtlib/format-benchmark.git
    $ cd format-benchmark
    $ cmake .

Then you can run the speed test:

    $ make speed-test

or the bloat test:

    $ make bloat-test

# Migrating code

[clang-tidy](https://clang.llvm.org/extra/clang-tidy/) v18 provides the
[modernize-use-std-print](https://clang.llvm.org/extra/clang-tidy/checks/modernize/use-std-print.html)
check that is capable of converting occurrences of `printf` and
`fprintf` to `fmt::print` if configured to do so. (By default it
converts to `std::print`.)

# Notable projects using this library

- [0 A.D.](https://play0ad.com/): a free, open-source, cross-platform
  real-time strategy game
- [AMPL/MP](https://github.com/ampl/mp): an open-source library for
  mathematical programming
- [Apple's FoundationDB](https://github.com/apple/foundationdb): an open-source,
  distributed, transactional key-value store
- [Aseprite](https://github.com/aseprite/aseprite): animated sprite
  editor & pixel art tool
- [AvioBook](https://www.aviobook.aero/en): a comprehensive aircraft
  operations suite
- [Blizzard Battle.net](https://battle.net/): an online gaming
  platform
- [Celestia](https://celestia.space/): real-time 3D visualization of
  space
- [Ceph](https://ceph.com/): a scalable distributed storage system
- [ccache](https://ccache.dev/): a compiler cache
- [ClickHouse](https://github.com/ClickHouse/ClickHouse): an
  analytical database management system
- [ContextVision](https://www.contextvision.com/): medical imaging software
- [Contour](https://github.com/contour-terminal/contour/): a modern
  terminal emulator
- [CUAUV](https://cuauv.org/): Cornell University\'s autonomous
  underwater vehicle
- [Drake](https://drake.mit.edu/): a planning, control, and analysis
  toolbox for nonlinear dynamical systems (MIT)
- [Envoy](https://github.com/envoyproxy/envoy): C++ L7 proxy and
  communication bus (Lyft)
- [FiveM](https://fivem.net/): a modification framework for GTA V
- [fmtlog](https://github.com/MengRao/fmtlog): a performant
  fmtlib-style logging library with latency in nanoseconds
- [Folly](https://github.com/facebook/folly): Facebook open-source
  library
- [GemRB](https://gemrb.org/): a portable open-source implementation
  of Bioware's Infinity Engine
- [Grand Mountain
  Adventure](https://store.steampowered.com/app/1247360/Grand_Mountain_Adventure/):
  a beautiful open-world ski & snowboarding game
- [HarpyWar/pvpgn](https://github.com/pvpgn/pvpgn-server): Player vs
  Player Gaming Network with tweaks
- [KBEngine](https://github.com/kbengine/kbengine): an open-source
  MMOG server engine
- [Keypirinha](https://keypirinha.com/): a semantic launcher for
  Windows
- [Kodi](https://kodi.tv/) (formerly xbmc): home theater software
- [Knuth](https://kth.cash/): high-performance Bitcoin full-node
- [libunicode](https://github.com/contour-terminal/libunicode/): a
  modern C++17 Unicode library
- [MariaDB](https://mariadb.org/): relational database management
  system
- [Microsoft Verona](https://github.com/microsoft/verona): research
  programming language for concurrent ownership
- [MongoDB](https://mongodb.com/): distributed document database
- [MongoDB Smasher](https://github.com/duckie/mongo_smasher): a small
  tool to generate randomized datasets
- [OpenSpace](https://openspaceproject.com/): an open-source
  astrovisualization framework
- [PenUltima Online (POL)](https://www.polserver.com/): an MMO server,
  compatible with most Ultima Online clients
- [PyTorch](https://github.com/pytorch/pytorch): an open-source
  machine learning library
- [quasardb](https://www.quasardb.net/): a distributed,
  high-performance, associative database
- [Quill](https://github.com/odygrd/quill): asynchronous low-latency
  logging library
- [QKW](https://github.com/ravijanjam/qkw): generalizing aliasing to
  simplify navigation, and execute complex multi-line terminal
  command sequences
- [redis-cerberus](https://github.com/HunanTV/redis-cerberus): a Redis
  cluster proxy
- [redpanda](https://vectorized.io/redpanda): a 10x faster Kafka®
  replacement for mission-critical systems written in C++
- [rpclib](http://rpclib.net/): a modern C++ msgpack-RPC server and
  client library
- [Salesforce Analytics
  Cloud](https://www.salesforce.com/analytics-cloud/overview/):
  business intelligence software
- [Scylla](https://www.scylladb.com/): a Cassandra-compatible NoSQL
  data store that can handle 1 million transactions per second on a
  single server
- [Seastar](http://www.seastar-project.org/): an advanced, open-source
  C++ framework for high-performance server applications on modern
  hardware
- [spdlog](https://github.com/gabime/spdlog): super fast C++ logging
  library
- [Stellar](https://www.stellar.org/): financial platform
- [Touch Surgery](https://www.touchsurgery.com/): surgery simulator
- [TrinityCore](https://github.com/TrinityCore/TrinityCore):
  open-source MMORPG framework
- [🐙 userver framework](https://userver.tech/): open-source
  asynchronous framework with a rich set of abstractions and database
  drivers
- [Windows Terminal](https://github.com/microsoft/terminal): the new
  Windows terminal

[More\...](https://github.com/search?q=fmtlib&type=Code)

If you are aware of other projects using this library, please let me
know by [email](mailto:victor.zverovich@gmail.com) or by submitting an
[issue](https://github.com/fmtlib/fmt/issues).

# Motivation

So why yet another formatting library?

There are plenty of methods for doing this task, from standard ones like
the printf family of function and iostreams to Boost Format and
FastFormat libraries. The reason for creating a new library is that
every existing solution that I found either had serious issues or
didn\'t provide all the features I needed.

## printf

The good thing about `printf` is that it is pretty fast and readily
available being a part of the C standard library. The main drawback is
that it doesn\'t support user-defined types. `printf` also has safety
issues although they are somewhat mitigated with [\_\_attribute\_\_
((format (printf,
\...))](https://gcc.gnu.org/onlinedocs/gcc/Common-Attributes.html) in
GCC. There is a POSIX extension that adds positional arguments required
for
[i18n](https://en.wikipedia.org/wiki/Internationalization_and_localization)
to `printf` but it is not a part of C99 and may not be available on some
platforms.

## iostreams

The main issue with iostreams is best illustrated with an example:

``` c++
std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
```

which is a lot of typing compared to printf:

``` c++
printf("%.2f\n", 1.23456);
```

Matthew Wilson, the author of FastFormat, called this \"chevron hell\".
iostreams don\'t support positional arguments by design.

The good part is that iostreams support user-defined types and are safe
although error handling is awkward.

## Boost Format

This is a very powerful library that supports both `printf`-like format
strings and positional arguments. Its main drawback is performance.
According to various benchmarks, it is much slower than other methods
considered here. Boost Format also has excessive build times and severe
code bloat issues (see [Benchmarks](#benchmarks)).

## FastFormat

This is an interesting library that is fast, safe and has positional
arguments. However, it has significant limitations, citing its author:

> Three features that have no hope of being accommodated within the
> current design are:
>
> - Leading zeros (or any other non-space padding)
> - Octal/hexadecimal encoding
> - Runtime width/alignment specification

It is also quite big and has a heavy dependency, on STLSoft, which might be
too restrictive for use in some projects.

## Boost Spirit.Karma

This is not a formatting library but I decided to include it here for
completeness. As iostreams, it suffers from the problem of mixing
verbatim text with arguments. The library is pretty fast, but slower on
integer formatting than `fmt::format_to` with format string compilation
on Karma\'s own benchmark, see [Converting a hundred million integers to
strings per
second](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html).

# License

{fmt} is distributed under the MIT
[license](https://github.com/fmtlib/fmt/blob/master/LICENSE).

# Documentation License

The [Format String Syntax](https://fmt.dev/latest/syntax/) section
in the documentation is based on the one from Python [string module
documentation](https://docs.python.org/3/library/string.html#module-string).
For this reason, the documentation is distributed under the Python
Software Foundation license available in
[doc/python-license.txt](https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt).
It only applies if you distribute the documentation of {fmt}.

# Maintainers

The {fmt} library is maintained by Victor Zverovich
([vitaut](https://github.com/vitaut)) with contributions from many other
people. See
[Contributors](https://github.com/fmtlib/fmt/graphs/contributors) and
[Releases](https://github.com/fmtlib/fmt/releases) for some of the
names. Let us know if your contribution is not listed or mentioned
incorrectly and we\'ll make it right.

# Security Policy

To report a security issue, please disclose it at [security
advisory](https://github.com/fmtlib/fmt/security/advisories/new).

This project is maintained by a team of volunteers on a
reasonable-effort basis. As such, please give us at least *90* days to
work on a fix before public exposure.


================================================
FILE: doc/ChangeLog-old.md
================================================
# 7.1.3 - 2020-11-24

- Fixed handling of buffer boundaries in `format_to_n`
  (https://github.com/fmtlib/fmt/issues/1996,
  https://github.com/fmtlib/fmt/issues/2029).
- Fixed linkage errors when linking with a shared library
  (https://github.com/fmtlib/fmt/issues/2011).
- Reintroduced ostream support to range formatters
  (https://github.com/fmtlib/fmt/issues/2014).
- Worked around an issue with mixing std versions in gcc
  (https://github.com/fmtlib/fmt/issues/2017).

# 7.1.2 - 2020-11-04

- Fixed floating point formatting with large precision
  (https://github.com/fmtlib/fmt/issues/1976).

# 7.1.1 - 2020-11-01

- Fixed ABI compatibility with 7.0.x
  (https://github.com/fmtlib/fmt/issues/1961).
- Added the `FMT_ARM_ABI_COMPATIBILITY` macro to work around ABI
  incompatibility between GCC and Clang on ARM
  (https://github.com/fmtlib/fmt/issues/1919).
- Worked around a SFINAE bug in GCC 8
  (https://github.com/fmtlib/fmt/issues/1957).
- Fixed linkage errors when building with GCC\'s LTO
  (https://github.com/fmtlib/fmt/issues/1955).
- Fixed a compilation error when building without `__builtin_clz` or
  equivalent (https://github.com/fmtlib/fmt/pull/1968).
  Thanks @tohammer.
- Fixed a sign conversion warning
  (https://github.com/fmtlib/fmt/pull/1964). Thanks @OptoCloud.

# 7.1.0 - 2020-10-25

- Switched from
  [Grisu3](https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf)
  to [Dragonbox](https://github.com/jk-jeon/dragonbox) for the default
  floating-point formatting which gives the shortest decimal
  representation with round-trip guarantee and correct rounding
  (https://github.com/fmtlib/fmt/pull/1882,
  https://github.com/fmtlib/fmt/pull/1887,
  https://github.com/fmtlib/fmt/pull/1894). This makes {fmt}
  up to 20-30x faster than common implementations of
  `std::ostringstream` and `sprintf` on
  [dtoa-benchmark](https://github.com/fmtlib/dtoa-benchmark) and
  faster than double-conversion and Ryū:

  ![](https://user-images.githubusercontent.com/576385/95684665-11719600-0ba8-11eb-8e5b-972ff4e49428.png)

  It is possible to get even better performance at the cost of larger
  binary size by compiling with the `FMT_USE_FULL_CACHE_DRAGONBOX`
  macro set to 1.

  Thanks @jk-jeon.

- Added an experimental unsynchronized file output API which, together
  with [format string
  compilation](https://fmt.dev/latest/api.html#compile-api), can give
  [5-9 times speed up compared to
  fprintf](https://www.zverovich.net/2020/08/04/optimal-file-buffer-size.html)
  on common platforms ([godbolt](https://godbolt.org/z/nsTcG8)):

  ```c++
  #include <fmt/os.h>

  int main() {
    auto f = fmt::output_file("guide");
    f.print("The answer is {}.", 42);
  }
  ```

- Added a formatter for `std::chrono::time_point<system_clock>`
  (https://github.com/fmtlib/fmt/issues/1819,
  https://github.com/fmtlib/fmt/pull/1837). For example
  ([godbolt](https://godbolt.org/z/c4M6fh)):

  ```c++
  #include <fmt/chrono.h>

  int main() {
    auto now = std::chrono::system_clock::now();
    fmt::print("The time is {:%H:%M:%S}.\n", now);
  }
  ```

  Thanks @adamburgess.

- Added support for ranges with non-const `begin`/`end` to `fmt::join`
  (https://github.com/fmtlib/fmt/issues/1784,
  https://github.com/fmtlib/fmt/pull/1786). For example
  ([godbolt](https://godbolt.org/z/jP63Tv)):

  ```c++
  #include <fmt/ranges.h>
  #include <range/v3/view/filter.hpp>

  int main() {
    using std::literals::string_literals::operator""s;
    auto strs = std::array{"a"s, "bb"s, "ccc"s};
    auto range = strs | ranges::views::filter(
      [] (const std::string &x) { return x.size() != 2; }
    );
    fmt::print("{}\n", fmt::join(range, ""));
  }
  ```

  prints \"accc\".

  Thanks @tonyelewis.

- Added a `memory_buffer::append` overload that takes a range
  (https://github.com/fmtlib/fmt/pull/1806). Thanks @BRevzin.

- Improved handling of single code units in `FMT_COMPILE`. For
  example:

  ```c++
  #include <fmt/compile.h>

  char* f(char* buf) {
    return fmt::format_to(buf, FMT_COMPILE("x{}"), 42);
  }
  ```

  compiles to just ([godbolt](https://godbolt.org/z/5vncz3)):

  ```asm
  _Z1fPc:
    movb $120, (%rdi)
    xorl %edx, %edx
    cmpl $42, _ZN3fmt2v76detail10basic_dataIvE23zero_or_powers_of_10_32E+8(%rip)
    movl $3, %eax
    seta %dl
    subl %edx, %eax
    movzwl _ZN3fmt2v76detail10basic_dataIvE6digitsE+84(%rip), %edx
    cltq
    addq %rdi, %rax
    movw %dx, -2(%rax)
    ret
  ```

  Here a single `mov` instruction writes `'x'` (`$120`) to the output
  buffer.

- Added dynamic width support to format string compilation
  (https://github.com/fmtlib/fmt/issues/1809).

- Improved error reporting for unformattable types: now you\'ll get
  the type name directly in the error message instead of the note:

  ```c++
  #include <fmt/core.h>

  struct how_about_no {};

  int main() {
    fmt::print("{}", how_about_no());
  }
  ```

  Error ([godbolt](https://godbolt.org/z/GoxM4e)):

  `fmt/core.h:1438:3: error: static_assert failed due to requirement 'fmt::v7::formattable<how_about_no>()' "Cannot format an argument. To make type T formattable provide a formatter<T> specialization: https://fmt.dev/latest/api.html#udt" ...`

- Added the
  [make_args_checked](https://fmt.dev/7.1.0/api.html#argument-lists)
  function template that allows you to write formatting functions with
  compile-time format string checks and avoid binary code bloat
  ([godbolt](https://godbolt.org/z/PEf9qr)):

  ```c++
  void vlog(const char* file, int line, fmt::string_view format,
            fmt::format_args args) {
    fmt::print("{}: {}: ", file, line);
    fmt::vprint(format, args);
  }

  template <typename S, typename... Args>
  void log(const char* file, int line, const S& format, Args&&... args) {
    vlog(file, line, format,
        fmt::make_args_checked<Args...>(format, args...));
  }

  #define MY_LOG(format, ...) \
    log(__FILE__, __LINE__, FMT_STRING(format), __VA_ARGS__)

  MY_LOG("invalid squishiness: {}", 42);
  ```

- Replaced `snprintf` fallback with a faster internal IEEE 754 `float`
  and `double` formatter for arbitrary precision. For example
  ([godbolt](https://godbolt.org/z/dPhWvj)):

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{:.500}\n", 4.9406564584124654E-324);
  }
  ```

  prints

  `4.9406564584124654417656879286822137236505980261432476442558568250067550727020875186529983636163599237979656469544571773092665671035593979639877479601078187812630071319031140452784581716784898210368871863605699873072305000638740915356498438731247339727316961514003171538539807412623856559117102665855668676818703956031062493194527159149245532930545654440112748012970999954193198940908041656332452475714786901472678015935523861155013480352649347201937902681071074917033322268447533357208324319360923829e-324`.

- Made `format_to_n` and `formatted_size` part of the [core
  API](https://fmt.dev/latest/api.html#core-api)
  ([godbolt](https://godbolt.org/z/sPjY1K)):

  ```c++
  #include <fmt/core.h>

  int main() {
    char buffer[10];
    auto result = fmt::format_to_n(buffer, sizeof(buffer), "{}", 42);
  }
  ```

- Added `fmt::format_to_n` overload with format string compilation
  (https://github.com/fmtlib/fmt/issues/1764,
  https://github.com/fmtlib/fmt/pull/1767,
  https://github.com/fmtlib/fmt/pull/1869). For example
  ([godbolt](https://godbolt.org/z/93h86q)):

  ```c++
  #include <fmt/compile.h>

  int main() {
    char buffer[8];
    fmt::format_to_n(buffer, sizeof(buffer), FMT_COMPILE("{}"), 42);
  }
  ```

  Thanks @Kurkin and @alexezeder.

- Added `fmt::format_to` overload that take `text_style`
  (https://github.com/fmtlib/fmt/issues/1593,
  https://github.com/fmtlib/fmt/issues/1842,
  https://github.com/fmtlib/fmt/pull/1843). For example
  ([godbolt](https://godbolt.org/z/91153r)):

  ```c++
  #include <fmt/color.h>

  int main() {
    std::string out;
    fmt::format_to(std::back_inserter(out),
                   fmt::emphasis::bold | fg(fmt::color::red),
                   "The answer is {}.", 42);
  }
  ```

  Thanks @Naios.

- Made the `'#'` specifier emit trailing zeros in addition to the
  decimal point (https://github.com/fmtlib/fmt/issues/1797).
  For example ([godbolt](https://godbolt.org/z/bhdcW9)):

  ```c++
  #include <fmt/core.h>

  int main() {
    fmt::print("{:#.2g}", 0.5);
  }
  ```

  prints `0.50`.

- Changed the default floating point format to not include `.0` for
  consistency with `std::format` and `std::to_chars`
  (https://github.com/fmtlib/fmt/issues/1893,
  https://github.com/fmtlib/fmt/issues/1943). It is possible
  to get the decimal point and trailing zero with the `#` specifier.

- Fixed an issue with floating-point formatting that could result in
  addition of a non-significant trailing zero in rare cases e.g.
  `1.00e-34` instead of `1.0e-34`
  (https://github.com/fmtlib/fmt/issues/1873,
  https://github.com/fmtlib/fmt/issues/1917).

- Made `fmt::to_string` fallback on `ostream` insertion operator if
  the `formatter` specialization is not provided
  (https://github.com/fmtlib/fmt/issues/1815,
  https://github.com/fmtlib/fmt/pull/1829). Thanks @alexezeder.

- Added support for the append mode to the experimental file API and
  improved `fcntl.h` detection.
  (https://github.com/fmtlib/fmt/pull/1847,
  https://github.com/fmtlib/fmt/pull/1848). Thanks @t-wiser.

- Fixed handling of types that have both an implicit conversion
  operator and an overloaded `ostream` insertion operator
  (https://github.com/fmtlib/fmt/issues/1766).

- Fixed a slicing issue in an internal iterator type
  (https://github.com/fmtlib/fmt/pull/1822). Thanks @BRevzin.

- Fixed an issue in locale-specific integer formatting
  (https://github.com/fmtlib/fmt/issues/1927).

- Fixed handling of exotic code unit types
  (https://github.com/fmtlib/fmt/issues/1870,
  https://github.com/fmtlib/fmt/issues/1932).

- Improved `FMT_ALWAYS_INLINE`
  (https://github.com/fmtlib/fmt/pull/1878). Thanks @jk-jeon.

- Removed dependency on `windows.h`
  (https://github.com/fmtlib/fmt/pull/1900). Thanks @bernd5.

- Optimized counting of decimal digits on MSVC
  (https://github.com/fmtlib/fmt/pull/1890). Thanks @mwinterb.

- Improved documentation
  (https://github.com/fmtlib/fmt/issues/1772,
  https://github.com/fmtlib/fmt/pull/1775,
  https://github.com/fmtlib/fmt/pull/1792,
  https://github.com/fmtlib/fmt/pull/1838,
  https://github.com/fmtlib/fmt/pull/1888,
  https://github.com/fmtlib/fmt/pull/1918,
  https://github.com/fmtlib/fmt/pull/1939).
  Thanks @leolchat, @pepsiman, @Klaim, @ravijanjam, @francesco-st and @udnaan.

- Added the `FMT_REDUCE_INT_INSTANTIATIONS` CMake option that reduces
  the binary code size at the cost of some integer formatting
  performance. This can be useful for extremely memory-constrained
  embedded systems
  (https://github.com/fmtlib/fmt/issues/1778,
  https://github.com/fmtlib/fmt/pull/1781). Thanks @kammce.

- Added the `FMT_USE_INLINE_NAMESPACES` macro to control usage of
  inline namespaces
  (https://github.com/fmtlib/fmt/pull/1945). Thanks @darklukee.

- Improved build configuration
  (https://github.com/fmtlib/fmt/pull/1760,
  https://github.com/fmtlib/fmt/pull/1770,
  https://github.com/fmtlib/fmt/issues/1779,
  https://github.com/fmtlib/fmt/pull/1783,
  https://github.com/fmtlib/fmt/pull/1823).
  Thanks @dvetutnev, @xvitaly, @tambry, @medithe and @martinwuehrer.

- Fixed various warnings and compilation issues
  (https://github.com/fmtlib/fmt/pull/1790,
  https://github.com/fmtlib/fmt/pull/1802,
  https://github.com/fmtlib/fmt/pull/1808,
  https://github.com/fmtlib/fmt/issues/1810,
  https://github.com/fmtlib/fmt/issues/1811,
  https://github.com/fmtlib/fmt/pull/1812,
  https://github.com/fmtlib/fmt/pull/1814,
  https://github.com/fmtlib/fmt/pull/1816,
  https://github.com/fmtlib/fmt/pull/1817,
  https://github.com/fmtlib/fmt/pull/1818,
  https://github.com/fmtlib/fmt/issues/1825,
  https://github.com/fmtlib/fmt/pull/1836,
  https://github.com/fmtlib/fmt/pull/1855,
  https://github.com/fmtlib/fmt/pull/1856,
  https://github.com/fmtlib/fmt/pull/1860,
  https://github.com/fmtlib/fmt/pull/1877,
  https://github.com/fmtlib/fmt/pull/1879,
  https://github.com/fmtlib/fmt/pull/1880,
  https://github.com/fmtlib/fmt/issues/1896,
  https://github.com/fmtlib/fmt/pull/1897,
  https://github.com/fmtlib/fmt/pull/1898,
  https://github.com/fmtlib/fmt/issues/1904,
  https://github.com/fmtlib/fmt/pull/1908,
  https://github.com/fmtlib/fmt/issues/1911,
  https://github.com/fmtlib/fmt/issues/1912,
  https://github.com/fmtlib/fmt/issues/1928,
  https://github.com/fmtlib/fmt/pull/1929,
  https://github.com/fmtlib/fmt/issues/1935,
  https://github.com/fmtlib/fmt/pull/1937,
  https://github.com/fmtlib/fmt/pull/1942,
  https://github.com/fmtlib/fmt/issues/1949).
  Thanks @TheQwertiest, @medithe, @martinwuehrer, @n16h7hunt3r, @Othereum,
  @gsjaardema, @AlexanderLanin, @gcerretani, @chronoxor, @noizefloor,
  @akohlmey, @jk-jeon, @rimathia, @rglarix, @moiwi, @heckad, @MarcDirven.
  @BartSiwek and @darklukee.

# 7.0.3 - 2020-08-06

- Worked around broken `numeric_limits` for 128-bit integers
  (https://github.com/fmtlib/fmt/issues/1787).
- Added error reporting on missing named arguments
  (https://github.com/fmtlib/fmt/issues/1796).
- Stopped using 128-bit integers with clang-cl
  (https://github.com/fmtlib/fmt/pull/1800). Thanks @Kingcom.
- Fixed issues in locale-specific integer formatting
  (https://github.com/fmtlib/fmt/issues/1782,
  https://github.com/fmtlib/fmt/issues/1801).

# 7.0.2 - 2020-07-29

- Worked around broken `numeric_limits` for 128-bit integers
  (https://github.com/fmtlib/fmt/issues/1725).
- Fixed compatibility with CMake 3.4
  (https://github.com/fmtlib/fmt/issues/1779).
- Fixed handling of digit separators in locale-specific formatting
  (https://github.com/fmtlib/fmt/issues/1782).

# 7.0.1 - 2020-07-07

- Updated the inline version namespace name.
- Worked around a gcc bug in mangling of alias templates
  (https://github.com/fmtlib/fmt/issues/1753).
- Fixed a linkage error on Windows
  (https://github.com/fmtlib/fmt/issues/1757). Thanks @Kurkin.
- Fixed minor issues with the documentation.

# 7.0.0 - 2020-07-05

- Reduced the library size. For example, on macOS a stripped test
  binary statically linked with {fmt} [shrank from \~368k to less than
  100k](http://www.zverovich.net/2020/05/21/reducing-library-size.html).

- Added a simpler and more efficient [format string compilation
  API](https://fmt.dev/7.0.0/api.html#compile-api):

  ```c++
  #include <fmt/compile.h>

  // Converts 42 into std::string using the most efficient method and no
  // runtime format string processing.
  std::string s = fmt::format(FMT_COMPILE("{}"), 42);
  ```

  The old `fmt::compile` API is now deprecated.

- Optimized integer formatting: `format_to` with format string
  compilation and a stack-allocated buffer is now [faster than
  to_chars on both libc++ and
  libstdc++](http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html).

- Optimized handling of small format strings. For example,

  ```c++
  fmt::format("Result: {}: ({},{},{},{})", str1, str2, str3, str4, str5)
  ```

  is now \~40% faster
  (https://github.com/fmtlib/fmt/issues/1685).

- Applied extern templates to improve compile times when using the
  core API and `fmt/format.h`
  (https://github.com/fmtlib/fmt/issues/1452). For example,
  on macOS with clang the compile time of a test translation unit
  dropped from 2.3s to 0.3s with `-O2` and from 0.6s to 0.3s with the
  default settings (`-O0`).

  Before (`-O2`):

      % time c++ -c test.cc -I include -std=c++17 -O2
      c++ -c test.cc -I include -std=c++17 -O2  2.22s user 0.08s system 99% cpu 2.311 total

  After (`-O2`):

      % time c++ -c test.cc -I include -std=c++17 -O2
      c++ -c test.cc -I include -std=c++17 -O2  0.26s user 0.04s system 98% cpu 0.303 total

  Before (default):

      % t
Download .txt
gitextract_t95f2iu3/

├── .clang-format
├── .clang-tidy
├── .cmake-format
├── .github/
│   ├── FUNDING.yml
│   ├── dependabot.yml
│   ├── issue_template.md
│   ├── pull_request_template.md
│   └── workflows/
│       ├── cifuzz.yml
│       ├── doc.yml
│       ├── lint.yml
│       ├── linux.yml
│       ├── macos.yml
│       ├── scorecard.yml
│       └── windows.yml
├── .gitignore
├── CMakeLists.txt
├── CONTRIBUTING.md
├── ChangeLog.md
├── LICENSE
├── README.md
├── doc/
│   ├── ChangeLog-old.md
│   ├── LICENSE-exception
│   ├── api.md
│   ├── fmt.css
│   ├── fmt.js
│   ├── get-started.md
│   ├── index.md
│   ├── python-license.txt
│   └── syntax.md
├── include/
│   └── fmt/
│       ├── args.h
│       ├── base.h
│       ├── chrono.h
│       ├── color.h
│       ├── compile.h
│       ├── core.h
│       ├── fmt-c.h
│       ├── format-inl.h
│       ├── format.h
│       ├── os.h
│       ├── ostream.h
│       ├── printf.h
│       ├── ranges.h
│       ├── std.h
│       └── xchar.h
├── src/
│   ├── fmt-c.cc
│   ├── fmt.cc
│   ├── format.cc
│   └── os.cc
├── support/
│   ├── Android.mk
│   ├── AndroidManifest.xml
│   ├── C++.sublime-syntax
│   ├── README
│   ├── Vagrantfile
│   ├── build.gradle
│   ├── check-commits
│   ├── cmake/
│   │   ├── FindSetEnv.cmake
│   │   ├── JoinPaths.cmake
│   │   ├── fmt-config.cmake.in
│   │   └── fmt.pc.in
│   ├── docopt.py
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── mkdocs
│   ├── mkdocs.yml
│   ├── printable.py
│   ├── python/
│   │   └── mkdocstrings_handlers/
│   │       └── cxx/
│   │           ├── __init__.py
│   │           └── templates/
│   │               └── README
│   └── release.py
└── test/
    ├── CMakeLists.txt
    ├── add-subdirectory-test/
    │   ├── CMakeLists.txt
    │   └── main.cc
    ├── args-test.cc
    ├── assert-test.cc
    ├── base-test.cc
    ├── c-test.c
    ├── chrono-test.cc
    ├── color-test.cc
    ├── compile-error-test/
    │   └── CMakeLists.txt
    ├── compile-test.cc
    ├── cuda-test/
    │   ├── CMakeLists.txt
    │   ├── cpp14.cc
    │   └── cuda-cpp14.cu
    ├── detect-stdfs.cc
    ├── enforce-checks-test.cc
    ├── find-package-test/
    │   ├── CMakeLists.txt
    │   └── main.cc
    ├── format-impl-test.cc
    ├── format-test.cc
    ├── fuzzing/
    │   ├── .gitignore
    │   ├── CMakeLists.txt
    │   ├── README.md
    │   ├── build.sh
    │   ├── chrono-duration.cc
    │   ├── chrono-timepoint.cc
    │   ├── float.cc
    │   ├── fuzzer-common.h
    │   ├── main.cc
    │   ├── named-arg.cc
    │   ├── one-arg.cc
    │   └── two-args.cc
    ├── gtest/
    │   ├── .clang-format
    │   ├── CMakeLists.txt
    │   ├── gmock/
    │   │   └── gmock.h
    │   ├── gmock-gtest-all.cc
    │   └── gtest/
    │       ├── gtest-spi.h
    │       └── gtest.h
    ├── gtest-extra-test.cc
    ├── gtest-extra.cc
    ├── gtest-extra.h
    ├── header-only-test.cc
    ├── mock-allocator.h
    ├── module-test.cc
    ├── no-builtin-types-test.cc
    ├── noexception-test.cc
    ├── os-test.cc
    ├── ostream-test.cc
    ├── perf-sanity.cc
    ├── posix-mock-test.cc
    ├── posix-mock.h
    ├── printf-test.cc
    ├── ranges-odr-test.cc
    ├── ranges-test.cc
    ├── scan-test.cc
    ├── scan.h
    ├── static-export-test/
    │   ├── CMakeLists.txt
    │   ├── library.cc
    │   └── main.cc
    ├── std-test.cc
    ├── test-assert.h
    ├── test-main.cc
    ├── unicode-test.cc
    ├── util.cc
    ├── util.h
    └── xchar-test.cc
Copy disabled (too large) Download .txt
Showing preview only (15,448K chars total). Download the full file to get everything.
SYMBOL INDEX (2552 symbols across 72 files)

FILE: include/fmt/args.h
  function FMT_BEGIN_NAMESPACE (line 19) | FMT_BEGIN_NAMESPACE
  function class (line 43) | class dynamic_arg_list {
  function FMT_EXPORT (line 74) | FMT_EXPORT template <typename Context> class dynamic_format_arg_store {
  function pop_one (line 120) | auto pop_one = [](std::vector<basic_format_arg<Context>>* data) {
  function operator (line 133) | operator basic_format_args<Context>() const {
  function clear (line 197) | void clear() {
  function reserve (line 205) | void reserve(size_t new_cap, size_t new_cap_named) {

FILE: include/fmt/base.h
  function max_of (line 336) | struct monostate {
  function namespace (line 359) | namespace detail {
  function native_int128 (line 401) | inline auto map(native_int128 x) -> native_int128 { return x; }
  function native_uint128 (line 402) | inline auto map(native_uint128 x) -> native_uint128 { return x; }
  function native_int128 (line 408) | enum class native_int128 {}
  function native_uint128 (line 409) | enum class native_uint128 {}
  function monostate (line 410) | inline auto map(native_int128) -> monostate { return {}; }
  function monostate (line 411) | inline auto map(native_uint128) -> monostate { return {}; }
  function Int (line 416) | auto to_unsigned(Int value) -> make_unsigned_t<Int> {
  function typename (line 432) | typename T::value_type*> {}
  function FMT_ALWAYS_INLINE (line 446) | constexpr FMT_ALWAYS_INLINE auto narrow(const char* s) -> const char* {
  function namespace (line 460) | namespace adl {
  function FMT_CONSTEXPR (line 479) | FMT_CONSTEXPR auto get_container(OutputIt it) ->
  function FMT_BEGIN_EXPORT (line 490) | FMT_BEGIN_EXPORT
  function size (line 534) | constexpr auto data() const noexcept -> const Char* { return data_; }
  function operator (line 540) | constexpr auto operator[](size_t pos) const noexcept -> const Char& {
  function FMT_CONSTEXPR (line 544) | FMT_CONSTEXPR void remove_prefix(size_t n) noexcept {
  function FMT_CONSTEXPR (line 549) | FMT_CONSTEXPR auto starts_with(basic_string_view sv) const noexcept -> b...
  function FMT_CONSTEXPR (line 552) | FMT_CONSTEXPR auto starts_with(Char c) const noexcept -> bool {
  function FMT_CONSTEXPR (line 555) | FMT_CONSTEXPR auto starts_with(const Char* s) const -> bool {
  function FMT_CONSTEXPR (line 559) | FMT_CONSTEXPR auto compare(basic_string_view other) const -> int {
  function presentation_type (line 633) | enum class presentation_type : unsigned char {
  function type (line 1229) | constexpr auto arg_type(int id) const -> type { return types_[id]; }
  function FMT_CONSTEXPR (line 1231) | FMT_CONSTEXPR auto next_arg_id() -> int {
  function FMT_CONSTEXPR (line 1243) | FMT_CONSTEXPR void check_dynamic_spec(int arg_id) {
  function FMT_CONSTEXPR (line 1252) | FMT_CONSTEXPR arg_ref(basic_string_view<Char> n) : name(n) {}
  function FMT_CONSTEXPR (line 1305) | FMT_CONSTEXPR inline auto parse_align(char c) -> align {
  function FMT_CONSTEXPR (line 1351) | FMT_CONSTEXPR void on_index(int id) {
  function state (line 1428) | enum class state { start, align, sign, hash, zero, width, precision, loc...
  type compile_string (line 1651) | struct compile_string {}
  function FMT_CONSTEXPR (line 1693) | FMT_CONSTEXPR auto on_arg_id(int id) -> int {
  function FMT_CONSTEXPR (line 1697) | FMT_CONSTEXPR auto on_arg_id(basic_string_view<Char> id) -> int {
  function FMT_CONSTEXPR (line 1705) | FMT_CONSTEXPR void on_replacement_field(int id, const Char* begin) {
  function on_error (line 1727) | void on_error(const char* message) {
  function FMT_CONSTEXPR (line 1758) | FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept {
  function size (line 1773) | auto begin() const noexcept -> const T* { return ptr_; }
  function FMT_CONSTEXPR (line 1783) | FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; }
  function FMT_CONSTEXPR (line 1787) | FMT_CONSTEXPR void clear() { size_ = 0; }
  function FMT_CONSTEXPR (line 1791) | FMT_CONSTEXPR void try_resize(size_t count) {
  function FMT_CONSTEXPR (line 1800) | FMT_CONSTEXPR void try_reserve(size_t new_capacity) {
  function FMT_CONSTEXPR (line 1804) | FMT_CONSTEXPR void push_back(const T& value) {
  function append (line 1811) | void append(const U* begin, const U* end) {
  function count (line 1840) | struct buffer_traits {
  function FMT_CONSTEXPR (line 1854) | FMT_CONSTEXPR auto limit(size_t size) -> size_t {
  function flush (line 1873) | void flush() {
  function flush (line 1914) | void flush() {
  type custom_tag (line 2066) | struct custom_tag {}
  function FMT_INLINE (line 2121) | constexpr FMT_INLINE value(float x FMT_BUILTIN) : float_value(x) {}
  function FMT_INLINE (line 2122) | constexpr FMT_INLINE value(double x FMT_BUILTIN) : double_value(x) {}
  function FMT_INLINE (line 2123) | FMT_INLINE value(long double x FMT_BUILTIN) : long_double_value(x) {}
  function FMT_CONSTEXPR (line 2125) | FMT_CONSTEXPR FMT_INLINE value(char_type* x FMT_BUILTIN) {
  function FMT_CONSTEXPR (line 2129) | FMT_CONSTEXPR FMT_INLINE value(const char_type* x FMT_BUILTIN) {
  function FMT_INLINE (line 2142) | constexpr FMT_INLINE value(void* x FMT_BUILTIN) : pointer(x) {}
  function FMT_INLINE (line 2143) | constexpr FMT_INLINE value(const void* x FMT_BUILTIN) : pointer(x) {}
  function FMT_INLINE (line 2144) | constexpr FMT_INLINE value(volatile void* x FMT_BUILTIN)
  function FMT_INLINE (line 2146) | constexpr FMT_INLINE value(const volatile void* x FMT_BUILTIN)
  function FMT_INLINE (line 2148) | constexpr FMT_INLINE value(nullptr_t) : pointer(nullptr) {}
  function value (line 2164) | value(const T& x) : value(format_as(x)) {}
  function value (line 2166) | value(const T& x) : value(formatter<T>::format_as(x)) {}
  function FMT_ALWAYS_INLINE (line 2175) | FMT_ALWAYS_INLINE value(const named_arg_info<char_type>* args, size_t size)
  type ullong (line 2220) | enum : ullong { is_unpacked_bit = 1ULL << 63 }
  type ullong (line 2221) | enum : ullong { has_named_args_bit = 1ULL << 62 }
  type is_output_iterator (line 2226) | struct is_output_iterator
  function enforce_compile_checks (line 2318) | bool enforce_compile_checks() {
  function vprint_mojibake (line 2341) | inline void vprint_mojibake(FILE*, string_view, const format_args&, bool...
  function FMT_BEGIN_EXPORT (line 2367) | FMT_BEGIN_EXPORT
  function FMT_CONSTEXPR (line 2384) | FMT_CONSTEXPR auto operator*() -> basic_appender& { return *this; }
  function custom_ (line 2406) | custom_(custom) {}
  function format (line 2408) | void format(parse_context<char_type>& parse_ctx, Context& ctx) const {
  function FMT_INLINE (line 2431) | FMT_INLINE auto visit(Visitor&& vis) const -> decltype(vis(0)) {
  function FMT_CONSTEXPR (line 2496) | FMT_CONSTEXPR auto type(int index) const -> detail::type {
  function context (line 2562) | auto max_size() const -> int {
  function runtime_format_string (line 2619) | inline auto runtime(string_view s) -> runtime_format_string<> { return {...
  function FMT_ALWAYS_INLINE (line 2640) | FMT_ALWAYS_INLINE fstring(const char (&s)[N]) : str(s, N - 1) {
  function FMT_ALWAYS_INLINE (line 2651) | FMT_ALWAYS_INLINE fstring(const S& s) : str(s) {
  function str (line 2661) | fstring(const S&) : str(S()) {
  function string_view (line 2668) | const string_view&() const { return str; }
  function FMT_ALWAYS_INLINE (line 2702) | constexpr FMT_ALWAYS_INLINE auto make_format_args(T&... args)
  type format_to_result (line 2788) | struct format_to_result {

FILE: include/fmt/chrono.h
  function namespace (line 39) | namespace safe_duration_cast {
  type Factor (line 167) | struct Factor
  function min1 (line 197) | constexpr auto min1 = std::numeric_limits<IntermediateRep>::lowest() /
  function namespace (line 224) | namespace detail {
  function namespace (line 267) | namespace detail {
  function buffer_ (line 289) | buffer_(buf) {}
  function FMT_NORETURN (line 416) | FMT_NORETURN inline void throw_duration_error() {
  function FMT_BEGIN_EXPORT (line 492) | FMT_BEGIN_EXPORT
  function namespace (line 539) | namespace detail {
  function else (line 995) | else if (precision > 0) {
  function write1 (line 1131) | void write1(int value) {
  function write2 (line 1134) | void write2(int value) {
  function write2 (line 1139) | void write2(int value, pad_type pad) {
  function write_year_extended (line 1151) | void write_year_extended(long long year, pad_type pad) {
  function write_year (line 1167) | void write_year(long long year, pad_type pad) {
  function write_utc_offset (line 1171) | void write_utc_offset(long long offset, numeric_system ns) {
  function FMT_CONSTEXPR (line 1217) | FMT_CONSTEXPR void on_text(const Char* begin, const Char* end) {
  function on_abbr_weekday (line 1221) | void on_abbr_weekday() {
  function on_full_weekday (line 1227) | void on_full_weekday() {
  function on_dec0_weekday (line 1233) | void on_dec0_weekday(numeric_system ns) {
  function on_dec1_weekday (line 1237) | void on_dec1_weekday(numeric_system ns) {
  function on_abbr_month (line 1246) | void on_abbr_month() {
  function on_full_month (line 1252) | void on_full_month() {
  function on_datetime (line 1259) | void on_datetime(numeric_system ns) {
  function on_loc_date (line 1274) | void on_loc_date(numeric_system ns) {
  function on_loc_time (line 1280) | void on_loc_time(numeric_system ns) {
  function on_us_date (line 1286) | void on_us_date() {
  function on_iso_date (line 1293) | void on_iso_date() {
  function on_utc_offset (line 1310) | void on_utc_offset(numeric_system ns) { format_utc_offset(tm_, ns); }
  function on_tz_name (line 1311) | void on_tz_name() { format_tz_name(tm_); }
  function on_year (line 1313) | void on_year(numeric_system ns, pad_type pad) {
  function on_short_year (line 1318) | void on_short_year(numeric_system ns) {
  function on_offset_year (line 1323) | void on_offset_year() {
  function on_century (line 1328) | void on_century(numeric_system ns) {
  function on_dec_month (line 1346) | void on_dec_month(numeric_system ns, pad_type pad) {
  function on_dec0_week_of_year (line 1352) | void on_dec0_week_of_year(numeric_system ns, pad_type pad) {
  function on_dec1_week_of_year (line 1358) | void on_dec1_week_of_year(numeric_system ns, pad_type pad) {
  function on_iso_week_of_year (line 1369) | void on_iso_week_of_year(numeric_system ns, pad_type pad) {
  function on_iso_week_based_year (line 1375) | void on_iso_week_based_year() {
  function on_iso_week_based_short_year (line 1378) | void on_iso_week_based_short_year() {
  function on_day_of_year (line 1382) | void on_day_of_year(pad_type pad) {
  function on_day_of_month (line 1392) | void on_day_of_month(numeric_system ns, pad_type pad) {
  function on_24_hour (line 1398) | void on_24_hour(numeric_system ns, pad_type pad) {
  function on_12_hour (line 1403) | void on_12_hour(numeric_system ns, pad_type pad) {
  function on_minute (line 1408) | void on_minute(numeric_system ns, pad_type pad) {
  function on_second (line 1414) | void on_second(numeric_system ns, pad_type pad) {
  function on_12_hour_time (line 1435) | void on_12_hour_time() {
  function on_24_hour_time (line 1447) | void on_24_hour_time() {
  function on_iso_time (line 1452) | void on_iso_time() {
  function on_am_pm (line 1458) | void on_am_pm() {
  function on_duration_value (line 1468) | void on_duration_value() {}
  function on_duration_unit (line 1469) | void on_duration_unit() {}
  function chrono_format_checker (line 1472) | struct chrono_format_checker : null_chrono_spec_handler<chrono_format_ch...
  function FMT_CONSTEXPR (line 1492) | FMT_CONSTEXPR void on_duration_unit() {}
  function class (line 1586) | class get_locale {
  function write_sign (line 1682) | void write_sign() {
  function write_nan (line 1700) | void write_nan() { std::copy_n("nan", 3, out); }
  function on_text (line 1711) | void on_text(const Char* begin, const Char* end) {
  function on_abbr_weekday (line 1716) | void on_abbr_weekday() {}
  function on_full_weekday (line 1717) | void on_full_weekday() {}
  function on_dec0_weekday (line 1718) | void on_dec0_weekday(numeric_system) {}
  function on_dec1_weekday (line 1719) | void on_dec1_weekday(numeric_system) {}
  function on_abbr_month (line 1720) | void on_abbr_month() {}
  function on_full_month (line 1721) | void on_full_month() {}
  function on_datetime (line 1722) | void on_datetime(numeric_system) {}
  function on_loc_date (line 1723) | void on_loc_date(numeric_system) {}
  function on_loc_time (line 1724) | void on_loc_time(numeric_system) {}
  function on_us_date (line 1725) | void on_us_date() {}
  function on_iso_date (line 1726) | void on_iso_date() {}
  function on_utc_offset (line 1727) | void on_utc_offset(numeric_system) {}
  function on_tz_name (line 1728) | void on_tz_name() {}
  function on_year (line 1729) | void on_year(numeric_system, pad_type) {}
  function on_short_year (line 1730) | void on_short_year(numeric_system) {}
  function on_offset_year (line 1731) | void on_offset_year() {}
  function on_century (line 1732) | void on_century(numeric_system) {}
  function on_iso_week_based_year (line 1733) | void on_iso_week_based_year() {}
  function on_iso_week_based_short_year (line 1734) | void on_iso_week_based_short_year() {}
  function on_dec_month (line 1735) | void on_dec_month(numeric_system, pad_type) {}
  function on_dec0_week_of_year (line 1736) | void on_dec0_week_of_year(numeric_system, pad_type) {}
  function on_dec1_week_of_year (line 1737) | void on_dec1_week_of_year(numeric_system, pad_type) {}
  function on_iso_week_of_year (line 1738) | void on_iso_week_of_year(numeric_system, pad_type) {}
  function on_day_of_month (line 1739) | void on_day_of_month(numeric_system, pad_type) {}
  function on_day_of_year (line 1741) | void on_day_of_year(pad_type) {
  function on_24_hour (line 1746) | void on_24_hour(numeric_system ns, pad_type pad) {
  function on_12_hour (line 1755) | void on_12_hour(numeric_system ns, pad_type pad) {
  function on_minute (line 1764) | void on_minute(numeric_system ns, pad_type pad) {
  function on_second (line 1773) | void on_second(numeric_system ns, pad_type pad) {
  function on_12_hour_time (line 1797) | void on_12_hour_time() {
  function on_24_hour_time (line 1802) | void on_24_hour_time() {
  function on_iso_time (line 1814) | void on_iso_time() {
  function on_am_pm (line 1821) | void on_am_pm() {
  function on_duration_value (line 1826) | void on_duration_value() {
  function on_duration_unit (line 1832) | void on_duration_unit() { out = format_duration_unit<Char, Period>(out); }
  function class (line 1845) | class weekday {
  function class (line 1856) | class day {
  function class (line 1867) | class month {
  function class (line 1878) | class year {
  function class (line 1888) | class year_month_day {
  function FMT_CONSTEXPR (line 2110) | FMT_CONSTEXPR void set_localized() { specs_.set_localized(); }

FILE: include/fmt/color.h
  function color (line 16) | enum class color : uint32_t {
  function vprint (line 497) | inline void vprint(FILE* f, text_style ts, string_view fmt, format_args ...
  function T (line 629) | auto styled(const T& value, text_style ts)

FILE: include/fmt/compile.h
  function class (line 21) | class compiled_string {}
  function namespace (line 56) | inline namespace literals {
  function FMT_END_EXPORT (line 63) | FMT_END_EXPORT
  function FMT_INLINE (line 485) | FMT_INLINE auto format_to(OutputIt out, const CompiledFormat& cf,
  function FMT_CONSTEXPR_STRING (line 492) | FMT_CONSTEXPR_STRING auto format(const S&, T&&... args)
  function FMT_CONSTEXPR (line 571) | FMT_CONSTEXPR static_format_result(const S& fmt, T&&... args) {
  function FMT_CONSTEXPR (line 575) | FMT_CONSTEXPR auto str() const -> fmt::string_view { return {data, N - 1...

FILE: include/fmt/fmt-c.h
  type fmt_type (line 18) | typedef enum {
  type fmt_arg (line 30) | typedef struct {
  function fmt_arg (line 56) | static inline fmt_arg fmt_from_int(long long x) {
  function fmt_arg (line 60) | static inline fmt_arg fmt_from_uint(unsigned long long x) {
  function fmt_arg (line 64) | static inline fmt_arg fmt_from_bool(bool x) {
  function fmt_arg (line 68) | static inline fmt_arg fmt_from_char(char x) {
  function fmt_arg (line 72) | static inline fmt_arg fmt_from_float(float x) {
  function fmt_arg (line 76) | static inline fmt_arg fmt_from_double(double x) {
  function fmt_arg (line 80) | static inline fmt_arg fmt_from_long_double(long double x) {
  function fmt_arg (line 84) | static inline fmt_arg fmt_from_str(const char* x) {
  function fmt_arg (line 88) | static inline fmt_arg fmt_from_ptr(const void* x) {
  type fmt_signed_char (line 95) | typedef signed char fmt_signed_char;
  type fmt_signed_char (line 97) | typedef enum {} fmt_signed_char;

FILE: include/fmt/format-inl.h
  function FMT_FUNC (line 47) | FMT_FUNC void assert_fail(const char* file, int line, const char* messag...
  function namespace (line 56) | namespace detail {
  function namespace (line 62) | namespace detail {
  function namespace (line 82) | namespace detail {
  function noexcept (line 227) | inline auto floor_log10_pow2_minus_log10_4_over_3(int e) noexcept -> int {
  function FMT_INLINE_VARIABLE (line 232) | FMT_INLINE_VARIABLE constexpr struct div_small_pow10_infos_struct {
  function noexcept (line 275) | inline auto divide_by_10_to_kappa_plus_1(uint32_t n) noexcept -> uint32_t {
  function noexcept (line 280) | inline auto divide_by_10_to_kappa_plus_1(uint64_t n) noexcept -> uint64_t {
  function float (line 288) | struct cache_accessor<float> {
  function noexcept (line 342) | static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
  function carrier_uint (line 359) | static auto compute_left_endpoint_for_shorter_interval_case(
  function carrier_uint (line 366) | static auto compute_right_endpoint_for_shorter_interval_case(
  function carrier_uint (line 373) | static auto compute_round_up_for_shorter_interval_case(
  function double (line 382) | struct cache_accessor<double> {
  function bigint (line 1398) | struct formatter<detail::bigint> {
  function FMT_FUNC (line 1424) | FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
  function FMT_FUNC (line 1439) | FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_c...
  function FMT_FUNC (line 1450) | FMT_FUNC void report_system_error(int error_code,
  function FMT_FUNC (line 1455) | FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
  function namespace (line 1463) | namespace detail {
  function operator (line 1511) | operator F*() const { return file_; }
  function unget (line 1522) | void unget(char c) {
  function flush (line 1527) | void flush() { fflush(this->file_); }
  function init_buffer (line 1545) | void init_buffer() {
  function span (line 1559) | auto get_write_buffer() const -> span<char> {
  function advance_write_buffer (line 1564) | void advance_write_buffer(size_t size) { this->file_->_IO_write_ptr += s...
  function flush (line 1573) | void flush() { fflush_unlocked(this->file_); }
  function init_buffer (line 1591) | void init_buffer() {
  function advance_write_buffer (line 1610) | void advance_write_buffer(size_t size) {
  function init_buffer (line 1633) | void init_buffer() {}
  function unget (line 1648) | void unget(char c) {
  function grow (line 1686) | static void grow(buffer<char>& base, size_t) {
  function FMT_FUNC (line 1713) | FMT_FUNC auto write_console(int, string_view) -> bool { return false; }
  function FMT_FUNC (line 1719) | FMT_FUNC bool write_console(int fd, string_view text) {
  function FMT_FUNC (line 1728) | FMT_FUNC void vprint_mojibake(std::FILE* f, string_view fmt, format_args...
  function FMT_FUNC (line 1737) | FMT_FUNC void print(std::FILE* f, string_view text) {
  function FMT_FUNC (line 1749) | FMT_FUNC void vprint_buffered(std::FILE* f, string_view fmt, format_args...
  function FMT_FUNC (line 1755) | FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
  function FMT_FUNC (line 1762) | FMT_FUNC void vprintln(std::FILE* f, string_view fmt, format_args args) {
  function FMT_FUNC (line 1769) | FMT_FUNC void vprint(string_view fmt, format_args args) {
  function namespace (line 1773) | namespace detail {
  function FMT_FUNC (line 1812) | FMT_FUNC auto is_printable(uint32_t cp) -> bool {

FILE: include/fmt/format.h
  function namespace (line 151) | namespace std {
  function namespace (line 190) | namespace detail {
  function operator (line 335) | auto operator*(const uint128& lhs, uint32_t rhs)
  function uint128 (line 371) | uint64_t n) noexcept -> uint128& {
  function To (line 421) | auto bit_cast(const From& from) -> To {
  function FMT_INLINE (line 459) | FMT_INLINE void assume(bool condition) {
  function FMT_CONSTEXPR20 (line 474) | __attribute__((no_sanitize("undefined")))
  function T (line 485) | inline auto reserve(basic_appender<T> it, size_t n)
  function FMT_NOINLINE (line 611) | FMT_NOINLINE auto copy_noinline(InputIt begin, InputIt end,
  function FMT_CONSTEXPR (line 633) | FMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e)
  function for_each_codepoint (line 675) | void for_each_codepoint(string_view s, F f) {
  function true_type (line 732) | struct is_integral<native_int128> : std::true_type {}
  function true_type (line 733) | struct is_integral<uint128_t> : std::true_type {}
  type float128 (line 759) | struct float128 {}
  function true_type (line 765) | struct is_floating_point<float128> : std::true_type {}
  function deallocate (line 791) | void deallocate(T* p, size_t) { free(p); }
  function FMT_CONSTEXPR20 (line 840) | FMT_CONSTEXPR20 void deallocate() {
  function FMT_CONSTEXPR20 (line 845) | static FMT_CONSTEXPR20 void grow(detail::buffer<T>& buf, size_t size) {
  function FMT_CONSTEXPR20 (line 879) | FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); }
  function FMT_CONSTEXPR (line 942) | FMT_CONSTEXPR void resize(size_t count) { this->try_resize(count); }
  function reserve (line 945) | void reserve(size_t new_capacity) { this->try_reserve(new_capacity); }
  function append (line 949) | void append(const ContiguousRange& range) {
  function string (line 957) | auto to_string(const basic_memory_buffer<char, SIZE>& buf)
  function class (line 965) | class writer {
  function class (line 987) | class string_buffer {
  function FMT_END_EXPORT (line 1014) | FMT_END_EXPORT
  function namespace (line 1020) | namespace detail {
  function Char (line 1038) | constexpr auto compile_string_to_view(basic_string_view<Char> s)
  function noexcept (line 1071) | inline auto digits2(size_t value) noexcept -> const char* {
  function noexcept (line 1086) | inline auto digits2_i(size_t value) noexcept -> const char* {
  function Char (line 1099) | auto getsign(sign s) -> Char {
  function FMT_CONSTEXPR (line 1119) | FMT_CONSTEXPR inline auto count_digits(native_uint128 n) -> int {
  function FMT_CONSTEXPR20 (line 1147) | FMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int {
  function FMT_INLINE (line 1174) | FMT_INLINE auto do_count_digits(uint32_t n) -> int {
  function FMT_CONSTEXPR20 (line 1197) | FMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int {
  function wchar_t (line 1225) | inline auto thousands_sep(locale_ref loc) -> thousands_sep_result<wchar_...
  function Char (line 1231) | auto decimal_point(locale_ref loc) -> Char {
  function wchar_t (line 1234) | inline auto decimal_point(locale_ref loc) -> wchar_t {
  function FMT_API (line 1245) | FMT_API auto decimal_point_impl(locale_ref) -> wchar_t;
  function write2digits (line 1259) | void write2digits(Char* out, size_t value) {
  function write2digits_i (line 1270) | void write2digits_i(Char* out, size_t value) {
  function class (line 1370) | class utf8_to_utf16 {
  function FMT_INLINE (line 1465) | FMT_INLINE auto umul128(uint64_t x, uint64_t y) noexcept -> uint128 {
  function namespace (line 1493) | namespace dragonbox {
  function float (line 1532) | struct float_info<float> {
  function double (line 1544) | struct float_info<double> {
  function FMT_CONSTEXPR (line 1710) | FMT_CONSTEXPR inline auto multiply(uint64_t lhs, uint64_t rhs) -> uint64...
  function FMT_CONSTEXPR (line 1727) | FMT_CONSTEXPR inline auto operator*(fp x, fp y) -> fp {
  function T (line 1736) | auto convert_float(T value) -> convert_float_result<T> {
  function FMT_NOINLINE (line 1750) | FMT_NOINLINE auto fill(OutputIt it, size_t n,
  function OutputIt (line 1792) | auto write_bytes(OutputIt out, string_view bytes,
  function write (line 1806) | auto write = [=](reserve_iterator<OutputIt> it) {
  type next_state (line 1951) | struct next_state {
  type size_padding (line 2119) | struct size_padding {
  function FMT_INLINE (line 2140) | FMT_INLINE auto write_int(OutputIt out, write_int_arg<T> arg,
  function FMT_NOINLINE (line 2204) | FMT_NOINLINE auto write_int_noinline(OutputIt out,
  function FMT_INLINE (line 2215) | FMT_INLINE auto write(basic_appender<Char> out, T value,
  function FMT_INLINE (line 2229) | FMT_INLINE auto write(OutputIt out, T value,
  function OutputIt (line 2237) | auto write(OutputIt out, Char value, const format_specs& specs,
  type bounded_output_iterator (line 2302) | struct bounded_output_iterator {
  function operator (line 2307) | auto operator++() -> bounded_output_iterator& {
  type big_decimal_fp (line 2444) | struct big_decimal_fp {
  function write (line 2666) | auto write = [=](reserve_iterator<OutputIt> it) {
  function FMT_CONSTEXPR (line 2720) | FMT_CONSTEXPR auto signbit(T value) -> bool {
  function class (line 2740) | class bigint {
  function FMT_CONSTEXPR (line 2845) | FMT_CONSTEXPR auto num_bigits() const -> int {
  function FMT_CONSTEXPR20 (line 2906) | FMT_CONSTEXPR20 void assign_pow10(int exp) {
  function FMT_CONSTEXPR20 (line 2923) | FMT_CONSTEXPR20 void square() {
  function FMT_CONSTEXPR (line 2953) | FMT_CONSTEXPR void align(const bigint& other) {
  function FMT_CONSTEXPR (line 2966) | FMT_CONSTEXPR auto divmod_assign(const bigint& divisor) -> int {
  type dragon (line 2981) | enum dragon {
  function format_hexfloat (line 3126) | void format_hexfloat(Float value, format_specs specs,
  function format_hexfloat (line 3206) | void format_hexfloat(Float value, format_specs specs,
  function OutputIt (line 3523) | auto write(OutputIt out, T value, format_specs specs,
  function OutputIt (line 3682) | auto write(OutputIt out, T value, const format_specs& specs = {},
  type dynamic_spec_getter (line 3775) | struct dynamic_spec_getter {
  function handle_dynamic_spec (line 3789) | void handle_dynamic_spec(
  function value (line 3809) | static_named_arg(const T& v) : value(v) {}
  function on_text (line 3841) | void on_text(const Char* begin, const Char* end) {
  function FMT_CONSTEXPR (line 3846) | FMT_CONSTEXPR auto on_arg_id(int id) -> int {
  function FMT_CONSTEXPR (line 3850) | FMT_CONSTEXPR auto on_arg_id(basic_string_view<Char> id) -> int {
  function FMT_INLINE (line 3857) | FMT_INLINE void on_replacement_field(int id, const Char*) {
  function FMT_NORETURN (line 3881) | FMT_NORETURN void on_error(const char* message) { report_error(message); }
  function generic_context (line 3931) | constexpr auto arg(int id) const -> basic_format_arg<generic_context> {
  function generic_context (line 3934) | auto arg(basic_string_view<Char> name) const
  function advance_to (line 3944) | void advance_to(iterator it) {
  function Enum (line 4060) | auto underlying(Enum e) noexcept -> underlying_t<Enum> {
  function namespace (line 4064) | namespace enums {
  function format (line 4071) | struct bytes {
  function namespace (line 4201) | inline namespace literals {
  function class (line 4231) | class format_int {
  function FMT_INLINE (line 4417) | FMT_INLINE auto format(format_string<T...> fmt, T&&... args)
  function FMT_CONSTEXPR_STRING (line 4430) | FMT_CONSTEXPR_STRING auto to_string(T value) -> std::string {
  function FMT_CONSTEXPR_STRING (line 4438) | FMT_CONSTEXPR_STRING auto to_string(const T& value)
  function FMT_CONSTEXPR_STRING (line 4445) | FMT_CONSTEXPR_STRING auto to_string(const T& value)

FILE: include/fmt/os.h
  function FMT_API (line 115) | FMT_API const std::error_category& system_category() noexcept;
  function buffered_file (line 159) | inline auto system_category() noexcept -> const std::error_category& {
  function descriptor (line 202) | inline auto get() const noexcept -> FILE* { return file_; }
  function pipe (line 304) | struct FMT_API pipe {
  function detail (line 314) | auto getpagesize() -> long;
  function class (line 359) | class ostream : private detail::buffer<char> {

FILE: include/fmt/ostream.h
  function FMT_BEGIN_NAMESPACE (line 33) | FMT_BEGIN_NAMESPACE
  function T (line 112) | auto streamed(const T& value) -> detail::streamed_view<T> {
  function vprint (line 116) | inline void vprint(std::ostream& os, string_view fmt, format_args args) {

FILE: include/fmt/printf.h
  function advance_to (line 41) | void advance_to(basic_appender<Char>) {}
  function basic_printf_context (line 45) | auto arg(int id) const -> basic_format_arg<basic_printf_context> {
  function namespace (line 50) | namespace detail {
  type int_checker (line 78) | struct int_checker
  type printf_precision_handler (line 86) | struct printf_precision_handler {
  type is_zero_int (line 102) | struct is_zero_int {
  function bool (line 116) | struct make_unsigned_or_bool<bool> {
  function arg_ (line 176) | arg_(arg) {}
  function class (line 196) | class printf_width_handler {
  function get_arg (line 414) | auto get_arg = [&](int arg_index) {

FILE: include/fmt/ranges.h
  function namespace (line 33) | namespace detail {
  function FMT_CONSTEXPR (line 142) | static FMT_CONSTEXPR auto size() -> size_t { return sizeof...(N); }
  function namespace (line 210) | namespace tuple {
  function FMT_EXPORT (line 281) | FMT_EXPORT
  type is_tuple_formattable (line 288) | struct is_tuple_formattable {
  type is_range (line 345) | struct is_range {
  function namespace (line 350) | namespace detail {
  function FMT_CONSTEXPR (line 408) | FMT_CONSTEXPR auto underlying() -> detail::range_formatter_type<Char, T>& {
  function FMT_CONSTEXPR (line 507) | FMT_CONSTEXPR formatter() {
  function typename (line 730) | const ->

FILE: include/fmt/std.h
  function FMT_BEGIN_NAMESPACE (line 80) | FMT_BEGIN_NAMESPACE

FILE: include/fmt/xchar.h
  function FMT_BEGIN_NAMESPACE (line 23) | FMT_BEGIN_NAMESPACE
  function FMT_ALWAYS_INLINE (line 97) | FMT_ALWAYS_INLINE basic_fstring(const S& s) : str_(s) {
  function str_ (line 104) | basic_fstring(const S&) : str_(S()) {
  function wchar_t (line 121) | inline auto runtime(wstring_view s) -> runtime_format_string<wchar_t> {
  function namespace (line 132) | inline namespace literals {
  function vprint (line 302) | inline void vprint(std::FILE* f, wstring_view fmt, wformat_args args) {
  function vprint (line 310) | inline void vprint(wstring_view fmt, wformat_args args) {
  function vprint (line 345) | inline void vprint(std::wostream& os, wstring_view fmt, wformat_args arg...
  function wstring (line 363) | auto to_wstring(const T& value) -> std::wstring {

FILE: src/fmt-c.cc
  function fmt_vformat (line 12) | int fmt_vformat(char* buffer, size_t size, const char* fmt,

FILE: src/format.cc
  type detail (line 17) | namespace detail {

FILE: src/os.cc
  function convert_rwcount (line 70) | inline unsigned convert_rwcount(size_t count) {
  class system_message (line 74) | class system_message {
    method system_message (line 75) | system_message(const system_message&) = delete;
    method is_whitespace (line 81) | static bool is_whitespace(wchar_t c) noexcept {
    method system_message (line 86) | explicit system_message(unsigned long error_code)
  class utf8_system_category (line 106) | class utf8_system_category final : public std::error_category {
    method message (line 109) | std::string message(int error_code) const override {
  function convert_rwcount (line 126) | inline auto convert_rwcount(size_t count) -> size_t { return count; }
  function FMT_API (line 135) | FMT_API const std::error_category& system_category() noexcept {
  function vwindows_error (line 140) | std::system_error vwindows_error(int err_code, string_view format_str,
  function FMT_CATCH (line 159) | FMT_CATCH(...) {}
  function report_windows_error (line 163) | void report_windows_error(int error_code, const char* message) noexcept {
  type stat (line 261) | struct stat
  function file (line 330) | file file::open_windows_file(wcstring_view path, int oflag) {
  function getpagesize (line 360) | auto getpagesize() -> long {

FILE: support/docopt.py
  class DocoptLanguageError (line 17) | class DocoptLanguageError(Exception):
  class DocoptExit (line 22) | class DocoptExit(SystemExit):
    method __init__ (line 28) | def __init__(self, message=''):
  class Pattern (line 32) | class Pattern(object):
    method __eq__ (line 34) | def __eq__(self, other):
    method __hash__ (line 37) | def __hash__(self):
    method fix (line 40) | def fix(self):
    method fix_identities (line 45) | def fix_identities(self, uniq=None):
    method fix_repeating_arguments (line 57) | def fix_repeating_arguments(self):
  function transform (line 72) | def transform(pattern):
  class LeafPattern (line 99) | class LeafPattern(Pattern):
    method __init__ (line 103) | def __init__(self, name, value=None):
    method __repr__ (line 106) | def __repr__(self):
    method flat (line 109) | def flat(self, *types):
    method match (line 112) | def match(self, left, collected=None):
  class BranchPattern (line 133) | class BranchPattern(Pattern):
    method __init__ (line 137) | def __init__(self, *children):
    method __repr__ (line 140) | def __repr__(self):
    method flat (line 144) | def flat(self, *types):
  class Argument (line 150) | class Argument(LeafPattern):
    method single_match (line 152) | def single_match(self, left):
    method parse (line 159) | def parse(class_, source):
  class Command (line 165) | class Command(Argument):
    method __init__ (line 167) | def __init__(self, name, value=False):
    method single_match (line 170) | def single_match(self, left):
  class Option (line 180) | class Option(LeafPattern):
    method __init__ (line 182) | def __init__(self, short=None, long=None, argcount=0, value=False):
    method parse (line 188) | def parse(class_, option_description):
    method single_match (line 204) | def single_match(self, left):
    method name (line 211) | def name(self):
    method __repr__ (line 214) | def __repr__(self):
  class Required (line 219) | class Required(BranchPattern):
    method match (line 221) | def match(self, left, collected=None):
  class Optional (line 232) | class Optional(BranchPattern):
    method match (line 234) | def match(self, left, collected=None):
  class OptionsShortcut (line 241) | class OptionsShortcut(Optional):
  class OneOrMore (line 246) | class OneOrMore(BranchPattern):
    method match (line 248) | def match(self, left, collected=None):
  class Either (line 268) | class Either(BranchPattern):
    method match (line 270) | def match(self, left, collected=None):
  class Tokens (line 282) | class Tokens(list):
    method __init__ (line 284) | def __init__(self, source, error=DocoptExit):
    method from_pattern (line 289) | def from_pattern(source):
    method move (line 294) | def move(self):
    method current (line 297) | def current(self):
  function parse_long (line 301) | def parse_long(tokens, options):
  function parse_shorts (line 334) | def parse_shorts(tokens, options):
  function parse_pattern (line 369) | def parse_pattern(source, options):
  function parse_expr (line 377) | def parse_expr(tokens, options):
  function parse_seq (line 390) | def parse_seq(tokens, options):
  function parse_atom (line 402) | def parse_atom(tokens, options):
  function parse_argv (line 428) | def parse_argv(tokens, options, options_first=False):
  function parse_defaults (line 452) | def parse_defaults(doc):
  function parse_section (line 464) | def parse_section(name, source):
  function formal_usage (line 470) | def formal_usage(section):
  function extras (line 476) | def extras(help, version, options, doc):
  class Dict (line 485) | class Dict(dict):
    method __repr__ (line 486) | def __repr__(self):
  function docopt (line 490) | def docopt(doc, argv=None, help=True, version=None, options_first=False):

FILE: support/printable.py
  function to_ranges (line 18) | def to_ranges(iter):
  function get_escaped (line 30) | def get_escaped(codepoints):
  function get_file (line 35) | def get_file(f):
  function get_codepoints (line 44) | def get_codepoints(f):
  function compress_singletons (line 73) | def compress_singletons(singletons):
  function compress_normal (line 89) | def compress_normal(normal):
  function print_singletons (line 117) | def print_singletons(uppers, lowers, uppersname, lowersname):
  function print_normal (line 127) | def print_normal(normal, normalname):
  function main (line 133) | def main():

FILE: support/python/mkdocstrings_handlers/cxx/__init__.py
  class Definition (line 24) | class Definition:
    method __init__ (line 27) | def __init__(
  function escape_html (line 63) | def escape_html(s: str) -> str:
  function convert_node (line 68) | def convert_node(
  function doxyxml2html (line 87) | def doxyxml2html(nodes: "list[ET.Element]"):
  function convert_template_params (line 106) | def convert_template_params(node: ET.Element) -> "list[Definition] | None":
  function get_description (line 125) | def get_description(node: ET.Element) -> list[ET.Element]:
  function normalize_type (line 131) | def normalize_type(type_: str) -> str:
  function convert_type (line 136) | def convert_type(type_: "ET.Element | None") -> "str | None":
  function convert_params (line 152) | def convert_params(func: ET.Element) -> list[Definition]:
  function convert_return_type (line 164) | def convert_return_type(d: Definition, node: ET.Element) -> None:
  function render_param (line 175) | def render_param(param: Definition) -> str:
  function render_decl (line 181) | def render_decl(d: Definition) -> str:
  class CxxHandler (line 231) | class CxxHandler(BaseHandler):
    method __init__ (line 236) | def __init__(
    method collect_compound (line 313) | def collect_compound(self, identifier: str, cls: "list[ET.Element]") -...
    method collect (line 358) | def collect(self, identifier: str, options: "Mapping[str, Any]") -> De...
    method render (line 423) | def render(
  function get_handler (line 447) | def get_handler(

FILE: support/release.py
  class Git (line 19) | class Git:
    method __init__ (line 20) | def __init__(self, dir):
    method call (line 23) | def call(self, method, args, **kwargs):
    method add (line 26) | def add(self, *args):
    method checkout (line 29) | def checkout(self, *args):
    method clean (line 32) | def clean(self, *args):
    method clone (line 35) | def clone(self, *args):
    method commit (line 38) | def commit(self, *args):
    method pull (line 41) | def pull(self, *args):
    method push (line 44) | def push(self, *args):
    method reset (line 47) | def reset(self, *args):
    method update (line 50) | def update(self, *args):
  function clean_checkout (line 57) | def clean_checkout(repo, branch):
  class Runner (line 63) | class Runner:
    method __init__ (line 64) | def __init__(self, cwd):
    method __call__ (line 67) | def __call__(self, *args, **kwargs):
  function create_build_env (line 72) | def create_build_env():

FILE: test/add-subdirectory-test/main.cc
  function main (line 3) | int main(int argc, char** argv) {

FILE: test/args-test.cc
  function TEST (line 14) | TEST(args_test, basic) {
  function TEST (line 22) | TEST(args_test, strings_and_refs) {
  type custom_type (line 35) | struct custom_type {
  type formatter<custom_type> (line 40) | struct formatter<custom_type> {
    method parse (line 41) | auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
    method format (line 46) | auto format(const custom_type& p, FormatContext& ctx) const
  function FMT_END_NAMESPACE (line 51) | FMT_END_NAMESPACE
  type to_stringable (line 66) | struct to_stringable {
    method to_string_view (line 67) | auto to_string_view(to_stringable) -> fmt::string_view { return {}; }
  type formatter<to_stringable> (line 71) | struct formatter<to_stringable> {
    method parse (line 72) | auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
    method format (line 76) | auto format(to_stringable, format_context& ctx) const -> decltype(ctx....
  function FMT_END_NAMESPACE (line 80) | FMT_END_NAMESPACE
  function TEST (line 90) | TEST(args_test, named_int) {
  function TEST (line 96) | TEST(args_test, named_strings) {
  function TEST (line 105) | TEST(args_test, named_arg_by_ref) {
  function TEST (line 113) | TEST(args_test, named_custom_format) {
  function TEST (line 126) | TEST(args_test, clear) {
  function TEST (line 143) | TEST(args_test, reserve) {
  type copy_throwable (line 152) | struct copy_throwable {
    method copy_throwable (line 153) | copy_throwable() {}
    method copy_throwable (line 154) | copy_throwable(const copy_throwable&) { throw "deal with it"; }
  type formatter<copy_throwable> (line 158) | struct formatter<copy_throwable> {
    method parse (line 159) | auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
    method format (line 162) | auto format(copy_throwable, format_context& ctx) const
  function FMT_END_NAMESPACE (line 167) | FMT_END_NAMESPACE
  function TEST (line 179) | TEST(args_test, move_constructor) {
  function TEST (line 190) | TEST(args_test, size) {

FILE: test/assert-test.cc
  function TEST (line 15) | TEST(assert_test, fail) {
  function TEST (line 23) | TEST(assert_test, dangling_else) {

FILE: test/base-test.cc
  function copy (line 37) | auto copy(fmt::string_view s, fmt::appender out) -> fmt::appender {
  function TEST (line 42) | TEST(string_view_test, value_type) {
  function TEST (line 46) | TEST(string_view_test, ctor) {
  function TEST (line 54) | TEST(string_view_test, length) {
  function check_op (line 62) | void check_op() {
  function TEST (line 74) | TEST(string_view_test, compare) {
  function TEST (line 101) | TEST(string_view_test, from_constexpr_fixed_string) {
  function TEST (line 118) | TEST(buffer_test, noncopyable) {
  function TEST (line 123) | TEST(buffer_test, nonmoveable) {
  function TEST (line 128) | TEST(buffer_test, indestructible) {
  type mock_buffer (line 133) | struct mock_buffer final : fmt::detail::buffer<T> {
    method grow (line 136) | static void grow(fmt::detail::buffer<T>& buf, size_t capacity) {
    method mock_buffer (line 141) | mock_buffer(T* data = nullptr, size_t buf_capacity = 0)
  function TEST (line 150) | TEST(buffer_test, ctor) {
  function TEST (line 174) | TEST(buffer_test, access) {
  function TEST (line 185) | TEST(buffer_test, try_resize) {
  function TEST (line 205) | TEST(buffer_test, try_resize_partial) {
  function TEST (line 214) | TEST(buffer_test, clear) {
  function TEST (line 223) | TEST(buffer_test, append) {
  function TEST (line 238) | TEST(buffer_test, append_partial) {
  function TEST (line 252) | TEST(buffer_test, append_allocates_enough_storage) {
  function TEST (line 261) | TEST(base_test, is_locking) {
  function TEST (line 265) | TEST(base_test, is_output_iterator) {
  function TEST (line 278) | TEST(base_test, is_back_insert_iterator) {
  function TEST (line 285) | TEST(base_test, get_buffer) {
  type test_struct (line 295) | struct test_struct {}
  function parse (line 299) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begi...
  function format (line 303) | auto format(test_struct, format_context& ctx) const -> decltype(ctx.out(...
  type mock_visitor (line 313) | struct mock_visitor {
    type result (line 314) | struct result {
    method mock_visitor (line 318) | mock_visitor() {
  type visit_type (line 333) | struct visit_type {
  function TEST (line 374) | TEST(arg_test, format_args) {
  function TEST (line 379) | TEST(arg_test, char_arg) { CHECK_ARG('a', 'a'); }
  function TEST (line 381) | TEST(arg_test, string_arg) {
  function TEST (line 391) | TEST(arg_test, pointer_arg) {
  function TEST (line 398) | TEST(arg_test, volatile_pointer_arg) {
  type check_custom (line 406) | struct check_custom {
    type test_buffer (line 409) | struct test_buffer final : fmt::detail::buffer<char> {
      method test_buffer (line 411) | test_buffer()
  function TEST (line 423) | TEST(arg_test, custom_arg) {
  function TEST (line 432) | TEST(arg_test, visit_invalid_arg) {
  class numeric_arg_test (line 438) | class numeric_arg_test : public testing::Test {}
  function test_value (line 451) | auto test_value() -> T {
  function test_value (line 457) | auto test_value() -> T {
  function TYPED_TEST (line 461) | TYPED_TEST(numeric_arg_test, make_and_visit) {
  type arg_id_result (line 469) | enum class arg_id_result { none, index, name }
  type test_arg_id_handler (line 471) | struct test_arg_id_handler {
    method on_index (line 476) | constexpr void on_index(int i) {
    method on_name (line 481) | constexpr void on_name(fmt::string_view n) {
  function parse_arg_id (line 488) | constexpr auto parse_arg_id(const char (&s)[N]) -> test_arg_id_handler {
  function TEST (line 494) | TEST(base_test, constexpr_parse_arg_id) {
  function parse_test_specs (line 501) | constexpr auto parse_test_specs(const char (&s)[N]) {
  function TEST (line 510) | TEST(base_test, constexpr_parse_format_specs) {
  type test_format_string_handler (line 527) | struct test_format_string_handler {
    method on_text (line 528) | constexpr void on_text(const char*, const char*) {}
    method on_arg_id (line 530) | constexpr auto on_arg_id() -> int { return 0; }
    method on_arg_id (line 532) | constexpr auto on_arg_id(T) -> int { return 0; }
    method on_replacement_field (line 534) | constexpr void on_replacement_field(int, const char*) {}
    method on_format_specs (line 536) | constexpr auto on_format_specs(int, const char* begin, const char*) ->...
    method on_error (line 541) | constexpr void on_error(const char*) { error = true; }
  function parse_string (line 546) | constexpr auto parse_string(const char (&s)[N]) -> bool {
  function TEST (line 552) | TEST(base_test, constexpr_parse_format_string) {
  type enabled_formatter (line 563) | struct enabled_formatter {}
  type enabled_ptr_formatter (line 564) | struct enabled_ptr_formatter {}
  type disabled_formatter (line 565) | struct disabled_formatter {}
  type disabled_formatter_convertible (line 566) | struct disabled_formatter_convertible {
  type formatter<enabled_formatter> (line 571) | struct formatter<enabled_formatter> {
    method parse (line 572) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 575) | auto format(enabled_formatter, format_context& ctx) const
  type formatter<enabled_ptr_formatter*> (line 581) | struct formatter<enabled_ptr_formatter*> {
    method parse (line 582) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 585) | auto format(enabled_ptr_formatter*, format_context& ctx) const
  type nonconst_formattable (line 593) | struct nonconst_formattable {}
  type formatter<const_formattable> (line 596) | struct formatter<const_formattable> {
    method parse (line 597) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 601) | auto format(const const_formattable&, format_context& ctx) const
  type formatter<nonconst_formattable> (line 607) | struct formatter<nonconst_formattable> {
    method parse (line 608) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 612) | auto format(nonconst_formattable&, format_context& ctx) const
  function FMT_END_NAMESPACE (line 617) | FMT_END_NAMESPACE
  type convertible_to_pointer_formattable (line 623) | struct convertible_to_pointer_formattable {
  type formatter<convertible_to_pointer_formattable> (line 628) | struct formatter<convertible_to_pointer_formattable> {
    method parse (line 629) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 633) | auto format(convertible_to_pointer_formattable, format_context& ctx) c...
  function TEST (line 642) | TEST(base_test, is_formattable) {
  function TEST (line 684) | TEST(base_test, formattable_concept) {
  function TEST (line 696) | TEST(base_test, format_to) {
  function TEST (line 702) | TEST(base_test, format_to_array) {
  function TEST (line 749) | TEST(base_test, adl_check) {
  type implicitly_convertible_to_string_view (line 755) | struct implicitly_convertible_to_string_view {
  function TEST (line 759) | TEST(base_test, no_implicit_conversion_to_string_view) {
  type explicitly_convertible_to_string_view (line 764) | struct explicitly_convertible_to_string_view {
  function TEST (line 768) | TEST(base_test, format_explicitly_convertible_to_string_view) {
  type implicitly_convertible_to_std_string_view (line 776) | struct implicitly_convertible_to_std_string_view {
  function TEST (line 780) | TEST(base_test, no_implicit_conversion_to_std_string_view) {
  type explicitly_convertible_to_std_string_view (line 785) | struct explicitly_convertible_to_std_string_view {
  function TEST (line 789) | TEST(base_test, format_explicitly_convertible_to_std_string_view) {
  function TEST (line 798) | TEST(base_test, has_formatter) {
  function TEST (line 804) | TEST(base_test, format_nonconst) {
  function TEST (line 810) | TEST(base_test, throw_in_buffer_dtor) {
  type convertible_to_any_type_with_member_x (line 833) | struct convertible_to_any_type_with_member_x {
  type formatter<convertible_to_any_type_with_member_x> (line 842) | struct formatter<convertible_to_any_type_with_member_x> {
    method parse (line 843) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 847) | auto format(convertible_to_any_type_with_member_x, format_context& ctx...
  function FMT_END_NAMESPACE (line 854) | FMT_END_NAMESPACE
  type custom_container (line 863) | struct custom_container {
    method size (line 868) | auto size() const -> size_t { return 0; }
    method resize (line 869) | void resize(size_t) {}
    method push_back (line 871) | void push_back(char) {}
  type is_contiguous<custom_container> (line 876) | struct is_contiguous<custom_container> : std::true_type {}
  function FMT_END_NAMESPACE (line 877) | FMT_END_NAMESPACE
  function TEST (line 884) | TEST(base_test, no_repeated_format_string_conversions) {
  function TEST (line 898) | TEST(base_test, format_context_accessors) {

FILE: test/c-test.c
  function fmt_vformat_cstr (line 33) | static inline int fmt_vformat_cstr(char* buf, size_t size, int result) {
  function test_types (line 44) | void test_types(void) {
  function test_zero_arguments (line 75) | void test_zero_arguments(void) {
  function test_buffer_size_query (line 81) | void test_buffer_size_query(void) {
  function main (line 86) | int main(void) {

FILE: test/chrono-test.cc
  function make_tm (line 34) | auto make_tm() -> std::tm {
  function make_hour (line 40) | auto make_hour(int h) -> std::tm {
  function make_minute (line 46) | auto make_minute(int m) -> std::tm {
  function make_second (line 52) | auto make_second(int s) -> std::tm {
  function system_strftime (line 58) | auto system_strftime(const std::string& format, const std::tm* timeptr,
  function make_tm (line 76) | FMT_CONSTEXPR auto make_tm(int year, int mon, int mday, int hour, int min,
  function TEST (line 88) | TEST(chrono_test, format_tm) {
  function TEST (line 171) | TEST(chrono_test, format_tm_future) {
  function TEST (line 189) | TEST(chrono_test, format_tm_past) {
  function TEST (line 225) | TEST(chrono_test, grow_buffer) {
  function TEST (line 233) | TEST(chrono_test, format_to_empty_container) {
  function TEST (line 241) | TEST(chrono_test, gmtime) {
  function test_time (line 256) | void test_time(Time time) {
  function TEST (line 318) | TEST(chrono_test, sys_time) {
  function TEST (line 328) | TEST(chrono_test, local_time) {
  function set_tm_gmtoff (line 339) | auto set_tm_gmtoff(T& time, long offset) -> bool {
  function set_tm_gmtoff (line 344) | auto set_tm_gmtoff(T&, long) -> bool {
  function TEST (line 348) | TEST(chrono_test, tm) {
  function TEST (line 368) | TEST(chrono_test, daylight_savings_time_end) {
  function TEST (line 380) | TEST(chrono_test, format_default) {
  function TEST (line 423) | TEST(chrono_test, duration_align) {
  function TEST (line 439) | TEST(chrono_test, tm_align) {
  function TEST (line 453) | TEST(chrono_test, tp_align) {
  function TEST (line 468) | TEST(chrono_test, format_specs) {
  function TEST (line 500) | TEST(chrono_test, invalid_specs) {
  function format_tm (line 544) | auto format_tm(const std::tm& time, fmt::string_view spec,
  function TEST (line 553) | TEST(chrono_test, locale) {
  function TEST (line 577) | TEST(chrono_test, format_default_fp) {
  function TEST (line 585) | TEST(chrono_test, format_precision) {
  function TEST (line 598) | TEST(chrono_test, format_full_specs) {
  function TEST (line 615) | TEST(chrono_test, format_simple_q) {
  function TEST (line 626) | TEST(chrono_test, format_precision_q) {
  function TEST (line 634) | TEST(chrono_test, format_full_specs_q) {
  function TEST (line 651) | TEST(chrono_test, invalid_width_id) {
  function TEST (line 656) | TEST(chrono_test, invalid_colons) {
  function TEST (line 661) | TEST(chrono_test, negative_durations) {
  function TEST (line 676) | TEST(chrono_test, special_durations) {
  function TEST (line 695) | TEST(chrono_test, unsigned_duration) {
  function TEST (line 699) | TEST(chrono_test, weekday) {
  function TEST (line 721) | TEST(chrono_test, cpp20_duration_subsecond_support) {
  function TEST (line 811) | TEST(chrono_test, utc_clock) {
  function TEST (line 819) | TEST(chrono_test, timestamp_ratios) {
  function TEST (line 849) | TEST(chrono_test, timestamp_sub_seconds) {
  function TEST (line 893) | TEST(chrono_test, glibc_extensions) {
  function TEST (line 987) | TEST(chrono_test, out_of_range) {
  function TEST (line 992) | TEST(chrono_test, year_month_day) {

FILE: test/color-test.cc
  function TEST (line 14) | TEST(color_test, text_style) {
  function TEST (line 64) | TEST(color_test, format) {
  function TEST (line 127) | TEST(color_test, format_to) {
  function TEST (line 135) | TEST(color_test, print) {

FILE: test/compile-test.cc
  function TEST (line 20) | TEST(compile_test, compile_fallback) {
  type type_with_get (line 26) | struct type_with_get {
  type formatter<type_with_get> (line 31) | struct formatter<type_with_get> : formatter<int> {
    method format (line 33) | auto format(type_with_get, FormatContext& ctx) const -> decltype(ctx.o...
  function FMT_END_NAMESPACE (line 37) | FMT_END_NAMESPACE
  type test_formattable (line 44) | struct test_formattable {}
  type formatter<test_formattable> (line 47) | struct formatter<test_formattable> : formatter<const char*> {
    method parse (line 49) | constexpr auto parse(format_parse_context& ctx) {
    method format (line 57) | constexpr auto format(test_formattable, FormatContext& ctx) const
  function FMT_END_NAMESPACE (line 63) | FMT_END_NAMESPACE
  function TEST (line 80) | TEST(compile_test, format_escape) {
  function TEST (line 91) | TEST(compile_test, format_specs) {
  function TEST (line 98) | TEST(compile_test, dynamic_format_specs) {
  function TEST (line 107) | TEST(compile_test, manual_ordering) {
  function TEST (line 123) | TEST(compile_test, named) {
  function TEST (line 167) | TEST(compile_test, join) {
  function TEST (line 172) | TEST(compile_test, format_to) {
  function TEST (line 182) | TEST(compile_test, format_to_n) {
  function TEST (line 193) | TEST(compile_test, output_iterators) {
  function TEST (line 209) | TEST(compile_test, constexpr_formatted_size) {
  function TEST (line 229) | TEST(compile_test, static_format) {
  function TEST (line 236) | TEST(compile_test, text_and_arg) {
  function TEST (line 241) | TEST(compile_test, unknown_format_fallback) {
  function TEST (line 262) | TEST(compile_test, empty) { EXPECT_EQ("", fmt::format(FMT_COMPILE(""))); }
  type to_stringable (line 264) | struct to_stringable {
    method to_string_view (line 265) | fmt::string_view to_string_view(to_stringable) { return {}; }
  type formatter<to_stringable> (line 269) | struct formatter<to_stringable> {
    method parse (line 270) | auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {
    method format (line 275) | auto format(const to_stringable&, FormatContext& ctx) -> decltype(ctx....
  function FMT_END_NAMESPACE (line 279) | FMT_END_NAMESPACE
  type std_context_test (line 285) | struct std_context_test {}
  type formatter<std_context_test> (line 288) | struct formatter<std_context_test> : formatter<int> {
    method format (line 289) | auto format(std_context_test, format_context& ctx) const
  function FMT_END_NAMESPACE (line 294) | FMT_END_NAMESPACE
  function TEST (line 306) | TEST(compile_test, compile_format_string_literal) {
  function check_is_compiled_string (line 314) | auto check_is_compiled_string(const S&) -> bool {
  function TEST (line 318) | TEST(compile_test, is_compiled_string) {
  type test_string (line 334) | struct test_string {
  function test_format (line 342) | consteval auto test_format(auto format, const Args&... args) {
  function TEST (line 348) | TEST(compile_time_formatting_test, bool) {
  function TEST (line 355) | TEST(compile_time_formatting_test, integer) {
  function TEST (line 386) | TEST(compile_time_formatting_test, char) {
  function TEST (line 393) | TEST(compile_time_formatting_test, string) {
  function TEST (line 402) | TEST(compile_time_formatting_test, combination) {
  function TEST (line 409) | TEST(compile_time_formatting_test, custom_type) {
  function TEST (line 414) | TEST(compile_time_formatting_test, multibyte_fill) {
  function TEST (line 418) | TEST(compile_time_formatting_test, floating_point) {
  function TEST (line 454) | TEST(compile_test, constexpr_string_format) {

FILE: test/cuda-test/cpp14.cc
  function make_message_cpp (line 9) | auto make_message_cpp() -> std::string {

FILE: test/enforce-checks-test.cc
  function test_format_api (line 21) | void test_format_api() {
  function test_chrono (line 39) | void test_chrono() {
  function test_text_style (line 44) | void test_text_style() {
  function test_range (line 55) | void test_range() {
  function main (line 60) | int main() {

FILE: test/find-package-test/main.cc
  function main (line 3) | int main(int argc, char** argv) {

FILE: test/format-impl-test.cc
  function TEST (line 26) | TEST(bigint_test, construct) {
  function TEST (line 32) | TEST(bigint_test, compare) {
  function TEST (line 46) | TEST(bigint_test, add_compare) {
  function TEST (line 72) | TEST(bigint_test, shift_left) {
  function TEST (line 82) | TEST(bigint_test, multiply) {
  function TEST (line 109) | TEST(bigint_test, square) {
  function TEST (line 127) | TEST(bigint_test, divmod_assign_zero_divisor) {
  function TEST (line 133) | TEST(bigint_test, divmod_assign_self) {
  function TEST (line 138) | TEST(bigint_test, divmod_assign_unaligned) {
  function TEST (line 150) | TEST(bigint_test, divmod_assign) {
  function run_double_tests (line 170) | void run_double_tests() {
  function TEST (line 179) | TEST(fp_test, double_tests) {
  function TEST (line 183) | TEST(fp_test, normalize) {
  function TEST (line 190) | TEST(fp_test, multiply) {
  function TEST (line 199) | TEST(fp_test, dragonbox_max_k) {
  function TEST (line 215) | TEST(format_impl_test, format_error_code) {
  function test_count_digits (line 250) | void test_count_digits() {
  function TEST (line 259) | TEST(format_impl_test, count_digits) {
  function TEST (line 264) | TEST(format_impl_test, countl_zero) {
  function TEST (line 275) | TEST(format_impl_test, write_float128) {
  type double_double (line 282) | struct double_double {
    method double_double (line 286) | constexpr explicit double_double(double a_val = 0, double b_val = 0)
  function format_as (line 293) | auto format_as(double_double d) -> double { return d; }
  type slow_float (line 299) | struct slow_float {
    method slow_float (line 302) | constexpr explicit slow_float(float val = 0) : value(val) {}
  function format_as (line 307) | auto format_as(slow_float f) -> float { return f; }
  type std (line 309) | namespace std {
    type numeric_limits<double_double> (line 310) | struct numeric_limits<double_double> {
    type numeric_limits<slow_float> (line 317) | struct numeric_limits<slow_float> : numeric_limits<float> {}
  function FMT_BEGIN_NAMESPACE (line 320) | FMT_BEGIN_NAMESPACE
  function FMT_END_NAMESPACE (line 332) | FMT_END_NAMESPACE
  function TEST (line 341) | TEST(format_impl_test, write_dragon_even) {
  function TEST (line 351) | TEST(format_impl_test, write_console_signature) {
  function unicode_is_surrogate (line 359) | constexpr auto unicode_is_surrogate(uint32_t c) -> bool {
  function utf8_encode (line 363) | FMT_CONSTEXPR auto utf8_encode(char* s, uint32_t c) -> char* {
  function TEST (line 386) | TEST(format_impl_test, utf8_decode_decode_all) {
  function TEST (line 402) | TEST(format_impl_test, utf8_decode_out_of_range) {
  function TEST (line 415) | TEST(format_impl_test, utf8_decode_surrogate_halves) {
  function TEST (line 427) | TEST(format_impl_test, utf8_decode_non_canonical_encodings) {
  function TEST (line 449) | TEST(format_impl_test, utf8_decode_bogus_byte_sequences) {
  function TEST (line 472) | TEST(format_impl_test, to_utf8) {

FILE: test/format-test.cc
  function TEST (line 57) | TEST(uint128_test, ctor) {
  function TEST (line 65) | TEST(uint128_test, shift) {
  function TEST (line 80) | TEST(uint128_test, minus) {
  function TEST (line 85) | TEST(uint128_test, plus_assign) {
  function TEST (line 94) | TEST(uint128_test, multiply) {
  function check_isfinite (line 100) | void check_isfinite() {
  function TEST (line 116) | TEST(float_test, isfinite) {
  function check_no_fp_exception (line 123) | void check_no_fp_exception() {
  function check_isnan (line 131) | void check_isnan() {
  function TEST (line 156) | TEST(float_test, isnan) {
  type uint32_pair (line 163) | struct uint32_pair {
  function TEST (line 167) | TEST(util_test, bit_cast) {
  function increment (line 175) | void increment(char* s) {
  function TEST (line 185) | TEST(util_test, increment) {
  type minimal_container (line 199) | struct minimal_container {
    method push_back (line 201) | void push_back(char) {}
  function TEST (line 204) | TEST(util_test, copy) {
  function TEST (line 210) | TEST(util_test, parse_nonnegative_int) {
  function TEST (line 220) | TEST(util_test, utf8_to_utf16) {
  function TEST (line 233) | TEST(util_test, utf8_to_utf16_empty_string) {
  function TEST (line 240) | TEST(util_test, allocator_ref) {
  function TEST (line 266) | TEST(util_test, format_system_error) {
  function TEST (line 289) | TEST(util_test, system_error) {
  function TEST (line 307) | TEST(util_test, report_system_error) {
  function TEST (line 315) | TEST(memory_buffer_test, ctor) {
  function TEST (line 323) | TEST(memory_buffer_test, move_ctor_inline_buffer) {
  function TEST (line 347) | TEST(memory_buffer_test, move_ctor_dynamic_buffer) {
  function TEST (line 366) | TEST(memory_buffer_test, move_ctor_inline_buffer_non_propagating) {
  function TEST (line 394) | TEST(memory_buffer_test, move_ctor_dynamic_buffer_non_propagating) {
  function check_move_assign_buffer (line 413) | void check_move_assign_buffer(const char* str,
  function TEST (line 423) | TEST(memory_buffer_test, move_assignment) {
  function TEST (line 444) | TEST(memory_buffer_test, grow) {
  function TEST (line 464) | TEST(memory_buffer_test, allocator) {
  function TEST (line 481) | TEST(memory_buffer_test, exception_in_deallocate) {
  class max_size_allocator (line 507) | class max_size_allocator : public Allocator {
    method max_size (line 510) | size_t max_size() const noexcept { return MaxSize; }
    method value_type (line 511) | value_type* allocate(size_t n) {
    method deallocate (line 518) | void deallocate(value_type* p, size_t n) {
  function TEST (line 524) | TEST(memory_buffer_test, max_size_allocator) {
  function TEST (line 533) | TEST(memory_buffer_test, max_size_allocator_overflow) {
  function TEST (line 539) | TEST(memory_buffer_test, back_insert_iterator) {
  function TEST (line 545) | TEST(format_test, digits2_alignment) {
  function TEST (line 551) | TEST(format_test, exception_from_lib) {
  function TEST (line 555) | TEST(format_test, escape) {
  function TEST (line 570) | TEST(format_test, unmatched_braces) {
  function TEST (line 579) | TEST(format_test, no_args) { EXPECT_EQ(fmt::format("test"), "test"); }
  function TEST (line 581) | TEST(format_test, args_in_different_positions) {
  function TEST (line 591) | TEST(format_test, arg_errors) {
  function TEST (line 616) | TEST(format_test, display_width_precision) {
  type test_format (line 620) | struct test_format {
    method format (line 622) | static auto format(fmt::string_view fmt, const T&... args) -> std::str...
  type test_format<0> (line 627) | struct test_format<0> {
    method format (line 629) | static auto format(fmt::string_view fmt, const T&... args) -> std::str...
  function TEST (line 634) | TEST(format_test, many_args) {
  function TEST (line 646) | TEST(format_test, named_arg) {
  function TEST (line 675) | TEST(format_test, auto_arg_index) {
  function TEST (line 692) | TEST(format_test, empty_specs) { EXPECT_EQ(fmt::format("{0:}", 42), "42"...
  function TEST (line 694) | TEST(format_test, left_align) {
  function TEST (line 711) | TEST(format_test, right_align) {
  function TEST (line 728) | TEST(format_test, center_align) {
  function TEST (line 745) | TEST(format_test, fill) {
  function TEST (line 771) | TEST(format_test, plus_sign) {
  function TEST (line 797) | TEST(format_test, minus_sign) {
  function TEST (line 820) | TEST(format_test, space_sign) {
  function TEST (line 843) | TEST(format_test, hash_flag) {
  function TEST (line 894) | TEST(format_test, zero_flag) {
  function TEST (line 915) | TEST(format_test, zero_flag_and_align) {
  function TEST (line 926) | TEST(format_test, width) {
  function TEST (line 953) | TEST(format_test, debug_presentation) {
  function TEST (line 982) | TEST(format_test, runtime_width) {
  function TEST (line 1037) | TEST(format_test, exponent_range) {
  function TEST (line 1041) | TEST(format_test, precision) {
  function TEST (line 1190) | TEST(format_test, large_precision) {
  function TEST (line 1216) | TEST(format_test, utf8_precision) {
  function TEST (line 1221) | TEST(format_test, runtime_precision) {
  function TEST (line 1309) | TEST(format_test, format_bool) {
  function TEST (line 1321) | TEST(format_test, format_short) {
  function check_unknown_types (line 1329) | void check_unknown_types(const T& value, const char* types, const char*) {
  function TEST (line 1343) | TEST(format_test, format_int) {
  function TEST (line 1350) | TEST(format_test, format_bin) {
  function TEST (line 1371) | TEST(format_test, format_dec) {
  function TEST (line 1412) | TEST(format_test, format_hex) {
  function TEST (line 1453) | TEST(format_test, format_oct) {
  function TEST (line 1491) | TEST(format_test, format_int_locale) {
  function TEST (line 1495) | TEST(format_test, format_float) {
  function TEST (line 1500) | TEST(format_test, format_double) {
  function TEST (line 1565) | TEST(format_test, precision_rounding) {
  function TEST (line 1585) | TEST(format_test, prettify_float) {
  function TEST (line 1600) | TEST(format_test, format_nan) {
  function TEST (line 1621) | TEST(format_test, format_infinity) {
  function TEST (line 1638) | TEST(format_test, format_long_double) {
  function TEST (line 1662) | TEST(format_test, format_char) {
  function TEST (line 1681) | TEST(format_test, format_volatile_char) {
  function TEST (line 1686) | TEST(format_test, format_unsigned_char) {
  function TEST (line 1691) | TEST(format_test, format_cstring) {
  function function_pointer_test (line 1704) | void function_pointer_test(int, double, std::string) {}
  function TEST (line 1706) | TEST(format_test, format_pointer) {
  function TEST (line 1725) | TEST(format_test, write_uintptr_fallback) {
  type color (line 1736) | enum class color { red, green, blue }
  type test_ns (line 1738) | namespace test_ns {
    type color (line 1739) | enum class color { red, green, blue }
  function TEST (line 1743) | TEST(format_test, format_enum_class) {
  function TEST (line 1748) | TEST(format_test, format_string) {
  function TEST (line 1758) | TEST(format_test, format_string_view) {
  type string_viewable (line 1765) | struct string_viewable {}
  type formatter<string_viewable> (line 1768) | struct formatter<string_viewable> : formatter<std::string_view> {
    method format (line 1769) | auto format(string_viewable, format_context& ctx) const
  function FMT_END_NAMESPACE (line 1774) | FMT_END_NAMESPACE
  type explicitly_convertible_to_std_string_view (line 1781) | struct explicitly_convertible_to_std_string_view {
  type fmt::formatter<explicitly_convertible_to_std_string_view> (line 1786) | struct fmt::formatter<explicitly_convertible_to_std_string_view>
    method format (line 1788) | auto format(explicitly_convertible_to_std_string_view v,
  function TEST (line 1794) | TEST(format_test, format_explicitly_convertible_to_std_string_view) {
  type convertible_to_std_string_view (line 1799) | struct convertible_to_std_string_view {
  class formatter<convertible_to_std_string_view> (line 1804) | class formatter<convertible_to_std_string_view>
  function FMT_END_NAMESPACE (line 1806) | FMT_END_NAMESPACE
  class Answer (line 1814) | class Answer {}
  type formatter<date> (line 1817) | struct formatter<date> {
    method parse (line 1819) | FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
    method format (line 1825) | auto format(const date& d, format_context& ctx) const -> decltype(ctx....
  type formatter<Answer> (line 1832) | struct formatter<Answer> : formatter<int> {
    method format (line 1834) | auto format(Answer, FormatContext& ctx) const -> decltype(ctx.out()) {
  function FMT_END_NAMESPACE (line 1838) | FMT_END_NAMESPACE
  function TEST (line 1847) | TEST(format_test, format_to_custom) {
  function TEST (line 1854) | TEST(format_test, format_string_from_speed_test) {
  function TEST (line 1860) | TEST(format_test, format_examples) {
  function TEST (line 1921) | TEST(format_test, print) {
  function TEST (line 1930) | TEST(format_test, big_print) {
  type deadlockable (line 1938) | struct deadlockable {
  type formatter<deadlockable> (line 1944) | struct formatter<deadlockable> {
    method parse (line 1945) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 1949) | auto format(const deadlockable& d, format_context& ctx) const
  type locking<deadlockable> (line 1956) | struct locking<deadlockable> : std::true_type {}
  function FMT_END_NAMESPACE (line 1957) | FMT_END_NAMESPACE
  function TEST (line 1978) | TEST(format_test, variadic) {
  function TEST (line 1982) | TEST(format_test, bytes) {
  function TEST (line 1988) | TEST(format_test, group_digits_view) {
  type point (line 1997) | struct point {
  type formatter<point> (line 2002) | struct formatter<point> : nested_formatter<double> {
    method format (line 2003) | auto format(point p, format_context& ctx) const -> decltype(ctx.out()) {
  function FMT_END_NAMESPACE (line 2010) | FMT_END_NAMESPACE
  type test_enum (line 2017) | enum test_enum { foo, bar }
  function format_as (line 2018) | auto format_as(test_enum e) -> int { return e; }
  function vformat_message (line 2020) | std::string vformat_message(int id, const char* format, fmt::format_args...
  function format_message (line 2028) | std::string format_message(int id, const char* format, const Args&... ar...
  function TEST (line 2033) | TEST(format_test, format_message_example) {
  function print_error (line 2039) | void print_error(const char* file, int line, const char* format,
  function TEST (line 2045) | TEST(format_test, unpacked_args) {
  function TEST (line 2051) | TEST(format_test, compile_time_string) {
  function TEST (line 2076) | TEST(format_test, custom_format_compile_time_string) {
  function TEST (line 2086) | TEST(format_test, named_arg_udl) {
  function TEST (line 2100) | TEST(format_test, formatter_not_specialized) {
  type big_enum (line 2107) | enum big_enum : unsigned long long { big_enum_value = 5000000000ULL }
  function format_as (line 2108) | auto format_as(big_enum e) -> unsigned long long { return e; }
  function TEST (line 2110) | TEST(format_test, strong_enum) {
  function TEST (line 2117) | TEST(format_test, non_null_terminated_format_string) {
  type adl_test (line 2121) | namespace adl_test {
    type fmt (line 2122) | namespace fmt {
      type detail (line 2123) | namespace detail {
        type foo (line 2124) | struct foo {}
    type string (line 2496) | struct string : std::string {}
    function format_as (line 2497) | auto format_as(const string& s) -> std::string { return s; }
  function FMT_BEGIN_NAMESPACE (line 2130) | FMT_BEGIN_NAMESPACE
  function FMT_END_NAMESPACE (line 2138) | FMT_END_NAMESPACE
  function TEST (line 2155) | TEST(format_test, output_iterators) {
  function TEST (line 2168) | TEST(format_test, fill_via_appender) {
  function TEST (line 2175) | TEST(format_test, formatted_size) {
  function TEST (line 2180) | TEST(format_test, format_to_no_args) {
  function TEST (line 2186) | TEST(format_test, format_to) {
  function TEST (line 2194) | TEST(format_test, format_to_memory_buffer) {
  function TEST (line 2200) | TEST(format_test, format_to_vector) {
  type nongrowing_container (line 2206) | struct nongrowing_container {
    method push_back (line 2208) | void push_back(char) { throw std::runtime_error("can't take it any mor...
  function TEST (line 2211) | TEST(format_test, format_to_propagates_exceptions) {
  function TEST (line 2217) | TEST(format_test, format_to_n) {
  type test_output_iterator (line 2253) | struct test_output_iterator {
  function TEST (line 2274) | TEST(format_test, format_to_n_output_iterator) {
  function TEST (line 2280) | TEST(format_test, vformat_to) {
  function TEST (line 2292) | TEST(format_test, char_traits_not_ambiguous) {
  type check_back_appender (line 2304) | struct check_back_appender {}
  type formatter<check_back_appender> (line 2307) | struct formatter<check_back_appender> {
    method parse (line 2308) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 2313) | auto format(check_back_appender, Context& ctx) const -> decltype(ctx.o...
  function FMT_END_NAMESPACE (line 2321) | FMT_END_NAMESPACE
  type test (line 2327) | namespace test {
    type scoped_enum_as_int (line 2328) | enum class scoped_enum_as_int {}
    function format_as (line 2329) | auto format_as(scoped_enum_as_int) -> int { return 42; }
    type scoped_enum_as_string_view (line 2331) | enum class scoped_enum_as_string_view {}
    function format_as (line 2332) | auto format_as(scoped_enum_as_string_view) -> fmt::string_view { retur...
    type scoped_enum_as_string (line 2334) | enum class scoped_enum_as_string {}
    function format_as (line 2335) | auto format_as(scoped_enum_as_string) -> std::string { return "foo"; }
    type struct_as_int (line 2337) | struct struct_as_int {}
    function format_as (line 2338) | auto format_as(struct_as_int) -> int { return 42; }
    type struct_as_const_reference (line 2340) | struct struct_as_const_reference {
    function format_as (line 2343) | auto format_as(const struct_as_const_reference& s) -> const std::strin...
  function TEST (line 2348) | TEST(format_test, format_as) {
  function TEST (line 2356) | TEST(format_test, format_as_to_string) {
  function check_enabled_formatter (line 2363) | auto check_enabled_formatter() -> bool {
  function check_enabled_formatters (line 2369) | void check_enabled_formatters() {
  function TEST (line 2374) | TEST(format_test, test_formatters_enabled) {
  function TEST (line 2392) | TEST(format_int_test, data) {
  function TEST (line 2397) | TEST(format_int_test, format_int) {
  class format_facet (line 2414) | class format_facet : public fmt::format_facet<std::locale> {
    type int_formatter (line 2416) | struct int_formatter {
  function TEST (line 2440) | TEST(format_test, format_facet) {
  function TEST (line 2446) | TEST(format_test, format_facet_separator) {
  function TEST (line 2456) | TEST(format_test, format_facet_grouping) {
  function TEST (line 2462) | TEST(format_test, format_named_arg_with_locale) {
  function TEST (line 2467) | TEST(format_test, format_locale) {
  type convertible_to_nonconst_cstring (line 2477) | struct convertible_to_nonconst_cstring {
  type formatter<convertible_to_nonconst_cstring> (line 2486) | struct formatter<convertible_to_nonconst_cstring> : formatter<char*> {}
  function FMT_END_NAMESPACE (line 2487) | FMT_END_NAMESPACE
  type adl_test (line 2493) | namespace adl_test {
    type fmt (line 2122) | namespace fmt {
      type detail (line 2123) | namespace detail {
        type foo (line 2124) | struct foo {}
    type string (line 2496) | struct string : std::string {}
    function format_as (line 2497) | auto format_as(const string& s) -> std::string { return s; }
  function TEST (line 2501) | TEST(format_test, adl) {
  type convertible_to_int (line 2515) | struct convertible_to_int {
  type convertible_to_cstring (line 2519) | struct convertible_to_cstring {
  type formatter<convertible_to_int> (line 2524) | struct formatter<convertible_to_int> {
    method parse (line 2525) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 2528) | auto format(convertible_to_int, format_context& ctx) const
  type formatter<convertible_to_cstring> (line 2536) | struct formatter<convertible_to_cstring> {
    method parse (line 2537) | FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.be...
    method format (line 2540) | auto format(convertible_to_cstring, format_context& ctx) const
  function FMT_END_NAMESPACE (line 2547) | FMT_END_NAMESPACE
  type ustring (line 2554) | struct ustring {
  type formatter<ustring> (line 2564) | struct formatter<ustring> : formatter<std::string> {
    method format (line 2565) | auto format(const ustring&, format_context& ctx) const
  function FMT_END_NAMESPACE (line 2570) | FMT_END_NAMESPACE
  function TEST (line 2576) | TEST(format_test, writer) {
  function TEST (line 2601) | TEST(format_test, invalid_glibc_buffer) {
  type incomplete_type (line 2615) | struct incomplete_type
  type formatter<incomplete_type> (line 2619) | struct formatter<incomplete_type> : formatter<int> {
  function FMT_END_NAMESPACE (line 2622) | FMT_END_NAMESPACE
  type incomplete_type (line 2628) | struct incomplete_type {}

FILE: test/fuzzing/chrono-duration.cc
  function invoke_inner (line 11) | void invoke_inner(fmt::string_view format_str, Rep rep) {
  function invoke_outer (line 26) | void invoke_outer(const uint8_t* data, size_t size, int period) {
  function LLVMFuzzerTestOneInput (line 89) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/fuzzing/chrono-timepoint.cc
  function doit (line 11) | void doit(const uint8_t* data, size_t size) {
  function LLVMFuzzerTestOneInput (line 26) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/fuzzing/float.cc
  function check_round_trip (line 13) | void check_round_trip(fmt::string_view format_str, double value) {
  function LLVMFuzzerTestOneInput (line 31) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/fuzzing/fuzzer-common.h
  function Item (line 42) | Item assign_from_buf(const std::uint8_t* data) {
  type data_to_string (line 53) | struct data_to_string {

FILE: test/fuzzing/main.cc
  function main (line 9) | int main(int argc, char** argv) {

FILE: test/fuzzing/named-arg.cc
  function invoke_fmt (line 13) | void invoke_fmt(const uint8_t* data, size_t size, unsigned arg_name_size) {
  function invoke (line 40) | void invoke(int type, Callback callback) {
  function LLVMFuzzerTestOneInput (line 89) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/fuzzing/one-arg.cc
  function T (line 11) | const T* from_repr(const Repr& r) {
  function invoke_fmt (line 20) | void invoke_fmt(const uint8_t* data, size_t size) {
  function LLVMFuzzerTestOneInput (line 40) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/fuzzing/two-args.cc
  function invoke_fmt (line 13) | void invoke_fmt(const uint8_t* data, size_t size) {
  function invoke (line 36) | void invoke(int index, Callback callback) {
  function LLVMFuzzerTestOneInput (line 89) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: test/gtest-extra-test.cc
  class single_evaluation_test (line 21) | class single_evaluation_test : public ::testing::Test {
    method single_evaluation_test (line 23) | single_evaluation_test() {
  function do_nothing (line 42) | void do_nothing() {}
  function FMT_NORETURN (line 44) | FMT_NORETURN void throw_exception() { throw std::runtime_error("test"); }
  function FMT_NORETURN (line 46) | FMT_NORETURN void throw_system_error() {
  function TEST_F (line 52) | TEST_F(single_evaluation_test, failed_expect_throw_msg) {
  function TEST_F (line 60) | TEST_F(single_evaluation_test, failed_expect_system_error) {
  function TEST_F (line 67) | TEST_F(single_evaluation_test, exception_tests) {
  function TEST_F (line 107) | TEST_F(single_evaluation_test, system_error_tests) {
  function TEST_F (line 150) | TEST_F(single_evaluation_test, failed_expect_write) {
  function TEST_F (line 157) | TEST_F(single_evaluation_test, write_tests) {
  function TEST (line 183) | TEST(gtest_extra_test, expect_write) {
  function TEST (line 192) | TEST(gtest_extra_test, expect_write_streaming) {
  function TEST (line 202) | TEST(gtest_extra_test, expect_throw_no_unreachable_code_warning) {
  function TEST (line 295) | TEST(gtest_extra_test, expect_throw_msg_streaming) {
  function TEST (line 304) | TEST(gtest_extra_test, expect_system_error_streaming) {
  function TEST (line 318) | TEST(output_redirect_test, scoped_redirect) {
  function TEST (line 333) | TEST(output_redirect_test, flush_error_in_ctor) {
  function TEST (line 348) | TEST(output_redirect_test, dup_error_in_ctor) {
  function TEST (line 360) | TEST(output_redirect_test, restore_and_read) {
  function TEST (line 374) | TEST(output_redirect_test, flush_error_in_restore_and_read) {
  function TEST (line 388) | TEST(output_redirect_test, error_in_dtor) {

FILE: test/gtest-extra.cc
  function read (line 68) | std::string read(file& f, size_t count) {

FILE: test/gtest-extra.h
  function std (line 60) | inline std::string system_error_message(int error_code,
  function class (line 74) | class output_redirect {
  function class (line 120) | class suppress_assert {

FILE: test/gtest/gmock-gtest-all.cc
  type testing (line 115) | namespace testing {
    function ScopedFakeTestPartResultReporter (line 126) | class GTEST_API_ ScopedFakeTestPartResultReporter
    type internal (line 165) | namespace internal {
      function SingleFailureChecker (line 172) | class GTEST_API_ SingleFailureChecker {
      function GetRandomSeedFromFlag (line 521) | inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
      function GetNextRandomSeed (line 537) | inline int GetNextRandomSeed(int seed) {
      class GTestFlagSaver (line 547) | class GTestFlagSaver {
        method GTestFlagSaver (line 550) | GTestFlagSaver() {
      function CountIf (line 677) | inline int CountIf(const Container& c, Predicate predicate) {
      function ForEach (line 690) | void ForEach(const Container& c, Functor functor) {
      function E (line 697) | inline E GetElementOr(const std::vector<E>& v, int i, E default_valu...
      function ShuffleRange (line 707) | void ShuffleRange(internal::Random* random, int begin, int end,
      function Shuffle (line 731) | inline void Shuffle(internal::Random* random, std::vector<E>* v) {
      function Delete (line 738) | static void Delete(T* x) {
      class TestPropertyKeyIs (line 745) | class TestPropertyKeyIs {
        method TestPropertyKeyIs (line 750) | explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
      function UnitTestOptions (line 771) | class GTEST_API_ UnitTestOptions {
      class OsStackTraceGetterInterface (line 809) | class OsStackTraceGetterInterface {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      class OsStackTraceGetter (line 836) | class OsStackTraceGetter : public OsStackTraceGetterInterface {
        method OsStackTraceGetter (line 838) | OsStackTraceGetter() {}
      type TraceInfo (line 858) | struct TraceInfo {
      class DefaultGlobalTestPartResultReporter (line 866) | class DefaultGlobalTestPartResultReporter
      class DefaultPerThreadTestPartResultReporter (line 882) | class DefaultPerThreadTestPartResultReporter
      function UnitTestImpl (line 900) | class GTEST_API_ UnitTestImpl {
      function UnitTestImpl (line 1359) | inline UnitTestImpl* GetUnitTestImpl() {
      function ParseNaturalNumber (line 1399) | bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
      class TestResultAccessor (line 1433) | class TestResultAccessor {
        method RecordProperty (line 1435) | static void RecordProperty(TestResult* test_result,
        method ClearTestPartResults (line 1441) | static void ClearTestPartResults(TestResult* test_result) {
      class StreamingListener (line 1454) | class StreamingListener : public EmptyTestEventListener {
        class AbstractSocketWriter (line 1457) | class AbstractSocketWriter {
          method CloseConnection (line 1465) | virtual void CloseConnection() {}
          method SendLn (line 1468) | void SendLn(const std::string& message) { Send(message + "\n"); }
        class SocketWriter (line 1472) | class SocketWriter : public AbstractSocketWriter {
          method SocketWriter (line 1474) | SocketWriter(const std::string& host, const std::string& port)
          method Send (line 1485) | void Send(const std::string& message) override {
          method CloseConnection (line 1502) | void CloseConnection() override {
        method StreamingListener (line 1520) | StreamingListener(const std::string& host, const std::string& port)
        method StreamingListener (line 1525) | explicit StreamingListener(AbstractSocketWriter* socket_writer)
        method OnTestProgramStart (line 1528) | void OnTestProgramStart(const UnitTest& /* unit_test */) override {
        method OnTestProgramEnd (line 1532) | void OnTestProgramEnd(const UnitTest& unit_test) override {
        method OnTestIterationStart (line 1541) | void OnTestIterationStart(const UnitTest& /* unit_test */,
        method OnTestIterationEnd (line 1547) | void OnTestIterationEnd(const UnitTest& unit_test,
        method OnTestCaseStart (line 1556) | void OnTestCaseStart(const TestCase& test_case) override {
        method OnTestCaseEnd (line 1562) | void OnTestCaseEnd(const TestCase& test_case) override {
        method OnTestStart (line 1568) | void OnTestStart(const TestInfo& test_info) override {
        method OnTestEnd (line 1572) | void OnTestEnd(const TestInfo& test_info) override {
        method OnTestPartResult (line 1579) | void OnTestPartResult(const TestPartResult& test_part_result) over...
        method SendLn (line 1589) | void SendLn(const std::string& message) { socket_writer_->SendLn(m...
        method Start (line 1593) | void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
        method FormatBool (line 1595) | std::string FormatBool(bool value) { return value ? "1" : "0"; }
      function FILE (line 1672) | static FILE* OpenFileForWriting(const std::string& output_file) {
      function GTestIsInitialized (line 1859) | static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
      function SumOverTestSuiteList (line 1864) | static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_...
      function TestSuitePassed (line 1874) | static bool TestSuitePassed(const TestSuite* test_suite) {
      function TestSuiteFailed (line 1879) | static bool TestSuiteFailed(const TestSuite* test_suite) {
      function ShouldRunTestSuite (line 1885) | static bool ShouldRunTestSuite(const TestSuite* test_suite) {
      class FailureTest (line 1923) | class FailureTest : public Test {
        method FailureTest (line 1925) | explicit FailureTest(const CodeLocation& loc, std::string error_me...
        method TestBody (line 1931) | void TestBody() override {
      function InsertSyntheticTestCase (line 1960) | void InsertSyntheticTestCase(const std::string& name, CodeLocation l...
      function RegisterTypeParameterizedTestSuite (line 2003) | void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
      function RegisterTypeParameterizedTestSuiteInstantiation (line 2009) | void RegisterTypeParameterizedTestSuiteInstantiation(const char* cas...
      function GetArgvs (line 2071) | ::std::vector<std::string> GetArgvs() {
      function FilePath (line 2084) | FilePath GetCurrentExecutableName() {
      function PatternMatchesString (line 2146) | static bool PatternMatchesString(const std::string& name_str,
      function TypeId (line 2338) | TypeId GetTestTypeId() {
      function AssertionResult (line 2349) | static AssertionResult HasOneFailure(const char* /* results_expr */,
      function TestPartResultReporterInterface (line 2419) | TestPartResultReporterInterface*
      function TestPartResultReporterInterface (line 2433) | TestPartResultReporterInterface*
      class Timer (line 2526) | class Timer {
        method Timer (line 2528) | Timer() : start_(std::chrono::steady_clock::now()) {}
        method TimeInMillis (line 2531) | TimeInMillis Elapsed() {
      function TimeInMillis (line 2544) | TimeInMillis GetTimeInMillis() {
      function LPCWSTR (line 2560) | LPCWSTR String::AnsiToUtf16(const char* ansi) {
      function StreamWideCharsToMessage (line 2607) | static void StreamWideCharsToMessage(const wchar_t* wstr, size_t len...
      function SplitString (line 2623) | void SplitString(const ::std::string& str, char delimiter,
      type edit_distance (line 2717) | namespace edit_distance {
        function CalculateOptimalEdits (line 2718) | std::vector<EditType> CalculateOptimalEdits(const std::vector<size...
        class InternalStrings (line 2778) | class InternalStrings {
          method GetId (line 2780) | size_t GetId(const std::string& str) {
        function CalculateOptimalEdits (line 2794) | std::vector<EditType> CalculateOptimalEdits(
        class Hunk (line 2816) | class Hunk {
          method Hunk (line 2818) | Hunk(size_t left_start, size_t right_start)
          method PushLine (line 2825) | void PushLine(char edit, const char* line) {
          method PrintTo (line 2843) | void PrintTo(std::ostream* os) {
          method has_edits (line 2853) | bool has_edits() const { return adds_ || removes_; }
          method FlushEdits (line 2856) | void FlushEdits() {
          method PrintHeader (line 2865) | void PrintHeader(std::ostream* ss) const {
        function CreateUnifiedDiff (line 2893) | std::string CreateUnifiedDiff(const std::vector<std::string>& left,
      function SplitEscapedString (line 2963) | std::vector<std::string> SplitEscapedString(const std::string& str) {
      function AssertionResult (line 3003) | AssertionResult EqFailure(const char* lhs_expression,
      function GetBoolAssertionFailureMessage (line 3038) | std::string GetBoolAssertionFailureMessage(
      function AssertionResult (line 3054) | AssertionResult DoubleNearPredFormat(const char* expr1,
      function AssertionResult (line 3099) | AssertionResult FloatingPointLE(const char* expr1,
      function AssertionResult (line 3151) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3167) | AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,
      function AssertionResult (line 3183) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function AssertionResult (line 3197) | AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
      function AssertionResult (line 3325) | AssertionResult HRESULTFailureHelper(const char* expr,
      function AssertionResult (line 3366) | AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NO...
      function AssertionResult (line 3373) | AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NO...
      function ChopLowBits (line 3409) | inline uint32_t ChopLowBits(uint32_t* bits, int n) {
      function CodePointToUtf8 (line 3421) | std::string CodePointToUtf8(uint32_t code_point) {
      function IsUtf16SurrogatePair (line 3456) | inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
      function CreateCodePointFromUtf16SurrogatePair (line 3462) | inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,
      function WideStringToUtf8 (line 3488) | std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
      function AssertionResult (line 3534) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3550) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function StringStreamToString (line 3655) | std::string StringStreamToString(::std::stringstream* ss) {
      function AppendUserMessage (line 3674) | std::string AppendUserMessage(const std::string& gtest_msg,
      function ReportFailureInUnknownLocation (line 3946) | void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
      function FormatCxxExceptionMessage (line 4048) | static std::string FormatCxxExceptionMessage(const char* description,
      function Result (line 4079) | Result HandleSehExceptionsInMethodIfSupported(
      function Result (line 4106) | Result HandleExceptionsInMethodIfSupported(
      function TestInfo (line 4247) | TestInfo* MakeAndRegisterTestInfo(
      function ReportInvalidTestSuiteType (line 4259) | void ReportInvalidTestSuiteType(const char* test_suite_name,
      type GTestColor (line 4625) | enum class GTestColor { kDefault, kRed, kGreen, kYellow }
      function PrintTestPartResultToString (line 4629) | static std::string PrintTestPartResultToString(
      function PrintTestPartResult (line 4639) | static void PrintTestPartResult(const TestPartResult& test_part_resu...
      function WORD (line 4662) | static WORD GetColorAttribute(GTestColor color) {
      function GetBitOffset (line 4674) | static int GetBitOffset(WORD color_mask) {
      function WORD (line 4685) | static WORD GetNewColor(GTestColor color, WORD old_color_attrs) {
      function ShouldUseColor (line 4725) | bool ShouldUseColor(bool stdout_is_tty) {
      function ColoredPrintf (line 4767) | static void ColoredPrintf(GTestColor color, const char *fmt, ...) {
      function PrintFullTestCommentIfPresent (line 4820) | static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
      class PrettyUnitTestResultPrinter (line 4839) | class PrettyUnitTestResultPrinter : public TestEventListener {
        method PrettyUnitTestResultPrinter (line 4841) | PrettyUnitTestResultPrinter() {}
        method PrintTestName (line 4842) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 4847) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnEnvironmentsSetUpEnd (line 4850) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnEnvironmentsTearDownEnd (line 4868) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 4870) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class BriefUnitTestResultPrinter (line 5138) | class BriefUnitTestResultPrinter : public TestEventListener {
        method BriefUnitTestResultPrinter (line 5140) | BriefUnitTestResultPrinter() {}
        method PrintTestName (line 5141) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 5146) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnTestIterationStart (line 5147) | void OnTestIterationStart(const UnitTest& /*unit_test*/,
        method OnEnvironmentsSetUpStart (line 5149) | void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) overr...
        method OnEnvironmentsSetUpEnd (line 5150) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnTestCaseStart (line 5152) | void OnTestCaseStart(const TestCase& /*test_case*/) override {}
        method OnTestSuiteStart (line 5154) | void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}
        method OnTestStart (line 5157) | void OnTestStart(const TestInfo& /*test_info*/) override {}
        method OnTestCaseEnd (line 5162) | void OnTestCaseEnd(const TestCase& /*test_case*/) override {}
        method OnTestSuiteEnd (line 5164) | void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
        method OnEnvironmentsTearDownStart (line 5167) | void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) ov...
        method OnEnvironmentsTearDownEnd (line 5168) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 5170) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class TestEventRepeater (line 5242) | class TestEventRepeater : public TestEventListener {
        method TestEventRepeater (line 5244) | TestEventRepeater() : forwarding_enabled_(true) {}
        method forwarding_enabled (line 5251) | bool forwarding_enabled() const { return forwarding_enabled_; }
        method set_forwarding_enabled (line 5252) | void set_forwarding_enabled(bool enable) { forwarding_enabled_ = e...
      function TestEventListener (line 5294) | TestEventListener* TestEventRepeater::Release(TestEventListener *lis...
      class XmlUnitTestResultPrinter (line 5370) | class XmlUnitTestResultPrinter : public EmptyTestEventListener {
        method IsNormalizableWhitespace (line 5384) | static bool IsNormalizableWhitespace(char c) {
        method IsValidXmlCharacter (line 5389) | static bool IsValidXmlCharacter(char c) {
        method EscapeXmlAttribute (line 5403) | static std::string EscapeXmlAttribute(const std::string& str) {
        method EscapeXmlText (line 5408) | static std::string EscapeXmlText(const char* str) {
      function FormatTimeInMillisAsSeconds (line 5574) | std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
      function PortableLocaltime (line 5580) | static bool PortableLocaltime(time_t seconds, struct tm* out) {
      function FormatEpochTimeInMillisAsIso8601 (line 5601) | std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
      class JsonUnitTestResultPrinter (line 5918) | class JsonUnitTestResultPrinter : public EmptyTestEventListener {
      function FormatTimeInMillisAsDuration (line 6042) | static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {
      function FormatEpochTimeInMillisAsRFC3339 (line 6050) | static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {
      function Indent (line 6063) | static inline std::string Indent(size_t width) {
      function GTEST_LOCK_EXCLUDED_ (line 6433) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function GTEST_LOCK_EXCLUDED_ (line 6482) | GTEST_LOCK_EXCLUDED_(mutex_) {
      class ScopedPrematureExitFile (line 6496) | class ScopedPrematureExitFile {
        method ScopedPrematureExitFile (line 6498) | explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
      class TestSuiteNameIs (line 7162) | class TestSuiteNameIs {
        method TestSuiteNameIs (line 7165) | explicit TestSuiteNameIs(const std::string& name) : name_(name) {}
      function TestSuite (line 7189) | TestSuite* UnitTestImpl::GetTestSuite(
      function SetUpEnvironment (line 7225) | static void SetUpEnvironment(Environment* env) { env->SetUp(); }
      function TearDownEnvironment (line 7226) | static void TearDownEnvironment(Environment* env) { env->TearDown(); }
      function WriteToShardStatusFileIfNeeded (line 7419) | void WriteToShardStatusFileIfNeeded() {
      function ShouldShard (line 7441) | bool ShouldShard(const char* total_shards_env,
      function Int32FromEnvOrDie (line 7486) | int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {
      function ShouldRunTestOnShard (line 7504) | bool ShouldRunTestOnShard(int total_shards, int shard_index, int tes...
      function PrintOnOneLine (line 7570) | static void PrintOnOneLine(const char* str, int max_length) {
      function OsStackTraceGetterInterface (line 7657) | OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      function TestResult (line 7670) | TestResult* UnitTestImpl::current_test_result() {
      function GetCurrentOsStackTraceExceptTop (line 7716) | std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
      class ClassUniqueToAlwaysTrue (line 7726) | class ClassUniqueToAlwaysTrue {}
      function IsTrue (line 7729) | bool IsTrue(bool condition) { return condition; }
      function AlwaysTrue (line 7731) | bool AlwaysTrue() {
      function SkipPrefix (line 7744) | bool SkipPrefix(const char* prefix, const char** pstr) {
      function ParseBoolFlag (line 7795) | static bool ParseBoolFlag(const char* str, const char* flag, bool* v...
      function ParseInt32Flag (line 7811) | bool ParseInt32Flag(const char* str, const char* flag, int32_t* valu...
      function ParseStringFlag (line 7828) | static bool ParseStringFlag(const char* str, const char* flag, Strin...
      function HasGoogleTestFlagPrefix (line 7846) | static bool HasGoogleTestFlagPrefix(const char* str) {
      function PrintColorEncoded (line 7864) | static void PrintColorEncoded(const char* str) {
      function ParseGoogleTestFlag (line 7990) | static bool ParseGoogleTestFlag(const char* const arg) {
      function LoadFlagsFromFile (line 8022) | static void LoadFlagsFromFile(const std::string& path) {
      function ParseGoogleTestFlagsOnlyImpl (line 8045) | void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
      function ParseGoogleTestFlagsOnly (line 8098) | void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
      function ParseGoogleTestFlagsOnly (line 8112) | void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
      function InitGoogleTestImpl (line 8121) | void InitGoogleTestImpl(int* argc, CharType** argv) {
      function InDeathTestChild (line 8377) | bool InDeathTestChild() {
      function ExitSummary (line 8437) | static std::string ExitSummary(int exit_code) {
      function ExitedUnsuccessfully (line 8463) | bool ExitedUnsuccessfully(int exit_status) {
      function DeathTestThreadWarning (line 8472) | static std::string DeathTestThreadWarning(size_t thread_count) {
      type DeathTestOutcome (line 8510) | enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }
      function DeathTestAbort (line 8517) | static void DeathTestAbort(const std::string& message) {
      function GetLastErrnoDescription (line 8570) | std::string GetLastErrnoDescription() {
      function FailFromInternalError (line 8578) | static void FailFromInternalError(int fd) {
      class DeathTestImpl (line 8629) | class DeathTestImpl : public DeathTest {
        method DeathTestImpl (line 8631) | DeathTestImpl(const char* a_statement, Matcher<const std::string&>...
        method spawned (line 8647) | bool spawned() const { return spawned_; }
        method set_spawned (line 8648) | void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
        method status (line 8649) | int status() const { return status_; }
        method set_status (line 8650) | void set_status(int a_status) { status_ = a_status; }
        method DeathTestOutcome (line 8651) | DeathTestOutcome outcome() const { return outcome_; }
        method set_outcome (line 8652) | void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outc...
        method read_fd (line 8653) | int read_fd() const { return read_fd_; }
        method set_read_fd (line 8654) | void set_read_fd(int fd) { read_fd_ = fd; }
        method write_fd (line 8655) | int write_fd() const { return write_fd_; }
        method set_write_fd (line 8656) | void set_write_fd(int fd) { write_fd_ = fd; }
      function FormatDeathTestOutput (line 8765) | static ::std::string FormatDeathTestOutput(const ::std::string& outp...
      class WindowsDeathTest (line 8881) | class WindowsDeathTest : public DeathTestImpl {
        method WindowsDeathTest (line 8883) | WindowsDeathTest(const char* a_statement, Matcher<const std::strin...
      class FuchsiaDeathTest (line 9045) | class FuchsiaDeathTest : public DeathTestImpl {
        method FuchsiaDeathTest (line 9047) | FuchsiaDeathTest(const char* a_statement, Matcher<const std::strin...
      class Arguments (line 9072) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      class ForkingDeathTest (line 9303) | class ForkingDeathTest : public DeathTestImpl {
        method set_child_pid (line 9311) | void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
      class NoExecDeathTest (line 9340) | class NoExecDeathTest : public ForkingDeathTest {
        method NoExecDeathTest (line 9342) | NoExecDeathTest(const char* a_statement, Matcher<const std::string...
      class ExecDeathTest (line 9395) | class ExecDeathTest : public ForkingDeathTest {
        method ExecDeathTest (line 9397) | ExecDeathTest(const char* a_statement, Matcher<const std::string&>...
        method GetArgvsForDeathTestChildProcess (line 9405) | static ::std::vector<std::string> GetArgvsForDeathTestChildProcess...
      class Arguments (line 9421) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      type ExecDeathTestArgs (line 9453) | struct ExecDeathTestArgs {
      function ExecDeathTestChildMain (line 9464) | static int ExecDeathTestChildMain(void* child_arg) {
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9511) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9519) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function pid_t (line 9536) | static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
      function IsPathSeparator (line 9956) | static bool IsPathSeparator(char c) {
      function FilePath (line 9965) | FilePath FilePath::GetCurrentDir() {
      function FilePath (line 9992) | FilePath FilePath::RemoveExtension(const char* extension) const {
      function FilePath (line 10023) | FilePath FilePath::RemoveDirectoryName() const {
      function FilePath (line 10034) | FilePath FilePath::RemoveFileName() const {
      function FilePath (line 10051) | FilePath FilePath::MakeFileName(const FilePath& directory,
      function FilePath (line 10067) | FilePath FilePath::ConcatPaths(const FilePath& directory,
      function FilePath (line 10151) | FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
      function FilePath (line 10214) | FilePath FilePath::RemoveTrailingPathSeparator() const {
      function T (line 10433) | T ReadProcFileField(const std::string& filename, int field) {
      function GetThreadCount (line 10446) | size_t GetThreadCount() {
      function GetThreadCount (line 10454) | size_t GetThreadCount() {
      function GetThreadCount (line 10490) | size_t GetThreadCount() {
      function GetThreadCount (line 10513) | size_t GetThreadCount() {
      function GetThreadCount (line 10551) | size_t GetThreadCount() {
      function GetThreadCount (line 10569) | size_t GetThreadCount() {
      function GetThreadCount (line 10582) | size_t GetThreadCount() {
      function GetThreadCount (line 10601) | size_t GetThreadCount() {
      function SleepMilliseconds (line 10611) | void SleepMilliseconds(int n) {
      class MemoryIsNotDeallocated (line 10722) | class MemoryIsNotDeallocated
        method MemoryIsNotDeallocated (line 10725) | MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {
      class ThreadWithParamSupport (line 10795) | class ThreadWithParamSupport : public ThreadWithParamBase {
        method HANDLE (line 10797) | static HANDLE CreateThread(Runnable* runnable,
        type ThreadMainParam (line 10817) | struct ThreadMainParam {
          method ThreadMainParam (line 10818) | ThreadMainParam(Runnable* runnable, Notification* thread_can_start)
        method DWORD (line 10827) | static DWORD WINAPI ThreadMain(void* ptr) {
      class ThreadLocalRegistryImpl (line 10863) | class ThreadLocalRegistryImpl {
        method ThreadLocalValueHolderBase (line 10867) | static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
        method OnThreadLocalDestroyed (line 10898) | static void OnThreadLocalDestroyed(
        method OnThreadExit (line 10926) | static void OnThreadExit(DWORD thread_id) {
        method StartWatcherThreadFor (line 10965) | static void StartWatcherThreadFor(DWORD thread_id) {
        method DWORD (line 10992) | static DWORD WINAPI WatcherThreadFunc(LPVOID param) {
        method ThreadIdToThreadLocals (line 11004) | static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
      function ThreadLocalValueHolderBase (line 11022) | ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentTh...
      function IsInSet (line 11102) | bool IsInSet(char ch, const char* str) {
      function IsAsciiDigit (line 11109) | bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
      function IsAsciiPunct (line 11110) | bool IsAsciiPunct(char ch) {
      function IsRepeat (line 11113) | bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
      function IsAsciiWhiteSpace (line 11114) | bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
      function IsAsciiWordChar (line 11115) | bool IsAsciiWordChar(char ch) {
      function IsValidEscape (line 11121) | bool IsValidEscape(char c) {
      function AtomMatchesChar (line 11127) | bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
      function FormatRegexSyntaxError (line 11149) | static std::string FormatRegexSyntaxError(const char* regex, int ind...
      function ValidateRegex (line 11156) | bool ValidateRegex(const char* regex) {
      function MatchRepetitionAndRegexAtHead (line 11216) | bool MatchRepetitionAndRegexAtHead(
      function MatchRegexAtHead (line 11243) | bool MatchRegexAtHead(const char* regex, const char* str) {
      function MatchRegexAnywhere (line 11279) | bool MatchRegexAnywhere(const char* regex, const char* str) {
      function FormatFileLocation (line 11351) | GTEST_API_ ::std::string FormatFileLocation(const char* file, int li...
      function FormatCompilerIndependentFileLocation (line 11369) | GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
      class CapturedStream (line 11405) | class CapturedStream {
        method CapturedStream (line 11408) | explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
        method GetCapturedString (line 11462) | std::string GetCapturedString() {
      function CaptureStream (line 11496) | static void CaptureStream(int fd, const char* stream_name,
      function GetCapturedStream (line 11506) | static std::string GetCapturedStream(CapturedStream** captured_strea...
      function CaptureStdout (line 11516) | void CaptureStdout() {
      function CaptureStderr (line 11521) | void CaptureStderr() {
      function GetCapturedStdout (line 11526) | std::string GetCapturedStdout() {
      function GetCapturedStderr (line 11531) | std::string GetCapturedStderr() {
      function GetFileSize (line 11541) | size_t GetFileSize(FILE* file) {
      function ReadEntireFile (line 11546) | std::string ReadEntireFile(FILE* file) {
      function GetInjectableArgvs (line 11572) | std::vector<std::string> GetInjectableArgvs() {
      function SetInjectableArgvs (line 11579) | void SetInjectableArgvs(const std::vector<std::string>* new_argvs) {
      function SetInjectableArgvs (line 11584) | void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {
      function ClearInjectableArgvs (line 11589) | void ClearInjectableArgvs() {
      type posix (line 11596) | namespace posix {
        function Abort (line 11597) | void Abort() {
      function FlagToEnvVar (line 11607) | static std::string FlagToEnvVar(const char* flag) {
      function ParseInt32 (line 11622) | bool ParseInt32(const Message& src_text, const char* str, int32_t* v...
      function BoolFromGTestEnv (line 11664) | bool BoolFromGTestEnv(const char* flag, bool default_value) {
      function Int32FromGTestEnv (line 11678) | int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {
      function OutputFlagAlsoCheckEnvVar (line 11710) | std::string OutputFlagAlsoCheckEnvVar(){
      function PrintBytesInObjectTo (line 11858) | void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
      type CharFormat (line 11868) | enum CharFormat {
      function IsPrintableAscii (line 11877) | inline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= ...
      function CharFormat (line 11883) | static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
      function CharFormat (line 11932) | static CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) {
      function CharFormat (line 11977) | static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
      function CharFormat (line 11982) | static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {
      function CharFormat (line 11987) | static CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) {
      function CharFormat (line 11991) | static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
      function PrintCharAndCodeTo (line 11999) | void PrintCharAndCodeTo(Char c, ostream* os) {
      function PrintTo (line 12023) | void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCode...
      function PrintTo (line 12024) | void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo...
      function PrintTo (line 12028) | void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); }
      function PrintTo (line 12031) | void PrintTo(char32_t c, ::std::ostream* os) {
      function CharFormat (line 12045) | static CharFormat PrintCharsAsStringTo(
      function UniversalPrintCharArray (line 12076) | static void UniversalPrintCharArray(
      function UniversalPrintArray (line 12099) | void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
      function UniversalPrintArray (line 12106) | void UniversalPrintArray(const char8_t* begin, size_t len, ostream* ...
      function UniversalPrintArray (line 12113) | void UniversalPrintArray(const char16_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12119) | void UniversalPrintArray(const char32_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12125) | void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* ...
      function PrintCStringTo (line 12133) | void PrintCStringTo(const Char* s, ostream* os) {
      function PrintTo (line 12144) | void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12147) | void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12150) | void PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12152) | void PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12162) | void PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }
      function ContainsUnprintableControlCodes (line 12167) | bool ContainsUnprintableControlCodes(const char* str, size_t length) {
      function IsUTF8TrailByte (line 12186) | bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }
      function IsValidUTF8 (line 12188) | bool IsValidUTF8(const char* str, size_t length) {
      function ConditionalPrintAsText (line 12223) | void ConditionalPrintAsText(const char* str, size_t length, ostream*...
      function PrintStringTo (line 12232) | void PrintStringTo(const ::std::string& s, ostream* os) {
      function PrintU8StringTo (line 12241) | void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
      function PrintU16StringTo (line 12246) | void PrintU16StringTo(const ::std::u16string& s, ostream* os) {
      function PrintU32StringTo (line 12250) | void PrintU32StringTo(const ::std::u32string& s, ostream* os) {
      function PrintWideStringTo (line 12255) | void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
      function SplitIntoTestNames (line 12411) | static std::vector<std::string> SplitIntoTestNames(const char* src) {
      function GTEST_API_ (line 12712) | GTEST_API_ std::string JoinAsTuple(const Strings& fields) {
      function GTEST_API_ (line 12733) | GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_n...
      class GoogleTestFailureReporter (line 12755) | class GoogleTestFailureReporter : public FailureReporterInterface {
        method ReportFailure (line 12757) | void ReportFailure(FailureType type, const char* file, int line,
      function GTEST_API_ (line 12773) | GTEST_API_ FailureReporterInterface* GetFailureReporter() {
      function GTEST_API_ (line 12789) | GTEST_API_ bool LogIsVisible(LogSeverity severity) {
      function GTEST_API_ (line 12810) | GTEST_API_ void Log(LogSeverity severity, const std::string& message,
      function GTEST_API_ (line 12848) | GTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatc...
      function GTEST_API_ (line 12850) | GTEST_API_ void IllegalDoDefault(const char* file, int line) {
      function GTEST_API_ (line 12911) | GTEST_API_ std::string FormatMatcherDescription(bool negation,
      class MaxBipartiteMatchState (line 12981) | class MaxBipartiteMatchState {
        method MaxBipartiteMatchState (line 12983) | explicit MaxBipartiteMatchState(const MatchMatrix& graph)
        method ElementMatcherPairs (line 12989) | ElementMatcherPairs Compute() {
        method TryAugment (line 13041) | bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {
      function GTEST_API_ (line 13085) | GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchM...
      function LogElementMatcherPairVec (line 13089) | static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,
      function GTEST_API_ (line 13388) | GTEST_API_ void LogWithLocation(testing::internal::LogSeverity sever...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13425) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13452) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13472) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13503) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13526) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function ReportUninterestingCall (line 13599) | void ReportUninterestingCall(CallReaction reaction, const std::strin...
      function GTEST_LOCK_EXCLUDED_ (line 13634) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13647) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13658) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13675) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13693) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function Expectation (line 13821) | Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* ...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13842) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function CallReaction (line 13886) | CallReaction intToCallReaction(int mock_behavior) {
      function ParseGoogleMockBoolFlag (line 14323) | static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,
      function ParseGoogleMockStringFlag (line 14342) | static bool ParseGoogleMockStringFlag(const char* str, const char* f...
      function ParseGoogleMockIntFlag (line 14355) | static bool ParseGoogleMockIntFlag(const char* str, const char* flag,
      function InitGoogleMockImpl (line 14373) | void InitGoogleMockImpl(int* argc, CharType** argv) {
    type internal (line 464) | namespace internal {
      function SingleFailureChecker (line 172) | class GTEST_API_ SingleFailureChecker {
      function GetRandomSeedFromFlag (line 521) | inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
      function GetNextRandomSeed (line 537) | inline int GetNextRandomSeed(int seed) {
      class GTestFlagSaver (line 547) | class GTestFlagSaver {
        method GTestFlagSaver (line 550) | GTestFlagSaver() {
      function CountIf (line 677) | inline int CountIf(const Container& c, Predicate predicate) {
      function ForEach (line 690) | void ForEach(const Container& c, Functor functor) {
      function E (line 697) | inline E GetElementOr(const std::vector<E>& v, int i, E default_valu...
      function ShuffleRange (line 707) | void ShuffleRange(internal::Random* random, int begin, int end,
      function Shuffle (line 731) | inline void Shuffle(internal::Random* random, std::vector<E>* v) {
      function Delete (line 738) | static void Delete(T* x) {
      class TestPropertyKeyIs (line 745) | class TestPropertyKeyIs {
        method TestPropertyKeyIs (line 750) | explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
      function UnitTestOptions (line 771) | class GTEST_API_ UnitTestOptions {
      class OsStackTraceGetterInterface (line 809) | class OsStackTraceGetterInterface {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      class OsStackTraceGetter (line 836) | class OsStackTraceGetter : public OsStackTraceGetterInterface {
        method OsStackTraceGetter (line 838) | OsStackTraceGetter() {}
      type TraceInfo (line 858) | struct TraceInfo {
      class DefaultGlobalTestPartResultReporter (line 866) | class DefaultGlobalTestPartResultReporter
      class DefaultPerThreadTestPartResultReporter (line 882) | class DefaultPerThreadTestPartResultReporter
      function UnitTestImpl (line 900) | class GTEST_API_ UnitTestImpl {
      function UnitTestImpl (line 1359) | inline UnitTestImpl* GetUnitTestImpl() {
      function ParseNaturalNumber (line 1399) | bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
      class TestResultAccessor (line 1433) | class TestResultAccessor {
        method RecordProperty (line 1435) | static void RecordProperty(TestResult* test_result,
        method ClearTestPartResults (line 1441) | static void ClearTestPartResults(TestResult* test_result) {
      class StreamingListener (line 1454) | class StreamingListener : public EmptyTestEventListener {
        class AbstractSocketWriter (line 1457) | class AbstractSocketWriter {
          method CloseConnection (line 1465) | virtual void CloseConnection() {}
          method SendLn (line 1468) | void SendLn(const std::string& message) { Send(message + "\n"); }
        class SocketWriter (line 1472) | class SocketWriter : public AbstractSocketWriter {
          method SocketWriter (line 1474) | SocketWriter(const std::string& host, const std::string& port)
          method Send (line 1485) | void Send(const std::string& message) override {
          method CloseConnection (line 1502) | void CloseConnection() override {
        method StreamingListener (line 1520) | StreamingListener(const std::string& host, const std::string& port)
        method StreamingListener (line 1525) | explicit StreamingListener(AbstractSocketWriter* socket_writer)
        method OnTestProgramStart (line 1528) | void OnTestProgramStart(const UnitTest& /* unit_test */) override {
        method OnTestProgramEnd (line 1532) | void OnTestProgramEnd(const UnitTest& unit_test) override {
        method OnTestIterationStart (line 1541) | void OnTestIterationStart(const UnitTest& /* unit_test */,
        method OnTestIterationEnd (line 1547) | void OnTestIterationEnd(const UnitTest& unit_test,
        method OnTestCaseStart (line 1556) | void OnTestCaseStart(const TestCase& test_case) override {
        method OnTestCaseEnd (line 1562) | void OnTestCaseEnd(const TestCase& test_case) override {
        method OnTestStart (line 1568) | void OnTestStart(const TestInfo& test_info) override {
        method OnTestEnd (line 1572) | void OnTestEnd(const TestInfo& test_info) override {
        method OnTestPartResult (line 1579) | void OnTestPartResult(const TestPartResult& test_part_result) over...
        method SendLn (line 1589) | void SendLn(const std::string& message) { socket_writer_->SendLn(m...
        method Start (line 1593) | void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
        method FormatBool (line 1595) | std::string FormatBool(bool value) { return value ? "1" : "0"; }
      function FILE (line 1672) | static FILE* OpenFileForWriting(const std::string& output_file) {
      function GTestIsInitialized (line 1859) | static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
      function SumOverTestSuiteList (line 1864) | static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_...
      function TestSuitePassed (line 1874) | static bool TestSuitePassed(const TestSuite* test_suite) {
      function TestSuiteFailed (line 1879) | static bool TestSuiteFailed(const TestSuite* test_suite) {
      function ShouldRunTestSuite (line 1885) | static bool ShouldRunTestSuite(const TestSuite* test_suite) {
      class FailureTest (line 1923) | class FailureTest : public Test {
        method FailureTest (line 1925) | explicit FailureTest(const CodeLocation& loc, std::string error_me...
        method TestBody (line 1931) | void TestBody() override {
      function InsertSyntheticTestCase (line 1960) | void InsertSyntheticTestCase(const std::string& name, CodeLocation l...
      function RegisterTypeParameterizedTestSuite (line 2003) | void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
      function RegisterTypeParameterizedTestSuiteInstantiation (line 2009) | void RegisterTypeParameterizedTestSuiteInstantiation(const char* cas...
      function GetArgvs (line 2071) | ::std::vector<std::string> GetArgvs() {
      function FilePath (line 2084) | FilePath GetCurrentExecutableName() {
      function PatternMatchesString (line 2146) | static bool PatternMatchesString(const std::string& name_str,
      function TypeId (line 2338) | TypeId GetTestTypeId() {
      function AssertionResult (line 2349) | static AssertionResult HasOneFailure(const char* /* results_expr */,
      function TestPartResultReporterInterface (line 2419) | TestPartResultReporterInterface*
      function TestPartResultReporterInterface (line 2433) | TestPartResultReporterInterface*
      class Timer (line 2526) | class Timer {
        method Timer (line 2528) | Timer() : start_(std::chrono::steady_clock::now()) {}
        method TimeInMillis (line 2531) | TimeInMillis Elapsed() {
      function TimeInMillis (line 2544) | TimeInMillis GetTimeInMillis() {
      function LPCWSTR (line 2560) | LPCWSTR String::AnsiToUtf16(const char* ansi) {
      function StreamWideCharsToMessage (line 2607) | static void StreamWideCharsToMessage(const wchar_t* wstr, size_t len...
      function SplitString (line 2623) | void SplitString(const ::std::string& str, char delimiter,
      type edit_distance (line 2717) | namespace edit_distance {
        function CalculateOptimalEdits (line 2718) | std::vector<EditType> CalculateOptimalEdits(const std::vector<size...
        class InternalStrings (line 2778) | class InternalStrings {
          method GetId (line 2780) | size_t GetId(const std::string& str) {
        function CalculateOptimalEdits (line 2794) | std::vector<EditType> CalculateOptimalEdits(
        class Hunk (line 2816) | class Hunk {
          method Hunk (line 2818) | Hunk(size_t left_start, size_t right_start)
          method PushLine (line 2825) | void PushLine(char edit, const char* line) {
          method PrintTo (line 2843) | void PrintTo(std::ostream* os) {
          method has_edits (line 2853) | bool has_edits() const { return adds_ || removes_; }
          method FlushEdits (line 2856) | void FlushEdits() {
          method PrintHeader (line 2865) | void PrintHeader(std::ostream* ss) const {
        function CreateUnifiedDiff (line 2893) | std::string CreateUnifiedDiff(const std::vector<std::string>& left,
      function SplitEscapedString (line 2963) | std::vector<std::string> SplitEscapedString(const std::string& str) {
      function AssertionResult (line 3003) | AssertionResult EqFailure(const char* lhs_expression,
      function GetBoolAssertionFailureMessage (line 3038) | std::string GetBoolAssertionFailureMessage(
      function AssertionResult (line 3054) | AssertionResult DoubleNearPredFormat(const char* expr1,
      function AssertionResult (line 3099) | AssertionResult FloatingPointLE(const char* expr1,
      function AssertionResult (line 3151) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3167) | AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,
      function AssertionResult (line 3183) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function AssertionResult (line 3197) | AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
      function AssertionResult (line 3325) | AssertionResult HRESULTFailureHelper(const char* expr,
      function AssertionResult (line 3366) | AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NO...
      function AssertionResult (line 3373) | AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NO...
      function ChopLowBits (line 3409) | inline uint32_t ChopLowBits(uint32_t* bits, int n) {
      function CodePointToUtf8 (line 3421) | std::string CodePointToUtf8(uint32_t code_point) {
      function IsUtf16SurrogatePair (line 3456) | inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
      function CreateCodePointFromUtf16SurrogatePair (line 3462) | inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,
      function WideStringToUtf8 (line 3488) | std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
      function AssertionResult (line 3534) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3550) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function StringStreamToString (line 3655) | std::string StringStreamToString(::std::stringstream* ss) {
      function AppendUserMessage (line 3674) | std::string AppendUserMessage(const std::string& gtest_msg,
      function ReportFailureInUnknownLocation (line 3946) | void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
      function FormatCxxExceptionMessage (line 4048) | static std::string FormatCxxExceptionMessage(const char* description,
      function Result (line 4079) | Result HandleSehExceptionsInMethodIfSupported(
      function Result (line 4106) | Result HandleExceptionsInMethodIfSupported(
      function TestInfo (line 4247) | TestInfo* MakeAndRegisterTestInfo(
      function ReportInvalidTestSuiteType (line 4259) | void ReportInvalidTestSuiteType(const char* test_suite_name,
      type GTestColor (line 4625) | enum class GTestColor { kDefault, kRed, kGreen, kYellow }
      function PrintTestPartResultToString (line 4629) | static std::string PrintTestPartResultToString(
      function PrintTestPartResult (line 4639) | static void PrintTestPartResult(const TestPartResult& test_part_resu...
      function WORD (line 4662) | static WORD GetColorAttribute(GTestColor color) {
      function GetBitOffset (line 4674) | static int GetBitOffset(WORD color_mask) {
      function WORD (line 4685) | static WORD GetNewColor(GTestColor color, WORD old_color_attrs) {
      function ShouldUseColor (line 4725) | bool ShouldUseColor(bool stdout_is_tty) {
      function ColoredPrintf (line 4767) | static void ColoredPrintf(GTestColor color, const char *fmt, ...) {
      function PrintFullTestCommentIfPresent (line 4820) | static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
      class PrettyUnitTestResultPrinter (line 4839) | class PrettyUnitTestResultPrinter : public TestEventListener {
        method PrettyUnitTestResultPrinter (line 4841) | PrettyUnitTestResultPrinter() {}
        method PrintTestName (line 4842) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 4847) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnEnvironmentsSetUpEnd (line 4850) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnEnvironmentsTearDownEnd (line 4868) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 4870) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class BriefUnitTestResultPrinter (line 5138) | class BriefUnitTestResultPrinter : public TestEventListener {
        method BriefUnitTestResultPrinter (line 5140) | BriefUnitTestResultPrinter() {}
        method PrintTestName (line 5141) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 5146) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnTestIterationStart (line 5147) | void OnTestIterationStart(const UnitTest& /*unit_test*/,
        method OnEnvironmentsSetUpStart (line 5149) | void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) overr...
        method OnEnvironmentsSetUpEnd (line 5150) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnTestCaseStart (line 5152) | void OnTestCaseStart(const TestCase& /*test_case*/) override {}
        method OnTestSuiteStart (line 5154) | void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}
        method OnTestStart (line 5157) | void OnTestStart(const TestInfo& /*test_info*/) override {}
        method OnTestCaseEnd (line 5162) | void OnTestCaseEnd(const TestCase& /*test_case*/) override {}
        method OnTestSuiteEnd (line 5164) | void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
        method OnEnvironmentsTearDownStart (line 5167) | void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) ov...
        method OnEnvironmentsTearDownEnd (line 5168) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 5170) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class TestEventRepeater (line 5242) | class TestEventRepeater : public TestEventListener {
        method TestEventRepeater (line 5244) | TestEventRepeater() : forwarding_enabled_(true) {}
        method forwarding_enabled (line 5251) | bool forwarding_enabled() const { return forwarding_enabled_; }
        method set_forwarding_enabled (line 5252) | void set_forwarding_enabled(bool enable) { forwarding_enabled_ = e...
      function TestEventListener (line 5294) | TestEventListener* TestEventRepeater::Release(TestEventListener *lis...
      class XmlUnitTestResultPrinter (line 5370) | class XmlUnitTestResultPrinter : public EmptyTestEventListener {
        method IsNormalizableWhitespace (line 5384) | static bool IsNormalizableWhitespace(char c) {
        method IsValidXmlCharacter (line 5389) | static bool IsValidXmlCharacter(char c) {
        method EscapeXmlAttribute (line 5403) | static std::string EscapeXmlAttribute(const std::string& str) {
        method EscapeXmlText (line 5408) | static std::string EscapeXmlText(const char* str) {
      function FormatTimeInMillisAsSeconds (line 5574) | std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
      function PortableLocaltime (line 5580) | static bool PortableLocaltime(time_t seconds, struct tm* out) {
      function FormatEpochTimeInMillisAsIso8601 (line 5601) | std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
      class JsonUnitTestResultPrinter (line 5918) | class JsonUnitTestResultPrinter : public EmptyTestEventListener {
      function FormatTimeInMillisAsDuration (line 6042) | static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {
      function FormatEpochTimeInMillisAsRFC3339 (line 6050) | static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {
      function Indent (line 6063) | static inline std::string Indent(size_t width) {
      function GTEST_LOCK_EXCLUDED_ (line 6433) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function GTEST_LOCK_EXCLUDED_ (line 6482) | GTEST_LOCK_EXCLUDED_(mutex_) {
      class ScopedPrematureExitFile (line 6496) | class ScopedPrematureExitFile {
        method ScopedPrematureExitFile (line 6498) | explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
      class TestSuiteNameIs (line 7162) | class TestSuiteNameIs {
        method TestSuiteNameIs (line 7165) | explicit TestSuiteNameIs(const std::string& name) : name_(name) {}
      function TestSuite (line 7189) | TestSuite* UnitTestImpl::GetTestSuite(
      function SetUpEnvironment (line 7225) | static void SetUpEnvironment(Environment* env) { env->SetUp(); }
      function TearDownEnvironment (line 7226) | static void TearDownEnvironment(Environment* env) { env->TearDown(); }
      function WriteToShardStatusFileIfNeeded (line 7419) | void WriteToShardStatusFileIfNeeded() {
      function ShouldShard (line 7441) | bool ShouldShard(const char* total_shards_env,
      function Int32FromEnvOrDie (line 7486) | int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {
      function ShouldRunTestOnShard (line 7504) | bool ShouldRunTestOnShard(int total_shards, int shard_index, int tes...
      function PrintOnOneLine (line 7570) | static void PrintOnOneLine(const char* str, int max_length) {
      function OsStackTraceGetterInterface (line 7657) | OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      function TestResult (line 7670) | TestResult* UnitTestImpl::current_test_result() {
      function GetCurrentOsStackTraceExceptTop (line 7716) | std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
      class ClassUniqueToAlwaysTrue (line 7726) | class ClassUniqueToAlwaysTrue {}
      function IsTrue (line 7729) | bool IsTrue(bool condition) { return condition; }
      function AlwaysTrue (line 7731) | bool AlwaysTrue() {
      function SkipPrefix (line 7744) | bool SkipPrefix(const char* prefix, const char** pstr) {
      function ParseBoolFlag (line 7795) | static bool ParseBoolFlag(const char* str, const char* flag, bool* v...
      function ParseInt32Flag (line 7811) | bool ParseInt32Flag(const char* str, const char* flag, int32_t* valu...
      function ParseStringFlag (line 7828) | static bool ParseStringFlag(const char* str, const char* flag, Strin...
      function HasGoogleTestFlagPrefix (line 7846) | static bool HasGoogleTestFlagPrefix(const char* str) {
      function PrintColorEncoded (line 7864) | static void PrintColorEncoded(const char* str) {
      function ParseGoogleTestFlag (line 7990) | static bool ParseGoogleTestFlag(const char* const arg) {
      function LoadFlagsFromFile (line 8022) | static void LoadFlagsFromFile(const std::string& path) {
      function ParseGoogleTestFlagsOnlyImpl (line 8045) | void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
      function ParseGoogleTestFlagsOnly (line 8098) | void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
      function ParseGoogleTestFlagsOnly (line 8112) | void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
      function InitGoogleTestImpl (line 8121) | void InitGoogleTestImpl(int* argc, CharType** argv) {
      function InDeathTestChild (line 8377) | bool InDeathTestChild() {
      function ExitSummary (line 8437) | static std::string ExitSummary(int exit_code) {
      function ExitedUnsuccessfully (line 8463) | bool ExitedUnsuccessfully(int exit_status) {
      function DeathTestThreadWarning (line 8472) | static std::string DeathTestThreadWarning(size_t thread_count) {
      type DeathTestOutcome (line 8510) | enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }
      function DeathTestAbort (line 8517) | static void DeathTestAbort(const std::string& message) {
      function GetLastErrnoDescription (line 8570) | std::string GetLastErrnoDescription() {
      function FailFromInternalError (line 8578) | static void FailFromInternalError(int fd) {
      class DeathTestImpl (line 8629) | class DeathTestImpl : public DeathTest {
        method DeathTestImpl (line 8631) | DeathTestImpl(const char* a_statement, Matcher<const std::string&>...
        method spawned (line 8647) | bool spawned() const { return spawned_; }
        method set_spawned (line 8648) | void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
        method status (line 8649) | int status() const { return status_; }
        method set_status (line 8650) | void set_status(int a_status) { status_ = a_status; }
        method DeathTestOutcome (line 8651) | DeathTestOutcome outcome() const { return outcome_; }
        method set_outcome (line 8652) | void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outc...
        method read_fd (line 8653) | int read_fd() const { return read_fd_; }
        method set_read_fd (line 8654) | void set_read_fd(int fd) { read_fd_ = fd; }
        method write_fd (line 8655) | int write_fd() const { return write_fd_; }
        method set_write_fd (line 8656) | void set_write_fd(int fd) { write_fd_ = fd; }
      function FormatDeathTestOutput (line 8765) | static ::std::string FormatDeathTestOutput(const ::std::string& outp...
      class WindowsDeathTest (line 8881) | class WindowsDeathTest : public DeathTestImpl {
        method WindowsDeathTest (line 8883) | WindowsDeathTest(const char* a_statement, Matcher<const std::strin...
      class FuchsiaDeathTest (line 9045) | class FuchsiaDeathTest : public DeathTestImpl {
        method FuchsiaDeathTest (line 9047) | FuchsiaDeathTest(const char* a_statement, Matcher<const std::strin...
      class Arguments (line 9072) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      class ForkingDeathTest (line 9303) | class ForkingDeathTest : public DeathTestImpl {
        method set_child_pid (line 9311) | void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
      class NoExecDeathTest (line 9340) | class NoExecDeathTest : public ForkingDeathTest {
        method NoExecDeathTest (line 9342) | NoExecDeathTest(const char* a_statement, Matcher<const std::string...
      class ExecDeathTest (line 9395) | class ExecDeathTest : public ForkingDeathTest {
        method ExecDeathTest (line 9397) | ExecDeathTest(const char* a_statement, Matcher<const std::string&>...
        method GetArgvsForDeathTestChildProcess (line 9405) | static ::std::vector<std::string> GetArgvsForDeathTestChildProcess...
      class Arguments (line 9421) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      type ExecDeathTestArgs (line 9453) | struct ExecDeathTestArgs {
      function ExecDeathTestChildMain (line 9464) | static int ExecDeathTestChildMain(void* child_arg) {
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9511) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9519) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function pid_t (line 9536) | static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
      function IsPathSeparator (line 9956) | static bool IsPathSeparator(char c) {
      function FilePath (line 9965) | FilePath FilePath::GetCurrentDir() {
      function FilePath (line 9992) | FilePath FilePath::RemoveExtension(const char* extension) const {
      function FilePath (line 10023) | FilePath FilePath::RemoveDirectoryName() const {
      function FilePath (line 10034) | FilePath FilePath::RemoveFileName() const {
      function FilePath (line 10051) | FilePath FilePath::MakeFileName(const FilePath& directory,
      function FilePath (line 10067) | FilePath FilePath::ConcatPaths(const FilePath& directory,
      function FilePath (line 10151) | FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
      function FilePath (line 10214) | FilePath FilePath::RemoveTrailingPathSeparator() const {
      function T (line 10433) | T ReadProcFileField(const std::string& filename, int field) {
      function GetThreadCount (line 10446) | size_t GetThreadCount() {
      function GetThreadCount (line 10454) | size_t GetThreadCount() {
      function GetThreadCount (line 10490) | size_t GetThreadCount() {
      function GetThreadCount (line 10513) | size_t GetThreadCount() {
      function GetThreadCount (line 10551) | size_t GetThreadCount() {
      function GetThreadCount (line 10569) | size_t GetThreadCount() {
      function GetThreadCount (line 10582) | size_t GetThreadCount() {
      function GetThreadCount (line 10601) | size_t GetThreadCount() {
      function SleepMilliseconds (line 10611) | void SleepMilliseconds(int n) {
      class MemoryIsNotDeallocated (line 10722) | class MemoryIsNotDeallocated
        method MemoryIsNotDeallocated (line 10725) | MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {
      class ThreadWithParamSupport (line 10795) | class ThreadWithParamSupport : public ThreadWithParamBase {
        method HANDLE (line 10797) | static HANDLE CreateThread(Runnable* runnable,
        type ThreadMainParam (line 10817) | struct ThreadMainParam {
          method ThreadMainParam (line 10818) | ThreadMainParam(Runnable* runnable, Notification* thread_can_start)
        method DWORD (line 10827) | static DWORD WINAPI ThreadMain(void* ptr) {
      class ThreadLocalRegistryImpl (line 10863) | class ThreadLocalRegistryImpl {
        method ThreadLocalValueHolderBase (line 10867) | static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
        method OnThreadLocalDestroyed (line 10898) | static void OnThreadLocalDestroyed(
        method OnThreadExit (line 10926) | static void OnThreadExit(DWORD thread_id) {
        method StartWatcherThreadFor (line 10965) | static void StartWatcherThreadFor(DWORD thread_id) {
        method DWORD (line 10992) | static DWORD WINAPI WatcherThreadFunc(LPVOID param) {
        method ThreadIdToThreadLocals (line 11004) | static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
      function ThreadLocalValueHolderBase (line 11022) | ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentTh...
      function IsInSet (line 11102) | bool IsInSet(char ch, const char* str) {
      function IsAsciiDigit (line 11109) | bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
      function IsAsciiPunct (line 11110) | bool IsAsciiPunct(char ch) {
      function IsRepeat (line 11113) | bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
      function IsAsciiWhiteSpace (line 11114) | bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
      function IsAsciiWordChar (line 11115) | bool IsAsciiWordChar(char ch) {
      function IsValidEscape (line 11121) | bool IsValidEscape(char c) {
      function AtomMatchesChar (line 11127) | bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
      function FormatRegexSyntaxError (line 11149) | static std::string FormatRegexSyntaxError(const char* regex, int ind...
      function ValidateRegex (line 11156) | bool ValidateRegex(const char* regex) {
      function MatchRepetitionAndRegexAtHead (line 11216) | bool MatchRepetitionAndRegexAtHead(
      function MatchRegexAtHead (line 11243) | bool MatchRegexAtHead(const char* regex, const char* str) {
      function MatchRegexAnywhere (line 11279) | bool MatchRegexAnywhere(const char* regex, const char* str) {
      function FormatFileLocation (line 11351) | GTEST_API_ ::std::string FormatFileLocation(const char* file, int li...
      function FormatCompilerIndependentFileLocation (line 11369) | GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
      class CapturedStream (line 11405) | class CapturedStream {
        method CapturedStream (line 11408) | explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
        method GetCapturedString (line 11462) | std::string GetCapturedString() {
      function CaptureStream (line 11496) | static void CaptureStream(int fd, const char* stream_name,
      function GetCapturedStream (line 11506) | static std::string GetCapturedStream(CapturedStream** captured_strea...
      function CaptureStdout (line 11516) | void CaptureStdout() {
      function CaptureStderr (line 11521) | void CaptureStderr() {
      function GetCapturedStdout (line 11526) | std::string GetCapturedStdout() {
      function GetCapturedStderr (line 11531) | std::string GetCapturedStderr() {
      function GetFileSize (line 11541) | size_t GetFileSize(FILE* file) {
      function ReadEntireFile (line 11546) | std::string ReadEntireFile(FILE* file) {
      function GetInjectableArgvs (line 11572) | std::vector<std::string> GetInjectableArgvs() {
      function SetInjectableArgvs (line 11579) | void SetInjectableArgvs(const std::vector<std::string>* new_argvs) {
      function SetInjectableArgvs (line 11584) | void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {
      function ClearInjectableArgvs (line 11589) | void ClearInjectableArgvs() {
      type posix (line 11596) | namespace posix {
        function Abort (line 11597) | void Abort() {
      function FlagToEnvVar (line 11607) | static std::string FlagToEnvVar(const char* flag) {
      function ParseInt32 (line 11622) | bool ParseInt32(const Message& src_text, const char* str, int32_t* v...
      function BoolFromGTestEnv (line 11664) | bool BoolFromGTestEnv(const char* flag, bool default_value) {
      function Int32FromGTestEnv (line 11678) | int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {
      function OutputFlagAlsoCheckEnvVar (line 11710) | std::string OutputFlagAlsoCheckEnvVar(){
      function PrintBytesInObjectTo (line 11858) | void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
      type CharFormat (line 11868) | enum CharFormat {
      function IsPrintableAscii (line 11877) | inline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= ...
      function CharFormat (line 11883) | static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
      function CharFormat (line 11932) | static CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) {
      function CharFormat (line 11977) | static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
      function CharFormat (line 11982) | static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {
      function CharFormat (line 11987) | static CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) {
      function CharFormat (line 11991) | static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
      function PrintCharAndCodeTo (line 11999) | void PrintCharAndCodeTo(Char c, ostream* os) {
      function PrintTo (line 12023) | void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCode...
      function PrintTo (line 12024) | void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo...
      function PrintTo (line 12028) | void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); }
      function PrintTo (line 12031) | void PrintTo(char32_t c, ::std::ostream* os) {
      function CharFormat (line 12045) | static CharFormat PrintCharsAsStringTo(
      function UniversalPrintCharArray (line 12076) | static void UniversalPrintCharArray(
      function UniversalPrintArray (line 12099) | void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
      function UniversalPrintArray (line 12106) | void UniversalPrintArray(const char8_t* begin, size_t len, ostream* ...
      function UniversalPrintArray (line 12113) | void UniversalPrintArray(const char16_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12119) | void UniversalPrintArray(const char32_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12125) | void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* ...
      function PrintCStringTo (line 12133) | void PrintCStringTo(const Char* s, ostream* os) {
      function PrintTo (line 12144) | void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12147) | void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12150) | void PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12152) | void PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12162) | void PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }
      function ContainsUnprintableControlCodes (line 12167) | bool ContainsUnprintableControlCodes(const char* str, size_t length) {
      function IsUTF8TrailByte (line 12186) | bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }
      function IsValidUTF8 (line 12188) | bool IsValidUTF8(const char* str, size_t length) {
      function ConditionalPrintAsText (line 12223) | void ConditionalPrintAsText(const char* str, size_t length, ostream*...
      function PrintStringTo (line 12232) | void PrintStringTo(const ::std::string& s, ostream* os) {
      function PrintU8StringTo (line 12241) | void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
      function PrintU16StringTo (line 12246) | void PrintU16StringTo(const ::std::u16string& s, ostream* os) {
      function PrintU32StringTo (line 12250) | void PrintU32StringTo(const ::std::u32string& s, ostream* os) {
      function PrintWideStringTo (line 12255) | void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
      function SplitIntoTestNames (line 12411) | static std::vector<std::string> SplitIntoTestNames(const char* src) {
      function GTEST_API_ (line 12712) | GTEST_API_ std::string JoinAsTuple(const Strings& fields) {
      function GTEST_API_ (line 12733) | GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_n...
      class GoogleTestFailureReporter (line 12755) | class GoogleTestFailureReporter : public FailureReporterInterface {
        method ReportFailure (line 12757) | void ReportFailure(FailureType type, const char* file, int line,
      function GTEST_API_ (line 12773) | GTEST_API_ FailureReporterInterface* GetFailureReporter() {
      function GTEST_API_ (line 12789) | GTEST_API_ bool LogIsVisible(LogSeverity severity) {
      function GTEST_API_ (line 12810) | GTEST_API_ void Log(LogSeverity severity, const std::string& message,
      function GTEST_API_ (line 12848) | GTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatc...
      function GTEST_API_ (line 12850) | GTEST_API_ void IllegalDoDefault(const char* file, int line) {
      function GTEST_API_ (line 12911) | GTEST_API_ std::string FormatMatcherDescription(bool negation,
      class MaxBipartiteMatchState (line 12981) | class MaxBipartiteMatchState {
        method MaxBipartiteMatchState (line 12983) | explicit MaxBipartiteMatchState(const MatchMatrix& graph)
        method ElementMatcherPairs (line 12989) | ElementMatcherPairs Compute() {
        method TryAugment (line 13041) | bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {
      function GTEST_API_ (line 13085) | GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchM...
      function LogElementMatcherPairVec (line 13089) | static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,
      function GTEST_API_ (line 13388) | GTEST_API_ void LogWithLocation(testing::internal::LogSeverity sever...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13425) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13452) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13472) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13503) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13526) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function ReportUninterestingCall (line 13599) | void ReportUninterestingCall(CallReaction reaction, const std::strin...
      function GTEST_LOCK_EXCLUDED_ (line 13634) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13647) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13658) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13675) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13693) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function Expectation (line 13821) | Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* ...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13842) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function CallReaction (line 13886) | CallReaction intToCallReaction(int mock_behavior) {
      function ParseGoogleMockBoolFlag (line 14323) | static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,
      function ParseGoogleMockStringFlag (line 14342) | static bool ParseGoogleMockStringFlag(const char* str, const char* f...
      function ParseGoogleMockIntFlag (line 14355) | static bool ParseGoogleMockIntFlag(const char* str, const char* flag,
      function InitGoogleMockImpl (line 14373) | void InitGoogleMockImpl(int* argc, CharType** argv) {
    type internal (line 1661) | namespace internal {
      function SingleFailureChecker (line 172) | class GTEST_API_ SingleFailureChecker {
      function GetRandomSeedFromFlag (line 521) | inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
      function GetNextRandomSeed (line 537) | inline int GetNextRandomSeed(int seed) {
      class GTestFlagSaver (line 547) | class GTestFlagSaver {
        method GTestFlagSaver (line 550) | GTestFlagSaver() {
      function CountIf (line 677) | inline int CountIf(const Container& c, Predicate predicate) {
      function ForEach (line 690) | void ForEach(const Container& c, Functor functor) {
      function E (line 697) | inline E GetElementOr(const std::vector<E>& v, int i, E default_valu...
      function ShuffleRange (line 707) | void ShuffleRange(internal::Random* random, int begin, int end,
      function Shuffle (line 731) | inline void Shuffle(internal::Random* random, std::vector<E>* v) {
      function Delete (line 738) | static void Delete(T* x) {
      class TestPropertyKeyIs (line 745) | class TestPropertyKeyIs {
        method TestPropertyKeyIs (line 750) | explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
      function UnitTestOptions (line 771) | class GTEST_API_ UnitTestOptions {
      class OsStackTraceGetterInterface (line 809) | class OsStackTraceGetterInterface {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      class OsStackTraceGetter (line 836) | class OsStackTraceGetter : public OsStackTraceGetterInterface {
        method OsStackTraceGetter (line 838) | OsStackTraceGetter() {}
      type TraceInfo (line 858) | struct TraceInfo {
      class DefaultGlobalTestPartResultReporter (line 866) | class DefaultGlobalTestPartResultReporter
      class DefaultPerThreadTestPartResultReporter (line 882) | class DefaultPerThreadTestPartResultReporter
      function UnitTestImpl (line 900) | class GTEST_API_ UnitTestImpl {
      function UnitTestImpl (line 1359) | inline UnitTestImpl* GetUnitTestImpl() {
      function ParseNaturalNumber (line 1399) | bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
      class TestResultAccessor (line 1433) | class TestResultAccessor {
        method RecordProperty (line 1435) | static void RecordProperty(TestResult* test_result,
        method ClearTestPartResults (line 1441) | static void ClearTestPartResults(TestResult* test_result) {
      class StreamingListener (line 1454) | class StreamingListener : public EmptyTestEventListener {
        class AbstractSocketWriter (line 1457) | class AbstractSocketWriter {
          method CloseConnection (line 1465) | virtual void CloseConnection() {}
          method SendLn (line 1468) | void SendLn(const std::string& message) { Send(message + "\n"); }
        class SocketWriter (line 1472) | class SocketWriter : public AbstractSocketWriter {
          method SocketWriter (line 1474) | SocketWriter(const std::string& host, const std::string& port)
          method Send (line 1485) | void Send(const std::string& message) override {
          method CloseConnection (line 1502) | void CloseConnection() override {
        method StreamingListener (line 1520) | StreamingListener(const std::string& host, const std::string& port)
        method StreamingListener (line 1525) | explicit StreamingListener(AbstractSocketWriter* socket_writer)
        method OnTestProgramStart (line 1528) | void OnTestProgramStart(const UnitTest& /* unit_test */) override {
        method OnTestProgramEnd (line 1532) | void OnTestProgramEnd(const UnitTest& unit_test) override {
        method OnTestIterationStart (line 1541) | void OnTestIterationStart(const UnitTest& /* unit_test */,
        method OnTestIterationEnd (line 1547) | void OnTestIterationEnd(const UnitTest& unit_test,
        method OnTestCaseStart (line 1556) | void OnTestCaseStart(const TestCase& test_case) override {
        method OnTestCaseEnd (line 1562) | void OnTestCaseEnd(const TestCase& test_case) override {
        method OnTestStart (line 1568) | void OnTestStart(const TestInfo& test_info) override {
        method OnTestEnd (line 1572) | void OnTestEnd(const TestInfo& test_info) override {
        method OnTestPartResult (line 1579) | void OnTestPartResult(const TestPartResult& test_part_result) over...
        method SendLn (line 1589) | void SendLn(const std::string& message) { socket_writer_->SendLn(m...
        method Start (line 1593) | void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
        method FormatBool (line 1595) | std::string FormatBool(bool value) { return value ? "1" : "0"; }
      function FILE (line 1672) | static FILE* OpenFileForWriting(const std::string& output_file) {
      function GTestIsInitialized (line 1859) | static bool GTestIsInitialized() { return GetArgvs().size() > 0; }
      function SumOverTestSuiteList (line 1864) | static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_...
      function TestSuitePassed (line 1874) | static bool TestSuitePassed(const TestSuite* test_suite) {
      function TestSuiteFailed (line 1879) | static bool TestSuiteFailed(const TestSuite* test_suite) {
      function ShouldRunTestSuite (line 1885) | static bool ShouldRunTestSuite(const TestSuite* test_suite) {
      class FailureTest (line 1923) | class FailureTest : public Test {
        method FailureTest (line 1925) | explicit FailureTest(const CodeLocation& loc, std::string error_me...
        method TestBody (line 1931) | void TestBody() override {
      function InsertSyntheticTestCase (line 1960) | void InsertSyntheticTestCase(const std::string& name, CodeLocation l...
      function RegisterTypeParameterizedTestSuite (line 2003) | void RegisterTypeParameterizedTestSuite(const char* test_suite_name,
      function RegisterTypeParameterizedTestSuiteInstantiation (line 2009) | void RegisterTypeParameterizedTestSuiteInstantiation(const char* cas...
      function GetArgvs (line 2071) | ::std::vector<std::string> GetArgvs() {
      function FilePath (line 2084) | FilePath GetCurrentExecutableName() {
      function PatternMatchesString (line 2146) | static bool PatternMatchesString(const std::string& name_str,
      function TypeId (line 2338) | TypeId GetTestTypeId() {
      function AssertionResult (line 2349) | static AssertionResult HasOneFailure(const char* /* results_expr */,
      function TestPartResultReporterInterface (line 2419) | TestPartResultReporterInterface*
      function TestPartResultReporterInterface (line 2433) | TestPartResultReporterInterface*
      class Timer (line 2526) | class Timer {
        method Timer (line 2528) | Timer() : start_(std::chrono::steady_clock::now()) {}
        method TimeInMillis (line 2531) | TimeInMillis Elapsed() {
      function TimeInMillis (line 2544) | TimeInMillis GetTimeInMillis() {
      function LPCWSTR (line 2560) | LPCWSTR String::AnsiToUtf16(const char* ansi) {
      function StreamWideCharsToMessage (line 2607) | static void StreamWideCharsToMessage(const wchar_t* wstr, size_t len...
      function SplitString (line 2623) | void SplitString(const ::std::string& str, char delimiter,
      type edit_distance (line 2717) | namespace edit_distance {
        function CalculateOptimalEdits (line 2718) | std::vector<EditType> CalculateOptimalEdits(const std::vector<size...
        class InternalStrings (line 2778) | class InternalStrings {
          method GetId (line 2780) | size_t GetId(const std::string& str) {
        function CalculateOptimalEdits (line 2794) | std::vector<EditType> CalculateOptimalEdits(
        class Hunk (line 2816) | class Hunk {
          method Hunk (line 2818) | Hunk(size_t left_start, size_t right_start)
          method PushLine (line 2825) | void PushLine(char edit, const char* line) {
          method PrintTo (line 2843) | void PrintTo(std::ostream* os) {
          method has_edits (line 2853) | bool has_edits() const { return adds_ || removes_; }
          method FlushEdits (line 2856) | void FlushEdits() {
          method PrintHeader (line 2865) | void PrintHeader(std::ostream* ss) const {
        function CreateUnifiedDiff (line 2893) | std::string CreateUnifiedDiff(const std::vector<std::string>& left,
      function SplitEscapedString (line 2963) | std::vector<std::string> SplitEscapedString(const std::string& str) {
      function AssertionResult (line 3003) | AssertionResult EqFailure(const char* lhs_expression,
      function GetBoolAssertionFailureMessage (line 3038) | std::string GetBoolAssertionFailureMessage(
      function AssertionResult (line 3054) | AssertionResult DoubleNearPredFormat(const char* expr1,
      function AssertionResult (line 3099) | AssertionResult FloatingPointLE(const char* expr1,
      function AssertionResult (line 3151) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3167) | AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression,
      function AssertionResult (line 3183) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function AssertionResult (line 3197) | AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
      function AssertionResult (line 3325) | AssertionResult HRESULTFailureHelper(const char* expr,
      function AssertionResult (line 3366) | AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NO...
      function AssertionResult (line 3373) | AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NO...
      function ChopLowBits (line 3409) | inline uint32_t ChopLowBits(uint32_t* bits, int n) {
      function CodePointToUtf8 (line 3421) | std::string CodePointToUtf8(uint32_t code_point) {
      function IsUtf16SurrogatePair (line 3456) | inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
      function CreateCodePointFromUtf16SurrogatePair (line 3462) | inline uint32_t CreateCodePointFromUtf16SurrogatePair(wchar_t first,
      function WideStringToUtf8 (line 3488) | std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
      function AssertionResult (line 3534) | AssertionResult CmpHelperSTREQ(const char* lhs_expression,
      function AssertionResult (line 3550) | AssertionResult CmpHelperSTRNE(const char* s1_expression,
      function StringStreamToString (line 3655) | std::string StringStreamToString(::std::stringstream* ss) {
      function AppendUserMessage (line 3674) | std::string AppendUserMessage(const std::string& gtest_msg,
      function ReportFailureInUnknownLocation (line 3946) | void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
      function FormatCxxExceptionMessage (line 4048) | static std::string FormatCxxExceptionMessage(const char* description,
      function Result (line 4079) | Result HandleSehExceptionsInMethodIfSupported(
      function Result (line 4106) | Result HandleExceptionsInMethodIfSupported(
      function TestInfo (line 4247) | TestInfo* MakeAndRegisterTestInfo(
      function ReportInvalidTestSuiteType (line 4259) | void ReportInvalidTestSuiteType(const char* test_suite_name,
      type GTestColor (line 4625) | enum class GTestColor { kDefault, kRed, kGreen, kYellow }
      function PrintTestPartResultToString (line 4629) | static std::string PrintTestPartResultToString(
      function PrintTestPartResult (line 4639) | static void PrintTestPartResult(const TestPartResult& test_part_resu...
      function WORD (line 4662) | static WORD GetColorAttribute(GTestColor color) {
      function GetBitOffset (line 4674) | static int GetBitOffset(WORD color_mask) {
      function WORD (line 4685) | static WORD GetNewColor(GTestColor color, WORD old_color_attrs) {
      function ShouldUseColor (line 4725) | bool ShouldUseColor(bool stdout_is_tty) {
      function ColoredPrintf (line 4767) | static void ColoredPrintf(GTestColor color, const char *fmt, ...) {
      function PrintFullTestCommentIfPresent (line 4820) | static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
      class PrettyUnitTestResultPrinter (line 4839) | class PrettyUnitTestResultPrinter : public TestEventListener {
        method PrettyUnitTestResultPrinter (line 4841) | PrettyUnitTestResultPrinter() {}
        method PrintTestName (line 4842) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 4847) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnEnvironmentsSetUpEnd (line 4850) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnEnvironmentsTearDownEnd (line 4868) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 4870) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class BriefUnitTestResultPrinter (line 5138) | class BriefUnitTestResultPrinter : public TestEventListener {
        method BriefUnitTestResultPrinter (line 5140) | BriefUnitTestResultPrinter() {}
        method PrintTestName (line 5141) | static void PrintTestName(const char* test_suite, const char* test) {
        method OnTestProgramStart (line 5146) | void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}
        method OnTestIterationStart (line 5147) | void OnTestIterationStart(const UnitTest& /*unit_test*/,
        method OnEnvironmentsSetUpStart (line 5149) | void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) overr...
        method OnEnvironmentsSetUpEnd (line 5150) | void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) overrid...
        method OnTestCaseStart (line 5152) | void OnTestCaseStart(const TestCase& /*test_case*/) override {}
        method OnTestSuiteStart (line 5154) | void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}
        method OnTestStart (line 5157) | void OnTestStart(const TestInfo& /*test_info*/) override {}
        method OnTestCaseEnd (line 5162) | void OnTestCaseEnd(const TestCase& /*test_case*/) override {}
        method OnTestSuiteEnd (line 5164) | void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}
        method OnEnvironmentsTearDownStart (line 5167) | void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) ov...
        method OnEnvironmentsTearDownEnd (line 5168) | void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) over...
        method OnTestProgramEnd (line 5170) | void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}
      class TestEventRepeater (line 5242) | class TestEventRepeater : public TestEventListener {
        method TestEventRepeater (line 5244) | TestEventRepeater() : forwarding_enabled_(true) {}
        method forwarding_enabled (line 5251) | bool forwarding_enabled() const { return forwarding_enabled_; }
        method set_forwarding_enabled (line 5252) | void set_forwarding_enabled(bool enable) { forwarding_enabled_ = e...
      function TestEventListener (line 5294) | TestEventListener* TestEventRepeater::Release(TestEventListener *lis...
      class XmlUnitTestResultPrinter (line 5370) | class XmlUnitTestResultPrinter : public EmptyTestEventListener {
        method IsNormalizableWhitespace (line 5384) | static bool IsNormalizableWhitespace(char c) {
        method IsValidXmlCharacter (line 5389) | static bool IsValidXmlCharacter(char c) {
        method EscapeXmlAttribute (line 5403) | static std::string EscapeXmlAttribute(const std::string& str) {
        method EscapeXmlText (line 5408) | static std::string EscapeXmlText(const char* str) {
      function FormatTimeInMillisAsSeconds (line 5574) | std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
      function PortableLocaltime (line 5580) | static bool PortableLocaltime(time_t seconds, struct tm* out) {
      function FormatEpochTimeInMillisAsIso8601 (line 5601) | std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
      class JsonUnitTestResultPrinter (line 5918) | class JsonUnitTestResultPrinter : public EmptyTestEventListener {
      function FormatTimeInMillisAsDuration (line 6042) | static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) {
      function FormatEpochTimeInMillisAsRFC3339 (line 6050) | static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {
      function Indent (line 6063) | static inline std::string Indent(size_t width) {
      function GTEST_LOCK_EXCLUDED_ (line 6433) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function GTEST_LOCK_EXCLUDED_ (line 6482) | GTEST_LOCK_EXCLUDED_(mutex_) {
      class ScopedPrematureExitFile (line 6496) | class ScopedPrematureExitFile {
        method ScopedPrematureExitFile (line 6498) | explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
      class TestSuiteNameIs (line 7162) | class TestSuiteNameIs {
        method TestSuiteNameIs (line 7165) | explicit TestSuiteNameIs(const std::string& name) : name_(name) {}
      function TestSuite (line 7189) | TestSuite* UnitTestImpl::GetTestSuite(
      function SetUpEnvironment (line 7225) | static void SetUpEnvironment(Environment* env) { env->SetUp(); }
      function TearDownEnvironment (line 7226) | static void TearDownEnvironment(Environment* env) { env->TearDown(); }
      function WriteToShardStatusFileIfNeeded (line 7419) | void WriteToShardStatusFileIfNeeded() {
      function ShouldShard (line 7441) | bool ShouldShard(const char* total_shards_env,
      function Int32FromEnvOrDie (line 7486) | int32_t Int32FromEnvOrDie(const char* var, int32_t default_val) {
      function ShouldRunTestOnShard (line 7504) | bool ShouldRunTestOnShard(int total_shards, int shard_index, int tes...
      function PrintOnOneLine (line 7570) | static void PrintOnOneLine(const char* str, int max_length) {
      function OsStackTraceGetterInterface (line 7657) | OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
        method OsStackTraceGetterInterface (line 811) | OsStackTraceGetterInterface() {}
      function TestResult (line 7670) | TestResult* UnitTestImpl::current_test_result() {
      function GetCurrentOsStackTraceExceptTop (line 7716) | std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
      class ClassUniqueToAlwaysTrue (line 7726) | class ClassUniqueToAlwaysTrue {}
      function IsTrue (line 7729) | bool IsTrue(bool condition) { return condition; }
      function AlwaysTrue (line 7731) | bool AlwaysTrue() {
      function SkipPrefix (line 7744) | bool SkipPrefix(const char* prefix, const char** pstr) {
      function ParseBoolFlag (line 7795) | static bool ParseBoolFlag(const char* str, const char* flag, bool* v...
      function ParseInt32Flag (line 7811) | bool ParseInt32Flag(const char* str, const char* flag, int32_t* valu...
      function ParseStringFlag (line 7828) | static bool ParseStringFlag(const char* str, const char* flag, Strin...
      function HasGoogleTestFlagPrefix (line 7846) | static bool HasGoogleTestFlagPrefix(const char* str) {
      function PrintColorEncoded (line 7864) | static void PrintColorEncoded(const char* str) {
      function ParseGoogleTestFlag (line 7990) | static bool ParseGoogleTestFlag(const char* const arg) {
      function LoadFlagsFromFile (line 8022) | static void LoadFlagsFromFile(const std::string& path) {
      function ParseGoogleTestFlagsOnlyImpl (line 8045) | void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
      function ParseGoogleTestFlagsOnly (line 8098) | void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
      function ParseGoogleTestFlagsOnly (line 8112) | void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
      function InitGoogleTestImpl (line 8121) | void InitGoogleTestImpl(int* argc, CharType** argv) {
      function InDeathTestChild (line 8377) | bool InDeathTestChild() {
      function ExitSummary (line 8437) | static std::string ExitSummary(int exit_code) {
      function ExitedUnsuccessfully (line 8463) | bool ExitedUnsuccessfully(int exit_status) {
      function DeathTestThreadWarning (line 8472) | static std::string DeathTestThreadWarning(size_t thread_count) {
      type DeathTestOutcome (line 8510) | enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }
      function DeathTestAbort (line 8517) | static void DeathTestAbort(const std::string& message) {
      function GetLastErrnoDescription (line 8570) | std::string GetLastErrnoDescription() {
      function FailFromInternalError (line 8578) | static void FailFromInternalError(int fd) {
      class DeathTestImpl (line 8629) | class DeathTestImpl : public DeathTest {
        method DeathTestImpl (line 8631) | DeathTestImpl(const char* a_statement, Matcher<const std::string&>...
        method spawned (line 8647) | bool spawned() const { return spawned_; }
        method set_spawned (line 8648) | void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
        method status (line 8649) | int status() const { return status_; }
        method set_status (line 8650) | void set_status(int a_status) { status_ = a_status; }
        method DeathTestOutcome (line 8651) | DeathTestOutcome outcome() const { return outcome_; }
        method set_outcome (line 8652) | void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outc...
        method read_fd (line 8653) | int read_fd() const { return read_fd_; }
        method set_read_fd (line 8654) | void set_read_fd(int fd) { read_fd_ = fd; }
        method write_fd (line 8655) | int write_fd() const { return write_fd_; }
        method set_write_fd (line 8656) | void set_write_fd(int fd) { write_fd_ = fd; }
      function FormatDeathTestOutput (line 8765) | static ::std::string FormatDeathTestOutput(const ::std::string& outp...
      class WindowsDeathTest (line 8881) | class WindowsDeathTest : public DeathTestImpl {
        method WindowsDeathTest (line 8883) | WindowsDeathTest(const char* a_statement, Matcher<const std::strin...
      class FuchsiaDeathTest (line 9045) | class FuchsiaDeathTest : public DeathTestImpl {
        method FuchsiaDeathTest (line 9047) | FuchsiaDeathTest(const char* a_statement, Matcher<const std::strin...
      class Arguments (line 9072) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      class ForkingDeathTest (line 9303) | class ForkingDeathTest : public DeathTestImpl {
        method set_child_pid (line 9311) | void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
      class NoExecDeathTest (line 9340) | class NoExecDeathTest : public ForkingDeathTest {
        method NoExecDeathTest (line 9342) | NoExecDeathTest(const char* a_statement, Matcher<const std::string...
      class ExecDeathTest (line 9395) | class ExecDeathTest : public ForkingDeathTest {
        method ExecDeathTest (line 9397) | ExecDeathTest(const char* a_statement, Matcher<const std::string&>...
        method GetArgvsForDeathTestChildProcess (line 9405) | static ::std::vector<std::string> GetArgvsForDeathTestChildProcess...
      class Arguments (line 9421) | class Arguments {
        method Arguments (line 9074) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9082) | void AddArgument(const char* argument) {
        method AddArguments (line 9087) | void AddArguments(const ::std::vector<Str>& arguments) {
        method size (line 9098) | int size() {
        method Arguments (line 9423) | Arguments() { args_.push_back(nullptr); }
        method AddArgument (line 9431) | void AddArgument(const char* argument) {
        method AddArguments (line 9436) | void AddArguments(const ::std::vector<Str>& arguments) {
      type ExecDeathTestArgs (line 9453) | struct ExecDeathTestArgs {
      function ExecDeathTestChildMain (line 9464) | static int ExecDeathTestChildMain(void* child_arg) {
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9511) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ (line 9519) | GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
      function pid_t (line 9536) | static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
      function IsPathSeparator (line 9956) | static bool IsPathSeparator(char c) {
      function FilePath (line 9965) | FilePath FilePath::GetCurrentDir() {
      function FilePath (line 9992) | FilePath FilePath::RemoveExtension(const char* extension) const {
      function FilePath (line 10023) | FilePath FilePath::RemoveDirectoryName() const {
      function FilePath (line 10034) | FilePath FilePath::RemoveFileName() const {
      function FilePath (line 10051) | FilePath FilePath::MakeFileName(const FilePath& directory,
      function FilePath (line 10067) | FilePath FilePath::ConcatPaths(const FilePath& directory,
      function FilePath (line 10151) | FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
      function FilePath (line 10214) | FilePath FilePath::RemoveTrailingPathSeparator() const {
      function T (line 10433) | T ReadProcFileField(const std::string& filename, int field) {
      function GetThreadCount (line 10446) | size_t GetThreadCount() {
      function GetThreadCount (line 10454) | size_t GetThreadCount() {
      function GetThreadCount (line 10490) | size_t GetThreadCount() {
      function GetThreadCount (line 10513) | size_t GetThreadCount() {
      function GetThreadCount (line 10551) | size_t GetThreadCount() {
      function GetThreadCount (line 10569) | size_t GetThreadCount() {
      function GetThreadCount (line 10582) | size_t GetThreadCount() {
      function GetThreadCount (line 10601) | size_t GetThreadCount() {
      function SleepMilliseconds (line 10611) | void SleepMilliseconds(int n) {
      class MemoryIsNotDeallocated (line 10722) | class MemoryIsNotDeallocated
        method MemoryIsNotDeallocated (line 10725) | MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {
      class ThreadWithParamSupport (line 10795) | class ThreadWithParamSupport : public ThreadWithParamBase {
        method HANDLE (line 10797) | static HANDLE CreateThread(Runnable* runnable,
        type ThreadMainParam (line 10817) | struct ThreadMainParam {
          method ThreadMainParam (line 10818) | ThreadMainParam(Runnable* runnable, Notification* thread_can_start)
        method DWORD (line 10827) | static DWORD WINAPI ThreadMain(void* ptr) {
      class ThreadLocalRegistryImpl (line 10863) | class ThreadLocalRegistryImpl {
        method ThreadLocalValueHolderBase (line 10867) | static ThreadLocalValueHolderBase* GetValueOnCurrentThread(
        method OnThreadLocalDestroyed (line 10898) | static void OnThreadLocalDestroyed(
        method OnThreadExit (line 10926) | static void OnThreadExit(DWORD thread_id) {
        method StartWatcherThreadFor (line 10965) | static void StartWatcherThreadFor(DWORD thread_id) {
        method DWORD (line 10992) | static DWORD WINAPI WatcherThreadFunc(LPVOID param) {
        method ThreadIdToThreadLocals (line 11004) | static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {
      function ThreadLocalValueHolderBase (line 11022) | ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentTh...
      function IsInSet (line 11102) | bool IsInSet(char ch, const char* str) {
      function IsAsciiDigit (line 11109) | bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
      function IsAsciiPunct (line 11110) | bool IsAsciiPunct(char ch) {
      function IsRepeat (line 11113) | bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
      function IsAsciiWhiteSpace (line 11114) | bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
      function IsAsciiWordChar (line 11115) | bool IsAsciiWordChar(char ch) {
      function IsValidEscape (line 11121) | bool IsValidEscape(char c) {
      function AtomMatchesChar (line 11127) | bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
      function FormatRegexSyntaxError (line 11149) | static std::string FormatRegexSyntaxError(const char* regex, int ind...
      function ValidateRegex (line 11156) | bool ValidateRegex(const char* regex) {
      function MatchRepetitionAndRegexAtHead (line 11216) | bool MatchRepetitionAndRegexAtHead(
      function MatchRegexAtHead (line 11243) | bool MatchRegexAtHead(const char* regex, const char* str) {
      function MatchRegexAnywhere (line 11279) | bool MatchRegexAnywhere(const char* regex, const char* str) {
      function FormatFileLocation (line 11351) | GTEST_API_ ::std::string FormatFileLocation(const char* file, int li...
      function FormatCompilerIndependentFileLocation (line 11369) | GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
      class CapturedStream (line 11405) | class CapturedStream {
        method CapturedStream (line 11408) | explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
        method GetCapturedString (line 11462) | std::string GetCapturedString() {
      function CaptureStream (line 11496) | static void CaptureStream(int fd, const char* stream_name,
      function GetCapturedStream (line 11506) | static std::string GetCapturedStream(CapturedStream** captured_strea...
      function CaptureStdout (line 11516) | void CaptureStdout() {
      function CaptureStderr (line 11521) | void CaptureStderr() {
      function GetCapturedStdout (line 11526) | std::string GetCapturedStdout() {
      function GetCapturedStderr (line 11531) | std::string GetCapturedStderr() {
      function GetFileSize (line 11541) | size_t GetFileSize(FILE* file) {
      function ReadEntireFile (line 11546) | std::string ReadEntireFile(FILE* file) {
      function GetInjectableArgvs (line 11572) | std::vector<std::string> GetInjectableArgvs() {
      function SetInjectableArgvs (line 11579) | void SetInjectableArgvs(const std::vector<std::string>* new_argvs) {
      function SetInjectableArgvs (line 11584) | void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {
      function ClearInjectableArgvs (line 11589) | void ClearInjectableArgvs() {
      type posix (line 11596) | namespace posix {
        function Abort (line 11597) | void Abort() {
      function FlagToEnvVar (line 11607) | static std::string FlagToEnvVar(const char* flag) {
      function ParseInt32 (line 11622) | bool ParseInt32(const Message& src_text, const char* str, int32_t* v...
      function BoolFromGTestEnv (line 11664) | bool BoolFromGTestEnv(const char* flag, bool default_value) {
      function Int32FromGTestEnv (line 11678) | int32_t Int32FromGTestEnv(const char* flag, int32_t default_value) {
      function OutputFlagAlsoCheckEnvVar (line 11710) | std::string OutputFlagAlsoCheckEnvVar(){
      function PrintBytesInObjectTo (line 11858) | void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
      type CharFormat (line 11868) | enum CharFormat {
      function IsPrintableAscii (line 11877) | inline bool IsPrintableAscii(char32_t c) { return 0x20 <= c && c <= ...
      function CharFormat (line 11883) | static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
      function CharFormat (line 11932) | static CharFormat PrintAsStringLiteralTo(char32_t c, ostream* os) {
      function CharFormat (line 11977) | static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
      function CharFormat (line 11982) | static CharFormat PrintAsStringLiteralTo(char8_t c, ostream* os) {
      function CharFormat (line 11987) | static CharFormat PrintAsStringLiteralTo(char16_t c, ostream* os) {
      function CharFormat (line 11991) | static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
      function PrintCharAndCodeTo (line 11999) | void PrintCharAndCodeTo(Char c, ostream* os) {
      function PrintTo (line 12023) | void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCode...
      function PrintTo (line 12024) | void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo...
      function PrintTo (line 12028) | void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); }
      function PrintTo (line 12031) | void PrintTo(char32_t c, ::std::ostream* os) {
      function CharFormat (line 12045) | static CharFormat PrintCharsAsStringTo(
      function UniversalPrintCharArray (line 12076) | static void UniversalPrintCharArray(
      function UniversalPrintArray (line 12099) | void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
      function UniversalPrintArray (line 12106) | void UniversalPrintArray(const char8_t* begin, size_t len, ostream* ...
      function UniversalPrintArray (line 12113) | void UniversalPrintArray(const char16_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12119) | void UniversalPrintArray(const char32_t* begin, size_t len, ostream*...
      function UniversalPrintArray (line 12125) | void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* ...
      function PrintCStringTo (line 12133) | void PrintCStringTo(const Char* s, ostream* os) {
      function PrintTo (line 12144) | void PrintTo(const char* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12147) | void PrintTo(const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12150) | void PrintTo(const char16_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12152) | void PrintTo(const char32_t* s, ostream* os) { PrintCStringTo(s, os); }
      function PrintTo (line 12162) | void PrintTo(const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }
      function ContainsUnprintableControlCodes (line 12167) | bool ContainsUnprintableControlCodes(const char* str, size_t length) {
      function IsUTF8TrailByte (line 12186) | bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; }
      function IsValidUTF8 (line 12188) | bool IsValidUTF8(const char* str, size_t length) {
      function ConditionalPrintAsText (line 12223) | void ConditionalPrintAsText(const char* str, size_t length, ostream*...
      function PrintStringTo (line 12232) | void PrintStringTo(const ::std::string& s, ostream* os) {
      function PrintU8StringTo (line 12241) | void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
      function PrintU16StringTo (line 12246) | void PrintU16StringTo(const ::std::u16string& s, ostream* os) {
      function PrintU32StringTo (line 12250) | void PrintU32StringTo(const ::std::u32string& s, ostream* os) {
      function PrintWideStringTo (line 12255) | void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
      function SplitIntoTestNames (line 12411) | static std::vector<std::string> SplitIntoTestNames(const char* src) {
      function GTEST_API_ (line 12712) | GTEST_API_ std::string JoinAsTuple(const Strings& fields) {
      function GTEST_API_ (line 12733) | GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_n...
      class GoogleTestFailureReporter (line 12755) | class GoogleTestFailureReporter : public FailureReporterInterface {
        method ReportFailure (line 12757) | void ReportFailure(FailureType type, const char* file, int line,
      function GTEST_API_ (line 12773) | GTEST_API_ FailureReporterInterface* GetFailureReporter() {
      function GTEST_API_ (line 12789) | GTEST_API_ bool LogIsVisible(LogSeverity severity) {
      function GTEST_API_ (line 12810) | GTEST_API_ void Log(LogSeverity severity, const std::string& message,
      function GTEST_API_ (line 12848) | GTEST_API_ WithoutMatchers GetWithoutMatchers() { return WithoutMatc...
      function GTEST_API_ (line 12850) | GTEST_API_ void IllegalDoDefault(const char* file, int line) {
      function GTEST_API_ (line 12911) | GTEST_API_ std::string FormatMatcherDescription(bool negation,
      class MaxBipartiteMatchState (line 12981) | class MaxBipartiteMatchState {
        method MaxBipartiteMatchState (line 12983) | explicit MaxBipartiteMatchState(const MatchMatrix& graph)
        method ElementMatcherPairs (line 12989) | ElementMatcherPairs Compute() {
        method TryAugment (line 13041) | bool TryAugment(size_t ilhs, ::std::vector<char>* seen) {
      function GTEST_API_ (line 13085) | GTEST_API_ ElementMatcherPairs FindMaxBipartiteMatching(const MatchM...
      function LogElementMatcherPairVec (line 13089) | static void LogElementMatcherPairVec(const ElementMatcherPairs& pairs,
      function GTEST_API_ (line 13388) | GTEST_API_ void LogWithLocation(testing::internal::LogSeverity sever...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13425) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13452) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13472) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13503) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13526) | GTEST_LOCK_EXCLUDED_(mutex_) {
      function ReportUninterestingCall (line 13599) | void ReportUninterestingCall(CallReaction reaction, const std::strin...
      function GTEST_LOCK_EXCLUDED_ (line 13634) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13647) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13658) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13675) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function GTEST_LOCK_EXCLUDED_ (line 13693) | GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {
      function Expectation (line 13821) | Expectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* ...
      function GTEST_EXCLUSIVE_LOCK_REQUIRED_ (line 13842) | GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
      function CallReaction (line 13886) | CallReaction intToCallReaction(int mock_behavior) {
      function ParseGoogleMockBoolFlag (line 14323) | static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,
      function ParseGoogleMockStringFlag (line 14342) | static bool ParseGoogleMockStringFlag(const char* str, const char* f...
  
Condensed preview — 134 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,161K chars).
[
  {
    "path": ".clang-format",
    "chars": 421,
    "preview": "# Run manually to reformat a file:\n# clang-format -i --style=file <file>\nLanguage: Cpp\nBasedOnStyle: Google\nIndentPPDire"
  },
  {
    "path": ".clang-tidy",
    "chars": 134,
    "preview": "Checks: modernize-use-trailing-return-type\nCheckOptions:\n  - key: modernize-use-trailing-return-type.TransformLambdas\n  "
  },
  {
    "path": ".cmake-format",
    "chars": 77,
    "preview": "format:\n  separate_ctrl_name_with_space: true\nmarkup:\n  enable_markup: false\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 15,
    "preview": "github: vitaut\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 259,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\" # Necessary to update action hashes.\t\n    directory: \"/\"\n   "
  },
  {
    "path": ".github/issue_template.md",
    "chars": 194,
    "preview": "<!--\nPlease make sure that the problem reproduces on the current master before\nsubmitting an issue.\nIf possible please p"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 305,
    "preview": "<!--\nPlease read the contribution guidelines before submitting a pull request:\nhttps://github.com/fmtlib/fmt/blob/master"
  },
  {
    "path": ".github/workflows/cifuzz.yml",
    "chars": 840,
    "preview": "name: CIFuzz\non: [pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  Fuzzing:\n    runs-on: ubuntu-latest\n    steps:\n "
  },
  {
    "path": ".github/workflows/doc.yml",
    "chars": 1583,
    "preview": "name: doc\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n\n    steps:"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 1014,
    "preview": "name: lint\n\non:\n  pull_request:\n    paths:\n      - '**.h'\n      - '**.cc'\n      - '**.cmake'\n      - '**/CMakeLists.txt'"
  },
  {
    "path": ".github/workflows/linux.yml",
    "chars": 7514,
    "preview": "name: linux\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-22.04\n    strat"
  },
  {
    "path": ".github/workflows/macos.yml",
    "chars": 1569,
    "preview": "name: macos\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    strategy:\n      matrix:\n       "
  },
  {
    "path": ".github/workflows/scorecard.yml",
    "chars": 2631,
    "preview": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by "
  },
  {
    "path": ".github/workflows/windows.yml",
    "chars": 2774,
    "preview": "name: windows\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    runs-on: ${{matrix.os}}\n    s"
  },
  {
    "path": ".gitignore",
    "chars": 260,
    "preview": "*.a\n*.so*\n*.xcodeproj\n*~\n.vscode/\n.cache/\n.vs/\n/CMakeScripts\n/Testing\n/_CPack_Packages\n/install_manifest.txt\nCMakeCache."
  },
  {
    "path": "CMakeLists.txt",
    "chars": 19675,
    "preview": "cmake_minimum_required(VERSION 3.8...3.28)\ninclude_guard(GLOBAL)\n\n# Fallback for using newer policies on CMake <3.12.\nif"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 710,
    "preview": "Contributing to {fmt}\n=====================\n\nBy submitting a pull request or a patch, you represent that you have the ri"
  },
  {
    "path": "ChangeLog.md",
    "chars": 120575,
    "preview": "# 12.1.0 - 2025-10-29\n\n- Optimized `buffer::append`, resulting in up to ~16% improvement on spdlog\n  benchmarks (https:/"
  },
  {
    "path": "LICENSE",
    "chars": 1094,
    "preview": "Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "README.md",
    "chars": 19767,
    "preview": "<img src=\"https://user-images.githubusercontent.com/576385/156254208-f5b743a9-88cf-439d-b0c0-923d53e8d551.png\" alt=\"{fmt"
  },
  {
    "path": "doc/ChangeLog-old.md",
    "chars": 112401,
    "preview": "# 7.1.3 - 2020-11-24\n\n- Fixed handling of buffer boundaries in `format_to_n`\n  (https://github.com/fmtlib/fmt/issues/199"
  },
  {
    "path": "doc/LICENSE-exception",
    "chars": 1431,
    "preview": "Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "doc/api.md",
    "chars": 23495,
    "preview": "# API Reference\n\nThe {fmt} library API consists of the following components:\n\n- [`fmt/base.h`](#base-api): the base API "
  },
  {
    "path": "doc/fmt.css",
    "chars": 1273,
    "preview": ":root {\n  --md-primary-fg-color: #0050D0;\n}\n\n.md-grid {\n  max-width: 960px;\n}\n\n@media (min-width: 400px) {\n  .md-tabs {\n"
  },
  {
    "path": "doc/fmt.js",
    "chars": 76,
    "preview": "document$.subscribe(() => {\n  hljs.highlightAll(),\n  { language: 'c++' }\n})\n"
  },
  {
    "path": "doc/get-started.md",
    "chars": 7592,
    "preview": "# Get Started\n\nCompile and run {fmt} examples online with [Compiler Explorer](\nhttps://godbolt.org/z/P7h6cd6o3).\n\n{fmt} "
  },
  {
    "path": "doc/index.md",
    "chars": 4680,
    "preview": "---\nhide:\n  - navigation\n  - toc\n---\n\n# A modern formatting library\n\n<div class=\"features-container\">\n\n<div class=\"featu"
  },
  {
    "path": "doc/python-license.txt",
    "chars": 14903,
    "preview": "A. HISTORY OF THE SOFTWARE\n==========================\n\nPython was created in the early 1990s by Guido van Rossum at Stic"
  },
  {
    "path": "doc/syntax.md",
    "chars": 27965,
    "preview": "# Format String Syntax\n\nFormatting functions such as [`fmt::format`](api.md#format) and [`fmt::print`](\napi.md#print) us"
  },
  {
    "path": "include/fmt/args.h",
    "chars": 7169,
    "preview": "// Formatting library for C++ - dynamic argument lists\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All right"
  },
  {
    "path": "include/fmt/base.h",
    "chars": 99966,
    "preview": "// Formatting library for C++ - the base API for char/UTF-8\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All "
  },
  {
    "path": "include/fmt/chrono.h",
    "chars": 77312,
    "preview": "// Formatting library for C++ - chrono support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserv"
  },
  {
    "path": "include/fmt/color.h",
    "chars": 23878,
    "preview": "// Formatting library for C++ - color support\n//\n// Copyright (c) 2018 - present, Victor Zverovich and fmt contributors\n"
  },
  {
    "path": "include/fmt/compile.h",
    "chars": 21038,
    "preview": "// Formatting library for C++ - experimental format string compilation\n//\n// Copyright (c) 2012 - present, Victor Zverov"
  },
  {
    "path": "include/fmt/core.h",
    "chars": 194,
    "preview": "#include \"base.h\"\n\n// Using fmt::format via fmt/core.h has been deprecated since version 11\n// and now requires an expli"
  },
  {
    "path": "include/fmt/fmt-c.h",
    "chars": 6574,
    "preview": "// Formatting library for C++ - the C API\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n/"
  },
  {
    "path": "include/fmt/format-inl.h",
    "chars": 82711,
    "preview": "// Formatting library for C++ - implementation\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved."
  },
  {
    "path": "include/fmt/format.h",
    "chars": 165493,
    "preview": "/*\n  Formatting library for C++\n\n  Copyright (c) 2012 - present, Victor Zverovich\n\n  Permission is hereby granted, free "
  },
  {
    "path": "include/fmt/os.h",
    "chars": 12589,
    "preview": "// Formatting library for C++ - optional OS-specific functionality\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n"
  },
  {
    "path": "include/fmt/ostream.h",
    "chars": 5023,
    "preview": "// Formatting library for C++ - std::ostream support\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights "
  },
  {
    "path": "include/fmt/printf.h",
    "chars": 21052,
    "preview": "// Formatting library for C++ - legacy printf implementation\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All ri"
  },
  {
    "path": "include/fmt/ranges.h",
    "chars": 28119,
    "preview": "// Formatting library for C++ - range and tuple support\n//\n// Copyright (c) 2012 - present, Victor Zverovich and {fmt} c"
  },
  {
    "path": "include/fmt/std.h",
    "chars": 26049,
    "preview": "// Formatting library for C++ - formatters for standard library types\n//\n// Copyright (c) 2012 - present, Victor Zverovi"
  },
  {
    "path": "include/fmt/xchar.h",
    "chars": 13790,
    "preview": "// Formatting library for C++ - optional wchar_t and exotic character support\n//\n// Copyright (c) 2012 - present, Victor"
  },
  {
    "path": "src/fmt-c.cc",
    "chars": 1537,
    "preview": "// Formatting library for C++ - the C API\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n/"
  },
  {
    "path": "src/fmt.cc",
    "chars": 3331,
    "preview": "module;\n\n#define FMT_MODULE\n\n#ifdef _MSVC_LANG\n#  define FMT_CPLUSPLUS _MSVC_LANG\n#else\n#  define FMT_CPLUSPLUS __cplusp"
  },
  {
    "path": "src/format.cc",
    "chars": 1221,
    "preview": "// Formatting library for C++\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// All rights reserved.\n//\n// For the li"
  },
  {
    "path": "src/os.cc",
    "chars": 11365,
    "preview": "// Formatting library for C++ - optional OS-specific functionality\n//\n// Copyright (c) 2012 - 2016, Victor Zverovich\n// "
  },
  {
    "path": "support/Android.mk",
    "chars": 299,
    "preview": "LOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := fmt_static\nLOCAL_MODULE_FILENAME := libfmt\n\nLOCAL_SR"
  },
  {
    "path": "support/AndroidManifest.xml",
    "chars": 90,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n        </manifest>\n"
  },
  {
    "path": "support/C++.sublime-syntax",
    "chars": 72324,
    "preview": "%YAML 1.2\n---\n# http://www.sublimetext.com/docs/3/syntax.html\nname: C++ (fmt)\ncomment: I don't think anyone uses .hp. .c"
  },
  {
    "path": "support/README",
    "chars": 85,
    "preview": "This directory contains build support files such as\n\n* CMake modules\n* Build scripts\n"
  },
  {
    "path": "support/Vagrantfile",
    "chars": 583,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# A vagrant config for testing against gcc-4.8.\nVagrant.configure(\"2\") do |con"
  },
  {
    "path": "support/build.gradle",
    "chars": 3616,
    "preview": "import java.nio.file.Paths\n\n// General gradle arguments for root project\nbuildscript {    \n    repositories {\n        go"
  },
  {
    "path": "support/check-commits",
    "chars": 1389,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Compile source on a range of commits\n\nUsage:\n  check-commits <start> <source>\n\"\"\"\n\nimport doc"
  },
  {
    "path": "support/cmake/FindSetEnv.cmake",
    "chars": 309,
    "preview": "# A CMake script to find SetEnv.cmd.\n\nfind_program(\n  WINSDK_SETENV\n  NAMES SetEnv.cmd\n  PATHS\n    \"[HKEY_LOCAL_MACHINE\\"
  },
  {
    "path": "support/cmake/JoinPaths.cmake",
    "chars": 926,
    "preview": "# This module provides function for joining paths known from from most languages\n#\n# Original license:\n# SPDX-License-Id"
  },
  {
    "path": "support/cmake/fmt-config.cmake.in",
    "chars": 147,
    "preview": "@PACKAGE_INIT@\n\nif (NOT TARGET fmt::fmt)\n  include(${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake)\nendif ()\n\nchec"
  },
  {
    "path": "support/cmake/fmt.pc.in",
    "chars": 264,
    "preview": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=@CMAKE_INSTALL_PREFIX@\nlibdir=@libdir_for_pc_file@\nincludedir=@includedir_for_"
  },
  {
    "path": "support/docopt.py",
    "chars": 19784,
    "preview": "\"\"\"Pythonic command-line interface parser that will make you smile.\n\n * http://docopt.org\n * Repository and issue-tracke"
  },
  {
    "path": "support/gradle/wrapper/gradle-wrapper.properties",
    "chars": 245,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\n# This downloads Gradle 9.3 automatically.\ndistribution"
  },
  {
    "path": "support/gradle.properties",
    "chars": 227,
    "preview": "# Required for modern Android builds (AGP 8.0+)\nandroid.useAndroidX=true\n\n# Improves build performance\nandroid.nonTransi"
  },
  {
    "path": "support/mkdocs",
    "chars": 2770,
    "preview": "#!/usr/bin/env python3\n# A script to invoke mkdocs with the correct environment.\n# Additionally supports deploying via m"
  },
  {
    "path": "support/mkdocs.yml",
    "chars": 997,
    "preview": "site_name: '{fmt}'\n\ndocs_dir: ../doc\n\nrepo_url: https://github.com/fmtlib/fmt\n\ntheme:\n  name: material\n  features:\n    -"
  },
  {
    "path": "support/printable.py",
    "chars": 6109,
    "preview": "#!/usr/bin/env python3\n\n# This script is based on\n# https://github.com/rust-lang/rust/blob/master/library/core/src/unico"
  },
  {
    "path": "support/python/mkdocstrings_handlers/cxx/__init__.py",
    "chars": 15323,
    "preview": "# A basic mkdocstrings handler for {fmt}.\n# Copyright (c) 2012 - present, Victor Zverovich\n# https://github.com/fmtlib/f"
  },
  {
    "path": "support/python/mkdocstrings_handlers/cxx/templates/README",
    "chars": 64,
    "preview": "mkdocsstrings requires a handler to have a templates directory.\n"
  },
  {
    "path": "support/release.py",
    "chars": 5908,
    "preview": "#!/usr/bin/env python3\n\n\"\"\"Make a release.\n\nUsage:\n  release.py [<branch>]\n\nFor the release command $FMT_TOKEN should co"
  },
  {
    "path": "test/CMakeLists.txt",
    "chars": 8382,
    "preview": "add_subdirectory(gtest)\n\nset(TEST_MAIN_SRC test-main.cc gtest-extra.cc gtest-extra.h util.cc)\nadd_library(test-main STAT"
  },
  {
    "path": "test/add-subdirectory-test/CMakeLists.txt",
    "chars": 595,
    "preview": "cmake_minimum_required(VERSION 3.8...3.25)\n\nproject(fmt-test CXX)\n\nadd_subdirectory(../.. fmt)\n\nadd_executable(library-t"
  },
  {
    "path": "test/add-subdirectory-test/main.cc",
    "chars": 128,
    "preview": "#include \"fmt/base.h\"\n\nint main(int argc, char** argv) {\n  for (int i = 0; i < argc; ++i) fmt::print(\"{}: {}\\n\", i, argv"
  },
  {
    "path": "test/args-test.cc",
    "chars": 5502,
    "preview": "// Formatting library for C++ - dynamic argument store tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All"
  },
  {
    "path": "test/assert-test.cc",
    "chars": 852,
    "preview": "// Formatting library for C++ - FMT_ASSERT test\n//\n// It is a separate test to minimize the number of EXPECT_DEBUG_DEATH"
  },
  {
    "path": "test/base-test.cc",
    "chars": 27635,
    "preview": "// Formatting library for C++ - core tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved.\n"
  },
  {
    "path": "test/c-test.c",
    "chars": 2974,
    "preview": "// Formatting library for C++ - the C API tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reser"
  },
  {
    "path": "test/chrono-test.cc",
    "chars": 40949,
    "preview": "// Formatting library for C++ - time formatting tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights"
  },
  {
    "path": "test/color-test.cc",
    "chars": 6381,
    "preview": "// Formatting library for C++ - color tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved."
  },
  {
    "path": "test/compile-error-test/CMakeLists.txt",
    "chars": 7228,
    "preview": "# Test if compile errors are produced where necessary.\n\ncmake_minimum_required(VERSION 3.8...3.25)\nproject(compile-error"
  },
  {
    "path": "test/compile-test.cc",
    "chars": 17525,
    "preview": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  },
  {
    "path": "test/cuda-test/CMakeLists.txt",
    "chars": 3490,
    "preview": "# We can find some usecases which follow the guide of CMake which uses\n# `enable_language(CUDA)` instead of `find_packag"
  },
  {
    "path": "test/cuda-test/cpp14.cc",
    "chars": 418,
    "preview": "#include <fmt/base.h>\n\n// The purpose of this part is to ensure NVCC's host compiler also supports\n// the standard versi"
  },
  {
    "path": "test/cuda-test/cuda-cpp14.cu",
    "chars": 905,
    "preview": "//  Direct NVCC command line example:\n//\n//  nvcc ./cuda-cpp14.cu -x cu -I\"../include\" -l\"fmtd\" -L\"../build/Debug\" \\\n// "
  },
  {
    "path": "test/detect-stdfs.cc",
    "chars": 607,
    "preview": "// Formatting library for C++ - tests of formatters for standard library types\n//\n// Copyright (c) 2012 - present, Victo"
  },
  {
    "path": "test/enforce-checks-test.cc",
    "chars": 1746,
    "preview": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  },
  {
    "path": "test/find-package-test/CMakeLists.txt",
    "chars": 590,
    "preview": "cmake_minimum_required(VERSION 3.8...3.25)\n\nproject(fmt-test)\n\nfind_package(FMT REQUIRED)\n\nadd_executable(library-test m"
  },
  {
    "path": "test/find-package-test/main.cc",
    "chars": 130,
    "preview": "#include \"fmt/format.h\"\n\nint main(int argc, char** argv) {\n  for (int i = 0; i < argc; ++i) fmt::print(\"{}: {}\\n\", i, ar"
  },
  {
    "path": "test/format-impl-test.cc",
    "chars": 14814,
    "preview": "// Formatting library for C++ - formatting library implementation tests\n//\n// Copyright (c) 2012 - present, Victor Zvero"
  },
  {
    "path": "test/format-test.cc",
    "chars": 102047,
    "preview": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  },
  {
    "path": "test/fuzzing/.gitignore",
    "chars": 54,
    "preview": "# ignore artifacts from the build.sh script\nbuild-*/\n\n"
  },
  {
    "path": "test/fuzzing/CMakeLists.txt",
    "chars": 1198,
    "preview": "# Copyright (c) 2019, Paul Dreik\n\n# Link in the main function. Useful for reproducing, kcov, gdb, afl, valgrind.\n# (Note"
  },
  {
    "path": "test/fuzzing/README.md",
    "chars": 789,
    "preview": "# Running the fuzzers locally\n\nThere is a [helper script](build.sh) to build the fuzzers, which has only been\ntested on "
  },
  {
    "path": "test/fuzzing/build.sh",
    "chars": 2113,
    "preview": "#!/bin/sh\n#\n# Creates fuzzer builds of various kinds\n# - oss-fuzz emulated mode (makes sure a simulated invocation by os"
  },
  {
    "path": "test/fuzzing/chrono-duration.cc",
    "chars": 3331,
    "preview": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <fmt/chrono.h>\n\n#include <"
  },
  {
    "path": "test/fuzzing/chrono-timepoint.cc",
    "chars": 828,
    "preview": "// Copyright (c) 2021, Paul Dreik\n// For license information refer to format.h.\n#include <fmt/chrono.h>\n\n#include \"fuzze"
  },
  {
    "path": "test/fuzzing/float.cc",
    "chars": 1219,
    "preview": "// A fuzzer for floating-point formatter.\n// For the license information refer to format.h.\n\n#include <fmt/format.h>\n\n#i"
  },
  {
    "path": "test/fuzzing/fuzzer-common.h",
    "chars": 2415,
    "preview": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#ifndef FUZZER_COMMON_H\n#define FUZ"
  },
  {
    "path": "test/fuzzing/main.cc",
    "chars": 592,
    "preview": "#include <cassert>\n#include <fstream>\n#include <vector>\n\n#include \"fuzzer-common.h\"\n\nextern \"C\" int LLVMFuzzerTestOneInp"
  },
  {
    "path": "test/fuzzing/named-arg.cc",
    "chars": 2266,
    "preview": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <fmt/chrono.h>\n\n#include <"
  },
  {
    "path": "test/fuzzing/one-arg.cc",
    "chars": 2048,
    "preview": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <fmt/chrono.h>\n\n#include <"
  },
  {
    "path": "test/fuzzing/two-args.cc",
    "chars": 2343,
    "preview": "// Copyright (c) 2019, Paul Dreik\n// For the license information refer to format.h.\n\n#include <fmt/format.h>\n\n#include <"
  },
  {
    "path": "test/gtest/.clang-format",
    "chars": 68,
    "preview": "# Disable clang-format here\nDisableFormat: true\nSortIncludes: Never\n"
  },
  {
    "path": "test/gtest/CMakeLists.txt",
    "chars": 1067,
    "preview": "# Compile Google Test ourselves instead of using pre-compiled libraries. See the\n# Google Test FAQ \"Why is it not recomm"
  },
  {
    "path": "test/gtest/gmock/gmock.h",
    "chars": 454768,
    "preview": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or "
  },
  {
    "path": "test/gtest/gmock-gtest-all.cc",
    "chars": 532839,
    "preview": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or "
  },
  {
    "path": "test/gtest/gtest/gtest-spi.h",
    "chars": 10112,
    "preview": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or "
  },
  {
    "path": "test/gtest/gtest/gtest.h",
    "chars": 474166,
    "preview": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or "
  },
  {
    "path": "test/gtest-extra-test.cc",
    "chars": 13810,
    "preview": "// Formatting library for C++ - tests of custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverov"
  },
  {
    "path": "test/gtest-extra.cc",
    "chars": 2030,
    "preview": "// Formatting library for C++ - custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// Al"
  },
  {
    "path": "test/gtest-extra.h",
    "chars": 7693,
    "preview": "// Formatting library for C++ - custom Google Test assertions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// Al"
  },
  {
    "path": "test/header-only-test.cc",
    "chars": 253,
    "preview": "// Header-only configuration test\n\n#include \"fmt/base.h\"\n#include \"fmt/ostream.h\"\n#include \"gtest/gtest.h\"\n\n#ifndef FMT_"
  },
  {
    "path": "test/mock-allocator.h",
    "chars": 2240,
    "preview": "// Formatting library for C++ - mock allocator\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserv"
  },
  {
    "path": "test/module-test.cc",
    "chars": 16583,
    "preview": "// Formatting library for C++ - module tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved"
  },
  {
    "path": "test/no-builtin-types-test.cc",
    "chars": 807,
    "preview": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  },
  {
    "path": "test/noexception-test.cc",
    "chars": 437,
    "preview": "// Formatting library for C++ - Noexception tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights res"
  },
  {
    "path": "test/os-test.cc",
    "chars": 16366,
    "preview": "// Formatting library for C++ - tests of the OS-specific functionality\n//\n// Copyright (c) 2012 - present, Victor Zverov"
  },
  {
    "path": "test/ostream-test.cc",
    "chars": 9243,
    "preview": "// Formatting library for C++ - std::ostream support tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All r"
  },
  {
    "path": "test/perf-sanity.cc",
    "chars": 764,
    "preview": "// A quick and dirty performance test.\n// For actual benchmarks see https://github.com/fmtlib/format-benchmark.\n\n#includ"
  },
  {
    "path": "test/posix-mock-test.cc",
    "chars": 11154,
    "preview": "// Tests of the C++ interface to POSIX functions that require mocks\n//\n// Copyright (c) 2012 - present, Victor Zverovich"
  },
  {
    "path": "test/posix-mock.h",
    "chars": 1556,
    "preview": "// Formatting library for C++ - mocks of POSIX functions\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  },
  {
    "path": "test/printf-test.cc",
    "chars": 19837,
    "preview": "// Formatting library for C++ - printf tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved"
  },
  {
    "path": "test/ranges-odr-test.cc",
    "chars": 478,
    "preview": "// Formatting library for C++ - the core API\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserved"
  },
  {
    "path": "test/ranges-test.cc",
    "chars": 24661,
    "preview": "// Formatting library for C++ - ranges tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich and {fmt} contributors"
  },
  {
    "path": "test/scan-test.cc",
    "chars": 5329,
    "preview": "// Formatting library for C++ - scanning API test\n//\n// Copyright (c) 2019 - present, Victor Zverovich\n// All rights res"
  },
  {
    "path": "test/scan.h",
    "chars": 20439,
    "preview": "// Formatting library for C++ - scanning API proof of concept\n//\n// Copyright (c) 2019 - present, Victor Zverovich\n// Al"
  },
  {
    "path": "test/static-export-test/CMakeLists.txt",
    "chars": 813,
    "preview": "cmake_minimum_required(VERSION 3.8...3.25)\n\nproject(fmt-link CXX)\n\nset(BUILD_SHARED_LIBS OFF)\nset(CMAKE_VISIBILITY_INLIN"
  },
  {
    "path": "test/static-export-test/library.cc",
    "chars": 142,
    "preview": "#include <fmt/compile.h>\n\n__attribute__((visibility(\"default\"))) std::string foo() {\n  return fmt::format(FMT_COMPILE(\"f"
  },
  {
    "path": "test/static-export-test/main.cc",
    "chars": 114,
    "preview": "#include <iostream>\n#include <string>\n\nextern std::string foo();\n\nint main() { std::cout << foo() << std::endl; }\n"
  },
  {
    "path": "test/std-test.cc",
    "chars": 19004,
    "preview": "// Formatting library for C++ - tests of formatters for standard library types\n//\n// Copyright (c) 2012 - present, Victo"
  },
  {
    "path": "test/test-assert.h",
    "chars": 1120,
    "preview": "// Formatting library for C++ - test version of FMT_ASSERT\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All r"
  },
  {
    "path": "test/test-main.cc",
    "chars": 1210,
    "preview": "// Formatting library for C++ - test main function.\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights r"
  },
  {
    "path": "test/unicode-test.cc",
    "chars": 1269,
    "preview": "// Formatting library for C++ - Unicode tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserve"
  },
  {
    "path": "test/util.cc",
    "chars": 1258,
    "preview": "// Formatting library for C++ - test utilities\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserv"
  },
  {
    "path": "test/util.h",
    "chars": 1797,
    "preview": "// Formatting library for C++ - test utilities\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rights reserv"
  },
  {
    "path": "test/xchar-test.cc",
    "chars": 15494,
    "preview": "// Formatting library for C++ - formatting library tests\n//\n// Copyright (c) 2012 - present, Victor Zverovich\n// All rig"
  }
]

About this extraction

This page contains the full source code of the fmtlib/fmt GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 134 files (2.9 MB), approximately 767.3k tokens, and a symbol index with 2552 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!