[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: breathe-doc\npatreon: # Replace with a single Patreon username\nopen_collective: breathe\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"monthly\"\n    groups:\n      github-actions:\n        patterns:\n          - \"*\"\n"
  },
  {
    "path": ".github/workflows/cache_doxygen.yml",
    "content": "name: download and cache Doxygen\non:\n  workflow_call\njobs:\n  install:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: linux-doxygen-${{ matrix.doxygen-version }}-cache\n    strategy:\n      fail-fast: false\n      matrix:\n        doxygen-version: ['1.9.4', '1.9.7']\n    steps:\n      - uses: actions/cache/restore@v4\n        id: cache-doxygen\n        with:\n          path: doxygen-bin-arc\n          key: ${{ runner.os }}-doxygen-${{ matrix.doxygen-version }}\n          lookup-only: true\n          restore-keys: |\n            ${{ runner.os }}-doxygen-\n\n        # TODO: Change to using github release downloads if possible\n      - name: download Doxygen from SF binary archives\n        if: steps.cache-doxygen.outputs.cache-hit != 'true'\n        run: |\n          mkdir doxygen-bin-arc && cd doxygen-bin-arc\n          curl -L https://sourceforge.net/projects/doxygen/files/rel-${{ matrix.doxygen-version }}/doxygen-${{ matrix.doxygen-version }}.linux.bin.tar.gz > doxygen.tar.gz\n\n      - uses: actions/cache/save@v4\n        if: steps.cache-doxygen.outputs.cache-hit != 'true'\n        with:\n          path: doxygen-bin-arc\n          key: ${{ steps.cache-doxygen.outputs.cache-primary-key }}\n"
  },
  {
    "path": ".github/workflows/create-release.yml",
    "content": "name: Create release\n\non:\n  push:\n    tags:\n    - \"v*\"\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\nenv:\n  FORCE_COLOR: \"1\"\n  UV_SYSTEM_PYTHON: \"1\"  # make uv do global installs\n\njobs:\n  publish-pypi:\n    runs-on: ubuntu-latest\n    name: PyPI Release\n    environment: release\n    if: github.repository_owner == 'breathe-doc'\n    permissions:\n      id-token: write  # for PyPI trusted publishing\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n\n      - name: Set up Python\n        uses: actions/setup-python@v6\n        with:\n          python-version: \"3\"\n\n      - name: Install uv\n        uses: astral-sh/setup-uv@v7\n        with:\n          version: latest\n          enable-cache: false\n\n      - name: Install Ruff\n        uses: astral-sh/ruff-action@v3\n        with:\n          args: --version\n          version: 0.9.2\n\n      - name: Install build dependencies (pypa/build, twine)\n        # Install jinja2 to make the parser - probably better to install it via\n        # the Sphinx dependency in the pyproject.toml file but I don't know how\n        # to do that at the moment\n        run: uv pip install build \"twine>=5.1\" \"jinja2>=3.1.6\" setuptools\n\n      - name: Generate parser\n        run: |\n          make parser\n          make format-parser\n\n      - name: Build distribution\n        run: python -m build\n\n      - name: Check distribution\n        run: |\n          twine check --strict dist/*\n\n      - name: Upload to PyPI\n        uses: pypa/gh-action-pypi-publish@release/v1\n"
  },
  {
    "path": ".github/workflows/documentation.yml",
    "content": "name: Build documentation\n\non:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\nenv:\n  DOXYGEN_VERSION: 1.9.4\n  FORCE_COLOR: \"1\"\n\njobs:\n  cache-doxygen:\n    uses: ./.github/workflows/cache_doxygen.yml\n\n  build:\n    needs: cache-doxygen\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up Python\n      uses: actions/setup-python@v6\n      with:\n        python-version: \"3\"\n        cache: 'pip'\n\n    - name: Install apt dependencies\n      run: |\n        sudo apt-get -y update\n        sudo apt-get -y install graphviz\n\n    - uses: actions/cache/restore@v4\n      id: cache-doxygen\n      with:\n        path: doxygen-bin-arc\n        fail-on-cache-miss: true\n        key: ${{ runner.os }}-doxygen-${{ env.DOXYGEN_VERSION }}\n\n    - name: Install doxygen\n      # at some point actions/cache/restore@4 started unpacking doxygen.tar.gz\n      # automatically and I don't know why -- Rouslan\n      run: |\n        cd doxygen-bin-arc\n        if test -d doxygen; then\n          cd doxygen\n        else\n          gunzip doxygen.tar.gz\n          tar xf doxygen.tar\n          cd doxygen-${{ env.DOXYGEN_VERSION }}\n        fi\n        sudo make install\n\n    - name: Install Python dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --editable .[build]\n        python -m pip install .[docs]\n        # Remove the version of breathe that is automatically installed by the previous commands\n        # as it confuses the build. This build should pick up breathe from the repo source\n        python -m pip uninstall --yes breathe\n\n    - name: Build the documentation\n      run: |\n        make parser\n        make html\n        rm documentation/build/html/.buildinfo\n\n    - uses: actions/upload-artifact@v5\n      with:\n        name: docs build artifacts\n        path: |\n          documentation/build/html\n          examples/*/*/xml\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint source code\n\non:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\nenv:\n  FORCE_COLOR: \"1\"\n\njobs:\n  ruff:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n      with:\n        persist-credentials: false\n\n    - name: Install Ruff\n      uses: astral-sh/ruff-action@v3\n      with:\n        args: --version\n        version: 0.9.2\n\n    - name: Install dependencies\n      # \"--editable\" is needed so that _parser.py is placed in the local folder\n      # where pytest will import from\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --editable \".[build]\"\n\n    - name: Generate parser\n      run: |\n        make parser\n        make format-parser\n\n    - name: Lint with Ruff\n      run: ruff check --output-format=github\n\n    - name: Format with Ruff\n      run: ruff format --diff\n\n  mypy:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v6\n\n    - name: Set up Python\n      uses: actions/setup-python@v6\n      with:\n        python-version: \"3\"\n\n    - name: Install dependencies\n      # \"--editable\" is needed so that _parser.py is placed in the local folder\n      # where pytest will import from\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --editable \".[build]\"\n        python -m pip install --editable \".[lint]\"\n\n    - name: Generate parser\n      run: make parser\n\n    - name: Type check with mypy\n      run: mypy --warn-redundant-casts --warn-unused-ignores breathe tests\n\n  twine:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n\n    - name: Set up Python\n      uses: actions/setup-python@v6\n      with:\n        python-version: \"3\"\n\n    - name: Install dependencies\n      # \"--editable\" is needed so that _parser.py is placed in the local folder\n      # where pytest will import from\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --upgrade twine build\n        python -m pip install --editable \".[build]\"\n\n    - name: Generate parser\n      run: make parser\n\n    - name: Lint with twine\n      run: |\n        python -m build .\n        twine check dist/*\n"
  },
  {
    "path": ".github/workflows/unit_tests.yml",
    "content": "name: Tests\n\non:\n  pull_request:\n    paths:\n      - \".github/workflows/unit_tests.yml\"\n      - \"breathe/**\"\n      - \"tests/**\"\n\npermissions:\n  contents: read\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}\n  cancel-in-progress: true\n\nenv:\n  FORCE_COLOR: \"1\"\n  PYTHONDEVMODE: \"1\"  # -X dev\n  PYTHONWARNDEFAULTENCODING: \"1\"  # -X warn_default_encoding\n\njobs:\n  cache-doxygen:\n    uses: ./.github/workflows/cache_doxygen.yml\n\n  test:\n    needs: cache-doxygen\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        doxygen-version:\n          - '1.9.4'\n          - '1.9.7'\n        python-version:\n          - '3.9'\n          - '3.10'\n          - '3.11'\n          - '3.12'\n          - '3.13'\n        sphinx-version:\n          - '6.2'\n          - '7.0'\n          - '7.1'\n          - '7.2' # Ubuntu 24.04\n          # version 7.3 broke up the domain modules into packages, changing\n          # where some classes had to be imported from\n          - '7.3'\n          - '7.4' # Ubuntu 24.10\n          - '8.0'\n          - '8.1' # Ubuntu 25.04\n          - '8.2' # Ubuntu 25.04\n        exclude:\n          - python-version: '3.9'\n            sphinx-version: '8.0'\n          - python-version: '3.9'\n            sphinx-version: '8.1'\n          - python-version: '3.9'\n            sphinx-version: '8.2'\n          - python-version: '3.9'\n            sphinx-version: 'latest'\n\n          - python-version: '3.10'\n            sphinx-version: '8.2'\n          - python-version: '3.10'\n            sphinx-version: 'latest'\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ matrix.python-version }}\n        cache: 'pip'\n\n    - name: Install Sphinx ${{ matrix.sphinx-version }}\n      if: matrix.sphinx-version != 'latest'\n      run: |\n        python -m pip install -Iv Sphinx==${{ matrix.sphinx-version }}\n    \n    - name: Install Sphinx master\n      if: matrix.sphinx-version == 'latest'\n      run: |\n        python -m pip install \"Sphinx @ git+https://github.com/sphinx-doc/sphinx.git@master\"\n\n    - uses: actions/cache/restore@v4\n      id: cache-doxygen\n      with:\n        path: doxygen-bin-arc\n        fail-on-cache-miss: true\n        key: ${{ runner.os }}-doxygen-${{ matrix.doxygen-version }}\n\n    - name: Install doxygen\n      # at some point actions/cache/restore@4 started unpacking doxygen.tar.gz\n      # automatically and I don't know why -- Rouslan\n      run: |\n        cd doxygen-bin-arc\n        if test -d doxygen; then\n          cd doxygen\n        else\n          gunzip doxygen.tar.gz\n          tar xf doxygen.tar\n          cd doxygen-${{ matrix.doxygen-version }}\n        fi\n        sudo make install\n\n    - name: Install dependencies\n      # \"--editable\" is needed so that _parser.py is placed in the local\n      # folder where pytest will import from\n      run: |\n        pip install --upgrade pip\n        pip install --editable .[build]\n        pip install --editable .[test]\n\n    - name: Generate parser\n      run: |\n        make parser\n\n    - name: Test with pytest\n      if: matrix.sphinx-version != 'latest'\n      run: python -m pytest -vv\n      env:\n        PYTHONWARNINGS: \"error\"  # treat all warnings as errors\n      \n    - name: Test with pytest\n      if: matrix.sphinx-version == 'latest'\n      run: python -m pytest -vv\n"
  },
  {
    "path": ".gitignore",
    "content": "*.pyc\n/.project\n/.pydevproject\nbuild/\n/dist\n/breathe.egg-info\n/.mypy_cache\n\n# Folder for placing stuff to be ignored\n/ignored\n\n# My virtual env folder\n/python-2.7.4\n\n# Test folder for building simple examples of the documentation\n/simple\n\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm\n\n## Directory-based project format\n.idea/\n# if you remove the above rule, at least ignore user-specific stuff:\n# .idea/workspace.xml\n# .idea/tasks.xml\n# and these sensitive or high-churn files:\n# .idea/dataSources.ids\n# .idea/dataSources.xml\n# .idea/sqlDataSources.xml\n# .idea/dynamic.xml\n\n## File-based project format\n*.ipr\n*.iws\n*.iml\n\n## Additional for IntelliJ\nout/\n\n# generated by mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# generated by JIRA plugin\natlassian-ide-plugin.xml\n\n# generated by Crashlytics plugin (for Android Studio and Intellij)\ncom_crashlytics_export_strings.xml\n\n# modified by build process\nexamples/doxygen/example.tag\nexamples/specific/dot_graphs/xml/dotfile.dot\n\n# generated in editable install\n/breathe/_parser.py\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "version: 2\n\npython:\n  version: 3\n\nsphinx:\n  builder: html\n  configuration: documentation/source/conf.py\n  fail_on_warning: false\n\nconda:\n  environment: documentation/environment.yaml\n"
  },
  {
    "path": ".ruff.toml",
    "content": "target-version = \"py39\"  # Pin Ruff to Python 3.9\nline-length = 100\noutput-format = \"full\"\n\n[format]\npreview = true\nquote-style = \"double\"\n\n[lint]\npreview = true\nignore = [\n    \"UP031\",  # Use format specifiers instead of percent format\n]\nselect = [\n    \"C4\",    # flake8-comprehensions\n#    \"B\",     # flake8-bugbear\n#    \"D\",     # pydocstyle\n    \"E\",     # pycodestyle\n    \"F\",     # pyflakes\n    \"FA\",    # flake8-future-annotations\n    \"FLY\",   # flynt\n    \"FURB\",  # refurb\n    \"G\",     # flake8-logging-format\n    \"I\",     # isort\n    \"LOG\",   # flake8-logging\n#    \"N\",     # pep8-naming\n    \"PERF\",  # perflint\n    \"PGH\",   # pygrep-hooks\n    \"PT\",    # flake8-pytest-style\n    \"TC\",    # flake8-type-checking\n    \"TID\",   # flake8-tidy-imports\n    \"UP\",    # pyupgrade\n    \"W\",     # pycodestyle\n]\n\n[lint.per-file-ignores]\n\"breathe/parser/{compound,index}super.py\" = [\n    \"E266\",  # Too many leading `#` before block comment\n]\n\n\"examples/doxygen/pyexample.py\" = [\n    \"E266\",  # Too many leading `#` before block comment\n]\n\n[lint.flake8-quotes]\ninline-quotes = \"double\"\n\n[lint.flake8-type-checking]\nexempt-modules = []\nstrict = true\n\n[lint.flake8-tidy-imports]\nban-relative-imports = \"all\"\n\n[lint.isort]\nforced-separate = [\n    \"tests\",\n]\nrequired-imports = [\n    \"from __future__ import annotations\",\n]\n\n[lint.pydocstyle]\nconvention = \"pep257\"\nignore-decorators = [\"typing.overload\"]\nignore-var-parameters = true\n"
  },
  {
    "path": "CHANGELOG.rst",
    "content": "Change Log\n----------\n\nInspired by `Keepachangelog.com <https://keepachangelog.com/>`__.\n\n- 2025-07-08 - **Breathe v5.0.0a5**\n\n  Adjust create-release process to include ruff for formatting generated ``_parser.py`` file.\n\n- 2025-07-08 - **Breathe v5.0.0a4**\n\n  Adjust create-release process to try to generate ``_parser.py`` file.\n\n- 2025-07-08 - **Breathe v5.0.0a3**\n\n  Adjust create-release process to try to generate ``_parser.py`` file.\n\n- 2025-07-08 - **Breathe v5.0.0a2**\n\n  - Removed sphinx_csharp git-based dependency\n    `#1035 <https://github.com/breathe-doc/breathe/pull/1035>`__\n\n- 2025-07-08 - **Breathe v5.0.0a1**\n\n  Alpha release of v5. Contains a significant refactor of the internal logic.\n\n  Thanks to @JasperCraeghs and @Rouslan.\n\n  - Merging long standing refactor branches\n    `#1029 <https://github.com/breathe-doc/breathe/pull/1029>`__\n  - Performance improvements, new tests, more typing annotations and miscellaneous fixes\n    `#967 <https://github.com/breathe-doc/breathe/pull/967>`__\n  - Support members in a Doxygen 1.9.7 group\n    `#934 <https://github.com/breathe-doc/breathe/pull/934>`__\n  - Fix docstring missing quotes\n    `#1020 <https://github.com/breathe-doc/breathe/pull/1020>`__\n  - Fix docstring missing quotes\n    `#1020 <https://github.com/breathe-doc/breathe/pull/1020>`__\n  - Fix some incorrect indents in the document\n    `#1032 <https://github.com/breathe-doc/breathe/pull/1032>`__\n  - Enable imgconverter extension to fix LaTeX documentation build\n    `#1027 <https://github.com/breathe-doc/breathe/pull/1027>`__\n  - Bump astral-sh/setup-uv from 5 to 6 in the github-actions group\n    `#1025 <https://github.com/breathe-doc/breathe/pull/1025>`__\n\n- 2025-02-22 - **Breathe v4.36.0**\n\n  - Update `test_renderer` so that tests pass with Sphinx 7.2.\n    `#976 <https://github.com/breathe-doc/breathe/pull/976>`__\n  - Fix PosixPath issue with Sphinx 7.2.\n    `#964 <https://github.com/breathe-doc/breathe/pull/964>`__\n  - Avoid `RemovedInSphinx80Warning` in path-manipulation code.\n    `#977 <https://github.com/breathe-doc/breathe/pull/977>`__\n  - Require Sphinx 7.2 or later, Python 3.9 or later,\n     and  Doxygen 1.9.2 or later.\n    `#887 <https://github.com/breathe-doc/breathe/pull/887>`__,\n    `#946 <https://github.com/breathe-doc/breathe/pull/946>`__\n    `#955 <https://github.com/breathe-doc/breathe/pull/955>`__\n  - Begin to use pathlib.\n  - Resolve full title for doxygenpage and doxygengroup\n    and allow for omitting the title all together\n    `#939 <https://github.com/breathe-doc/breathe/pull/939>`__\n  - Insert signature name for use with Sphinx Table of Contents\n    `#959 <https://github.com/breathe-doc/breathe/pull/959>`__\n  - Fix test failure with latest Sphinx master.\n    `#1010 <https://github.com/breathe-doc/breathe/pull/1010>`__\n  - Fix error in template specialization with qualified arguments\n    `#1010 <https://github.com/breathe-doc/breathe/pull/1012>`__\n\n- 2023-02-28 - **Breathe v4.35.0**\n\n  - Pull lone literal blocks in paragraphs up to produce correct doctree.\n    `#833 <https://github.com/breathe-doc/breathe/pull/833>`__\n  - Fix tests for changes in Sphinx 5.3.\n    `#865 <https://github.com/breathe-doc/breathe/pull/865>`__\n  - Bump Python requirement to 3.7.\n    `#866 <https://github.com/breathe-doc/breathe/pull/866>`__\n  - Support Sphinx 6.\n    `#885 <https://github.com/breathe-doc/breathe/pull/885>`__\n  - Support ``:sort:`` option to sort sections by name.\n    `#879 <https://github.com/breathe-doc/breathe/pull/879>`__\n\n- 2022-06-20 - **Breathe v4.34.0**\n\n  - Treat .unparsed as plain text.\n    `#806 <https://github.com/breathe-doc/breathe/pull/806>`__\n  - Remove unneeded type: ignore annotations.\n    `#813 <https://github.com/breathe-doc/breathe/pull/813>`__\n  - Fix internal ``NodeFinder`` visitor for when non-Docutils nodes are\n    present in the content of a directive.\n    `#812 <https://github.com/breathe-doc/breathe/pull/812>`__\n  - Rename lint workflow.\n    `#814 <https://github.com/breathe-doc/breathe/pull/814>`__\n  - Type check pygments and limit docutils stub version.\n    `#819 <https://github.com/breathe-doc/breathe/pull/819>`__\n  - Convert dot files' relative path to absolute.\n    `#821 <https://github.com/breathe-doc/breathe/pull/821>`__\n  - CI, update Sphinx versions to test.\n    `#834 <https://github.com/breathe-doc/breathe/pull/834>`__\n  - CI, update for Sphinx 5.0.1.\n    `#846 <https://github.com/breathe-doc/breathe/pull/846>`__\n  - Fix inconsistency in example.\n    `#843 <https://github.com/breathe-doc/breathe/pull/843>`__\n  - Fix C# enum rendering crash.\n    `#849 <https://github.com/breathe-doc/breathe/pull/849>`__\n  - Drop Sphinx 3 support, add Sphinx 5 support.\n    `#850 <https://github.com/breathe-doc/breathe/pull/850>`__\n  - CICD: Disable python 3.6 for Sphinx master tests.\n    `#853 <https://github.com/breathe-doc/breathe/pull/853>`__\n  - Populate default include text-node's data field instead of raw-source.\n    `#828 <https://github.com/breathe-doc/breathe/pull/828>`__\n\n- 2022-02-14 - **Breathe v4.33.1**\n\n  - Avoid warning about multiple graphviz directives.\n    `#804 <https://github.com/breathe-doc/breathe/pull/804>`__\n\n- 2022-02-14 - **Breathe v4.33.0**\n\n  - Fix duplicate ``static`` in variable declarations.\n    `#794 <https://github.com/breathe-doc/breathe/pull/794>`__\n  - Update CICD for Sphinx 4.4.0 series.\n    `#795 <https://github.com/breathe-doc/breathe/pull/795>`__\n  - Pin version of black in CICD and reformat files.\n    `#792 <https://github.com/breathe-doc/breathe/pull/792>`__\n  - Fix code block highlighting.\n    `#760 <https://github.com/breathe-doc/breathe/pull/760>`__\n  - Refactoring, cleanup and typing improvements.\n    `#802 <https://github.com/breathe-doc/breathe/pull/802>`__\n  - Doxygen dot graphs to Sphinx graphviz.\n    `#757 <https://github.com/breathe-doc/breathe/pull/757>`__\n  - Support externally hosted images.\n    `#705 <https://github.com/breathe-doc/breathe/pull/705>`__\n  - Address a peculiarity in Doxygen aliases in doc.\n    `#770 <https://github.com/breathe-doc/breathe/pull/770>`__\n  - Add flag to doxygengroup, doxygennamespace to display only the description.\n    `#718 <https://github.com/breathe-doc/breathe/pull/718>`__\n  - Add support for MD block quotes with attribution(s).\n    `#759 <https://github.com/breathe-doc/breathe/pull/759>`__\n\n- 2022-01-30 - **Breathe v4.32.0**\n\n  - Added ``breathe_doxygen_aliases`` config variable.\n    `#729 <https://github.com/breathe-doc/breathe/pull/729>`__\n  - Render ``\\remark``/``\\remarks`` and ``\\see``/``\\sa`` using Sphinx/Docutils\n    admonition style nodes.\n    `#756 <https://github.com/breathe-doc/breathe/pull/756>`__\n  - Render C++ scoped enums differently than unscoped enums, and with their\n    underlying type.\n    `#753 <https://github.com/breathe-doc/breathe/pull/753>`__\n  - Render ``\\retval`` lists using dedicated field list when Sphinx >= 4.3 is\n    used.\n    `#749 <https://github.com/breathe-doc/breathe/pull/749>`__\n  - Make ``.. doxygenfunction`` handle function template specializations.\n    `#750 <https://github.com/breathe-doc/breathe/pull/750>`__\n  - Properly handle field-lists and admonitions in the detailed description of\n    classes and functions.\n    `#764 <https://github.com/breathe-doc/breathe/pull/764>`__\n  - Add ``:confval:`breathe_show_include``` to control whether ``#include``\n    lines are shown. Defaults to ``True``.\n    `#725 <https://github.com/breathe-doc/breathe/pull/725>`__\n  - Fix sys.path adjustment in doc config.\n    `#734 <https://github.com/breathe-doc/breathe/pull/734>`__\n  - Fix sphinx renderer variable and function visitors for C#.\n    `#737 <https://github.com/breathe-doc/breathe/pull/737>`__\n  - Fix sphinx renderer class visitor for C#.\n    `#738 <https://github.com/breathe-doc/breathe/pull/738>`__\n  - Auto-format python code with black.\n    `#743 <https://github.com/breathe-doc/breathe/pull/743>`__\n  - Extend flake8 and address some style issues.\n    `#745 <https://github.com/breathe-doc/breathe/pull/745>`__\n  - Fix black formatting warning.\n    `#747 <https://github.com/breathe-doc/breathe/pull/747>`__\n  - Update Sphinx and Python versions tested against.\n    `#765 <https://github.com/breathe-doc/breathe/pull/765>`__\n  - Fix friend functions for older Doxygen versions.\n    `#769 <https://github.com/breathe-doc/breathe/pull/769>`__\n  - Doxygen >= 1.9.2 supports C++20 concepts, add support for them.\n    `#779 <https://github.com/breathe-doc/breathe/pull/779>`__\n  - Change the way directives are added to adhere to the interface,\n    e.g., avoiding myst-parser to crash.\n    `#780 <https://github.com/breathe-doc/breathe/pull/780>`__\n  - Improved list of included files (with cross-references for local includes).\n    `#763 <https://github.com/breathe-doc/breathe/pull/763>`__\n  - Update flake8 and mypy related stuff.\n    `#781 <https://github.com/breathe-doc/breathe/pull/781>`__\n  - Update readme with logo and sponsorship info.\n    `#784 <https://github.com/breathe-doc/breathe/pull/784>`__\n  - Store version number in both setup.py and __init__.py.\n    `#789 <https://github.com/breathe-doc/breathe/pull/789>`__\n  - CICD: lint: continue with other jobs if black fails.\n    `#791 <https://github.com/breathe-doc/breathe/pull/791>`__\n\n- 2021-09-14 - **Breathe v4.31.0**\n\n  - Collapse multiple retvals into a single bullet list. `#697 <https://github.com/breathe-doc/breathe/pull/697>`__\n  - Fix mypy issues on CI. `#731 <https://github.com/breathe-doc/breathe/pull/731>`__\n  - Print usage message from 'compare' doc script. `#727 <https://github.com/breathe-doc/breathe/pull/727>`__\n  - Test against Sphinx 4.0.3, 4.1.2 and 4.1.x branch. `#721 <https://github.com/breathe-doc/breathe/pull/721>`__\n  - Fix duplicate ``static`` in function declarations. `#717 <https://github.com/breathe-doc/breathe/issues/717>`__ `#720 <https://github.com/breathe-doc/breathe/pull/720>`__\n  - Directive refactoring. `#698 <https://github.com/breathe-doc/breathe/pull/698>`__\n  - Handle parsing errors. `#711 <https://github.com/breathe-doc/breathe/pull/711>`__\n  - Make doxygenfunction more robust when matching parameters. `#722 <https://github.com/breathe-doc/breathe/issues/722>`__ `#723 <https://github.com/breathe-doc/breathe/pull/723>`__\n  - Separate, link and style the changelog. `#735 <https://github.com/breathe-doc/breathe/pull/735>`__\n  - Update changelog and readme ahead of release. `#739 <https://github.com/breathe-doc/breathe/pull/739>`__\n  - CICD: Track Sphinx 4.2.x development series. `#741 <https://github.com/breathe-doc/breathe/pull/741>`__\n\n- 2021-05-06 - **Breathe v4.30.0**\n\n  - Fix retval rendering. `#687 <https://github.com/breathe-doc/breathe/pull/687>`__\n  - Correctly label example as C. `#690 <https://github.com/breathe-doc/breathe/pull/690>`__\n  - apidoc: add -m, --members option flag. `#694 <https://github.com/breathe-doc/breathe/pull/694>`__\n\n- 2021-04-30 - **Breathe v4.29.2**\n\n  - Remove stale six dep. `#682 <https://github.com/breathe-doc/breathe/pull/682>`__\n  - Render fields with multiple names instead of crashing. `#685 <https://github.com/breathe-doc/breathe/pull/685>`__\n  - Start pytest via module instead of exe. `#686 <https://github.com/breathe-doc/breathe/pull/686>`__\n\n- 2021-04-23 - **Breathe v4.29.1**\n\n  - Splice out parameter direction in field lists. `#675 <https://github.com/breathe-doc/breathe/pull/675>`__\n  - Fixes for Sphinx v4. `#676 <https://github.com/breathe-doc/breathe/pull/676>`__\n  - Fix paragraph in paragraph rendering. `#678 <https://github.com/breathe-doc/breathe/pull/678>`__\n  - Strip names before lookup in doxygenfunction. `#679 <https://github.com/breathe-doc/breathe/pull/679>`__\n  - When rendering template params, insert name by parsing. `#681 <https://github.com/breathe-doc/breathe/pull/681>`__\n\n- 2021-04-09 - **Breathe v4.29.0**\n\n  - Do not add inline modifier for C#. `#668 <https://github.com/breathe-doc/breathe/pull/668>`__\n  - Use add_css_file instead of deprecated/removed add_stylesheet. `#669 <https://github.com/breathe-doc/breathe/pull/669>`__\n  - Use native docutils for field lists, notes, and warnings. `#670 <https://github.com/breathe-doc/breathe/pull/670>`__\n  - Handle directives returning no nodes on error. `#672 <https://github.com/breathe-doc/breathe/pull/672>`__\n\n- 2021-03-29 - **Breathe v4.28.0**\n\n  - Code and documentation for membergroups and members-only options. `#637 <https://github.com/breathe-doc/breathe/pull/637>`__\n  - Add example.tag to gitignore as it gets modified during build process. `#644 <https://github.com/breathe-doc/breathe/pull/644>`__\n  - Add support for content-only flag when rendering pages. `#645 <https://github.com/breathe-doc/breathe/pull/645>`__\n  - When rendering a section, add target after title. `#647 <https://github.com/breathe-doc/breathe/pull/647>`__\n  - Render pages content in order. `#651 <https://github.com/breathe-doc/breathe/pull/651>`__\n  - Adds an ID to the rubric created for each section of a group. `#658 <https://github.com/breathe-doc/breathe/pull/658>`__\n  - Add missing getter and setter for C#. `#661 <https://github.com/breathe-doc/breathe/pull/661>`__\n  - Add support for rowspan/colspan to tables. `#642 <https://github.com/breathe-doc/breathe/pull/642>`__\n\n- 2021-02-16 - **Breathe v4.27.0**\n\n  - Add various specifiers to functions and variables. `#628 <https://github.com/breathe-doc/breathe/pull/628>`__\n  - Add multiply inherited class for PHP objects. `#630 <https://github.com/breathe-doc/breathe/pull/630>`__\n  - Initial support for table rendering. `#632 <https://github.com/breathe-doc/breathe/pull/632>`__\n  - Add rendering of \\section, \\subsection and \\subsubsection. `#635 <https://github.com/breathe-doc/breathe/pull/635>`__\n  - Sphinx 3.5 compatibility. `#640 <https://github.com/breathe-doc/breathe/pull/640>`__\n  - Fix linking to sections. `#639 <https://github.com/breathe-doc/breathe/pull/639>`__\n  - Add table examples to documentation. `#638 <https://github.com/breathe-doc/breathe/pull/638>`__\n\n- 2021-01-21 - **Breathe v4.26.1**\n\n  - Fix doxygenfile causing duplicate IDs for unspecified sections. `#622 <https://github.com/breathe-doc/breathe/pull/622>`__\n  - Fixes for doxygenfunction (friend keyword, friend class, arg checks). `#623 <https://github.com/breathe-doc/breathe/pull/623>`__\n\n- 2021-01-08 - **Breathe v4.26.0**\n\n  - Add test for ellipsis ('...') in args. `#610 <https://github.com/breathe-doc/breathe/pull/610>`__\n  - Sphinx 3.4.x compatibility. `#617 <https://github.com/breathe-doc/breathe/pull/617>`__\n  - Adapt friendclass to Doxygen 1.9. `#618 <https://github.com/breathe-doc/breathe/pull/618>`__\n\n- 2020-12-16 - **Breathe v4.25.1**\n\n  - Addendum to #606, for functions with '...'. `#609 <https://github.com/breathe-doc/breathe/pull/609>`__\n\n- 2020-12-15 - **Breathe v4.25.0**\n\n  - Add support for \\parblock parsing and rendering. `#603 <https://github.com/breathe-doc/breathe/pull/603>`__\n  - Allow lookup in doxygenfunction without writing param names. `#606 <https://github.com/breathe-doc/breathe/pull/606>`__\n\n- 2020-12-01 - **Breathe v4.24.1**\n\n  - Fix anchors on pages generated by Doxygen >= 1.8.17. `#602 <https://github.com/breathe-doc/breathe/pull/602>`__\n\n- 2020-11-15 - **Breathe v4.24.0**\n\n  - Update CI for Sphinx 3.3.x and fix test mock. `#597 <https://github.com/breathe-doc/breathe/pull/597>`__\n  - Add support for xrefitem based page generation (doxygenpage). `#596 <https://github.com/breathe-doc/breathe/pull/596>`__\n\n- 2020-10-20 - **Breathe v4.23.0**\n\n  - Add initial xrefsect support. `#589 <https://github.com/breathe-doc/breathe/pull/589>`__\n\n- 2020-09-26 - **Breathe v4.22.1**\n\n  - Fix anonymous struct/union usage in C domain. `#585 <https://github.com/breathe-doc/breathe/pull/585>`__\n\n- 2020-09-19 - **Breathe v4.22.0**\n\n  - Fix Read the Docs build (again). `#576 <https://github.com/breathe-doc/breathe/pull/576>`__\n  - New boolean `breathe_show_enumvalue_initializer` option specifying\n    whether value of enumvalue should be displayed. `#581 <https://github.com/breathe-doc/breathe/pull/581>`__\n\n- 2020-09-10 - **Breathe v4.21.0**\n\n  - Fix Read the Docs build. `#567 <https://github.com/breathe-doc/breathe/pull/567>`__\n  - Document doxygenclass template specialisation spacing. `#570 <https://github.com/breathe-doc/breathe/pull/570>`__\n  - Update upper Sphinx release to <3.4. `#571 <https://github.com/breathe-doc/breathe/pull/571>`__\n  - Reuse breathe.__version__ in setup.py. `#572 <https://github.com/breathe-doc/breathe/pull/572>`__\n  - Document :inner: for the doxygengroup section. `#573 <https://github.com/breathe-doc/breathe/pull/573>`__\n  - Add support for verbatim inline elements. `#560 <https://github.com/breathe-doc/breathe/pull/560>`__\n  - Fix wrong refid when Doxygen SEPARATE_MEMBER_PAGES is YES. `#566 <https://github.com/breathe-doc/breathe/pull/566>`__\n\n- 2020-08-19 - **Breathe v4.20.0**\n\n  - Allow Sphinx 3.2. `#561 <https://github.com/breathe-doc/breathe/pull/561>`__\n  - Update CI scripts with new Sphinx versions. `#552 <https://github.com/breathe-doc/breathe/pull/552>`__\n  - Add support for C# using sphinx-csharp. `#550 <https://github.com/breathe-doc/breathe/pull/550>`__\n  - Doc, fix typo, :source: -> :project:. `#551 <https://github.com/breathe-doc/breathe/pull/551>`__\n  - Add support for innergroup. `#556 <https://github.com/breathe-doc/breathe/pull/556>`__\n  - Avoid duplicate doxygen targets when debug tracing. `#563 <https://github.com/breathe-doc/breathe/pull/563>`__\n  - Remove Travis badge from README file. `#564 <https://github.com/breathe-doc/breathe/pull/564>`__\n\n- 2020-06-17 - **Breathe v4.19.2**\n\n  - Fix crash when visiting typedef. `#547 <https://github.com/breathe-doc/breathe/pull/547>`__\n\n- 2020-06-08 - **Breathe v4.19.1**\n\n  - Mark package as compatible with Sphinx 3.1.\n\n- 2020-06-07 - **Breathe v4.19.0**\n\n  - Refactoring. `#528 <https://github.com/breathe-doc/breathe/pull/528>`__\n  - Make debug config variables available in conf.py. `#533 <https://github.com/breathe-doc/breathe/pull/533>`__\n  - Fix warning formatting for function lookup. `#535 <https://github.com/breathe-doc/breathe/pull/535>`__\n  - Correctly reverse nested namespaces in get_qualification. `#540 <https://github.com/breathe-doc/breathe/pull/540>`__\n\n- 2020-05-10 - **Breathe v4.18.1**\n\n  - Fix friend class rendering and allow friend struct. `#522 <https://github.com/breathe-doc/breathe/pull/522>`__\n  - Add extern examples to doc and remove variable hack. `#526 <https://github.com/breathe-doc/breathe/pull/526>`__\n  - Render function candidates without using Sphinx directives. `#524 <https://github.com/breathe-doc/breathe/pull/524>`__\n\n- 2020-05-02 - **Breathe v4.18.0**\n\n  - Support tiles in verbatim blocks. `#517 <https://github.com/breathe-doc/breathe/pull/517>`__\n\n- 2020-05-01 - **Breathe v4.17.0**\n\n  - Scoped rendering, better integration with Sphinx, misc fixes. `#512 <https://github.com/breathe-doc/breathe/pull/512>`__\n\n- 2020-04-19 - **Breathe v4.16.0**\n\n  - Strictly depend on Sphinx's minor version. `#498 <https://github.com/breathe-doc/breathe/pull/498>`__\n  - Simplifications and fixes, use more of modern Sphinx natively. `#503 <https://github.com/breathe-doc/breathe/pull/503>`__\n  - Add section option to the doxygen(auto)file directive. `#501 <https://github.com/breathe-doc/breathe/pull/501>`__\n  - Fix link generation when enum is inside a group (enum FQDN). `#508 <https://github.com/breathe-doc/breathe/pull/508>`__\n  - Fix creation of LaTeX math formulas. `#506 <https://github.com/breathe-doc/breathe/pull/506>`__\n  - Improve documentation for doxygen(auto)file section option. `#509 <https://github.com/breathe-doc/breathe/pull/509>`__\n\n- 2020-04-07 - **Breathe v4.15.0**\n\n  - Add license file to distribution. `#492 <https://github.com/breathe-doc/breathe/pull/492>`__\n  - Update for Sphinx 3. `#491 <https://github.com/breathe-doc/breathe/pull/491>`__\n\n- 2020-04-07 - **Breathe v4.14.2**\n\n  - Add GitHub actions. `#474 <https://github.com/breathe-doc/breathe/pull/474>`__\n  - Fixes to use Sphinx 2.4.4. `#486 <https://github.com/breathe-doc/breathe/pull/486>`__\n  - Add nose to python development requirements. #484.\n  - Switch to pytest from nose. `#487 <https://github.com/breathe-doc/breathe/pull/487>`__\n\n- 2020-02-02 - **Breathe v4.14.1**\n\n  - Use sphinx core instead of mathbase ext. `#469 <https://github.com/breathe-doc/breathe/pull/469>`__\n  - Fix test failure for Sphinx >= 2.2.2. `#472 <https://github.com/breathe-doc/breathe/pull/472>`__\n  - Update travis to Sphinx 2.3.1. `#471 <https://github.com/breathe-doc/breathe/pull/471>`__\n\n- 2019-11-26 - **Breathe v4.14.0**\n\n  - Add events attribute to MockApp. `#452 <https://github.com/breathe-doc/breathe/pull/452>`__\n  - Add bit field support for C/C++. `#454 <https://github.com/breathe-doc/breathe/pull/454>`__\n  - Add alias and variable template support. `#461 <https://github.com/breathe-doc/breathe/pull/461>`__\n\n- 2019-08-01 - **Breathe v4.13.1**\n\n  - Fix for template method pointer parameter issue. `#449 <https://github.com/breathe-doc/breathe/pull/449>`__\n\n- 2019-04-23 - **Breathe v4.13.0**.post0\n\n  - Drop support for python 2, require Sphinx >= 2.0. `#432 <https://github.com/breathe-doc/breathe/pull/432>`__\n\n- 2019-04-21 - **Breathe v4.13.0**\n\n  - Adapt to upcoming Sphinx 2.0. `#411 <https://github.com/breathe-doc/breathe/pull/411>`__\n  - Add support for rendering parameter direction information. `#428 <https://github.com/breathe-doc/breathe/pull/428>`__\n\n- 2019-03-15 - **Breathe v4.12.0**\n\n  - Adapt to Sphinx 1.8. `#410 <https://github.com/breathe-doc/breathe/pull/410>`__\n  - Let Sphinx handle more things. `#412 <https://github.com/breathe-doc/breathe/pull/412>`__\n  - Use standard windows EOL for batch file. `#417 <https://github.com/breathe-doc/breathe/pull/417>`__\n  - Fix flake8 F632 warnings. `#418 <https://github.com/breathe-doc/breathe/pull/418>`__\n  - Update dep versions in readme, setup, requirements. `#419 <https://github.com/breathe-doc/breathe/pull/419>`__\n  - Add option to render function parameters after the description. `#421 <https://github.com/breathe-doc/breathe/pull/421>`__\n  - Remove spurious \"typedef\" in type declaration when using \"using\". `#424 <https://github.com/breathe-doc/breathe/pull/424>`__\n\n- 2018-12-11 - **Breathe v4.11.1**\n\n  - Sphinxrenderer: handle typeless parameters gracefully. `#404 <https://github.com/breathe-doc/breathe/pull/404>`__\n\n- 2018-10-31 - **Breathe v4.11.0**\n\n  - Fix typo in quickstart. `#393 <https://github.com/breathe-doc/breathe/pull/393>`__\n  - Add support for QtSignals. `#401 <https://github.com/breathe-doc/breathe/pull/401>`__\n\n- 2018-08-07 - **Breathe v4.10.0**\n\n  - Explicitly use Sphinx 1.7.5 for CI and dev. `#385 <https://github.com/breathe-doc/breathe/pull/385>`__\n  - Print filename when printing ParserException. `#390 <https://github.com/breathe-doc/breathe/pull/390>`__\n\n- 2018-06-03 - **Breathe v4.9.1**\n\n  - Don't append separator for paragraph type. `#382 <https://github.com/breathe-doc/breathe/pull/382>`__\n\n- 2018-06-01 - **Breathe v4.9.0**\n\n  - Render newlines as separate paragraphs. `#380 <https://github.com/breathe-doc/breathe/pull/380>`__\n\n- 2018-05-26 - **Breathe v4.8.0**\n\n  - Add quiet option to apidoc. `#375 <https://github.com/breathe-doc/breathe/pull/375>`__\n  - Add PHP domain. `#351 <https://github.com/breathe-doc/breathe/pull/351>`__\n  - Keep templates on adjacent lines. `#300 <https://github.com/breathe-doc/breathe/pull/300>`__\n  - Show reference qualification for methods. `#332 <https://github.com/breathe-doc/breathe/pull/332>`__\n  - Adapt tests/CI to newest Sphinx version. `#377 <https://github.com/breathe-doc/breathe/pull/377>`__\n  - More robust name regex in renderer. `#370 <https://github.com/breathe-doc/breathe/pull/370>`__\n  - Show base classes using Sphinx's cpp domain. `#295 <https://github.com/breathe-doc/breathe/pull/295>`__\n  - Fix domain detection when rendering groups. `#365 <https://github.com/breathe-doc/breathe/pull/365>`__\n  - Return parallel_{read,write}_safe true for Sphinx's -j. `#376 <https://github.com/breathe-doc/breathe/pull/376>`__\n\n- 2017-10-09 - **Breathe v4.7.3**\n\n  - Support for enums in the cpp domain.\n  - Handle case where compoundref does not have a refid value associated.\n\n- 2017-08-15 - **Breathe v4.7.2**\n\n  - Fix issue with packaging on Python 2.7 with wheels.\n\n- 2017-08-13 - **Breathe v4.7.1**\n\n  - Fixed bug regarding code snippets inside Doxygen comments.\n\n- 2017-08-09 - **Breathe v4.7.0**\n\n  - New `outtypes` option to prevent documenting namespace and files\n\n  - New boolean `breathe_show_define_initializer` option specifying whether\n    value of macros should be displayed.\n\n  - New boolean `breathe_use_project_refids` option controlling whether the\n    refids generated by breathe for doxygen elements contain the project name\n    or not.\n\n  - Fixed\n\n    - Support for Sphinx 1.6\n\n- 2017-02-25 - **Breathe v4.6.0**\n\n  - Support for the Interface directive\n\n  - Display the contents of defines\n\n- 2017-02-12 - **Breathe v4.5.0**\n\n  - Improve handling of c typedefs\n\n  - Support new `desc_signature_line` node\n\n  - Add `--project` flag to breathe-apidoc helper\n\n  - Dropped testing for Python 3.3 and added 3.6\n\n- 2016-11-13 - **Breathe v4.4.0**\n\n  - Improve single line parameter documentation rendering\n\n- 2016-11-05 - **Breathe v4.3.1**\n\n  - Version bump package confusion with wheel release\n\n- 2016-11-05 - **Breathe v4.3.0**\n\n  - Rewritten rendering approach to use the visitor pattern\n\n  - Dropped support for 2.6 & added testing for 3.5\n\n  - Fixed\n\n    - Issue with running breathe-apidoc for the first time.\n\n    - Improved handling of qualifiers, eg. const & volatile.\n\n    - Supports functions in structs\n\n    - Supports auto-doxygen code path on Windows\n\n- 2016-03-19 - **Breathe v4.2.0**\n\n  - Added\n\n    - Output links to a class' parents & children.\n\n    - Support for Sphinx's `needs_extensions` config option.\n\n    - breathe-apidoc script for generating ReStructuredText stub files with\n      Breathe directives from doxygen xml files.\n\n  - Fixed\n\n    - Handling default values in parameter declarations\n\n    - Output order not being reproducible due to iteration over Set.\n\n    - Handling of multiple pointers and references\n\n    - `SEVERE: Duplicate ID` warnings when using function overloads.\n\n    - Use project name for link references when using default project. So we use\n      the project name instead of 'project0'.\n\n- 2015-08-27 - **Breathe v4.1.0**\n\n  - Added\n\n    - ``breathe_doxygen_config_options`` config variable which allows for adding\n      more config lines to the doxygen file used for the auto-directives.\n\n  - Fixed\n\n    - Display of array & array reference parameters for functions.\n\n    - Handling of links to classes with template arguments.\n\n    - Handling of unnamed enums in C.\n\n    - Naming of template parameter section.\n\n    - Finding functions that are within groups.\n\n    - Rendering of 'typename' and 'class' keywords for templates.\n\n- 2015-04-02 - **Breathe v4.0.0**\n\n  - Significant work on the code base with miminal reStructureText interface\n    changes. To be documented.\n\n- 2014-11-09 - **Breathe v3.2.0**\n\n  - Nothing Added, Deprecated or Removed\n\n  - Fixed\n\n    - Changed docutils/Sphinx node usage to fix latex/pdf output.\n\n    - When checking for path separators check for both ``/`` and ``\\``\n      regardless of the platform.\n\n    - ``KeyError`` when using ``auto`` directives without specifying the\n      ``:project:`` option even though the default project config setting was\n      set.\n\n    - Use of ``doxygenfunction`` no longer inappropriately triggers the\n      duplicate target check and fails to output link targets.\n\n    - Support for inline urls in the doxygen comments.\n\n    - Support for array notation in function parameters.\n\n    - Reduced intention by changing ``section-defs`` to use ``container`` &\n      ``rubric`` nodes rather than ``desc`` nodes with signatures & content. Now\n      headings like 'Public Functions' appear inline with their subject matter.\n\n- 2014-09-07 - **Breathe v3.1.0**\n\n  - Nothing Deprecated or Removed\n\n  - Added\n\n    - The ``doxygenclass`` directive can now reference template specialisations\n      by specifying the specialisation in the argument name.\n\n  - Fixed\n\n    - Displaying function parameters for Qt slots output. Previously they were\n      missing even though Qt Slots are essentially just functions.\n\n    - Displaying headings from doxygen comments as emphasized text.\n\n    - Crash when generating warning about being unable to find a define,\n      variable, enum, typedef or union.\n\n    - Only output the definition name for a function parameter if the declartion\n      name is not available. Previously, where they were both available we were\n      getting two names next to each other for no good reason.\n\n- 2014-08-04 - **Breathe v3.0.0**\n\n  - Improve output of const, volatile, virtual and pure-virtual keywords.\n\n  - Fix css class output for HTML so that object types rather than names are\n    output as the css classes. eg. 'function' instead of 'myFunction'.\n\n  - Fix issue with Breathe getting confused over functions appearing in header\n    and implementation files.\n\n  - Improve matching for overloaded functions when using ``doxygenfunction``\n    directive. Also, provide a list of potential matches when no match is found.\n\n  - Improved ``:members:`` implementation to handle inner classes properly.\n\n  - Updated ``doxygenstruct`` to share the ``doxygenclass`` implementation path\n    which grants it the options from ``doxygenclass`` directive.\n\n  - Added ``:outline:`` option support to ``doxygengroup`` &\n    ``doxygennamespace`` directives.\n\n  - Added ``doxygennamespace`` directive.\n\n  - Added ``:undoc-members:`` option to ``doxygenclass`` & ``doxygengroup``\n    directives.\n\n  - **Breaking change**: Removed ``:sections:`` option for ``doxygenclass`` &\n    ``doxygengroup`` directives and replaced it with ``:members:``,\n    ``:protected-members:`` and ``:private-members:``, and changed\n    ``breathe_default_sections`` config variable to ``breathe_default_members``.\n    This is designed to more closely match the Sphinx autodoc functionality and\n    interface.\n\n- 2014-06-15 - **Breathe v2.0.0**\n\n  - Add compare script for checking changes to documentation caused by changes\n    in the implementation.\n\n  - Switched to ``https`` reference for MathJax Javascript.\n\n  - **Breaking change**: Change ``autodoxygen*`` directives to require\n    explicitly declared source files in the ``conf.py`` rather than attempting\n    to detect them from the directive arguments.\n\n  - Switch documentation hosting to ReadTheDocs.org.\n\n  - **Breaking change**: Switch to assuming all relative paths are relative to\n    the directory holding the ``conf.py`` file. Previously, it would assume they\n    were relative to the user's current working directory. This breaks projects\n    which use separate build & source directories.\n\n  - Add ``doxygenunion`` directive.\n\n  - Add ``doxygengroup`` directive.\n\n  - Add support for lists in the output. They were previously ignored.\n\n  - Updated implementation to use the docutils nodes that Sphinx does where\n    possible.\n\n- 2014-06-01 - **Breathe v1.2.0**\n\n  - Change log not recorded.\n\n"
  },
  {
    "path": "CONTRIBUTING.rst",
    "content": "\nContributing\n============\n\nFirstly, thank you for making it this far. We really appreciate anyone who even\nthinks about reporting an issue or helping out with the code or docs. It is kind\nof you to take the time.\n\nPlease Provide an Example\n-------------------------\n\nIf you're having trouble with how the contents of a particular Doxygen comment\nor a particular set of code is being processed then please provide an example of\nthe in question.\n\nIdeally as a pull-request with additions to the `examples/specific` folder but\nfeel free to provide the comment content in your issue instead.\n\nIt really helps to accelerate development if we have examples to work from.\n"
  },
  {
    "path": "CONTRIBUTORS.rst",
    "content": "Contributors\n============\n\nMany thanks to everyone that has contributed to the project.\n\n- `Andne <https://github.com/Andne>`_\n- `arximboldi <https://github.com/arximboldi>`_\n- `D4N <https://github.com/D4N>`_\n- `dean0x7d <https://github.com/dean0x7d>`_\n- `dg-dboehi <https://github.com/dg>`_\n- `eric-wieser <https://github.com/eric>`_\n- `fetzerch <https://github.com/fetzerch>`_\n- `gmarull <https://github.com/gmarull>`_\n- `hidmic <https://github.com/hidmic>`_\n- `ishitatsuyuki <https://github.com/ishitatsuyuki>`_\n- `jakobandersen <https://github.com/jakobandersen>`_\n- `mattip <https://github.com/mattip>`_\n- `michaeljones <https://github.com/michaeljones>`_\n- `nijel <https://github.com/nijel>`_\n- `olitheolix <https://github.com/olitheolix>`_\n- `pczerkas <https://github.com/pczerkas>`_\n- `queezythegreat <https://github.com/queezythegreat>`_\n- `remyleone <https://github.com/remyleone>`_\n- `rhssk <https://github.com/rhssk>`_\n- `rogerbarton <https://github.com/rogerbarton>`_\n- `ropg <https://github.com/ropg>`_\n- `rscohn2 <https://github.com/rscohn2>`_\n- `rweickelt <https://github.com/rweickelt>`_\n- `SylvainCorlay <https://github.com/SylvainCorlay>`_\n- `t-b <https://github.com/t>`_\n- `Tiwalun <https://github.com/Tiwalun>`_\n- `utzig <https://github.com/utzig>`_\n- `vermeeren <https://github.com/vermeeren>`_\n- `vitaut <https://github.com/vitaut>`_\n- `xuhongxu96 <https://github.com/xuhongxu96>`_\n\nAnd many more via issues and suggestions.\n"
  },
  {
    "path": "LICENSE",
    "content": "// BSD license, modified to remove the organisation as there isn't one.\n\nCopyright (c) 2009, Michael Jones\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n\t * Redistributions of source code must retain the above copyright notice,\n\t   this list of conditions and the following disclaimer.\n\t * Redistributions in binary form must reproduce the above copyright notice,\n\t   this list of conditions and the following disclaimer in the documentation\n\t   and/or other materials provided with the distribution.\n\t * The names of its contributors may not be used to endorse or promote\n\t   products derived from this software without specific prior written\n\t   permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "recursive-include xml_parser_generator *.py *.in *.json \ninclude requirements/*.txt tests/*.py\ngraft tests/data\nexclude breathe/_parser.py\nglobal-exclude *.py[cod]"
  },
  {
    "path": "Makefile",
    "content": "RM        \t\t= rm -f\nGENERATED_MOD\t= breathe/_parser.py\n\n.PHONY: all\nall: html pdf\n\n.PHONY: html\nhtml: data\n\t$(MAKE) -C documentation html\n\n.PHONY: pdf\npdf: data\n\t$(MAKE) -C documentation latexpdf\n\t\n.PHONY: data\ndata:\n\t$(MAKE) -C examples/doxygen all\n\t$(MAKE) -C examples/tinyxml all\n\t$(MAKE) -C examples/specific all\n\n$(GENERATED_MOD): \\\n\t\txml_parser_generator/schema.json \\\n\t\txml_parser_generator/module_template.py.in \\\n\t\txml_parser_generator/make_parser.py\n\tpython3 xml_parser_generator/setuptools_builder.py\n\n.PHONY: parser\nparser: $(GENERATED_MOD)\n\n.PHONY: format-parser\nformat-parser:\n\truff format $(GENERATED_MOD)\n\n.PHONY: distclean\ndistclean: clean\n\t$(MAKE) -C documentation clean\n\t$(RM) $(GENERATED_MOD)\n\n.PHONY: clean\nclean:\n\t$(MAKE) -C examples/doxygen $@\n\t$(MAKE) -C examples/tinyxml $@\n\t$(MAKE) -C examples/specific $@\n\n.PHONY: test\ntest: $(GENERATED_MOD)\n\tcd tests && python3 -m pytest -v --maxfail=1\n\n.PHONY: dev-test\ndev-test: $(GENERATED_MOD)\n\tcd tests && PYTHONPATH=../:$(PYTHONPATH) python3 -m pytest -v\n\n.PHONY: ruff\nruff:\n\truff check\n\truff format\n\n.PHONY: type-check\ntype-check: $(GENERATED_MOD)\n\tmypy --warn-redundant-casts --warn-unused-ignores breathe tests\n"
  },
  {
    "path": "README.rst",
    "content": ".. image:: https://www.breathe-doc.org/img/logo.svg\n   :align: center\n   :alt: Breathe logo\n   :width: 200\n   :height: 200\n   :target: https://www.breathe-doc.org\n\nBreathe\n=======\n\n**Your technical docs, beautifully integrated**\n\n.. image:: https://github.com/breathe-doc/breathe/actions/workflows/unit_tests.yml/badge.svg\n   :target: https://github.com/breathe-doc/breathe/actions/workflows/unit_tests.yml\n   :alt: Build Status\n\nWebsite_ • Documentation_ • Sponsor_\n\n**Sponsor**: If you benefit from using Breathe as a company or an individual, you\ncan financially support the Breathe project with recurring or one off\ncontributions via `Open Collective <https://opencollective.com/breathe>`_.\n\n.. _Website: https://www.breathe-doc.org/\n.. _Documentation: https://breathe.readthedocs.io/en/latest/\n.. _Sponsor: https://opencollective.com/breathe\n\n----\n\nBreathe is a Sphinx plugin providing beautifully integrated Doxygen output in\nyour user-facing documentation. It allows you to combine Doxygen's excellent\ntechnical understanding of your code base with the superb long form\ndocumentation output of the Sphinx system.\n\nFor Packagers\n-------------\n\n- Breathe packages on PyPI are PGP signed for Breathe >= v4.28.0.\n- Breathe tarballs on GitHub are PGP signed for Breathe >= v4.29.0.\n\nDownload\n--------\n\nBreathe is available from github and `PyPI, the Python Package Index\n<https://pypi.org/project/breathe/>`_. It can be installed with::\n\n    pip install breathe\n\nDocumentation\n-------------\n\nThe documentation is available `here <https://breathe.readthedocs.io/>`__. Thank\nyou to the people running `Read the Docs <https://readthedocs.org>`_ for such an\nexcellent service.\n\nThe source for the documentation is in the ``documentation`` folder if you want\nto built it and read it locally.\n\nTesting\n-------\n\nThe testsuite can be run with::\n\n    make dev-test\n\nThe documentation also does a good effort of covering the available\nfunctionality with different examples. To build the documentation, run::\n\n    make\n\nThis will run doxygen over the example code and then run the Breathe\ndocumentation. View the results at::\n\n    documentation/build/html/index.html\n\nFurther to this if you want to compare the current documentation output against\na previous state in order to check for regressions there is a ``compare`` script\nin the ``documentation`` folder. It takes two arguments which are two commit\nreferences that you'd like to compare. This means that all your changes have to\nbe committed first. Also the script does not resolve state dependent references\nlike ``HEAD`` so provide concrete commit references like sha1s or branch names.\nA typical example is to compare your current branch output to master::\n\n    # Make sure all your changes are committed first\n    cd documentation\n    ./compare master my-branch\n\nThis will do a checkout and build at each commit and then run ``meld`` against\nthe resulting directories so you can see the differences introduced by your\nbranch.\n\nRequirements\n------------\n\nBreathe requires Python 3.9+, Sphinx 7.2+, and Doxygen 1.9.2+.\n\nMailing List Archives\n---------------------\n\nThe archive for the Google groups list can be found\n`here <https://groups.google.com/forum/#!forum/sphinx-breathe>`__.\n\nThe previous mailing list was on `librelist.com <https://librelist.com>`__ and the\narchives are available `here <https://librelist.com/browser/breathe/>`__.\n\nPlease post new questions as GitHub issues.\n\nProjects Using Breathe\n----------------------\n\nExamples of projects that use Breathe:\n\n- `PyTorch <https://github.com/pytorch/pytorch>`_\n- `OpenPilot <https://github.com/commaai/openpilot>`_\n- `XGBoost <https://github.com/dmlc/xgboost>`_\n- `NumPy <https://github.com/numpy/numpy>`_\n- `Mozilla's DeepSpeech <https://github.com/mozilla/DeepSpeech>`_\n- `Microsoft's LightGBM <https://github.com/microsoft/LightGBM>`_\n- `PyBind11 <https://github.com/pybind/pybind11>`_\n- `Ceph <https://github.com/ceph/ceph>`_\n- `Apache Arrow <https://github.com/apache/arrow>`_\n- `LVGL <https://github.com/lvgl/lvgl>`_\n- `Espressif IoT Development Framework <https://github.com/espressif/esp-idf>`_\n- `Zephyr Project <https://github.com/zephyrproject-rtos/zephyr>`_\n- `Plaid ML <https://github.com/plaidml/plaidml>`_\n- `Sony's Neural Network Libraries <https://github.com/sony/nnabla>`_\n- `fmt <https://fmt.dev/latest/>`_\n\nRelease\n-------\n\n1. Update `CHANGELOG.rst` and create the git tag (`vX.Y.Z`).\n2. Push the tag to GitHub.\n3. The `create-release.yml` workflow will publish the release to PyPI.\n4. Go to https://github.com/breathe-doc/breathe/tags, select the new tag,\n   and click the \"Create release from tag\" button to publish a GitHub release.\n\nMaintainers\n-----------\n\nBreathe is currently maintained by `vermeeren <https://github.com/vermeeren>`_ & `jakobandersen <https://github.com/jakobandersen>`_\nand was formerly maintained by `michaeljones <https://github.com/michaeljones>`_\n& `vitaut <https://github.com/vitaut>`_.\n\nSee `CONTRIBUTORS </CONTRIBUTORS.rst>`_ for the full list.\n\nAcknowledgements\n----------------\n\n- Dimitri van Heesch for `Doxygen <https://www.doxygen.nl/>`_.\n- Georg Brandl for `Sphinx <https://www.sphinx-doc.org/>`_.\n- David Goodger for `Docutils <https://docutils.sourceforge.io/>`_ and reStructuredText.\n\nChangelog\n---------\n\nSee the `CHANGELOG.rst\n<https://github.com/breathe-doc/breathe/blob/master/CHANGELOG.rst>`_\n"
  },
  {
    "path": "breathe/README.rst",
    "content": "\nbreathe\n=======\n\n- **Subpackages**\n\n  - **directive** - Contains some rst directive definitions. These were split out\n    of `directives.py` when it started to become too large.\n  - **finder** - Provides classes for finding nodes within the set of xml\n    files generated by doxygen. Finders are generally used in the `run` methods of\n    the directives to find the xml node which is then passed to the renderer to\n    create the output.\n  - **renderer** - Provides classes for rendering an xml node from the doxygen xml\n    into docutils rst nodes which can be used by Sphinx. Breathe should ideally\n    only produce rst nodes and not concern itself with the final output (html,\n    latex, etc.)\n\n- **Submodules**\n\n  - **directives** - Contains the definitions of some of the directives. The rest\n    are in the files in the `directive` folder. It also contains all the set up\n    code which registers with Sphinx and wires together all the various factories.\n  - **parser** - Contains code for parsing the doxygen xml into a tree of Python\n    objects. Most of its content is imported from `_parser`, which is generated\n    automatically when Breathe is built.\n  - **process** - Contains the code responsible for running the `doxygen` process\n    when using the `autodoxygen` directives.\n  - **project** - Handles the concept of a `Project` which is the breathe term for\n    a folder full of doxygen xml files.\n  - **exception** - Contains the base class for all custom exceptions.\n"
  },
  {
    "path": "breathe/__init__.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n\n__version__ = \"5.0.0a5\"\n\n\ndef setup(app: Sphinx):\n    from breathe.directives.setup import setup as directive_setup\n    from breathe.file_state_cache import setup as file_state_cache_setup\n    from breathe.renderer.sphinxrenderer import setup as renderer_setup\n\n    directive_setup(app)\n    file_state_cache_setup(app)\n    renderer_setup(app)\n\n    return {\"version\": __version__, \"parallel_read_safe\": True, \"parallel_write_safe\": True}\n"
  },
  {
    "path": "breathe/apidoc.py",
    "content": "\"\"\"\nbreathe.apidoc\n~~~~~~~~~~~~~~\n\nParses doxygen XML tree looking for C/C++ modules and creates ReST files\nappropriately to create code documentation with Sphinx. It also creates a\nmodules index (See TYPEDICT below.).\n\nThis is derived from the \"sphinx-autopackage\" script, which is:\nCopyright 2008 Société des arts technologiques (SAT),\nhttp://www.sat.qc.ca/\n\n:copyright: Originally by Sphinx Team, C++ modifications by Tatsuyuki Ishi\n:license: BSD, see LICENSE for details.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport argparse\nimport os\nimport sys\nimport xml.etree.ElementTree\nfrom pathlib import Path\n\nfrom breathe import __version__\n\n# Reference: Doxygen XSD schema file, CompoundKind only\n# Only what breathe supports are included\n# Translates identifier to English\nTYPEDICT = {\n    \"class\": \"Class\",\n    \"interface\": \"Interface\",\n    \"struct\": \"Struct\",\n    \"union\": \"Union\",\n    \"file\": \"File\",\n    \"namespace\": \"Namespace\",\n    \"group\": \"Group\",\n}\n\n# Types that accept the :members: option.\nMEMBERS_TYPES = [\"class\", \"group\", \"interface\", \"namespace\", \"struct\"]\n\n\ndef print_info(msg, args):\n    if not args.quiet:\n        print(msg)\n\n\ndef write_file(name, text, args):\n    \"\"\"Write the output file for module/package <name>.\"\"\"\n    fname = Path(args.destdir, f\"{name}.{args.suffix}\")\n    if args.dryrun:\n        print_info(\"Would create file %s.\" % fname, args)\n        return\n    if not args.force and fname.is_file():\n        print_info(\"File %s already exists, skipping.\" % fname, args)\n    else:\n        print_info(\"Creating file %s.\" % fname, args)\n        fname.parent.mkdir(parents=True, exist_ok=True)\n        try:\n            orig = fname.read_text(encoding=\"utf-8\")\n            if orig == text:\n                print_info(\"File %s up to date, skipping.\" % fname, args)\n                return\n        except FileNotFoundError:\n            # Don't mind if it isn't there\n            pass\n        fname.write_text(text, encoding=\"utf-8\")\n\n\ndef format_heading(level, text):\n    \"\"\"Create a heading of <level> [1, 2 or 3 supported].\"\"\"\n    underlining = [\"=\", \"-\", \"~\"][level - 1] * len(text)\n    return \"%s\\n%s\\n\\n\" % (text, underlining)\n\n\ndef format_directive(package_type, package, args):\n    \"\"\"Create the breathe directive and add the options.\"\"\"\n    directive = \".. doxygen%s:: %s\\n\" % (package_type, package)\n    if args.project:\n        directive += \"   :project: %s\\n\" % args.project\n    if args.members and package_type in MEMBERS_TYPES:\n        directive += \"   :members:\\n\"\n    return directive\n\n\ndef create_package_file(package, package_type, package_id, args):\n    \"\"\"Build the text of the file and write the file.\"\"\"\n    # Skip over types that weren't requested\n    if package_type not in args.outtypes:\n        return\n    text = format_heading(1, \"%s %s\" % (TYPEDICT[package_type], package))\n    text += format_directive(package_type, package, args)\n\n    write_file(Path(package_type, package_id), text, args)\n\n\ndef create_modules_toc_file(key, value, args):\n    \"\"\"Create the module's index.\"\"\"\n    if not Path(args.destdir, key).is_dir():\n        return\n    text = format_heading(1, \"%s list\" % value)\n    text += \".. toctree::\\n\"\n    text += \"   :glob:\\n\\n\"\n    text += \"   %s/*\\n\" % key\n\n    write_file(\"%slist\" % key, text, args)\n\n\ndef recurse_tree(args):\n    \"\"\"\n    Look for every file in the directory tree and create the corresponding\n    ReST files.\n    \"\"\"\n    index = xml.etree.ElementTree.parse(Path(args.rootpath, \"index.xml\"))\n\n    # Assuming this is a valid Doxygen XML\n    for compound in index.getroot():\n        create_package_file(\n            compound.findtext(\"name\"), compound.get(\"kind\"), compound.get(\"refid\"), args\n        )\n\n\nclass TypeAction(argparse.Action):\n    def __init__(self, option_strings, dest, **kwargs):\n        super().__init__(option_strings, dest, **kwargs)\n        self.default = TYPEDICT.keys()\n        self.metavar = \",\".join(TYPEDICT.keys())\n\n    def __call__(self, parser, namespace, values, option_string=None):\n        assert isinstance(values, str)\n        value_list = values.split(\",\")\n        for value in value_list:\n            if value not in TYPEDICT:\n                raise ValueError(\"%s not a valid option\" % value)\n        setattr(namespace, self.dest, value_list)\n\n\ndef main():\n    \"\"\"Parse and check the command line arguments.\"\"\"\n    parser = argparse.ArgumentParser(\n        description=\"\"\"\\\nParse XML created by Doxygen in <rootpath> and create one reST file with\nbreathe generation directives per definition in the <DESTDIR>.\n\nNote: By default this script will not overwrite already created files.\"\"\",\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n\n    parser.add_argument(\n        \"-o\",\n        \"--output-dir\",\n        action=\"store\",\n        dest=\"destdir\",\n        help=\"Directory to place all output\",\n        required=True,\n    )\n    parser.add_argument(\n        \"-f\", \"--force\", action=\"store_true\", dest=\"force\", help=\"Overwrite existing files\"\n    )\n    parser.add_argument(\n        \"-m\",\n        \"--members\",\n        action=\"store_true\",\n        dest=\"members\",\n        help=\"Include members for types: %s\" % MEMBERS_TYPES,\n    )\n    parser.add_argument(\n        \"-n\",\n        \"--dry-run\",\n        action=\"store_true\",\n        dest=\"dryrun\",\n        help=\"Run the script without creating files\",\n    )\n    parser.add_argument(\n        \"-T\",\n        \"--no-toc\",\n        action=\"store_true\",\n        dest=\"notoc\",\n        help=\"Don't create a table of contents file\",\n    )\n    parser.add_argument(\n        \"-s\",\n        \"--suffix\",\n        action=\"store\",\n        dest=\"suffix\",\n        help=\"file suffix (default: rst)\",\n        default=\"rst\",\n    )\n    parser.add_argument(\n        \"-p\",\n        \"--project\",\n        action=\"store\",\n        dest=\"project\",\n        help=\"project to add to generated directives\",\n    )\n    parser.add_argument(\n        \"-g\",\n        \"--generate\",\n        action=TypeAction,\n        dest=\"outtypes\",\n        help=\"types of output to generate, comma-separated list\",\n    )\n    parser.add_argument(\n        \"-q\", \"--quiet\", action=\"store_true\", dest=\"quiet\", help=\"suppress informational messages\"\n    )\n    parser.add_argument(\n        \"--version\", action=\"version\", version=\"Breathe (breathe-apidoc) %s\" % __version__\n    )\n    parser.add_argument(\"rootpath\", type=str, help=\"The directory contains index.xml\")\n    args = parser.parse_args()\n\n    args.suffix = args.suffix.removeprefix(\".\")\n    if not os.path.isdir(args.rootpath):\n        print(\"%s is not a directory.\" % args.rootpath, file=sys.stderr)\n        sys.exit(1)\n    if \"index.xml\" not in os.listdir(args.rootpath):\n        print(\"%s does not contain a index.xml\" % args.rootpath, file=sys.stderr)\n        sys.exit(1)\n    if not os.path.isdir(args.destdir):\n        if not args.dryrun:\n            os.makedirs(args.destdir)\n    args.rootpath = os.path.abspath(args.rootpath)\n    recurse_tree(args)\n    if not args.notoc:\n        for key in args.outtypes:\n            create_modules_toc_file(key, TYPEDICT[key], args)\n\n\n# So program can be started with \"python -m breathe.apidoc ...\"\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "breathe/cpp_util.py",
    "content": "from __future__ import annotations\n\nimport re\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from collections.abc import Iterator\n\nRE_NAME_PART = re.compile(r\"([<>()[\\]]|::)\")\n\n\ndef _check_pair(dest: list[str], tokens: Iterator[str], start: str, end: str) -> bool:\n    if dest[-1] == start:\n        for tok in tokens:\n            dest.append(tok)\n            if tok == end:\n                break\n            # If we're inside angle brackets, we assume \"<\" and \">\" are brackets\n            # and not comparison operators. Once we're inside other brackets, we\n            # only need to worry about recursive brackets and can ignore the\n            # other types.\n            if start == \"<\":\n                _check_all_pairs(dest, tokens)\n            else:\n                _check_pair(dest, tokens, start, end)\n        return True\n    return False\n\n\ndef _check_all_pairs(dest: list[str], tokens: Iterator[str]) -> None:\n    if not _check_pair(dest, tokens, \"<\", \">\"):\n        if not _check_pair(dest, tokens, \"(\", \")\"):\n            if not _check_pair(dest, tokens, \"[\", \"]\"):\n                _check_pair(dest, tokens, \"{\", \"}\")\n\n\ndef split_name(name: str) -> list[str]:\n    \"\"\"Split a qualified C++ name into the namespace components.\n\n    E.g. turn \"A<B::C>::D::E<(F>G::H),(I<J)>\" into\n    [\"A<B::C>\",\"D\",\"E<(F>G::H),(I<J)>\"]\n\n    This can produce incorrect results if any of the template parameters are\n    strings containing brackets.\n    \"\"\"\n    last: list[str] = []\n    parts = [last]\n    tokens = iter(RE_NAME_PART.split(name))\n    for tok in tokens:\n        if tok == \"::\":\n            last = []\n            parts.append(last)\n        else:\n            last.append(tok)\n            _check_all_pairs(last, tokens)\n\n    return [\"\".join(subparts) for subparts in parts]\n"
  },
  {
    "path": "breathe/directives/__init__.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom docutils import nodes\nfrom sphinx.directives import SphinxDirective\n\nfrom breathe import parser\nfrom breathe.finder import factory\nfrom breathe.renderer import RenderContext, format_parser_error\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer\n\nif TYPE_CHECKING:\n    from collections.abc import Sequence\n    from typing import Any\n\n    from sphinx.application import Sphinx\n\n    from breathe.parser import DoxygenParser\n    from breathe.project import ProjectInfo, ProjectInfoFactory\n    from breathe.renderer import TaggedNode\n    from breathe.renderer.filter import DoxFilter\n    from breathe.renderer.mask import MaskFactoryBase\n    from breathe.renderer.target import TargetHandler\n\n\nclass _WarningHandler:\n    def __init__(self, state, context: dict[str, Any]) -> None:\n        self.state = state\n        self.context = context\n\n    def warn(\n        self,\n        raw_text: str,\n        *,\n        rendered_nodes: Sequence[nodes.Node] | None = None,\n        unformatted_suffix: str = \"\",\n    ) -> list[nodes.Node]:\n        raw_text = self.format(raw_text) + unformatted_suffix\n        if rendered_nodes is None:\n            rendered_nodes = [nodes.paragraph(\"\", \"\", nodes.Text(raw_text))]\n        return [\n            nodes.warning(\"\", *rendered_nodes),\n            self.state.document.reporter.warning(raw_text, line=self.context[\"lineno\"]),\n        ]\n\n    def format(self, text: str) -> str:\n        return text.format(**self.context)\n\n\nclass BaseDirective(SphinxDirective):\n    @property\n    def directive_args(self) -> list:\n        # the order must be the same as in docutils.parsers.rst.Directive.__init__\n        return [\n            self.name,\n            self.arguments,\n            self.options,\n            self.content,\n            self.lineno,\n            self.content_offset,\n            self.block_text,\n            self.state,\n            self.state_machine,\n        ]\n\n    @property\n    def project_info_factory(self) -> ProjectInfoFactory:\n        return self.env.temp_data[\"breathe_project_info_factory\"]\n\n    @property\n    def dox_parser(self) -> DoxygenParser:\n        return self.env.temp_data[\"breathe_dox_parser\"]\n\n    @property\n    def app(self) -> Sphinx:\n        return self.env.app\n\n    def get_doxygen_index(self, project_info: ProjectInfo) -> parser.DoxygenIndex:\n        return self.dox_parser.parse_index(project_info)\n\n    def create_finder_from_root(\n        self, root: factory.FinderRoot, project_info: ProjectInfo\n    ) -> factory.Finder:\n        return factory.create_finder_from_root(self.env.app, self.dox_parser, root, project_info)\n\n    def create_warning(self, project_info: ProjectInfo | None, **kwargs) -> _WarningHandler:\n        if project_info:\n            proj_name = project_info.name()\n            proj_path = project_info.project_path()\n            tail = f'in doxygen xml output for project \"{proj_name}\" from directory: {proj_path}'\n        else:\n            tail = \"\"\n\n        context = dict(lineno=self.lineno, tail=tail, **kwargs)\n        return _WarningHandler(self.state, context)\n\n    def render(\n        self,\n        node_stack: list[TaggedNode],\n        project_info: ProjectInfo,\n        filter_: DoxFilter,\n        target_handler: TargetHandler,\n        mask_factory: MaskFactoryBase,\n        directive_args,\n    ) -> list[nodes.Node]:\n        \"Standard render process used by subclasses\"\n\n        try:\n            object_renderer = SphinxRenderer(\n                self.dox_parser.app,\n                project_info,\n                [tn.value for tn in node_stack],\n                self.state,\n                self.state.document,\n                target_handler,\n                self.dox_parser,\n                filter_,\n            )\n        except parser.ParserError as e:\n            return format_parser_error(\n                \"doxygenclass\", e.message, e.filename, self.state, self.lineno, True\n            )\n        except parser.FileIOError as e:\n            return format_parser_error(\n                \"doxygenclass\", e.error, e.filename, self.state, self.lineno, True\n            )\n\n        context = RenderContext(node_stack, mask_factory, directive_args)\n        node = node_stack[0].value\n        assert isinstance(node, parser.Node)\n        return object_renderer.render(node, context)\n"
  },
  {
    "path": "breathe/directives/class_like.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, cast\n\nfrom docutils.parsers.rst.directives import flag, unchanged, unchanged_required\n\nfrom breathe.directives import BaseDirective\nfrom breathe.file_state_cache import MTimeError\nfrom breathe.project import ProjectError\nfrom breathe.renderer import filter\nfrom breathe.renderer.mask import NullMaskFactory\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    import sys\n    from typing import ClassVar\n\n    if sys.version_info >= (3, 11):\n        from typing import NotRequired, TypedDict\n    else:\n        from typing_extensions import NotRequired, TypedDict\n\n    from docutils.nodes import Node\n\n    from breathe.project import ProjectOptions\n\n    DoxClassOptions = TypedDict(\n        \"DoxClassOptions\",\n        {\n            \"path\": str,\n            \"project\": str,\n            \"members\": NotRequired[str],\n            \"membergroups\": str,\n            \"members-only\": NotRequired[None],\n            \"protected-members\": NotRequired[None],\n            \"private-members\": NotRequired[None],\n            \"undoc-members\": NotRequired[None],\n            \"show\": str,\n            \"outline\": NotRequired[None],\n            \"no-link\": NotRequired[None],\n            \"allow-dot-graphs\": NotRequired[None],\n        },\n    )\nelse:\n    DoxClassOptions = None\n    ProjectOptions = None\n\n\nclass _DoxygenClassLikeDirective(BaseDirective):\n    kind: ClassVar[str]\n\n    required_arguments = 1\n    optional_arguments = 0\n    final_argument_whitespace = True\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"members\": unchanged,\n        \"membergroups\": unchanged_required,\n        \"members-only\": flag,\n        \"protected-members\": flag,\n        \"private-members\": flag,\n        \"undoc-members\": flag,\n        \"show\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n        \"allow-dot-graphs\": flag,\n    }\n    has_content = False\n\n    def run(self) -> list[Node]:\n        name = self.arguments[0]\n        options = cast(\"DoxClassOptions\", self.options)\n\n        try:\n            project_info = self.project_info_factory.create_project_info(\n                cast(\"ProjectOptions\", options)\n            )\n        except ProjectError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        try:\n            d_index = self.get_doxygen_index(project_info)\n        except MTimeError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        matches: list[filter.FinderMatch] = list(\n            filter.compound_finder_filter(name, self.kind, d_index)\n        )\n\n        if len(matches) == 0:\n            warning = self.create_warning(project_info, name=name, kind=self.kind)\n            return warning.warn('doxygen{kind}: Cannot find class \"{name}\" {tail}')\n\n        target_handler = create_target_handler(options, self.env)\n        filter_ = filter.create_class_filter(self.app, name, options)\n\n        mask_factory = NullMaskFactory()\n        return self.render(\n            matches[0], project_info, filter_, target_handler, mask_factory, self.directive_args\n        )\n\n\nclass DoxygenClassDirective(_DoxygenClassLikeDirective):\n    kind = \"class\"\n\n\nclass DoxygenStructDirective(_DoxygenClassLikeDirective):\n    kind = \"struct\"\n\n\nclass DoxygenInterfaceDirective(_DoxygenClassLikeDirective):\n    kind = \"interface\"\n"
  },
  {
    "path": "breathe/directives/content_block.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, cast\n\nfrom docutils.parsers.rst.directives import flag, unchanged_required\n\nfrom breathe import parser\nfrom breathe.directives import BaseDirective\nfrom breathe.file_state_cache import MTimeError\nfrom breathe.project import ProjectError\nfrom breathe.renderer import RenderContext, filter\nfrom breathe.renderer.mask import NullMaskFactory\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    import sys\n    from typing import ClassVar, Literal\n\n    if sys.version_info >= (3, 11):\n        from typing import NotRequired, TypedDict\n    else:\n        from typing_extensions import NotRequired, TypedDict\n\n    from docutils.nodes import Node\n    from sphinx.application import Sphinx\n\n    from breathe.finder.factory import FinderRoot\n    from breathe.project import ProjectOptions\n\n    DoxContentBlockOptions = TypedDict(\n        \"DoxContentBlockOptions\",\n        {\n            \"path\": str,\n            \"project\": str,\n            \"content-only\": NotRequired[None],\n            \"members\": NotRequired[str],\n            \"protected-members\": NotRequired[None],\n            \"private-members\": NotRequired[None],\n            \"undoc-members\": NotRequired[None],\n            \"show\": str,\n            \"outline\": NotRequired[None],\n            \"no-link\": NotRequired[None],\n            \"desc-only\": NotRequired[None],\n            \"sort\": NotRequired[None],\n        },\n    )\nelse:\n    DoxContentBlockOptions = None\n    ProjectOptions = None\n    FinderRoot = None\n\n\ndef create_render_filter(\n    app: Sphinx, kind: Literal[\"group\", \"page\", \"namespace\"], options: DoxContentBlockOptions\n) -> filter.DoxFilter:\n    \"\"\"Render filter for group & namespace blocks\"\"\"\n\n    filter_options = filter.set_defaults(app, options)\n\n    if \"desc-only\" in filter_options:\n        return filter.create_description_filter(True, parser.Node_compounddefType)\n\n    cm_filter = filter.create_class_member_filter(filter_options)\n    ic_filter = filter.create_innerclass_filter(filter_options)\n    o_filter = filter.create_outline_filter(filter_options)\n\n    def filter_(nstack: filter.NodeStack) -> bool:\n        grandparent = nstack.ancestor(2)\n        return (\n            (\n                cm_filter(nstack)\n                or (\n                    isinstance(grandparent, parser.Node_compounddefType)\n                    and grandparent.kind not in filter.CLASS_LIKE_COMPOUNDDEF\n                    and isinstance(nstack.node, parser.Node_memberdefType)\n                )\n            )\n            and ic_filter(nstack)\n            and o_filter(nstack)\n        )\n\n    return filter_\n\n\ndef create_content_filter(kind: Literal[\"group\", \"page\", \"namespace\"]) -> filter.DoxFilter:\n    \"\"\"Returns a filter which matches the contents of the or namespace but not the group or\n    namepace name or description.\n\n    This allows the groups to be used to structure sections of the documentation rather than to\n    structure and further document groups of documentation\n\n    As a finder/content filter we only need to match exactly what we're interested in.\n    \"\"\"\n\n    def filter_(nstack: filter.NodeStack) -> bool:\n        node = nstack.node\n        parent = nstack.parent\n\n        if isinstance(node, parser.Node_memberdefType):\n            return node.prot == parser.DoxProtectionKind.public\n\n        return (\n            isinstance(node, parser.Node_refType)\n            and isinstance(parent, parser.Node_compounddefType)\n            and parent.kind.value == kind\n            and nstack.tag == \"innerclass\"\n            and node.prot == parser.DoxProtectionKind.public\n        )\n\n    return filter_\n\n\nclass _DoxygenContentBlockDirective(BaseDirective):\n    \"\"\"Base class for namespace and group directives which have very similar behaviours\"\"\"\n\n    kind: ClassVar[Literal[\"group\", \"page\", \"namespace\"]]\n\n    required_arguments = 1\n    optional_arguments = 1\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"content-only\": flag,\n        \"outline\": flag,\n        \"members\": flag,\n        \"protected-members\": flag,\n        \"private-members\": flag,\n        \"undoc-members\": flag,\n        \"no-link\": flag,\n        \"desc-only\": flag,\n        \"sort\": flag,\n    }\n    has_content = False\n\n    def run(self) -> list[Node]:\n        name = self.arguments[0]\n        options = cast(\"DoxContentBlockOptions\", self.options)\n\n        try:\n            project_info = self.project_info_factory.create_project_info(\n                cast(\"ProjectOptions\", options)\n            )\n        except ProjectError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        try:\n            d_index = self.get_doxygen_index(project_info)\n        except MTimeError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        matches: list[filter.FinderMatch] = list(\n            filter.compound_finder_filter(name, self.kind, d_index)\n        )\n\n        # It shouldn't be possible to have too many matches as namespaces & groups in their nature\n        # are merged together if there are multiple declarations, so we only check for no matches\n        if not matches:\n            warning = self.create_warning(project_info, name=name, kind=self.kind)\n            return warning.warn('doxygen{kind}: Cannot find {kind} \"{name}\" {tail}')\n\n        if \"content-only\" in options and self.kind != \"page\":\n            # Unpack the single entry in the matches list\n            (node_stack,) = matches\n\n            filter_ = create_content_filter(self.kind)\n            # Having found the compound node for the namespace or group in the index we want to grab\n            # the contents of it which match the filter\n            contents_finder = self.create_finder_from_root(\n                cast(\"FinderRoot\", node_stack[0].value), project_info\n            )\n\n            contents: list[filter.FinderMatch] = []\n            contents_finder.filter_(filter_, contents)\n\n            # Replaces matches with our new starting points\n            matches = contents\n\n        target_handler = create_target_handler(options, self.env)\n        filter_ = create_render_filter(self.app, self.kind, options)\n\n        node_list: list[Node] = []\n        for node_stack in matches:\n            object_renderer = SphinxRenderer(\n                self.dox_parser.app,\n                project_info,\n                [item.value for item in node_stack],\n                self.state,\n                self.state.document,\n                target_handler,\n                self.dox_parser,\n                filter_,\n            )\n\n            mask_factory = NullMaskFactory()\n            context = RenderContext(node_stack, mask_factory, self.directive_args)\n            value = context.node_stack[0].value\n            assert isinstance(value, parser.Node)\n            node_list.extend(object_renderer.render(value, context))\n\n        return node_list\n\n\nclass DoxygenNamespaceDirective(_DoxygenContentBlockDirective):\n    kind = \"namespace\"\n\n\nclass DoxygenGroupDirective(_DoxygenContentBlockDirective):\n    kind = \"group\"\n    option_spec = _DoxygenContentBlockDirective.option_spec.copy()\n    option_spec.update({\n        \"inner\": flag,\n        \"no-title\": flag,\n    })\n\n\nclass DoxygenPageDirective(_DoxygenContentBlockDirective):\n    kind = \"page\"\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"content-only\": flag,\n        \"no-title\": flag,\n    }\n"
  },
  {
    "path": "breathe/directives/file.py",
    "content": "from __future__ import annotations\n\nimport os.path\nfrom typing import TYPE_CHECKING\n\nfrom docutils.parsers.rst.directives import flag, unchanged_required\n\nfrom breathe import parser, path_handler, project, renderer\nfrom breathe.cpp_util import split_name\nfrom breathe.directives import BaseDirective\nfrom breathe.renderer import filter\nfrom breathe.renderer.mask import NullMaskFactory\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable, Mapping\n    from typing import Any, ClassVar\n\n    from docutils.nodes import Node\n\n\ndef path_matches(location: str, target_file: str) -> bool:\n    if path_handler.includes_directory(target_file):\n        # If the target_file contains directory separators then\n        # match against the same length at the end of the location\n        #\n        location_match = location[-len(target_file) :]\n        return location_match == target_file\n\n    # If there are no separators, match against the whole filename\n    # at the end of the location\n    #\n    # This is to prevent \"Util.cpp\" matching \"PathUtil.cpp\"\n    #\n    location_basename = os.path.basename(location)\n    return location_basename == target_file\n\n\ndef location_matches(location: parser.Node_locationType | None, target_file: str) -> bool:\n    return location is not None and path_matches(location.file, target_file)\n\n\ndef namespace_matches(name: str, node: parser.Node_compounddefType):\n    to_find = \"::\".join(split_name(name)[:-1])\n    return any(to_find == \"\".join(ns) for ns in node.innernamespace) or any(\n        to_find == \"\".join(ns) for ns in node.innerclass\n    )\n\n\ndef create_file_filter(\n    filename: str,\n    options: Mapping[str, Any],\n    *,\n    init_valid_names: Iterable[str] | None = None,\n) -> filter.DoxFilter:\n    valid_names: set[str] = set()\n    if init_valid_names:\n        valid_names.update(init_valid_names)\n\n    outline_filter = filter.create_outline_filter(options)\n\n    def filter_(nstack: filter.NodeStack) -> bool:\n        if not outline_filter(nstack):\n            return False\n\n        node = nstack.node\n        parent = nstack.parent\n        if isinstance(node, parser.Node_compounddefType):\n            if node.kind == parser.DoxCompoundKind.file:\n                # Gather the \"namespaces\" attribute from the\n                # compounddef for the file we're rendering and\n                # store the information in the \"valid_names\" list\n                if location_matches(node.location, filename):\n                    valid_names.update(\"\".join(ns) for ns in node.innernamespace)\n                    valid_names.update(\"\".join(ns) for ns in node.innerclass)\n\n            if node.kind != parser.DoxCompoundKind.namespace:\n                # Ignore compounddefs which are from another file\n                # (normally means classes and structs which are in a\n                # namespace that we have other interests in) but only\n                # check it if the compounddef is not a namespace\n                # itself, as for some reason compounddefs for\n                # namespaces are registered with just a single file\n                # location even if they namespace is spread over\n                # multiple files\n                return location_matches(node.location, filename)\n\n        elif isinstance(node, parser.Node_refType):\n            name = \"\".join(node)\n            if isinstance(parent, parser.Node_compounddefType) and nstack.tag in {\n                \"innerclass\",\n                \"innernamespace\",\n            }:\n                # Take the valid_names and every time we handle an\n                # innerclass or innernamespace, check that its name\n                # was one of those initial valid names so that we\n                # never end up rendering a namespace or class that\n                # wasn't in the initial file. Notably this is\n                # required as the location attribute for the\n                # namespace in the xml is unreliable.\n                if name not in valid_names:\n                    return False\n\n                # Ignore innerclasses and innernamespaces that are inside a\n                # namespace that is going to be rendered as they will be\n                # rendered with that namespace and we don't want them twice\n                if namespace_matches(name, parent):\n                    return False\n\n        elif isinstance(node, parser.Node_memberdefType):\n            # Ignore memberdefs from files which are different to\n            # the one we're rendering. This happens when we have to\n            # cross into a namespace xml file which has entries\n            # from multiple files in it\n            return path_matches(node.location.file, filename)\n\n        return True\n\n    return filter_\n\n\ndef file_finder_filter(\n    filename: str,\n    d_parser: parser.DoxygenParser,\n    project_info: project.ProjectInfo,\n    index: parser.DoxygenIndex,\n    matches: list[filter.FinderMatch],\n) -> None:\n    for c in index.file_compounds:\n        if not path_matches(c.name, filename):\n            continue\n        for cd in d_parser.parse_compound(c.refid, project_info).root.compounddef:\n            if cd.kind != parser.DoxCompoundKind.file:\n                continue\n            matches.append([renderer.TaggedNode(None, cd)])\n\n\nclass _BaseFileDirective(BaseDirective):\n    \"\"\"Base class handle the main work when given the appropriate file and project info to work\n    from.\n    \"\"\"\n\n    directive_name: ClassVar[str]\n\n    # We use inheritance here rather than a separate object and composition, because so much\n    # information is present in the Directive class from the docutils framework that we'd have to\n    # pass way too much stuff to a helper object to be reasonable.\n\n    def handle_contents(self, file_: str, project_info: project.ProjectInfo) -> list[Node]:\n        d_index = self.get_doxygen_index(project_info)\n        matches: list[filter.FinderMatch] = []\n        file_finder_filter(file_, self.dox_parser, project_info, d_index, matches)\n\n        if len(matches) > 1:\n            warning = self.create_warning(None, file=file_, directivename=self.directive_name)\n            return warning.warn('{directivename}: Found multiple matches for file \"{file} {tail}')\n        elif not matches:\n            warning = self.create_warning(None, file=file_, directivename=self.directive_name)\n            return warning.warn('{directivename}: Cannot find file \"{file} {tail}')\n\n        target_handler = create_target_handler(self.options, self.env)\n        filter_ = create_file_filter(file_, self.options)\n\n        node_list: list[Node] = []\n        for node_stack in matches:\n            object_renderer = SphinxRenderer(\n                self.dox_parser.app,\n                project_info,\n                [tv.value for tv in node_stack],\n                self.state,\n                self.state.document,\n                target_handler,\n                self.dox_parser,\n                filter_,\n            )\n\n            mask_factory = NullMaskFactory()\n            context = renderer.RenderContext(node_stack, mask_factory, self.directive_args)\n            value = node_stack[0].value\n            assert isinstance(value, parser.Node)\n            node_list.extend(object_renderer.render(value, context))\n\n        return node_list\n\n\nclass DoxygenFileDirective(_BaseFileDirective):\n    directive_name = \"doxygenfile\"\n\n    required_arguments = 0\n    optional_arguments = 3\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n        \"allow-dot-graphs\": flag,\n        \"sections\": unchanged_required,\n    }\n    has_content = False\n\n    def run(self):\n        \"\"\"Get the file from the argument and the project info from the factory.\"\"\"\n\n        file_ = self.arguments[0]\n        try:\n            project_info = self.project_info_factory.create_project_info(self.options)\n        except project.ProjectError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"doxygenfile: %s\" % e)\n\n        return self.handle_contents(file_, project_info)\n\n\nclass AutoDoxygenFileDirective(_BaseFileDirective):\n    directive_name = \"autodoxygenfile\"\n\n    required_arguments = 1\n    option_spec = {\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n        \"allow-dot-graphs\": flag,\n        \"sections\": unchanged_required,\n    }\n    has_content = False\n\n    def run(self):\n        \"\"\"Get the file from the argument and extract the associated project info for the named\n        project given that it is an auto-project.\n        \"\"\"\n\n        file_ = self.arguments[0]\n        try:\n            project_info = self.project_info_factory.retrieve_project_info_for_auto(self.options)\n        except project.ProjectError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"autodoxygenfile: %s\" % e)\n\n        return self.handle_contents(file_, project_info)\n"
  },
  {
    "path": "breathe/directives/function.py",
    "content": "from __future__ import annotations\n\nimport re\nfrom typing import TYPE_CHECKING, cast\n\nfrom docutils import nodes\nfrom docutils.parsers.rst.directives import flag, unchanged_required\nfrom sphinx.domains import cpp\n\nfrom breathe import parser\nfrom breathe.directives import BaseDirective\nfrom breathe.exception import BreatheError\nfrom breathe.file_state_cache import MTimeError\nfrom breathe.project import ProjectError\nfrom breathe.renderer import RenderContext, filter, mask\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer, WithContext\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    import sys\n    from types import ModuleType\n\n    if sys.version_info >= (3, 11):\n        from typing import NotRequired, TypedDict\n    else:\n        from typing_extensions import NotRequired, TypedDict\n\n    from docutils.nodes import Node\n    from sphinx.application import Sphinx\n\n    from breathe import project\n    from breathe.project import ProjectOptions\n    from breathe.renderer import TaggedNode\n\n    cppast: ModuleType\n\n    DoxFunctionOptions = TypedDict(\n        \"DoxFunctionOptions\",\n        {\"path\": str, \"project\": str, \"outline\": NotRequired[None], \"no-link\": NotRequired[None]},\n    )\nelse:\n    DoxFunctionOptions = None\n\ntry:\n    from sphinx.domains.cpp import _ast as cppast\nexcept ImportError:\n    cppast = cpp\n\n\nclass _NoMatchingFunctionError(BreatheError):\n    pass\n\n\nclass _UnableToResolveFunctionError(BreatheError):\n    def __init__(self, signatures: list[str]) -> None:\n        self.signatures = signatures\n\n\ndef function_and_all_friend_finder_filter(\n    app: Sphinx,\n    namespace: str,\n    name: str,\n    d_parser: parser.DoxygenParser,\n    project_info: project.ProjectInfo,\n    index: parser.DoxygenIndex,\n    matches: list[filter.FinderMatch],\n) -> None:\n    for f_match in filter.member_finder_filter(\n        app,\n        namespace,\n        name,\n        d_parser,\n        project_info,\n        (parser.MemberKind.function, parser.MemberKind.friend),\n        index,\n    ):\n        cd = f_match[2].value\n        assert isinstance(cd, parser.Node_compounddefType)\n        matches.append(f_match)\n\n\nclass DoxygenFunctionDirective(BaseDirective):\n    required_arguments = 1\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n    }\n    has_content = False\n    final_argument_whitespace = True\n\n    def run(self) -> list[Node]:\n        # Extract namespace, function name, and parameters\n        # Regex explanation:\n        # 1. (?:<something>::)?\n        #    Optional namespace prefix, including template arguments if a specialization.\n        #    The <something> is group 1:\n        #    1. [^:(<]+, basically an identifier\n        #       definitely not a scope operator, ::, or template argument list, <\n        #    2. (?:::[^:(<]+)*, (?:<stuff>) for anon match group,\n        #       so a namespace delimiter and then another identifier\n        #    3. ::, another namespace delimiter before the function name\n        # 2. ([^(]+), group 2, the function name, whatever remains after the optional prefix,\n        #    until a (.\n        # 3. (.*), group 3, the parameters.\n        # Note: for template argument lists, the spacing is important for the Doxygen lookup.\n        # TODO: we should really do this parsing differently, e.g., using the Sphinx C++ domain.\n        # TODO: the Doxygen lookup should not be whitespace sensitive.\n        match = re.match(r\"(?:([^:(<]+(?:::[^:(<]+)*)::)?([^(]+)(.*)\", self.arguments[0])\n        assert match is not None  # TODO: this is probably not appropriate, for now it fixes typing\n        namespace = (match.group(1) or \"\").strip()\n        function_name = match.group(2).strip()\n        argsStr = match.group(3)\n\n        options = cast(\"DoxFunctionOptions\", self.options)\n\n        try:\n            project_info = self.project_info_factory.create_project_info(\n                cast(\"ProjectOptions\", options)\n            )\n        except ProjectError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"doxygenfunction: %s\" % e)\n\n        try:\n            d_index = self.get_doxygen_index(project_info)\n        except MTimeError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"doxygenfunction: %s\" % e)\n\n        # Extract arguments from the function name.\n        try:\n            args = self._parse_args(argsStr)\n        except cpp.DefinitionError as e:\n            return self.create_warning(\n                project_info,\n                namespace=\"%s::\" % namespace if namespace else \"\",\n                function=function_name,\n                args=argsStr,\n                cpperror=str(e),\n            ).warn(\n                \"doxygenfunction: Unable to resolve function \"\n                '\"{namespace}{function}\" with arguments \"{args}\".\\n'\n                \"Could not parse arguments. Parsing error is\\n{cpperror}\"\n            )\n\n        matchesAll: list[filter.FinderMatch] = []\n        function_and_all_friend_finder_filter(\n            self.app, namespace, function_name, self.dox_parser, project_info, d_index, matchesAll\n        )\n\n        matches: list[filter.FinderMatch] = []\n        for m in matchesAll:\n            # only take functions and friend functions\n            # ignore friend classes\n            node = m[0].value\n            assert isinstance(node, parser.Node_memberdefType)\n            if node.kind == \"friend\" and not node.argsstring:\n                continue\n            matches.append(m)\n\n        # Create it ahead of time as it is cheap and it is ugly to declare it for both exception\n        # clauses below\n        warning = self.create_warning(\n            project_info,\n            namespace=\"%s::\" % namespace if namespace else \"\",\n            function=function_name,\n            args=str(args),\n        )\n\n        try:\n            node_stack = self._resolve_function(matches, args, project_info)\n        except _NoMatchingFunctionError:\n            return warning.warn(\n                'doxygenfunction: Cannot find function \"{namespace}{function}\" {tail}'\n            )\n        except _UnableToResolveFunctionError as error:\n            message = (\n                \"doxygenfunction: Unable to resolve function \"\n                '\"{namespace}{function}\" with arguments {args} {tail}.\\n'\n                \"Potential matches:\\n\"\n            )\n\n            text = \"\"\n            for i, entry in enumerate(sorted(error.signatures)):\n                text += \"- %s\\n\" % entry\n            block = nodes.literal_block(\"\", \"\", nodes.Text(text))\n            formatted_message = warning.format(message)\n            warning_nodes = [nodes.paragraph(\"\", \"\", nodes.Text(formatted_message)), block]\n            result = warning.warn(message, rendered_nodes=warning_nodes, unformatted_suffix=text)\n            return result\n        except cpp.DefinitionError as error:\n            warning.context[\"cpperror\"] = str(error)\n            return warning.warn(\n                \"doxygenfunction: Unable to resolve function \"\n                '\"{namespace}{function}\" with arguments \"{args}\".\\n'\n                \"Candidate function could not be parsed. Parsing error is\\n{cpperror}\"\n            )\n\n        target_handler = create_target_handler(options, self.env)\n        filter_ = filter.create_outline_filter(options)\n\n        return self.render(\n            node_stack,\n            project_info,\n            filter_,\n            target_handler,\n            mask.NullMaskFactory(),\n            self.directive_args,\n        )\n\n    def _parse_args(self, function_description: str) -> cppast.ASTParametersQualifiers | None:  # type: ignore[name-defined]\n        # Note: the caller must catch cpp.DefinitionError\n        if function_description == \"\":\n            return None\n\n        parser = cpp.DefinitionParser(\n            function_description, location=self.get_source_info(), config=self.config\n        )\n        paramQual = parser._parse_parameters_and_qualifiers(\"function\")\n        # strip everything that doesn't contribute to overloading\n\n        def stripParamQual(paramQual):\n            paramQual.exceptionSpec = None\n            paramQual.final = None\n            paramQual.override = None\n            # TODO: strip attrs when Doxygen handles them\n            paramQual.initializer = None\n            paramQual.trailingReturn = None\n            for p in paramQual.args:\n                if p.arg is None:\n                    assert p.ellipsis\n                    continue\n                p.arg.init = None\n                declarator = p.arg.type.decl\n\n                def stripDeclarator(declarator):\n                    if hasattr(declarator, \"next\"):\n                        stripDeclarator(declarator.next)\n                        if isinstance(declarator, cppast.ASTDeclaratorParen):\n                            assert hasattr(declarator, \"inner\")\n                            stripDeclarator(declarator.inner)\n                    else:\n                        assert isinstance(declarator, cppast.ASTDeclaratorNameParamQual)\n                        assert hasattr(declarator, \"declId\")\n                        declarator.declId = None\n                        if declarator.paramQual is not None:\n                            stripParamQual(declarator.paramQual)\n\n                stripDeclarator(declarator)\n\n        stripParamQual(paramQual)\n        return paramQual\n\n    def _create_function_signature(\n        self,\n        node_stack: list[TaggedNode],\n        project_info,\n        filter_,\n        target_handler,\n        mask_factory,\n        directive_args,\n    ) -> str:\n        \"\"\"Standard render process used by subclasses.\"\"\"\n\n        object_renderer = SphinxRenderer(\n            self.dox_parser.app,\n            project_info,\n            [tn.value for tn in node_stack],\n            self.state,\n            self.state.document,\n            target_handler,\n            self.dox_parser,\n            filter_,\n        )\n\n        context = RenderContext(node_stack, mask_factory, directive_args)\n        node = node_stack[0].value\n        with WithContext(object_renderer, context):\n            assert isinstance(node, parser.Node_memberdefType)\n            # this part should be kept in sync with visit_function in sphinxrenderer\n            name = node.name\n            # assume we are only doing this for C++ declarations\n            declaration = \" \".join([\n                object_renderer.create_template_prefix(node),\n                \"\".join(n.astext() for n in object_renderer.render(node.type)),\n                name,\n                node.argsstring or \"\",\n            ])\n        cpp_parser = cpp.DefinitionParser(\n            declaration, location=self.get_source_info(), config=self.config\n        )\n        ast = cpp_parser.parse_declaration(\"function\", \"function\")\n        return str(ast)\n\n    def _resolve_function(\n        self,\n        matches: list[filter.FinderMatch],\n        args: cppast.ASTParametersQualifiers | None,  # type: ignore[name-defined]\n        project_info: project.ProjectInfo,\n    ):\n        if not matches:\n            raise _NoMatchingFunctionError()\n\n        res = []\n        candSignatures = []\n        for entry in matches:\n            text_options = {\"no-link\": \"\", \"outline\": \"\"}\n\n            # Render the matches to docutils nodes\n            target_handler = create_target_handler({\"no-link\": \"\"}, self.env)\n            filter_ = filter.create_outline_filter(text_options)\n            mask_factory = mask.MaskFactory({parser.Node_paramType: mask.no_parameter_names})\n\n            # Override the directive args for this render\n            directive_args = self.directive_args[:]\n            directive_args[2] = text_options\n\n            signature = self._create_function_signature(\n                entry, project_info, filter_, target_handler, mask_factory, directive_args\n            )\n            candSignatures.append(signature)\n\n            if args is not None:\n                match = re.match(r\"([^(]*)(.*)\", signature)\n                assert match\n                _match_args = match.group(2)\n\n                # Parse the text to find the arguments\n                # This one should succeed as it came from _create_function_signature\n                match_args = self._parse_args(_match_args)\n\n                # Match them against the arg spec\n                if args != match_args:\n                    continue\n\n            res.append((entry, signature))\n\n        if len(res) == 1 or (len(res) > 1 and all(x[1] == res[0][1] for x in res)):\n            return res[0][0]\n        else:\n            raise _UnableToResolveFunctionError(candSignatures)\n"
  },
  {
    "path": "breathe/directives/index.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom docutils.parsers.rst.directives import flag, unchanged_required\n\nfrom breathe import parser\nfrom breathe.directives import BaseDirective\nfrom breathe.project import ProjectError\nfrom breathe.renderer import RenderContext, TaggedNode, filter, format_parser_error\nfrom breathe.renderer.mask import NullMaskFactory\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    from collections.abc import Mapping\n    from typing import Any\n\n    from docutils.nodes import Node\n\n\nclass RootDataObject:\n    pass\n\n\ndef create_index_filter(options: Mapping[str, Any]) -> filter.DoxFilter:\n    outline_filter = filter.create_outline_filter(options)\n\n    def filter_(nstack: filter.NodeStack) -> bool:\n        if not outline_filter(nstack):\n            return False\n\n        node = nstack.node\n        parent = nstack.parent\n        return not (\n            isinstance(parent, parser.Node_compounddefType)\n            and (\n                (\n                    isinstance(node, parser.Node_refType)\n                    and nstack.tag in (\"innerclass\", \"innernamespace\")\n                )\n                or (\n                    parent.kind == parser.DoxCompoundKind.group\n                    and isinstance(node, parser.Node_sectiondefType)\n                    and node.kind == parser.DoxSectionKind.func\n                )\n            )\n        )\n\n    return filter_\n\n\nclass _BaseIndexDirective(BaseDirective):\n    \"\"\"Base class handle the main work when given the appropriate project info to work from.\"\"\"\n\n    # We use inheritance here rather than a separate object and composition, because so much\n    # information is present in the Directive class from the docutils framework that we'd have to\n    # pass way too much stuff to a helper object to be reasonable.\n\n    def handle_contents(self, project_info) -> list[Node]:\n        try:\n            d_index = self.get_doxygen_index(project_info)\n        except parser.ParserError as e:\n            return format_parser_error(\n                self.name, e.message, e.filename, self.state, self.lineno, True\n            )\n        except parser.FileIOError as e:\n            return format_parser_error(self.name, e.error, e.filename, self.state, self.lineno)\n\n        target_handler = create_target_handler(self.options, self.env)\n        filter_ = create_index_filter(self.options)\n\n        object_renderer = SphinxRenderer(\n            self.dox_parser.app,\n            project_info,\n            [d_index.root],\n            self.state,\n            self.state.document,\n            target_handler,\n            self.dox_parser,\n            filter_,\n        )\n\n        mask_factory = NullMaskFactory()\n        context = RenderContext(\n            [TaggedNode(None, d_index.root), TaggedNode(None, RootDataObject())],\n            mask_factory,\n            self.directive_args,\n        )\n\n        value = context.node_stack[0].value\n        assert isinstance(value, parser.Node)\n        try:\n            node_list = object_renderer.render(value, context)\n        except parser.ParserError as e:\n            return format_parser_error(\n                self.name, e.message, e.filename, self.state, self.lineno, True\n            )\n        except parser.FileIOError as e:\n            return format_parser_error(self.name, e.error, e.filename, self.state, self.lineno)\n\n        return node_list\n\n\nclass DoxygenIndexDirective(_BaseIndexDirective):\n    required_arguments = 0\n    optional_arguments = 2\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n        \"allow-dot-graphs\": flag,\n    }\n    has_content = False\n\n    def run(self):\n        \"\"\"Extract the project info and pass it to the helper method\"\"\"\n\n        try:\n            project_info = self.project_info_factory.create_project_info(self.options)\n        except ProjectError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"doxygenindex: %s\" % e)\n\n        return self.handle_contents(project_info)\n\n\nclass AutoDoxygenIndexDirective(_BaseIndexDirective):\n    required_arguments = 0\n    final_argument_whitespace = True\n    option_spec = {\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n        \"allow-dot-graphs\": flag,\n    }\n    has_content = False\n\n    def run(self) -> list[Node]:\n        \"\"\"Extract the project info from the auto project info store and pass it to the helper\n        method.\n        \"\"\"\n\n        try:\n            project_info = self.project_info_factory.retrieve_project_info_for_auto(self.options)\n        except ProjectError as e:\n            warning = self.create_warning(None)\n            return warning.warn(\"autodoxygenindex: %s\" % e)\n\n        return self.handle_contents(project_info)\n"
  },
  {
    "path": "breathe/directives/item.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, cast\n\nfrom docutils.parsers.rst.directives import flag, unchanged_required\n\nfrom breathe import parser\nfrom breathe.directives import BaseDirective\nfrom breathe.file_state_cache import MTimeError\nfrom breathe.project import ProjectError\nfrom breathe.renderer import TaggedNode, filter\nfrom breathe.renderer.mask import NullMaskFactory\nfrom breathe.renderer.target import create_target_handler\n\nif TYPE_CHECKING:\n    import sys\n    from typing import ClassVar\n\n    from docutils.nodes import Node\n\n    if sys.version_info >= (3, 11):\n        from typing import NotRequired, TypedDict\n    else:\n        from typing_extensions import NotRequired, TypedDict\n\n    from breathe.project import ProjectInfo, ProjectOptions\n\n    DoxBaseItemOptions = TypedDict(\n        \"DoxBaseItemOptions\",\n        {\"path\": str, \"project\": str, \"outline\": NotRequired[None], \"no-link\": NotRequired[None]},\n    )\nelse:\n    DoxBaseItemOptions = None\n\n\ndef enumvalue_finder_filter(\n    name: str,\n    d_parser: parser.DoxygenParser,\n    project_info: ProjectInfo,\n    index: parser.DoxygenIndex,\n) -> filter.FinderMatchItr:\n    \"\"\"Looks for an enumvalue with the specified name.\"\"\"\n\n    for m, c in index.members[name]:\n        if m.kind != parser.MemberKind.enumvalue:\n            continue\n\n        dc = d_parser.parse_compound(c.refid, project_info)\n        ev, mdef, sdef, cdef = dc.enumvalue_by_id[m.refid]\n\n        TN = TaggedNode\n        yield [\n            TN(\"enumvalue\", ev),\n            TN(\"memberdef\", mdef),\n            TN(\"sectiondef\", sdef),\n            TN(\"compounddef\", cdef),\n            TN(\"doxygen\", dc.root),\n            TN(\"compound\", c),\n            TN(\"doxygenindex\", index.root),\n        ]\n\n\nclass _DoxygenBaseItemDirective(BaseDirective):\n    kind: ClassVar[str]\n\n    required_arguments = 1\n    optional_arguments = 1\n    option_spec = {\n        \"path\": unchanged_required,\n        \"project\": unchanged_required,\n        \"outline\": flag,\n        \"no-link\": flag,\n    }\n    has_content = False\n\n    def finder_filter(\n        self,\n        namespace: str,\n        name: str,\n        project_info: ProjectInfo,\n        index: parser.DoxygenIndex,\n        matches: list[filter.FinderMatch],\n    ) -> None:\n        \"\"\"A filter to find the node corresponding to this item.\"\"\"\n\n        matches.extend(\n            filter.member_finder_filter(\n                self.app, namespace, name, self.dox_parser, project_info, self.kind, index\n            )\n        )\n\n    def run(self) -> list[Node]:\n        options = cast(\"DoxBaseItemOptions\", self.options)\n\n        namespace, _, name = self.arguments[0].rpartition(\"::\")\n\n        try:\n            project_info = self.project_info_factory.create_project_info(\n                cast(\"ProjectOptions\", options)\n            )\n        except ProjectError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        try:\n            d_index = self.get_doxygen_index(project_info)\n        except MTimeError as e:\n            warning = self.create_warning(None, kind=self.kind)\n            return warning.warn(\"doxygen{kind}: %s\" % e)\n\n        matches: list[filter.FinderMatch] = []\n        self.finder_filter(namespace, name, project_info, d_index, matches)\n\n        if len(matches) == 0:\n            display_name = \"%s::%s\" % (namespace, name) if namespace else name\n            warning = self.create_warning(project_info, kind=self.kind, display_name=display_name)\n            return warning.warn('doxygen{kind}: Cannot find {kind} \"{display_name}\" {tail}')\n\n        target_handler = create_target_handler(options, self.env)\n        filter_ = filter.create_outline_filter(options)\n\n        node_stack = matches[0]\n        mask_factory = NullMaskFactory()\n        return self.render(\n            node_stack, project_info, filter_, target_handler, mask_factory, self.directive_args\n        )\n\n\nclass DoxygenVariableDirective(_DoxygenBaseItemDirective):\n    kind = \"variable\"\n\n\nclass DoxygenDefineDirective(_DoxygenBaseItemDirective):\n    kind = \"define\"\n\n\nclass DoxygenConceptDirective(_DoxygenBaseItemDirective):\n    kind = \"concept\"\n\n    def finder_filter(\n        self,\n        namespace: str,\n        name: str,\n        project_info: ProjectInfo,\n        index: parser.DoxygenIndex,\n        matches: list[filter.FinderMatch],\n    ) -> None:\n        # Unions are stored in the xml file with their fully namespaced name\n        # We're using C++ namespaces here, it might be best to make this file\n        # type dependent\n        #\n        xml_name = \"%s::%s\" % (namespace, name) if namespace else name\n        matches.extend(filter.compound_finder_filter(xml_name, \"concept\", index))\n\n\nclass DoxygenEnumDirective(_DoxygenBaseItemDirective):\n    kind = \"enum\"\n\n\nclass DoxygenEnumValueDirective(_DoxygenBaseItemDirective):\n    kind = \"enumvalue\"\n\n    def finder_filter(\n        self,\n        namespace: str,\n        name: str,\n        project_info: ProjectInfo,\n        index: parser.DoxygenIndex,\n        matches: list[filter.FinderMatch],\n    ) -> None:\n        for m, c in index.members[name]:\n            if m.kind != parser.MemberKind.enumvalue:\n                continue\n\n            dc = self.dox_parser.parse_compound(c.refid, project_info)\n            ev, mdef, sdef, cdef = dc.enumvalue_by_id[m.refid]\n\n            TN = TaggedNode\n            matches.append([\n                TN(\"enumvalue\", ev),\n                TN(\"memberdef\", mdef),\n                TN(\"sectiondef\", sdef),\n                TN(\"compounddef\", cdef),\n                TN(\"doxygen\", dc.root),\n                TN(\"compound\", c),\n                TN(\"doxygenindex\", index.root),\n            ])\n\n\nclass DoxygenTypedefDirective(_DoxygenBaseItemDirective):\n    kind = \"typedef\"\n\n\nclass DoxygenUnionDirective(_DoxygenBaseItemDirective):\n    kind = \"union\"\n\n    def finder_filter(\n        self,\n        namespace: str,\n        name: str,\n        project_info: ProjectInfo,\n        index: parser.DoxygenIndex,\n        matches: list[filter.FinderMatch],\n    ) -> None:\n        # Unions are stored in the xml file with their fully namespaced name\n        # We're using C++ namespaces here, it might be best to make this file\n        # type dependent\n        #\n        xml_name = \"%s::%s\" % (namespace, name) if namespace else name\n        matches.extend(filter.compound_finder_filter(xml_name, \"union\", index))\n"
  },
  {
    "path": "breathe/directives/setup.py",
    "content": "from __future__ import annotations\n\nimport subprocess\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nfrom breathe.directives.class_like import (\n    DoxygenClassDirective,\n    DoxygenInterfaceDirective,\n    DoxygenStructDirective,\n)\nfrom breathe.directives.content_block import (\n    DoxygenGroupDirective,\n    DoxygenNamespaceDirective,\n    DoxygenPageDirective,\n)\nfrom breathe.directives.file import AutoDoxygenFileDirective, DoxygenFileDirective\nfrom breathe.directives.function import DoxygenFunctionDirective\nfrom breathe.directives.index import AutoDoxygenIndexDirective, DoxygenIndexDirective\nfrom breathe.directives.item import (\n    DoxygenConceptDirective,\n    DoxygenDefineDirective,\n    DoxygenEnumDirective,\n    DoxygenEnumValueDirective,\n    DoxygenTypedefDirective,\n    DoxygenUnionDirective,\n    DoxygenVariableDirective,\n)\nfrom breathe.parser import DoxygenParser\nfrom breathe.process import AutoDoxygenProcessHandle\nfrom breathe.project import ProjectInfoFactory\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n\n\ndef setup(app: Sphinx) -> None:\n    directives = {\n        \"doxygenindex\": DoxygenIndexDirective,\n        \"autodoxygenindex\": AutoDoxygenIndexDirective,\n        \"doxygenfunction\": DoxygenFunctionDirective,\n        \"doxygenstruct\": DoxygenStructDirective,\n        \"doxygenclass\": DoxygenClassDirective,\n        \"doxygeninterface\": DoxygenInterfaceDirective,\n        \"doxygenvariable\": DoxygenVariableDirective,\n        \"doxygendefine\": DoxygenDefineDirective,\n        \"doxygenconcept\": DoxygenConceptDirective,\n        \"doxygenenum\": DoxygenEnumDirective,\n        \"doxygenenumvalue\": DoxygenEnumValueDirective,\n        \"doxygentypedef\": DoxygenTypedefDirective,\n        \"doxygenunion\": DoxygenUnionDirective,\n        \"doxygennamespace\": DoxygenNamespaceDirective,\n        \"doxygengroup\": DoxygenGroupDirective,\n        \"doxygenfile\": DoxygenFileDirective,\n        \"autodoxygenfile\": AutoDoxygenFileDirective,\n        \"doxygenpage\": DoxygenPageDirective,\n    }\n\n    # The directives need these global objects, so in order to smuggle\n    # them in, we use env.temp_data. But it is cleared after each document\n    # has been read, we use the source-read event to set them.\n    # note: the parser factory contains a cache of the parsed XML\n    # note: the project_info_factory also contains some caching stuff\n    # TODO: is that actually safe for when reading in parallel?\n    project_info_factory = ProjectInfoFactory(app)\n    dox_parser = DoxygenParser(app)\n\n    def set_temp_data(\n        app: Sphinx, project_info_factory=project_info_factory, parser_factory=dox_parser\n    ):\n        assert app.env is not None\n        app.env.temp_data[\"breathe_project_info_factory\"] = project_info_factory\n        app.env.temp_data[\"breathe_dox_parser\"] = parser_factory\n\n    app.connect(\"source-read\", lambda app, docname, source: set_temp_data(app))\n\n    for name, directive in directives.items():\n        app.add_directive(name, directive)\n\n    app.add_config_value(\"breathe_projects\", {}, \"env\")  # Dict[str, str]\n    app.add_config_value(\"breathe_default_project\", \"\", \"env\")  # str\n    # Provide reasonable defaults for domain_by_extension mapping. Can be overridden by users.\n    app.add_config_value(\n        \"breathe_domain_by_extension\", {\"py\": \"py\", \"cs\": \"cs\"}, \"env\"\n    )  # Dict[str, str]\n    app.add_config_value(\"breathe_domain_by_file_pattern\", {}, \"env\")  # Dict[str, str]\n    app.add_config_value(\"breathe_projects_source\", {}, \"env\")\n    app.add_config_value(\"breathe_build_directory\", \"\", \"env\")\n    app.add_config_value(\"breathe_default_members\", (), \"env\")\n    app.add_config_value(\"breathe_show_define_initializer\", False, \"env\")\n    app.add_config_value(\"breathe_show_enumvalue_initializer\", False, \"env\")\n    app.add_config_value(\"breathe_show_include\", True, \"env\")\n    app.add_config_value(\"breathe_implementation_filename_extensions\", [\".c\", \".cc\", \".cpp\"], \"env\")\n    app.add_config_value(\"breathe_doxygen_config_options\", {}, \"env\")\n    app.add_config_value(\"breathe_doxygen_aliases\", {}, \"env\")\n    app.add_config_value(\"breathe_use_project_refids\", False, \"env\")\n    app.add_config_value(\"breathe_order_parameters_first\", False, \"env\")\n    app.add_config_value(\"breathe_separate_member_pages\", False, \"env\")\n\n    breathe_css = \"breathe.css\"\n    if Path(app.confdir, \"_static\", breathe_css).exists():\n        app.add_css_file(breathe_css)\n\n    def write_file(directory, filename, content):\n        # Ensure that the directory exists\n        directory = Path(directory)\n        directory.mkdir(parents=True, exist_ok=True)\n\n        # Write the file with the provided contents\n        (directory / filename).write_text(content, encoding=\"utf-8\")\n\n    doxygen_handle = AutoDoxygenProcessHandle(\n        subprocess.check_call, write_file, project_info_factory\n    )\n\n    def doxygen_hook(app: Sphinx):\n        doxygen_handle.generate_xml(\n            app.config.breathe_projects_source,\n            app.config.breathe_doxygen_config_options,\n            app.config.breathe_doxygen_aliases,\n        )\n\n    app.connect(\"builder-inited\", doxygen_hook)\n"
  },
  {
    "path": "breathe/exception.py",
    "content": "from __future__ import annotations\n\n\nclass BreatheError(Exception):\n    pass\n"
  },
  {
    "path": "breathe/file_state_cache.py",
    "content": "from __future__ import annotations\n\nimport os\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n    from sphinx.environment import BuildEnvironment\n\n\"\"\"\nStore the modified time of the various doxygen xml files against the\nreStructuredText file that they are referenced from so that we know which\nreStructuredText files to rebuild if the doxygen xml is modified.\n\nWe store the information in the environment object as 'breathe_file_state'\nso that it is pickled down and stored between builds as Sphinx is designed to do.\n\n(mypy doesn't like dynamically added attributes, hence all references to it are ignored)\n\"\"\"\n\n\nclass MTimeError(Exception):\n    pass\n\n\ndef _getmtime(filename: str):\n    try:\n        return os.path.getmtime(filename)\n    except OSError:\n        raise MTimeError(\"Cannot find file: %s\" % os.path.realpath(filename))\n\n\ndef update(app: Sphinx, source_file: str | os.PathLike[str]) -> None:\n    if not hasattr(app.env, \"breathe_file_state\"):\n        app.env.breathe_file_state = {}  # type: ignore[attr-defined]\n\n    norm_source_file = Path(source_file).resolve().as_posix()\n    new_mtime = _getmtime(norm_source_file)\n    _mtime, docnames = app.env.breathe_file_state.setdefault(  # type: ignore[attr-defined]\n        norm_source_file, (new_mtime, set())\n    )\n\n    assert app.env is not None\n    docnames.add(app.env.docname)\n\n    app.env.breathe_file_state[norm_source_file] = (new_mtime, docnames)  # type: ignore[attr-defined]\n\n\ndef _get_outdated(\n    app: Sphinx, env: BuildEnvironment, added: set[str], changed: set[str], removed: set[str]\n) -> list[str]:\n    if not hasattr(app.env, \"breathe_file_state\"):\n        return []\n\n    stale = []\n    for filename, info in app.env.breathe_file_state.items():\n        old_mtime, docnames = info\n        if _getmtime(filename) > old_mtime:\n            stale.extend(docnames)\n    return list(set(stale).difference(removed))\n\n\ndef _purge_doc(app: Sphinx, env: BuildEnvironment, docname: str) -> None:\n    if not hasattr(app.env, \"breathe_file_state\"):\n        return\n\n    toremove = []\n    for filename, info in app.env.breathe_file_state.items():\n        _, docnames = info\n        docnames.discard(docname)\n        if not docnames:\n            toremove.append(filename)\n\n    for filename in toremove:\n        del app.env.breathe_file_state[filename]\n\n\ndef setup(app: Sphinx):\n    app.connect(\"env-get-outdated\", _get_outdated)\n    app.connect(\"env-purge-doc\", _purge_doc)\n"
  },
  {
    "path": "breathe/filetypes.py",
    "content": "\"\"\"\nA module to house the methods for resolving a code-blocks language based on filename\n(and extension).\n\"\"\"\n\nfrom __future__ import annotations\n\nimport os.path\n\nfrom pygments.lexers import get_lexer_for_filename\nfrom pygments.util import ClassNotFound\n\n\ndef get_pygments_alias(filename: str) -> str | None:\n    \"Find first pygments alias from filename\"\n    try:\n        lexer_cls = get_lexer_for_filename(filename)\n        return lexer_cls.aliases[0]  # type: ignore[attr-defined]\n    except ClassNotFound:\n        return None\n\n\ndef get_extension(filename: str) -> str:\n    \"\"\"Get extension from filename.\"\"\"\n    # If the filename is just '.ext' then we get ('.ext', '') so we fall back to first part if\n    # the second isn't there\n    (first, second) = os.path.splitext(filename)\n\n    # Doxygen allows users to specify the file extension \".unparsed\" to disable syntax highlighting.\n    # We translate it into the pygments un-highlighted 'text' type\n    return (second or first).lstrip(\".\").replace(\"unparsed\", \"text\")\n"
  },
  {
    "path": "breathe/finder/__init__.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Generic, TypeVar\n\nif TYPE_CHECKING:\n    from breathe import parser\n    from breathe.finder.factory import FinderCreatorMap\n    from breathe.project import ProjectInfo\n    from breathe.renderer import T_data_object, TaggedNode\n    from breathe.renderer.filter import DoxFilter, FinderMatch\nelse:\n    T_data_object = TypeVar(\"T_data_object\", covariant=True)\n\n\nclass ItemFinder(Generic[T_data_object]):\n    def __init__(\n        self,\n        project_info: ProjectInfo,\n        node: TaggedNode[T_data_object],\n        finders: FinderCreatorMap,\n    ):\n        self.node = node\n        self.finders: FinderCreatorMap = finders\n        self.project_info = project_info\n\n    def run_filter(\n        self,\n        filter_: DoxFilter,\n        matches: list[FinderMatch],\n        node_stack: list[TaggedNode],\n        item: parser.NodeOrValue,\n        tag: str | None = None,\n    ) -> None:\n        \"\"\"Adds all nodes which match the filter into the matches list\"\"\"\n\n        item_finder = factory.create_item_finder(self.finders, self.project_info, item, tag)\n        item_finder.filter_(node_stack, filter_, matches)\n\n    def filter_(\n        self, ancestors: list[TaggedNode], filter_: DoxFilter, matches: list[FinderMatch]\n    ) -> None:\n        raise NotImplementedError\n\n\n# ItemFinder needs to be defined before we can import any submodules\nfrom breathe.finder import factory  # noqa: E402\n"
  },
  {
    "path": "breathe/finder/compound.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom breathe import parser\nfrom breathe.finder import ItemFinder\nfrom breathe.renderer import TaggedNode\nfrom breathe.renderer.filter import NodeStack\n\nif TYPE_CHECKING:\n    from breathe.renderer.filter import DoxFilter, FinderMatch\n\n\nclass DoxygenTypeSubItemFinder(ItemFinder[parser.Node_DoxygenType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        \"\"\"Find nodes which match the filter. Doesn't test this node, only its children\"\"\"\n\n        node_stack = [self.node] + ancestors\n        assert len(self.node.value.compounddef) == 1\n        self.run_filter(filter_, matches, node_stack, self.node.value.compounddef[0])\n\n\nclass CompoundDefTypeSubItemFinder(ItemFinder[parser.Node_compounddefType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        \"\"\"Finds nodes which match the filter and continues checks to children\"\"\"\n\n        node_stack = [self.node] + ancestors\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n\n        for sectiondef in self.node.value.sectiondef:\n            self.run_filter(filter_, matches, node_stack, sectiondef)\n\n        for innerclass in self.node.value.innerclass:\n            self.run_filter(filter_, matches, node_stack, innerclass, \"innerclass\")\n\n\nclass SectionDefTypeSubItemFinder(ItemFinder[parser.Node_sectiondefType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        \"\"\"Find nodes which match the filter. Doesn't test this node, only its children\"\"\"\n\n        node_stack = [self.node] + ancestors\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n\n        for memberdef in self.node.value.memberdef:\n            self.run_filter(filter_, matches, node_stack, memberdef)\n\n        for member in self.node.value.member:\n            self.run_filter(filter_, matches, node_stack, member)\n\n\nclass MemberDefTypeSubItemFinder(ItemFinder[parser.Node_memberdefType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        data_object = self.node.value\n        node_stack = [self.node] + ancestors\n\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n\n        if data_object.kind == parser.DoxMemberKind.enum:\n            for value in data_object.enumvalue:\n                value_stack = [TaggedNode(\"enumvalue\", value)] + node_stack\n                if filter_(NodeStack(value_stack)):\n                    matches.append(value_stack)\n\n\nclass RefTypeSubItemFinder(ItemFinder[parser.Node_refType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        node_stack = [self.node] + ancestors\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n"
  },
  {
    "path": "breathe/finder/factory.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom breathe import parser\nfrom breathe.finder import compound as compoundfinder\nfrom breathe.finder import index as indexfinder\nfrom breathe.renderer import TaggedNode\n\nif TYPE_CHECKING:\n    from typing import Callable, Union\n\n    from sphinx.application import Sphinx\n\n    from breathe.finder import ItemFinder\n    from breathe.project import ProjectInfo\n    from breathe.renderer.filter import DoxFilter, FinderMatch\n\n    ItemFinderCreator = Callable[[ProjectInfo, TaggedNode, \"FinderCreatorMap\"], ItemFinder]\n    FinderCreatorMap = dict[type[parser.NodeOrValue], ItemFinderCreator]\n\n    FinderRoot = Union[\n        parser.Node_CompoundType,\n        parser.Node_MemberType,\n        parser.Node_DoxygenType,\n        parser.Node_compounddefType,\n        parser.Node_sectiondefType,\n        parser.Node_memberdefType,\n        parser.Node_refType,\n    ]\n\n\nclass _CreateCompoundTypeSubFinder:\n    def __init__(self, app: Sphinx, dox_parser: parser.DoxygenParser):\n        self.app = app\n        self.dox_parser = dox_parser\n\n    def __call__(self, project_info: ProjectInfo, *args) -> indexfinder.CompoundTypeSubItemFinder:\n        return indexfinder.CompoundTypeSubItemFinder(self.app, self.dox_parser, project_info, *args)\n\n\ndef create_item_finder(\n    finders: dict[type[parser.NodeOrValue], ItemFinderCreator],\n    project_info: ProjectInfo,\n    data_object: parser.NodeOrValue,\n    tag: str | None = None,\n) -> ItemFinder:\n    return finders[type(data_object)](project_info, TaggedNode(tag, data_object), finders)\n\n\nclass Finder:\n    def __init__(\n        self, root: parser.NodeOrValue, project_info: ProjectInfo, finders: FinderCreatorMap\n    ):\n        self._root = root\n        self.project_info = project_info\n        self.finders = finders\n\n    def filter_(self, filter_: DoxFilter, matches: list[FinderMatch]) -> None:\n        \"\"\"Adds all nodes which match the filter into the matches list\"\"\"\n\n        item_finder = create_item_finder(self.finders, self.project_info, self._root)\n        item_finder.filter_([], filter_, matches)\n\n    def root(self):\n        return self._root\n\n\ndef create_finder_from_root(\n    app: Sphinx, dox_parser: parser.DoxygenParser, root: FinderRoot, project_info: ProjectInfo\n) -> Finder:\n    finders: FinderCreatorMap = {\n        parser.Node_CompoundType: _CreateCompoundTypeSubFinder(app, dox_parser),\n        parser.Node_MemberType: indexfinder.MemberTypeSubItemFinder,\n        parser.Node_DoxygenType: compoundfinder.DoxygenTypeSubItemFinder,\n        parser.Node_compounddefType: compoundfinder.CompoundDefTypeSubItemFinder,\n        parser.Node_sectiondefType: compoundfinder.SectionDefTypeSubItemFinder,\n        parser.Node_memberdefType: compoundfinder.MemberDefTypeSubItemFinder,\n        parser.Node_refType: compoundfinder.RefTypeSubItemFinder,\n    }\n\n    return Finder(root, project_info, finders)\n"
  },
  {
    "path": "breathe/finder/index.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom breathe import parser\nfrom breathe.finder import ItemFinder\nfrom breathe.renderer.filter import NodeStack\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n\n    from breathe.renderer import TaggedNode\n    from breathe.renderer.filter import DoxFilter, FinderMatch\n\n\nclass DoxygenTypeSubItemFinder(ItemFinder[parser.Node_DoxygenTypeIndex]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches) -> None:\n        \"\"\"Find nodes which match the filter. Doesn't test this node, only its children\"\"\"\n\n        compounds = self.node.value.compound\n        node_stack = [self.node] + ancestors\n        for compound in compounds:\n            self.run_filter(filter_, matches, node_stack, compound)\n\n\nclass CompoundTypeSubItemFinder(ItemFinder[parser.Node_CompoundType]):\n    def __init__(self, app: Sphinx, dox_parser: parser.DoxygenParser, *args):\n        super().__init__(*args)\n        self.dox_parser = dox_parser\n\n    def filter_(self, ancestors: list[TaggedNode], filter_: DoxFilter, matches) -> None:\n        \"\"\"Finds nodes which match the filter and continues checks to children\n\n        Requires parsing the xml files referenced by the children for which we use the compound\n        parser and continue at the top level of that pretending that this node is the parent of the\n        top level node of the compound file.\n        \"\"\"\n\n        node_stack = [self.node] + ancestors\n\n        # Match against compound object\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n\n        # Descend to member children\n        members = self.node.value.member\n\n        member_matches: list[FinderMatch] = []\n        for member in members:\n            self.run_filter(filter_, member_matches, node_stack, member)\n\n        # If there are members in this compound that match the criteria\n        # then load up the file for this compound and get the member data objects\n        if member_matches:\n            file_data = self.dox_parser.parse_compound(\n                self.node.value.refid, self.project_info\n            ).root\n\n            for member_stack in member_matches:\n                mem = member_stack[0].value\n                assert isinstance(mem, parser.Node_MemberType)\n                refid = mem.refid\n\n                def ref_filter(nstack):\n                    node = nstack.node\n                    return isinstance(node, parser.Node_memberdefType) and node.id == refid\n\n                self.run_filter(ref_filter, matches, node_stack, file_data)\n        else:\n            # Read in the xml file referenced by the compound and descend into that as well\n            file_data = self.dox_parser.parse_compound(\n                self.node.value.refid, self.project_info\n            ).root\n            self.run_filter(filter_, matches, node_stack, file_data)\n\n\nclass MemberTypeSubItemFinder(ItemFinder[parser.Node_memberdefType]):\n    def filter_(self, ancestors, filter_: DoxFilter, matches) -> None:\n        node_stack = [self.node] + ancestors\n\n        # Match against member object\n        if filter_(NodeStack(node_stack)):\n            matches.append(node_stack)\n"
  },
  {
    "path": "breathe/parser.py",
    "content": "# ruff: noqa: F403, F405, PGH003, UP024\n\nfrom __future__ import annotations\n\nimport collections\nimport reprlib\nfrom typing import TYPE_CHECKING, NamedTuple, overload\n\nfrom breathe import file_state_cache, path_handler\nfrom breathe._parser import *\n\nif TYPE_CHECKING:\n    import sys\n    from typing import Union\n\n    from sphinx.application import Sphinx\n\n    from breathe.project import ProjectInfo\n\n    if sys.version_info >= (3, 10):\n        from typing import TypeAlias\n    else:\n        from typing_extensions import TypeAlias\n\n    NodeOrValue: TypeAlias = Union[Node, str, None]\n\n\n@reprlib.recursive_repr()\ndef node_repr(self: Node) -> str:  # pragma: no cover\n    cls = type(self)\n    fields = []\n    if isinstance(self, list):\n        pos = \", \".join(map(repr, self))\n        fields.append(f\"[{pos}]\")\n    fields.extend(f\"{field}={getattr(self, field)!r}\" for field in cls._fields)\n    inner = \", \".join(fields)\n    return f\"{cls.__name__}({inner})\"\n\n\nNode.__repr__ = node_repr  # type: ignore\n\n\ndef description_has_content(node: Node_descriptionType | None) -> bool:\n    if node is None:\n        return False\n    if bool(node.title) or len(node) > 1:\n        return True\n    if not len(node):\n        return False\n    item = node[0]\n    return not isinstance(item, str) or (len(item) > 0 and not item.isspace())\n\n\nclass ParserError(RuntimeError):\n    def __init__(self, message: str, filename: str, lineno: int | None = None):\n        super().__init__(message, lineno, filename)\n\n    @property\n    def message(self) -> str:\n        return self.args[0]\n\n    @property\n    def lineno(self) -> int | None:\n        return self.args[1]\n\n    @property\n    def filename(self) -> str:\n        return self.args[2]\n\n    def __str__(self):\n        if self.lineno is None:\n            return f\"{self.filename}: {self.message}\"\n        return f\"{self.filename}:{self.lineno}: {self.message}\"\n\n\nclass FileIOError(RuntimeError):\n    def __init__(self, error: str, filename: str):\n        super().__init__(error)\n\n        self.error = error\n        self.filename = filename\n\n\nclass DoxygenIndex:\n    def __init__(self, root: Node_DoxygenTypeIndex):\n        self.root = root\n        self.compounds: collections.defaultdict[str, list[Node_CompoundType]] = (\n            collections.defaultdict(list)\n        )\n        self.members: collections.defaultdict[\n            str, list[tuple[Node_MemberType, Node_CompoundType]]\n        ] = collections.defaultdict(list)\n\n        self.file_compounds: list[Node_CompoundType] = []\n\n        for c in root.compound:\n            self.compounds[c.name].append(c)\n            if c.kind == CompoundKind.file:\n                self.file_compounds.append(c)\n            for m in c.member:\n                self.members[m.name].append((m, c))\n\n\nclass DoxygenCompound:\n    def __init__(self, root: Node_DoxygenType, parser: DoxygenParser, project_info: ProjectInfo):\n        self.root = root\n        self.members_by_id: dict[\n            str, tuple[Node_memberdefType, Node_sectiondefType, Node_compounddefType]\n        ] = {}\n        self.enumvalue_by_id: dict[\n            str,\n            tuple[\n                Node_enumvalueType, Node_memberdefType, Node_sectiondefType, Node_compounddefType\n            ],\n        ] = {}\n\n        for c in root.compounddef:\n            for s in c.sectiondef:\n                for m in s.memberdef:\n                    self.members_by_id[m.id] = (m, s, c)\n                    for ev in m.enumvalue:\n                        self.enumvalue_by_id[ev.id] = (ev, m, s, c)\n                for m in s.member:\n                    # Parse the referenced compound (group) XML\n                    group_compound = parser.parse_compound(\n                        m.refid.rsplit(sep=\"_\", maxsplit=1)[0], project_info\n                    )\n                    # Get the memberdef from the group compound\n                    self.members_by_id.update(group_compound.members_by_id)\n\n\ndef _parse_common(filename: str, right_tag: str) -> Node_DoxygenType | Node_DoxygenTypeIndex:\n    try:\n        with open(filename, \"rb\") as file:\n            result = parse_file(file)\n        if result.name != right_tag:\n            raise ParserError(f'expected \"{right_tag}\" root element, not \"{result.name}\"', filename)\n\n        return result.value\n    except ParseError as e:\n        raise ParserError(e.message, filename, e.lineno)\n    except IOError as e:\n        raise FileIOError(str(e), filename)\n\n\nclass ProjectData(NamedTuple):\n    d_index: DoxygenIndex\n    compound_cache: dict[str, DoxygenCompound]\n\n\nclass DoxygenParser:\n    def __init__(self, app: Sphinx) -> None:\n        self.app = app\n        self.parsed_data: dict[str, ProjectData] = {}\n\n    def _get_project_data(self, project_info: ProjectInfo) -> ProjectData:\n        key = project_info.project_path()\n        r = self.parsed_data.get(key)\n        if r is None:\n            filename = path_handler.resolve_path(self.app, project_info.project_path(), \"index.xml\")\n\n            file_state_cache.update(self.app, filename)\n\n            n = _parse_common(filename, \"doxygenindex\")\n            assert isinstance(n, Node_DoxygenTypeIndex)\n            r = ProjectData(DoxygenIndex(n), {})\n            self.parsed_data[key] = r\n        return r\n\n    def parse_index(self, project_info: ProjectInfo) -> DoxygenIndex:\n        return self._get_project_data(project_info).d_index\n\n    def parse_compound(self, refid: str, project_info: ProjectInfo) -> DoxygenCompound:\n        cache = self._get_project_data(project_info).compound_cache\n        r = cache.get(refid)\n        if r is None:\n            filename = path_handler.resolve_path(\n                self.app, project_info.project_path(), f\"{refid}.xml\"\n            )\n\n            file_state_cache.update(self.app, filename)\n\n            n = _parse_common(filename, \"doxygen\")\n            assert isinstance(n, Node_DoxygenType)\n            # Pass parser instance to allow looking up referenced compounds\n            r = DoxygenCompound(n, self, project_info)\n            cache[refid] = r\n        return r\n\n\n@overload\ndef tag_name_value(x: TaggedValue[T_covar, U_covar]) -> tuple[T_covar, U_covar]: ...\n\n\n@overload\ndef tag_name_value(x: str) -> tuple[None, str]: ...\n\n\ndef tag_name_value(x: TaggedValue[T_covar, U_covar] | str) -> tuple[T_covar | None, U_covar | str]:\n    if isinstance(x, str):\n        return None, x\n    return x.name, x.value\n"
  },
  {
    "path": "breathe/path_handler.py",
    "content": "from __future__ import annotations\n\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n\n\ndef includes_directory(file_path: str):\n    # Check for backslash or forward slash as we don't know what platform we're on and sometimes\n    # the doxygen paths will have forward slash even on Windows.\n    return bool(str(file_path).count(\"\\\\\")) or bool(str(file_path).count(\"/\"))\n\n\ndef resolve_path(app: Sphinx, directory: str, filename: str):\n    \"\"\"Returns a full path to the filename in the given directory assuming that if the directory\n    path is relative, then it is relative to the conf.py directory.\n    \"\"\"\n\n    return Path(app.confdir, directory, filename).resolve()\n"
  },
  {
    "path": "breathe/process.py",
    "content": "from __future__ import annotations\n\nimport os\nfrom pathlib import Path\nfrom shlex import quote\nfrom typing import TYPE_CHECKING\n\nfrom breathe.project import AutoProjectInfo, ProjectInfoFactory\n\nif TYPE_CHECKING:\n    from collections.abc import Mapping\n    from typing import Callable\n\n    from breathe.project import AutoProjectInfo, ProjectInfoFactory\n\nAUTOCFG_TEMPLATE = r\"\"\"\nPROJECT_NAME     = \"{project_name}\"\nOUTPUT_DIRECTORY = {output_dir}\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = {input}\nENABLE_PREPROCESSING = YES\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nJAVADOC_AUTOBRIEF = NO\nGENERATE_HTML = NO\nGENERATE_XML = YES\nALIASES = rst=\"\\verbatim embed:rst\"\nALIASES += endrst=\"\\endverbatim\"\nALIASES += inlinerst=\"\\verbatim embed:rst:inline\"\n{extra}\n\"\"\".strip()\n\n\nclass ProjectData:\n    \"\"\"Simple handler for the files and project_info for each project.\"\"\"\n\n    def __init__(self, auto_project_info: AutoProjectInfo, files: list[str]) -> None:\n        self.auto_project_info = auto_project_info\n        self.files = files\n\n\nclass AutoDoxygenProcessHandle:\n    def __init__(\n        self,\n        run_process: Callable,\n        write_file: Callable[[str | os.PathLike[str], str, str], None],\n        project_info_factory: ProjectInfoFactory,\n    ) -> None:\n        self.run_process = run_process\n        self.write_file = write_file\n        self.project_info_factory = project_info_factory\n\n    def generate_xml(\n        self,\n        projects_source: Mapping[str, tuple[str, list[str]]],\n        doxygen_options: Mapping[str, str],\n        doxygen_aliases: Mapping[str, str],\n    ) -> None:\n        project_files: dict[str, ProjectData] = {}\n\n        # First collect together all the files which need to be doxygen processed for each project\n        for project_name, file_structure in projects_source.items():\n            folder, contents = file_structure\n            auto_project_info = self.project_info_factory.create_auto_project_info(\n                project_name, folder\n            )\n            project_files[project_name] = ProjectData(auto_project_info, contents)\n\n        # Iterate over the projects and generate doxygen xml output for the files for each one into\n        # a directory in the Sphinx build area\n        for project_name, data in project_files.items():\n            project_path = self.process(\n                data.auto_project_info, data.files, doxygen_options, doxygen_aliases\n            )\n            project_info = data.auto_project_info.create_project_info(project_path)\n            self.project_info_factory.store_project_info_for_auto(project_name, project_info)\n\n    def process(\n        self,\n        auto_project_info: AutoProjectInfo,\n        files: list[str],\n        doxygen_options: Mapping[str, str],\n        doxygen_aliases: Mapping[str, str],\n    ) -> str:\n        name = auto_project_info.name()\n        full_paths = [str(auto_project_info.abs_path_to_source_file(f)) for f in files]\n\n        options = \"\\n\".join(\"%s=%s\" % pair for pair in doxygen_options.items())\n        aliases = \"\\n\".join(\n            f'ALIASES += {name}=\"{value}\"' for name, value in doxygen_aliases.items()\n        )\n\n        cfg = AUTOCFG_TEMPLATE.format(\n            project_name=name,\n            output_dir=name,\n            input=\" \".join(full_paths),\n            extra=f\"{options}\\n{aliases}\",\n        )\n\n        build_dir = Path(auto_project_info.build_dir(), \"breathe\", \"doxygen\")\n        cfgfile = f\"{name}.cfg\"\n        self.write_file(build_dir, cfgfile, cfg)\n\n        # Shell-escape the cfg file name to try to avoid any issue where the name might include\n        # malicious shell character - We have to use the shell=True option to make it work on\n        # Windows. See issue #271\n        self.run_process(f\"doxygen {quote(cfgfile)}\", cwd=build_dir, shell=True)\n\n        return os.path.join(build_dir, name, \"xml\")\n"
  },
  {
    "path": "breathe/project.py",
    "content": "from __future__ import annotations\n\nimport fnmatch\nimport os\nimport os.path\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nfrom breathe.exception import BreatheError\n\nif TYPE_CHECKING:\n    from collections import UserDict\n\n    from sphinx.application import Sphinx\n\n    class ProjectOptions(UserDict):\n        path: str\n        project: str\n\n\nclass ProjectError(BreatheError):\n    pass\n\n\nclass NoDefaultProjectError(ProjectError):\n    pass\n\n\nclass AutoProjectInfo:\n    \"\"\"Created as a temporary step in the automatic xml generation process\"\"\"\n\n    def __init__(self, app: Sphinx, name: str, source_path: str, build_dir: str, reference: str):\n        self.app = app\n\n        self._name = name\n        self._source_path = source_path\n        self._build_dir = build_dir\n        self._reference = reference\n\n    def name(self):\n        return self._name\n\n    def build_dir(self):\n        return self._build_dir\n\n    def abs_path_to_source_file(self, file_):\n        \"\"\"\n        Returns full path to the provide file assuming that the provided path is relative to the\n        projects conf.py directory as specified in the breathe_projects_source config variable.\n        \"\"\"\n\n        return Path(self.app.confdir, self._source_path, file_).resolve()\n\n    def create_project_info(self, project_path):\n        \"\"\"Creates a proper ProjectInfo object based on the information in this AutoProjectInfo\"\"\"\n\n        return ProjectInfo(self.app, self._name, project_path, self._source_path, self._reference)\n\n\nclass ProjectInfo:\n    def __init__(self, app: Sphinx, name: str, path: str, source_path: str, reference: str):\n        self.app = app\n\n        self._name = name\n        self._project_path = path\n        self._source_path = source_path\n        self._reference = reference\n\n    def name(self) -> str:\n        return self._name\n\n    def project_path(self):\n        return self._project_path\n\n    def source_path(self):\n        return self._source_path\n\n    def relative_path_to_xml_file(self, file_):\n        \"\"\"\n        Returns relative path from Sphinx documentation top-level source directory to the specified\n        file assuming that the specified file is a path relative to the doxygen xml output\n        directory.\n        \"\"\"\n\n        # os.path.join does the appropriate handling if _project_path is an absolute path\n        full_xml_project_path = os.path.join(self.app.confdir, self._project_path, file_)\n        return os.path.relpath(full_xml_project_path, self.app.srcdir)\n\n    def sphinx_abs_path_to_file(self, file_):\n        \"\"\"\n        Prepends os.path.sep to the value returned by relative_path_to_file.\n\n        This is to match Sphinx's concept of an absolute path which starts from the top-level source\n        directory of the project.\n        \"\"\"\n        return os.path.sep + self.relative_path_to_xml_file(file_)\n\n    def reference(self):\n        return self._reference\n\n    def domain_for_file(self, file_: str) -> str:\n        extension = file_.split(\".\")[-1]\n        try:\n            domain = self.app.config.breathe_domain_by_extension[extension]\n        except KeyError:\n            domain = \"\"\n\n        domainFromFilePattern = self.app.config.breathe_domain_by_file_pattern\n        for pattern, pattern_domain in domainFromFilePattern.items():\n            if fnmatch.fnmatch(file_, pattern):\n                domain = pattern_domain\n\n        return domain\n\n\nclass ProjectInfoFactory:\n    _default_build_dir: str\n\n    def __init__(self, app: Sphinx):\n        self.app = app\n        # note: don't access self.app.config now, as we are instantiated at setup-time.\n\n        # Assume general build directory is the parent of the doctree directory.\n        # This can be overridden with the breathe_build_directory config variable\n        self._default_build_dir = os.path.dirname(os.path.normpath(app.doctreedir))\n        self.project_count = 0\n        self.project_info_store: dict[str, ProjectInfo] = {}\n        self.project_info_for_auto_store: dict[str, ProjectInfo] = {}\n        self.auto_project_info_store: dict[str, AutoProjectInfo] = {}\n\n    @property\n    def build_dir(self) -> str:\n        config = self.app.config\n        if config.breathe_build_directory:\n            return config.breathe_build_directory\n        else:\n            return self._default_build_dir\n\n    def default_path(self) -> str:\n        config = self.app.config\n        if not config.breathe_default_project:\n            raise NoDefaultProjectError(\n                \"No breathe_default_project config setting to fall back on \"\n                \"for directive with no 'project' or 'path' specified.\"\n            )\n\n        try:\n            return config.breathe_projects[config.breathe_default_project]\n        except KeyError:\n            raise ProjectError(\n                (\n                    \"breathe_default_project value '%s' does not seem to be a valid key for the \"\n                    \"breathe_projects dictionary\"\n                )\n                % config.breathe_default_project\n            )\n\n    def create_project_info(self, options: ProjectOptions) -> ProjectInfo:\n        config = self.app.config\n        name = config.breathe_default_project\n\n        if \"project\" in options:\n            try:\n                path = config.breathe_projects[options[\"project\"]]\n                name = options[\"project\"]\n            except KeyError:\n                raise ProjectError(\n                    \"Unable to find project '%s' in breathe_projects dictionary\"\n                    % options[\"project\"]\n                )\n        elif \"path\" in options:\n            path = options[\"path\"]\n        else:\n            path = self.default_path()\n\n        try:\n            return self.project_info_store[path]\n        except KeyError:\n            reference = name\n            if not name:\n                name = \"project%s\" % self.project_count\n                reference = path\n                self.project_count += 1\n\n            project_info = ProjectInfo(self.app, name, path, \"NoSourcePath\", reference)\n            self.project_info_store[path] = project_info\n            return project_info\n\n    def store_project_info_for_auto(self, name: str, project_info: ProjectInfo) -> None:\n        \"\"\"Stores the project info by name for later extraction by the auto directives.\n\n        Stored separately to the non-auto project info objects as they should never overlap.\n        \"\"\"\n\n        self.project_info_for_auto_store[name] = project_info\n\n    def retrieve_project_info_for_auto(self, options) -> ProjectInfo:\n        \"\"\"Retrieves the project info by name for later extraction by the auto directives.\n\n        Looks for the 'project' entry in the options dictionary. This is a less than ideal API but\n        it is designed to match the use of 'create_project_info' above for which it makes much more\n        sense.\n        \"\"\"\n\n        name = options.get(\"project\", self.app.config.breathe_default_project)\n        if name is None:\n            raise NoDefaultProjectError(\n                \"No breathe_default_project config setting to fall back on \"\n                \"for directive with no 'project' or 'path' specified.\"\n            )\n        return self.project_info_for_auto_store[name]\n\n    def create_auto_project_info(self, name: str, source_path) -> AutoProjectInfo:\n        key = source_path\n        try:\n            return self.auto_project_info_store[key]\n        except KeyError:\n            reference = name\n            if not name:\n                name = \"project%s\" % self.project_count\n                reference = source_path\n                self.project_count += 1\n\n            auto_project_info = AutoProjectInfo(\n                self.app, name, source_path, self.build_dir, reference\n            )\n            self.auto_project_info_store[key] = auto_project_info\n            return auto_project_info\n"
  },
  {
    "path": "breathe/renderer/__init__.py",
    "content": "from __future__ import annotations\n\nimport textwrap\nfrom typing import TYPE_CHECKING, NamedTuple, TypeVar\n\nfrom docutils import nodes\n\nif TYPE_CHECKING:\n    from typing import Generic, Union\n\n    from breathe import parser\n    from breathe.directives.index import RootDataObject\n    from breathe.renderer import mask\n\n    DataObject = Union[parser.NodeOrValue, RootDataObject]\n    T_data_object = TypeVar(\"T_data_object\", bound=DataObject, covariant=True)\nelse:\n    T_data_object = TypeVar(\"T_data_object\", covariant=True)\n\n\ndef format_parser_error(\n    name: str, error: str, filename: str, state, lineno: int, do_unicode_warning: bool = False\n) -> list[nodes.Node]:\n    warning = '%s: Unable to parse xml file \"%s\". ' % (name, filename)\n    explanation = \"Reported error: %s. \" % error\n\n    unicode_explanation_text = \"\"\n    unicode_explanation = []\n    if do_unicode_warning:\n        unicode_explanation_text = (\n            textwrap.dedent(\n                \"\"\"\n        Parsing errors are often due to unicode errors associated with the encoding of the original\n        source files. Doxygen propagates invalid characters from the input source files to the\n        output xml.\"\"\"\n            )\n            .strip()\n            .replace(\"\\n\", \" \")\n        )\n        unicode_explanation = [nodes.paragraph(\"\", \"\", nodes.Text(unicode_explanation_text))]\n\n    return [\n        nodes.warning(\n            \"\",\n            nodes.paragraph(\"\", \"\", nodes.Text(warning)),\n            nodes.paragraph(\"\", \"\", nodes.Text(explanation)),\n            *unicode_explanation,\n        ),\n        state.document.reporter.warning(\n            warning + explanation + unicode_explanation_text, line=lineno\n        ),\n    ]\n\n\nif TYPE_CHECKING:\n\n    class TaggedNode(NamedTuple, Generic[T_data_object]):\n        tag: str | None\n        value: T_data_object\n\nelse:\n    # Python 3.9 and 3.10 don't allow multiple-inheritance with NamedTuple\n    class TaggedNode(NamedTuple):\n        tag: str | None\n        value: ...\n\n\nclass RenderContext:\n    def __init__(\n        self,\n        node_stack: list[TaggedNode],\n        mask_factory: mask.MaskFactoryBase,\n        directive_args,\n        domain: str = \"\",\n        child: bool = False,\n    ) -> None:\n        self.node_stack = node_stack\n        self.mask_factory = mask_factory\n        self.directive_args = directive_args\n        self.domain = domain\n        self.child = child\n\n    def create_child_context(\n        self, data_object: parser.NodeOrValue, tag: str | None = None\n    ) -> RenderContext:\n        node_stack = self.node_stack[:]\n        node_stack.insert(0, TaggedNode(tag, self.mask_factory.mask(data_object)))\n        return RenderContext(node_stack, self.mask_factory, self.directive_args, self.domain, True)\n"
  },
  {
    "path": "breathe/renderer/filter.py",
    "content": "\"\"\"\nFilters\n-------\n\nFilters are an interesting and somewhat challenging part of the code base. They are used for\ntwo different purposes:\n\n - To figure out which nodes in the xml hierarchy to start rendering from. These are called\n   'finder filters' or 'content filters'. This is done before rendering starts.\n - To figure out which nodes under a selected nodes in the xml hierarchy should be rendered. These\n   are called 'render filters'. This is done during the render process with a test in the\n   DoxygenToRstRendererFactory.\n\n\nFinder Filters\n~~~~~~~~~~~~~~\n\nThe implementation of the filters can change a little depending on how they are called. Finder\nfilters are called from the breathe.finder.doxygen.index and breathe.finder.doxygen.compound files.\nThey are called like this:\n\n    # Descend down the hierarchy\n    # ...\n\n    if filter_(node_stack):\n        matches.append(self.data_object)\n\n    # Keep on descending\n    # ...\n\nThis means that the result of the filter does not stop us descending down the hierarchy and testing\nmore nodes. This simplifies the filters as they only have to return true for the exact nodes they\nare interested in and they don't have to worry about allowing the iteration down the hierarchy to\ncontinue for nodes which don't match.\n\n\nContent Filters\n~~~~~~~~~~~~~~~\n\nContent filters are harder than the finder filters as they are responsible for halting the iteration\ndown the hierarchy if they return false. This means that if you're interested in Node_memberdefType\nnodes with a particular attribute then you have to check for that but also include a clause which\nallows all other non-Node_memberdefType nodes to pass through as you don't want to interrupt them.\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom breathe import parser, renderer\n\nif TYPE_CHECKING:\n    import sys\n    from collections.abc import Container, Iterable, Mapping\n    from typing import Any, Callable, SupportsIndex, Union\n\n    from sphinx.application import Sphinx\n\n    if sys.version_info >= (3, 11):\n        from typing import Any, TypeAlias\n    else:\n        from typing_extensions import TypeAlias\n\n    from breathe.directives.class_like import DoxClassOptions\n    from breathe.directives.content_block import DoxContentBlockOptions\n    from breathe.project import ProjectInfo\n\n    DoxFilter: TypeAlias = Callable[[\"NodeStack\"], bool]\n\n    FinderMatch: TypeAlias = list[renderer.TaggedNode]\n    FinderMatchItr: TypeAlias = Iterable[FinderMatch]\n\n    DoxIndexFilter: TypeAlias = Callable[[parser.DoxygenIndex], FinderMatchItr]\n\n    DoxNamespaceOptions: TypeAlias = Union[DoxClassOptions, DoxContentBlockOptions]\n\n    T_options = Union[DoxClassOptions, DoxContentBlockOptions]\n\n\nCLASS_LIKE_COMPOUNDDEF = (\n    parser.DoxCompoundKind.class_,\n    parser.DoxCompoundKind.struct,\n    parser.DoxCompoundKind.interface,\n)\n\n\nclass NodeStack:\n    def __init__(self, stack: list[renderer.TaggedNode]):\n        self.stack = stack\n\n    def ancestor(self, generations: SupportsIndex) -> renderer.DataObject | None:\n        i = generations.__index__()\n        return self.stack[i].value if len(self.stack) > i else None\n\n    @property\n    def parent(self) -> renderer.DataObject | None:\n        return self.stack[1].value if len(self.stack) > 1 else None\n\n    @property\n    def node(self) -> renderer.DataObject:\n        return self.stack[0].value\n\n    @property\n    def tag(self) -> str:\n        tag = self.stack[0].tag\n        assert tag is not None\n        return tag\n\n\ndef set_defaults(app: Sphinx, options: T_options) -> T_options:\n    r: Any = options.copy()\n    for m in app.config.breathe_default_members:\n        r.setdefault(m, \"\")\n    return r\n\n\ndef create_show_filter(options: Mapping[str, Any]) -> DoxFilter:\n    \"\"\"Currently only handles the header-file entry\"\"\"\n\n    if options.get(\"show\") == \"header-file\":\n        return lambda nstack: True\n\n    # Allow through everything except the header-file includes nodes\n    def filter_(nstack: NodeStack) -> bool:\n        return not (\n            isinstance(nstack.parent, parser.Node_compounddefType)\n            and isinstance(nstack.node, parser.Node_incType)\n        )\n\n    return filter_\n\n\ndef _create_undoc_members_filter(options: DoxNamespaceOptions) -> DoxFilter:\n    if \"undoc-members\" in options:\n        return lambda nstack: True\n\n    def filter_(nstack: NodeStack) -> bool:\n        node = nstack.node\n        # Allow anything that isn't a Node_memberdefType, or if it is only\n        # allow the ones with a description\n        return (not isinstance(node, parser.Node_memberdefType)) or bool(\n            parser.description_has_content(node.briefdescription)\n            or parser.description_has_content(node.detaileddescription)\n        )\n\n    return filter_\n\n\ndef _create_public_members_filter(\n    options: DoxNamespaceOptions,\n) -> Callable[[parser.Node_memberdefType], bool]:\n    if \"members\" in options:\n        # If the user has specified the 'members' option with arguments then\n        # we only pay attention to that and not to any other member settings\n        members_str = options[\"members\"]\n        if members_str and not members_str.isspace():\n            # Matches sphinx-autodoc behaviour of comma separated values\n            members = frozenset([x.strip() for x in members_str.split(\",\")])\n\n            # Accept any nodes which don't have a \"sectiondef\" as a parent\n            # or, if they do, only accept them if their names are in the\n            # members list\n            def filter_(node: parser.Node_memberdefType) -> bool:\n                return node.name in members\n\n        else:\n            # Select anything that doesn't have a parent which is a\n            # sectiondef, or, if it does, only select the public ones\n            def filter_(node: parser.Node_memberdefType) -> bool:\n                return node.prot == parser.DoxProtectionKind.public\n\n    else:\n        # Nothing with a parent that's a sectiondef\n        def filter_(node: parser.Node_memberdefType) -> bool:\n            return False\n\n    return filter_\n\n\ndef create_description_filter(allow: bool, level: type[parser.Node]) -> DoxFilter:\n    \"\"\"Whether or not we allow descriptions is determined by the calling function and we just do\n    whatever the 'allow' function parameter tells us.\n    \"\"\"\n\n    if allow:\n        # Let through any description children of sectiondefs if we output any kind members\n        def filter_(nstack: NodeStack) -> bool:\n            return not isinstance(nstack.parent, level) or isinstance(\n                nstack.node, parser.Node_descriptionType\n            )\n\n    else:\n        # Nothing with a parent that's a sectiondef\n        def filter_(nstack: NodeStack) -> bool:\n            return not isinstance(nstack.parent, level)\n\n    return filter_\n\n\ndef create_class_member_filter(options: DoxNamespaceOptions) -> DoxFilter:\n    \"\"\"Content filter based on :members: and :private-members: classes\"\"\"\n\n    # I can't fully explain the filtering of descriptions here. More testing needed to figure\n    # out when it is needed. This approach reflects the old code that was here but it wasn't\n    # commented (my fault.) I wonder if maybe the public and private declarations themselves can\n    # be documented and we need to let them through. Not sure.\n    allow = \"members\" in options or \"protected-members\" in options or \"private-members\" in options\n\n    description = create_description_filter(allow, parser.Node_sectiondefType)\n\n    # Create all necessary filters and combine them\n    public_members = _create_public_members_filter(options)\n\n    undoc_members = _create_undoc_members_filter(options)\n\n    prot_filter: tuple[parser.DoxProtectionKind, ...] = ()\n    if \"protected-members\" in options:\n        prot_filter += (parser.DoxProtectionKind.protected,)\n    if \"private-members\" in options:\n        prot_filter += (parser.DoxProtectionKind.private,)\n\n    # Allow anything that isn't a memberdef, or if it is, and 'prot' is not\n    # empty, allow the ones with an equal 'prot' attribute\n    def filter_(nstack: NodeStack) -> bool:\n        node = nstack.node\n        return (\n            (\n                not (\n                    isinstance(node, parser.Node_memberdefType)\n                    and isinstance(nstack.parent, parser.Node_sectiondefType)\n                )\n                or (bool(prot_filter) and node.prot in prot_filter)\n                or public_members(node)\n            )\n            and undoc_members(nstack)\n        ) or description(nstack)\n\n    return filter_\n\n\ndef create_innerclass_filter(options: DoxNamespaceOptions, outerclass: str = \"\") -> DoxFilter:\n    \"\"\"\n    :param outerclass: Should be the class/struct being target by the directive calling this\n                        code. If it is a group or namespace directive then it should be left\n                        blank. It is used when looking for names listed in the :members: option.\n\n                        The name should include any additional namespaces that the target class\n                        is in.\n    \"\"\"\n    allowed: set[parser.DoxProtectionKind] = set()\n    if \"protected-members\" in options:\n        allowed.add(parser.DoxProtectionKind.protected)\n    if \"private-members\" in options:\n        allowed.add(parser.DoxProtectionKind.private)\n\n    description = create_description_filter(True, parser.Node_compounddefType)\n\n    members: set[str] | None = None\n    if \"members\" in options:\n        members_str = options[\"members\"]\n        if members_str and members_str.strip():\n            prefix = (\"%s::\" % outerclass) if outerclass else \"\"\n\n            # Matches sphinx-autodoc behaviour of comma separated values\n            members = {\"%s%s\" % (prefix, x.strip()) for x in members_str.split(\",\")}\n        else:\n            allowed.add(parser.DoxProtectionKind.public)\n\n    def filter_(nstack: NodeStack) -> bool:\n        node = nstack.node\n        parent = nstack.parent\n\n        return (\n            not (\n                isinstance(node, parser.Node_refType)\n                and nstack.tag == \"innerclass\"\n                and isinstance(parent, parser.Node_compounddefType)\n                and parent.kind in CLASS_LIKE_COMPOUNDDEF\n            )\n            or node.prot in allowed\n            or (members is not None and \"\".join(node) in members)\n            or description(nstack)\n        )\n\n    return filter_\n\n\ndef create_class_filter(app: Sphinx, target: str, options: DoxClassOptions) -> DoxFilter:\n    \"\"\"Content filter for classes based on various directive options\"\"\"\n\n    filter_options = set_defaults(app, options)\n\n    cm_filter = create_class_member_filter(filter_options)\n    ic_filter = create_innerclass_filter(filter_options, outerclass=target)\n    o_filter = create_outline_filter(filter_options)\n    s_filter = create_show_filter(filter_options)\n\n    return (\n        lambda nstack: cm_filter(nstack)\n        and ic_filter(nstack)\n        and o_filter(nstack)\n        and s_filter(nstack)\n    )\n\n\ndef create_outline_filter(options: Mapping[str, Any]) -> DoxFilter:\n    if \"outline\" in options:\n        return lambda nstack: not isinstance(\n            nstack.node, (parser.Node_descriptionType, parser.Node_incType)\n        )\n\n    return lambda nstack: True\n\n\ndef extend_member_with_compound(\n    d_parser: parser.DoxygenParser,\n    project_info: ProjectInfo,\n    m: parser.Node_MemberType,\n    c: parser.Node_CompoundType,\n    index: parser.Node_DoxygenTypeIndex,\n) -> FinderMatch:\n    dc = d_parser.parse_compound(c.refid, project_info)\n    mdef, sdef, cdef = dc.members_by_id[m.refid]\n\n    TN = renderer.TaggedNode\n    return [\n        TN(\"memberdef\", mdef),\n        TN(\"sectiondef\", sdef),\n        TN(\"compounddef\", cdef),\n        TN(\"doxygen\", dc.root),\n        TN(\"compound\", c),\n        TN(\"doxygenindex\", index),\n    ]\n\n\ndef member_finder_filter(\n    app: Sphinx,\n    namespace: str,\n    name: str,\n    d_parser: parser.DoxygenParser,\n    project_info: ProjectInfo,\n    kinds: Container[parser.MemberKind] | str,\n    index: parser.DoxygenIndex,\n) -> FinderMatchItr:\n    \"\"\"Looks for a member with the specified name and kind.\"\"\"\n\n    if isinstance(kinds, str):\n        kinds = (parser.MemberKind(kinds),)\n\n    if namespace:\n        c_kinds = {\n            parser.CompoundKind.namespace,\n            parser.CompoundKind.class_,\n            parser.CompoundKind.struct,\n            parser.CompoundKind.interface,\n        }\n\n        for m, c in index.members[name]:\n            if c.kind in c_kinds and c.name == namespace:\n                if m.kind in kinds:\n                    yield extend_member_with_compound(d_parser, project_info, m, c, index.root)\n\n    else:\n        ext = tuple(app.config.breathe_implementation_filename_extensions)\n\n        for m, c in index.members[name]:\n            if c.kind != parser.CompoundKind.file or not c.name.endswith(ext):\n                if m.kind in kinds:\n                    yield extend_member_with_compound(d_parser, project_info, m, c, index.root)\n\n\ndef compound_finder_filter(\n    name: str,\n    kind: str,\n    index: parser.DoxygenIndex,\n) -> FinderMatchItr:\n    \"\"\"Looks for a compound with the specified name and kind.\"\"\"\n\n    for c in index.compounds[name]:\n        if c.kind.value != kind:\n            continue\n\n        yield [\n            renderer.TaggedNode(\"compound\", c),\n            renderer.TaggedNode(\"doxygenindex\", index.root),\n        ]\n"
  },
  {
    "path": "breathe/renderer/mask.py",
    "content": "\"\"\"\nMasks\n=====\n\nMasks are related to filters. Filters can block the processing of particular parts of the xml\nhierarchy but they can only work on node level. If the part of the xml hierarchy that you want to\nfilter out is read in as an instance of one of the classes in parser/doxygen/*.py then you can use\nthe filters. However, if you want to filter out an attribute from one of the nodes (and some of the\nxml child nodes are read in as attributes on their parents) then you can't use a filter.\n\nWe introduce the Mask's to fulfil this need. The masks are designed to be applied to a particular\nnode type and to limit the access to particular attributes on the node. For example, then\nNoParameterNamesMask wraps a node a returns all its standard attributes but returns None for the\n'declname' and 'defname' attributes.\n\nCurrently the Mask functionality is only used for the text signature rendering for doing function\nmatching.\n\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom breathe import parser\n\nif TYPE_CHECKING:\n    from typing import Callable\n\n\ndef no_parameter_names(node: parser.NodeOrValue) -> parser.Node_paramType:\n    assert isinstance(node, parser.Node_paramType)\n    return parser.Node_paramType(\n        array=node.array,\n        attributes=node.attributes,\n        briefdescription=node.briefdescription,\n        declname=None,\n        defname=None,\n        defval=None,\n        type=node.type,\n        typeconstraint=node.typeconstraint,\n    )\n\n\nclass MaskFactoryBase:\n    def mask(self, data_object):\n        raise NotImplementedError\n\n\nclass MaskFactory(MaskFactoryBase):\n    def __init__(\n        self,\n        lookup: dict[type[parser.NodeOrValue], Callable[[parser.NodeOrValue], parser.NodeOrValue]],\n    ):\n        self.lookup = lookup\n\n    def mask(self, data_object: parser.NodeOrValue) -> parser.NodeOrValue:\n        m = self.lookup.get(type(data_object))\n        if m is None:\n            return data_object\n        return m(data_object)\n\n\nclass NullMaskFactory(MaskFactoryBase):\n    def mask(self, data_object: parser.NodeOrValue) -> parser.NodeOrValue:\n        return data_object\n"
  },
  {
    "path": "breathe/renderer/sphinxrenderer.py",
    "content": "from __future__ import annotations\n\nimport re\nimport textwrap\nfrom collections import defaultdict\nfrom pathlib import Path\nfrom typing import (\n    TYPE_CHECKING,\n    Callable,\n    Generic,\n    Literal,\n    TypeVar,\n    Union,\n    cast,\n)\n\nfrom docutils import nodes\nfrom docutils.parsers.rst.states import Text\nfrom docutils.statemachine import StringList, UnexpectedIndentationError\nfrom sphinx import addnodes\nfrom sphinx.domains import c, cpp, python\nfrom sphinx.ext.graphviz import graphviz\nfrom sphinx.util import url_re\nfrom sphinx.util.nodes import nested_parse_with_titles\n\nfrom breathe import filetypes, parser\nfrom breathe._parser import DoxCompoundKind\nfrom breathe.cpp_util import split_name\nfrom breathe.renderer.filter import NodeStack\n\nphp: Any\ntry:\n    from sphinxcontrib import phpdomain as php  # type: ignore[import-untyped, no-redef]\nexcept ImportError:\n    php = None\n\ncs: Any\ntry:\n    # The only valid types for sphinx_csharp are in a git repo so we can't easily rely\n    # on them as we can't publish with a git repo dependency so we tell mypy to ignore\n    # an import failure here\n    from sphinx_csharp import csharp as cs  # type: ignore[import-not-found, no-redef]\nexcept ImportError:\n    cs = None\n\n\nT = TypeVar(\"T\")\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable, Sequence\n    from typing import (\n        Any,\n        ClassVar,\n        Protocol,\n    )\n\n    from sphinx.application import Sphinx\n    from sphinx.directives import ObjectDescription\n\n    from breathe.project import ProjectInfo\n    from breathe.renderer import DataObject, RenderContext\n    from breathe.renderer.filter import DoxFilter\n    from breathe.renderer.target import TargetHandler\n\n    class HasRefID(Protocol):\n        @property\n        def refid(self) -> str: ...\n\n    class HasTemplateParamList(Protocol):\n        @property\n        def templateparamlist(self) -> parser.Node_templateparamlistType | None: ...\n\n    class HasDescriptions(Protocol):\n        @property\n        def briefdescription(self) -> parser.Node_descriptionType | None: ...\n\n        @property\n        def detaileddescription(self) -> parser.Node_descriptionType | None: ...\n\n\nContentCallback = Callable[[addnodes.desc_content], None]\nDeclarator = Union[addnodes.desc_signature, addnodes.desc_signature_line]\nDeclaratorCallback = Callable[[Declarator], None]\n\n_debug_indent = 0\n\n_findall_compat = cast(\n    \"Callable\", getattr(nodes.Node, \"findall\", getattr(nodes.Node, \"traverse\", None))\n)\n\n\n# Doxygen sometimes leaves 'static' in the type, e.g., for \"constexpr static\n# auto f()\"\n# In Doxygen up to somewhere between 1.8.17 to exclusive 1.9.1 the 'friend' part\n# is also left in the type. See also #767.\n# Until version 1.11, Doxygen left constexpr (I haven't checked consteval or\n# constinit) in the type.\nQUALIFIERS_TO_REMOVE = re.compile(r\"\\b(static|friend|constexpr|consteval|constinit) \")\n\n\ndef strip_legacy_qualifiers(x):\n    return QUALIFIERS_TO_REMOVE.sub(\"\", x)\n\n\nclass WithContext:\n    def __init__(self, parent: SphinxRenderer, context: RenderContext):\n        self.context = context\n        self.parent = parent\n        self.previous = None\n\n    def __enter__(self):\n        assert self.previous is None\n        self.previous = self.parent.context\n        self.parent.set_context(self.context)\n        return self\n\n    def __exit__(self, et, ev, bt):\n        self.parent.context = self.previous\n        self.previous = None\n\n\nclass BaseObject:\n    # Use this class as the first base class to make sure the overrides are used.\n    # Set the content_callback attribute to a function taking a docutils node.\n    breathe_content_callback: ContentCallback | None = None\n\n    def transform_content(self, contentnode: addnodes.desc_content) -> None:\n        super().transform_content(contentnode)  # type: ignore[misc]\n        if self.breathe_content_callback is None:\n            return\n        self.breathe_content_callback(contentnode)\n\n\n# ----------------------------------------------------------------------------\n\n\nclass CPPClassObject(BaseObject, cpp.CPPClassObject):\n    pass\n\n\nclass CPPUnionObject(BaseObject, cpp.CPPUnionObject):\n    pass\n\n\nclass CPPFunctionObject(BaseObject, cpp.CPPFunctionObject):\n    pass\n\n\nclass CPPMemberObject(BaseObject, cpp.CPPMemberObject):\n    pass\n\n\nclass CPPTypeObject(BaseObject, cpp.CPPTypeObject):\n    pass\n\n\nclass CPPConceptObject(BaseObject, cpp.CPPConceptObject):\n    pass\n\n\nclass CPPEnumObject(BaseObject, cpp.CPPEnumObject):\n    pass\n\n\nclass CPPEnumeratorObject(BaseObject, cpp.CPPEnumeratorObject):\n    pass\n\n\n# ----------------------------------------------------------------------------\n\n\nclass CStructObject(BaseObject, c.CStructObject):\n    pass\n\n\nclass CUnionObject(BaseObject, c.CUnionObject):\n    pass\n\n\nclass CFunctionObject(BaseObject, c.CFunctionObject):\n    pass\n\n\nclass CMemberObject(BaseObject, c.CMemberObject):\n    pass\n\n\nclass CTypeObject(BaseObject, c.CTypeObject):\n    pass\n\n\nclass CEnumObject(BaseObject, c.CEnumObject):\n    pass\n\n\nclass CEnumeratorObject(BaseObject, c.CEnumeratorObject):\n    pass\n\n\nclass CMacroObject(BaseObject, c.CMacroObject):\n    pass\n\n\n# ----------------------------------------------------------------------------\n\n\nclass PyFunction(BaseObject, python.PyFunction):\n    pass\n\n\nclass PyAttribute(BaseObject, python.PyAttribute):\n    pass\n\n\nclass PyClasslike(BaseObject, python.PyClasslike):\n    pass\n\n\n# ----------------------------------------------------------------------------\n\n# Create multi-inheritance classes to merge BaseObject from Breathe with\n# classes from phpdomain.\n# We use capitalization (and the namespace) to differentiate between the two\n\nif php is not None or TYPE_CHECKING:\n\n    class PHPNamespaceLevel(BaseObject, php.PhpNamespacelevel):\n        \"\"\"Description of a PHP item *in* a namespace (not the space itself).\"\"\"\n\n        pass\n\n    class PHPClassLike(BaseObject, php.PhpClasslike):\n        pass\n\n    class PHPClassMember(BaseObject, php.PhpClassmember):\n        pass\n\n    class PHPGlobalLevel(BaseObject, php.PhpGloballevel):\n        pass\n\n\n# ----------------------------------------------------------------------------\n\nif cs is not None or TYPE_CHECKING:\n\n    class CSharpCurrentNamespace(BaseObject, cs.CSharpCurrentNamespace):\n        pass\n\n    class CSharpNamespacePlain(BaseObject, cs.CSharpNamespacePlain):\n        pass\n\n    class CSharpClass(BaseObject, cs.CSharpClass):\n        pass\n\n    class CSharpStruct(BaseObject, cs.CSharpStruct):\n        pass\n\n    class CSharpInterface(BaseObject, cs.CSharpInterface):\n        pass\n\n    class CSharpInherits(BaseObject, cs.CSharpInherits):\n        pass\n\n    class CSharpMethod(BaseObject, cs.CSharpMethod):\n        pass\n\n    class CSharpVariable(BaseObject, cs.CSharpVariable):\n        pass\n\n    class CSharpProperty(BaseObject, cs.CSharpProperty):\n        pass\n\n    class CSharpEvent(BaseObject, cs.CSharpEvent):\n        pass\n\n    class CSharpEnum(BaseObject, cs.CSharpEnum):\n        pass\n\n    class CSharpEnumValue(BaseObject, cs.CSharpEnumValue):\n        pass\n\n    class CSharpAttribute(BaseObject, cs.CSharpAttribute):\n        pass\n\n    class CSharpIndexer(BaseObject, cs.CSharpIndexer):\n        pass\n\n    class CSharpXRefRole(BaseObject, cs.CSharpXRefRole):\n        pass\n\n\n# ----------------------------------------------------------------------------\n\n\nclass DomainDirectiveFactory:\n    # A mapping from node kinds to domain directives and their names.\n    cpp_classes: dict[str, tuple[type[ObjectDescription], str]] = {\n        \"variable\": (CPPMemberObject, \"var\"),\n        \"class\": (CPPClassObject, \"class\"),\n        \"struct\": (CPPClassObject, \"struct\"),\n        \"interface\": (CPPClassObject, \"class\"),\n        \"function\": (CPPFunctionObject, \"function\"),\n        \"friend\": (CPPFunctionObject, \"function\"),\n        \"signal\": (CPPFunctionObject, \"function\"),\n        \"slot\": (CPPFunctionObject, \"function\"),\n        \"concept\": (CPPConceptObject, \"concept\"),\n        \"enum\": (CPPEnumObject, \"enum\"),\n        \"enum-class\": (CPPEnumObject, \"enum-class\"),\n        \"typedef\": (CPPTypeObject, \"type\"),\n        \"using\": (CPPTypeObject, \"type\"),\n        \"union\": (CPPUnionObject, \"union\"),\n        \"namespace\": (CPPTypeObject, \"type\"),\n        \"enumvalue\": (CPPEnumeratorObject, \"enumerator\"),\n        \"define\": (CMacroObject, \"macro\"),\n    }\n    c_classes: dict[str, tuple[type[ObjectDescription], str]] = {\n        \"variable\": (CMemberObject, \"var\"),\n        \"function\": (CFunctionObject, \"function\"),\n        \"define\": (CMacroObject, \"macro\"),\n        \"struct\": (CStructObject, \"struct\"),\n        \"union\": (CUnionObject, \"union\"),\n        \"enum\": (CEnumObject, \"enum\"),\n        \"enumvalue\": (CEnumeratorObject, \"enumerator\"),\n        \"typedef\": (CTypeObject, \"type\"),\n    }\n    python_classes: dict[str, tuple[type[ObjectDescription], str]] = {\n        # TODO: PyFunction is meant for module-level functions\n        #       and PyAttribute is meant for class attributes, not module-level variables.\n        #       Somehow there should be made a distinction at some point to get the correct\n        #       index-text and whatever other things are different.\n        \"function\": (PyFunction, \"function\"),\n        \"variable\": (PyAttribute, \"attribute\"),\n        \"class\": (PyClasslike, \"class\"),\n        \"namespace\": (PyClasslike, \"class\"),\n    }\n\n    php_classes: dict[str, tuple[type[ObjectDescription], str]]\n    if php is not None:\n        php_classes = {\n            \"function\": (PHPNamespaceLevel, \"function\"),\n            \"class\": (PHPClassLike, \"class\"),\n            \"attr\": (PHPClassMember, \"attr\"),\n            \"method\": (PHPClassMember, \"method\"),\n            \"global\": (PHPGlobalLevel, \"global\"),\n        }\n        php_classes_default = php_classes[\"class\"]  # Directive when no matching ones were found\n\n    cs_classes: dict[str, tuple[type[ObjectDescription], str]]\n    if cs is not None:\n        cs_classes = {\n            # 'doxygen-name': (CSharp class, key in CSharpDomain.object_types)\n            \"namespace\": (CSharpNamespacePlain, \"namespace\"),\n            \"class\": (CSharpClass, \"class\"),\n            \"struct\": (CSharpStruct, \"struct\"),\n            \"interface\": (CSharpInterface, \"interface\"),\n            \"function\": (CSharpMethod, \"function\"),\n            \"method\": (CSharpMethod, \"method\"),\n            \"variable\": (CSharpVariable, \"var\"),\n            \"property\": (CSharpProperty, \"property\"),\n            \"event\": (CSharpEvent, \"event\"),\n            \"enum\": (CSharpEnum, \"enum\"),\n            \"enumvalue\": (CSharpEnumValue, \"enumerator\"),\n            \"attribute\": (CSharpAttribute, \"attr\"),\n            # Fallback to cpp domain\n            \"typedef\": (CPPTypeObject, \"type\"),\n        }\n\n    @staticmethod\n    def create(domain: str, args) -> ObjectDescription:\n        cls: type[ObjectDescription]\n        name: str\n        if domain == \"c\":\n            cls, name = DomainDirectiveFactory.c_classes[args[0]]\n        elif domain == \"py\":\n            cls, name = DomainDirectiveFactory.python_classes[args[0]]\n        elif php is not None and domain == \"php\":\n            separators = php.separators\n            arg_0 = args[0]\n            if any(separators[\"method\"] in n for n in args[1]):\n                if any(separators[\"attr\"] in n for n in args[1]):\n                    arg_0 = \"attr\"\n                else:\n                    arg_0 = \"method\"\n            else:\n                if arg_0 == \"variable\":\n                    arg_0 = \"global\"\n\n            if arg_0 in DomainDirectiveFactory.php_classes:\n                cls, name = DomainDirectiveFactory.php_classes[arg_0]\n            else:\n                cls, name = DomainDirectiveFactory.php_classes_default\n\n        elif cs is not None and domain == \"cs\":\n            cls, name = DomainDirectiveFactory.cs_classes[args[0]]\n        else:\n            domain = \"cpp\"\n            cls, name = DomainDirectiveFactory.cpp_classes[args[0]]\n        # Replace the directive name because domain directives don't know how to handle\n        # Breathe's \"doxygen\" directives.\n        assert \":\" not in name\n        args = [domain + \":\" + name] + args[1:]\n        return cls(*args)\n\n\nclass NodeFinder(nodes.SparseNodeVisitor):\n    \"\"\"Find the Docutils desc_signature declarator and desc_content nodes.\"\"\"\n\n    def __init__(self, document: nodes.document):\n        super().__init__(document)\n        self.declarator: Declarator | None = None\n        self.content: addnodes.desc_content | None = None\n\n    def visit_desc_signature(self, node: addnodes.desc_signature):\n        # Find the last signature node because it contains the actual declarator\n        # rather than \"template <...>\". In Sphinx 1.4.1 we'll be able to use sphinx_cpp_tagname:\n        # https://github.com/breathe-doc/breathe/issues/242\n        self.declarator = node\n\n    def visit_desc_signature_line(self, node: addnodes.desc_signature_line):\n        # In sphinx 1.5, there is now a desc_signature_line node within the desc_signature\n        # This should be used instead\n        self.declarator = node\n\n    def visit_desc_content(self, node: addnodes.desc_content):\n        self.content = node\n        # The SparseNodeVisitor seems to not actually be universally Sparse,\n        # but only for nodes known to Docutils.\n        # So if there are extensions with new node types in the content,\n        # then the visitation will fail.\n        # We anyway don't need to visit the actual content, so skip it.\n        raise nodes.SkipChildren\n\n\ndef intersperse(iterable, delimiter):\n    it = iter(iterable)\n    yield next(it)\n    for x in it:\n        yield delimiter\n        yield x\n\n\ndef get_param_decl(param: parser.Node_paramType) -> str:\n    def to_string(node: parser.Node_linkedTextType | None) -> str:\n        \"\"\"Convert Doxygen node content to a string.\"\"\"\n        result: list[str] = []\n        if node is not None:\n            for p in node:\n                if isinstance(p, str):\n                    result.append(p)\n                else:\n                    result.append(p.value[0])\n        return \" \".join(result)\n\n    param_type = to_string(param.type)\n    param_name = param.declname or param.defname\n    if not param_name:\n        param_decl = param_type\n    else:\n        param_decl, number_of_subs = re.subn(\n            r\"(\\((?:\\w+::)*[*&]+)(\\))\", r\"\\g<1>\" + param_name + r\"\\g<2>\", param_type\n        )\n        if number_of_subs == 0:\n            param_decl = param_type + \" \" + param_name\n    if param.array:\n        param_decl += param.array\n    if param.defval:\n        param_decl += \" = \" + to_string(param.defval)\n\n    return param_decl\n\n\ndef get_definition_without_template_args(data_object):\n    \"\"\"\n    Return data_object.definition removing any template arguments from the class name in the member\n    function.  Otherwise links to classes defined in the same template are not generated correctly.\n\n    For example in 'Result<T> A< B<C> >::f' we want to remove the '< B<C> >' part.\n    \"\"\"\n    definition = data_object.definition\n    if len(data_object.bitfield) > 0:\n        definition += \" : \" + data_object.bitfield\n    qual_name = \"::\" + data_object.name\n    if definition.endswith(qual_name):\n        qual_name_start = len(definition) - len(qual_name)\n        pos = qual_name_start - 1\n        if definition[pos] == \">\":\n            bracket_count = 0\n            # Iterate back through the characters of the definition counting matching braces and\n            # then remove all braces and everything between\n            while pos > 0:\n                if definition[pos] == \">\":\n                    bracket_count += 1\n                elif definition[pos] == \"<\":\n                    bracket_count -= 1\n                    if bracket_count == 0:\n                        definition = definition[:pos] + definition[qual_name_start:]\n                        break\n                pos -= 1\n    return definition\n\n\nclass InlineText(Text):\n    \"\"\"\n    Add a custom docutils class to allow parsing inline text. This is to be\n    used inside a @verbatim/@endverbatim block but only the first line is\n    consumed and a inline element is generated as the parent, instead of the\n    paragraph used by Text.\n    \"\"\"\n\n    patterns = {\"inlinetext\": r\"\"}\n    initial_transitions = [(\"inlinetext\", \"text\")]\n\n    def indent(self, match, context, next_state):\n        \"\"\"\n        Avoid Text's indent from detecting space prefixed text and\n        doing \"funny\" stuff; always rely on inlinetext for parsing.\n        \"\"\"\n        return self.inlinetext(match, context, next_state)\n\n    def eof(self, context):\n        \"\"\"\n        Text.eof() inserts a paragraph, so override it to skip adding elements.\n        \"\"\"\n        return []\n\n    def inlinetext(self, match, context, next_state):\n        \"\"\"\n        Called by the StateMachine when an inline element is found (which is\n        any text when this class is added as the single transition.\n        \"\"\"\n        startline = self.state_machine.abs_line_number() - 1\n        msg = None\n        try:\n            block = self.state_machine.get_text_block()\n        except UnexpectedIndentationError as err:\n            block, src, srcline = err.args\n            msg = self.reporter.error(\"Unexpected indentation.\", source=src, line=srcline)\n        lines = context + list(block)\n        text, _ = self.inline_text(lines[0], startline)\n        self.parent += text\n        self.parent += msg\n        return [], next_state, []\n\n\ndef get_content(node: parser.Node_docParaType):\n    # Add programlisting nodes to content rather than a separate list,\n    # because programlisting and content nodes can interleave as shown in\n    # https://www.stack.nl/~dimitri/doxygen/manual/examples/include/html/example.html.\n\n    return (\n        item\n        for item in node\n        if parser.tag_name_value(item)[0] not in {\"parameterlist\", \"simplesect\", \"image\"}\n    )\n\n\ndef get_parameterlists(node: parser.Node_docParaType) -> Iterable[parser.Node_docParamListType]:\n    pairs = map(parser.tag_name_value, node)  # type: ignore[arg-type]\n    return (value for name, value in pairs if name == \"parameterlist\")  # type: ignore[misc]\n\n\ndef get_simplesects(node: parser.Node_docParaType) -> Iterable[parser.Node_docSimpleSectType]:\n    pairs = map(parser.tag_name_value, node)  # type: ignore[arg-type]\n    return (value for name, value in pairs if name == \"simplesect\")  # type: ignore[misc]\n\n\ndef get_images(node: parser.Node_docParaType) -> Iterable[parser.Node_docImageType]:\n    pairs = map(parser.tag_name_value, node)  # type: ignore[arg-type]\n    return (value for name, value in pairs if name == \"image\")  # type: ignore[misc]\n\n\ndef namespace_strip(config, nodes_: list[nodes.Node]):\n    # In some cases of errors with a declaration there are no nodes\n    # (e.g., variable in function), so perhaps skip (see #671).\n    # If there are nodes, there should be at least 2.\n    if len(nodes_) != 0:\n        assert len(nodes_) >= 2\n        rst_node = nodes_[1]\n        doc = rst_node.document\n        assert doc is not None\n        finder = NodeFinder(doc)\n        rst_node.walk(finder)\n\n        assert finder.declarator\n        # the type is set to \"Any\" to get around missing typing info in\n        # docutils 0.20.1\n        signode: Any = finder.declarator\n        signode.children = [n for n in signode.children if n.tagname != \"desc_addname\"]\n\n\nT_sphinxrenderer = TypeVar(\"T_sphinxrenderer\", bound=\"SphinxRenderer\")\n\n\nclass NodeHandler(Generic[T_sphinxrenderer, T]):\n    \"\"\"Dummy callable that associates a set of nodes to a function. This gets\n    unwrapped by NodeVisitor and is never actually called.\"\"\"\n\n    def __init__(self, handler: Callable[[T_sphinxrenderer, T], list[nodes.Node]]):\n        self.handler = handler\n        self.nodes: set[type[parser.NodeOrValue]] = set()\n\n    def __call__(self, r: T_sphinxrenderer, node: T, /) -> list[nodes.Node]:  # pragma: no cover\n        raise TypeError()\n\n\nclass TaggedNodeHandler(Generic[T_sphinxrenderer, T]):\n    \"\"\"Dummy callable that associates a set of nodes to a function. This gets\n    unwrapped by NodeVisitor and is never actually called.\"\"\"\n\n    def __init__(self, handler: Callable[[T_sphinxrenderer, str, T], list[nodes.Node]]):\n        self.handler = handler\n        self.nodes: set[type[parser.NodeOrValue]] = set()\n\n    def __call__(\n        self, r: T_sphinxrenderer, tag: str, node: T, /\n    ) -> list[nodes.Node]:  # pragma: no cover\n        raise TypeError()\n\n\ndef node_handler(node: type[parser.NodeOrValue]):\n    def inner(\n        f: Callable[[T_sphinxrenderer, T], list[nodes.Node]],\n    ) -> Callable[[T_sphinxrenderer, T], list[nodes.Node]]:\n        handler: NodeHandler = f if isinstance(f, NodeHandler) else NodeHandler(f)\n        handler.nodes.add(node)\n        return handler\n\n    return inner\n\n\ndef tagged_node_handler(node: type[parser.NodeOrValue]):\n    def inner(\n        f: Callable[[T_sphinxrenderer, str, T], list[nodes.Node]],\n    ) -> Callable[[T_sphinxrenderer, str, T], list[nodes.Node]]:\n        handler: TaggedNodeHandler = f if isinstance(f, TaggedNodeHandler) else TaggedNodeHandler(f)\n        handler.nodes.add(node)\n        return handler\n\n    return inner\n\n\nclass NodeVisitor(type):\n    \"\"\"Metaclass that collects all methods marked as @node_handler and\n    @tagged_node_handler into the dicts 'node_handlers' and\n    'tagged_node_handlers' respectively, and assigns the dicts to the class\"\"\"\n\n    def __new__(cls, name, bases, members):\n        handlers = {}\n        tagged_handlers = {}\n\n        for key, value in members.items():\n            if isinstance(value, NodeHandler):\n                for n in value.nodes:\n                    handlers[n] = value.handler\n                members[key] = value.handler\n            elif isinstance(value, TaggedNodeHandler):\n                for n in value.nodes:\n                    tagged_handlers[n] = value.handler\n                members[key] = value.handler\n\n        members[\"node_handlers\"] = handlers\n        members[\"tagged_node_handlers\"] = tagged_handlers\n\n        return type.__new__(cls, name, bases, members)\n\n\n# class RenderDebugPrint:\n#     def __init__(self,renderer,node):\n#         self.renderer = renderer\n#         renderer._debug_print_depth = 1 + getattr(renderer,'_debug_print_depth',0)\n#         print('  '*renderer._debug_print_depth,type(node))\n#\n#     def __enter__(self):\n#         return self\n#\n#     def __exit__(self,*args):\n#         self.renderer._debug_print_depth -= 1\n\n\nclass SphinxRenderer(metaclass=NodeVisitor):\n    \"\"\"\n    Doxygen node visitor that converts input into Sphinx/RST representation.\n    Each visit method takes a Doxygen node as an argument and returns a list of RST nodes.\n    \"\"\"\n\n    node_handlers: ClassVar[\n        dict[\n            type[parser.NodeOrValue],\n            Callable[[SphinxRenderer, parser.NodeOrValue], list[nodes.Node]],\n        ]\n    ]\n    tagged_node_handlers: ClassVar[\n        dict[\n            type[parser.NodeOrValue],\n            Callable[[SphinxRenderer, str, parser.NodeOrValue], list[nodes.Node]],\n        ]\n    ]\n\n    def __init__(\n        self,\n        app: Sphinx,\n        project_info: ProjectInfo,\n        node_stack: list[DataObject],\n        state,\n        document: nodes.document,\n        target_handler: TargetHandler,\n        dox_parser: parser.DoxygenParser,\n        filter_: DoxFilter,\n    ):\n        self.app = app\n\n        self.project_info = project_info\n        self.qualification_stack = node_stack\n        self.nesting_level = 0\n        self.state = state\n        self.document = document\n        self.target_handler = target_handler\n        self.dox_parser = dox_parser\n        self.filter_ = filter_\n\n        self.context: RenderContext | None = None\n        self.output_defname = True\n        # Nesting level for lists.\n        self.nesting_level = 0\n\n    def set_context(self, context: RenderContext) -> None:\n        self.context = context\n        if self.context.domain == \"\":\n            self.context.domain = self.get_domain()\n\n    # XXX: fix broken links in XML generated by Doxygen when Doxygen's\n    # SEPARATE_MEMBER_PAGES is set to YES; this function should be harmless\n    # when SEPARATE_MEMBER_PAGES is NO!\n    #\n    # The issue was discussed here: https://github.com/doxygen/doxygen/pull/7971\n    #\n    # A Doxygen anchor consists of a 32-byte string version of the results of\n    # passing in the stringified identifier or prototype that is being \"hashed\".\n    # An \"a\" character is then prefixed to mark it as an anchor. Depending on how\n    # the identifier is linked, it can also get a \"g\" prefix to mean it is part\n    # of a Doxygen group. This results in an id having either 33 or 34 bytes\n    # (containing a \"g\" or not). Some identifiers, eg enumerators, get twice that\n    # length to have both a unique enum + unique enumerator, and sometimes they\n    # get two \"g\" characters as prefix instead of one.\n    def _fixup_separate_member_pages(self, refid: str) -> str:\n        if refid:\n            parts = refid.rsplit(\"_\", 1)\n            if len(parts) == 2 and parts[1].startswith(\"1\"):\n                anchorid = parts[1][1:]\n                if len(anchorid) in {33, 34} and parts[0].endswith(anchorid):\n                    return parts[0][: -len(anchorid)] + parts[1]\n                elif len(anchorid) > 34:\n                    index = 0\n                    if anchorid.startswith(\"gg\"):\n                        index = 1\n                        _len = 35\n                    elif anchorid.startswith(\"g\"):\n                        _len = 34\n                    else:\n                        _len = 33\n                    if parts[0].endswith(anchorid[index:_len]):\n                        return parts[0][: -(_len - index)] + parts[1]\n\n        return refid\n\n    def get_refid(self, refid: str) -> str:\n        if self.app.config.breathe_separate_member_pages:\n            refid = self._fixup_separate_member_pages(refid)\n        if self.app.config.breathe_use_project_refids:\n            return \"%s%s\" % (self.project_info.name(), refid)\n        else:\n            return refid\n\n    def parse_compound(self, refid: str) -> parser.Node_DoxygenType:\n        return self.dox_parser.parse_compound(refid, self.project_info).root\n\n    def get_domain(self) -> str:\n        \"\"\"Returns the domain for the current node.\"\"\"\n\n        def get_filename(node) -> str | None:\n            \"\"\"Returns the name of a file where the declaration represented by node is located.\"\"\"\n            try:\n                return node.location.file\n            except AttributeError:\n                return None\n\n        assert self.context is not None\n\n        node_stack = self.context.node_stack\n        node = node_stack[0].value\n        # An enumvalueType node doesn't have location, so use its parent node\n        # for detecting the domain instead.\n        if isinstance(node, (str, parser.Node_enumvalueType)):\n            node = node_stack[1].value\n        filename = get_filename(node)\n        if not filename and isinstance(node, parser.Node_CompoundType):\n            file_data = self.parse_compound(node.refid)\n            filename = get_filename(file_data.compounddef)\n        return self.project_info.domain_for_file(filename) if filename else \"\"\n\n    def join_nested_name(self, names: list[str]) -> str:\n        dom = self.get_domain()\n        sep = \"::\" if not dom or dom == \"cpp\" else \".\"\n        return sep.join(names)\n\n    def run_directive(\n        self, obj_type: str, declaration: str, contentCallback: ContentCallback, options={}\n    ) -> list[nodes.Node]:\n        assert self.context is not None\n        args = [obj_type, [declaration]] + self.context.directive_args[2:]\n        directive = DomainDirectiveFactory.create(self.context.domain, args)\n\n        assert isinstance(directive, BaseObject)\n        directive.breathe_content_callback = contentCallback\n\n        # Translate Breathe's no-link option into the standard noindex option.\n        if \"no-link\" in self.context.directive_args[2]:\n            directive.options[\"noindex\"] = True\n        for k, v in options.items():\n            directive.options[k] = v\n\n        assert self.app.env is not None\n        config = self.app.env.config\n\n        if config.breathe_debug_trace_directives:  # pragma: no cover\n            global _debug_indent\n            print(\n                \"{}Running directive: .. {}:: {}\".format(\n                    \"  \" * _debug_indent, directive.name, declaration\n                )\n            )\n            _debug_indent += 1\n\n        self.nesting_level += 1\n        nodes_ = directive.run()\n        self.nesting_level -= 1\n\n        # TODO: the directive_args seems to be reused between different run_directives\n        #       so for now, reset the options.\n        #       Remove this once the args are given in a different manner.\n        for k, v in options.items():\n            del directive.options[k]\n\n        if config.breathe_debug_trace_directives:  # pragma: no cover\n            _debug_indent -= 1\n\n        # Filter out outer class names if we are rendering a member as a part of a class content.\n        if self.context.child:\n            namespace_strip(config, nodes_)\n        return nodes_\n\n    def handle_compounddef_declaration(\n        self,\n        node: parser.Node_compounddefType,\n        obj_type: str,\n        declaration: str,\n        file_data,\n        new_context,\n        parent_context,\n        display_obj_type: str | None = None,\n    ) -> list[nodes.Node]:\n        def content(contentnode) -> None:\n            if node.includes:\n                for include in node.includes:\n                    contentnode.extend(\n                        self.render(include, new_context.create_child_context(include))\n                    )\n            rendered_data = self.render(file_data, parent_context)\n            contentnode.extend(rendered_data)\n\n        return self.handle_declaration(\n            node, obj_type, declaration, content_callback=content, display_obj_type=display_obj_type\n        )\n\n    def handle_declaration(\n        self,\n        node: parser.Node_compounddefType | parser.Node_memberdefType | parser.Node_enumvalueType,\n        obj_type: str,\n        declaration: str,\n        *,\n        content_callback: ContentCallback | None = None,\n        display_obj_type: str | None = None,\n        declarator_callback: DeclaratorCallback | None = None,\n        options={},\n    ) -> list[nodes.Node]:\n        if content_callback is None:\n\n            def content(contentnode: addnodes.desc_content):\n                contentnode.extend(self.description(node))\n\n            content_callback = content\n        declaration = declaration.replace(\"\\n\", \" \")\n        nodes_ = self.run_directive(obj_type, declaration, content_callback, options)\n\n        assert self.app.env is not None\n        target = None\n        if self.app.env.config.breathe_debug_trace_doxygen_ids:\n            target = self.create_doxygen_target(node)\n            if len(target) == 0:\n                print(\"{}Doxygen target: (none)\".format(\"  \" * _debug_indent))\n            else:\n                print(\"{}Doxygen target: {}\".format(\"  \" * _debug_indent, target[0][\"ids\"]))\n\n        # <desc><desc_signature> and then one or more <desc_signature_line>\n        # each <desc_signature_line> has a sphinx_line_type which hints what is present in that line\n        # In some cases of errors with a declaration there are no nodes\n        # (e.g., variable in function), so perhaps skip (see #671).\n        if len(nodes_) == 0:\n            return []\n        assert len(nodes_) >= 2, nodes_\n        desc = nodes_[1]\n        assert isinstance(desc, addnodes.desc)\n        assert len(desc) >= 1\n        sig = desc[0]\n        assert isinstance(sig, addnodes.desc_signature)\n\n        # Insert the member name for use in Sphinx-generated table of contents.\n        if isinstance(node, parser.Node_compounddefType):\n            member_name = node.compoundname\n        else:\n            member_name = node.name\n        if obj_type == \"function\":\n            member_name += \"()\"\n        sig.attributes[\"_toc_name\"] = member_name\n        sig.attributes[\"_toc_parts\"] = member_name\n\n        # if may or may not be a multiline signature\n        isMultiline = sig.get(\"is_multiline\", False)\n        declarator: Declarator | None = None\n        if isMultiline:\n            for line in sig:\n                assert isinstance(line, addnodes.desc_signature_line)\n                if line.sphinx_line_type == \"declarator\":\n                    declarator = line\n        else:\n            declarator = sig\n        assert declarator is not None\n        if display_obj_type is not None:\n            n = declarator[0]\n            if self.get_domain() and self.get_domain() not in (\"c\", \"cpp\"):\n                assert isinstance(n, addnodes.desc_annotation)\n                assert n.astext()[-1] == \" \"\n                txt = display_obj_type + \" \"\n                declarator[0] = addnodes.desc_annotation(txt, txt)\n            else:\n                assert isinstance(n, addnodes.desc_sig_keyword)\n                declarator[0] = addnodes.desc_sig_keyword(display_obj_type, display_obj_type)\n        if target is None:\n            target = self.create_doxygen_target(node)\n        declarator.insert(0, target)\n        if declarator_callback:\n            declarator_callback(declarator)\n        return nodes_\n\n    def get_qualification(self) -> list[str]:\n        if self.nesting_level > 0:\n            return []\n\n        assert self.app.env is not None\n        config = self.app.env.config\n        if config.breathe_debug_trace_qualification:\n\n            def debug_print_node(n):\n                return f\"node_type={n.node_type}\"\n\n            global _debug_indent\n            print(\n                \"{}{}\".format(_debug_indent * \"  \", debug_print_node(self.qualification_stack[0]))\n            )\n            _debug_indent += 1\n\n        names: list[str] = []\n        for node in self.qualification_stack[1:]:\n            if config.breathe_debug_trace_qualification:\n                print(\"{}{}\".format(_debug_indent * \"  \", debug_print_node(node)))\n            if isinstance(node, parser.Node_refType) and len(names) == 0:\n                if config.breathe_debug_trace_qualification:\n                    print(\"{}{}\".format(_debug_indent * \"  \", \"res=\"))\n                return []\n            if (\n                isinstance(node, parser.Node_CompoundType)\n                and node.kind\n                not in [\n                    parser.CompoundKind.file,\n                    parser.CompoundKind.namespace,\n                    parser.CompoundKind.group,\n                ]\n            ) or isinstance(node, parser.Node_memberdefType):\n                # We skip the 'file' entries because the file name doesn't form part of the\n                # qualified name for the identifier. We skip the 'namespace' entries because if we\n                # find an object through the namespace 'compound' entry in the index.xml then we'll\n                # also have the 'compounddef' entry in our node stack and we'll get it from that. We\n                # need the 'compounddef' entry because if we find the object through the 'file'\n                # entry in the index.xml file then we need to get the namespace name from somewhere\n                names.append(node.name)\n            if (\n                isinstance(node, parser.Node_compounddefType)\n                and node.kind == parser.DoxCompoundKind.namespace\n            ):\n                # Nested namespaces include their parent namespace(s) in compoundname. ie,\n                # compoundname is 'foo::bar' instead of just 'bar' for namespace 'bar' nested in\n                # namespace 'foo'. We need full compoundname because node_stack doesn't necessarily\n                # include parent namespaces and we stop here in case it does.\n                names.extend(reversed(node.compoundname.split(\"::\")))\n                break\n\n        names.reverse()\n\n        if config.breathe_debug_trace_qualification:\n            print(\"{}res={}\".format(_debug_indent * \"  \", names))\n            _debug_indent -= 1\n        return names\n\n    # ===================================================================================\n\n    def get_fully_qualified_name(self):\n        assert self.context\n        names = []\n        node_stack = self.context.node_stack\n        node = node_stack[0]\n\n        # If the node is a namespace, use its name because namespaces are skipped in the main loop.\n        if (\n            isinstance(node.value, parser.Node_CompoundType)\n            and node.value.kind == parser.CompoundKind.namespace\n        ):\n            names.append(node.value.name)\n\n        for tval in node_stack:\n            node = tval.value\n            if isinstance(node, parser.Node_refType) and len(names) == 0:\n                return \"\".join(node)\n            if (\n                isinstance(node, parser.Node_CompoundType)\n                and node.kind\n                not in [\n                    parser.CompoundKind.file,\n                    parser.CompoundKind.namespace,\n                    parser.CompoundKind.group,\n                ]\n            ) or isinstance(node, parser.Node_memberdefType):\n                # We skip the 'file' entries because the file name doesn't form part of the\n                # qualified name for the identifier. We skip the 'namespace' entries because if we\n                # find an object through the namespace 'compound' entry in the index.xml then we'll\n                # also have the 'compounddef' entry in our node stack and we'll get it from that. We\n                # need the 'compounddef' entry because if we find the object through the 'file'\n                # entry in the index.xml file then we need to get the namespace name from somewhere\n                names.insert(0, node.name)\n            if (\n                isinstance(node, parser.Node_compounddefType)\n                and node.kind == parser.DoxCompoundKind.namespace\n            ):\n                # Nested namespaces include their parent namespace(s) in compoundname. ie,\n                # compoundname is 'foo::bar' instead of just 'bar' for namespace 'bar' nested in\n                # namespace 'foo'. We need full compoundname because node_stack doesn't necessarily\n                # include parent namespaces and we stop here in case it does.\n                names.insert(0, node.compoundname)\n                break\n\n        return \"::\".join(names)\n\n    def create_template_prefix(self, decl: HasTemplateParamList) -> str:\n        if not decl.templateparamlist:\n            return \"\"\n        nodes_ = self.render(decl.templateparamlist)\n        return \"template<\" + \"\".join(n.astext() for n in nodes_) + \">\"\n\n    def run_domain_directive(self, kind, names):\n        assert self.context\n\n        domain_directive = DomainDirectiveFactory.create(\n            self.context.domain, [kind, names] + self.context.directive_args[2:]\n        )\n\n        # Translate Breathe's no-link option into the standard noindex option.\n        if \"no-link\" in self.context.directive_args[2]:\n            domain_directive.options[\"noindex\"] = True\n\n        config = self.app.env.config\n        if config.breathe_debug_trace_directives:  # pragma: no cover\n            global _debug_indent\n            print(\n                \"{}Running directive (old): .. {}:: {}\".format(\n                    \"  \" * _debug_indent, domain_directive.name, \"\".join(names)\n                )\n            )\n            _debug_indent += 1\n\n        nodes_ = domain_directive.run()\n\n        if config.breathe_debug_trace_directives:  # pragma: no cover\n            _debug_indent -= 1\n\n        # Filter out outer class names if we are rendering a member as a part of a class content.\n        if self.context.child:\n            namespace_strip(config, nodes_)\n        return nodes_\n\n    def create_doxygen_target(self, node):\n        \"\"\"Can be overridden to create a target node which uses the doxygen refid information\n        which can be used for creating links between internal doxygen elements.\n\n        The default implementation should suffice most of the time.\n        \"\"\"\n\n        refid = self.get_refid(node.id)\n        return self.target_handler(self.document, refid)\n\n    def title(self, node) -> list[nodes.Node]:\n        nodes_ = []\n\n        # Variable type or function return type\n        nodes_.extend(self.render_optional(node.type_))\n        if nodes_:\n            nodes_.append(nodes.Text(\" \"))\n        nodes_.append(addnodes.desc_name(text=node.name))\n        return nodes_\n\n    def description(self, node: HasDescriptions) -> list[nodes.Node]:\n        brief = self.render_optional(node.briefdescription)\n        descr = node.detaileddescription\n        if isinstance(node, parser.Node_memberdefType):\n            params = [\n                parser.Node_docParamListItem(\n                    parameterdescription=p.briefdescription,\n                    parameternamelist=[\n                        parser.Node_docParamNameList(\n                            parametername=[parser.Node_docParamName([p.declname or \"\"])]\n                        )\n                    ],\n                )\n                for p in node.param\n                if p.briefdescription\n            ]\n\n            if params:\n                content: list[parser.ListItem_descriptionType] = []\n                content.append(\n                    parser.TaggedValue[Literal[\"para\"], parser.Node_docParaType](\n                        \"para\",\n                        parser.Node_docParaType([\n                            parser.TaggedValue[\n                                Literal[\"parameterlist\"], parser.Node_docParamListType\n                            ](\n                                \"parameterlist\",\n                                parser.Node_docParamListType(\n                                    params, kind=parser.DoxParamListKind.param\n                                ),\n                            )\n                        ]),\n                    )\n                )\n                title = None\n                if descr is not None:\n                    content.extend(descr)\n                    title = descr.title\n                descr = parser.Node_descriptionType(content, title=title)\n        detailed = self.detaileddescription(descr)\n        return brief + detailed\n\n    def detaileddescription(self, descr: parser.Node_descriptionType | None) -> list[nodes.Node]:\n        detailedCand = self.render_optional(descr)\n        # all field_lists must be at the top-level of the desc_content, so pull them up\n        fieldLists: list[nodes.field_list] = []\n        admonitions: list[nodes.Node] = []\n\n        def pullup(node, typ, dest):\n            for n in list(_findall_compat(node, typ)):\n                del n.parent[n.parent.index(n)]\n                dest.append(n)\n\n        detailed: list[nodes.Node] = []\n        for candNode in detailedCand:\n            pullup(candNode, nodes.field_list, fieldLists)\n            pullup(candNode, nodes.note, admonitions)\n            pullup(candNode, nodes.warning, admonitions)\n            # and collapse paragraphs\n            for para in _findall_compat(candNode, nodes.paragraph):\n                parent = para.parent\n                assert parent is None or isinstance(parent, nodes.Element)\n                if parent and len(parent) == 1 and isinstance(parent, nodes.paragraph):\n                    para.replace_self(para.children)\n\n            # and remove empty top-level paragraphs\n            if isinstance(candNode, nodes.paragraph) and len(candNode) == 0:\n                continue\n            detailed.append(candNode)\n\n        # make one big field list instead to the Sphinx transformer can make it pretty\n        if len(fieldLists) > 1:\n            fieldList = nodes.field_list()\n            for fl in fieldLists:\n                fieldList.extend(fl)\n            fieldLists = [fieldList]\n\n        # using \"extend\" instead of addition is slightly more verbose but is\n        # needed to get around the mypy issue\n        # https://github.com/python/mypy/issues/3933\n        if self.app.config.breathe_order_parameters_first:\n            detailed.extend(fieldLists)\n            detailed.extend(admonitions)\n        else:\n            detailed.extend(admonitions)\n            detailed.extend(fieldLists)\n        return detailed\n\n    def update_signature(self, signature, obj_type):\n        \"\"\"Update the signature node if necessary, e.g. add qualifiers.\"\"\"\n        prefix = obj_type + \" \"\n        annotation = addnodes.desc_annotation(prefix, prefix)\n        if signature[0].tagname != \"desc_name\":\n            signature[0] = annotation\n        else:\n            signature.insert(0, annotation)\n\n    def render_declaration(\n        self, node: parser.Node_memberdefType, declaration=None, description=None, **kwargs\n    ):\n        if declaration is None:\n            declaration = self.get_fully_qualified_name()\n        obj_type = kwargs.get(\"objtype\", None)\n        if obj_type is None:\n            obj_type = node.kind.value\n        nodes_ = self.run_domain_directive(obj_type, [declaration.replace(\"\\n\", \" \")])\n        target = None\n        if self.app.env.config.breathe_debug_trace_doxygen_ids:\n            target = self.create_doxygen_target(node)\n            if len(target) == 0:\n                print(\"{}Doxygen target (old): (none)\".format(\"  \" * _debug_indent))\n            else:\n                print(\"{}Doxygen target (old): {}\".format(\"  \" * _debug_indent, target[0][\"ids\"]))\n\n        rst_node = nodes_[1]\n        doc = rst_node.document\n        assert doc is not None\n        finder = NodeFinder(doc)\n        rst_node.walk(finder)\n\n        assert finder.declarator is not None\n        assert finder.content is not None\n        signode = finder.declarator\n        contentnode = finder.content\n\n        update_signature = kwargs.get(\"update_signature\", None)\n        if update_signature is not None:\n            update_signature(signode, obj_type)\n        if description is None:\n            description = self.description(node)\n        if not self.app.env.config.breathe_debug_trace_doxygen_ids:\n            target = self.create_doxygen_target(node)\n        assert target is not None\n        signode.insert(0, target)\n        contentnode.extend(description)\n        return nodes_\n\n    @node_handler(parser.Node_DoxygenTypeIndex)\n    def visit_doxygen(self, node: parser.Node_DoxygenTypeIndex) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = []\n\n        # Process all the compound children\n        for n in node.compound:\n            nodelist.extend(self.render(n))\n        return nodelist\n\n    @node_handler(parser.Node_DoxygenType)\n    def visit_doxygendef(self, node: parser.Node_DoxygenType) -> list[nodes.Node]:\n        assert len(node.compounddef) == 1\n        return self.render(node.compounddef[0])\n\n    def visit_union(self, node: HasRefID) -> list[nodes.Node]:\n        # Read in the corresponding xml file and process\n        file_data = self.parse_compound(node.refid)\n        assert len(file_data.compounddef) == 1\n        nodeDef = file_data.compounddef[0]\n\n        assert self.context is not None\n        parent_context = self.context.create_child_context(file_data)\n        new_context = parent_context.create_child_context(nodeDef)\n\n        with WithContext(self, new_context):\n            names = self.get_qualification()\n            if self.nesting_level == 0:\n                names.extend(nodeDef.compoundname.split(\"::\"))\n            else:\n                names.append(nodeDef.compoundname.split(\"::\")[-1])\n            declaration = self.join_nested_name(names)\n\n            nodes_ = self.handle_compounddef_declaration(\n                nodeDef, nodeDef.kind.value, declaration, file_data, new_context, parent_context\n            )\n        return nodes_\n\n    def visit_class(self, node: HasRefID) -> list[nodes.Node]:\n        # Read in the corresponding xml file and process\n        file_data = self.parse_compound(node.refid)\n        assert len(file_data.compounddef) == 1\n        nodeDef = file_data.compounddef[0]\n\n        assert self.context is not None\n        parent_context = self.context.create_child_context(file_data)\n        new_context = parent_context.create_child_context(nodeDef)\n\n        domain = self.get_domain()\n\n        with WithContext(self, new_context):\n            # Pretend that the signature is being rendered in context of the\n            # definition, for proper domain detection\n            kind = nodeDef.kind\n            # Defer to domains specific directive.\n\n            names = self.get_qualification()\n            # strip out any template arguments before splitting on '::', to\n            # avoid errors if a template specialization has qualified arguments\n            # (see examples/specific/cpp_ns_template_specialization)\n            cleaned_name, _sep, _rest = nodeDef.compoundname.partition(\"<\")\n            cname = split_name(cleaned_name)\n            if self.nesting_level == 0:\n                names.extend(cname)\n            else:\n                names.append(cname[-1])\n            decls = [\n                self.create_template_prefix(nodeDef),\n                self.join_nested_name(names),\n            ]\n            # add base classes\n            if len(nodeDef.basecompoundref) != 0:\n                decls.append(\":\")\n            first = True\n            for base in nodeDef.basecompoundref:\n                if not first:\n                    decls.append(\",\")\n                else:\n                    first = False\n                if base.prot is not None and domain != \"cs\":\n                    decls.append(base.prot.value)\n                if base.virt == parser.DoxVirtualKind.virtual:\n                    decls.append(\"virtual\")\n                decls.append(base[0])\n            declaration = \" \".join(decls)\n\n            assert kind in (\n                parser.DoxCompoundKind.class_,\n                parser.DoxCompoundKind.struct,\n                parser.DoxCompoundKind.interface,\n            )\n            display_obj_type = \"interface\" if kind == parser.DoxCompoundKind.interface else None\n            nodes_ = self.handle_compounddef_declaration(\n                nodeDef,\n                nodeDef.kind.value,\n                declaration,\n                file_data,\n                new_context,\n                parent_context,\n                display_obj_type,\n            )\n            if \"members-only\" in self.context.directive_args[2]:\n                assert len(nodes_) >= 2\n                assert isinstance(nodes_[1], addnodes.desc)\n                assert len(nodes_[1]) >= 2\n                assert isinstance(nodes_[1][1], addnodes.desc_content)\n                return list(nodes_[1][1].children)\n        return nodes_\n\n    def visit_namespace(self, node: HasRefID) -> list[nodes.Node]:\n        # Read in the corresponding xml file and process\n        file_data = self.parse_compound(node.refid)\n        assert len(file_data.compounddef) == 1\n        nodeDef = file_data.compounddef[0]\n\n        assert self.context is not None\n\n        parent_context = self.context.create_child_context(file_data)\n        new_context = parent_context.create_child_context(nodeDef)\n\n        with WithContext(self, new_context):\n            # Pretend that the signature is being rendered in context of the\n            # definition, for proper domain detection\n            names = self.get_qualification()\n            if self.nesting_level == 0:\n                names.extend(nodeDef.compoundname.split(\"::\"))\n            else:\n                names.append(nodeDef.compoundname.split(\"::\")[-1])\n            declaration = self.join_nested_name(names)\n\n            display_obj_type = \"namespace\" if self.get_domain() != \"py\" else \"module\"\n            nodes_ = self.handle_compounddef_declaration(\n                nodeDef,\n                nodeDef.kind.value,\n                declaration,\n                file_data,\n                new_context,\n                parent_context,\n                display_obj_type,\n            )\n        return nodes_\n\n    def visit_compound(\n        self,\n        node: HasRefID,\n        render_empty_node=True,\n        *,\n        get_node_info: Callable[[parser.Node_DoxygenType], tuple[str, parser.DoxCompoundKind]]\n        | None = None,\n        render_signature: Callable[\n            [parser.Node_DoxygenType, Sequence[nodes.Element], str, parser.DoxCompoundKind],\n            tuple[list[nodes.Node], addnodes.desc_content],\n        ]\n        | None = None,\n    ) -> list[nodes.Node]:\n        # Read in the corresponding xml file and process\n        file_data = self.parse_compound(node.refid)\n        assert len(file_data.compounddef) == 1\n\n        def def_get_node_info(file_data) -> tuple[str, parser.DoxCompoundKind]:\n            assert isinstance(node, parser.Node_CompoundType)\n            return node.name, parser.DoxCompoundKind(node.kind.value)\n\n        if get_node_info is None:\n            get_node_info = def_get_node_info\n\n        name, kind = get_node_info(file_data)\n        if kind == parser.DoxCompoundKind.union:\n            dom = self.get_domain()\n            assert not dom or dom in (\"c\", \"cpp\")\n            return self.visit_union(node)\n        elif kind in (\n            parser.DoxCompoundKind.struct,\n            parser.DoxCompoundKind.class_,\n            parser.DoxCompoundKind.interface,\n        ):\n            dom = self.get_domain()\n            if not dom or dom in (\"c\", \"cpp\", \"py\", \"cs\"):\n                return self.visit_class(node)\n        elif kind == parser.DoxCompoundKind.namespace:\n            dom = self.get_domain()\n            if not dom or dom in (\"c\", \"cpp\", \"py\", \"cs\"):\n                return self.visit_namespace(node)\n\n        assert self.context is not None\n\n        parent_context = self.context.create_child_context(file_data)\n        new_context = parent_context.create_child_context(file_data.compounddef[0])\n        rendered_data = self.render(file_data, parent_context)\n\n        if not rendered_data and not render_empty_node:\n            return []\n\n        def def_render_signature(\n            file_data: parser.Node_DoxygenType, doxygen_target, name, kind: parser.DoxCompoundKind\n        ) -> tuple[list[nodes.Node], addnodes.desc_content]:\n            # Defer to domains specific directive.\n\n            assert len(file_data.compounddef) == 1\n            templatePrefix = self.create_template_prefix(file_data.compounddef[0])\n            arg = \"%s %s\" % (templatePrefix, self.get_fully_qualified_name())\n\n            # add base classes\n            if kind in (parser.DoxCompoundKind.class_, parser.DoxCompoundKind.struct):\n                bs: list[str] = []\n                for base in file_data.compounddef[0].basecompoundref:\n                    b: list[str] = []\n                    if base.prot is not None:\n                        b.append(base.prot.value)\n                    if base.virt == parser.DoxVirtualKind.virtual:\n                        b.append(\"virtual\")\n                    b.append(base[0])\n                    bs.append(\" \".join(b))\n                if len(bs) != 0:\n                    arg += \" : \"\n                    arg += \", \".join(bs)\n\n            assert self.context is not None\n            self.context.directive_args[1] = [arg]\n\n            nodes_ = self.run_domain_directive(kind.value, self.context.directive_args[1])\n            rst_node = nodes_[1]\n\n            doc = rst_node.document\n            assert doc is not None\n            finder = NodeFinder(doc)\n            rst_node.walk(finder)\n            assert finder.declarator is not None\n            assert finder.content is not None\n\n            if kind in (parser.CompoundKind.interface, parser.CompoundKind.namespace):\n                # This is not a real C++ declaration type that Sphinx supports,\n                # so we hax the replacement of it.\n                finder.declarator[0] = addnodes.desc_annotation(kind.value + \" \", kind.value + \" \")\n\n            rst_node.children[0].insert(0, doxygen_target)\n            return nodes_, finder.content\n\n        if render_signature is None:\n            render_signature = def_render_signature\n\n        refid = self.get_refid(node.refid)\n        with WithContext(self, new_context):\n            # Pretend that the signature is being rendered in context of the\n            # definition, for proper domain detection\n            nodes_, contentnode = render_signature(\n                file_data, self.target_handler(self.document, refid), name, kind\n            )\n\n        if file_data.compounddef[0].includes:\n            for include in file_data.compounddef[0].includes:\n                contentnode.extend(self.render(include, new_context.create_child_context(include)))\n\n        contentnode.extend(rendered_data)\n        return nodes_\n\n    def visit_file(self, node: parser.Node_CompoundType) -> list[nodes.Node]:\n        def render_signature(\n            file_data, doxygen_target, name, kind\n        ) -> tuple[list[nodes.Node], addnodes.desc_content]:\n            assert self.context is not None\n            options = self.context.directive_args[2]\n            rst_node: nodes.container | addnodes.desc\n\n            if \"content-only\" in options:\n                rst_node = nodes.container()\n            else:\n                rst_node = addnodes.desc()\n\n                # Build targets for linking\n                targets = []\n                targets.extend(doxygen_target)\n\n                title_signode = addnodes.desc_signature()\n                title_signode.extend(targets)\n\n                # Set up the title\n                #\n                # For groups & pages we render the 'title' instead of the 'name'\n                # as it more human friendly\n                if kind in [DoxCompoundKind.group, DoxCompoundKind.page] and file_data.compounddef:\n                    if \"no-title\" not in options:\n                        title_signode.append(nodes.emphasis(text=kind.value))\n                        title_signode.append(nodes.Text(\" \"))\n                        title_signode.append(\n                            addnodes.desc_name(text=file_data.compounddef[0].title)\n                        )\n                else:\n                    title_signode.append(nodes.emphasis(text=kind.value))\n                    title_signode.append(nodes.Text(\" \"))\n                    title_signode.append(addnodes.desc_name(text=name))\n\n                rst_node.append(title_signode)\n\n            rst_node.document = self.state.document\n            rst_node[\"objtype\"] = kind.value\n            rst_node[\"domain\"] = self.get_domain() or \"cpp\"\n\n            contentnode = addnodes.desc_content()\n            rst_node.append(contentnode)\n\n            return [rst_node], contentnode\n\n        return self.visit_compound(node, render_signature=render_signature)\n\n    # We store both the identified and appropriate title text here as we want to define the order\n    # here and the titles for the SectionDefTypeSubRenderer but we don't want the repetition of\n    # having two lists in case they fall out of sync\n    #\n    # If this list is edited, also change the sections option documentation for\n    # the doxygen(auto)file directive in documentation/source/file.rst.\n    sections = [\n        (parser.DoxSectionKind.user_defined, \"User Defined\"),\n        (parser.DoxSectionKind.public_type, \"Public Types\"),\n        (parser.DoxSectionKind.public_func, \"Public Functions\"),\n        (parser.DoxSectionKind.public_attrib, \"Public Members\"),\n        (parser.DoxSectionKind.public_slot, \"Public Slots\"),\n        (parser.DoxSectionKind.signal, \"Signals\"),\n        (parser.DoxSectionKind.dcop_func, \"DCOP Function\"),\n        (parser.DoxSectionKind.property, \"Properties\"),\n        (parser.DoxSectionKind.event, \"Events\"),\n        (parser.DoxSectionKind.public_static_func, \"Public Static Functions\"),\n        (parser.DoxSectionKind.public_static_attrib, \"Public Static Attributes\"),\n        (parser.DoxSectionKind.protected_type, \"Protected Types\"),\n        (parser.DoxSectionKind.protected_func, \"Protected Functions\"),\n        (parser.DoxSectionKind.protected_attrib, \"Protected Attributes\"),\n        (parser.DoxSectionKind.protected_slot, \"Protected Slots\"),\n        (parser.DoxSectionKind.protected_static_func, \"Protected Static Functions\"),\n        (parser.DoxSectionKind.protected_static_attrib, \"Protected Static Attributes\"),\n        (parser.DoxSectionKind.package_type, \"Package Types\"),\n        (parser.DoxSectionKind.package_func, \"Package Functions\"),\n        (parser.DoxSectionKind.package_attrib, \"Package Attributes\"),\n        (parser.DoxSectionKind.package_static_func, \"Package Static Functions\"),\n        (parser.DoxSectionKind.package_static_attrib, \"Package Static Attributes\"),\n        (parser.DoxSectionKind.private_type, \"Private Types\"),\n        (parser.DoxSectionKind.private_func, \"Private Functions\"),\n        (parser.DoxSectionKind.private_attrib, \"Private Members\"),\n        (parser.DoxSectionKind.private_slot, \"Private Slots\"),\n        (parser.DoxSectionKind.private_static_func, \"Private Static Functions\"),\n        (parser.DoxSectionKind.private_static_attrib, \"Private Static Attributes\"),\n        (parser.DoxSectionKind.friend, \"Friends\"),\n        (parser.DoxSectionKind.related, \"Related\"),\n        (parser.DoxSectionKind.define, \"Defines\"),\n        (parser.DoxSectionKind.prototype, \"Prototypes\"),\n        (parser.DoxSectionKind.typedef, \"Typedefs\"),\n        # (parser.DoxSectionKind.concept, \"Concepts\"),\n        (parser.DoxSectionKind.enum, \"Enums\"),\n        (parser.DoxSectionKind.func, \"Functions\"),\n        (parser.DoxSectionKind.var, \"Variables\"),\n    ]\n\n    def render_iterable(\n        self, iterable: Iterable[parser.NodeOrValue], tag: str | None = None\n    ) -> list[nodes.Node]:\n        output: list[nodes.Node] = []\n        for entry in iterable:\n            output.extend(self.render(entry, tag=tag))\n        return output\n\n    def render_tagged_iterable(\n        self, iterable: Iterable[parser.TaggedValue[str, parser.NodeOrValue] | str]\n    ) -> list[nodes.Node]:\n        output: list[nodes.Node] = []\n        for entry in iterable:\n            output.extend(self.render_tagged(entry))\n        return output\n\n    @node_handler(parser.Node_compounddefType)\n    def visit_compounddef(self, node: parser.Node_compounddefType) -> list[nodes.Node]:\n        assert self.context is not None\n        options = self.context.directive_args[2]\n        section_order = None\n        if \"sections\" in options:\n            section_order = {sec: i for i, sec in enumerate(options[\"sections\"].split(\" \"))}\n        membergroup_order = None\n        if \"membergroups\" in options:\n            membergroup_order = {sec: i for i, sec in enumerate(options[\"membergroups\"].split(\" \"))}\n        nodemap: dict[int, list[nodes.Node]] = {}\n\n        def addnode(kind: str, lam):\n            if section_order is None:\n                nodemap[len(nodemap)] = lam()\n            elif kind in section_order:\n                nodemap.setdefault(section_order[kind], []).extend(lam())\n\n        if \"members-only\" not in options:\n            if \"allow-dot-graphs\" in options:\n                addnode(\n                    \"incdepgraph\", lambda: self.render_optional(node.incdepgraph, \"incdepgraph\")\n                )\n                addnode(\n                    \"invincdepgraph\",\n                    lambda: self.render_optional(node.invincdepgraph, \"invincdepgraph\"),\n                )\n                addnode(\n                    \"inheritancegraph\",\n                    lambda: self.render_optional(node.inheritancegraph, \"inheritancegraph\"),\n                )\n                addnode(\n                    \"collaborationgraph\",\n                    lambda: self.render_optional(node.collaborationgraph, \"collaborationgraph\"),\n                )\n\n            addnode(\"briefdescription\", lambda: self.render_optional(node.briefdescription))\n            addnode(\n                \"detaileddescription\", lambda: self.detaileddescription(node.detaileddescription)\n            )\n\n            def render_derivedcompoundref(node):\n                if node is None:\n                    return []\n                output = self.render_iterable(node)\n                if not output:\n                    return []\n                return [\n                    nodes.paragraph(\n                        \"\", \"\", nodes.Text(\"Subclassed by \"), *intersperse(output, nodes.Text(\", \"))\n                    )\n                ]\n\n            addnode(\n                \"derivedcompoundref\", lambda: render_derivedcompoundref(node.derivedcompoundref)\n            )\n\n        section_nodelists: dict[str, list[nodes.Node]] = {}\n\n        # Get all sub sections\n        for sectiondef in node.sectiondef:\n            kind = sectiondef.kind\n            if section_order is not None and kind.value not in section_order:\n                continue\n            header = sectiondef.header\n            if membergroup_order is not None and header not in membergroup_order:\n                continue\n            child_nodes = self.render(sectiondef)\n            if not child_nodes:\n                # Skip empty section\n                continue\n            rst_node = nodes.container(classes=[\"breathe-sectiondef\"])\n            rst_node.document = self.state.document\n            rst_node[\"objtype\"] = kind.value\n            rst_node.extend(child_nodes)\n            # We store the nodes as a list against the kind in a dictionary as the kind can be\n            # 'user-edited' and that can repeat so this allows us to collect all the 'user-edited'\n            # entries together\n            section_nodelists.setdefault(kind.value, []).append(rst_node)\n\n        # Order the results in an appropriate manner\n        for kind, _ in self.sections:\n            addnode(kind.value, lambda: section_nodelists.get(kind.value, []))\n\n        # Take care of innerclasses\n        addnode(\"innerclass\", lambda: self.render_iterable(node.innerclass, \"innerclass\"))\n        addnode(\n            \"innernamespace\", lambda: self.render_iterable(node.innernamespace, \"innernamespace\")\n        )\n\n        if \"inner\" in options:\n            for cnode in node.innergroup:\n                file_data = self.parse_compound(cnode.refid)\n                assert len(file_data.compounddef) == 1\n                inner = file_data.compounddef[0]\n                addnode(\"innergroup\", lambda: self.visit_compounddef(inner))\n\n        nodelist = []\n        for _, nodes_ in sorted(nodemap.items()):\n            nodelist += nodes_\n\n        return nodelist\n\n    section_titles = dict(sections)\n\n    @node_handler(parser.Node_sectiondefType)\n    def visit_sectiondef(self, node: parser.Node_sectiondefType) -> list[nodes.Node]:\n        assert self.context is not None\n        options = self.context.directive_args[2]\n        node_list = []\n        node_list.extend(self.render_optional(node.description))\n\n        # Get all the memberdef info\n        member_def: Iterable[parser.Node_memberdefType]\n        if \"sort\" in options:\n            member_def = sorted(node.memberdef, key=lambda x: x.name)\n        else:\n            member_def = node.memberdef\n\n        node_list.extend(self.render_iterable(member_def))\n\n        if node_list:\n            if \"members-only\" in options:\n                return node_list\n\n            text = self.section_titles[node.kind]\n            # Override default name for user-defined sections. Use \"Unnamed\n            # Group\" if the user didn't name the section\n            # This is different to Doxygen which will track the groups and name\n            # them Group1, Group2, Group3, etc.\n            if node.kind == parser.DoxSectionKind.user_defined:\n                if node.header:\n                    text = node.header\n                else:\n                    text = \"Unnamed Group\"\n\n            # Use rubric for the title because, unlike the docutils element \"section\",\n            # it doesn't interfere with the document structure.\n            idtext = text.replace(\" \", \"-\").lower()\n            rubric = nodes.rubric(\n                text=text,\n                classes=[\"breathe-sectiondef-title\"],\n                ids=[\"breathe-section-title-\" + idtext],\n            )\n            res: list[nodes.Node] = [rubric]\n            return res + node_list\n        return []\n\n    @node_handler(parser.Node_docRefTextType)\n    @node_handler(parser.Node_refTextType)\n    def visit_docreftext(\n        self, node: parser.Node_docRefTextType | parser.Node_incType | parser.Node_refTextType\n    ) -> list[nodes.Node]:\n        nodelist: list[nodes.Node]\n\n        if isinstance(node, parser.Node_incType):\n            nodelist = self.render_iterable(node)\n        else:\n            nodelist = self.render_tagged_iterable(node)\n\n            # TODO: \"para\" in compound.xsd is an empty tag; figure out what this\n            # is supposed to do\n            # for name, value in map(parser.tag_name_value, node):\n            #     if name == \"para\":\n            #         nodelist.extend(self.render(value))\n\n        refid = self.get_refid(node.refid or \"\")\n\n        assert nodelist\n        nodelist = [\n            addnodes.pending_xref(\n                \"\",\n                reftype=\"ref\",\n                refdomain=\"std\",\n                refexplicit=True,\n                refid=refid,\n                reftarget=refid,\n                *nodelist,\n            )\n        ]\n        return nodelist\n\n    @node_handler(parser.Node_docHeadingType)\n    def visit_docheading(self, node: parser.Node_docHeadingType) -> list[nodes.Node]:\n        \"\"\"Heading renderer.\n\n        Renders embedded headlines as emphasized text. Different heading levels\n        are not supported.\n        \"\"\"\n        nodelist = self.render_tagged_iterable(node)\n        return [nodes.emphasis(\"\", \"\", *nodelist)]\n\n    @node_handler(parser.Node_docParaType)\n    def visit_docpara(self, node: parser.Node_docParaType) -> list[nodes.Node]:\n        \"\"\"\n        <para> tags in the Doxygen output tend to contain either text or a single other tag of\n        interest. So whilst it looks like we're combined descriptions and program listings and\n        other things, in the end we generally only deal with one per para tag. Multiple\n        neighbouring instances of these things tend to each be in a separate neighbouring para tag.\n        \"\"\"\n\n        nodelist = []\n\n        if self.context and self.context.directive_args[0] == \"doxygenpage\":\n            nodelist.extend(self.render_tagged_iterable(node))\n        else:\n            contentNodeCands = []\n            for item in get_content(node):\n                contentNodeCands.extend(self.render_tagged(item))\n            # if there are consecutive nodes.Text we should collapse them\n            # and rerender them to ensure the right paragraphifaction\n            contentNodes: list[nodes.Node] = []\n            for n in contentNodeCands:\n                if len(contentNodes) != 0 and isinstance(contentNodes[-1], nodes.Text):\n                    if isinstance(n, nodes.Text):\n                        prev = contentNodes.pop()\n                        contentNodes.extend(self.render_string(prev.astext() + n.astext()))\n                        continue  # we have handled this node\n                contentNodes.append(n)\n            nodelist.extend(contentNodes)\n            nodelist.extend(self.render_iterable(get_images(node)))\n\n            paramList = self.render_iterable(get_parameterlists(node))\n            defs = []\n            fields = []\n            for n in self.render_iterable(get_simplesects(node)):\n                if isinstance(n, nodes.definition_list_item):\n                    defs.append(n)\n                elif isinstance(n, nodes.field_list):\n                    fields.append(n)\n                else:\n                    nodelist.append(n)\n\n            # note: all these gets pulled up and reordered in description()\n            if len(defs) != 0:\n                deflist = nodes.definition_list(\"\", *defs)\n                nodelist.append(deflist)\n            nodelist.extend(paramList)\n            nodelist.extend(fields)\n\n        # And now all kinds of cleanup steps\n        # ----------------------------------\n\n        # trim trailing whitespace\n        while len(nodelist) != 0:\n            last = nodelist[-1]\n            if not isinstance(last, nodes.Text):\n                break\n            if last.astext().strip() != \"\":\n                break\n            nodelist.pop()\n\n        # https://github.com/breathe-doc/breathe/issues/827\n        # verbatim nodes should not be in a paragraph:\n        if len(nodelist) == 1 and isinstance(nodelist[0], nodes.literal_block):\n            return nodelist\n\n        return [nodes.paragraph(\"\", \"\", *nodelist)]\n\n    visit_docparblock = node_handler(parser.Node_docParBlockType)(render_iterable)\n\n    @node_handler(parser.Node_docBlockQuoteType)\n    def visit_docblockquote(self, node: parser.Node_docBlockQuoteType) -> list[nodes.Node]:\n        nodelist = self.render_iterable(node)\n        # catch block quote attributions here; the <ndash/> tag is the only identifier,\n        # and it is nested within a subsequent <para> tag\n        if nodelist and nodelist[-1].astext().startswith(\"&#8212;\"):\n            # nodes.attribution prepends the author with an emphasized dash.\n            # replace the &#8212; placeholder and strip any leading whitespace.\n            text = nodelist[-1].astext().replace(\"&#8212;\", \"\").lstrip()\n            nodelist[-1] = nodes.attribution(\"\", text)\n        return [nodes.block_quote(\"\", classes=[], *nodelist)]\n\n    @node_handler(parser.Node_docImageType)\n    def visit_docimage(self, node: parser.Node_docImageType) -> list[nodes.Node]:\n        \"\"\"Output docutils image node using name attribute from xml as the uri\"\"\"\n\n        path_to_image = node.name\n        if path_to_image is None:\n            path_to_image = \"\"\n        elif not url_re.match(path_to_image):\n            path_to_image = self.project_info.sphinx_abs_path_to_file(path_to_image)\n\n        options = {\"uri\": path_to_image}\n        return [nodes.image(\"\", **options)]\n\n    @node_handler(parser.Node_docURLLink)\n    def visit_docurllink(self, node: parser.Node_docURLLink) -> list[nodes.Node]:\n        \"\"\"Url Link Renderer\"\"\"\n\n        nodelist = self.render_tagged_iterable(node)\n        return [nodes.reference(\"\", \"\", refuri=node.url, *nodelist)]\n\n    @tagged_node_handler(parser.Node_docMarkupType)\n    def visit_docmarkup(self, tag: str, node: parser.Node_docMarkupType) -> list[nodes.Node]:\n        nodelist = self.render_tagged_iterable(node)\n        creator: type[nodes.TextElement] = nodes.inline\n        if tag == \"emphasis\":\n            creator = nodes.emphasis\n        elif tag == \"computeroutput\":\n            creator = nodes.literal\n        elif tag == \"bold\":\n            creator = nodes.strong\n        elif tag == \"superscript\":\n            creator = nodes.superscript\n        elif tag == \"subscript\":\n            creator = nodes.subscript\n        elif tag == \"center\":\n            print(\"Warning: does not currently handle 'center' text display\")\n        elif tag == \"small\":\n            print(\"Warning: does not currently handle 'small' text display\")\n        return [creator(\"\", \"\", *nodelist)]\n\n    @node_handler(parser.Node_docSect1Type)\n    def visit_docsect1(self, node: parser.Node_docSect1Type) -> list[nodes.Node]:\n        return self.visit_docsectN(node, 0)\n\n    @node_handler(parser.Node_docSect2Type)\n    def visit_docsect2(self, node: parser.Node_docSect2Type) -> list[nodes.Node]:\n        return self.visit_docsectN(node, 1)\n\n    @node_handler(parser.Node_docSect3Type)\n    def visit_docsect3(self, node: parser.Node_docSect3Type) -> list[nodes.Node]:\n        return self.visit_docsectN(node, 2)\n\n    def visit_docsectN(\n        self,\n        node: parser.Node_docSect1Type | parser.Node_docSect2Type | parser.Node_docSect3Type,\n        depth: int,\n    ) -> list[nodes.Node]:\n        \"\"\"\n        Docutils titles are defined by their level inside the document.\n\n        Doxygen command mapping to XML element name:\n        @section == sect1, @subsection == sect2, @subsubsection == sect3\n        \"\"\"\n        # sect2 and sect3 elements can appear outside of sect1/sect2 elements so\n        # we need to check how deep we actually are\n        actual_d = 0\n        assert self.context\n        for n in self.context.node_stack[1:]:\n            if isinstance(\n                n.value,\n                (parser.Node_docSect1Type, parser.Node_docSect2Type, parser.Node_docSect3Type),\n            ):\n                actual_d += 1\n\n        title_nodes = self.render_tagged_iterable(node.title) if node.title else []\n        if actual_d == depth:\n            section = nodes.section()\n            section[\"ids\"].append(self.get_refid(node.id))\n            section += nodes.title(\"\", \"\", *title_nodes)\n            section += self.create_doxygen_target(node)\n            section += self.render_tagged_iterable(node)\n            return [section]\n        else:\n            # If the actual depth doesn't match the specified depth, don't\n            # create a section element, just use an emphasis element as the\n            # title.\n            #\n            # This is probably not the best way to handle such a case. I chose\n            # it because it's what visit_docheading does. It shouldn't come up\n            # often, anyway.\n            #     -- Rouslan\n            content: list[nodes.Node] = [nodes.emphasis(\"\", \"\", *title_nodes)]\n            content.extend(self.create_doxygen_target(node))\n            content.extend(self.render_tagged_iterable(node))\n            return content\n\n    @node_handler(parser.Node_docSimpleSectType)\n    def visit_docsimplesect(self, node: parser.Node_docSimpleSectType) -> list[nodes.Node]:\n        \"\"\"Other Type documentation such as Warning, Note, Returns, etc\"\"\"\n\n        # for those that should go into a field list, just render them as that,\n        # and it will be pulled up later\n        nodelist = self.render_iterable(node.para)\n\n        if node.kind in (\n            parser.DoxSimpleSectKind.pre,\n            parser.DoxSimpleSectKind.post,\n            parser.DoxSimpleSectKind.return_,\n        ):\n            return [\n                nodes.field_list(\n                    \"\",\n                    nodes.field(\n                        \"\",\n                        nodes.field_name(\"\", nodes.Text(node.kind.value)),\n                        nodes.field_body(\"\", *nodelist),\n                    ),\n                )\n            ]\n        elif node.kind == parser.DoxSimpleSectKind.warning:\n            return [nodes.warning(\"\", *nodelist)]\n        elif node.kind == parser.DoxSimpleSectKind.note:\n            return [nodes.note(\"\", *nodelist)]\n        elif node.kind == parser.DoxSimpleSectKind.see:\n            return [addnodes.seealso(\"\", *nodelist)]\n        elif node.kind == parser.DoxSimpleSectKind.remark:\n            nodelist.insert(0, nodes.title(\"\", nodes.Text(node.kind.value.capitalize())))\n            return [nodes.admonition(\"\", classes=[node.kind.value], *nodelist)]\n\n        if node.kind == parser.DoxSimpleSectKind.par:\n            text = self.render(node.title)\n        else:\n            text = [nodes.Text(node.kind.value.capitalize())]\n        # TODO: is this working as intended? there is something strange with the types\n        title = nodes.strong(\"\", \"\", *text)\n\n        term = nodes.term(\"\", \"\", title)\n        definition = nodes.definition(\"\", *nodelist)\n\n        return [nodes.definition_list_item(\"\", term, definition)]\n\n    visit_doctitle = node_handler(parser.Node_docTitleType)(render_tagged_iterable)\n\n    @node_handler(parser.Node_docFormulaType)\n    def visit_docformula(self, node: parser.Node_docFormulaType) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = []\n        for latex in node:\n            docname = self.state.document.settings.env.docname\n            # Strip out the doxygen markup that slips through\n            # Either inline\n            if latex.startswith(\"$\") and latex.endswith(\"$\"):\n                latex = latex[1:-1]\n                nodelist.append(\n                    nodes.math(text=latex, label=None, nowrap=False, docname=docname, number=None)\n                )\n            # Else we're multiline\n            else:\n                if latex.startswith(\"\\\\[\") and latex.endswith(\"\\\\]\"):\n                    latex = latex[2:-2:]\n\n                nodelist.append(\n                    nodes.math_block(\n                        text=latex, label=None, nowrap=False, docname=docname, number=None\n                    )\n                )\n        return nodelist\n\n    @node_handler(parser.Node_listingType)\n    def visit_listing(self, node: parser.Node_listingType) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = []\n        for i, item in enumerate(node.codeline):\n            # Put new lines between the lines\n            if i:\n                nodelist.append(nodes.Text(\"\\n\"))\n            nodelist.extend(self.render(item))\n\n        # Add blank string at the start otherwise for some reason it renders\n        # the pending_xref tags around the kind in plain text\n        block = nodes.literal_block(\"\", \"\", *nodelist)\n        domain = filetypes.get_pygments_alias(node.filename or \"\") or filetypes.get_extension(\n            node.filename or \"\"\n        )\n        if domain:\n            block[\"language\"] = domain\n        return [block]\n\n    @node_handler(parser.Node_codelineType)\n    def visit_codeline(self, node: parser.Node_codelineType) -> list[nodes.Node]:\n        return self.render_iterable(node.highlight)\n\n    visit_highlight = node_handler(parser.Node_highlightType)(render_tagged_iterable)\n\n    def _nested_inline_parse_with_titles(self, content, node) -> str:\n        \"\"\"\n        This code is basically a customized nested_parse_with_titles from\n        docutils, using the InlineText class on the statemachine.\n        \"\"\"\n        surrounding_title_styles = self.state.memo.title_styles\n        surrounding_section_level = self.state.memo.section_level\n        self.state.memo.title_styles = []\n        self.state.memo.section_level = 0\n        try:\n            return self.state.nested_parse(\n                content,\n                0,\n                node,\n                match_titles=1,\n                state_machine_kwargs={\n                    \"state_classes\": (InlineText,),\n                    \"initial_state\": \"InlineText\",\n                },\n            )\n        finally:\n            self.state.memo.title_styles = surrounding_title_styles\n            self.state.memo.section_level = surrounding_section_level\n\n    def visit_verbatim(self, node: str) -> list[nodes.Node]:\n        if not node.strip().startswith(\"embed:rst\"):\n            # Remove trailing new lines. Purely subjective call from viewing results\n            text = node.rstrip()\n\n            # Handle has a preformatted text\n            return [nodes.literal_block(text, text)]\n\n        is_inline = False\n\n        # do we need to strip leading asterisks?\n        # NOTE: We could choose to guess this based on every line starting with '*'.\n        #   However This would have a side-effect for any users who have an rst-block\n        #   consisting of a simple bullet list.\n        #   For now we just look for an extended embed tag\n        if node.strip().startswith(\"embed:rst:leading-asterisk\"):\n            lines: Iterable[str] = node.splitlines()\n            # Replace the first * on each line with a blank space\n            lines = [text.replace(\"*\", \" \", 1) for text in lines]\n            node = \"\\n\".join(lines)\n\n        # do we need to strip leading ///?\n        elif node.strip().startswith(\"embed:rst:leading-slashes\"):\n            lines = node.splitlines()\n            # Replace the /// on each line with three blank spaces\n            lines = [text.replace(\"///\", \"   \", 1) for text in lines]\n            node = \"\\n\".join(lines)\n\n        elif node.strip().startswith(\"embed:rst:inline\"):\n            # Inline all text inside the verbatim\n            node = \"\".join(node.splitlines())\n            is_inline = True\n\n        if is_inline:\n            node = node.replace(\"embed:rst:inline\", \"\", 1)\n        else:\n            # Remove the first line which is \"embed:rst[:leading-asterisk]\"\n            node = \"\\n\".join(node.split(\"\\n\")[1:])\n\n            # Remove starting whitespace\n            node = textwrap.dedent(node)\n\n        # Inspired by autodoc.py in Sphinx\n        rst = StringList()\n        for line in node.split(\"\\n\"):\n            rst.append(line, \"<breathe>\")\n\n        # Parent node for the generated node subtree\n        rst_node: nodes.Node\n        if is_inline:\n            rst_node = nodes.inline()\n        else:\n            rst_node = nodes.paragraph()\n        rst_node.document = self.state.document\n\n        # Generate node subtree\n        if is_inline:\n            self._nested_inline_parse_with_titles(rst, rst_node)\n        else:\n            nested_parse_with_titles(self.state, rst, rst_node)\n\n        return [rst_node]\n\n    @node_handler(parser.Node_incType)\n    def visit_inc(self, node: parser.Node_incType) -> list[nodes.Node]:\n        if not self.app.config.breathe_show_include:\n            return []\n\n        compound_link: list[nodes.Node] = [nodes.Text(\"\".join(node))]\n        if node.refid:\n            compound_link = self.visit_docreftext(node)\n        if node.local:\n            text = [nodes.Text('#include \"'), *compound_link, nodes.Text('\"')]\n        else:\n            text = [nodes.Text(\"#include <\"), *compound_link, nodes.Text(\">\")]\n\n        return [nodes.container(\"\", nodes.emphasis(\"\", \"\", *text))]\n\n    @node_handler(parser.Node_refType)\n    def visit_ref(self, node: parser.Node_refType) -> list[nodes.Node]:\n        def get_node_info(file_data: parser.Node_DoxygenType):\n            name = \"\".join(node)\n            name = name.rsplit(\"::\", 1)[-1]\n            assert len(file_data.compounddef) == 1\n            return name, file_data.compounddef[0].kind\n\n        return self.visit_compound(node, False, get_node_info=get_node_info)\n\n    @node_handler(parser.Node_docListItemType)\n    def visit_doclistitem(self, node: parser.Node_docListItemType) -> list[nodes.Node]:\n        \"\"\"List item renderer. Render all the children depth-first.\n        Upon return expand the children node list into a docutils list-item.\n        \"\"\"\n        nodelist = self.render_iterable(node)\n        return [nodes.list_item(\"\", *nodelist)]\n\n    numeral_kind = [\"arabic\", \"loweralpha\", \"lowerroman\", \"upperalpha\", \"upperroman\"]\n\n    def render_unordered(self, children) -> list[nodes.Node]:\n        nodelist_list = nodes.bullet_list(\"\", *children)\n        return [nodelist_list]\n\n    def render_enumerated(self, children, nesting_level) -> list[nodes.Node]:\n        nodelist_list = nodes.enumerated_list(\"\", *children)\n        idx = nesting_level % len(SphinxRenderer.numeral_kind)\n        nodelist_list[\"enumtype\"] = SphinxRenderer.numeral_kind[idx]\n        nodelist_list[\"prefix\"] = \"\"\n        nodelist_list[\"suffix\"] = \".\"\n        return [nodelist_list]\n\n    @tagged_node_handler(parser.Node_docListType)\n    def visit_doclist(self, tag: str, node: parser.Node_docListType) -> list[nodes.Node]:\n        \"\"\"List renderer\n\n        The specifics of the actual list rendering are handled by the\n        decorator around the generic render function.\n        Render all the children depth-first.\"\"\"\n        \"\"\" Call the wrapped render function. Update the nesting level for the enumerated lists. \"\"\"\n        if tag == \"itemizedlist\":\n            val = self.render_iterable(node)\n            return self.render_unordered(children=val)\n        elif tag == \"orderedlist\":\n            self.nesting_level += 1\n            val = self.render_iterable(node)\n            self.nesting_level -= 1\n            return self.render_enumerated(children=val, nesting_level=self.nesting_level)\n        return []\n\n    @node_handler(parser.Node_compoundRefType)\n    def visit_compoundref(self, node: parser.Node_compoundRefType) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = self.render_iterable(node)\n        refid = None\n        if node.refid is not None:\n            refid = self.get_refid(node.refid)\n        if refid is not None:\n            assert nodelist\n            nodelist = [\n                addnodes.pending_xref(\n                    \"\",\n                    reftype=\"ref\",\n                    refdomain=\"std\",\n                    refexplicit=True,\n                    refid=refid,\n                    reftarget=refid,\n                    *nodelist,\n                )\n            ]\n        return nodelist\n\n    @node_handler(parser.Node_docXRefSectType)\n    def visit_docxrefsect(self, node: parser.Node_docXRefSectType) -> list[nodes.Node]:\n        assert self.app.env is not None\n\n        signode = addnodes.desc_signature()\n        title = node.xreftitle[0] + \":\"\n        titlenode = nodes.emphasis(text=title)\n        ref = addnodes.pending_xref(\n            \"\",\n            reftype=\"ref\",\n            refdomain=\"std\",\n            refexplicit=True,\n            reftarget=node.id,\n            refdoc=self.app.env.docname,\n            *[titlenode],\n        )\n        signode += ref\n\n        nodelist = self.render(node.xrefdescription)\n        contentnode = addnodes.desc_content()\n        contentnode += nodelist\n\n        descnode = addnodes.desc()\n        descnode[\"objtype\"] = \"xrefsect\"\n        descnode[\"domain\"] = self.get_domain() or \"cpp\"\n        descnode += signode\n        descnode += contentnode\n\n        return [descnode]\n\n    @node_handler(parser.Node_docVariableListType)\n    def visit_docvariablelist(self, node: parser.Node_docVariableListType) -> list[nodes.Node]:\n        output: list[nodes.Node] = []\n        for n in node:\n            descnode = addnodes.desc()\n            descnode[\"objtype\"] = \"varentry\"\n            descnode[\"domain\"] = self.get_domain() or \"cpp\"\n            signode = addnodes.desc_signature()\n            signode += self.render_optional(n.varlistentry)\n            descnode += signode\n            contentnode = addnodes.desc_content()\n            contentnode += self.render_iterable(n.listitem)\n            descnode += contentnode\n            output.append(descnode)\n        return output\n\n    @node_handler(parser.Node_docVarListEntryType)\n    def visit_docvarlistentry(self, node: parser.Node_docVarListEntryType) -> list[nodes.Node]:\n        return self.render_tagged_iterable(node.term)\n\n    @node_handler(parser.Node_docAnchorType)\n    def visit_docanchor(self, node: parser.Node_docAnchorType) -> list[nodes.Node]:\n        return list(self.create_doxygen_target(node))\n\n    @node_handler(parser.Node_docEntryType)\n    def visit_docentry(self, node: parser.Node_docEntryType) -> list[nodes.Node]:\n        col = nodes.entry()\n        col += self.render_iterable(node.para)\n        if node.thead:\n            col[\"heading\"] = True\n        if node.rowspan:\n            col[\"morerows\"] = int(node.rowspan) - 1\n        if node.colspan:\n            col[\"morecols\"] = int(node.colspan) - 1\n        return [col]\n\n    @node_handler(parser.Node_docRowType)\n    def visit_docrow(self, node: parser.Node_docRowType) -> list[nodes.Node]:\n        row = nodes.row()\n        cols = self.render_iterable(node.entry)\n        elem: nodes.thead | nodes.tbody\n        if all(cast(\"nodes.Element\", col).get(\"heading\", False) for col in cols):\n            elem = nodes.thead()\n        else:\n            elem = nodes.tbody()\n        row += cols\n        elem.append(row)\n        return [elem]\n\n    @node_handler(parser.Node_docTableType)\n    def visit_doctable(self, node: parser.Node_docTableType) -> list[nodes.Node]:\n        table = nodes.table()\n        table[\"classes\"] += [\"colwidths-auto\"]\n        tgroup = nodes.tgroup(cols=node.cols)\n        for _ in range(node.cols):\n            colspec = nodes.colspec()\n            colspec.attributes[\"colwidth\"] = \"auto\"\n            tgroup += colspec\n        table += tgroup\n        rows = self.render_iterable(node.row)\n\n        # this code depends on visit_docrow(), and expects the same elements used to\n        # \"envelop\" rows there, namely thead and tbody (eg it will need to be updated\n        # if Doxygen one day adds support for tfoot)\n\n        tags: defaultdict[str, list] = defaultdict(list)\n        for row in rows:\n            assert isinstance(row, nodes.Element)\n            tags[row.starttag()].append(row.next_node())\n\n        def merge_row_types(root, elem, elems):\n            for node in elems:\n                elem += node\n            root += elem\n\n        for klass in [nodes.thead, nodes.tbody]:\n            obj = klass()\n            if obj.starttag() in tags:\n                merge_row_types(tgroup, obj, tags[obj.starttag()])\n\n        return [table]\n\n    visit_description = node_handler(parser.Node_descriptionType)(render_tagged_iterable)\n\n    visit_linkedtext = node_handler(parser.Node_linkedTextType)(render_tagged_iterable)\n\n    def visit_function(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        dom = self.get_domain()\n        if not dom or dom in (\"c\", \"cpp\", \"py\", \"cs\"):\n            names = self.get_qualification()\n            names.append(node.name)\n            name = self.join_nested_name(names)\n            if dom == \"py\":\n                declaration = name + (node.argsstring or \"\")\n            elif dom == \"cs\":\n                declaration = \" \".join([\n                    self.create_template_prefix(node),\n                    \"\".join(n.astext() for n in self.render(node.type)),\n                    name,\n                    node.argsstring or \"\",\n                ])\n            else:\n                elements = [self.create_template_prefix(node)]\n                if node.static:\n                    elements.append(\"static\")\n                if node.inline:\n                    elements.append(\"inline\")\n                if node.kind == parser.DoxMemberKind.friend:\n                    elements.append(\"friend\")\n                if node.virt in (parser.DoxVirtualKind.virtual, parser.DoxVirtualKind.pure_virtual):\n                    elements.append(\"virtual\")\n                if node.explicit:\n                    elements.append(\"explicit\")\n                if node.constexpr:\n                    elements.append(\"constexpr\")\n                if node.consteval:\n                    elements.append(\"consteval\")\n\n                typ = strip_legacy_qualifiers(\"\".join(n.astext() for n in self.render(node.type)))\n                elements.extend((typ, name, node.argsstring or \"\"))\n                declaration = \" \".join(elements)\n            return self.handle_declaration(node, node.kind.value, declaration)\n        else:\n            # Get full function signature for the domain directive.\n            param_list = []\n            for param in node.param:\n                assert self.context is not None\n                param = self.context.mask_factory.mask(param)\n                param_decl = get_param_decl(param)\n                param_list.append(param_decl)\n            templatePrefix = self.create_template_prefix(node)\n            sig_def = get_definition_without_template_args(node)\n            signature = f\"{templatePrefix}{sig_def}({', '.join(param_list)})\"\n\n            # Add CV-qualifiers.\n            if node.const:\n                signature += \" const\"\n            # The doxygen xml output doesn't register 'volatile' as the xml attribute for functions\n            # until version 1.8.8 so we also check argsstring:\n            #     https://bugzilla.gnome.org/show_bug.cgi?id=733451\n            if node.volatile or (node.argsstring and node.argsstring.endswith(\"volatile\")):\n                signature += \" volatile\"\n\n            if node.refqual == parser.DoxRefQualifierKind.lvalue:\n                signature += \"&\"\n            elif node.refqual == parser.DoxRefQualifierKind.rvalue:\n                signature += \"&&\"\n\n            # Add `= 0` for pure virtual members.\n            if node.virt == parser.DoxVirtualKind.pure_virtual:\n                signature += \"= 0\"\n\n            assert self.context is not None\n            self.context.directive_args[1] = [signature]\n\n            nodes_ = self.run_domain_directive(node.kind, self.context.directive_args[1])\n\n            assert self.app.env is not None\n            target = None\n            if self.app.env.config.breathe_debug_trace_doxygen_ids:\n                target = self.create_doxygen_target(node)\n                if len(target) == 0:\n                    print(\"{}Doxygen target (old): (none)\".format(\"  \" * _debug_indent))\n                else:\n                    print(\n                        \"{}Doxygen target (old): {}\".format(\"  \" * _debug_indent, target[0][\"ids\"])\n                    )\n\n            rst_node = nodes_[1]\n            assert isinstance(rst_node, nodes.Element)\n            doc = rst_node.document\n            assert doc is not None\n            finder = NodeFinder(doc)\n            rst_node.walk(finder)\n            assert finder.content is not None\n\n            # Templates have multiple signature nodes in recent versions of Sphinx.\n            # Insert Doxygen target into the first signature node.\n            if not self.app.env.config.breathe_debug_trace_doxygen_ids:\n                target = self.create_doxygen_target(node)\n            assert target is not None\n\n            # the type is cast to \"Any\" to get around missing typing info in\n            # docutils 0.20.1\n            cast(\"Any\", rst_node.children[0]).insert(0, target)\n\n            finder.content.extend(self.description(node))\n            return nodes_\n\n    def visit_define(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        declaration = node.name\n        if node.param:\n            declaration += \"(\"\n            for i, parameter in enumerate(node.param):\n                if i:\n                    declaration += \", \"\n                if parameter.defname:\n                    declaration += parameter.defname\n            declaration += \")\"\n\n        # TODO: remove this once Sphinx supports definitions for macros\n        def add_definition(declarator: Declarator) -> None:\n            if node.initializer and self.app.config.breathe_show_define_initializer:\n                declarator.append(nodes.Text(\" \"))\n                declarator.extend(self.render(node.initializer))\n\n        return self.handle_declaration(\n            node, node.kind.value, declaration, declarator_callback=add_definition\n        )\n\n    def visit_enum(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        def content(contentnode):\n            contentnode.extend(self.description(node))\n            values = nodes.emphasis(\"\", nodes.Text(\"Values:\"))\n            title = nodes.paragraph(\"\", \"\", values)\n            contentnode += title\n            enums = self.render_iterable(node.enumvalue)\n            contentnode.extend(enums)\n\n        names = self.get_qualification()\n        names.append(node.name)\n        declaration = self.join_nested_name(names)\n        dom = self.get_domain()\n        if (not dom or dom == \"cpp\") and node.strong:\n            # It looks like Doxygen does not make a difference\n            # between 'enum class' and 'enum struct',\n            # so render them both as 'enum class'.\n            obj_type = \"enum-class\"\n            underlying_type = \"\".join(n.astext() for n in self.render(node.type))\n            if len(underlying_type.strip()) != 0:\n                declaration += \" : \"\n                declaration += underlying_type\n        else:\n            obj_type = \"enum\"\n        return self.handle_declaration(node, obj_type, declaration, content_callback=content)\n\n    @node_handler(parser.Node_enumvalueType)\n    def visit_enumvalue(self, node: parser.Node_enumvalueType) -> list[nodes.Node]:\n        if self.app.config.breathe_show_enumvalue_initializer:\n            declaration = node.name + self.make_initializer(node)\n        else:\n            declaration = node.name\n\n        def content(contentnode: addnodes.desc_content):\n            contentnode.extend(self.description(node))\n\n        return self.handle_declaration(node, \"enumvalue\", declaration, content_callback=content)\n\n    def visit_typedef(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        type_ = \"\".join(n.astext() for n in self.render(node.type))\n        names = self.get_qualification()\n        names.append(node.name)\n        name = self.join_nested_name(names)\n        if node.definition and node.definition.startswith(\"using \"):\n            # TODO: looks like Doxygen does not generate the proper XML\n            #       for the template parameter list\n            declaration = self.create_template_prefix(node)\n            declaration += \" \" + name + \" = \" + type_\n        else:\n            # TODO: Both \"using\" and \"typedef\" keywords get into this function,\n            #   and if no @typedef comment was added, the definition should\n            #   contain the full text. If a @typedef was used instead, the\n            #   definition has only the typename, which makes it impossible to\n            #   distinguish between them so fallback to \"typedef\" behavior here.\n            declaration = \" \".join([type_, name, node.argsstring or \"\"])\n        return self.handle_declaration(node, node.kind.value, declaration)\n\n    def make_initializer(self, node) -> str:\n        initializer = node.initializer\n        signature: list[nodes.Node] = []\n        if initializer:\n            render_nodes = self.render(initializer)\n            # Do not append separators for paragraphs.\n            if not isinstance(render_nodes[0], nodes.paragraph):\n                separator = \" \"\n                assert isinstance(render_nodes[0], nodes.Text)\n                if not render_nodes[0].startswith(\"=\"):\n                    separator += \"= \"\n                signature.append(nodes.Text(separator))\n            signature.extend(render_nodes)\n        return \"\".join(n.astext() for n in signature)\n\n    def visit_variable(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        names = self.get_qualification()\n        names.append(node.name)\n        name = self.join_nested_name(names)\n        dom = self.get_domain()\n        options = {}\n        if dom == \"py\":\n            declaration = name\n            initializer = self.make_initializer(node).strip().lstrip(\"=\").strip()\n            if len(initializer) != 0:\n                options[\"value\"] = initializer\n        elif dom == \"cs\":\n            declaration = \" \".join([\n                self.create_template_prefix(node),\n                \"\".join(n.astext() for n in self.render(node.type)),\n                name,\n                node.argsstring or \"\",\n            ])\n            if node.gettable or node.settable:\n                declaration += \"{\"\n                if node.gettable:\n                    declaration += \"get;\"\n                if node.settable:\n                    declaration += \"set;\"\n                declaration += \"}\"\n            declaration += self.make_initializer(node)\n        else:\n            elements = [self.create_template_prefix(node)]\n            if node.static:\n                elements.append(\"static\")\n            if node.mutable:\n                elements.append(\"mutable\")\n            if node.constexpr:\n                elements.append(\"constexpr\")\n            if node.consteval:\n                elements.append(\"consteval\")\n            if node.constinit:\n                elements.append(\"constinit\")\n            typename = strip_legacy_qualifiers(\"\".join(n.astext() for n in self.render(node.type)))\n            if dom == \"c\" and \"::\" in typename:\n                typename = typename.replace(\"::\", \".\")\n            elements.extend((typename, name, node.argsstring or \"\", self.make_initializer(node)))\n            declaration = \" \".join(elements)\n        if not dom or dom in (\"c\", \"cpp\", \"py\", \"cs\"):\n            return self.handle_declaration(node, node.kind.value, declaration, options=options)\n        else:\n            return self.render_declaration(node, declaration)\n\n    def visit_friendclass(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        dom = self.get_domain()\n        assert not dom or dom == \"cpp\"\n\n        desc = addnodes.desc()\n        desc[\"objtype\"] = \"friendclass\"\n        desc[\"domain\"] = self.get_domain() or \"cpp\"\n        signode = addnodes.desc_signature()\n        desc += signode\n\n        typ = \"\".join(n.astext() for n in self.render(node.type))\n        # in Doxygen < 1.9 the 'friend' part is there, but afterwards not\n        # https://github.com/breathe-doc/breathe/issues/616\n        assert typ in (\"friend class\", \"friend struct\", \"class\", \"struct\")\n        if not typ.startswith(\"friend \"):\n            typ = \"friend \" + typ\n        signode += addnodes.desc_annotation(typ, typ)\n        signode += nodes.Text(\" \")\n        # expr = cpp.CPPExprRole(asCode=False)\n        # expr.text = node.name\n        # TODO: set most of the things that SphinxRole.__call__ sets\n        # signode.extend(expr.run())\n        signode += nodes.Text(node.name)\n        return [desc]\n\n    def visit_templateparam(\n        self, node: parser.Node_paramType, *, insertDeclNameByParsing: bool = False\n    ) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = []\n\n        # Parameter type\n        if node.type:\n            type_nodes = self.render(node.type)\n            # Render keywords as annotations for consistency with the cpp domain.\n            if len(type_nodes) > 0 and isinstance(type_nodes[0], str):\n                first_node = type_nodes[0]\n                for keyword in [\"typename\", \"class\"]:\n                    if first_node.startswith(keyword + \" \"):\n                        type_nodes[0] = nodes.Text(first_node.replace(keyword, \"\", 1))\n                        type_nodes.insert(0, addnodes.desc_annotation(keyword, keyword))\n                        break\n            nodelist.extend(type_nodes)\n\n        # Parameter name\n        if node.declname:\n            dom = self.get_domain()\n            if not dom:\n                dom = \"cpp\"\n            appendDeclName = True\n            if insertDeclNameByParsing:\n                if dom == \"cpp\":\n                    parser = cpp.DefinitionParser(\n                        \"\".join(n.astext() for n in nodelist),\n                        location=self.state.state_machine.get_source_and_line(),\n                        config=self.app.config,\n                    )\n                    try:\n                        # we really should use _parse_template_parameter()\n                        # but setting a name there is non-trivial, so we use type\n                        ast = parser._parse_type(named=\"single\", outer=\"templateParam\")\n                        assert ast.name is None\n                        nn = cpp.ASTNestedName(\n                            names=[\n                                cpp.ASTNestedNameElement(cpp.ASTIdentifier(node.declname), None)\n                            ],\n                            templates=[False],\n                            rooted=False,\n                        )\n                        ast.name = nn\n                        # the actual nodes don't matter, as it is astext()-ed later\n                        nodelist = [nodes.Text(str(ast))]\n                        appendDeclName = False\n                    except cpp.DefinitionError:\n                        # happens with \"typename ...Args\", so for now, just append\n                        pass\n\n            if appendDeclName:\n                if nodelist:\n                    nodelist.append(nodes.Text(\" \"))\n                nodelist.append(nodes.emphasis(text=node.declname))\n        elif self.output_defname and node.defname:\n            # We only want to output the definition name (from the cpp file) if the declaration name\n            # (from header file) isn't present\n            if nodelist:\n                nodelist.append(nodes.Text(\" \"))\n            nodelist.append(nodes.emphasis(text=node.defname))\n\n        # array information\n        if node.array:\n            nodelist.append(nodes.Text(node.array))\n\n        # Default value\n        if node.defval:\n            nodelist.append(nodes.Text(\" = \"))\n            nodelist.extend(self.render(node.defval))\n\n        return nodelist\n\n    @node_handler(parser.Node_templateparamlistType)\n    def visit_templateparamlist(self, node: parser.Node_templateparamlistType) -> list[nodes.Node]:\n        nodelist: list[nodes.Node] = []\n        self.output_defname = False\n        for i, item in enumerate(node.param):\n            if i:\n                nodelist.append(nodes.Text(\", \"))\n            nodelist.extend(self.visit_templateparam(item, insertDeclNameByParsing=True))\n        self.output_defname = True\n        return nodelist\n\n    @node_handler(parser.Node_docParamListType)\n    def visit_docparamlist(self, node: parser.Node_docParamListType) -> list[nodes.Node]:\n        \"\"\"Parameter/Exception/TemplateParameter documentation\"\"\"\n\n        fieldListName = {\n            parser.DoxParamListKind.param: \"param\",\n            parser.DoxParamListKind.exception: \"throws\",\n            parser.DoxParamListKind.templateparam: \"tparam\",\n            parser.DoxParamListKind.retval: \"retval\",\n        }\n\n        # https://docutils.sourceforge.io/docs/ref/doctree.html#field-list\n        fieldList = nodes.field_list()\n        for item in node:\n            # TODO: does item.parameternamelist really have more than 1 parametername?\n            assert len(item.parameternamelist) <= 1, item.parameternamelist\n            nameNodes: list[nodes.Node] = []\n            parameterDirectionNodes = []\n            if len(item.parameternamelist) != 0:\n                paramNameNodes = item.parameternamelist[0].parametername\n                if len(paramNameNodes) != 0:\n                    nameNodes = []\n                    for paramName in paramNameNodes:\n                        assert len(paramName) == 1\n                        thisName = self.render_tagged(paramName[0])\n                        if len(nameNodes) != 0:\n                            if node.kind == parser.DoxParamListKind.exception:\n                                msg = \"Doxygen \\\\exception commands with multiple names can not be\"\n                                msg += \" converted to a single :throws: field in Sphinx.\"\n                                msg += \" Exception '{}' suppressed from output.\".format(\n                                    \"\".join(n.astext() for n in thisName)\n                                )\n                                self.state.document.reporter.warning(msg)\n                                continue\n                            nameNodes.append(nodes.Text(\", \"))\n                        nameNodes.extend(thisName)\n                        if paramName.direction is not None:\n                            # note, each paramName node seems to have the same direction,\n                            # so just use the last one\n                            dir = {\n                                parser.DoxParamDir.in_: \"[in]\",\n                                parser.DoxParamDir.out: \"[out]\",\n                                parser.DoxParamDir.inout: \"[inout]\",\n                            }[paramName.direction]\n                            parameterDirectionNodes = [nodes.strong(dir, dir), nodes.Text(\" \")]\n            # it seems that Sphinx expects the name to be a single node,\n            # so let's make it that\n            txt = fieldListName[node.kind] + \" \"\n            for n in nameNodes:\n                txt += n.astext()\n            name = nodes.field_name(\"\", nodes.Text(txt))\n            bodyNodes = self.render_optional(item.parameterdescription)\n            # TODO: is it correct that bodyNodes is either empty or a single paragraph?\n            assert len(bodyNodes) <= 1, bodyNodes\n            if len(bodyNodes) == 1:\n                assert isinstance(bodyNodes[0], nodes.paragraph)\n                bodyNodes = [\n                    nodes.paragraph(\"\", \"\", *(parameterDirectionNodes + bodyNodes[0].children))\n                ]\n            body = nodes.field_body(\"\", *bodyNodes)\n            field = nodes.field(\"\", name, body)\n            fieldList += field\n        return [fieldList]\n\n    @node_handler(parser.Node_docDotMscType)\n    def visit_docdot(self, node: parser.Node_docDotMscType) -> list[nodes.Node]:\n        \"\"\"Translate node from doxygen's dot command to sphinx's graphviz directive.\"\"\"\n        graph_node = graphviz()\n        str_value = \"\"\n        if len(node):\n            val = node[0]\n            assert isinstance(val, str)\n            str_value = val\n        if str_value.rstrip(\"\\n\"):\n            graph_node[\"code\"] = str_value\n        else:\n            graph_node[\"code\"] = \"\"  # triggers another warning from sphinx.ext.graphviz\n            self.state.document.reporter.warning(\n                # would be better if this output includes the parent node's\n                # name/reference, but that would always be a <para> element.\n                \"no content provided for generating DOT graph.\"\n            )\n        graph_node[\"options\"] = {}\n        if node.caption:\n            caption_node = nodes.caption(node.caption, \"\")\n            caption_node += nodes.Text(node.caption)\n            return [nodes.figure(\"\", graph_node, caption_node)]\n        return [graph_node]\n\n    @node_handler(parser.Node_docImageFileType)\n    def visit_docdotfile(self, node: parser.Node_docImageFileType) -> list[nodes.Node]:\n        \"\"\"Translate node from doxygen's dotfile command to sphinx's graphviz directive.\"\"\"\n        dotcode = \"\"\n        dot_file_path = Path(node.name or \"\")\n        # Doxygen v1.9.3+ uses a relative path to specify the dot file.\n        # Previously, Doxygen used an absolute path.\n        # This relative path is with respect to the XML_OUTPUT path.\n        # Furthermore, Doxygen v1.9.3+ will copy the dot file into the XML_OUTPUT\n        if not dot_file_path.is_absolute():\n            # Use self.project_info.project_path as the XML_OUTPUT path, and\n            # make it absolute with consideration to the conf.py path\n            project_path = self.project_info.project_path()\n            dot_file_path = Path(self.app.confdir, project_path, dot_file_path).resolve()\n        try:\n            dotcode = dot_file_path.read_text(encoding=\"utf-8\")\n            if not dotcode.rstrip(\"\\n\"):\n                raise RuntimeError(\"%s found but without any content\" % dot_file_path)\n        except OSError as exc:\n            # doxygen seems to prevent this from triggering as a non-existent file\n            # generates no XML output for the corresponding `\\dotfile` cmd\n            self.state.document.reporter.warning(exc)  # better safe than sorry\n        except RuntimeError as exc:\n            self.state.document.reporter.warning(exc)\n        graph_node = graphviz()\n        graph_node[\"code\"] = dotcode\n        graph_node[\"options\"] = {\"docname\": dot_file_path}\n        caption = \"\" if len(node) == 0 else parser.tag_name_value(node[0])[1]\n        if caption:\n            assert isinstance(caption, str)\n            caption_node = nodes.caption(caption, \"\")\n            caption_node += nodes.Text(caption)\n            return [nodes.figure(\"\", graph_node, caption_node)]\n        return [graph_node]\n\n    @tagged_node_handler(parser.Node_graphType)\n    def visit_docgraph(self, tag: str, node: parser.Node_graphType) -> list[nodes.Node]:\n        \"\"\"Create a graph (generated by doxygen - not user-defined) from XML using dot\n        syntax.\"\"\"\n\n        assert self.context\n        parent = self.context.node_stack[1].value\n        assert isinstance(parent, parser.Node_compounddefType)\n\n        direction = \"forward\"\n        if tag == \"incdepgraph\":\n            caption = f\"Include dependency graph for {parent.compoundname}:\"\n        elif tag == \"invincdepgraph\":\n            direction = \"back\"\n            caption = (\n                \"This graph shows which files directly or indirectly \"\n                + f\"include {parent.compoundname}:\"\n            )\n        elif tag == \"inheritancegraph\":\n            caption = f\"Inheritance diagram for {parent.compoundname}:\"\n        else:\n            assert tag == \"collaborationgraph\"\n            caption = f\"Collaboration diagram for {parent.compoundname}:\"\n\n        # use graphs' legend from doxygen (v1.9.1)\n        # most colors can be changed via `graphviz_dot_args` in conf.py\n        edge_colors = {\n            # blue (#1414CE) doesn't contrast well in dark mode.\n            # \"public-inheritance\": \"1414CE\",  # allow user to customize this one\n            \"private-inheritance\": \"8B1A1A\",  # hardcoded\n            \"protected-inheritance\": \"006400\",  # hardcoded\n            # the following are demonstrated in the doxygen graphs' legend, but\n            # these don't show in XML properly (bug?); these keys are fiction.\n            \"used-internal\": \"9C35CE\",  # should also be dashed\n            \"template-instantiated-inheritance\": \"FFA500\",  # should also be dashed\n        }\n\n        # assemble the dot syntax we'll pass to the graphviz directive\n        dot = \"digraph {\\n\"\n        dot += '    graph [bgcolor=\"#00000000\"]\\n'  # transparent color for graph's bg\n        dot += '    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\"'\n        dot += \" font=Helvetica padding=2]\\n\"\n        dot += '    edge [color=\"#1414CE\"]\\n'\n        relations = []\n        for g_node in node.node:\n            dot += '    \"%s\" [label=\"%s\"' % (g_node.id, g_node.label)\n            dot += ' tooltip=\"%s\"' % g_node.label\n            if g_node.id == \"1\":\n                # the disabled grey color is used in doxygen to indicate that the URL is\n                # not set (for the compound in focus). Setting this here doesn't allow\n                # further customization. Maybe remove this since URL is not used?\n                #\n                dot += ' fillcolor=\"#BFBFBF\"'  # hardcoded\n            # URLs from a doxygen refid won't work in sphinx graphviz; we can't convert\n            # the refid until all docs are built, and pending references are un-noticed\n            # within graphviz directives. Maybe someone wiser will find a way to do it.\n            #\n            # dot += ' URL=\"%s\"' % g_node.get_link().get_refid()\n            dot += \"]\\n\"\n            for child_node in g_node.childnode:\n                edge = f'    \"{g_node.id}\"'\n                edge += f' -> \"{child_node.refid}\" ['\n                edge += f\"dir={direction} \"\n                # edge labels don't appear in XML (bug?); use tooltip in meantime\n                edge += 'tooltip=\"%s\"' % child_node.relation.value\n                if child_node.relation.value in edge_colors.keys():\n                    edge += ' color=\"#%s\"' % edge_colors.get(child_node.relation.value)\n                edge += \"]\\n\"\n                relations.append(edge)\n        for relation in relations:\n            dot += relation\n        dot += \"}\"\n\n        # use generated dot syntax to create a graphviz node\n        graph_node = graphviz()\n        graph_node[\"code\"] = dot\n        graph_node[\"align\"] = \"center\"\n        graph_node[\"options\"] = {}\n        # if caption is first node in a figure, then everything that follows is\n        # considered a caption. Use a paragraph followed by a figure to center the\n        # graph. This may have illegible side effects for very large graphs.\n        caption_node = nodes.paragraph(\"\", nodes.Text(caption))\n        return [caption_node, nodes.figure(\"\", graph_node)]\n\n    def visit_unknown(self, node) -> list[nodes.Node]:\n        \"\"\"Visit a node of unknown type.\"\"\"\n        return []\n\n    @node_handler(parser.Node_CompoundType)\n    def dispatch_compound(self, node: parser.Node_CompoundType) -> list[nodes.Node]:\n        \"\"\"Dispatch handling of a compound node to a suitable visit method.\"\"\"\n        if node.kind in [\n            parser.CompoundKind.file,\n            parser.CompoundKind.dir,\n            parser.CompoundKind.page,\n            parser.CompoundKind.example,\n            parser.CompoundKind.group,\n        ]:\n            return self.visit_file(node)\n        return self.visit_compound(node)\n\n    @node_handler(parser.Node_memberdefType)\n    def dispatch_memberdef(self, node: parser.Node_memberdefType) -> list[nodes.Node]:\n        \"\"\"Dispatch handling of a memberdef node to a suitable visit method.\"\"\"\n        if node.kind in (\n            parser.DoxMemberKind.function,\n            parser.DoxMemberKind.signal,\n            parser.DoxMemberKind.slot,\n        ) or (node.kind == parser.DoxMemberKind.friend and node.argsstring):\n            return self.visit_function(node)\n        if node.kind == parser.DoxMemberKind.enum:\n            return self.visit_enum(node)\n        if node.kind == parser.DoxMemberKind.typedef:\n            return self.visit_typedef(node)\n        if node.kind == parser.DoxMemberKind.variable:\n            return self.visit_variable(node)\n        if node.kind == parser.DoxMemberKind.property:\n            # Note: visit like variable for now\n            return self.visit_variable(node)\n        if node.kind == parser.DoxMemberKind.event:\n            # Note: visit like variable for now\n            return self.visit_variable(node)\n        if node.kind == parser.DoxMemberKind.define:\n            return self.visit_define(node)\n        if node.kind == parser.DoxMemberKind.friend:\n            # note, friend functions should be dispatched further up\n            return self.visit_friendclass(node)\n        return self.render_declaration(node, update_signature=self.update_signature)\n\n    @tagged_node_handler(str)\n    def visit_string(self, tag: str, node: str) -> list[nodes.Node]:\n        if tag == \"verbatim\":\n            return self.visit_verbatim(node)\n        return self.render_string(node)\n\n    @node_handler(str)\n    def render_string(self, node: str) -> list[nodes.Node]:\n        # Skip any nodes that are pure whitespace\n        # Probably need a better way to do this as currently we're only doing\n        # it skip whitespace between higher-level nodes, but this will also\n        # skip any pure whitespace entries in actual content nodes\n        #\n        # We counter that second issue slightly by allowing through single white spaces\n        #\n        stripped = node.strip()\n        if stripped:\n            delimiter = None\n            if \"<linebreak>\" in stripped:\n                delimiter = \"<linebreak>\"\n            elif \"\\n\" in stripped:\n                delimiter = \"\\n\"\n            if delimiter:\n                # Render lines as paragraphs because RST doesn't have line breaks.\n                return [\n                    nodes.paragraph(\"\", \"\", nodes.Text(line.strip()))\n                    for line in node.split(delimiter)\n                    if line.strip()\n                ]\n            # importantly, don't strip whitespace as visit_docpara uses it to collapse\n            # consecutive nodes.Text and rerender them with this function.\n            return [nodes.Text(node)]\n        if node == \" \":\n            return [nodes.Text(node)]\n        return []\n\n    def render_tagged(\n        self, item: parser.TaggedValue[str, parser.NodeOrValue] | str\n    ) -> list[nodes.Node]:\n        if isinstance(item, str):\n            return self.render_string(item)\n        return self.render(item.value, None, item.name)\n\n    def render(\n        self, node: parser.NodeOrValue, context: RenderContext | None = None, tag: str | None = None\n    ) -> list[nodes.Node]:\n        if context is None:\n            assert self.context is not None\n            context = self.context.create_child_context(node, tag)\n        with WithContext(self, context):\n            assert self.context is not None\n            result: list[nodes.Node] = []\n            if self.filter_(NodeStack(self.context.node_stack)):\n                tmethod = self.tagged_node_handlers.get(type(node))\n                if tmethod is None:\n                    method = self.node_handlers.get(type(node))\n                    if method is None:\n                        method = SphinxRenderer.visit_unknown\n                    result = method(self, node)\n                elif tag is None:\n                    assert isinstance(node, str)\n                    result = self.render_string(node)\n                else:\n                    result = tmethod(self, tag, node)\n        return result\n\n    def render_optional(self, node, tag: str | None = None) -> list[nodes.Node]:\n        \"\"\"Render a node that can be None.\"\"\"\n        return self.render(node, None, tag) if node is not None else []\n\n\ndef setup(app: Sphinx) -> None:\n    app.add_config_value(\"breathe_debug_trace_directives\", False, \"\")\n    app.add_config_value(\"breathe_debug_trace_doxygen_ids\", False, \"\")\n    app.add_config_value(\"breathe_debug_trace_qualification\", False, \"\")\n"
  },
  {
    "path": "breathe/renderer/target.py",
    "content": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom docutils import nodes\nfrom sphinx.util.nodes import make_id\n\nif TYPE_CHECKING:\n    from collections.abc import Mapping, Sequence\n    from typing import Any, Callable\n\n    from docutils.nodes import Element\n    from sphinx.environment import BuildEnvironment\n\n    TargetHandler = Callable[[nodes.document, str], Sequence[Element]]\n\n\nclass _RealTargetHandler:\n    def __init__(self, env: BuildEnvironment):\n        self.env = env\n\n    def __call__(self, document: nodes.document, refid: str) -> list[Element]:\n        \"\"\"Creates a target node, registers it with the document and returns it in a list\"\"\"\n\n        if refid in document.ids:\n            # Sphinx will already warn about a duplicate declaration so we don't\n            # need any warnings here\n            refid = make_id(self.env, document)\n\n        target = nodes.target(ids=[refid], names=[refid])\n        document.note_explicit_target(target)\n\n        return [target]\n\n\ndef create_target_handler(options: Mapping[str, Any], env: BuildEnvironment) -> TargetHandler:\n    if \"no-link\" in options:\n        return lambda document, refid: []\n    return _RealTargetHandler(env)\n"
  },
  {
    "path": "breathe-apidoc.py",
    "content": "#!/usr/bin/env python\nfrom __future__ import annotations\n\nimport sys\n\nif __name__ == \"__main__\":\n    from breathe.apidoc import main\n\n    sys.exit(main())\n"
  },
  {
    "path": "documentation/.gitignore",
    "content": "/build\n/view\n/comparison\n"
  },
  {
    "path": "documentation/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS   ?= -v -W -E\n# -n triggers an additional 100+ warnings (all about undefined references) that -W treats as errors.\n# these extraneous warnings are ignored because some doc pages have to avoid duplicate IDs\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR     ?= build\nDEBUG        ?= -P\n\n# User-friendly check for sphinx-build\nifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)\n$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://www.sphinx-doc.org/)\nendif\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = $(DEBUG) -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  latexpdfja to make LaTeX files and run them through platex/dvipdfmx\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  xml        to make Docutils-native XML files\"\n\t@echo \"  pseudoxml  to make pseudoxml-XML files for display purposes\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\trm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/test.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/test.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/test\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/test\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\nlatexpdfja:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through platex and dvipdfmx...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n\nxml:\n\t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml\n\t@echo\n\t@echo \"Build finished. The XML files are in $(BUILDDIR)/xml.\"\n\npseudoxml:\n\t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml\n\t@echo\n\t@echo \"Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml.\"\n\nspelling:\n\t$(SPHINXBUILD) -b spelling -N $(ALLSPHINXOPTS) $(BUILDDIR)/spelling\n\t@echo\n\t@echo \"Build finished. The spelling files are in $(BUILDDIR)/spelling.\"\n"
  },
  {
    "path": "documentation/compare",
    "content": "#!/bin/sh -e\n\nfirst=$1\nsecond=$2\n\nif [ -z \"$first\" ]; then\n\techo \"Usage: compare <branch name A> [<branch name B>]\"\n\techo \"\"\n\techo \"The second argument defaults to the current branch if not specified\"\n\texit 1\nfi\n\n# Remember the branch we're on\ncurrentbranch=`git symbolic-ref --short HEAD`\n\nif [ -z \"$second\" ]; then\n\tsecond=$currentbranch\nfi\n\nfirstdir=comparison/first\nseconddir=comparison/second\n\n# Make sure the output directory exists\nmkdir -p comparison\n\n# Remove any previous builds\nrm -fr $firstdir\nrm -fr $seconddir\n\nexport BREATHE_COMPARE=True\n\n# Checkout the first target\necho git checkout $first\ngit checkout $first\n# Run doxygen for this state\n(cd ../examples/specific; make)\n(cd ../examples/tinyxml; make)\n(cd ../examples/doxygen; make)\n# Clean current sphinx build directory\nmake clean\n# Make sure the BUILDDIR variable can be overridden in the Makefile. Required for older commits\nsed -i 's/BUILDDIR      = build/BUILDDIR     ?= build/g' Makefile\n# Build into our first comparison directory\nmake html BUILDDIR=$firstdir || true\n# Reset the Makefile to its state for this commit\ngit checkout Makefile\n\n\n# Checkout the second target and repeat\necho git checkout $second\ngit checkout $second\n(cd ../examples/specific; make)\n(cd ../examples/tinyxml; make)\n(cd ../examples/doxygen; make)\nmake clean\nsed -i 's/BUILDDIR      = build/BUILDDIR     ?= build/g' Makefile\nmake html BUILDDIR=$seconddir || true\ngit checkout Makefile\n\n# Return to our current branch\necho git checkout $currentbranch\ngit checkout $currentbranch\n\n# Launch meld to compare the two html directories\necho meld $firstdir/html $seconddir/html\nmeld $firstdir/html $seconddir/html\n\n"
  },
  {
    "path": "documentation/environment.yaml",
    "content": "name: RTD\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  # doxygen versions available from conda forge are listed at\n  # https://anaconda.org/conda-forge/doxygen/files\n  #\n  # - doxygen=1.9.4 # to specify a specific version of doxygen\n  # we'll be using the latest available\n  - doxygen\n  - pip\n  - pip:\n    - \".[docs,lint,test]\"\n"
  },
  {
    "path": "documentation/make.bat",
    "content": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUILDDIR=build\nset SRCDIR=source\nset ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% %SRCDIR%\nset I18NSPHINXOPTS=%SPHINXOPTS% %SRCDIR%\nif NOT \"%PAPER%\" == \"\" (\n\tset ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%\n\tset I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%\n)\n\nif \"%1\" == \"\" goto help\n\nif \"%1\" == \"help\" (\n\t:help\n\techo.Please use `make ^<target^>` where ^<target^> is one of\n\techo.  html       to make standalone HTML files\n\techo.  dirhtml    to make HTML files named index.html in directories\n\techo.  singlehtml to make a single large HTML file\n\techo.  pickle     to make pickle files\n\techo.  json       to make JSON files\n\techo.  htmlhelp   to make HTML files and a HTML help project\n\techo.  qthelp     to make HTML files and a qthelp project\n\techo.  devhelp    to make HTML files and a Devhelp project\n\techo.  epub       to make an epub\n\techo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\n\techo.  text       to make text files\n\techo.  man        to make manual pages\n\techo.  texinfo    to make Texinfo files\n\techo.  gettext    to make PO message catalogs\n\techo.  changes    to make an overview over all changed/added/deprecated items\n\techo.  xml        to make Docutils-native XML files\n\techo.  pseudoxml  to make pseudoxml-XML files for display purposes\n\techo.  linkcheck  to check all external links for integrity\n\techo.  doctest    to run all doctests embedded in the documentation if enabled\n\tgoto end\n)\n\nif \"%1\" == \"clean\" (\n\tfor /d %%i in (%BUILDDIR%\\*) do rmdir /q /s %%i\n\tdel /q /s %BUILDDIR%\\*\n\tgoto end\n)\n\n\n%SPHINXBUILD% 2> nul\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.https://www.sphinx-doc.org/\n\texit /b 1\n)\n\nif \"%1\" == \"html\" (\n\t%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/html.\n\tgoto end\n)\n\nif \"%1\" == \"dirhtml\" (\n\t%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.\n\tgoto end\n)\n\nif \"%1\" == \"singlehtml\" (\n\t%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.\n\tgoto end\n)\n\nif \"%1\" == \"pickle\" (\n\t%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the pickle files.\n\tgoto end\n)\n\nif \"%1\" == \"json\" (\n\t%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the JSON files.\n\tgoto end\n)\n\nif \"%1\" == \"htmlhelp\" (\n\t%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run HTML Help Workshop with the ^\n.hhp project file in %BUILDDIR%/htmlhelp.\n\tgoto end\n)\n\nif \"%1\" == \"qthelp\" (\n\t%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run \"qcollectiongenerator\" with the ^\n.qhcp project file in %BUILDDIR%/qthelp, like this:\n\techo.^> qcollectiongenerator %BUILDDIR%\\qthelp\\libuv.qhcp\n\techo.To view the help file:\n\techo.^> assistant -collectionFile %BUILDDIR%\\qthelp\\libuv.ghc\n\tgoto end\n)\n\nif \"%1\" == \"devhelp\" (\n\t%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished.\n\tgoto end\n)\n\nif \"%1\" == \"epub\" (\n\t%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The epub file is in %BUILDDIR%/epub.\n\tgoto end\n)\n\nif \"%1\" == \"latex\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; the LaTeX files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"latexpdf\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tcd %BUILDDIR%/latex\n\tmake all-pdf\n\tcd %BUILDDIR%/..\n\techo.\n\techo.Build finished; the PDF files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"latexpdfja\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tcd %BUILDDIR%/latex\n\tmake all-pdf-ja\n\tcd %BUILDDIR%/..\n\techo.\n\techo.Build finished; the PDF files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"text\" (\n\t%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The text files are in %BUILDDIR%/text.\n\tgoto end\n)\n\nif \"%1\" == \"man\" (\n\t%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The manual pages are in %BUILDDIR%/man.\n\tgoto end\n)\n\nif \"%1\" == \"texinfo\" (\n\t%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.\n\tgoto end\n)\n\nif \"%1\" == \"gettext\" (\n\t%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The message catalogs are in %BUILDDIR%/locale.\n\tgoto end\n)\n\nif \"%1\" == \"changes\" (\n\t%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.The overview file is in %BUILDDIR%/changes.\n\tgoto end\n)\n\nif \"%1\" == \"linkcheck\" (\n\t%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Link check complete; look for any errors in the above output ^\nor in %BUILDDIR%/linkcheck/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"doctest\" (\n\t%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Testing of doctests in the sources finished, look at the ^\nresults in %BUILDDIR%/doctest/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"xml\" (\n\t%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The XML files are in %BUILDDIR%/xml.\n\tgoto end\n)\n\nif \"%1\" == \"pseudoxml\" (\n\t%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.\n\tgoto end\n)\n\n:end\n"
  },
  {
    "path": "documentation/source/_static/breathe.css",
    "content": "/* -- breathe specific styles ----------------------------------------------- */\n\n/* So enum value descriptions are displayed inline to the item */\n.breatheenumvalues li tt + p {\n  display: inline;\n}\n\n/* So parameter descriptions are displayed inline to the item */\n.breatheparameterlist li tt + p {\n  display: inline;\n}\n\n:root {\n  --color-brand-primary-light: hsl(205deg, 52%, 39%);\n  --color-brand-primary-dark: hsl(205deg, 65%, 65%);\n  --breathe-str-char-color-dark: hsl(41, 85%, 46%);\n  --breathe-str-char-color-light: hsl(41, 89%, 37%);\n  --breathe-keyword-type-color-dark: hsl(256, 100%, 65%);\n  --breathe-keyword-type-color-light: hsl(276, 85%, 29%);\n  --breathe-number-color-dark: hsl(157, 81%, 50%);\n  --breathe-number-color-light: hsl(157, 93%, 32%);\n  --breathe-name-color-dark: hsl(88, 72%, 56%);\n  --breathe-name-color-light: hsl(88, 100%, 28%);\n}\n\n/* ************************************************** */\n/* rules to uniform color scheme with breathe-doc.org */\n\nbody {\n  --color-brand-primary: var(--color-brand-primary-light);\n  --color-brand-content: var(--color-brand-primary-light);\n  --breathe-str-char-color: var(--breathe-str-char-color-light);\n  --breathe-keyword-type-color: var(--breathe-keyword-type-color-light);\n  --breathe-number-color: var(--breathe-number-color-light);\n  --breathe-name-color: var(--breathe-name-color-light);\n}\n\n/* Enable dark-mode, if requested. */\nbody[data-theme=\"dark\"] {\n  --color-brand-primary: var(--color-brand-primary-dark);\n  --color-brand-content: var(--color-brand-primary-dark);\n  --breathe-str-char-color: var(--breathe-str-char-color-dark);\n  --breathe-keyword-type-color: var(--breathe-keyword-type-color-dark);\n  --breathe-number-color: var(--breathe-number-color-dark);\n  --breathe-name-color: var(--breathe-name-color-dark);\n}\n\n/* Enable dark mode, unless explicitly told to avoid. */\n@media (prefers-color-scheme: dark) {\n  body:not([data-theme=\"light\"]) {\n    --color-brand-primary: var(--color-brand-primary-dark);\n    --color-brand-content: var(--color-brand-primary-dark);\n    --breathe-str-char-color: var(--breathe-str-char-color-dark);\n    --breathe-keyword-type-color: var(--breathe-keyword-type-color-dark);\n    --breathe-number-color: var(--breathe-number-color-dark);\n    --breathe-name-color: var(--breathe-name-color-dark);\n  }\n}\n\n.mobile-header {\n  /* background-color: var(--color-header-background); */\n  background-color: #003c66;\n}\n\n.mobile-header .toc-overlay-icon .icon {\n  /* color: var(--color-foreground-secondary); */\n  color: white;\n}\n\n.mobile-header .header-center a {\n  /* color: var(--color-header-text); */\n  color: white;\n}\n\n.mobile-header .theme-toggle svg {\n  /* color: var(--color-foreground-primary); */\n  color: white;\n}\n\n/* C++ specific styling */\n\n.highlight {\n  /* desaturate that ugly yellow color used by most other theme's code snippets */\n  background-color: var(--color-api-background); /* for light theme only */\n}\n\n.sig.c   .k, .sig.c   .kt,\n.sig.cpp .k, .sig.cpp .kt {\n  color: var(--breathe-keyword-type-color);\n}\n\n.sig.c   .m,\n.sig.cpp .m {\n  color: var(--breathe-number-color);\n}\n\n.sig.c   .s, .sig.c   .sc,\n.sig.cpp .s, .sig.cpp .sc {\n  color: var(--breathe-str-char-color);\n}\n\n.sig > .n {\n  color: var(--breathe-name-color);\n}\n\n/*\nbugfix for multi-lined signatures\n(see https://github.com/pradyunsg/furo/discussions/427 )\n*/\n.sig {\n  padding-left: 0.5em;\n  text-indent: revert;\n}\n"
  },
  {
    "path": "documentation/source/autofile.rst",
    "content": "\n.. _autodoxygenfile-example:\n\nautodoxygenfile Directive Example\n=================================\n\nFor more details and directive documentation please see :ref:`file-example`,\nwhich is very similar to this directive.\n\nWorking Example\n---------------\n\nThis should work:\n\n.. code-block:: rst\n\n   .. autodoxygenfile:: auto_class.h\n      :project: auto\n\nWith the following config value:\n\n.. code-block:: python\n\n   breathe_projects_source = {\n       \"auto\" : ( \"../examples/specific\", [\"auto_class.h\"] )\n   }\n\nIt produces this output:\n\n.. autodoxygenfile:: auto_class.h\n   :project: auto\n"
  },
  {
    "path": "documentation/source/autoindex.rst",
    "content": "\n.. _autodoxygenindex-example:\n\nautodoxygenindex Directive Example\n==================================\n\nWorking Example\n---------------\n\nThis should work:\n\n.. code-block:: rst\n\n   .. autodoxygenindex::\n      :project: auto\n\nWith the following config value:\n\n.. code-block:: python\n\n   breathe_projects_source = {\n       \"auto\" : ( \"../examples/specific\", [\"auto_function.h\", \"auto_class.h\"] )\n   }\n\nIt produces this output:\n\n.. cpp:namespace:: @ex_autoindex\n\n.. autodoxygenindex::\n   :project: auto\n"
  },
  {
    "path": "documentation/source/class.rst",
    "content": "\n.. _class-example:\n\ndoxygenclass Directive\n======================\n\nThis directive generates the appropriate output for a single class. It takes the\nstandard ``project``, ``path``, ``outline`` and ``no-link`` options and\nadditionally the ``members``, ``protected-members``, ``private-members``,\n``undoc-members``, ``membergroups`` and ``members-only`` options.\n\n``members``\n   Designed to behavior in a similar manner to the ``members`` option for the\n   ``autoclass`` directive that comes with the Sphinx ``autodoc`` extension.\n\n   If you do not specify this option you will not get any information about the\n   class members, just the general class documentation. If you provide it\n   without arguments, then Breathe adds all the public members and their\n   documentation.  If you specify it with **comma separated** arguments, then\n   Breathe will treat the arguments as names of members and provide\n   documentation for only those members that have been named.\n\n``protected-members``\n   If specified, the protected members of the class will be displayed.\n\n``private-members``\n   If specified, the private members of the class will be displayed.\n\n``undoc-members``\n   If specified, the undocumented members of the class will be displayed.\n\n``membergroups``\n  If specified, only the groups in a space-delimited list following this\n  directive will be displayed.\n\n``members-only``\n  This will allow to show only the members, not the class information. Child\n  classes and structs are also not shown.\n\nIf you would like to always specify some combination of ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` then you can\nuse the :ref:`breathe_default_members <breathe-default-members>` configuration\nvariable to set it in the ``conf.py``.\n\nThe output includes references to any base classes and derived classes of the\nspecified class.\n\n\nBasic Example\n-------------\n\n.. cpp:namespace:: @ex_class_basic\n\nThis displays the class documentation without any members:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n\nIt produces this output:\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n\n\nTemplate Specialisation Example\n-------------------------------\n\n.. cpp:namespace:: @ex_class_template_spec\n\nYou can reference class template specialisations by include the specialisation\nin the name:\n\n.. code-block:: rst\n\n   .. doxygenclass:: TemplateClass< T * >\n      :project: template_specialisation\n\nProduces this output:\n\n.. doxygenclass:: TemplateClass< T * >\n   :project: template_specialisation\n\nWhere as without the specialisation, the directive references the generic\ndeclaration:\n\n.. code-block:: rst\n\n   .. doxygenclass:: SecondTemplateClass\n      :project: template_specialisation\n\nProduces this output:\n\n.. doxygenclass:: SecondTemplateClass\n   :project: template_specialisation\n\nNote the spacing inside the ``<>``, it's important: there must be a\nspace after the ``<`` and before the ``>``.\n\nMembers Example\n---------------\n\n.. cpp:namespace:: @ex_class_members\n\nThis directive call will display the class documentation with all the public\nmembers:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n      :members:\n\nIt produces this output:\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n   :members:\n   :no-link:\n\nSpecific Members Example\n------------------------\n\n.. cpp:namespace:: @ex_class_members_specific\n\nThis displays the class documentation with only the members listed in the\n``:members:`` option:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n      :members: Tool, crack, isCracked\n\nIt produces this output:\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n   :members: Tool, crack, isCracked\n   :no-link:\n\nProtected Members\n-----------------\n\n.. cpp:namespace:: @ex_class_members_protected\n\nThis displays only the protected members of the class. Normally this is combined\nwith the ``:members:`` option to show the public members as well.\n\n.. code-block:: rst\n\n   .. doxygenclass:: GroupedClassTest\n      :project: group\n      :protected-members:\n\nIt produces this output:\n\n.. doxygenclass:: GroupedClassTest\n   :project: group\n   :protected-members:\n\n\nPrivate Members\n---------------\n\n.. cpp:namespace:: @ex_class_members_private\n\nThis displays only the private members of the class. Normally this is combined\nwith the ``:members:`` option to show the public members as well.\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n      :private-members:\n\nIt produces this output:\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n   :private-members:\n   :no-link:\n\nUndocumented Members\n--------------------\n\n.. cpp:namespace:: @ex_class_members_undocumented\n\nThis displays the undocumented members of the class which are suppressed by\ndefault. Undocumented public members are only shown if the ``:members:`` option\nis also used. The same goes for the undocumented private members and the\n``private-members`` option.\n\n.. code-block:: rst\n\n   .. doxygenclass:: ClassTest\n      :project: class\n      :members:\n      :private-members:\n      :undoc-members:\n\nIt produces this output:\n\n.. doxygenclass:: ClassTest\n   :project: classtest\n   :members:\n   :private-members:\n   :undoc-members:\n   :no-link:\n\n.. note::\n\n   Undocumented classes are still not shown in the output due to an implementation\n   issue. Please post an issue on github if you would like this resolved.\n\n\n.. _class-example-membergroups:\n\nMembergroups\n------------\n\n.. cpp:namespace:: @ex_class_membergroups\n\nThis will show only members in the specified member group(s).\n\n.. code-block:: rst\n\n   .. doxygenclass:: GroupedMembers\n      :project: membergroups\n      :members:\n      :membergroups: myGroup\n\nIt produces this output:\n\n.. doxygenclass:: GroupedMembers\n   :project: membergroups\n   :members:\n   :membergroups: myGroup\n   :no-link:\n\nWithout ``:membergroups: myGroup`` it would produce:\n\n.. cpp:namespace:: @ex_class_membergroups_all\n\n.. doxygenclass:: GroupedMembers\n   :project: membergroups\n   :members:\n\n\n.. _class-example-membersonly:\n\nMembers-only\n------------\n\n.. cpp:namespace:: @ex_class_members_only\n\nThis will only show the members of a class, and not the class name, child\nclasses or structs, or any information about the class.\n\n.. code-block:: rst\n\n   .. doxygenclass:: ClassTest\n      :project: class\n      :members:\n      :members-only:\n\nIt produces this output:\n\n.. doxygenclass:: ClassTest\n   :project: classtest\n   :members:\n   :members-only:\n   :no-link:\n\nWithout ``:members-only:`` it would produce:\n\n.. cpp:namespace:: @ex_class_members_all\n\n.. doxygenclass:: ClassTest\n   :project: classtest\n   :members:\n   :no-link:\n\n.. note::\n\n   The members will be shown at the indentation normally reserver for class\n   definitions. To prevent this, you may want to indent the block by indenting\n   the ``.. doxygenclass`` directive.\n\n.. note::\n\n   In the ``readthedocs`` theme, the members will show up in the color scheme of the\n   class definitions. If you would like them rendered as the other members,\n   indent like above, create a ``_static/css/custom.css`` file containing\n\n   .. code-block:: css\n\n      /* render as functions not classes when indented (for :members-only:) */\n      html.writer-html4 .rst-content blockquote dl:not(.field-list)>dt,\n      html.writer-html5 .rst-content blockquote dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt {\n        margin-bottom: 6px;\n        border: none;\n        border-left: 3px solid #ccc;\n        background: #f0f0f0;\n        color: #555;\n      }\n\n   and add the following to your ``conf.py``\n\n   .. code-block:: python\n\n      html_static_path = ['_static']\n\n      html_css_files = ['css/custom.css']\n\nOutline Example\n---------------\n\n.. cpp:namespace:: @ex_class_outline\n\nThis displays only the names of the class members and not their\ndocumentation. The ``:members:`` and ``:private-members:`` options determine\nwhich members are displayed.\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n      :members:\n      :outline:\n\nIt produces this output:\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n   :members:\n   :outline:\n   :no-link:\n\nQt Signals & Slots Example\n--------------------------\n\n.. cpp:namespace:: @ex_class_qt\n\nDoxygen is aware of Qt Signals and Slots and so Breathe can pick them up and\ndisplay them in the output. They are displayed in appropriate ``Signals``,\n``Public Slots``, ``Protected Slots`` and ``Private Slots`` sections.\n\n.. code-block:: rst\n\n   .. doxygenclass:: QtSignalSlotExample\n      :project: qtsignalsandslots\n      :members:\n\nProduces the following output:\n\n.. doxygenclass:: QtSignalSlotExample\n   :project: qtsignalsandslots\n   :members:\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_class_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenclass:: made_up_class\n      :project: class\n      :members:\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenclass: Cannot find class “made_up_class” in doxygen xml\n   output for project “class” from directory: ../../examples/doxygen/class/xml/\n"
  },
  {
    "path": "documentation/source/code/groups.h",
    "content": "// Example from Doxygen documentation\n\n/** A class. More details about the Test class */\nclass UserDefinedGroupTest\n{\n  public:\n    //@{\n    /** Same documentation for both members. Details */\n    void func1InGroup1();\n    void func2InGroup1();\n    //@}\n\n    /** Function without group. Details. */\n    void ungroupedFunction();\n    void func1InCustomGroup();\n  protected:\n    void func2InCustomGroup();\n};\n\nvoid UserDefinedGroupTest::func1InGroup1() {}\nvoid UserDefinedGroupTest::func2InGroup1() {}\n\n/** @name Custom Group\n *  Description of custom group\n */\n//@{\n/** Function 2 in custom group. Details. */\nvoid UserDefinedGroupTest::func2InCustomGroup() {}\n/** Function 1 in custom group. Details. */\nvoid UserDefinedGroupTest::func1InCustomGroup() {}\n//@}\n"
  },
  {
    "path": "documentation/source/code/namespaces.h",
    "content": "\n/*! A namespace for nothing. */\nnamespace test_namespace {\n\n/*! A very important class. */\nclass Sample1\n{\npublic:\n    Sample1() {}\n};\n\n/*! Even more important class */\nclass Sample2\n{\n    Sample2() {}\n};\n\n/*! A function in the namespace */\nvoid foo() {}\n\n}\n"
  },
  {
    "path": "documentation/source/code/nested_list_1.h",
    "content": "/**\n *      \\file nested_list_1.h\n *      Example of nested lists in documentation.\n */\n\n/**\n *  A list of events:\n *    - mouse events\n *         -# mouse move event\n *         -# mouse click event\\n\n *            More info about the click event.\n *         -# mouse double click event\n *    - keyboard events\n *         1. key down event\n *         2. key up event\n *\n *  More text here.\n */\nclass NestedLists_1\n{\n};\n\n"
  },
  {
    "path": "documentation/source/code/nested_list_2.h",
    "content": "/**\n *      \\file nested_list_2.h\n *      Example of nested list in documentation.\n */\n\n/**\n * Text before the list\n * - list item 1\n *   - sub item 1\n *     - sub sub item 1\n *     - sub sub item 2\n *     .\n *     The dot above ends the sub sub item list.\n *\n *     More text for the first sub item\n *   .\n *   The dot above ends the first sub item.\n *\n *   More text for the first list item\n *   - sub item 2\n *   - sub item 3\n * - list item 2\n * .\n * More text in the same paragraph.\n *\n * More text in a new paragraph.\n */\nclass NestedLists_2\n{\n};\n\n"
  },
  {
    "path": "documentation/source/code/nested_list_3.h",
    "content": "/**\n *      \\file nested_list_3.h\n *      Example of nested lists in documentation.\n */\n\n/*!\n *  A list of events:\n *  <ul>\n *  <li> mouse events\n *     <ol>\n *     <li>mouse move event\n *     <li>mouse click event<br>\n *         More info about the click event.\n *     <li>mouse double click event\n *     </ol>\n *  <li> keyboard events\n *     <ol>\n *     <li>key down event\n *     <li>key up event\n *     </ol>\n *  </ul>\n *  More text here.\n */\n class NestedLists_3\n{\n};\n\n"
  },
  {
    "path": "documentation/source/code/nested_list_4.h",
    "content": "/**\n *      \\file nested_list_4.h\n *      Example of nested lists in documentation.\n */\n\n/**\n *  A list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_4\n{\n};\n\n"
  },
  {
    "path": "documentation/source/code/nested_list_5.h",
    "content": "/**\n *      \\file nested_list_4.h\n *      Example of nested lists in documentation.\n */\n\n/**\n *  A deeply nested list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *              -# swipe left\n *              -# swipe right\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_5\n{\n};\n"
  },
  {
    "path": "documentation/source/code/nutshell.h",
    "content": "/**\n    \\file nutshell.h\n    An overly extended example of how to use breathe\n*/\n\n/*!\n    With a little bit of a elaboration, should you feel it necessary.\n*/\nclass Nutshell\n{\npublic:\n\n    //! Our tool set\n    /*! The various tools we can opt to use to crack this particular nut */\n    enum Tool\n    {\n        kHammer = 0,          //!< What? It does the job\n        kNutCrackers,         //!< Boring\n        kNinjaThrowingStars   //!< Stealthy\n    };\n\n    //! Nutshell constructor\n    Nutshell();\n\n    //! Nutshell destructor\n    ~Nutshell();\n\n    /*! Crack that shell with specified tool\n\n      \\param tool - the tool with which to crack the nut\n    */\n    void crack( Tool tool );\n\n    /*!\n      \\return Whether or not the nut is cracked\n    */\n    bool isCracked();\n\nprivate:\n\n    //! Our cracked state\n    bool m_isCracked;\n\n};\n\n\n"
  },
  {
    "path": "documentation/source/codeblocks.rst",
    "content": "\nCode Blocks\n===========\n\nBreathe supports rendering code blocks with syntax highlighting provided by the\n`Pygments <https://pygments.org/>`_ library. By default, Breathe will assume\nthat code blocks match the language of the source file, but you can also specify\nthe language of the code blocks using\n`Doxygen's code command <https://www.doxygen.nl/manual/commands.html#cmdcode>`_\nor `MarkDown's fenced code blocks <https://www.doxygen.nl/manual/markdown.html#md_fenced>`_.\n\n.. note::\n   Any hyperlinked text found within the code blocks rendered with Doxygen's HTML output\n   will not be hyperlinked in any Sphinx output due to the use of the Pygments library.\n   As a benefit, a code-block's syntax highlighting can be any syntax supported by\n   Pygments (which is much more than only the languages supported by Doxygen's parsers).\n\nThe Doxygen syntax for code blocks supports specifying the language as follows:\n\n.. code-block::\n\n   \\code{.py}\n   class Python:\n      pass\n   \\endcode\n\n   @code{.cpp}\n   class Cpp {};\n   @endcode\n\nThis technique can also be utilized from MarkDown syntax/files\n\n.. code-block:: markdown\n\n   ```py\n   class Python:\n      pass\n   ```\n\n   ```cpp\n   class Cpp {};\n   ```\n\nBreathe will pass the language specified to Pygments to get accurate\nhighlighting. If no language is explicitly provided (either from ``\\code``\ncommand or via Doxygen's XML output about the language documented), then\nPygments will try to guess what syntax the code block is using (based on\nthe code block's contents).\n\nExamples\n--------\n\nThe following should render with standard C/C++ highlighting. Notice, the\nsyntax is automatically highlighted as C++ because the documented function\nexists in a C++ source file.\n\n----\n\n.. code-block:: cpp\n\n   /** A function with an unannotated code block with C/C++ code.\n    *\n    * @code\n    * char *buffer = new char[42];\n    * int charsAdded = sprintf(buffer, \"Tabs are normally %d spaces\\n\", 8);\n    * @endcode\n    */\n   void with_standard_code_block();\n\n----\n\n.. doxygenfunction:: with_standard_code_block\n   :path: ../../examples/specific/code_blocks/xml\n   :no-link:\n\n----\n\nThe following should render with no detected highlighting.\nNotice, there is no syntax highlighting because Pygments does not\nrecognize the code block's contained syntax as a C++ snippet.\n\n----\n\n.. code-block:: cpp\n\n   /** A function with an unannotated code block with non-C/C++ code.\n    *\n    * @code\n    * set(user_list A B C)\n    * foreach(element ${user_list})\n    *     message(STATUS \"Element is ${element}\")\n    * endforeach()\n    * @endcode\n    * \n    * Another code-block that explicitly remains not highlighted.\n    * @code{.unparsed}\n    * Show this as is.\n    * @endcode\n    */\n   void with_unannotated_cmake_code_block();\n\n----\n\n.. doxygenfunction:: with_unannotated_cmake_code_block\n   :path: ../../examples/specific/code_blocks/xml\n   :no-link:\n\n----\n\nThe following should render with specified CMake highlighting. Here, the syntax\nhighlighting is explicitly recognized as a CMake script snippet which overrides\nthe inherent C++ context.\n\n----\n\n.. code-block:: cpp\n\n   /** A function with an annotated cmake code block.\n    *\n    * @code{.cmake}\n    * set(user_list A B C)\n    * foreach(element ${user_list})\n    *     message(STATUS \"Element is ${element}\")\n    * endforeach()\n    * @endcode\n    */\n   void with_annotated_cmake_code_block();\n\n----\n\n.. doxygenfunction:: with_annotated_cmake_code_block\n   :path: ../../examples/specific/code_blocks/xml\n   :no-link:\n\n.. warning::\n   Pygments will raise a warning in the Sphinx build logs if\n   the specified syntax does conform the specified syntax's convention(s).\n"
  },
  {
    "path": "documentation/source/codeguide.rst",
    "content": "\n.. _codeguide:\n\nHow It Works\n============\n\n\nThere are three main sections to Breathe: parser, finders and renderers.\nBriefly:\n\n**parser**\n   Responsible for reading the doxygen xml output and creating objects\n   representing the data. Found in ``breathe.parser``.\n\n**finders**\n   Responsible for finding reference objects within the output from the\n   parser. Found in ``breathe.finder``.\n\n**renderers**\n   Responsible for producing reStructuredText nodes to represent the objects\n   that the finders have found. The renderers generally descend through the\n   object hierarchies rendering the objects, their children, their children's\n   children and so on. Found in ``breathe.renderer``.\n\nThe following flow chart shows how the different components of Breathe transform\ndata. The shaded region indicates which components are part of Breathe.\n\n.. image:: ../assets/BreatheFlowChart.svg\n  :width: 500\n  :alt: A flow chart showing that the initial input format is code. Doxgyen converts \n        code to XML. The Breathe parser converts XML to a hierarchy of python objects.\n        The Breathe Filter identifies which of these objects need to be rendered. The\n        Breathe Renderer converts these objects into reStructuredText (RST) nodes.\n        Finally, the RST node objects are passed to Sphinx to be turned into actual\n        HTML or LaTeX documents. \n  :class: only-light\n  :align: center\n\n.. image:: ../assets/BreatheFlowChart_DarkMode.svg\n  :width: 500\n  :alt: A flow chart showing that the initial input format is code. Doxgyen converts \n        code to XML. The Breathe parser converts XML to a hierarchy of python objects.\n        The Breathe Filter identifies which of these objects need to be rendered. The\n        Breathe Renderer converts these objects into reStructuredText (RST) nodes.\n        Finally, the RST node objects are passed to Sphinx to be turned into actual\n        HTML or LaTeX documents.\n  :class: only-dark\n  :align: center\n\n\nParser\n------\n\nThe parser's job is to parse the doxygen xml output and create a hierarchy of\nPython objects to represent the xml data.\n\nDoxygen XML Output\n~~~~~~~~~~~~~~~~~~\n\nThe xml output from doxygen comes in multiple files. There is always an\n``index.xml`` file which is a central reference point and contains a list of all\nthe other files that have been generated by doxygen and an indication of what\nthey contain. \n\nFor example, in ``examples/doxygen/func/xml`` directory, the ``index.xml`` file\ncontains:\n\n.. code-block:: xml\n\n   <?xml version='1.0' encoding='UTF-8' standalone='no'?>\n   <doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"index.xsd\" version=\"1.7.2\">\n     <compound refid=\"class_test\" kind=\"class\"><name>Test</name>\n       <member refid=\"class_test_1a45b6a232a4499f8ce37062eab5451570\" kind=\"function\"><name>member</name></member>\n     </compound>\n     <compound refid=\"func_8h\" kind=\"file\"><name>func.h</name>\n     </compound>\n   </doxygenindex>\n\nThis suggests there is additional information about a class called **Test**\nwhich has a function called **member**. Additionally there is some more\ninformation about a file called **func.h**.\n\nNow, the ``refid`` attribute on the ``compound`` xml nodes gives an indication\nof where the additional information can be found. So for the **Test** class, we\nshould look in ``class_test.xml``, which we get by simply appending ``.xml`` to\nthe ``refid`` value, and for the **func.h** file we should look in\n``func_8h.xml``.\n\nSo the ``index.xml`` file is unique in its role and has its own structure which\nis defined in the ``index.xsd`` file which you will also find in the same\ndirectory. All the other files, the ones referenced by the ``index.xml`` file, follow\nanother structure. This is described in ``compound.xsd`` file so we call these\nother files **compound** files. These are generally longer than the\n``index.xml`` file and contain all the specific information you might expect\nfrom doxygen, including any documentation you added to your code as doxygen\nmarkup.\n\nHave a look at ``examples/doxygen/func/xml/class_test.xml`` for a fairly short\nexample.\n\n\nDoing the Parsing\n~~~~~~~~~~~~~~~~~\n\nTo get things up and running quickly, I have used the `generateDS\n<https://pypi.org/project/generateDS/>`_ project to help create\nclasses to parse the doxygen xml output. The script automatically creates the\n``compound.py``, ``compoundsuper.py``, ``index.py`` and ``indexsuper.py`` files\nthat you can see inside ``breathe/parser/doxygen``.\n\nSo what is the difference between ``index.py`` and ``indexsuper.py``, and\n``compound.py`` and ``compoundsuper.py``? These files allow us to separate the\nbulk of the automatically generated code from the code changes we might want to\nmake. There are a large number of classes in the ``...super.py`` files and each\none has a basic derived class in the corresponding non-super files.\n\nIt is designed so that all the hard work done by the generated code is\ndone in the ``...super.py`` files and if we need to make changes we can do them\nin the derived classes in the non-super files and if we ever need to regenerate\nthe code, we only regenerate the ``...super.py`` files and so we don't lose our\nchanges in the process.\n\nThe end result is that for the parsing, we have written relatively little code,\nbut have a large amount automatically generated for us. This has only been done\nonce and it seems relatively unlikely that we'll do it again. The entry points to\nthe parsing code is the ``parse`` functions at the bottom of the\n``breathe.parser.doxygen.compound`` and ``breathe.parser.doxygen.index``.\n\nI have never really examined the details of the parsing but you can see that\nthere is a class for each node type you are likely to find in the xml files. I\nsay \"node type\" instead of just \"node\" because different nodes can share the\nsame type and there is one class per type. For example, there are\n**detaileddescription** nodes and **briefdescription** nodes which are both of\ntype **descriptionType**. If we look in ``breathe.parser.doxygen.compoundsuper``\nwe see a **descriptionType** class and in\n``breathe.parser.doxygen.compound`` we see a **descriptionTypeSub** class which\nis derived from **descriptionType**.\n\n\nOur Changes\n~~~~~~~~~~~\n\nYou'll notice there are some classes in the non-super files that have some\nadditional code in them. This tends to be adjusting the ``buildChildren`` member\nfunction in the derived class to extend or override the one in the\nautomatically generated base class.\n\nWe have to do this sometimes as it seems the original code we generated with\n``generateDS`` fails to construct the children of some classes. The\n``generateDS`` scripts uses the descriptions in the ``.xsd`` files to determine\nwhat classes to generate and what nodes can be the children of other nodes. It\nis possible that the doxygen ``.xsd`` files contain levels of abstraction that\nthe ``generateDS`` project did not cope with at the time I used it. It is\npossible that newer versions would handle it better but for the moment I'm\ncontent updating the derived classes to handle the cases I see missing.\n\n\n\nFinders\n-------\n\nThe finder classes have a relatively small but important job of finding objects\nin the hierarchy generated by the parsers. For example, when a user specifies a\nparticular class for the :ref:`doxygenclass directive <doxygenclass>`, we use\nthe finder classes to go and find the object corresponding to that class.\n\nIn fact, if you look closely, it is the finders that use the parser entry points\nto parse the xml and then find the objects. The finders also use ``Filter``\nobjects to actually figure out if they have found what they are looking for. \n\nThe finder is given a hierarchy of filter objects which are designed to match\nat different levels of the XML hierarchy. Filters can also represent logical\nconditions such as 'and' and 'or'.\n\nMore Details, Please\n~~~~~~~~~~~~~~~~~~~~\n\nSo initially, we create a finder to look at the root of the hierarchy: the\n**doxygenTypeSub** node. That finder, handily called\n**DoxygenTypeSubItemFinder** (you'll notice a lot of that) looks through all the\nchild compound nodes of the **doxygenTypeSub** node and tries a compound-level\nmatch against each of them and if something matches it creates a\n**CompoundTypeSubItemFinder** to look further. \n\nIn turn, that checks each of its member child nodes with a member-level match\nand if it finds one it creates a **MemberTypeSubItemFinder** (see the pattern?)\nand that does another check. The interesting part is, if that is successful, the\n**CompoundTypeSubItemFinder** finds the corresponding xml file that has more\ninformation in it (remember ``refid + .xml``?) and parses that and creates\nanother finder to start looking in there. This time it is a\n**DoxygenTypeSubItemFinder** from the ``breathe.finder.doxygen.compound``\nmodule. And the search goes on until we find an object to return for rendering.\n\nIf the **CompoundTypeSubItemFinder** fails to find any deeper levels to match\nagainst then it returns itself as it must be the target we're interested in.\n\nAs stated, the job of the finder is to find a single node for the renderers to\nstarting rendering to reStructuredText. That is all the finder does.\n\n\nRenderers\n---------\n\nFinally, the bit that really does something we care about. Rendering is the art\nof turning whatever object we've found in the hierarchy into reStructuredText\nnodes. This almost invariably means most of its children as well.\n\nMuch like with the finder classes, we start off creating a renderer for a\nparticular parser object and then it looks at its children and uses the renderer\nfactory to create appropriate renderers for those objects and tells them to\nrender and they look at their object's children and create appropriate renderers\nfor those and so on and so forth.\n\nThe node we start at is determined by the finder and ultimately by the user. The\nwhole process is kicked off by the ``Builder`` class, though it doesn't really\ndo much. The aim of the renderers is to return a list of reStructuredText nodes\nwhich is passed back to Sphinx to render into whatever you're final output\nformat is. \n\nThere are two complicated bits here. All the different renderers and all the\ndifferent reStructuredText nodes.\n\nDifferent Renderers\n~~~~~~~~~~~~~~~~~~~\n\nJust like with the parsers, there is one renderer per node type. In fact there\nis one renderer class per parser class and they are named almost the same and\nare designed to match up. The renderers look at the data on the instance\nof the corresponding parser class that they have been given and grab the\ninteresting bits and return reStructuredText nodes.\n\nFor reference on what there is to render, you can look at the parser class\ndefinitions or at the raw xml to see what attributes there are to render.\nSometimes if something isn't appearing in the final output, it is because the\nrenderer isn't returning an reStructuredText representation of it so the\nrendering code needs to be updated, and sometimes it is because the parser\nclasses are not picking it up properly so both the parser and the renderer code\nneeds to be updated.\n\nGiven a little bit of time, you get used to chasing through the xml nodes,\nthe parser classes and the corresponding renderers to figure out where all the\ninformation is ending up.\n\n\nreStructuredText Nodes\n~~~~~~~~~~~~~~~~~~~~~~\n\nWe use the reStructuredText API as provided by the fabulous docutils project\nand extended by Sphinx itself. For the most part, they are fairly straight\nforward and they are certainly well named.\n\nUnfortunately there are a lot of nodes and only certain ways of combining them.\nIt is also not always clear what arguments their constructs take. Whilst I'm\nsure it would be possible to figure it out with time and the appropriate source\ncode, the use of them is not something I've found very well documented and my\ncode largely operates on a basis of trial and error. \n\nOne day I'm sure I'll be enlightened, until then expect fairly naive code.\n\nTesting\n-------\n\nTests for Breathe can be found in the ``tests`` directory. They can be run by\nrunning ``make test`` in your terminal (assuming that you have pytest installed).\nThe bulk of Breathe's test suite is in  ``tests/test_renderer.py``, and this is\nwhere any renderer-related tests should be added. This documentation will focus\non how to write more renderer tests, as this is the most common region of the code\nto add new features to and perhaps the hardest to test.\n\nCreating Python Doxygen Nodes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs indicated in the diagram at the top of this page, the renderer is expecting to \nbe run after the parser has created a hierarchy of python objects. Thus, there is\na lot of set-up that would usually happen before the renderer is invoked. For ease\nof testing, it is often expedient to skip straight to the step where you have a\nhierarchy of Python objects representing some hypothetical XML that doxygen could\nhave produced. \n\n``test_renderer.py`` contains a number of classes designed to assist with this\nprocess. For just about any node that could show up in the XML produced by doxygen,\nthere is a class that quickly instantiates it in Python. For example, if you want\nto test the rendering of a member definition, you can use the ``WrappedMemebrDef``\nclass. Figuring out how nodes fit together can be challenging; until you're\ncomfortable with the type of XML produced by doxygen, the easiest process is likely:\n\n#. Write C++ code containing the behavior you would like to test.\n#. Run Doxygen on it, which will produce an XML file (likely inside a directory \n   called xml within your doxygen output directory)\n#. Re-build the relevant part of the xml file in Python using the ``Wrapped*`` \n   classes.\n\nFor example, lets say you have a struct representing a cat.\n\nYour C++ might look something like this (inspired by Sy Brand's\n`blog post <https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/>`_):\n\n.. code-block:: cpp\n\n   /**\n   A fluffy feline\n   */\n   struct cat {\n   /**\n      Make this cat look super cute\n   */\n      void make_cute();\n   };\n\nRunning Doxygen on this might give you XML something like this:\n\n.. code-block:: xml\n\n   <?xml version='1.0' encoding='UTF-8' standalone='no'?>\n   <doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"compound.xsd\" version=\"1.9.7\" xml:lang=\"en-US\">\n   <compounddef id=\"structcat\" kind=\"struct\" language=\"C++\" prot=\"public\">\n      <compoundname>cat</compoundname>\n      <includes refid=\"test__cpp_8hpp\" local=\"no\">test_cpp.hpp</includes>\n         <sectiondef kind=\"public-func\">\n            <memberdef kind=\"function\" id=\"structcat_1\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n               <type>void</type>\n               <definition>void cat::make_cute</definition>\n               <argsstring>()</argsstring>\n               <name>make_cute</name>\n               <qualifiedname>cat::make_cute</qualifiedname>\n               <briefdescription>\n               </briefdescription>\n               <detaileddescription>\n                  <para>Make this cat look super cute </para>\n               </detaileddescription>\n               <inbodydescription>\n               </inbodydescription>\n               <location file=\"test_cpp.hpp\" line=\"8\" column=\"8\"/>\n            </memberdef>\n         </sectiondef>\n      <briefdescription>\n      </briefdescription>\n      <detaileddescription>\n         <para>A fluffy feline </para>\n      </detaileddescription>\n      <location file=\"test_cpp.hpp\" line=\"4\" column=\"1\" bodyfile=\"test_cpp.hpp\" bodystart=\"4\" bodyend=\"15\"/>\n      <listofallmembers>\n         <member refid=\"structcat_1\" prot=\"public\" virt=\"non-virtual\"><scope>cat</scope><name>make_cute</name></member>\n      </listofallmembers>\n   </compounddef>\n   </doxygen>\n\nThere's a lot here. For now, let's just say we're testing something related to \nmember function definitions, and we only need to test that part of the \nhierarchy. We can load the ``memberdef`` part of this XML into a \n``WrappedMemberDef`` object as follows:\n\n.. code-block:: python\n\n   member_def = WrappedMemberDef(\n      kind=\"function\", #  From \"kind\" in open memberdef tag\n      definition=\"void cat::make_cute\", #  From <definition> tag\n      type=\"void\", #  From <type> tag\n      name=\"make_cute\", #  From <name> tag\n      argstring=\"()\", #  From <argstring> tag\n      virt=\"non-virtual\", #  From \"virt\" in open memberdef tag\n   )\n\nAs you can see, all of the arguments to the constructor are pulled directly out\nof the XML, either from options on the original memberdef or tags nested under \nit. There are a lot more optional arguments that can be provided to specify\nadditional details of the memberdef.\n\nMore advanced hierarchies can be represented by nesting nodes inside each\nother. For example, if our function took arguments, it would have ``<param>``\ntags nested within it. We could represent these as a list of ``WrappedParam``\nobjects passed into the ``param`` keyword argument.\n\nTo test that the node renders correctly, you can use the ``render`` function\nprovided in ``test_renderer.py``:\n\n.. code-block:: python\n\n   # Render the node and grab its description\n   signature = find_node(render(app, member_def), \"desc_signature\")\n   # You can now examine the contents of signature.astext() and assert that\n   # they are as expected\n\n\nMocks\n~~~~~\n\nIf you want to do more elaborate tests, it is useful to be aware of the various\nMock objects provided in ``test_renderer.py``. Because the renderer is \nexpecting to be executing in the context of a full Sphinx run, there are a lot\nof objects that it is expecting to have access to. For example, rendering some\nnodes requires making reference to a context object. The ``MockContext`` class \ncan serve as a stand-in."
  },
  {
    "path": "documentation/source/concept.rst",
    "content": "\n.. _concept-example:\n\ndoxygenconcept Directive Example\n================================\n\n.. warning::\n   C++20 Concepts support was added in Doxygen v1.9.2. Please be sure to use Doxygen v1.9.2 or\n   newer with :ref:`doxygenconcept`.\n\nWorking Example\n---------------\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenconcept:: Hashable\n      :project: cpp_concept\n\nIt produces this output:\n\n.. doxygenconcept:: Hashable\n   :project: cpp_concept\n\nFailing Example\n---------------\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenconcept:: MadeUpConcept\n      :project: cpp_concept\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenconcept: Cannot find concept \"MadeUpConcept\" in doxygen xml output\n"
  },
  {
    "path": "documentation/source/conf.py",
    "content": "from __future__ import annotations\n\nimport os\nimport re\nimport subprocess\nimport sys\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nimport sphinx\n\nif TYPE_CHECKING:\n    from sphinx.application import Sphinx\n    from sphinx.util.typing import ExtensionMetadata\n\nPROJECT_ROOT = Path(__file__).resolve().parent.parent.parent\nsys.path.append(str(PROJECT_ROOT))\n\n# General configuration\n# ---------------------\n\nextensions = [\n    \"breathe\",\n    \"sphinx.ext.graphviz\",\n    \"sphinx.ext.imgconverter\",\n    \"sphinx_copybutton\",\n    \"sphinxcontrib.spelling\",\n]\n\nmaster_doc = \"index\"\nproject = \"Breathe\"\ncopyright = \"2009-2025, Michael Jones\"\n\nif os.getenv(\"BREATHE_COMPARE\") == \"True\":\n    # If we're doing a comparison then set the version & release to 'compare'\n    # so that they are always the same otherwise they can come up as changes\n    # when we really don't care if they are different.\n    version = release = \"compare\"\nelse:\n    # Get a description of the current position.\n    git_tag = subprocess.run([\"git\", \"describe\", \"--tags\"], capture_output=True, encoding=\"utf-8\")\n    if re.match(r\"^v\\d+\\.\\d+\\.\\d+$\", git_tag.stdout):\n        # Check if it matches a pure tag number vX.Y.Z,\n        # rather than vX.Y.Z-91-g8676988, which is how non-tagged commits\n        # are described (relative to the last tag).\n        version = release = git_tag.stdout\n    else:\n        version = release = \"latest\"\n\n\n# Options for breathe extension\n# -----------------------------\n\nbreathe_projects = {\n    \"class\": \"../../examples/doxygen/class/xml/\",\n    \"classtest\": \"../../examples/specific/class/xml/\",\n    \"struct\": \"../../examples/specific/struct/xml/\",\n    \"interface\": \"../../examples/specific/interface/xml/\",\n    \"decl_impl\": \"../../examples/specific/decl_impl/xml/\",\n    \"structcmd\": \"../../examples/doxygen/structcmd/xml/\",\n    \"tinyxml\": \"../../examples/tinyxml/tinyxml/xml/\",\n    \"restypedef\": \"../../examples/doxygen/restypedef/xml/\",\n    \"nutshell\": \"../../examples/specific/nutshell/xml/\",\n    \"rst\": \"../../examples/specific/rst/xml/\",\n    \"c_file\": \"../../examples/specific/c_file/xml/\",\n    \"namespace\": \"../../examples/specific/namespacefile/xml/\",\n    \"userdefined\": \"../../examples/specific/userdefined/xml/\",\n    \"template_function\": \"../../examples/specific/template_function/xml/\",\n    \"template_class\": \"../../examples/specific/template_class/xml/\",\n    \"template_class_non_type\": \"../../examples/specific/template_class_non_type/xml/\",\n    \"template_specialisation\": \"../../examples/specific/template_specialisation/xml/\",\n    \"latexmath\": \"../../examples/specific/latexmath/xml/\",\n    \"functionOverload\": \"../../examples/specific/functionOverload/xml/\",\n    \"programlisting\": \"../../examples/specific/programlisting/xml/\",\n    \"image\": \"../../examples/specific/image/xml/\",\n    \"lists\": \"../../examples/specific/lists/xml/\",\n    \"tables\": \"../../examples/specific/tables/xml/\",\n    \"group\": \"../../examples/specific/group/xml/\",\n    \"union\": \"../../examples/specific/union/xml/\",\n    \"qtsignalsandslots\": \"../../examples/specific/qtsignalsandslots/xml/\",\n    \"array\": \"../../examples/specific/array/xml/\",\n    \"c_struct\": \"../../examples/specific/c_struct/xml/\",\n    \"c_enum\": \"../../examples/specific/c_enum/xml/\",\n    \"c_typedef\": \"../../examples/specific/c_typedef/xml/\",\n    \"c_macro\": \"../../examples/specific/c_macro/xml/\",\n    \"c_union\": \"../../examples/specific/c_union/xml/\",\n    \"define\": \"../../examples/specific/define/xml/\",\n    \"multifile\": \"../../examples/specific/multifilexml/xml/\",\n    \"cpp_anon\": \"../../examples/specific/cpp_anon/xml/\",\n    \"cpp_concept\": \"../../examples/specific/cpp_concept/xml/\",\n    \"cpp_enum\": \"../../examples/specific/cpp_enum/xml/\",\n    \"cpp_union\": \"../../examples/specific/cpp_union/xml/\",\n    \"cpp_function\": \"../../examples/specific/cpp_function/xml/\",\n    \"cpp_function_lookup\": \"../../examples/specific/cpp_function_lookup/xml/\",\n    \"cpp_friendclass\": \"../../examples/specific/cpp_friendclass/xml/\",\n    \"cpp_inherited_members\": \"../../examples/specific/cpp_inherited_members/xml/\",\n    \"cpp_ns_template_specialization\": \"../../examples/specific/cpp_ns_template_specialization/xml/\",\n    \"cpp_trailing_return_type\": \"../../examples/specific/cpp_trailing_return_type/xml/\",\n    \"cpp_constexpr_hax\": \"../../examples/specific/cpp_constexpr_hax/xml/\",\n    \"xrefsect\": \"../../examples/specific/xrefsect/xml/\",\n    \"membergroups\": \"../../examples/specific/membergroups/xml/\",\n    \"simplesect\": \"../../examples/specific/simplesect/xml/\",\n    \"dot_graphs\": \"../../examples/specific/dot_graphs/xml/\",\n}\n\nbreathe_projects_source = {\n    \"auto\": (\"../../examples/specific\", [\"auto_function.h\", \"auto_class.h\"]),\n}\n\nbreathe_default_project = \"tinyxml\"\n\nbreathe_domain_by_extension = {\n    \"h\": \"cpp\",\n    \"py\": \"py\",\n}\n\nbreathe_domain_by_file_pattern = {\n    \"class.h\": \"cpp\",\n    \"alias.h\": \"c\",\n    \"array.h\": \"c\",\n    \"c_*.h\": \"c\",\n}\n\nbreathe_use_project_refids = True\n\n\n# Options for HTML output\n# -----------------------\n\nhtml_theme = \"furo\"\nhtml_logo = \"_static/logo.svg\"\nhtml_favicon = \"_static/favicon.ico\"\nhtml_static_path = [\"_static\"]\nhtml_css_files = [\"breathe.css\"]\n\n\n# Options for the spelling extension\n# ----------------------------------\nspelling_word_list_filename = \"spelling_wordlist.txt\"\nspelling_lang = \"en_US\"\n\n\n# Extension interface\n# -------------------\n\ntry:\n    doxygen_test = subprocess.check_output([\"doxygen\", \"--version\"], encoding=\"utf-8\")\nexcept subprocess.CalledProcessError as err:\n    msg = f\"doxygen --version reported an error: {err.stderr}\"\n    raise RuntimeError(msg) from err\nelse:\n    print(f\"Using Doxygen v{doxygen_test}\")\n    del doxygen_test\n\n\nif os.getenv(\"READTHEDOCS\") == \"True\":\n    if version == \"latest\":\n        tags.add(\"documentation_build_readthedocs_latest\")  # NoQA: F821\n    else:\n        tags.add(\"documentation_build_readthedocs\")  # NoQA: F821\nelse:\n    tags.add(\"documentation_build_development\")  # NoQA: F821\n\n\ndef run_doxygen(folder: Path) -> None:\n    \"\"\"Run the doxygen make command in the designated folder\"\"\"\n    try:\n        subprocess.run([\"make\", \"DOXYGEN=doxygen\"], check=True, cwd=folder)\n    except subprocess.CalledProcessError as e:\n        print(f\"doxygen terminated by signal {-e.returncode}\", file=sys.stderr)\n    except OSError as e:\n        print(f\"doxygen execution failed: {e}\", file=sys.stderr)\n\n\ndef generate_doxygen_xml(app: Sphinx) -> None:\n    \"\"\"Run the doxygen make commands if we're on the ReadTheDocs server\"\"\"\n    if os.getenv(\"READTHEDOCS\") == \"True\":\n        # Attempt to build the doxygen files on the RTD server.\n        # Explicitly override the path/name used for executing doxygen\n        # to simply be 'doxygen' to stop the makefiles looking for the executable.\n        # This is because the `which doxygen` effort seemed to fail\n        # when tested on the RTD server.\n        run_doxygen(PROJECT_ROOT / \"examples\" / \"doxygen\")\n        run_doxygen(PROJECT_ROOT / \"examples\" / \"specific\")\n        run_doxygen(PROJECT_ROOT / \"examples\" / \"tinyxml\")\n\n\ndef setup(app) -> ExtensionMetadata:\n    if sphinx.version_info[:2] < (7, 4):\n        # Approach borrowed from the Sphinx docs\n        app.add_object_type(\n            \"confval\",\n            \"confval\",\n            objname=\"configuration value\",\n            indextemplate=\"pair: %s; configuration value\",\n        )\n\n    # Add hook for building doxygen xml when needed\n    app.connect(\"builder-inited\", generate_doxygen_xml)\n\n    return {\n        \"version\": version,\n        \"parallel_read_safe\": True,\n        \"parallel_write_safe\": True,\n    }\n"
  },
  {
    "path": "documentation/source/contributing.rst",
    "content": "\nContributing to Breathe\n=======================\n\nThere are four main ways you might consider contributing to Breathe.\n\n\nGive It A Go\n------------\n\n**...and let me know!** Firstly, the more people using it the better, but more\nthan that, hearing about the project being put to use is a great motivator for\nthe developer, namely me. \n\n\nReport Bugs & Suggest Features\n------------------------------\n\nEmbarrassingly I don't get to use Breathe that much in my general work, so it\ndoesn't really get pushed beyond the test code we have here in the repository.\n\nIf you use it and find issues with it, minor or major, please let me know and if\npossible provide some detail so I can reproduce it.\n\nWith the help of those who have posted issues on the github issue tracker we've\nmanaged to track down and improve some of the less obvious (and some more\nobvious!) parts of Breathe that weren't working properly.  \n\n\nImprove the Documentation\n-------------------------\n\nI've made an effort to document Breathe so it is usable, but I have a twisted\nperspective on the whole thing as I made it.\n\nI've already had some help with the documentation, which was greatly\nappreciated, but if you managed to get it working and find that the\ndocumentation could have been clearer in parts, let me know or write up a\nparagraph or two that would have helped you when you were trying it.\n\n\nFork It! And Improve the Code\n-----------------------------\n\nIf you find a bug, quite like Python and have some time, then grab a copy of the\ncode and have a go at fixing it. Nothing motivates me quite like other people\ncaring enough to put a bit of time into working on it. The contributions we've\nhad this way have been great and much appreciated.\n\nIf you want to help out, take a look at the :ref:`code guide<codeguide>` to see how\nit is all structured and works.\n\n\n\n\n\n"
  },
  {
    "path": "documentation/source/credits.rst",
    "content": "\nCredits\n=======\n\nThank you to:\n\n- `nijel <https://github.com/nijel>`_\n- `sebastianschaetz <https://github.com/sebastianschaetz>`_\n- `mbolivar <https://github.com/mbolivar>`_\n- `queezythegreat <https://github.com/queezythegreat>`_\n- `abingham <https://github.com/abingham>`_\n- `davidm <https://github.com/davidm>`_\n- `hobu <https://github.com/hobu>`_\n- `magro11 <https://github.com/magro11>`_\n- `scopatz <https://github.com/scopatz>`_\n- `vitaut <https://github.com/vitaut>`_\n- `vonj <https://github.com/vonj>`_\n- `jmnas <https://github.com/jmnas>`_\n- `donkopotamus <https://github.com/donkopotamus>`_\n- `jo3w4rd <https://github.com/jo3w4rd>`_\n- `Anthony Truchet <https://github.com/AnthonyTruchet>`_\n- `Daniel Matz <https://github.com/danielmatz>`_\n- `Andrew Hundt <https://github.com/ahundt>`_\n- `sebastinas <https://github.com/sebastinas>`_\n- `robo9k <https://github.com/robo9k>`_\n- `sieben <https://github.com/sieben>`_\n- `rweickelt <https://github.com/rweickelt>`_\n- `sam-roth <https://github.com/sam-roth>`_\n- `bnewbold <https://github.com/bnewbold>`_\n- `serge-sans-paille <https://github.com/serge-sans-paille>`_\n\nFor their contributions; reporting bugs, suggesting features, improving the code\nand working on the documentation. And thanks to:\n\n- Dimitri van Heesch for `Doxygen <https://www.doxygen.nl/>`_.\n- Georg Brandl for `Sphinx <https://www.sphinx-doc.org/>`_.\n- David Goodger for `Docutils <https://docutils.sourceforge.io/>`_ and reStructuredText.\n\nAnd thank you to whoever made the ``haiku`` theme for Sphinx.\n"
  },
  {
    "path": "documentation/source/customcss.rst",
    "content": "\n.. highlight:: css\n\nCustom CSS\n==========\n\nIn order to help with the output styling in HTML, Breathe attaches some custom\nclasses to parts of the document. There are three such classes:\n\n**breatheparameterlist**\n   Used to keep the description of a parameter displayed inline with the\n   parameter name. The Breathe docs use:\n\n   .. code-block:: css\n\n      .breatheparameterlist li tt + p {\n        display: inline;\n      }\n\n**breatheenumvalues**\n   Used to keep the description of an enum displayed inline with the\n   enum name. The Breathe docs use:\n\n   .. code-block:: css\n\n      .breatheenumvalues li tt + p {\n        display: inline;\n      }\n"
  },
  {
    "path": "documentation/source/define.rst",
    "content": "\n.. _define-example:\n\ndoxygendefine Directive Example\n===============================\n\nWorking Example\n---------------\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygendefine:: WRITE_TREE_MISSING_OK\n      :project: c_file\n\nIt produces this output:\n\n.. doxygendefine:: WRITE_TREE_MISSING_OK\n  :project: c_file\n\nFailing Example\n---------------\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygendefine:: MADEUPDEFINE\n      :project: define\n\nIt produces the following warning message:\n\n.. warning::\n   doxygendefine: Cannot find define \"MADEUPDEFINE\" in doxygen xml\n   output for project \"define\" in directory: ../../examples/specific/define/xml\n"
  },
  {
    "path": "documentation/source/differences.rst",
    "content": "\nDeviations from Doxygen & Autodoc\n=================================\n\nAs Breathe attempts to bridge the gap between Sphinx and Doxygen it is confined\nby both what Doxygen outputs in its XML and what Sphinx will accept through the\nDocutils document model.\n\nThis leads to a few differences between Breathe output and the Doxygen HTML\noutput and the Sphinx Autodoc output.\n\nThese are incomplete lists but we're keen to expand them as issues are brought\nto our attention.\n\nDoxygen\n-------\n\n- Doxygen allows both HTML and Markdown syntax for headings in comments. These\n  are rendered as standard HTML headings in the output (h1, h2, h3, etc.)\n\n  RestructuredText only allows headings at the start of document sections and\n  you cannot put arbitrary sections into the output to gain the appearance of\n  headings so any headings found in the doxygen comments are rendered as\n  emphasized text in the Breathe HTML output.\n\n\nSphinx Autodoc\n--------------\n\n- No differences highlighted yet, though they certainly exist.\n"
  },
  {
    "path": "documentation/source/directives.rst",
    "content": "Directives & Config Variables\n=============================\n\n.. toctree::\n   :hidden:\n\n   autoindex\n   function\n   struct\n   class\n   namespace\n   concept\n   enum\n   enumvalue\n   typedef\n   union\n   define\n   variable\n   file\n   group\n   autofile\n   page\n\n\nDirectives\n----------\n\nThe available directives are shown below. In each case the ``project``,\n``path``, ``no-link`` and ``outline`` options have the following meaning:\n\n``project``\n   Specifies which project, as defined in the ``breathe_projects`` config value,\n   should be used for this directive. This overrides the default project if one\n   has been specified.\n\n   This is not used by the `autodoxygenindex`_ directive. Use ``source``\n   instead to specify the entry in the :confval:`breathe_projects_source` config value\n   to use.\n\n``path``\n   Directly specifies the path to the folder with the doxygen output. This\n   overrides the project and default project if they have been specified.\n\n   This is not used by the `autodoxygenindex`_ directive. Use ``source-path``\n   instead to specify the root path to the sources files which are to be\n   processed.\n\n``no-link``\n   Instructs Breathe to not attempt to generate any document targets for the\n   content generated by this particular directive.\n\n   This allows you to have your main reference listings somewhere with\n   targets, but then to be able to sneak in repeat directives into other\n   parts of the documentation to illustrate particular points without\n   Sphinx getting confused what should be linked to by other references.\n\n``outline``\n   Results in Breathe only outputting the raw code definitions without\n   any additional description information.\n\nIf neither project nor path are provided on the directive then breathe will\nexpect the :ref:`breathe_default_project <default_project>` config value to be\nset.\n\n\n.. _doxygenclass:\n\ndoxygenclass\n~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single class. It takes the\nstandard ``project``, ``path``, ``outline`` and ``no-link`` options and\nadditionally the ``members``, ``protected-members``, ``private-members``,\n``undoc-members``, ``membergroups`` and ``members-only`` options\n\n.. code-block:: rst\n\n   .. doxygenclass:: <class name>\n      :project: ...\n      :path: ...\n      :members: [...]\n      :protected-members:\n      :private-members:\n      :undoc-members:\n      :membergroups: ...\n      :members-only:\n      :outline:\n      :no-link:\n      :allow-dot-graphs:\n\nCheckout the :ref:`doxygenclass documentation <class-example>` for more details\nand to see it in action.\n\n.. _doxygendefine:\n\ndoxygendefine\n~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single preprocessor\ndefine. It behaves the same as the `doxygenstruct`_ directive.\n\n.. code-block:: rst\n\n   .. doxygendefine:: <define name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <define-example>` to see it in action.\n\n.. _doxygenconcept:\n\ndoxygenconcept\n~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single concept. It\nbehaves the same as the `doxygenstruct`_ directive.\n\n.. code-block:: rst\n\n   .. doxygenconcept:: <concept name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <concept-example>` to see it in action.\n\n.. _doxygenenum:\n\ndoxygenenum\n~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single enum. It behaves\nthe same as the `doxygenstruct`_ directive.\n\n.. code-block:: rst\n\n   .. doxygenenum:: <enum name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <enum-example>` to see it in action.\n\n.. _doxygenenumvalue:\n\ndoxygenenumvalue\n~~~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single enum value.\n\n.. code-block:: rst\n\n   .. doxygenenumvalue:: <enum value name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <enumvalue-example>` to see it in action.\n\n.. _doxygenfile:\n\ndoxygenfile\n~~~~~~~~~~~\n\nThis directive generates the appropriate output for the contents of a source\nfile.\n\n.. code-block:: rst\n\n   .. doxygenfile:: <filename>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n      :sections: ...\n      :allow-dot-graphs:\n\nCheckout the :ref:`example <file-example>` to see it in action.\n\n.. _autodoxygenfile:\n\nautodoxygenfile\n~~~~~~~~~~~~~~~\n\nThis directive is this ``auto`` version of the `doxygenfile`_ directive above.\nIt handles the doxygen xml generation for you like the other auto directives.\n\n.. code-block:: rst\n\n   .. autodoxygenfile:: <filename>\n      :project: ...\n      :outline:\n      :no-link:\n      :sections: ...\n      :allow-dot-graphs:\n\nCheckout the :ref:`example <autodoxygenfile-example>` to see it in action.\n\n.. _doxygenfunction:\n\ndoxygenfunction\n~~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single function. The\nfunction name is required to be unique in the project.\n\n.. code-block:: rst\n\n   .. doxygenfunction:: <function name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <function-example>` to see it in action.\n\n.. _doxygengroup:\n\ndoxygengroup\n~~~~~~~~~~~~\n\nThis directive generates the appropriate output for the contents of a doxygen\ngroup. A doxygen group can be declared with specific doxygen markup in the\nsource comments as covered in the `doxygen grouping documentation`_.\n\nIt takes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``content-only``, ``desc-only``, ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` options.\n\n.. code-block:: rst\n\n   .. doxygengroup:: <group name>\n      :project: ...\n      :path: ...\n      :content-only:\n      :desc-only:\n      :outline:\n      :members:\n      :protected-members:\n      :private-members:\n      :undoc-members:\n      :no-link:\n      :inner:\n\nCheckout the :ref:`doxygengroup documentation <group-example>` for more details\nand to see it in action.\n\n.. _doxygen grouping documentation: https://www.doxygen.nl/manual/grouping.html\n\n\n.. _doxygenindex:\n\ndoxygenindex\n~~~~~~~~~~~~\n\nThis directive processes and produces output for everything described by the\nDoxygen xml output. It reads the ``index.xml`` file and process everything\nreferenced by it.\n\n.. code-block:: rst\n\n   .. doxygenindex::\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n      :allow-dot-graphs:\n\n.. _autodoxygenindex:\n\nautodoxygenindex\n~~~~~~~~~~~~~~~~\n\nThis directive performs a similar role to the `doxygenindex`_ directive except\nthat it handles the doxygen xml generation for you. It uses the\n:confval:`breathe_projects_source` configuration dictionary to judge which code source\nfiles should have doxygen xml generated for them. The ``project`` directive\noption associates the directive with a particular project in the\n:confval:`breathe_projects_source` dictionary. All the files references by the entry in\nthe :confval:`breathe_projects_source` will be included in the output. In addition, any\noptions specified in :confval:`breathe_doxygen_config_options` will be added to the\ngenerated Doxygen config file and any custom aliases specified in\n:confval:`breathe_doxygen_aliases` will be added to the `doxygen aliases\n<https://www.doxygen.nl/manual/custcmd.html>`_.\n\nThank you to `Scopatz <https://github.com/scopatz>`_ for the idea and initial\nimplementation.\n\n.. code-block:: rst\n\n   .. autodoxygenindex::\n      :project: ...\n      :outline:\n      :no-link:\n      :allow-dot-graphs:\n\nCheckout the :ref:`example <autodoxygenindex-example>` to see it in action.\n\n.. _doxygennamespace:\n\ndoxygennamespace\n~~~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for the contents of a namespace.\n\nIt takes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``content-only``, ``desc-only``, ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` options.\n\nTo reference a nested namespace, the full namespaced path must be provided, e.g.\n``foo::bar`` for the ``bar`` namespace inside the ``foo`` namespace.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: <namespace>\n      :project: ...\n      :path: ...\n      :content-only:\n      :desc-only:\n      :outline:\n      :members:\n      :protected-members:\n      :private-members:\n      :undoc-members:\n      :no-link:\n\nCheckout the :ref:`doxygennamespace documentation <namespace-example>` for more\ndetails and to see it in action.\n\n.. _doxygenstruct:\n\ndoxygenstruct\n~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single struct. The struct\nname is required to be unique in the project.\n\nIt takes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``members``, ``protected-members``, ``private-members``,\n``membergroups``, ``members-only`` and ``undoc-members`` options.\n\n.. code-block:: rst\n\n   .. doxygenstruct:: <struct name>\n      :project: ...\n      :path: ...\n      :members:\n      :protected-members:\n      :private-members:\n      :undoc-members:\n      :membergroups: ...\n      :members-only:\n      :outline:\n      :no-link:\n      :allow-dot-graphs:\n\nCheckout the :ref:`example <struct-example>` to see it in action.\n\n.. _doxygeninterface:\n\ndoxygeninterface\n~~~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single interface (specially-used\nclass). It behaves the same as the `doxygenclass`_ directive.\n\n.. code-block:: rst\n\n   .. doxygeninterface:: <interface name>\n      :project: ...\n      :path: ...\n      :members:\n      :protected-members:\n      :private-members:\n      :undoc-members:\n      :membergroups: ...\n      :members-only:\n      :outline:\n      :no-link:\n\n.. _doxygentypedef:\n\ndoxygentypedef\n~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single typedef. It behaves\nthe same as the doxygenstruct directive.\n\n.. code-block:: rst\n\n   .. doxygentypedef:: <typedef name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <typedef-example>` to see it in action.\n\n.. _doxygenunion:\n\ndoxygenunion\n~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single union. It behaves\nthe same as the doxygenstruct directive.\n\n.. code-block:: rst\n\n   .. doxygenunion:: <union name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <union-example>` to see it in action.\n\n.. _doxygenvariable:\n\ndoxygenvariable\n~~~~~~~~~~~~~~~\n\nThis directive generates the appropriate output for a single variable.\nIt behaves the same as the doxygenstruct directive.\n\n.. code-block:: rst\n\n   .. doxygenvariable:: <variable name>\n      :project: ...\n      :path: ...\n      :outline:\n      :no-link:\n\nCheckout the :ref:`example <variable-example>` to see it in action.\n\n.. _doxygenpage:\n\ndoxygenpage\n~~~~~~~~~~~\n\nThis directive generates the appropriate output for the contents of a doxygen\npage. A doxygen page is created for each \"key\" of every \\\\xrefitem command used\nfor markup in the source comments. For more information check the\n`doxygen xrefitem documentation`_.\n\nIt takes the standard ``project`` and ``path`` options and additionally the\n``content-only`` option.\n\n.. code-block:: rst\n\n   .. doxygenpage:: <page name>\n      :project: ...\n      :path: ...\n      :content-only:\n\nCheckout the :ref:`doxygenpage documentation <page-example>` for more details\nand to see it in action.\n\n.. _doxygen xrefitem documentation: https://www.doxygen.nl/manual/commands.html#cmdxrefitem\n\n\n\nConfig Values\n-------------\n\n.. confval:: breathe_projects\n\n   This should be a dictionary in which the keys are project names and the values are\n   paths to the folder containing the doxygen output for that project.\n\n.. _default_project:\n\n.. confval:: breathe_default_project\n\n   This should match one of the keys in the :confval:`breathe_projects` dictionary and\n   indicates which project should be used when the project is not specified on\n   the directive.\n\n.. confval:: breathe_domain_by_extension\n\n   Allows you to specify domains for particular files according to their\n   extension.\n\n   For example:\n\n   .. code-block:: python\n\n      breathe_domain_by_extension = {\n          \"h\" : \"cpp\",\n      }\n\n   You can also use this to enable support for Doxygen XML generated from PHP code:\n\n   .. code-block:: python\n\n      breathe_domain_by_extension = {\n          \"php\" : \"php\",\n      }\n\n.. confval:: breathe_domain_by_file_pattern\n\n   Allows you to specify domains for particular files by wildcard syntax. This\n   is checked after :confval:`breathe_domain_by_extension` and so will override\n   it when necessary.\n\n   For example:\n\n   .. code-block:: python\n\n      breathe_domain_by_file_pattern = {\n          \"\\*/alias.h\" : \"c\",\n      }\n\n   If you wanted all ``.h`` header files to be treated as being in the **cpp**\n   domain you might use the :confval:`breathe_domain_by_extension` example\n   above. But if you had one ``.h`` file that should be treated as being in the\n   **c** domain then you can override as above.\n\n\n.. confval:: breathe_projects_source\n\n   A dictionary in which the keys are project names and the values are a tuple\n   of the directory and a list of file names of the source code for those\n   projects that you would like to be automatically processed with doxygen.\n   If you have some files in:\n   \n   .. code-block:: text\n\n      /some/long/path/to/myproject/file.c\n      /some/long/path/to/myproject/subfolder/otherfile.c\n\n   Then you can set:\n\n   .. code-block:: python\n\n      breathe_projects_source = {\n          \"myprojectsource\" : (\n              \"/some/long/path/to/myproject\", [\"file.c\", \"subfolder/otherfile.c\"]\n          )\n      }\n\n   Then your `autodoxygenfile`_ usage can look like this:\n\n   .. code-block:: rst\n\n      .. autodoxygenfile:: file.c\n         :project: myprojectsource\n\n   The directory entry in the tuple can be an empty string if the entries in the\n   list are full paths.\n\n.. confval:: breathe_build_directory\n\n   In order to process the `autodoxygenindex`_ Breathe has to run ``doxygen``\n   to create the xml files for processing. This config value specifies the root\n   directory that these files should be created in. By default, this is set to\n   the parent directory of the ``doctrees`` output folder which is the normal\n   build directory. You can change it with this setting if you have a custom\n   set up.\n\n   Breathe will take the final value and append ``breathe/doxygen/<project\n   name>`` to the path to minimize conflicts.\n\n.. _breathe-default-members:\n\n.. confval:: breathe_default_members\n\n   Provides the directive flags that should be applied to all directives which\n   take ``:members:``, ``:private-members:`` and ``:undoc-members:`` options.\n   By default, this is set to an empty list, which means no members are\n   displayed. If you'd like to always display the public and public,\n   undocumented members then you could set it like this:\n\n   .. code-block:: python\n\n      breathe_default_members = ('members', 'undoc-members')\n\n.. _breathe-implementation-filename-extensions:\n\n.. confval:: breathe_implementation_filename_extensions\n\n   Provides a list of the filename extensions which are considered to be\n   implementation files. These files are ignored when the `doxygenfunction`_\n   directive looks for un-namespaced function names. This is to avoid the issue\n   where the same function name appears in the doxygen XML output for a header\n   file and implementation file because the declaration is in one and the\n   definition is in the other. Doxygen appends the documentation from the\n   definition to the XML for the declaration so we don't miss any documentation\n   information from the implementation files. The default value for this\n   variable is:\n\n   .. code-block:: python\n\n      breathe_implementation_filename_extensions = ['.c', '.cc', '.cpp']\n\n.. _breathe-doxygen-config-options:\n\n.. confval:: breathe_doxygen_config_options\n\n   A dictionary in which the keys and values are the names and values of config\n   options to be placed in the Doxygen config file generated by\n   `autodoxygenindex`_. For instance, this:\n\n   .. code-block:: python\n\n      breathe_doxygen_config_options = {'EXCLUDE_SYMBOLS': 'abc123'}\n\n   would place ``EXCLUDE_SYMBOLS=abc123`` in the config file. The default value is\n   the empty dictionary.\n\n.. confval:: breathe_doxygen_aliases\n\n   A dictionary in which the keys and values are the names and values of aliases\n   to be placed in the Doxygen config file generated by `autodoxygenindex`_.\n   For instance, this:\n\n   .. code-block:: python\n\n      breathe_doxygen_aliases = {\n          'rstref{1}': r'\\verbatim embed:rst:inline :ref:`\\1` \\endverbatim'\n      }\n\n   would place the line::\n\n      ALIASES += rstref{1}=\"\\verbatim embed:rst:inline :ref:`\\1` \\endverbatim\"\n\n   in the config file. The default value is an empty dictionary.\n   Note the use of a raw string to ensure that backslashes are interpreted as literal characters.\n   (This example alias enables linking to rst targets inline in doxygen comments using\n   ``\\rstref{<target_name>}``)\n\n.. confval:: breathe_show_define_initializer\n\n   A boolean flag which can be set to ``True`` to display the initializer of a define in the output.\n\n   For example a define ``MAX_LENGTH 100`` would be shown with the value 100 if this is set to ``True``,\n   and without if it is set to ``False``.\n\n.. confval:: breathe_show_enumvalue_initializer\n\n   A boolean flag which can be set to ``True`` to display the initializer of an enum value in the output.\n\n   For example an enum value ``TWO = 2`` would be shown with the value 2 if this is set to ``True``,\n   and without if it is set to ``False``.\n\n.. confval:: breathe_show_include\n\n   A boolean flag which can be set to ``False`` to hide the header in which each\n   entity (struct, function, macro, etc.) is defined.\n\n   For example, when set to ``True`` (the default) a ``struct Foo`` is rendered\n   similarly to::\n\n     struct Foo\n       #include <foo.hpp>\n       Description of Foo.\n\n   but when set to ``False`` it is instead rendered as::\n\n     struct Foo\n       Description of Foo.\n\n.. confval:: breathe_use_project_refids\n\n   True or False setting to control if the refids generated by breathe for doxygen\n   elements contain the project name or not. Legacy (breathe 4.6.0 and earlier)\n   behavior was that all refids are prefixed with the project name. This causes\n   trouble when trying to link documentation between multiple projects since the\n   projects can't see each other's documentation elements. The new default behavior\n   is to not prefix the refids with the project name. This::\n\n      breathe_use_project_refids = True\n\n   will restore the legacy behavior if it is needed.\n\n.. confval:: breathe_order_parameters_first\n\n   True or False setting to control if the parameters section from doxygen generated\n   documentation should be placed immediately after the brief and detailed description\n   or at the end, after the returns, remarks and warnings section. Default value and\n   also the legacy behavior is False.\n\n.. confval:: breathe_separate_member_pages\n\n   True or False setting to control if the input XML generated by Doxygen had the\n   Doxygen SEPARATE_MEMBER_PAGES option set to YES or NO. The Doxygen option defaults\n   to NO which generates XML that allows Breathe to resolve all references. When set\n   to YES the refid/id of elements get an extra element which Breathe tries to get rid\n   of when this setting is True.\n"
  },
  {
    "path": "documentation/source/domains.rst",
    "content": "\nDomains\n=======\n\nBreathe has some limited support for Sphinx domains. It tries to output targets\nthat the Sphinx domain references expect. This should allow you to use Sphinx\ndomain roles like ``:c:func:`foo``` to link to output from Breathe.\n\nClass Example\n-------------\n\n.. cpp:namespace:: @ex_domains_class\n\nGiven the following Breathe directives:\n\n.. code-block:: rst\n\n   .. doxygenclass:: TestNamespaceClasses::NamespacedClassTest\n      :path: ../../examples/specific/class/xml\n\nWhich create formatted output like:\n\n.. doxygenclass:: TestNamespaceClasses::NamespacedClassTest\n   :path: ../../examples/specific/class/xml\n\nWe can refer to **NamespacedClassTest** using:\n\n.. code-block:: rst\n\n   :cpp:class:`TestNamespaceClasses::NamespacedClassTest`\n\nwhich renders as :cpp:class:`TestNamespaceClasses::NamespacedClassTest`, or using:\n\n.. code-block:: rst\n\n   :cpp:class:`another reference <TestNamespaceClasses::NamespacedClassTest>`\n\nwhich renders as: :cpp:class:`another reference <TestNamespaceClasses::NamespacedClassTest>`.\n\nInner Class Example\n-------------------\n\n.. cpp:namespace:: @ex_domains_inner_class\n\nGiven the following Breathe directive::\n\n   .. doxygenclass:: OuterClass\n      :path: ../../examples/specific/class/xml\n      :members:\n\nWhich create formatted output like:\n\n.. doxygenclass:: OuterClass\n   :path: ../../examples/specific/class/xml\n   :members:\n\nWe can refer to **OuterClass::InnerClass** using::\n\n   :cpp:class:`OuterClass::InnerClass`\n\nwhich renders as :cpp:class:`OuterClass::InnerClass`.\n\nFunction Examples\n-----------------\n\n.. cpp:namespace:: @ex_domains_function\n\nGiven the following Breathe directives:\n\n.. code-block:: rst\n\n   .. doxygenfunction:: TestNamespaceClasses::NamespacedClassTest::function\n      :path: ../../examples/specific/class/xml\n\n   .. doxygenfunction:: frob_foos\n      :path: ../../examples/specific/alias/xml\n\nWhich create formatted output like:\n\n.. doxygenfunction:: TestNamespaceClasses::NamespacedClassTest::function\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: frob_foos\n   :path: ../../examples/specific/alias/xml\n\nWe can refer to **namespaceFunc** using:\n\n.. code-block:: rst\n\n   :cpp:func:`TestNamespaceFunction::namespaceFunc()`\n\nwhich renders as :cpp:func:`TestNamespaceFunction::namespaceFunc()`, or using:\n\n.. code-block:: rst\n\n   :cpp:func:`another reference <namespaceFunc()>`\n\nwhich renders as: :cpp:func:`another reference <TestNamespaceFunction::namespaceFunc()>`.\nNote the use of the **cpp** domain.\n\nAnd we can refer to **frob_foos** using:\n\n.. code-block:: rst\n\n   :c:func:`frob_foos()`\n\nwhich renders as: :c:func:`frob_foos()`, or using:\n\n.. code-block:: rst\n\n   :c:func:`another reference <frob_foos()>`\n\nwhich renders as: :c:func:`another reference <frob_foos()>`. Note the use of the **c** domain.\n\nTypedef Examples\n----------------\n\n.. cpp:namespace:: @ex_domains_typedef\n\nGiven the following Breathe directives:\n\n.. code-block:: rst\n\n   .. doxygentypedef:: TestTypedef\n      :path: ../../examples/specific/typedef/xml\n\n   .. doxygennamespace:: TypeDefNamespace\n      :path: ../../examples/specific/typedef/xml\n\n   .. doxygenclass:: TestClass\n      :path: ../../examples/specific/typedef/xml\n      :members:\n\nwhich create formatted output like:\n\n.. doxygentypedef:: TestTypedef\n   :path: ../../examples/specific/typedef/xml\n\n.. doxygennamespace:: TypeDefNamespace\n   :path: ../../examples/specific/typedef/xml\n\n.. doxygenclass:: TestClass\n   :path: ../../examples/specific/typedef/xml\n   :members:\n\nWe can refer to **TestTypedef** using:\n\n.. code-block:: rst\n\n   :cpp:type:`TestTypedef`\n\nwhich renders as :cpp:type:`TestTypedef`, to **TypeDefNamespace::AnotherTypedef** using:\n\n.. code-block:: rst\n\n   :cpp:type:`TypeDefNamespace::AnotherTypedef`\n\nwhich renders as :cpp:type:`TypeDefNamespace::AnotherTypedef` and to **TestClass::MemberTypedef** using:\n\n.. code-block:: rst\n\n   :cpp:type:`TestClass::MemberTypedef`\n\nwhich renders as :cpp:type:`TestClass::MemberTypedef`.\n\nEnum Value Examples\n-------------------\n\n.. cpp:namespace:: @ex_domains_enum\n\nGiven the following Breathe directives:\n\n.. code-block:: rst\n\n   .. doxygenenumvalue:: VALUE\n      :path: ../../examples/specific/enum/xml\n\n   .. doxygenenumvalue:: TestEnumNamespace::FIRST\n      :path: ../../examples/specific/enum/xml\n\nWhich create formatted output like:\n\n.. doxygenenumvalue:: VALUE\n   :path: ../../examples/specific/enum/xml\n\n.. doxygenenumvalue:: TestEnumNamespace::FIRST\n   :path: ../../examples/specific/enum/xml\n\nWe can refer to **VALUE** using:\n\n.. code-block:: rst\n\n   :cpp:enumerator:`VALUE`\n\nwhich renders as :cpp:enumerator:`VALUE` and to **TestEnumNamespace::FIRST** using:\n\n.. code-block:: rst\n\n   :cpp:enumerator:`TestEnumNamespace::FIRST`\n\nwhich renders as :cpp:enumerator:`TestEnumNamespace::FIRST`.\n"
  },
  {
    "path": "documentation/source/dot_graphs.rst",
    "content": "Using Dot Graphs\n================\n\n.. _graphviz: https://www.sphinx-doc.org/en/master/usage/extensions/graphviz.html#module-sphinx.ext.graphviz\n.. _dot: https://www.doxygen.nl/manual/commands.html#cmddot\n.. _dotfile: https://www.doxygen.nl/manual/commands.html#cmddotfile\n\nSphinx graphviz prerequisites\n-----------------------------\n\nTo use Sphinx's graphviz_ directive at all, the project documentation's ``conf.py`` file must have\n``sphinx.ext.graphviz`` added to the list of ``extensions``.\n\n.. code-block:: python\n\n    extensions = [\"breathe\", \"sphinx.ext.graphviz\"]\n\n.. seealso::\n    To obtain the dot executable from the Graphviz library, see\n    `the library's downloads section <https://graphviz.org/download/>`_.\n\n.. note::\n    Typically, the dot executable's path should be added to your system's ``PATH`` environment\n    variable. This is required for Sphinx, although the configuration option,\n    `graphviz_dot <https://www.sphinx-doc.org/en/master/usage/extensions/graphviz.html#confval-graphviz_dot>`_,\n    can compensate for abnormal dot executable installations.\n\n``\\dot`` and ``\\dotfile`` commands\n----------------------------------\n\nBy default, breathe will translate any dot_ and dotfile_ commands into\nSphinx graphviz_ directives. However, there are some caveats:\n\n1. The only graphviz_ option supported is the ``caption`` option. Graph captions are optionally\n   specified using the dot_ or dotfile_ command syntax. All other graphviz_ directive options\n   fallback to their default behavior.\n\n   - any size hints from Doxygen's dot_ or dotfile_ commands are ignored.\n2. Using Doxygen's ``@ref`` command within any dot syntax is functionally ignored and treated as\n   literal text.\n\nGenerated graphs from Doxygen\n-----------------------------\n\nIf Doxygen is configured to use the dot executable to generate certain graphs, then some of these\ngraphs can be translated into Sphinx graphviz directives. Because this feature depends on having\nthe dot executable installed to generate graphs in Sphinx, the option ``allow-dot-graphs`` must be\nspecified for the following directives:\n\n- :ref:`doxygenclass`\n- :ref:`doxygenstruct`\n- :ref:`doxygenfile`\n- :ref:`doxygenindex`\n- :ref:`autodoxygenfile`\n- :ref:`autodoxygenindex`\n\n.. attention::\n    Only the following graphs generated by Doxygen can be found in its XML output:\n\n    .. csv-table::\n        :header: graph relevance, configuration option\n\n        files included within, `INCLUDE_GRAPH <https://www.doxygen.nl/manual/config.html#cfg_include_graph>`_\n        files included by, `INCLUDED_BY_GRAPH <https://www.doxygen.nl/manual/config.html#cfg_included_by_graph>`_\n        inheritance, `CLASS_GRAPH <https://www.doxygen.nl/manual/config.html#cfg_class_graph>`_\n        collaboration, `COLLABORATION_GRAPH <https://www.doxygen.nl/manual/config.html#cfg_collaboration_graph>`_\n\n    Unfortunately, the ``call`` and ``caller`` graphs are not provided by Doxygen's XML output.\n\nExamples of graphs generated by Doxygen are shown in this documentation's\n`Diagrams section of the doxygen test suite <doxygen.html#diagrams>`_\n\nExample Graphs\n--------------\n\nGraphs can be placed anywhere. For this example they are placed in a doxygen page.\n\n.. code-block:: rst\n\n    .. doxygenpage:: dotgraphs\n        :project: dot_graphs\n\nThis will render as:\n\n.. doxygenpage:: dotgraphs\n    :project: dot_graphs\n"
  },
  {
    "path": "documentation/source/doxygen.rst",
    "content": "\nDoxygen Test Suite\n==================\n\nClass\n-----\n\n.. cpp:namespace:: @ex_doxygen_class\n\n.. doxygenindex::\n   :project: class\n\nInterface\n---------\n\n.. cpp:namespace:: @ex_doxygen_interface\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/interface/xml\n\nDefine\n------\n\n.. the macros are in the C domain, and anyway in global scope\n.. cpp:namespace:: 0\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/define/xml\n\nEnum\n----\n\n.. cpp:namespace:: @ex_doxygen_enum\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/enum/xml\n\nFile \n-----\n\n.. cpp:namespace:: @ex_doxygen_file\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/file/xml\n\nFunc\n----\n\n.. cpp:namespace:: @ex_doxygen_func\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/func/xml\n\nPage\n----\n\n.. this is not related to Sphinx, but let's reset the namespace anyway\n.. cpp:namespace:: 0\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/page/xml\n\nRelates\n-------\n\n.. cpp:namespace:: @ex_doxygen_relates\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/relates/xml\n\nAuthor\n------\n\n.. cpp:namespace:: @ex_doxygen_author\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/author/xml\n\nPar\n---\n\n.. cpp:namespace:: @ex_doxygen_par\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/par/xml\n\nParblock\n--------\n\n.. cpp:namespace:: @ex_doxygen_parblock\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/parblock/xml\n\nOverload\n--------\n\n.. cpp:namespace:: @ex_doxygen_overload\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/overload/xml\n\nExample\n-------\n\n.. cpp:namespace:: @ex_doxygen_example\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/example/xml\n\nInclude\n-------\n\n.. cpp:namespace:: @ex_doxygen_include\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/include/xml\n\nQtStyle\n-------\n\n.. cpp:namespace:: @ex_doxygen_qtstyle\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/qtstyle/xml\n\nJdStyle\n-------\n\n.. cpp:namespace:: @ex_doxygen_jdstyle\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/jdstyle/xml\n\nStructCmd\n---------\n\n.. cpp:namespace:: @ex_doxygen_structcmd\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/structcmd/xml\n\nAutolink\n--------\n\n.. cpp:namespace:: @ex_doxygen_autolink\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/autolink/xml\n\nResTypeDef\n----------\n\n.. cpp:namespace:: @ex_doxygen_restypedef\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/restypedef/xml\n\nAfterDoc\n--------\n\n.. cpp:namespace:: @ex_doxygen_afterdoc\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/afterdoc/xml\n   \nTemplate\n--------\n\n.. cpp:namespace:: @ex_doxygen_template\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/template/xml\n\nTag\n---\n\n.. cpp:namespace:: @ex_doxygen_tag\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/tag/xml\n\nGroup\n-----\n\n.. cpp:namespace:: @ex_doxygen_group\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/group/xml\n\nDiagrams\n--------\n\n.. cpp:namespace:: @ex_doxygen_diagrams\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/diagrams/xml\n   :allow-dot-graphs:\n\nMemgrp\n------\n\n.. cpp:namespace:: @ex_doxygen_memgrp\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/memgrp/xml\n\nDocstring\n---------\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/docstring/xml\n\nPyExample\n---------\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/pyexample/xml\n\n\nManual\n------\n\n.. cpp:namespace:: @ex_doxygen_manual\n\n.. doxygenindex::\n   :path: ../../examples/doxygen/manual/xml\n"
  },
  {
    "path": "documentation/source/embeddedrst.rst",
    "content": "\nEmbedded ReStructuredText\n=========================\n\n.. cpp:namespace:: @ex_embedded_rst\n\n.. doxygenindex:: \n   :path: ../../examples/specific/rst/xml\n\n"
  },
  {
    "path": "documentation/source/enum.rst",
    "content": "\n.. _enum-example:\n\ndoxygenenum Directive Example\n===============================\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_enum_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenenum:: NodeType\n      :project: tinyxml\n\nIt produces this output:\n\n.. doxygenenum:: NodeType\n  :project: tinyxml\n\nExample with Namespace\n----------------------\n\n.. cpp:namespace:: @ex_enum_namespace\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenenum:: foo::ns::Letters\n      :project: namespace\n\nIt produces this output:\n\n.. doxygenenum:: foo::ns::Letters\n   :project: namespace\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_enum_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenenum:: made_up_enum\n      :project: restypedef\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenenum: Cannot find enum \"made_up_enum\" in doxygen xml output\n"
  },
  {
    "path": "documentation/source/enumvalue.rst",
    "content": "\n.. _enumvalue-example:\n\ndoxygenenumvalue Directive Example\n==================================\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_enumvalue_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenenumvalue:: TIXML_NO_ERROR\n      :project: tinyxml\n\nIt produces this output:\n\n.. doxygenenumvalue:: TIXML_NO_ERROR\n  :project: tinyxml\n\nExample with Namespace\n----------------------\n\n.. cpp:namespace:: @ex_enumvalue_namespace\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenenumvalue:: foo::ns::A\n      :project: namespace\n\nIt produces this output:\n\n.. doxygenenumvalue:: foo::ns::A\n   :project: namespace\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_enumvalue_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenenumvalue:: made_up_enumvalue\n      :project: restypedef\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenenumvalue: Cannot find enumvalue \"made_up_enumvalue\" in doxygen xml output\n"
  },
  {
    "path": "documentation/source/file.rst",
    "content": "\n.. _file-example:\n\ndoxygenfile Directive\n=====================\n\nThis directive generates the appropriate output for a single source file. It\ntakes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``sections`` options.\n\nFor the standard option refer to the documentation on the main directives page.\nThe directive-specific options are documented below.\n\n``sections``\n   Limit the sections to render for the given source file to the given list.\n   Many of the names come from Doxygen and Breathe internals and may not make\n   sense from an external point of view. Nevertheless it is hoped this table is\n   useful.\n\n   .. csv-table:: Section types\n      :header: \"Type\", \"Description\"\n\n      \"briefdescription\", \"Brief description\"\n      \"dcop-func\", \"DCOP Function\"\n      \"define\", \"Define\"\n      \"derivedcompoundref\", \"Derived compound reference\"\n      \"detaileddescription\", \"Detailed description\"\n      \"enum\", \"Enumerator\"\n      \"event\", \"Events\"\n      \"friend\", \"Friend\"\n      \"func\", \"Function\"\n      \"innerclass\", \"**Must be given to show sections inside a class**\"\n      \"innernamespace\", \"**Must be given to show sections inside a namespace**\"\n      \"package-attrib\", \"Package attribute\"\n      \"package-func\", \"Package function\"\n      \"package-static-attrib\", \"Package static attribute\"\n      \"package-static-func\", \"Package static function\"\n      \"package-type\", \"Package type\"\n      \"private-attrib\", \"Private attribute\"\n      \"private-func\", \"Private function\"\n      \"private-slot\", \"Private slot\"\n      \"private-static-attrib\", \"Private static attribute\"\n      \"private-static-func\", \"Private static function\"\n      \"private-type\", \"Private type\"\n      \"property\", \"Properties\"\n      \"protected-attrib\", \"Protected attribute\"\n      \"protected-func\", \"Protected function\"\n      \"protected-slot\", \"Protected slot\"\n      \"protected-static-attrib\", \"Protected static attribute\"\n      \"protected-static-func\", \"Protected static function\"\n      \"protected-type\", \"Protected type\"\n      \"prototype\", \"Prototype\"\n      \"public-attrib\", \"Public attribute\"\n      \"public-func\", \"Public function\"\n      \"public-slot\", \"Public slot\"\n      \"public-static-attrib\", \"Public static attribute\"\n      \"public-static-func\", \"Public static function\"\n      \"public-type\", \"Public type\"\n      \"related\", \"Related\"\n      \"signal\", \"Signal\"\n      \"typedef\", \"Type definition\"\n      \"user-defined\", \"User defined\"\n      \"var\", \"Variable\"\n\n\nExample\n-------\n\n.. cpp:namespace:: @ex_file_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenfile:: nutshell.h\n      :project: nutshell\n\nIt produces this output:\n\n----\n\n.. doxygenfile:: nutshell.h\n   :project: nutshell\n\nExample with Selected and Ordered Sections\n------------------------------------------\n\n.. cpp:namespace:: @ex_file_section\n\nThe following will only show the **briefdescription** and **public-type**\nsections, in that order:\n\n.. code-block:: rst\n\n   .. doxygenfile:: nutshell.h\n      :project: nutshell\n      :sections: briefdescription innerclass public-type\n\nIt produces this output:\n\n----\n\n.. doxygenfile:: nutshell.h\n   :project: nutshell\n   :sections: briefdescription innerclass public-type\n   :no-link:\n\nExample with Nested Namespaces\n------------------------------\n\n.. cpp:namespace:: @ex_file_namespace\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenfile:: namespacefile.h\n      :project: namespace\n\nIt produces this output:\n\n----\n\n.. doxygenfile:: namespacefile.h\n   :project: namespace\n\n\nExample for Multiple Files\n--------------------------\n\n.. cpp:namespace:: @ex_file_multiple_files\n\nWhen there are multiple files with the same name in the project, you need to be\nmore specific with the filename you provide. For example, in a project with the\nfollowing two files:\n\n.. code-block:: text\n\n   /some/long/project/path/parser/Util.h\n   /some/long/project/path/finder/Util.h\n\nYou should specify:\n\n.. code-block:: rst\n\n   .. doxygenfile:: parser/Util.h\n\n   .. doxygenfile:: finder/Util.h\n\nTo uniquely identify them.\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_file_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenfile:: made_up_file.h\n      :project: nutshell\n\nIt produces the following warning message:\n\n.. warning::\n   Cannot find file \"made_up_file.h\" in doxygen xml output for project \"nutshell\" from directory: ../../examples/specific/nutshell/xml/\n"
  },
  {
    "path": "documentation/source/function.rst",
    "content": "\n.. _function-example:\n\ndoxygenfunction Directive Example\n=================================\n\nThis directive generates the appropriate output for a single function. The\nfunction name, including namespace,  is required to be unique in the project.\n\nFor functions which have a declaration and definition in separate files, doxygen\ngenerates two entries for the function and Breathe can get confused when faced\nwith this. As a result Breathe ignores what it considers to be the\nimplementation files when searching for the XML for the function documentation.\nIn order to do this, it ignores any entries in files which have filename\nextensions listed in the :ref:`breathe_implementation_filename_extensions\n<breathe-implementation-filename-extensions>` config variable.\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_function_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenfunction:: open\n      :project: structcmd\n\nIt produces this output:\n\n.. doxygenfunction:: open\n   :project: structcmd\n\nSeparated Declaration & Implementation Example\n----------------------------------------------\n\n.. cpp:namespace:: @ex_function_separated\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenfunction:: open_di\n      :project: decl_impl\n\nIt produces this output:\n\n.. doxygenfunction:: open_di\n   :project: decl_impl\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_function_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenfunction:: made_up_function\n      :project: structcmd\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenfunction: Cannot find function \"made_up_function\" in doxygen xml output\n"
  },
  {
    "path": "documentation/source/group.rst",
    "content": "\n.. _group-example:\n\ndoxygengroup Directive\n======================\n\nThis directive generates the appropriate output for the contents of a doxygen\ngroup. A doxygen group can be declared with specific doxygen markup in the\nsource comments as cover in the `doxygen grouping documentation`_.\n\nIt takes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``content-only``, ``desc-only``, ``members``,\n``protected-members``, ``private-members``, ``undoc-members`` and ``inner``\noptions.\n\n``content-only``\n   If this flag is specified, then the directive does not output the name of the\n   group or the group description and instead outputs the contents of the group.\n   This can be useful if the groups are only used for organizational purposes\n   and not to provide additional information.\n\n``desc-only``\n   If specified, only the description and name of the group will be\n   displayed.\n\n``members``\n   If specified, the public members of any classes in the group output will be\n   displayed. Unlike the ``doxygenclass`` ``members`` option, this does not\n   optionally take a list of member names to display as this will be applied\n   across multiple classes within the group.\n\n``protected-members``\n   If specified, the protected members of any classes in the group output will\n   be displayed.\n\n``private-members``\n   If specified, the private members of any classes in the group output will be\n   displayed.\n\n``undoc-members``\n   If specified, the undocumented members of any classes in the group output\n   will be displayed provided the appropriate ``members`` or ``private-members``\n   options are specified as well.\n\nIf you would like to always specify some combination of ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` then you can\nuse the :confval:`breathe_default_members` configuration\nvariable to set it in the ``conf.py``.\n\n``inner``\n   If specified, the groups that were defined inside this group, by either\n   defining them inside the scope of another group, or by using the Doxygen\n   \\ingroup command, are also parsed and loaded.\n\n.. _doxygen grouping documentation: https://www.doxygen.nl/manual/grouping.html\n\n\n\nBasic Example\n-------------\n\n.. cpp:namespace:: @ex_group_basic\n\nThe plain ``doxygengroup`` directive will output the group name and description\nand any top level publicly visible members of the group.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n\nIt produces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n\nContent-Only Example\n--------------------\n\n.. cpp:namespace:: @ex_group_content_only\n\nThe ``content-only`` option changes the output to only include the content of\nthe group and not the group name or description. So this:\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :content-only:\n\nProduces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :content-only:\n   :no-link:\n\n.. note::\n\n   As you can see from the output, section headings like 'Functions' are missing\n   from the ``:content-only:`` display. This is due to an implementation detail. If\n   post an issue on github if you'd like it addressed.\n\n\nMembers Example\n---------------\n\n.. cpp:namespace:: @ex_group_members\n\nThe ``members`` option changes the output to include the public members of any\nclasses. The output for any class in the group should be the same as if it had\nbe produced by the :ref:`doxygenclass directive <class-example>` with the\n``members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :members:\n\nIt produces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :members:\n   :no-link:\n\nProtected Members Example\n-------------------------\n\n.. cpp:namespace:: @ex_group_members_protected\n\nThe ``protected-members`` option changes the output to include the protected\nmembers of any classes. The output for any class in the group should be the same\nas if it had be produced by the :ref:`doxygenclass directive <class-example>`\nwith the ``protected-members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :protected-members:\n\nIt produces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :protected-members:\n   :no-link:\n\nPrivate-Members Example\n-----------------------\n\n.. cpp:namespace:: @ex_group_members_private\n\nThe ``private-members`` option changes the output to include the private members\nof any classes. The output for any class in the group should be the same as if\nit had be produced by the :ref:`doxygenclass directive <class-example>` with the\n``private-members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :private-members:\n\nProduces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :private-members:\n   :no-link:\n\nUndocumented Members Example\n----------------------------\n\n.. cpp:namespace:: @ex_group_members_undocumented\n\nThe ``undoc-members`` option changes the output to include any undocumentated\nmembers from the sections (public, protected, private) that are being displayed\nfor the classes in the group output.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :private-members:\n      :undoc-members:\n\nProduces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :private-members:\n   :undoc-members:\n   :no-link:\n\n.. note::\n\n   Undocumented classes are still not shown in the output due to an implementation\n   issue. Please post an issue on github if you would like this resolved.\n\n\nInner Example\n-------------\n\n.. cpp:namespace:: @ex_group_inner\n\nThe ``inner`` option changes the output to include groups that are defined\ninside other groups.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :inner:\n\nProduces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :inner:\n   :no-link:\n\nOutline Example\n---------------\n\n.. cpp:namespace:: @ex_group_outline\n\nThis displays only the names of the members of the group and not their\ndocumentation. The other options determine which members are displayed.\n\n.. code-block:: rst\n\n   .. doxygengroup:: mygroup\n      :project: group\n      :members:\n      :outline:\n\nIt produces this output:\n\n.. doxygengroup:: mygroup\n   :project: group\n   :members:\n   :outline:\n   :no-link:\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_group_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygengroup:: madeupgroup\n      :project: group\n\nIt produces the following warning message:\n\n.. warning::\n   Cannot find file \"madeupgroup\" in doxygen xml output for project\n   \"group\" from directory: ../../examples/specific/group/xml/\n"
  },
  {
    "path": "documentation/source/groups.rst",
    "content": "\nGroups\n======\n\n.. cpp:namespace:: @ex_groups\n\nBreathe has basic support for the grouping functionality that Doxygen provides.\n\nUsing the example from the Doxygen docs:\n\n.. literalinclude:: code/groups.h\n   :language: cpp\n\nIf we reference this with a directive, for example:\n\n.. code-block:: rst\n\n   .. doxygenclass:: UserDefinedGroupTest\n      :project: userdefined\n      :members:\n      :protected-members:\n\nIt renders as:\n\n.. doxygenclass:: UserDefinedGroupTest\n   :project: userdefined\n   :members:\n   :protected-members:\n\n\n.. note::\n\n   Any groups which are not named in the original source code will appear as\n   **Unnamed Group** in the final output. This is different to Doxygen which\n   will number the groups and so name them as Group1, Group2, Group3, etc.\n"
  },
  {
    "path": "documentation/source/index.rst",
    "content": "..\n   BreatheExample documentation master file, created by sphinx-quickstart on Tue Feb  3 18:20:48 2009.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\nBreathe's documentation\n=======================\n\nBreathe provides a bridge between the Sphinx and Doxygen documentation systems.\n\nIt is an easy way to include Doxygen information in a set of documentation\ngenerated by Sphinx. The aim is to produce an autodoc like support for people\nwho enjoy using Sphinx but work with languages other than Python. The system\nrelies on the Doxygen's xml output.\n\n\n.. only:: documentation_build_readthedocs_latest\n\n   .. warning::\n\n      This documentation is built from the latest `Breathe github project\n      <https://github.com/breathe-doc/breathe/>`_ code. It does not necessarily\n      reflect a released version of Breathe on PyPI.\n\n.. only:: documentation_build_development\n\n   .. warning::\n\n      This build of the documentation is not from a specific tagged release of\n      Breathe. It reflects a work in progress state of Breathe. Please see the\n      `github repository <https://github.com/breathe-doc/breathe/>`_ for a more\n      official source of information.\n\n\nOverview\n--------\n\n* **Simple setup** - one doxygen config value, one Sphinx config value and one\n  directive and you'll be on your way.\n* **High and low level directives** - reference the whole project, just a class\n  or just a function with different directives.\n* **Support for multiple doxygen projects** - set it up to be aware of different\n  projects and reference them by name or path for each directive.\n* **Allows embedded reStructuredText in doxygen markup** - some extra doxygen\n  aliases allow you to add ``\\rst`` - ``\\endrst`` blocks to your comments and\n  have the contents interpreted as reStructuredText.\n* **Basic support for Sphinx domains** - Link to functions in the breathe output\n  with a standard Sphinx domain reference.\n\nSetup & Usage\n-------------\n\n.. toctree::\n   :maxdepth: 1\n\n   quickstart\n   directives\n   differences\n   readthedocs\n\nFeatures\n--------\n\n.. toctree::\n   :maxdepth: 1\n\n   markups\n   latexmath\n   codeblocks\n   domains\n   customcss\n   groups\n   lists\n   tables\n   template\n   dot_graphs\n\nContributing\n------------\n\n.. toctree::\n   :maxdepth: 1\n\n   contributing\n   codeguide\n   credits\n\nExample/Test Pages\n------------------\n\n.. toctree::\n   :maxdepth: 1\n\n   testpages\n\nDownload\n--------\n\nBreathe is available from:\n\n* `PyPI, the Python Package Index <https://pypi.org/project/breathe/>`_\n* `Github <https://github.com/breathe-doc/breathe/>`_\n\nLicense\n-------\n\nBreathe is under the `BSD license\n<https://github.com/breathe-doc/breathe/blob/master/LICENSE>`_.\n\nIn a Nutshell\n-------------\n\nYou write code that looks a little like this:\n\n.. literalinclude:: code/nutshell.h\n   :language: cpp\n\nThen you run this:\n\n.. code-block:: text\n\n   doxygen\n\nWith a setting that says this:\n\n.. code-block:: text\n\n   GENERATE_XML = YES\n\nThen in your Sphinx documentation, you add something like this:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Nutshell\n      :project: nutshell\n      :members:\n\nWith a ``conf.py`` setting like this:\n\n.. code-block:: python\n\n   breathe_projects = {\n       \"nutshell\": \"../../examples/specific/nutshell/xml/\",\n   }\n\nAnd Breathe registered as an extension in ``conf.py`` like this:\n\n.. code-block:: rst\n\n   extensions = [\"breathe\"]\n\nYou get something like this:\n\n----\n\n.. cpp:namespace:: @ex_index\n\n.. doxygenclass:: Nutshell\n   :project: nutshell\n   :members:\n\n----\n\nSound reasonable? To get started, go checkout the :doc:`quickstart guide <quickstart>`.\n"
  },
  {
    "path": "documentation/source/inline.rst",
    "content": "\nInline Parameter Documentation\n==============================\n\nThis is currently flawed as it doesn't know where to sensibly put the parameters\nin the final description.\n\nIt currently defaults to the top of the detail description block which means it\ncomes between the brief description text and the detailed description text which\nis less than ideal, but attempts to programmatically figure out where the detail\ndescription text ends have failed. Something for future work.\n\nExample\n-------\n\n.. cpp:namespace:: @ex_inline\n\n.. doxygenindex:: \n   :path: ../../examples/specific/inline/xml\n\n\n"
  },
  {
    "path": "documentation/source/latexmath.rst",
    "content": "\nLatex Math\n==========\n\nBreathe has basic support for latex math markup in the doxygen comments.  A\nclass with a comment like:\n\n.. code-block:: cpp\n\n   /**\n    * @brief A class\n    *\n    * A inline formula: \\f$ f(x) = a + b \\f$\n    *\n    * A display style formula:\n    * @f[\n    * \\int_a^b f(x) dx = F(b) - F(a)\n    * @f]\n    */\n   class MathHelper\n   {\n   public:\n     MathHelper() {}\n     ~MathHelper() {}\n   }\n\n\nWill be renderer as:\n\n.. cpp:namespace:: @ex_latexmath\n\n.. doxygenclass:: MathHelper\n   :project: latexmath\n   :members:\n   :undoc-members:\n\n\nWithout any additional configuration except for including a math extension in\nthe Sphinx ``conf.py``:\n\n.. code-block:: python\n\n   extensions = [\"breathe\", \"sphinx.ext.mathjax\"]\n\nThe specific environment formula fails when using ``sphinx.ext.pngmath`` so more\nwork is needed.\n\nImplementation\n--------------\n\nBreathe uses a internal reStructuredText node provided by\n``sphinx.ext.mathbase`` which is then picked up and rendered by the extension\nchosen in the ``conf.py``.  It does not pass any additional options through to\nthe node, so settings like ``label`` and ``nowrap`` are currently not supported.\n\nCredits\n-------\n\nThank you to `dazzlezhang <https://github.com/dazzlezhang>`_ for providing\nexamples and a full run down of necessary details.  It made the implementation\nmuch easier.\n"
  },
  {
    "path": "documentation/source/lists.rst",
    "content": "Lists\n======\n\nBreathe has support for lists in the doxygen documentation. They are output as\nfollows.\n\n.. cpp:namespace:: @ex_lists_plus\n\nFor unordered lists with list items prefixed with **+**:\n\n.. code-block:: rst\n\n   .. doxygenclass:: SimpleList_1\n      :project: lists\n\nIt renders as:\n\n----\n\n.. doxygenclass:: SimpleList_1\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_dash\n\nUnordered lists with list items prefixed with **-** render as:\n\n----\n\n.. doxygenclass:: SimpleList_2\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_star\n\nUnordered lists with list items prefixed with **\\*** render as:\n\n----\n\n.. doxygenclass:: SimpleList_3\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_html\n\nUnordered lists defined using HTML tags **<ul><li>** render as:\n\n----\n\n.. doxygenclass:: SimpleList_6\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_auto\n\nAuto-numbered lists with list items prefixed with **-#** render as:\n\n----\n\n.. doxygenclass:: SimpleList_4\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_arabic\n\nNumbered lists with list items prefixed with Arabic numerals **1. 2. ...** render as:\n\n----\n\n.. doxygenclass:: SimpleList_5\n   :project: lists\n\n----\n\n.. note::\n   Numbered lists support for the moment only Arabic numerals.\n\n\nNested lists are supported in all combinations, as long as they are valid doxygen markup.\nBelow are a couple of examples of different nested lists documentation and their corresponding\nbreathe output.\n\n.. cpp:namespace:: @ex_lists_nested_1\n\nDocumentation looking like this:\n\n.. literalinclude:: code/nested_list_1.h\n   :language: cpp\n\nrenders as:\n\n----\n\n.. doxygenclass:: NestedLists_1\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_nested_2\n\nDocumentation looking like this:\n\n.. literalinclude:: code/nested_list_2.h\n   :language: cpp\n\nrenders as:\n\n----\n\n.. doxygenclass:: NestedLists_2\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_nested_3\n\nDocumentation looking like this:\n\n.. literalinclude:: code/nested_list_3.h\n   :language: cpp\n\nrenders as:\n\n----\n\n.. doxygenclass:: NestedLists_3\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_nested_4\n\nDocumentation looking like this:\n\n.. literalinclude:: code/nested_list_4.h\n   :language: cpp\n\nrenders as:\n\n----\n\n.. doxygenclass:: NestedLists_4\n   :project: lists\n\n----\n\n.. cpp:namespace:: @ex_lists_nested_5\n\nDocumentation looking like this:\n\n.. literalinclude:: code/nested_list_5.h\n   :language: cpp\n\nrenders as:\n\n----\n\n.. doxygenclass:: NestedLists_5\n   :project: lists\n"
  },
  {
    "path": "documentation/source/markups.rst",
    "content": "\nSupported Markups\n=================\n\nAll comments in your code must be formatted in a doxygen-compliant way so that\ndoxygen can do its job. Doxygen provides support for formatting your text with\ntags, such as ``\\b`` for adding bold text, this information appears in the xml\noutput and Breathe attempts to reproduce it accurately.\n\nIn addition to this, is it possible to add reStructuredText into your comments\nwithin appropriately demarcated sections.\n\nreStructuredText\n----------------\n\n.. cpp:namespace:: @ex_markups_rst\n\nBreathe supports reStructuredText within doxygen **verbatim** blocks which begin\nwith the markup **embed:rst**. This means that a comment block like this:\n\n.. code-block:: cpp\n\n   /*!\n   Inserting additional reStructuredText information.\n   \\verbatim embed:rst\n   .. note::\n\n      This reStructuredText has been handled correctly.\n   \\endverbatim\n   */\n\nWill be rendered as:\n\n.. doxygenfunction:: TestClass::rawVerbatim\n   :project: rst\n   :no-link:\n\nHandling Leading Asterisks\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. cpp:namespace:: @ex_markups_leading_star\n\nNote that doxygen captures **all** content in a **verbatim** block.  This can\nbe rather an annoyance if you use a leading-asterisk style of comment block\nsuch as the following:\n\n.. code-block:: cpp\n\n   /*!\n    * Inserting additional reStructuredText information.\n    *\n    * \\verbatim embed:rst\n    *     Some example code\n    *\n    *     .. code-block:: cpp\n    *\n    *        int example(int x) {\n    *            return x * 2;\n    *        }\n    * \\endverbatim\n    */\n\nAs the leading asterisks are captured in the **verbatim** block this will\nappear to be an incorrectly formatted bullet list.  Due to the syntactical\nproblems Sphinx will issue warnings and the block will render as:\n\n..\n   Here we fake the bad output without actually using a bad example otherwise\n   we'll get warnings in the build output.\n\nvoid **rawBadAsteriskVerbatim**\\ ()\n\n   Inserting additional reStructuredText information.\n\n   - Some example code:\n   - int example(int x) {\n   - return x \\* 2;\n   - }\n\nTo prevent this, use an **embed:rst:leading-asterisk** tag:\n\n.. code-block:: cpp\n\n   /*!\n    * Inserting additional reStructuredText information.\n    *\n    * \\verbatim embed:rst:leading-asterisk\n    *     Some example code::\n    *\n    *        int example(int x) {\n    *            return x * 2;\n    *        }\n    * \\endverbatim\n    */\n\nThis will appropriately handle the leading asterisks and render as:\n\n----\n\n.. doxygenfunction:: TestClass::rawLeadingAsteriskVerbatim\n   :project: rst\n\n----\n\nHandling Leading Slashes\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. cpp:namespace:: @ex_markups_leading_slash\n\nSimilar troubles can be encountered when using comment blocks that start with a\ntriple forward slash. For example:\n\n.. code-block:: cpp\n\n   /// Some kind of method\n   ///\n   /// @param something a parameter\n   /// @returns the same value provided in something param\n   ///\n   /// @verbatim embed:rst:leading-slashes\n   ///    .. code-block:: c\n   ///       :linenos:\n   ///\n   ///       bool foo(bool something) {\n   ///           return something;\n   ///       };\n   ///\n   /// @endverbatim\n   /// @note Documentation using `///` should begin and end in a blank line.\n\nFor these kinds of blocks, you can use an **embed:rst:leading-slashes** tag as\nshown in the above example.\n\nThis will appropriately handle the leading slashes and render as:\n\n----\n\n.. doxygenfunction:: TestClass::rawLeadingSlashesVerbatim\n   :project: rst\n\n----\n\nInline rST\n~~~~~~~~~~\n\n.. cpp:namespace:: @ex_markups_inline\n\nNormal verbatim elements result in block elements. But sometimes you'll want\nto generate rST references where they need to be rendered inline with the text.\nFor example:\n\n.. code-block:: cpp\n\n   /// Some kind of method\n   ///\n   /// @param something a parameter\n   /// @returns the same value provided in something param\n   ///\n   /// @verbatim embed:rst:inline some inline text @endverbatim\n\nFor these kinds of references, you can use an **embed:rst:inline** tag as\nshown in the above example.\n\nThis will appropriately handle the leading slashes and render as:\n\n----\n\n.. doxygenfunction:: TestClass::rawInlineVerbatim\n   :project: rst\n\n.. doxygenfunction:: TestClass::rawVerbatim\n   :project: rst\n   :outline:\n\n----\n\nAliases\n~~~~~~~\n\n.. cpp:namespace:: @ex_markups_aliases\n\nTo make these blocks appear as more appropriate doxygen-like markup in your\ncomments you can add the following aliases to your doxygen configuration file:\n\n.. code-block:: text\n\n   ALIASES = \"rst=^^\\verbatim embed:rst^^\"\n   ALIASES += \"endrst=\\endverbatim\"\n\nWhich allow you to write comments like:\n\n.. code-block:: cpp\n\n   /*!\n   Inserting additional reStructuredText information.\n\n   \\rst\n\n   This is some funky non-xml compliant text: <& !><\n\n   .. note::\n\n       This reStructuredText has been handled correctly.\n   \\endrst\n\n   This is just a standard verbatim block with code:\n\n   \\verbatim\n       child = 0;\n       while( child = parent->IterateChildren( child ) )\n   \\endverbatim\n\n    */\n\nWhich will be rendered as:\n\n.. doxygenfunction:: TestClass::function\n   :project: rst\n\n.. note::\n\n   The character sequence ``^^`` in an ALIAS definition inserts a line break.\n   The leading ``^^`` ensures that a RST ``\\verbatim`` block never starts in a brief description\n   (which would break the output), even if you put it on the first line of a comment.\n   The trailing ``^^`` allows to start with RST content on the same line of the ``\\rst`` command.\n\nThe ALIAS given above only works for comment blocks without a leading comment character on each line.\nIf you use a comment style with a leading comment character on each new line,\nuse these aliases instead:\n\n.. code-block:: text\n\n   ALIASES = \"rst=^^\\verbatim embed:rst:leading-asterisk^^\"\n   ALIASES += \"endrst=\\endverbatim\"\n\nDue to an `undocumented behavior in doxygen <https://github.com/doxygen/doxygen/issues/8907>`_,\nall leading comment characters (``*``, ``///`` or ``//!``) encountered in a verbatim section\nwill be converted to asterisk (``*`` ) by Doxygen, when ``\\verbatim`` is part of an alias.\nTherefore, the ALIAS above works in all comment blocks with leading line comment characters.\n\nIf you want to hide reStructuredText output from Doxygen html and only include it in sphinx,\nuse the Doxygen command ``\\xmlonly``.\nThis is an example alias that enables all RST sections in XML only:\n\n.. code-block:: text\n\n    ALIASES = \"rst=^^\\xmlonly<verbatim>embed:rst:leading-asterisk^^\"\n    ALIASES += \"endrst=</verbatim>\\endxmlonly\"\n"
  },
  {
    "path": "documentation/source/members.rst",
    "content": "\nMembers Tests\n=============\n\nAll Members\n-----------\n\n.. cpp:namespace:: @ex_members_all\n\n.. doxygenclass:: testnamespace::NamespacedClassTest\n   :path: ../../examples/specific/members/xml\n   :members:\n\nSpecific Members\n----------------\n\n.. cpp:namespace:: @ex_members_specific\n\n.. doxygenclass:: testnamespace::NamespacedClassTest\n   :path: ../../examples/specific/members/xml\n   :members: functionS, anotherFunction\n   :no-link:\n\nNo Members\n----------\n\n.. cpp:namespace:: @ex_members_no\n\n.. doxygenclass:: testnamespace::NamespacedClassTest\n   :path: ../../examples/specific/members/xml\n   :no-link:\n\nStruct Members\n----------------\n\n.. cpp:namespace:: @ex_members_struct\n\n.. doxygenfunction:: testnamespace::MyClass::MyClass()\n   :path: ../../examples/specific/struct_function/xml\n\n.. doxygenfunction:: testnamespace::MyClass::MyClass(const MyClass&)\n   :path: ../../examples/specific/struct_function/xml\n\n.. doxygenvariable:: testnamespace::MyClass::myMemberVar\n   :path: ../../examples/specific/struct_function/xml\n"
  },
  {
    "path": "documentation/source/namespace.rst",
    "content": "\n.. _namespace-example:\n\ndoxygennamespace Directive\n==========================\n\nThis directive generates the appropriate output for the contents of a\nnamespace.\n\nIt takes the standard ``project``, ``path``, ``outline`` and ``no-link`` options\nand additionally the ``content-only``, ``desc-only``, ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` options.\n\n``content-only``\n   If this flag is specified, then the directive does not output the name of the\n   namespace or the namespace description and instead outputs the contents of\n   the namespace. This can be useful for structuring your documentation but\n   leaving out the namespace declaration itself which is often undocumented.\n\n``desc-only``\n   If specified, only the description and name of the namespace will be\n   displayed.\n\n``members``\n   If specified, the public members of any classes in the namespace output will be\n   displayed. Unlike the ``doxygenclass`` ``members`` option, this does not\n   optionally take a list of member names to display as this will be applied\n   across multiple classes within the namespace.\n\n``protected-members``\n   If specified, the protected members of any classes in the namespace output will\n   be displayed.\n\n``private-members``\n   If specified, the private members of any classes in the namespace output will be\n   displayed.\n\n``undoc-members``\n   If specified, the undocumented members of any classes in the namespace output\n   will be displayed provided the appropriate ``members`` or ``private-members``\n   options are specified as well.\n\nIf you would like to always specify some combination of ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` then you can\nuse the :ref:`breathe_default_members <breathe-default-members>` configuration\nvariable to set it in the ``conf.py``.\n\n\n\nBasic Example\n-------------\n\n.. cpp:namespace:: @ex_namespace_basic\n\nThe plain ``doxygennamespace`` directive will output the namespace name and\ndescription and any top level publicly visible members of the namespace.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n\nIt produces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n\nContent-Only Example\n--------------------\n\n.. cpp:namespace:: @ex_namespace_content_only\n\nThe ``content-only`` option changes the output to only include the content of\nthe namespace and not the namespace name or description. So this:\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :content-only:\n\nProduces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :content-only:\n   :no-link:\n\n.. note::\n\n   As you can see from the output, section headings like 'Functions' are missing\n   from the ``:content-only:`` display. This is due to an implementation detail. Open\n   an issue on github if you'd like it addressed.\n\n\nMembers Example\n---------------\n\n.. cpp:namespace:: @ex_namespace_members\n\nThe ``members`` option changes the output to include the public members of any\nclasses. The output for any class in the namespace should be the same as if it had\nbe produced by the :ref:`doxygenclass directive <class-example>` with the\n``members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :members:\n\nIt produces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :members:\n   :no-link:\n\n\nProtected Members Example\n-------------------------\n\n.. cpp:namespace:: @ex_namespace_members_protected\n\nThe ``protected-members`` option changes the output to include the protected\nmembers of any classes. The output for any class in the namespace should be the same\nas if it had be produced by the :ref:`doxygenclass directive <class-example>`\nwith the ``protected-members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :protected-members:\n\nIt produces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :protected-members:\n   :no-link:\n\n\nPrivate-Members Example\n-----------------------\n\n.. cpp:namespace:: @ex_namespace_members_private\n\nThe ``private-members`` option changes the output to include the private members\nof any classes. The output for any class in the namespace should be the same as if\nit had be produced by the :ref:`doxygenclass directive <class-example>` with the\n``private-members`` option specified.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :private-members:\n\nProduces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :private-members:\n   :no-link:\n\nUndocumented Members Example\n----------------------------\n\n.. cpp:namespace:: @ex_namespace_members_undocumented\n\nThe ``undoc-members`` option changes the output to include any undocumentated\nmembers from the sections (public, protected, private) that are being displayed\nfor the classes in the namespace output.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :private-members:\n      :undoc-members:\n\nProduces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :private-members:\n   :undoc-members:\n   :no-link:\n\n.. note::\n\n   Undocumented classes are still not shown in the output due to an\n   implementation issue. Please post an issue on github if you would like this\n   resolved.\n\n\nOutline Example\n---------------\n\n.. cpp:namespace:: @ex_namespace_outline\n\nThis displays only the names of the members of the namespace and not their\ndocumentation. The other options determine which members are displayed.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo\n      :project: namespace\n      :members:\n      :outline:\n\nIt produces this output:\n\n.. doxygennamespace:: foo\n   :project: namespace\n   :members:\n   :outline:\n   :no-link:\n\n\nNested Example\n--------------\n\n.. cpp:namespace:: @ex_namespace_nested\n\nThe referenced namespace can be nested in another namespace.\n\n.. code-block:: rst\n\n   .. doxygennamespace:: foo::ns\n      :project: namespace\n\nProduces this output:\n\n.. doxygennamespace:: foo::ns\n   :project: namespace\n   :no-link:\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_namespace_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygennamespace:: madeupnamespace\n      :project: namespace\n\nIt produces the following warning message:\n\n.. warning::\n   doxygennamespace: Cannot find namespace “madeupnamespace” in\n   doxygen xml output for project “namespace” from directory:\n   ../../examples/specific/namespacefile/xml/\n"
  },
  {
    "path": "documentation/source/page.rst",
    "content": "\n.. _page-example:\n\ndoxygenpage Directive\n=====================\n\nThis directive generates the appropriate output for the contents of a doxygen\npage. A doxygen page is created for each \"key\" of every \\\\xrefitem command used\nfor markup in the source comments. For more information check the\n`doxygen documentation`_.\n\nIt takes the standard ``project`` and ``path`` options.\n\n.. code-block:: rst\n\n   .. doxygenpage:: <page name>\n      :project: ...\n      :path: ...\n\n.. _doxygen documentation: https://www.doxygen.nl/manual/commands.html#cmdxrefitem\n\n\n\nBasic Example\n-------------\n\n.. cpp:namespace:: @ex_page_basic\n\nThe plain ``doxygenpage`` directive will output the page name and description\nand any variable entries which were defined to be part of this page (with an\n\\xrefitem usage).\n\n.. code-block:: rst\n\n   .. doxygenpage:: xrefsample\n      :project: xrefsect\n\nIt produces this output:\n\n.. doxygenpage:: xrefsample\n   :project: xrefsect\n\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_page_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygengroup:: madeuppage\n      :project: xrefsect\n\nIt produces the following warning message:\n\n.. warning::\n   Cannot find file \"madeuppage\" in doxygen xml output for project\n   \"xrefsect\" from directory: ../../examples/specific/xrefsect/xml/\n"
  },
  {
    "path": "documentation/source/quickstart.rst",
    "content": "Quick Start\n===========\n\nFor this quick start we assume the following prerequisites:\n\n* breathe was downloaded and extracted somewhere\n* doxygen was installed and doxygen output (XML format) was generated for the\n  project that is to be documented (set GENERATE_XML tag to YES)\n\nWe assume the following paths:\n\n* documentation root path: :file:`/home/me/docproj/`\n* breathe path: :file:`/home/me/docproj/ext/breathe/`\n* doxygen xml output: :file:`/home/me/docproj/doxyxml/`\n\nThe documentation path should contain a folder :file:`source` containing the\n:file:`conf.py` file. The doxygen xml output folder should contain the\n:file:`index.xml` output file generated by doxygen.\n\nThe following steps are required to integrate breathe functionality:\n\n#. Add the breathe path to your conf.py by adding the following line:\n\n   .. code-block:: python\n\n     sys.path.append(\"/home/me/docproj/ext/breathe/\")\n\n#. Add breathe as an extension the line could look like this:\n\n   .. code-block:: python\n\n     extensions = ['sphinx.ext.pngmath', 'sphinx.ext.todo', 'breathe' ]\n\n#. Tell breathe about the projects:\n\n   .. code-block:: python\n\n     breathe_projects = {\"myproject\": \"/home/me/docproj/doxyxml/\"}\n\n#. Specify a default project:\n\n   .. code-block:: python\n\n     breathe_default_project = \"myproject\"\n\nOnce this is done you may use the following commands to include documentation for different\nconstructs:\n\n.. code-block:: rst\n\n  .. doxygenindex::\n  .. doxygenfunction::\n  .. doxygenstruct::\n  .. doxygenenum::\n  .. doxygentypedef::\n  .. doxygenclass::\n\nFor each of these commands the following directives may be specified:\n\n``project``\n   Specifies which project, as defined in the breathe_projects config value,\n   should be used for this directive. This overrides the default.\n\n``path``\n   Directly specifies the path to the folder with the doxygen output. This\n   overrides the project and default project.\n"
  },
  {
    "path": "documentation/source/readthedocs.rst",
    "content": "\nRunning on Read the Docs\n=========================\n\n`Read the Docs`_ is an excellent site for hosting project documentation. It\nprovides hooks into common project hosting sites like Github_ & Bitbucket_ and can\nrebuild your documentation automatically whenever you push new code.\n\nThe site is designed for documentation written with Sphinx and supports Sphinx\nextensions via a correctly configured ``setup.py`` file.\n\nAs Breathe is a Sphinx extension you can use it on Read the Docs. However, as\nBreathe requires doxygen XML files, some additional configuration is required.\n\nDoxygen Support\n---------------\n\nRead the Docs do not explicitly support doxygen however they have had\nrequests for it to be supported and it is currently installed on their build\nservers.\n\nGenerating Doxygen XML Files\n----------------------------\n\nWe assume that you are not checking your doxygen XML files into your source\ncontrol system and so you will need to generate them on the Read the Docs\nserver before Sphinx starts processing your documentation.\n\nOne simple way of achieving this is to add the following code to your\n``conf.py`` file:\n\n.. code-block:: python\n\n   import subprocess, os\n\n   read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'\n\n   if read_the_docs_build:\n\n        subprocess.call('cd ../doxygen; doxygen', shell=True)\n\nThe first line uses the ``READTHEDOCS`` environment variable to determine\nwhether or not we are building on the Read the Docs servers. Read the Docs\nset this environment variable `specifically for this purpose`_.\n\nThen, if we are in a Read the Docs build, execute a simple shell command to\nbuild the doxygen xml for your project. This is a very simple example; the\ncommand will be determined by your project set up but something like this works\nfor the Breathe documentation.\n\nAs this is then executed right at the start of the ``sphinx-build`` process then\nall your doxygen XML files will be in place for the build.\n\nA More Involved Setup\n---------------------\n\nIf you'd rather do something more involved then you can run ``doxygen`` as part\nof a ``builder-inited`` event hook which you can install from your ``conf.py``\nfile by adding a ``setup`` function as shown below.\n\nThis is an approximation of the code that Breathe has in its ``conf.py`` in\norder to run ``doxygen`` on the Read the Docs server.\n\n.. code-block:: python\n\n    import subprocess, sys\n\n    def run_doxygen(folder):\n        \"\"\"Run the doxygen make command in the designated folder\"\"\"\n\n        try:\n            retcode = subprocess.call(\"cd %s; make\" % folder, shell=True)\n            if retcode < 0:\n                sys.stderr.write(\"doxygen terminated by signal %s\" % (-retcode))\n        except OSError as e:\n            sys.stderr.write(\"doxygen execution failed: %s\" % e)\n\n\n    def generate_doxygen_xml(app):\n        \"\"\"Run the doxygen make commands if we're on the ReadTheDocs server\"\"\"\n\n        read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'\n\n        if read_the_docs_build:\n\n            run_doxygen(\"../../examples/doxygen\")\n            run_doxygen(\"../../examples/specific\")\n            run_doxygen(\"../../examples/tinyxml\")\n\n\n    def setup(app):\n\n        # Add hook for building doxygen xml when needed\n        app.connect(\"builder-inited\", generate_doxygen_xml)\n\n.. _Read the Docs: https://readthedocs.org/\n.. _Github: https://github.com\n.. _Bitbucket: https://bitbucket.org\n.. _specifically for this purpose: https://docs.readthedocs.org/en/latest/faq.html#how-do-i-change-behavior-for-read-the-docs\n"
  },
  {
    "path": "documentation/source/specific.rst",
    "content": "\nSpecific Examples Test Suite\n============================\n\n\nTemplate Type Alias\n-------------------\n\n.. cpp:namespace:: @ex_specific_alias_template\n\n.. doxygentypedef:: IsFurry\n   :path: ../../examples/specific/template_type_alias/xml\n\n.. doxygentypedef:: IsFuzzy\n   :path: ../../examples/specific/template_type_alias/xml\n\nTypedef Examples\n----------------\n\n.. cpp:namespace:: @ex_specific_typedef\n\n.. doxygenindex::\n   :path: ../../examples/specific/typedef/xml\n\nNamespaced Function Examples\n----------------------------\n\n.. cpp:namespace:: @ex_specific_namespaced_function\n\n.. doxygenfunction:: TestNamespaceClasses::NamespacedClassTest::function\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: TestNamespaceClasses::ClassTest::function\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: TestNamespaceClasses::ClassTest::anotherFunction\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: ClassTest::function\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: ClassTest::anotherFunction\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: f0\n   :path: ../../examples/specific/class/xml\n.. doxygenfunction:: f0< std::string >\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: NS1::f1\n   :path: ../../examples/specific/class/xml\n.. doxygenfunction:: NS1::f1< std::string >\n   :path: ../../examples/specific/class/xml\n\n.. doxygenfunction:: NS1::NS2::f2\n   :path: ../../examples/specific/class/xml\n.. doxygenfunction:: NS1::NS2::f2< std::string >\n   :path: ../../examples/specific/class/xml\n\n\nExtern Examples\n---------------\n\n.. cpp:namespace:: @ex_specific_extern_examples\n\n.. doxygenfunction:: cache_tree_free\n   :project: c_file\n.. doxygenstruct:: cache_tree\n   :project: c_file\n   :outline:\n\nFixed Width Font\n----------------\n\n.. cpp:namespace:: @ex_specific_fixed_width\n\n.. doxygenclass:: Out\n   :path: ../../examples/specific/fixedwidthfont/xml\n   :members:\n\nFunction Overloads\n------------------\n\n.. cpp:namespace:: @ex_specific_function_overloads\n\n.. doxygenfunction:: f(int, int)\n   :project: functionOverload\n\n.. doxygenfunction:: f(double, double)\n   :project: functionOverload\n\n.. doxygenfunction:: test::g(int,int)\n   :project: functionOverload\n\n.. doxygenfunction:: test::g(double, double)\n   :project: functionOverload\n\n.. doxygenfunction:: h(std::string, MyType)\n   :project: functionOverload\n\n.. doxygenfunction:: h(std::string, MyOtherType)\n   :project: functionOverload\n\n.. doxygenfunction:: h(std::string, const int)\n   :project: functionOverload\n\n.. doxygenfunction:: h(std::string, const T, const U)\n   :project: functionOverload\n\nProgram Listing\n---------------\n\n.. cpp:namespace:: @ex_specific_program_listing\n\n.. doxygenclass:: Vector\n   :project: programlisting\n\n.. doxygenfunction:: center\n   :project: programlisting\n\nImage\n-----\n\n.. cpp:namespace:: @ex_specific_image\n\n.. doxygenclass:: ImageClass\n   :project: image\n\nArray Parameter\n---------------\n\n.. doxygenfunction:: foo\n   :project: array\n\n.. doxygenfunction:: bar\n   :project: array\n\nC Struct\n--------\n\n.. doxygenfile:: c_struct.h\n   :project: c_struct\n\nC Union\n-------\n\n.. doxygenfile:: c_union.h\n   :project: c_union\n\nC Enum\n------\n\n.. doxygenenum:: GSM_BackupFormat\n   :project: c_enum\n\nC Typedef\n---------\n\n.. doxygenfile:: c_typedef.h\n   :project: c_typedef\n\nC Macro\n-------\n\n.. doxygenfile:: c_macro.h\n   :project: c_macro\n\nC++ Macro\n---------\n\n.. doxygenfile:: define.h\n   :project: define\n\nMultifile\n---------\n\n.. cpp:namespace:: @ex_specific_multifile\n\n.. doxygenfunction:: TestTemplateFunction\n   :project: multifile\n\nInterface Class\n---------------\n\n.. cpp:namespace:: @ex_specific_interface\n\n.. doxygeninterface:: InterfaceClass\n   :project: interface\n\nC++ Anonymous Entities\n----------------------\n\n.. cpp:namespace:: @ex_specific_cpp_anon\n\n.. doxygenfile:: cpp_anon.h\n   :project: cpp_anon\n\nC++ Union\n---------\n\n.. cpp:namespace:: @ex_specific_cpp_union\n\n.. doxygenfile:: cpp_union.h\n   :project: cpp_union\n\nC++ Enums\n---------\n\n.. cpp:namespace:: @ex_specific_cpp_enum\n\n.. doxygenfile:: cpp_enum.h\n   :project: cpp_enum\n\nC++ Functions\n-------------\n\n.. cpp:namespace:: @ex_specific_cpp_function\n\n.. doxygenfile:: cpp_function.h\n   :project: cpp_function\n\nC++ Friend Classes\n------------------\n\n.. cpp:namespace:: @ex_specific_cpp_friendclass\n\n.. doxygenfile:: cpp_friendclass.h\n   :project: cpp_friendclass\n\nC++ Inherited Members\n---------------------\n\n.. cpp:namespace:: @ex_specific_cpp_inherited_members\n\n.. doxygenclass:: Base\n   :project: cpp_inherited_members\n.. doxygenclass:: A\n   :project: cpp_inherited_members\n.. doxygenclass:: B\n   :project: cpp_inherited_members\n\nC++ Template Specialization with Namespace\n------------------------------------------\n\n.. cpp:namespace:: @ex_specific_cpp_ns_template_specialization\n\n.. doxygenfile:: cpp_ns_template_specialization.h\n   :project: cpp_ns_template_specialization\n\nC++ Trailing Return Type\n------------------------\n\n.. cpp:namespace:: @ex_specific_cpp_trailing_return_type\n\n.. doxygenfile:: cpp_trailing_return_type.h\n   :project: cpp_trailing_return_type\n\nC++ Constexpr Handling\n------------------------\n\n.. cpp:namespace:: @ex_specific_cpp_constexpr_hax\n\nTest for issue 717.\n\n\n.. doxygenfile:: cpp_constexpr_hax.h\n   :project: cpp_constexpr_hax\n\nC++ Function Lookup\n-------------------\n\n.. cpp:namespace:: @ex_specific_cpp_function_lookup\n\n.. doxygenfunction:: fNoexcept()\n   :project: cpp_function_lookup\n.. doxygenfunction:: fFinal()\n   :project: cpp_function_lookup\n.. doxygenfunction:: fOverride()\n   :project: cpp_function_lookup\n\nThis one should actually have ``[[myattr]]`` but Doxygen seems to not put attributes into the XML:\n\n.. doxygenfunction:: fAttr()\n   :project: cpp_function_lookup\n.. doxygenfunction:: fFInit()\n   :project: cpp_function_lookup\n.. doxygenfunction:: fTrailing()\n   :project: cpp_function_lookup\n\n.. doxygenfunction:: fInit(int)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fPlain(int)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fPtr(int*)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fLRef(int&)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fRRef(int&&)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fParamPack(T...)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fMemPtr(int A::*)\n   :project: cpp_function_lookup\n.. doxygenfunction:: fParen(void (*)())\n   :project: cpp_function_lookup\n\n.. doxygenfunction:: fParenPlain(void (*)(int))\n   :project: cpp_function_lookup\n\n\nDoxygen xrefsect\n----------------\n\n.. doxygenfile:: xrefsect.h\n   :project: xrefsect\n\n\nDoxygen simplesect\n------------------\n\n.. doxygenfile:: simplesect.h\n   :project: simplesect\n"
  },
  {
    "path": "documentation/source/spelling_wordlist.txt",
    "content": "STL\nTVal\nautodoxygenindex\ncdata\ncfile\nconfig\ndoxygen\ndoxygenenum\ndoxygenfunction\ndoxygenstruct\ndoxygentypedef\ndoxygenfile\ndoxygenunion\ndoxygenvariable\ndoxygengroup\ndoxygendefine\ndoxygenclass\ndoxygenindex\nbitmasks\nmadeupgroup\nenum\nfoo\nfoos\nfrob\nfrobs\nnamespace\nnamespaces\nnamespaced\nreStructuredText\ntabsize\ntinyXml\ntinyxml\ntinyXML\nprogrammatically\nstruct\npy\nconf\ninline\nLicense\nautodoc\nrenderers\ngithub\nheesch\nbrandl\ngoodger\nwildcard\nwildcards\nxml\nFunc\nMemgrp\nDocstring\nAutolink\nGVal\nattributeB\n"
  },
  {
    "path": "documentation/source/struct.rst",
    "content": "\n..  This is more or less the class documentation with s/class/struct/g\n\n.. _struct-example:\n\ndoxygenstruct Directive\n=======================\n\nThis directive generates the appropriate output for a single struct. It takes the\nstandard ``project``, ``path``, ``outline`` and ``no-link`` options and\nadditionally the ``members``, ``protected-members``, ``private-members``,\n``undoc-members``, ``membergroups`` and ``members-only`` options.\n\n``members``\n   Designed to behavior in a similar manner to the ``members`` option for the\n   ``autostruct`` directive that comes with the Sphinx ``autodoc`` extension.\n\n   If you do not specify this option you will not get any information about the\n   struct members, just the general struct documentation. If you provide it\n   without arguments, then Breathe adds all the public members and their\n   documentation.  If you specify it with **comma separated** arguments, then\n   Breathe will treat the arguments as names of members and provide\n   documentation for only those members that have been named.\n\n``protected-members``\n   If specified, the protected members of the struct will be displayed.\n\n``private-members``\n   If specified, the private members of the struct will be displayed.\n\n``undoc-members``\n   If specified, the undocumented members of the struct will be displayed.\n\n``membergroups``\n  If specified, only the groups in a space-delimited list following this\n  directive will be displayed.\n\n``members-only``\n  This will allow to show only the members, not the struct information. Child\n  classes and structs are also not shown.\n\nIf you would like to always specify some combination of ``members``,\n``protected-members``, ``private-members`` and ``undoc-members`` then you can\nuse the :ref:`breathe_default_members <breathe-default-members>` configuration\nvariable to set it in the ``conf.py``.\n\n\n\nBasic Example\n-------------\n\n.. cpp:namespace:: @ex_struct_basic\n\nThis displays the struct documentation without any members:\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n\n\nMembers Example\n---------------\n\n.. cpp:namespace:: @ex_struct_members\n\nThis directive call will display the struct documentation with all the public\nmembers:\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :members:\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :members:\n   :no-link:\n\nSpecific Members Example\n------------------------\n\n.. cpp:namespace:: @ex_struct_members_specific\n\nThis displays the struct documentation with only the members listed in the\n``:members:`` option:\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :members: publicFunction, protectedFunction\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :members: publicFunction, protectedFunction\n   :no-link:\n\nProtected Members\n-----------------\n\n.. cpp:namespace:: @ex_struct_members_protected\n\nThis displays only the protected members of the struct. Normally this is combined\nwith the ``:members:`` option to show the public members as well.\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :protected-members:\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :protected-members:\n   :no-link:\n\nPrivate Members\n---------------\n\n.. cpp:namespace:: @ex_struct_members_private\n\nThis displays only the private members of the struct. Normally this is combined\nwith the ``:members:`` option to show the public members as well.\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :private-members:\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :private-members:\n   :no-link:\n\nUndocumented Members\n--------------------\n\n.. cpp:namespace:: @ex_struct_members_undocumented\n\nThis displays the undocumented members of the struct which are suppressed by\ndefault. Undocumented public members are only shown if the ``:members:`` option\nis also used. The same goes for the undocumented private members and the\n``private-members`` option.\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :members:\n      :private-members:\n      :undoc-members:\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :members:\n   :private-members:\n   :undoc-members:\n   :no-link:\n\n.. note::\n\n   Undocumented internal classes are still not shown in the output due to an\n   implementation issue. Please post an issue on github if you would like this\n   resolved.\n\n\nMembergroups\n------------\n\n.. cpp:namespace:: @ex_struct_membersgroups\n\nLists one or more names member groups.\n\nSee the :ref:`doxygenclass documentation <class-example-membergroups>`.\n\n\nMembers-only\n------------\n\nSee the :ref:`doxygenclass documentation <class-example-membersonly>`.\n\n\nOutline Example\n---------------\n\n.. cpp:namespace:: @ex_struct_outline\n\nThis displays only the names of the struct members and not their\ndocumentation. The ``:members:`` and ``:private-members:`` options determine\nwhich members are displayed.\n\n.. code-block:: rst\n\n   .. doxygenstruct:: StructTest\n      :project: struct\n      :members:\n      :outline:\n\nIt produces this output:\n\n.. doxygenstruct:: StructTest\n   :project: struct\n   :members:\n   :outline:\n   :no-link:\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_struct_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenstruct:: made_up_struct\n      :project: struct\n      :members:\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenstruct: Cannot find struct \"made_up_struct\" in doxygen xml\n   output for project “struct” from directory: ../../examples/doxygen/struct/xml/\n"
  },
  {
    "path": "documentation/source/tables.rst",
    "content": "Tables\n======\n\nBreathe has support for tables in the doxygen documentation. They are output as\nfollows.\n\n.. cpp:namespace:: @ex_tables_simple\n\nA simple Markdown syntax table:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Table_1\n      :project: tables\n\nIt renders as:\n\n----\n\n.. doxygenclass:: Table_1\n   :project: tables\n\n----\n\n.. cpp:namespace:: @ex_tables_aligned\n\nA Markdown syntax table with alignment:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Table_2\n      :project: tables\n\nIt renders as:\n\n----\n\n.. doxygenclass:: Table_2\n   :project: tables\n\n----\n\n.. cpp:namespace:: @ex_tables_rowspan\n\nA Markdown syntax table with rowspan (and alignment):\n\n.. code-block:: rst\n\n   .. doxygenclass:: Table_3\n      :project: tables\n\nIt renders as:\n\n----\n\n.. only:: html\n\n    .. doxygenclass:: Table_3\n       :project: tables\n\n----\n\n.. cpp:namespace:: @ex_tables_colspan\n\nA Markdown syntax table with colspan (and alignment):\n\n.. code-block:: rst\n\n   .. doxygenclass:: Table_4\n      :project: tables\n\nIt renders as:\n\n----\n\n.. only:: html\n\n    .. doxygenclass:: Table_4\n       :project: tables\n\n----\n\n.. cpp:namespace:: @ex_tables_doxygen\n\nA Doxygen syntax table:\n\n.. code-block:: rst\n\n   .. doxygenclass:: Table_5\n      :project: tables\n\nIt renders as:\n\n----\n\n.. only:: html\n\n    .. doxygenclass:: Table_5\n       :project: tables\n"
  },
  {
    "path": "documentation/source/template.rst",
    "content": "Template\n========\n\n.. cpp:namespace:: @ex_template_first\n\nBreathe has support for class and function templates. They are output as\nfollows. For a class with a single template parameter:\n\n.. code-block:: rst\n\n   .. doxygenclass:: templateclass\n      :project: template_class\n      :members:\n\nIt renders as:\n\n----\n\n.. doxygenclass:: templateclass\n   :project: template_class\n   :members:\n\n----\n\n.. cpp:namespace:: @ex_template_multiple\n\nWith multiple template parameters it renders as:\n\n----\n\n.. doxygenclass:: anothertemplateclass\n   :project: template_class_non_type\n   :members:\n\n----\n\n.. cpp:namespace:: @ex_template_function_single\n\nA function with single template parameter renders as:\n\n----\n\n.. doxygenfunction:: function1\n   :project: template_function\n\n----\n\n.. cpp:namespace:: @ex_template_function_single_specialization\n\nIf specialized for a given type it renders as:\n\n----\n\n.. doxygenfunction:: function1< std::string >\n   :project: template_function\n\n----\n\n.. cpp:namespace:: @ex_template_function_multiple\n\nWith multiple template parameters it renders as:\n\n----\n\n.. doxygenfunction:: function2\n   :project: template_function\n"
  },
  {
    "path": "documentation/source/testpages.rst",
    "content": "\nTest Pages\n==========\n\n.. toctree::\n   :maxdepth: 1\n\n   doxygen\n   tinyxml\n   specific\n   embeddedrst\n   inline \n   members\n"
  },
  {
    "path": "documentation/source/tinyxml.rst",
    "content": "\nTinyXML Test Suite\n==================\n\n.. cpp:namespace:: @ex_tinyxml\n\n.. doxygenindex::\n\n"
  },
  {
    "path": "documentation/source/typedef.rst",
    "content": "\n.. _typedef-example:\n\ndoxygentypedef Directive Example\n================================\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_typedef_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygentypedef:: UINT32\n      :project: structcmd\n\nIt produces this output:\n\n.. doxygentypedef:: UINT32\n  :project: structcmd\n\nExample with Namespace\n----------------------\n\n.. cpp:namespace:: @ex_typedef_namespace\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygentypedef:: foo::ns::MyInt\n      :project: namespace\n\nIt produces this output:\n\n.. doxygentypedef:: foo::ns::MyInt\n   :project: namespace\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_typedef_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygentypedef:: made_up_typedef\n      :project: restypedef\n\nIt produces the following warning message:\n\n.. warning::\n   doxygentypedef: Cannot find typedef \"made_up_typedef\" in doxygen xml output\n"
  },
  {
    "path": "documentation/source/union.rst",
    "content": "\n.. _union-example:\n\ndoxygenunion Directive Example\n==============================\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_union_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenunion:: SeparateUnion\n      :project: union\n\nIt produces this output:\n\n.. doxygenunion:: SeparateUnion\n  :project: union\n\nExample with Namespace\n----------------------\n\n.. cpp:namespace:: @ex_union_namespace\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenunion:: foo::MyUnion\n      :project: union\n\nIt produces this output:\n\n.. doxygenunion:: foo::MyUnion\n   :project: union\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_union_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenunion:: made_up_union\n      :project: union\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenunion: Cannot find union \"made_up_union\" in doxygen XML\n   output for project \"union\" from directory: ../../examples/specific/union/xml/\n"
  },
  {
    "path": "documentation/source/variable.rst",
    "content": "\n.. _variable-example:\n\ndoxygenvariable Directive Example\n=================================\n\nWorking Example\n---------------\n\n.. cpp:namespace:: @ex_variable_example\n\nThis should work:\n\n.. code-block:: rst\n\n   .. doxygenvariable:: global_cache_tree\n      :project: c_file\n\nIt produces this output:\n\n.. doxygenvariable:: global_cache_tree\n  :project: c_file\n\nFailing Example\n---------------\n\n.. cpp:namespace:: @ex_variable_failing\n\nThis intentionally fails:\n\n.. code-block:: rst\n\n   .. doxygenvariable:: made_up_variable\n      :project: define\n\nIt produces the following warning message:\n\n.. warning::\n   doxygenvariable: Cannot find variable “made_up_variable” in doxygen XML output for project\n   \"tinyxml\" from directory: ../../examples/tinyxml/tinyxml/xml/\n"
  },
  {
    "path": "examples/doxygen/.gitignore",
    "content": "afterdoc\nauthor\nautolink\nclass\nconcept\ndefine\ndiagrams\ndocstring\nenum\nexample\nfile\nfunc\ngroup\ninclude\njdstyle\nmanual\nmemgrp\noverload\npage\npar\nparblock\npyexample\nqtstyle\nrelates\nrestypedef\nstructcmd\ntag\ntemplate\ninterface\n"
  },
  {
    "path": "examples/doxygen/Makefile",
    "content": "#\n# This file was generated from Makefile.in on Sat Dec 13 12:17:28 GMT 2008\n#\n\nDOXYGEN   ?= `which doxygen`\nTMAKEPATH =\nENV       = env TMAKEPATH=$(TMAKEPATH)\nTMAKE     =\nMAKE      = /usr/bin/make\nPERL      = /usr/bin/perl\nRM        = rm -f\nCP        = cp\nVERSION   = 1.5.7.1\nINSTALL   = /tmp\nINSTTOOL  = /usr/bin/install\nDOXYDOCS  = ..\nDOCDIR    = $(INSTALL)/share/doc/packages/doxygen\nQTDIR     =\nHAVE_DOT  = /usr/bin/dot\n\nall: class/xml/index.xml \\\n     concept/xml/index.xml \\\n     define/xml/index.xml \\\n     enum/xml/index.xml \\\n     file/xml/index.xml \\\n     func/xml/index.xml \\\n     page/xml/index.xml \\\n     relates/xml/index.xml \\\n     author/xml/index.xml \\\n     par/xml/index.xml \\\n     parblock/xml/index.xml \\\n     overload/xml/index.xml \\\n     example/xml/index.xml \\\n     include/xml/index.xml \\\n     qtstyle/xml/index.xml \\\n     jdstyle/xml/index.xml \\\n     structcmd/xml/index.xml \\\n     autolink/xml/index.xml \\\n     restypedef/xml/index.xml \\\n     afterdoc/xml/index.xml \\\n     template/xml/index.xml \\\n     tag/xml/index.xml \\\n     group/xml/index.xml \\\n     diagrams/xml/index.xml \\\n     memgrp/xml/index.xml \\\n     docstring/xml/index.xml \\\n     pyexample/xml/index.xml \\\n     manual/xml/index.xml \\\n     interface/xml/index.xml\n\nclean:\n\trm -rf  class concept define enum file func page relates author \\\n\t\tpar parblock overload example include qtstyle jdstyle structcmd \\\n\t\tautolink tag restypedef afterdoc template tag group diagrams \\\n\t\tmemgrp docstring pyexample manual interface\n\nclass/xml/index.xml: class.h class.cfg\n\t$(DOXYGEN) class.cfg\n\nconcept/xml/index.xml: concept.h concept.cfg\n\t$(DOXYGEN) concept.cfg\n\ndefine/xml/index.xml: define.h define.cfg\n\t$(DOXYGEN) define.cfg\n\nenum/xml/index.xml: enum.h enum.cfg\n\t$(DOXYGEN) enum.cfg\n\nfile/xml/index.xml: file.h file.cfg\n\t$(DOXYGEN) file.cfg\n\nfunc/xml/index.xml: func.h func.cfg\n\t$(DOXYGEN) func.cfg\n\npage/xml/index.xml: page.doc page.cfg\n\t$(DOXYGEN) page.cfg\n\nrelates/xml/index.xml: relates.cpp relates.cfg\n\t$(DOXYGEN) relates.cfg\n\nauthor/xml/index.xml: author.cpp author.cfg\n\t$(DOXYGEN) author.cfg\n\npar/xml/index.xml: par.cpp par.cfg\n\t$(DOXYGEN) par.cfg\n\nparblock/xml/index.xml: parblock.cpp parblock.cfg\n\t$(DOXYGEN) parblock.cfg\n\noverload/xml/index.xml: overload.cpp overload.cfg\n\t$(DOXYGEN) overload.cfg\n\nexample/xml/index.xml: example.cpp example_test.cpp example.cfg\n\t$(DOXYGEN) example.cfg\n\ninclude/xml/index.xml: include.cpp example_test.cpp include.cfg\n\t$(DOXYGEN) include.cfg\n\nqtstyle/xml/index.xml: qtstyle.cpp qtstyle.cfg\n\t$(DOXYGEN) qtstyle.cfg\n\njdstyle/xml/index.xml: jdstyle.cpp jdstyle.cfg\n\t$(DOXYGEN) jdstyle.cfg\n\nstructcmd/xml/index.xml: structcmd.h structcmd.cfg\n\t$(DOXYGEN) structcmd.cfg\n\nautolink/xml/index.xml: autolink.cpp autolink.cfg\n\t$(DOXYGEN) autolink.cfg\n\ntag/xml/index.xml: tag.cpp tag.cfg example/xml/index.xml\n\t$(DOXYGEN) tag.cfg\n#\tsed -e \"1,1s#perl#$(PERL)#g\" tag/xml/installdox >tag/xml/installdox.perl\n#\tcd tag/xml ; $(PERL) installdox.perl -lexample.tag@../../example/xml\n\nrestypedef/xml/index.xml: restypedef.cpp restypedef.cfg\n\t$(DOXYGEN) restypedef.cfg\n\nafterdoc/xml/index.xml: afterdoc.h afterdoc.cfg\n\t$(DOXYGEN) afterdoc.cfg\n\ntemplate/xml/index.xml: templ.cpp templ.cfg\n\t$(DOXYGEN) templ.cfg\n\ngroup/xml/index.xml: group.cpp group.cfg\n\t$(DOXYGEN) group.cfg\n\nmemgrp/xml/index.xml: memgrp.cpp memgrp.cfg\n\t$(DOXYGEN) memgrp.cfg\n\npyexample/xml/index.xml: pyexample.py pyexample.cfg\n\t$(DOXYGEN) pyexample.cfg\n\nmanual/xml/index.xml: manual.c manual.cfg\n\t$(DOXYGEN) manual.cfg\n\ndocstring/xml/index.xml: docstring.py docstring.cfg\n\t$(DOXYGEN) docstring.cfg\n\ninterface/xml/index.xml: interface.h interface.cfg\n\t$(DOXYGEN) interface.cfg\n\ndiagrams/xml/index.xml: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg\nifneq ($(HAVE_DOT),)\n\t$(DOXYGEN) diagrams.cfg\nendif\n"
  },
  {
    "path": "examples/doxygen/afterdoc.cfg",
    "content": "PROJECT_NAME      = \"AfterDocs\"\nOUTPUT_DIRECTORY  = afterdoc\nGENERATE_LATEX    = NO\nGENERATE_MAN      = NO\nGENERATE_RTF      = NO\nCASE_SENSE_NAMES  = NO\nINPUT             = afterdoc.h\nQUIET             = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/afterdoc.h",
    "content": "/*! A test class */\n\nclass Test1\n{\n  public:\n    /** An enum type. \n     *  The documentation block cannot be put after the enum! \n     */\n    enum EnumType\n    {\n      int EVal1,     /**< enum value 1 */\n      int EVal2      /**< enum value 2 */\n    };\n    void member();   //!< a member function.\n    \n  protected:\n    int value;       /*!< an integer value */\n};\n"
  },
  {
    "path": "examples/doxygen/author.cfg",
    "content": "PROJECT_NAME     = \"Author Command\"\nOUTPUT_DIRECTORY = author\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = author.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/author.cpp",
    "content": "/*! \\class WindowsNT\n *  \\brief Windows Nice Try.\n *  \\author Bill Gates\n *  \\author Several species of small furry animals gathered together \n *          in a cave and grooving with a picture.\n *  \\version 4.0\n *  \\date    1996-1998\n *  \\bug It crashes a lot and requires huge amounts of memory.\n *  \\bug The class introduces the more bugs, the longer it is used.\n *  \\warning This class may explode in your face.\n *  \\warning If you inherit anything from this class, you're doomed.\n */\n\nclass WindowsNT {};\n"
  },
  {
    "path": "examples/doxygen/autolink.cfg",
    "content": "PROJECT_NAME     = \"Automatic link generation\"\nOUTPUT_DIRECTORY = autolink\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = autolink.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/autolink.cpp",
    "content": "/*! \\file autolink.cpp\n  Testing automatic link generation.\n  \n  A link to a member of the Test2 class: Test2::member,\n  \n  More specific links to the each of the overloaded members:\n  Test2::member(int) and Test2#member(int,int)\n\n  A link to a protected member variable of Test2: Test2#var,\n\n  A link to the global variable #globVar.\n\n  A link to the global enumeration type #GlobEnum.\n \n  A link to the define #ABS_NUMBER(x).\n  \n  A link to the destructor of the Test2 class: Test2::~Test2,\n  \n  A link to the typedef ::Test2TypeDef.\n \n  A link to the enumeration type Test2::EType\n  \n  A link to some enumeration values Test2::Val1 and ::GVal2\n*/\n\n/*!\n  Since this documentation block belongs to the class Test2 no link to\n  Test2 is generated.\n\n  Two ways to link to a constructor are: #Test2 and Test2().\n\n  Links to the destructor are: #~Test2 and ~Test2().\n  \n  A link to a member in this class: member().\n\n  More specific links to the each of the overloaded members: \n  member(int) and member(int,int). \n  \n  A link to the variable #var.\n\n  A link to the global typedef ::Test2TypeDef.\n\n  A link to the global enumeration type #GlobEnum.\n  \n  A link to the define ABS_NUMBER(x).\n  \n  A link to a variable \\link #var using another text\\endlink as a link.\n  \n  A link to the enumeration type #EType.\n\n  A link to some enumeration values: \\link Test2::Val1 Val1 \\endlink and ::GVal1.\n\n  And last but not least a link to a file: autolink.cpp.\n  \n  \\sa Inside a see also section any word is checked, so EType, \n      Val1, GVal1, ~Test2 and member will be replaced by links in HTML.\n*/\n\nclass Test2\n{\n  public:\n    Test2();               //!< constructor\n   ~Test2();               //!< destructor\n    void member(int);     /**< A member function. Details. */\n    void member(int,int); /**< An overloaded member function. Details */\n\n    /** An enum type. More details */\n    enum EType { \n      Val1,               /**< enum value 1 */ \n      Val2                /**< enum value 2 */ \n    };                \n\n  protected:\n    int var;              /**< A member variable */\n};\n\n/*! details. */\nTest2::Test2() { }\n\n/*! details. */\nTest2::~Test2() { }\n\n/*! A global variable. */\nint globVar;\n\n/*! A global enum. */\nenum GlobEnum { \n                GVal1,    /*!< global enum value 1 */ \n                GVal2     /*!< global enum value 2 */ \n              };\n\n/*!\n *  A macro definition.\n */ \n#define ABS_NUMBER(x) (((x)>0)?(x):-(x))\n\ntypedef Test2 Test2TypeDef;\n\n/*! \\fn typedef Test2 Test2TypeDef\n *  A type definition. \n */\n"
  },
  {
    "path": "examples/doxygen/class.cfg",
    "content": "PROJECT_NAME     = \"Class Command\"\nOUTPUT_DIRECTORY = class\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = class.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/class.h",
    "content": "/* A dummy class */\n\nclass Test3\n{\n};\n\n/*! \\class Test class.h \"inc/class.h\"\n *  \\brief This is a test class.\n *\n * Some details about the Test class\n */\n"
  },
  {
    "path": "examples/doxygen/concept.cfg",
    "content": "PROJECT_NAME     = \"Concept Command\"\nOUTPUT_DIRECTORY = concept\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = concept.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/concept.h",
    "content": "template<typename T>\nconcept Hashable = requires(T a)\n{\n    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n};\n\n/*! \\concept Hashable concept.h \"inc/concept.h\"\n *  \\brief This is a test concept.\n *\n * It was stolen from the first example from\n * https://en.cppreference.com/w/cpp/language/constraints\n */\n"
  },
  {
    "path": "examples/doxygen/define.cfg",
    "content": "PROJECT_NAME     = \"Define Command\"\nOUTPUT_DIRECTORY = define\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = define.h\nENABLE_PREPROCESSING = YES\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/define.h",
    "content": "/*! \\file define.h\n    \\brief testing defines\n    \n    This is to test the documentation of defines.\n*/\n\n/*!\n  \\def MAX(x,y)\n  Computes the maximum of \\a x and \\a y.\n*/\n\n/*! \n   Computes the absolute value of its argument \\a x.\n*/\n#define ABS(x) (((x)>0)?(x):-(x))\n#define MAX(x,y) ((x)>(y)?(x):(y))\n#define MIN(x,y) ((x)>(y)?(y):(x)) \n        /*!< Computes the minimum of \\a x and \\a y. */\n\n#define NOARGS (void*)\n        /*!< Define with no arguments */\n"
  },
  {
    "path": "examples/doxygen/diagrams.cfg",
    "content": "PROJECT_NAME       = \"Diagrams\"\nOUTPUT_DIRECTORY   = diagrams\nHAVE_DOT           = YES\nEXTRACT_ALL        = YES\nGENERATE_LATEX     = NO\nGENERATE_MAN       = NO\nGENERATE_RTF       = NO\nCASE_SENSE_NAMES = NO\nENABLE_PREPROCESSING       = YES\nINPUT              = .\nFILE_PATTERNS      = diagrams_*.h\nQUIET              = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/diagrams_a.h",
    "content": "#ifndef _DIAGRAMS_A_H\n#define _DIAGRAMS_A_H\nclass A { public: A *m_self; };\n#endif\n"
  },
  {
    "path": "examples/doxygen/diagrams_b.h",
    "content": "#ifndef _DIAGRAMS_B_H\n#define _DIAGRAMS_B_H\nclass A;\nclass B { public: A *m_a; };\n#endif\n"
  },
  {
    "path": "examples/doxygen/diagrams_c.h",
    "content": "#ifndef _DIAGRAMS_C_H\n#define _DIAGRAMS_C_H\n#include \"diagrams_c.h\"\nclass D;\nclass C : public A { public: D *m_d; };\n#endif\n"
  },
  {
    "path": "examples/doxygen/diagrams_d.h",
    "content": "#ifndef _DIAGRAM_D_H\n#define _DIAGRAM_D_H\n#include \"diagrams_a.h\"\n#include \"diagrams_b.h\"\nclass C;\nclass D : virtual protected  A, private B { public: C m_c; };\n#endif\n"
  },
  {
    "path": "examples/doxygen/diagrams_e.h",
    "content": "#ifndef _DIAGRAM_E_H\n#define _DIAGRAM_E_H\n#include \"diagrams_d.h\"\nclass E : public D {};\n#endif\n"
  },
  {
    "path": "examples/doxygen/docstring.cfg",
    "content": "PROJECT_NAME     = \"Python\"\nOUTPUT_DIRECTORY = docstring\nEXTRACT_ALL      = YES\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nOPTIMIZE_OUTPUT_JAVA = YES\nINPUT            = docstring.py\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/docstring.py",
    "content": "\"\"\"@package docstring\nDocumentation for this module.\n\nMore details.\n\"\"\"\n\nfrom __future__ import annotations\n\n\ndef func():\n    \"\"\"Documentation for a function.\n\n    More details.\n    \"\"\"\n    pass\n\n\nclass PyClass:\n    \"\"\"Documentation for a class.\n\n    More details.\n    \"\"\"\n\n    def __init__(self):\n        \"\"\"The constructor.\"\"\"\n        self._memVar = 0\n\n    def PyMethod(self):\n        \"\"\"Documentation for a method.\"\"\"\n        pass\n"
  },
  {
    "path": "examples/doxygen/enum.cfg",
    "content": "PROJECT_NAME     = \"Enum Command\"\nOUTPUT_DIRECTORY = enum\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = enum.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/enum.h",
    "content": "class Test4\n{\n  public:\n    enum TEnum { Val1, Val2 };\n\n    /*! Another enum, with inline docs */\n    enum AnotherEnum \n    { \n      V1, /*!< value 1 */\n      V2  /*!< value 2 */\n    };\n\n    /*! Another enum, with inline docs (using an explicit datatype) */\n    enum class AnotherScopedEnum : long\n    {\n      V1, /*!< value 1 */\n      V2  /*!< value 2 */\n    };\n};\n\n/*! \\class Test4\n * The class description.\n */\n\n/*! \\enum Test4::TEnum\n * A description of the enum type.\n */\n\n/*! \\var Test4::TEnum Test4::Val1\n * The description of the first enum value.\n */\n"
  },
  {
    "path": "examples/doxygen/example.cfg",
    "content": "PROJECT_NAME      = \"Example Command\"\nOUTPUT_DIRECTORY  = example\nGENERATE_TAGFILE  = example.tag\nGENERATE_LATEX    = NO\nGENERATE_MAN      = NO\nGENERATE_RTF      = NO\nCASE_SENSE_NAMES  = NO\nINPUT             = example.cpp\nEXAMPLE_PATH      = example_test.cpp\nQUIET             = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/example.cpp",
    "content": "/** A Test5 class.\n *  More details about this class.\n */\n\nclass Test5\n{\n  public:\n    /** An example member function.\n     *  More details about this function.\n     */\n    void example();\n};\n\nvoid Test5::example() {}\n\n/** \\example example_test.cpp\n * This is an example of how to use the Test5 class.\n * More details about this example.\n */\n"
  },
  {
    "path": "examples/doxygen/example_test.cpp",
    "content": "void main()\n{\n  Test7 t;\n  t.example();\n}\n"
  },
  {
    "path": "examples/doxygen/file.cfg",
    "content": "PROJECT_NAME     = \"File Command\"\nOUTPUT_DIRECTORY = file\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = file.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/file.h",
    "content": "/** \\file file.h\n * A brief file description.\n * A more elaborated file description.\n */\n\n/**\n * A global integer value.\n * More details about this value.\n */\nextern int globalValue;\n"
  },
  {
    "path": "examples/doxygen/func.cfg",
    "content": "PROJECT_NAME     = \"Fn Command\"\nOUTPUT_DIRECTORY = func\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = func.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/func.h",
    "content": "class Test6\n{\n  public:\n    const char *member(char,int) throw(std::out_of_range);\n};\n\nconst char *Test6::member(char c,int n) throw(std::out_of_range) {}\n\n/*! \\class Test6\n * \\brief Test6 class.\n *\n * Details about Test6.\n */\n\n/*! \\fn const char *Test6::member(char c,int n)\n *  \\brief A member function.\n *  \\param c a character.\n *  \\param n an integer.\n *  \\exception std::out_of_range parameter is out of range.\n *  \\return a character pointer.\n */\n\n/*! \\brief Doing important things with parameter directions\n *\n *  \\param[out]     a output\n *  \\param[in]      b input\n *  \\param[in, out] c input but gets rewritten\n */\nvoid myFunc(int * a, int * b, int * c);\n"
  },
  {
    "path": "examples/doxygen/group.cfg",
    "content": "PROJECT_NAME     = \"Grouping\"\nOUTPUT_DIRECTORY = group\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = group.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/group.cpp",
    "content": "/** @defgroup group1 The First Group\n *  This is the first group\n *  @{\n */\n\n/** @brief class C1 in group 1 */\nclass C1 {};\n\n/** @brief class C2 in group 1 */\nclass C2 {};\n\n/** function in group 1 */\nvoid func1() {}\n\n/** @} */ // end of group1\n\n/**\n *  @defgroup group2 The Second Group\n *  This is the second group\n */\n\n/** @defgroup group3 The Third Group\n *  This is the third group\n */\n\n/** @defgroup group4 The Fourth Group\n *  @ingroup group3\n *  Group 4 is a subgroup of group 3\n */\n\n/**\n *  @ingroup group2\n *  @brief class C3 in group 2\n */\nclass C3 {};\n\n/** @ingroup group2\n *  @brief class C4 in group 2\n */\nclass C4 {};\n\n/** @ingroup group3\n *  @brief class C5 in @link group3 the third group@endlink.\n */\nclass C5 {};\n\n/** @ingroup group1 group2 group3 group4\n *  namespace N1 is in four groups\n *  @sa @link group1 The first group@endlink, group2, group3, group4 \n *\n *  Also see @ref mypage2\n */\nnamespace N1 {};\n\n/** @file\n *  @ingroup group3\n *  @brief this file in group 3\n */\n\n/** @defgroup group5 The Fifth Group\n *  This is the fifth group\n *  @{\n */\n\n/** @page mypage1 This is a section in group 5\n *  Text of the first section\n */\n\n/** @page mypage2 This is another section in group 5\n *  Text of the second section\n */\n\n/** @} */ // end of group5\n\n/** @addtogroup group1\n *  \n *  More documentation for the first group.\n *  @{\n */\n\n/** another function in group 1 */\nvoid func2() {}\n\n/** yet another function in group 1 */\nvoid func3() {}\n\n/** @} */ // end of group1\n\n"
  },
  {
    "path": "examples/doxygen/include.cfg",
    "content": "PROJECT_NAME     = \"Include Command\"\nOUTPUT_DIRECTORY = include\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = include.cpp\nEXAMPLE_PATH     = example_test.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/include.cpp",
    "content": "\n/*! A test class. */\n\nclass Test7\n{\n  public:\n    /// a member function\n    void example();\n};\n\n/*! \\page example\n *  \\dontinclude example_test.cpp\n *  Our main function starts like this:\n *  \\skip main\n *  \\until {\n *  First we create a object \\c t of the Test7 class.\n *  \\skipline Test7\n *  Then we call the example member function \n *  \\line example\n *  After that our little test routine ends.\n *  \\line }\n */\n"
  },
  {
    "path": "examples/doxygen/interface.cfg",
    "content": "PROJECT_NAME     = \"Interface Command\"\nOUTPUT_DIRECTORY = interface\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = interface.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/interface.h",
    "content": "/* A dummy interface, which is really just a specially treated class in C++ */\n\nclass TestInterface\n{\n};\n\n/*! \\interface TestInterface interface.h \"inc/interface.h\"\n *  \\brief This is a test interface.\n *\n * Some details about the TestInterface interface\n */\n"
  },
  {
    "path": "examples/doxygen/jdstyle.cfg",
    "content": "PROJECT_NAME      = \"JavaDoc Style\"\nOUTPUT_DIRECTORY  = jdstyle\nGENERATE_LATEX    = NO\nGENERATE_MAN      = NO\nGENERATE_RTF      = NO\nCASE_SENSE_NAMES  = NO\nINPUT             = jdstyle.cpp\nQUIET             = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/jdstyle.cpp",
    "content": "/**\n *  A test class. A more elaborate class description.\n */\n\nclass Test8\n{\n  public:\n\n    /** \n     * An enum.\n     * More detailed enum description.\n     */\n\n    enum TEnum { \n          TVal1, /**< enum value TVal1. */  \n          TVal2, /**< enum value TVal2. */  \n          TVal3  /**< enum value TVal3. */  \n         } \n       *enumPtr, /**< enum pointer. Details. */\n       enumVar;  /**< enum variable. Details. */\n       \n      /**\n       * A constructor.\n       * A more elaborate description of the constructor.\n       */\n      Test8();\n\n      /**\n       * A destructor.\n       * A more elaborate description of the destructor.\n       */\n     ~Test8();\n    \n      /**\n       * a normal member taking two arguments and returning an integer value.\n       * @param a an integer argument.\n       * @param s a constant character pointer.\n       * @see Test8()\n       * @see ~Test8()\n       * @see testMeToo()\n       * @see publicVar()\n       * @return The test results\n       */\n       int testMe(int a,const char *s);\n       \n      /**\n       * A pure virtual member.\n       * @see testMe()\n       * @param c1 the first argument.\n       * @param c2 the second argument.\n       */\n       virtual void testMeToo(char c1,char c2) = 0;\n   \n      /** \n       * a public variable.\n       * Details.\n       */\n       int publicVar;\n       \n      /**\n       * a function variable.\n       * Details.\n       */\n       int (*handler)(int a,int b);\n};\n\n"
  },
  {
    "path": "examples/doxygen/make.bat",
    "content": "@ECHO OFF\n\nset DOXYGEN=doxygen\nfor /f \"delims=\" %%i in ('where doxygen') do set DOXYGEN=%%i\n\nset PERL=perl\nfor /f \"delims=\" %%i in ('where perl') do set PERL=%%i\n\nset HAVE_DOT=dot\nfor /f \"delims=\" %%i in ('where dot') do set HAVE_DOT=%%i\n\n@REM echo DOXYGEN  : %DOXYGEN%\n@REM echo PERL     : %PERL%\n@REM echo HAVE_DOT : %HAVE_DOT%\n\nif \"%1\" == \"\" (\n    call :all\n    goto end\n)\n\nif \"%1\" == \"all\" (\n    call :all\n    goto end\n)\n\nif \"%1\" == \"clean\" (\n    call :clean\n    goto end\n)\n\ngoto end\n\n:all\n    call :doxygen class.cfg\n    call :doxygen concept.cfg\n    call :doxygen define.cfg\n    call :doxygen enum.cfg\n    call :doxygen file.cfg\n    call :doxygen func.cfg\n    call :doxygen page.cfg\n    call :doxygen relates.cfg\n    call :doxygen author.cfg\n    call :doxygen par.cfg\n    call :doxygen parblock.cfg\n    call :doxygen overload.cfg\n    call :doxygen example.cfg\n    call :doxygen include.cfg\n    call :doxygen qtstyle.cfg\n    call :doxygen jdstyle.cfg\n    call :doxygen structcmd.cfg\n    call :doxygen autolink.cfg\n    call :doxygen restypedef.cfg\n    call :doxygen afterdoc.cfg\n    call :doxygen templ.cfg\n    call :doxygen tag.cfg\n    call :doxygen group.cfg\n    call :doxygen diagrams.cfg\n    call :doxygen memgrp.cfg\n    call :doxygen docstring.cfg\n    call :doxygen pyexample.cfg\n    call :doxygen manual.cfg\n    call :doxygen interface.cfg\n    goto end\n\n:clean\n    call :rmdir class\n    call :rmdir concept\n    call :rmdir define\n    call :rmdir enum\n    call :rmdir file\n    call :rmdir func\n    call :rmdir page\n    call :rmdir relates\n    call :rmdir author\n    call :rmdir par\n    call :rmdir parblock\n    call :rmdir overload\n    call :rmdir example\n    call :rmdir include\n    call :rmdir qtstyle\n    call :rmdir jdstyle\n    call :rmdir structcmd\n    call :rmdir autolink\n    call :rmdir restypedef\n    call :rmdir afterdoc\n    call :rmdir template\n    call :rmdir tag\n    call :rmdir group\n    call :rmdir diagrams\n    call :rmdir memgrp\n    call :rmdir docstring\n    call :rmdir pyexample\n    call :rmdir manual\n    call :rmdir interface\n    goto end\n\n:doxygen\n    set CFG=%~1\n    echo Running doxygen: %CFG%\n    \"%DOXYGEN%\" %CFG%\n    goto end\n\n:rmdir\n    set DIR=%~1\n    if exist \"%DIR%\" (\n        echo Removing directory: %DIR%\n        rmdir /s/q \"%DIR%\"\n    )\n    goto end\n\n:end"
  },
  {
    "path": "examples/doxygen/manual.c",
    "content": "/**\n * \\file manual.c\n */\n\ntypedef struct Object Object;   //!< Object type\ntypedef struct Vehicle Vehicle; //!< Vehicle type\ntypedef struct Car Car;         //!< Car type\ntypedef struct Truck Truck;     //!< Truck type\n\n/*!\n * Base object class.\n */\nstruct Object\n{\n  int ref;    //!< \\private Reference count.\n};\n\n\n/*!\n * Increments object reference count by one.\n * \\public \\memberof Object\n */\nstatic Object * objRef(Object *obj);\n\n\n/*!\n * Decrements object reference count by one.\n * \\public \\memberof Object\n */\nstatic Object * objUnref(Object *obj);\n\n\n/*!\n * Vehicle class.\n * \\extends Object\n */\nstruct Vehicle\n{\n  Object base;    //!< \\protected Base class.\n};\n\n\n/*!\n * Starts the vehicle.\n * \\public \\memberof Vehicle\n */\nvoid vehicleStart(Vehicle *obj);\n\n\n/*!\n * Stops the vehicle.\n * \\public \\memberof Vehicle\n */\nvoid vehicleStop(Vehicle *obj);\n\n\n/*!\n * Car class.\n * \\extends Vehicle\n */\nstruct Car\n{\n  Vehicle base;    //!< \\protected Base class.\n};\n\n\n/*!\n * Truck class.\n * \\extends Vehicle\n */\nstruct Truck\n{\n  Vehicle base;    //!< \\protected Base class.\n};\n\n\n/*!\n * Main function.\n *\n * Ref vehicleStart(), objRef(), objUnref().\n */\nint main(void)\n{\n  Car c;\n  vehicleStart((Vehicle*) &c);\n}\n\n"
  },
  {
    "path": "examples/doxygen/manual.cfg",
    "content": "PROJECT_NAME           = \"Manual inheritance and membership\"\nOUTPUT_DIRECTORY       = manual\nGENERATE_LATEX         = NO\nGENERATE_MAN           = NO\nGENERATE_RTF           = NO\nCASE_SENSE_NAMES       = NO\nINPUT                  = manual.c\nQUIET                  = YES\nJAVADOC_AUTOBRIEF      = YES\nEXTRACT_PRIVATE        = YES\nEXTRACT_STATIC         = YES\nTYPEDEF_HIDES_STRUCT   = YES\nINLINE_SOURCES         = YES\nREFERENCED_BY_RELATION = YES\nREFERENCES_RELATION    = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/memgrp.cfg",
    "content": "PROJECT_NAME         = \"Member Grouping\"\nOUTPUT_DIRECTORY     = memgrp\nGENERATE_LATEX       = NO\nGENERATE_MAN         = NO\nGENERATE_RTF         = NO\nCASE_SENSE_NAMES     = NO\nINPUT                = memgrp.cpp\nQUIET                = YES\nDISTRIBUTE_GROUP_DOC = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO"
  },
  {
    "path": "examples/doxygen/memgrp.cpp",
    "content": "/** A class. Details */\nclass Test9\n{\n  public:\n    //@{\n    /** Same documentation for both members. Details */\n    void func1InGroup1();\n    void func2InGroup1();\n    //@}\n\n    /** Function without group. Details. */\n    void ungroupedFunction();\n    // intentionally not documenting this member?\n    void func1InGroup2();\n  protected:\n    void func2InGroup2();\n};\n\nvoid Test9::func1InGroup1() {}\nvoid Test9::func2InGroup1() {}\n\n/** @name Group2\n *  Description of group 2. \n */\n//@{\n/** Function 2 in group 2. Details. */\nvoid Test9::func2InGroup2() {}\n/** Function 1 in group 2. Details. */\nvoid Test9::func1InGroup2() {}\n//@}\n\n/*! \\file \n *  docs for this file\n */\n\n//@{\n//! one description for all members of this group \n//! (because DISTRIBUTE_GROUP_DOC is YES in the config file)\n#define A 1\n#define B 2\nvoid glob_func();\n//@}\n"
  },
  {
    "path": "examples/doxygen/overload.cfg",
    "content": "PROJECT_NAME     = \"Overloaded Command\"\nOUTPUT_DIRECTORY = overload\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nSORT_MEMBER_DOCS = NO\nINPUT            = overload.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/overload.cpp",
    "content": "class Test10\n{\n  public:\n    void drawRect(int,int,int,int);\n    void drawRect(const Rect &r);\n};\n\nvoid Test10::drawRect(int x,int y,int w,int h) {}\nvoid Test10::drawRect(const Rect &r) {}\n\n/*! \\class Test10\n *  \\brief A short description.\n *   \n *  More text.\n */\n\n/*! \\fn void Test10::drawRect(int x,int y,int w,int h)\n * This command draws a rectangle with a left upper corner at ( \\a x , \\a y ),\n * width \\a w and height \\a h. \n */\n\n/*!\n * \\overload void Test10::drawRect(const Rect &r)\n */\n\n"
  },
  {
    "path": "examples/doxygen/page.cfg",
    "content": "PROJECT_NAME     = \"Page Command\"\nOUTPUT_DIRECTORY = page\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = page.doc\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/page.doc",
    "content": "/*! \\page page1 A documentation page\n  Leading text.\n  \\section sec An example section\n  This page contains the subsections \\ref subsection1 and \\ref subsection2.\n  For more info see page \\ref page2.\n  \\subsection subsection1 The first subsection\n  Text.\n  \\subsection subsection2 The second subsection\n  More text.\n*/\n\n/*! \\page page2 Another page\n  Even more info.\n*/\n"
  },
  {
    "path": "examples/doxygen/par.cfg",
    "content": "PROJECT_NAME     = \"Par Command\"\nOUTPUT_DIRECTORY = par\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = par.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/par.cpp",
    "content": "/*! \\class Test11\n * Normal text.\n *\n * \\par User defined paragraph:\n * Contents of the paragraph.\n *\n * \\par\n * New paragraph under the same heading.\n *\n * \\note\n * This note consists of two paragraphs.\n * This is the first paragraph.\n *\n * \\par\n * And this is the second paragraph.\n *\n * More normal text. \n */\n  \nclass Test11 {};\n"
  },
  {
    "path": "examples/doxygen/parblock.cfg",
    "content": "PROJECT_NAME     = \"Parblock Command\"\nOUTPUT_DIRECTORY = parblock\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = parblock.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/parblock.cpp",
    "content": "/*! \\class Test15\n * Normal text.\n *\n * \\par A paragraph followed by a paragraph block:\n * \\parblock\n * Contents of the first paragraph in the block.\n *\n * New paragraph under the same heading.\n * \\endparblock\n *\n * \\note\n * This note consists of three paragraphs in a block.\n * \\parblock\n * This is the first paragraph in the block.\n *\n * And this is the second paragraph in the block.\n *\n * And still a third paragraph in the block.\n * \\endparblock\n *\n * More normal text.\n */\n  \nclass Test15 {};\n"
  },
  {
    "path": "examples/doxygen/pyexample.cfg",
    "content": "PROJECT_NAME     = \"Python\"\nOUTPUT_DIRECTORY = pyexample\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nOPTIMIZE_OUTPUT_JAVA = YES\nINPUT            = pyexample.py\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/pyexample.py",
    "content": "## @package pyexample\n#  Documentation for this module.\n#\n#  More details.\n\n\n## Documentation for a function.\n#\n#  More details.\nfrom __future__ import annotations\n\n\ndef func():\n    pass\n\n\n## Documentation for a class.\n#\n#  More details.\nclass PyClass:\n    ## The constructor.\n    def __init__(self):\n        self._memVar = 0\n\n    ## Documentation for a method.\n    #  @param self The object pointer.\n    def PyMethod(self):\n        pass\n\n    ## A class variable.\n    classVar = 0\n\n    ## @var _memVar\n    #  a member variable\n"
  },
  {
    "path": "examples/doxygen/qtstyle.cfg",
    "content": "PROJECT_NAME     = \"Qt Style\"\nOUTPUT_DIRECTORY = qtstyle\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = qtstyle.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/qtstyle.cpp",
    "content": "//!  A test class. \n/*!\n  A more elaborate class description.\n*/\n\nclass Test12\n{\n  public:\n\n    //! An enum.\n    /*! More detailed enum description. */\n    enum TEnum { \n                 TVal1, /*!< Enum value TVal1. */  \n                 TVal2, /*!< Enum value TVal2. */  \n                 TVal3  /*!< Enum value TVal3. */  \n               } \n         //! Enum pointer.\n         /*! Details. */\n         *enumPtr, \n         //! Enum variable.\n         /*! Details. */\n         enumVar;  \n    \n    //! A constructor.\n    /*!\n      A more elaborate description of the constructor.\n    */\n    Test12();\n\n    //! A destructor.\n    /*!\n      A more elaborate description of the destructor.\n    */\n   ~Test12();\n    \n    //! A normal member taking two arguments and returning an integer value.\n    /*!\n      \\param a an integer argument.\n      \\param s a constant character pointer.\n      \\return The test results\n      \\sa Test12(), ~Test12(), testMeToo() and publicVar()\n    */\n    int testMe(int a,const char *s);\n       \n    //! A pure virtual member.\n    /*!\n      \\sa testMe()\n      \\param c1 the first argument.\n      \\param c2 the second argument.\n    */\n    virtual void testMeToo(char c1,char c2) = 0;\n   \n    //! A public variable.\n    /*!\n      Details.\n    */\n    int publicVar;\n       \n    //! A function variable.\n    /*!\n      Details.\n    */\n    int (*handler)(int a,int b);\n};\n\n"
  },
  {
    "path": "examples/doxygen/relates.cfg",
    "content": "PROJECT_NAME     = \"Relates Command\"\nOUTPUT_DIRECTORY = relates\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = relates.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/relates.cpp",
    "content": "/*! \n * A String class.\n */ \n  \nclass String\n{\n  friend int strcmp(const String &,const String &);\n};\n\n/*! \n * Compares two strings.\n */\n\nint strcmp(const String &s1,const String &s2)\n{\n}\n\n/*! \\relates String\n * A string debug function.\n */\nvoid stringDebug()\n{\n}\n"
  },
  {
    "path": "examples/doxygen/restypedef.cfg",
    "content": "PROJECT_NAME     = \"Resolving Typedefs\"\nOUTPUT_DIRECTORY = restypedef\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = restypedef.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/restypedef.cpp",
    "content": "/*! \\file restypedef.cpp\n * An example of resolving typedefs.\n */\n\n/*! \\struct CoordStruct\n * A coordinate pair.\n */\nstruct CoordStruct\n{\n  /*! The x coordinate */\n  float x;\n  /*! The y coordinate */\n  float y;\n};\n\n/*! Creates a type name for CoordStruct */ \ntypedef CoordStruct Coord;\n\n/*! \n * This function returns the addition of \\a c1 and \\a c2, i.e:\n * (c1.x+c2.x,c1.y+c2.y)\n */\nCoord add(Coord c1,Coord c2)\n{\n}\n"
  },
  {
    "path": "examples/doxygen/structcmd.cfg",
    "content": "PROJECT_NAME     = \"Structural commands\"\nOUTPUT_DIRECTORY = structcmd\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = structcmd.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/structcmd.h",
    "content": "/*! \\file structcmd.h\n    \\brief A Documented file.\n    \n    Details.\n*/\n\n/*! \\def MAX_NUMBER(a,b)\n    \\brief A macro that returns the maximum of \\a a and \\a b.\n   \n    Details.\n*/\n\n/*! \\var typedef unsigned int UINT32\n    \\brief A type definition for a .\n    \n    Details.\n*/\n\n/*! \\var int errno\n    \\brief Contains the last error code.\n\n    \\warning Not thread safe!\n*/\n\n/*! \\fn int open(const char *pathname,int flags)\n    \\brief Opens a file descriptor.\n\n    Detailed description.\n    \n    \\param pathname The name of the descriptor.\n    \\param flags Opening flags.\n*/\n\n/*! \\fn int close(int fd)\n    \\brief Closes the file descriptor \\a fd.\n    \\param fd The descriptor to close.\n*/\n\n/*! \\fn size_t write(int fd,const char *buf, size_t count)\n    \\brief Writes \\a count bytes from \\a buf to the file descriptor \\a fd.\n    \\param fd The descriptor to write to.\n    \\param buf The data buffer to write.\n    \\param count The number of bytes to write.\n*/\n\n/*! \\fn int read(int fd,char *buf,size_t count)\n    \\brief Read bytes from a file descriptor.\n    \\param fd The descriptor to read from.\n    \\param buf The buffer to read into.\n    \\param count The number of bytes to read.\n*/\n\n#define MAX_NUMBER(a,b) (((a)>(b))?(a):(b))\ntypedef unsigned int UINT32;\nint errno;\nint open(const char *,int);\nint close(int);\nsize_t write(int,const char *, size_t);\nint read(int,char *,size_t);\n"
  },
  {
    "path": "examples/doxygen/tag.cfg",
    "content": "PROJECT_NAME     = \"Tag Files\"\nOUTPUT_DIRECTORY = tag\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = tag.cpp\nTAGFILES         = example.tag=../../example/html\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/tag.cpp",
    "content": "/*! A class that is inherited from the external class Test13.\n*/\n\nclass Tag : public Test13\n{\n  public:\n    /*! an overloaded member. */\n    void example();\n};\n"
  },
  {
    "path": "examples/doxygen/templ.cfg",
    "content": "PROJECT_NAME     = \"Template Test\"\nOUTPUT_DIRECTORY = template\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = templ.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/doxygen/templ.cpp",
    "content": "\n/*! A template class */\ntemplate<class T,int i=100> class Test14\n{\n  public:\n    Test14();\n    Test14(const Test14 &);\n};\n\n/*! complete specialization */\ntemplate<> class Test14<void *,200>\n{\n  public:\n    Test14();\n};\n\n/*! A partial template specialization */\ntemplate<class T> class Test14<T *> : public Test14<void *,200>\n{\n  public:\n    Test14();\n};\n\n/*! The constructor of the template class*/\ntemplate<class T,int i> Test14<T,i>::Test14() {}\n\n/*! The copy constructor */\ntemplate<class T,int i> Test14<T,i>::Test14(const Test14 &t) {}\n\n/*! The constructor of the partial specialization */\ntemplate<class T> Test14<T *>::Test14() {}\n\n/*! The constructor of the specialization */\ntemplate<> Test14<void *,200>::Test14() {}\n\n"
  },
  {
    "path": "examples/specific/.gitignore",
    "content": "/functypedef\n/alias\n/class\n/inline\n/nutshell\n/rst\n/typedef\n/members\n/image\n/decl_impl\n*/doxygen_sqlite3.db\n*/xml/*.xml\n*/xml/*.xsd\n*/xml/*.xslt\n"
  },
  {
    "path": "examples/specific/Makefile",
    "content": "#\n# This file was generated from Makefile.in on Sat Dec 13 12:17:28 GMT 2008\n#\n\nDOXYGEN   ?= `which doxygen`\nTMAKEPATH =\nENV       = env TMAKEPATH=$(TMAKEPATH)\nTMAKE     =\nMAKE      = /usr/bin/make\nPERL      = /usr/bin/perl\nRM        = rm -f\nCP        = cp\nVERSION   = 1.5.7.1\nINSTALL   = /tmp\nINSTTOOL  = /usr/bin/install\nDOXYDOCS  = ..\nDOCDIR    = $(INSTALL)/share/doc/packages/doxygen\nQTDIR     =\nHAVE_DOT  = /usr/bin/dot\n\nprojects  = nutshell alias rst inline namespacefile array inheritance \\\n\t\t\tmembers userdefined fixedwidthfont latexmath functionOverload \\\n\t\t\timage name union group struct struct_function qtsignalsandslots lists \\\n\t\t\theadings links parameters template_class template_class_non_type \\\n\t\t\ttemplate_function template_type_alias template_specialisation \\\n\t\t\tenum define interface xrefsect tables \\\n\t\t\tcpp_anon cpp_concept cpp_enum cpp_union cpp_function cpp_friendclass \\\n\t\t\tcpp_inherited_members cpp_trailing_return_type cpp_constexpr_hax \\\n\t\t\tcpp_function_lookup cpp_ns_template_specialization \\\n\t\t\tc_file c_struct c_enum c_typedef c_macro c_union membergroups \\\n\t\t\tsimplesect code_blocks dot_graphs\n\nspecial   = programlisting decl_impl multifilexml auto class typedef\n\nxmls := $(foreach project, $(projects), $(project)/xml/index.xml)\n\nspecial_xmls = $(foreach project, $(special), $(project)/xml/index.xml)\n\nall: $(xmls) $(special_xmls)\n\nclean:\n\trm -rf $(projects) $(special)\n\n\n# General pattern\n# ---------------\n\n$(xmls): %/xml/index.xml: %.cfg %.h\n\t$(DOXYGEN) $<\n\n\n# Special Cases\n# -------------\n\nprogramlisting/xml/index.xml: programlisting.h programlisting.cfg programlistinginclude.txt\n\t$(DOXYGEN) programlisting.cfg\n\ndecl_impl/xml/index.xml: decl_impl.h decl_impl.cpp decl_impl.cfg\n\t$(DOXYGEN) decl_impl.cfg\n\nmultifilexml/xml/index.xml: multifile/one/Util.h multifile/two/Util.h multifile.cfg\n\t$(DOXYGEN) multifile.cfg\n\nauto/xml/index.xml: auto_class.h auto_function.h auto.cfg\n\t$(DOXYGEN) auto.cfg\n\nclass/xml/index.xml: class.h class.cpp class.cfg\n\t$(DOXYGEN) class.cfg\n\ntypedef/xml/index.xml: typedef.h typedef.cfg\n\t$(DOXYGEN) typedef.cfg\n"
  },
  {
    "path": "examples/specific/alias.cfg",
    "content": "PROJECT_NAME     = \"ALIAS Example\"\nOUTPUT_DIRECTORY = alias\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = alias.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nALIASES                = \"sideeffect=\\par Side Effects^^\"\n"
  },
  {
    "path": "examples/specific/alias.h",
    "content": "\n/*! @file alias.h */\n\n/**\n * Foo frob routine.\n * \\par bob this something else\n * @sideeffect Frobs any foos.\n *\n * \\par bob this something else\n *\n * @sideeffect Frobs any foos.\n *\n * @param[out] Frobs any foos.\n */\nvoid frob_foos(void* Frobs);\n"
  },
  {
    "path": "examples/specific/array.cfg",
    "content": "PROJECT_NAME     = \"Array Command\"\nOUTPUT_DIRECTORY = array\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = array.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nOPTIMIZE_OUTPUT_FOR_C = YES"
  },
  {
    "path": "examples/specific/array.h",
    "content": "\n/** My function */\nint foo(int a[5]);\n\n/** My other function \n * \n * @test This declaration is supposed to be\n * @code{.c}\n * int bar(int n, int a[static n]);\n * @endcode\n * But, Sphinx fails to recognize `int a[static n])` as a C specific array syntax\n */\nint bar(int n, int a[]);\n"
  },
  {
    "path": "examples/specific/auto.cfg",
    "content": "PROJECT_NAME     = \"Auto\"\nOUTPUT_DIRECTORY = auto\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = auto_class.h auto_function.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/auto_class.h",
    "content": "\n//! \\brief class outside of namespace\nclass AutoClassTest {\n\n    //! \\brief non-namespaced class function\n    void member() {};\n\n    //! \\brief non-namespaced class other function\n    void anotherMember() {};\n};\n\n\n"
  },
  {
    "path": "examples/specific/auto_function.h",
    "content": "\n//! \\brief non-namespaced class function\nvoid autoFunction() {};\n\n//! \\brief non-namespaced class other function\nvoid anotherAutoFunction() {};\n"
  },
  {
    "path": "examples/specific/c_enum.cfg",
    "content": "PROJECT_NAME     = \"C Enum\"\nOUTPUT_DIRECTORY = c_enum\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_enum.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/c_enum.h",
    "content": "\n// Example of a enum in C which has different syntax and different support in Sphinx to the C++ enum\n\n/**\n * Backup data.\n *\n * \\ingroup Backup\n */\ntypedef enum {\n\t/**\n\t * Compatibility with old gboolean used instead of format.\n\t *\n\t * File type is guessed for extension, non unicode format used\n\t * for Gammu backup.\n\t */\n\tGSM_Backup_Auto = 0,\n\t/**\n\t * Compatibility with old gboolean used instead of format.\n\t *\n\t * File type is guessed for extension, unicode format used\n\t * for Gammu backup.\n\t */\n\tGSM_Backup_AutoUnicode = 1,\n\t/**\n\t * LMB format, compatible with Logo manager, can store\n\t * phonebooks and logos.\n\t */\n\tGSM_Backup_LMB,\n\t/**\n\t * vCalendar standard, can store todo and calendar entries.\n\t */\n\tGSM_Backup_VCalendar,\n\t/**\n\t * vCard standard, can store phone phonebook entries.\n\t */\n\tGSM_Backup_VCard,\n\t/**\n\t * LDIF (LDAP Data Interchange Format), can store phone\n\t * phonebook entries.\n\t */\n\tGSM_Backup_LDIF,\n\t/**\n\t * iCalendar standard, can store todo and calendar entries.\n\t */\n\tGSM_Backup_ICS,\n\t/**\n\t * Gammu own format can store almost anything from phone.\n\t *\n\t * This is ASCII version of the format, Unicode strings are HEX\n\t * encoded. Use GSM_Backup_GammuUCS2 instead if possible.\n\t */\n\tGSM_Backup_Gammu,\n\t/**\n\t * Gammu own format can store almost anything from phone.\n\t *\n\t * This is UCS2-BE version of the format.\n\t */\n\tGSM_Backup_GammuUCS2,\n\t/**\n\t * vNote standard, can store phone notes.\n\t */\n\tGSM_Backup_VNote,\n} GSM_BackupFormat;\n"
  },
  {
    "path": "examples/specific/c_file.cfg",
    "content": "PROJECT_NAME     = \"C File Example\"\nOUTPUT_DIRECTORY = c_file\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_file.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/c_file.h",
    "content": "/* Borrowed from git \"cache-tree.h\" as an example of C code */\n\n#ifndef CACHE_TREE_H\n#define CACHE_TREE_H\n\n#include \"tree.h\"\n#include \"tree-walk.h\"\n\nstruct cache_tree;\nstruct cache_tree_sub {\n\tstruct cache_tree *cache_tree;\n\tint namelen;\n\tint used;\n\tchar name[FLEX_ARRAY];\n};\n\nstruct cache_tree {\n\tint entry_count; /* negative means \"invalid\" */\n\tunsigned char sha1[20];\n\tint subtree_nr;\n\tint subtree_alloc;\n\tstruct cache_tree_sub **down;\n};\n\n/** Shared cache tree instance. */\nextern struct cache_tree global_cache_tree;\n\nstruct cache_tree *cache_tree(void);\nextern void cache_tree_free(struct cache_tree **);\nvoid cache_tree_invalidate_path(struct cache_tree *, const char *);\nstruct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);\n\nvoid cache_tree_write(struct strbuf *, struct cache_tree *root);\nstruct cache_tree *cache_tree_read(const char *buffer, unsigned long size);\n\nint cache_tree_fully_valid(struct cache_tree *);\nint cache_tree_update(struct cache_tree *, struct cache_entry **, int, int, int);\n\n/** bitmasks to write_cache_as_tree flags */\n#define WRITE_TREE_MISSING_OK 1\n#define WRITE_TREE_IGNORE_CACHE_TREE 2\n\n/** error return codes */\n#define WRITE_TREE_UNREADABLE_INDEX (-1)\n#define WRITE_TREE_UNMERGED_INDEX (-2)\n#define WRITE_TREE_PREFIX_ERROR (-3)\n\nint write_cache_as_tree(unsigned char *sha1, int flags, const char *prefix);\nvoid prime_cache_tree(struct cache_tree **, struct tree *);\n\nextern int cache_tree_matches_traversal(struct cache_tree *, struct name_entry *ent, struct traverse_info *info);\n\n#endif\n"
  },
  {
    "path": "examples/specific/c_macro.cfg",
    "content": "PROJECT_NAME     = \"C Macro\"\nOUTPUT_DIRECTORY = c_macro\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_macro.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/c_macro.h",
    "content": "\n#define A_C_MACRO \"hello world\"\n#define ANOTHER_C_MACRO(name) \"hello\" name\n"
  },
  {
    "path": "examples/specific/c_struct.cfg",
    "content": "PROJECT_NAME     = \"C Struct\"\nOUTPUT_DIRECTORY = c_struct\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_struct.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/c_struct.h",
    "content": "\nstruct ACStruct {\n\tint i;\n\n\tstruct ANestedStruct {\n\t\tint i;\n\t};\n};\n\n"
  },
  {
    "path": "examples/specific/c_typedef.cfg",
    "content": "PROJECT_NAME     = \"Function Type Def Command\"\nOUTPUT_DIRECTORY = c_typedef\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_typedef.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/c_typedef.h",
    "content": "/**\n * Sample typedef for a function pointer\n */\ntypedef int (*cTypeDefTestFuncPtr)(void);\n\ntypedef void* (*cVoidFuncPtr)(float, int);\n\ntypedef void* cVoidPointer;\n\ntypedef float* cFloatPointer;\n\ntypedef float cFloatingPointNumber;\n\n/**\n * @brief Test for a simple C typedef\n */\ntypedef int cTestTypedef;\n"
  },
  {
    "path": "examples/specific/c_union.cfg",
    "content": "PROJECT_NAME     = \"C Union\"\nOUTPUT_DIRECTORY = c_union\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = c_union.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/c_union.h",
    "content": "\nunion ACUnion {\n\tint i;\n};\n\n"
  },
  {
    "path": "examples/specific/class.cfg",
    "content": "PROJECT_NAME     = \"Class Command\"\nOUTPUT_DIRECTORY = class\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = class.h class.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/class.cpp",
    "content": "#include \"class.h\"\n\n/*! More documentation in the impl file */\nvoid ClassTest::function(int myIntParameter)\n{\n}\n\n/*! More documentation in the impl file */\nvoid ClassTest::anotherFunction()\n{\n}\n\n"
  },
  {
    "path": "examples/specific/class.h",
    "content": "#include <string>\n\nnamespace TestNamespaceClasses {\n\n//! \\brief first class inside of namespace\nclass NamespacedClassTest {\n\npublic:\n\n    //! \\brief namespaced class function\n    virtual void function() const = 0;\n\n    static void functionS();\n\n    explicit NamespacedClassTest() {}\n\n    //! \\brief namespaced class other function\n    void anotherFunction() {}\n};\n\n\n//! \\brief second class inside of namespace\nclass ClassTest {\n\npublic:\n\n    //! \\brief second namespaced class function\n    void function() {}\n\n    //! \\brief second namespaced class other function\n    void anotherFunction() {}\n\n};\n\n\n} // TestNamespaceClasses\n\n//! \\brief class outside of namespace\nclass OuterClass {\n\npublic:\n\n    //! \\brief inner class\n    class InnerClass {};\n\n};\n\n\n//! \\brief class outside of namespace\nclass ClassTest {\n\npublic:\n\n    /*! \\brief non-namespaced class function\n\n        More details in the header file.\n      */\n    void function(int myParameter);\n \n    //! \\brief non-namespaced class other function\n    void anotherFunction();\n\n    //! \\brief namespaced class function\n    virtual void publicFunction() const = 0;\n\n    virtual void undocumentedPublicFunction() const = 0;\n\n    //! A public class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n\n    //! A public struct\n    struct PublicStruct {};\n\n    struct UndocumentedPublicStruct {};\n\nprotected:\n\n    //! A protected function\n    void protectedFunction() {}\n\n    void undocumentedProtectedFunction() {}\n\n    //! A protected class\n    class ProtectedClass {};\n\n    class UndocumentedProtectedClass {};\n\n    //! A protected struct\n    struct ProtectedStruct {};\n\n    struct UndocumentedProtectedStruct {};\n\nprivate:\n\n    //! This is a private function\n    virtual void privateFunction() const = 0;\n\n    virtual void undocumentedPrivateFunction() const = 0;\n\n    //! A private class\n    class PrivateClass {};\n\n    class UndocumentedPrivateClass {};\n\n    //! A private struct\n    struct PrivateStruct {};\n\n    struct UndocumentedPrivateStruct {};\n};\n\n\ntemplate<typename T>\nvoid f0();\n\ntemplate<>\nvoid f0<std::string>();\n\nnamespace NS1 {\n\ntemplate<typename T>\nvoid f1();\n\ntemplate<>\nvoid f1<std::string>();\n\nnamespace NS2 {\n\ntemplate<typename T>\nvoid f2();\n\ntemplate<>\nvoid f2<std::string>();\n\n} // namespace NS2\n} // namespace NS1\n"
  },
  {
    "path": "examples/specific/code_blocks.cfg",
    "content": "PROJECT_NAME     = \"Code Blocks\"\nOUTPUT_DIRECTORY = code_blocks\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = code_blocks.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/code_blocks.h",
    "content": "\n/** A function with an unannotated code block with C/C++ code.\n *\n * @code\n * char* buffer = new char[42];\n * int charsAdded = sprintf(buffer, \"Tabs are normally %d spaces\\n\", 8);\n * @endcode\n */\nvoid with_standard_code_block();\n\n/** A function with an unannotated code block with non-C/C++ code.\n *\n * @code\n * set(user_list A B C)\n * foreach(element ${user_list})\n *     message(STATUS \"Element is ${element}\")\n * endforeach()\n * @endcode\n * \n * Another code-block that explicitly remains not highlighted.\n * @code{.unparsed}\n * Show this as is.\n * @endcode\n */\nvoid with_unannotated_cmake_code_block();\n\n/** A function with an annotated cmake code block.\n *\n * @code{.cmake}\n * set(user_list A B C)\n * foreach(element ${user_list})\n *     message(STATUS \"Element is ${element}\")\n * endforeach()\n * @endcode\n */\nvoid with_annotated_cmake_code_block();\n"
  },
  {
    "path": "examples/specific/cpp_anon.cfg",
    "content": "PROJECT_NAME     = \"C++ Anonymous\"\nOUTPUT_DIRECTORY = cpp_anon\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_anon.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/cpp_anon.h",
    "content": "struct ClassWithAnonEntities {\n\tstruct {\n\t\tint structMember;\n\t};\n\n\tunion {\n\t\tint unionMember;\n\t};\n\n\tenum {\n\t\tEnumerator\n\t};\n};\n"
  },
  {
    "path": "examples/specific/cpp_concept.cfg",
    "content": "PROJECT_NAME     = \"C++ Concept\"\nOUTPUT_DIRECTORY = cpp_concept\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_concept.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/cpp_concept.h",
    "content": "template<typename T>\nconcept Hashable = requires(T a)\n{\n    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n};\n"
  },
  {
    "path": "examples/specific/cpp_constexpr_hax.cfg",
    "content": "PROJECT_NAME     = \"Constexpr Hax\"\nOUTPUT_DIRECTORY = cpp_constexpr_hax\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_constexpr_hax.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/cpp_constexpr_hax.h",
    "content": "[[nodiscard]] constexpr static auto f1(std::false_type) {}\n[[nodiscard]] static constexpr auto f2(std::false_type) {}\n\nconstexpr static int v1 = 42;\nstatic constexpr int v2 = 42;\n"
  },
  {
    "path": "examples/specific/cpp_enum.cfg",
    "content": "PROJECT_NAME     = \"C++ Enum\"\nOUTPUT_DIRECTORY = cpp_enum\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_enum.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/cpp_enum.h",
    "content": "enum Unscoped : int {\n\tUnscopedEnumerator = 42\n};\n\nenum struct ScopedStruct : int {\n\tEnumerator = 42\n};\n\nenum class ScopedClass : int {\n\tEnumerator = 42\n};\n\nenum class ScopedClassNoUnderlying {\n\tEnumerator = 42\n};\n"
  },
  {
    "path": "examples/specific/cpp_friendclass.cfg",
    "content": "PROJECT_NAME     = \"C++ Friend Class\"\nOUTPUT_DIRECTORY = cpp_friendclass\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_friendclass.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/cpp_friendclass.h",
    "content": "struct A {};\nstruct B {};\n\nstruct C {\n\tfriend class A;\n\tfriend struct B;\n};\n"
  },
  {
    "path": "examples/specific/cpp_function.cfg",
    "content": "PROJECT_NAME     = \"C++ Function\"\nOUTPUT_DIRECTORY = cpp_function\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_function.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/cpp_function.h",
    "content": "struct Foo{};\nstruct Class {\n\tvirtual void f1() const volatile & = 0;\n\tvirtual void f2() const volatile && = 0;\n\tstatic void f3();\n\n\n\tvoid (*f_issue_489)(struct Foo *foo, int value);\n\n\tint f_issue_338() noexcept;\n};\n\n/** A namespace to demonstrate a namespaced function */\nnamespace TestNamespaceFunction {\n/** A function within a namespace. */\nvoid namespaceFunc();\n}\n"
  },
  {
    "path": "examples/specific/cpp_function_lookup.cfg",
    "content": "PROJECT_NAME     = \"C++ Function Lookup\"\nOUTPUT_DIRECTORY = cpp_function_lookup\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_function_lookup.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/cpp_function_lookup.h",
    "content": "// stuff on the paramQual\nvoid fNoexcept() noexcept;\nvoid fFinal() final;\nvoid fOverride() override;\nvoid fAttr() [[myattr]]; // TODO: Doxygen seems to strip attributes\nvoid fFInit() = default;\nauto fTrailing() -> int;\n\n// different parameters\nvoid fInit(int arg = 42);\nvoid fPlain(int arg);\nvoid fPtr(int *arg);\nvoid fLRef(int &arg);\nvoid fRRef(int &&arg);\ntemplate<typename ...T>\nvoid fParamPack(T ...arg);\nclass A {};\nvoid fMemPtr(int A::*arg);\nvoid fParen(void (*arg)());\n\n// different parameters in a function pointer\nvoid fParenPlain(void (*arg)(int argInner));\n"
  },
  {
    "path": "examples/specific/cpp_inherited_members.cfg",
    "content": "PROJECT_NAME     = \"C++ Inherited Members\"\nOUTPUT_DIRECTORY = cpp_inherited_members\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_inherited_members.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nINLINE_INHERITED_MEMB = YES\n"
  },
  {
    "path": "examples/specific/cpp_inherited_members.h",
    "content": "/**\n * @file\n */\n\n/// Base class\nclass Base\n{\npublic:\n    /// Base-class member function\n    void f_issue_356();\n};\n\n/// Class A\nclass A : public Base {};\n/// Class B\nclass B : public Base {};\n"
  },
  {
    "path": "examples/specific/cpp_ns_template_specialization.cfg",
    "content": "PROJECT_NAME     = \"C++ Template Specialization with Namespace\"\nOUTPUT_DIRECTORY = cpp_ns_template_specialization\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_ns_template_specialization.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/cpp_ns_template_specialization.h",
    "content": "namespace ns1 {\nstruct Foo {\n  int value;\n};\n} // namespace ns1\n\nnamespace ns2 {\ntemplate <class U> struct Trait {\n  static constexpr bool valid = false;\n};\n\ntemplate <> struct Trait<ns1::Foo> {\n  static constexpr bool valid = true;\n};\n} // namespace ns2\n"
  },
  {
    "path": "examples/specific/cpp_trailing_return_type.cfg",
    "content": "PROJECT_NAME     = \"C++ Trailing Return Type\"\nOUTPUT_DIRECTORY = cpp_trailing_return_type\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_trailing_return_type.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/cpp_trailing_return_type.h",
    "content": "/*! \\file cpp_trailing_return_type.h */\n\n/*! needed for references in global function return type */\nclass Thingy {};\n\n//! \\brief Function that creates a thingy.\nauto f_issue_441() -> Thingy*;\n"
  },
  {
    "path": "examples/specific/cpp_union.cfg",
    "content": "PROJECT_NAME     = \"C++ Union\"\nOUTPUT_DIRECTORY = cpp_union\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = cpp_union.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/cpp_union.h",
    "content": "\nunion Union {\n\tint i;\n};\n\nstruct Class {\n\tunion Union {\n\t\tint i;\n\t};\n};\n"
  },
  {
    "path": "examples/specific/decl_impl.cfg",
    "content": "PROJECT_NAME     = \"Declaration/Implementation\"\nOUTPUT_DIRECTORY = decl_impl\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = decl_impl.h decl_impl.cpp\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/decl_impl.cpp",
    "content": "/*! More detailed description\n\n    Yeah and some more.\n*/\nint open_di(const char * pathname, int flags) {\n\treturn 0;\n}\n\nnamespace testnamespace {\n\n/*! Even more documentation. */\nint another_open_di(const char *,int)\n{\n\treturn 0;\n}\n\n}\n"
  },
  {
    "path": "examples/specific/decl_impl.h",
    "content": "/*! \\fn int open_di(const char *pathname,int flags)\n    \\brief Opens a file descriptor.\n\n    Detailed description.\n    \n    \\param pathname The name of the descriptor.\n    \\param flags Opening flags.\n*/\nint open_di(const char *,int);\n\n\n\nnamespace testnamespace {\n\n/*! \\brief Some documentation.\n\n    More documentation.\n    */\nint another_open_di(const char *,int);\n\n}\n"
  },
  {
    "path": "examples/specific/define.cfg",
    "content": "PROJECT_NAME     = \"Define example\"\nOUTPUT_DIRECTORY = define\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = define.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/define.h",
    "content": "/**\n * A simple define without a value\n */\n#define USE_STUFF\n\n\n/**\n * A define with a simple value\n */\n#define MAX_LENGTH 100\n\n\n/**\n * A define with some parameters\n *\n * \\param A The parameter A\n * \\param B The parameter B\n *\n * \\returns The maximum of A and B\n */\n#define MAXIMUM(A,B) ((A > B)?(A):(B))\n\n\n/**\n * A define which spans multiple lines\n */\n#define SWAP(A,B) {             \\\n                    (a) ^= (b); \\\n                    (b) ^= (a); \\\n                    (a) ^= (b); \\\n                  }\n"
  },
  {
    "path": "examples/specific/dot_graphs.cfg",
    "content": "PROJECT_NAME      = \"Dot Graphs\"\nHAVE_DOT          = YES\nOUTPUT_DIRECTORY  = dot_graphs\nDOTFILE_DIRS      = .\nGENERATE_LATEX    = NO\nGENERATE_RTF      = NO\nGENERATE_MAN      = NO\nCASE_SENSE_NAMES  = NO\nINPUT             = dot_graphs.h\nQUIET             = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML     = NO\nGENERATE_XML      = YES\nWARNINGS          = NO\n"
  },
  {
    "path": "examples/specific/dot_graphs.h",
    "content": "/**\n * @file dot_graphs.h\n *\n * @page dotgraphs Dot Graph Demonstrations\n *\n * @section dotcmd Using \\@dot command\n *\n * @dot \"basic graph elements\"\n * digraph G {\n *     bgcolor=\"purple:pink\" label=\"a graph\" fontcolor=\"white\"\n *     subgraph cluster1 {\n *         fillcolor=\"blue:cyan\" label=\"a cluster\" fontcolor=\"white\" style=\"filled\" gradientangle=\"270\"\n *         node [shape=box fillcolor=\"red:yellow\" style=\"filled\" gradientangle=90]\n *\t\t\"a node\";\n *    }\n * }\n * @enddot\n *\n * @section dotfilecmd Using \\@dotfile command\n *\n * @dotfile \"dotfile.dot\" \"Captions go here\"\n */\n"
  },
  {
    "path": "examples/specific/dotfile.dot",
    "content": "digraph G {bgcolor=\"red:cyan\" gradientangle=0\n\n    subgraph cluster_0 {\n        style=filled;\n        color=lightgrey;\n        fillcolor=\"blue:yellow\";\n        gradientangle=90;\n        node [fillcolor=\"yellow:green\" style=filled gradientangle=270] a0;\n        node [fillcolor=\"green:red\"] a1;\n        node [fillcolor=\"red:cyan\"] a2;\n        node [fillcolor=\"cyan:blue\"] a3;\n\n        a0 -> a1 -> a2 -> a3;\n        label = \"process #1\";\n    }\n\n    subgraph cluster_1 {\n        node [fillcolor=\"yellow:magenta\"\n             style=filled gradientangle=270] b0;\n        node [fillcolor=\"magenta:cyan\"] b1;\n        node [fillcolor=\"cyan:red\"] b2;\n        node [fillcolor=\"red:blue\"] b3;\n\n        b0 -> b1 -> b2 -> b3;\n        label = \"process #2\";\n        color=blue\n        fillcolor=\"blue:yellow\";\n        style=filled;\n        gradientangle=90;\n    }\n    start -> a0;\n    start -> b0;\n    a1 -> b3;\n    b2 -> a3;\n    a3 -> a0;\n    a3 -> end;\n    b3 -> end;\n\n    start [shape=Mdiamond ,\n        fillcolor=\"yellow:brown\",\n        gradientangle=90,\n        style=radial];\n    end [shape=Msquare,\n        fillcolor=\"orange:blue\",\n        style=radial,\n        gradientangle=90];\n}\n"
  },
  {
    "path": "examples/specific/enum.cfg",
    "content": "PROJECT_NAME     = \"Enum Command\"\nOUTPUT_DIRECTORY = enum\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = enum.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/enum.h",
    "content": "\nnamespace TestEnumNamespace {\n\n//! \\brief enum inside of namespace\nenum NamespacedEnumTest {\n\n    //! \\brief namespaced enum value\n    FIRST,\n    SECOND\n};\n\n}\n\n//! \\brief enum outside of namespace\nenum EnumTest {\n\n    //! \\brief enum value\n    VALUE\n};\n"
  },
  {
    "path": "examples/specific/fixedwidthfont.cfg",
    "content": "PROJECT_NAME     = \"Fixed width font markup doc test\"\nOUTPUT_DIRECTORY = fixedwidthfont\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = fixedwidthfont.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/fixedwidthfont.h",
    "content": "\nclass Out\n{\npublic:\n\n    //! \\b Constructor \\a for Out object\n    Out() {}\n\n    //! \\a Destructor \\b for Out object\n    ~Out() {}\n\n};\n\n"
  },
  {
    "path": "examples/specific/functionOverload.cfg",
    "content": "PROJECT_NAME     = \"Function Overload\"\nOUTPUT_DIRECTORY = functionOverload\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = functionOverload.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/functionOverload.h",
    "content": "#include <string>\n\n//! Non overloaded function\nvoid simplefunc();\n\n//! Function which takes two int arguments\nvoid f(int, int);\n\n//! Function which takes two double arguments\nvoid f(double, double);\n\nnamespace test {\n\n//! Another function which takes two int arguments\nvoid g(int, int);\n\n//! Another function which takes two double arguments\nvoid g(double, double);\n\n}\n\n/*! needed for references in global function parameters */\nclass MyType {};\n\n/*! needed for references in global function parameters */\nclass MyOtherType {};\n\n//! Another function which takes a custom type\nvoid h(std::string, MyType);\n\n//! Another function which takes another custom type\nvoid h(std::string, MyOtherType o);\n\n//! Another function which takes a basic type\nvoid h(std::string, float myfloat);\n\n//! Another function which takes a const custom type\nvoid h(std::string, const MyType& mytype);\n\n//! Another function which takes a const basic type\nvoid h(std::string, const int myint);\n\n//! Another function which takes a const basic type\ntemplate <typename T>\nvoid h(std::string, const T myType);\n\n//! Another function which takes a const basic type\ntemplate <typename T, typename U>\nvoid h(std::string, const T m, const U n);\n\n\n/**\n * Test function 1.\n */\nvoid j(int);\n\n/**\n * Test function 2.\n */\nvoid j(char);\n"
  },
  {
    "path": "examples/specific/group.cfg",
    "content": "# For a case where Breathe was failing on the doxygen output\n\nPROJECT_NAME     = \"Group Test\"\nOUTPUT_DIRECTORY = group\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = group.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/group.h",
    "content": "\n/** @defgroup mygroup My Group\n *  This is the first group\n *  @{\n */\n\n//! \\brief first class inside of namespace\nclass GroupedClassTest {\n\npublic:\n    //! \\brief namespaced class function\n    virtual void publicFunction() const = 0;\n\n    virtual void undocumentedPublicFunction() const = 0;\n\n    //! A protected class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n\nprotected:\n\n    //! A protected function\n    void protectedFunction() {};\n\n    void undocumentedProtectedFunction() {};\n\n    //! A protected class\n    class ProtectedClass {};\n\n    class UndocumentedProtectedClass {};\n\nprivate:\n\n    //! This is a private function\n    virtual void privateFunction() const = 0;\n\n    virtual void undocumentedPrivateFunction() const = 0;\n\n    //! A private class\n    class PrivateClass {};\n\n    class UndocumentedPrivateClass {};\n};\n\n//! This function is in MyGroup\nvoid groupedFunction();\n\n/** @} */ // end of mygroup\n\n/** @defgroup innergroup Inner Group\n *  @ingroup mygroup\n *  This is an inner group\n *  @{\n */\n\n//! \\brief inner class inside of namespace\nclass InnerGroupClassTest {\n\npublic:\n    //! \\brief inner namespaced class function\n    void function() {};\n\nprivate:\n\n    //! A private function\n    void innerGroupPrivateFunction() {};\n\n    class PrivateClass {};\n};\n\n/** @} */ // end of innergroup\n\n//! \\brief second class inside of namespace\nclass UngroupedClassTest {\n\npublic:\n    //! \\brief second namespaced class function\n    void function() {};\n\nprivate:\n\n    //! A private function\n    void ungroupedPrivateFunction() {};\n\n    class PrivateClass {};\n};\n\n//! Ungrouped function\nvoid ungroupedFunction();\n"
  },
  {
    "path": "examples/specific/headerfile.cfg",
    "content": "PROJECT_NAME     = \"Headerfile Command\"\nOUTPUT_DIRECTORY = headerfile\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = headerfile.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/headerfile.h",
    "content": "\n/**\n * \\class ClassTest\n * \\headerfile hearderfile.h \"specific/headerfile.h\"\n * \\brief Class showing the header where it is defined\n */\nclass ClassTest\n{\n\npublic:\n\n    //! \\brief Constructor\n    ClassTest();\n};\n\n\n/**\n * \\class ClassTest2 headerfile.h \"specific/headerfile.h\"\n * \\brief Another way to show the header file\n */\nclass ClassTest2\n{\n\npublic:\n\n    //! \\brief Constructor\n    ClassTest2();\n}\n\n"
  },
  {
    "path": "examples/specific/headings.cfg",
    "content": "PROJECT_NAME     = \"Headings\"\nOUTPUT_DIRECTORY = headings\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = headings.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/headings.h",
    "content": "/*! \\brief This is a documentation\n\nThis is more documentation.\n\n<h2>Header</h2>\nText\n\n<h2>Header <b>Bold Header Text</b></h2>\nText\n\nHeader\n---------\nText\n\n### Header ###\nText\n*/\nclass HeadingsTest {};\n"
  },
  {
    "path": "examples/specific/image.cfg",
    "content": "PROJECT_NAME     = \"Image Test\"\nOUTPUT_DIRECTORY = image\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = image.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nIMAGE_PATH = .\n"
  },
  {
    "path": "examples/specific/image.h",
    "content": "/**\n* This is a class with an image in the description. It renders like this:\n*\n* \\image HTML imageExample.png\n*\n* Breathe & Sphinx should automatically copy the image from the doxygen output directory into the\n* _images folder of the Sphinx output.\n*/\nclass ImageClass {};\n"
  },
  {
    "path": "examples/specific/inheritance.cfg",
    "content": "PROJECT_NAME     = \"Inheritance\"\nOUTPUT_DIRECTORY = inheritance\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = inheritance.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/inheritance.h",
    "content": "\nclass BaseA {};\nclass BaseB {};\n\n/*! \\brief This is the main class we're interested in */\nclass Main : public BaseA, BaseB {};\n\nclass ChildA : public Main {};\nclass ChildB : public Main {};\n"
  },
  {
    "path": "examples/specific/inline.cfg",
    "content": "PROJECT_NAME     = \"Inline Parameter Doc Test\"\nOUTPUT_DIRECTORY = inline\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = inline.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/inline.h",
    "content": "#include <stdexcept>\n/** A class to demonstrate inline documentation syntax. */\nclass InlineTest\n{\n public:\n /** A member function.\n  *\n  * Details about member function\n  *\n  *  \\exception std::out_of_range parameter is out of range.\n  *  @return a character pointer.\n  */\n const char *member(char c, ///< c a character.\n                    int n)  ///< n an integer.\n\n throw(std::out_of_range);\n};\n"
  },
  {
    "path": "examples/specific/interface.cfg",
    "content": "PROJECT_NAME     = \"Interface Command\"\nOUTPUT_DIRECTORY = interface\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = interface.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/interface.h",
    "content": "/* A dummy interface, which is really just a specially treated class in C++ */\n\nclass InterfaceClass\n{\n};\n\n/*! \\interface InterfaceClass interface.h \"inc/interface.h\"\n *  \\brief This is a test interface class.\n *\n * Some details about the InterfaceClass interface\n */\n"
  },
  {
    "path": "examples/specific/latexmath.cfg",
    "content": "PROJECT_NAME     = \"Latex Math Option\"\nOUTPUT_DIRECTORY = latexmath\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = latexmath.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/latexmath.h",
    "content": "\n/**\n * @brief A class\n *\n * A inline formula: \\f$ f(x) = a + b \\f$\n *\n * A display style formula:\n * @f[\n * \\int_a^b f(x) dx = F(b) - F(a)\n * @f]\n */\nclass MathHelper\n{\npublic:\n  MathHelper() {}\n  ~MathHelper() {}\n}\n\n"
  },
  {
    "path": "examples/specific/links.cfg",
    "content": "PROJECT_NAME     = \"Links Command\"\nOUTPUT_DIRECTORY = links\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = links.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/links.h",
    "content": "\n/*! \\brief first struct inside of namespace\n\n  This is a longer description with a link to a webpage \n  in the text https://github.com in order to test out Breathe's\n  handling of links.\n\n */\nclass LinksTest {};\n"
  },
  {
    "path": "examples/specific/lists.cfg",
    "content": "PROJECT_NAME     = \"Lists Option\"\nOUTPUT_DIRECTORY = lists\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = lists.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/lists.h",
    "content": "/**\n * \\brief This is a list example.\n *\n * Following is a list using '+' for bullets:\n *      + One item.\n *      + Two items.\n *      + Three items.\n *      + Four.\n *\n * And this is some more text.\n */\nclass SimpleList_1\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a list using '-' for bullets:\n *      - One item.\n *      - Two items.\n *      - Three items.\n *      - Four.\n *\n * And this is some more text.\n */\nclass SimpleList_2\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a list using '*' for bullets:\n *      * One item.\n *      * Two items.\n *      * Three items.\n *      * Four.\n *\n * And this is some more text.\n */\nclass SimpleList_3\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is an auto-numbered list:\n *      -# One item.\n *      -# Two items.\n *      -# Three items.\n *      -# Four.\n *\n * And this is some more text.\n */\nclass SimpleList_4\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a numbered list:\n *      1. One item.\n *      2. Two items.\n *      3. Three items.\n *      4. Four.\n *\n * And this is some more text.\n */\nclass SimpleList_5\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is an unordered list using 'HTML' tags:\n *      <ul><li> One item.\n *      <li> Two items.\n *      <li> Three items.\n *      <li> Four.\n *      </ul>\n *\n * And this is some more text.\n */\nclass SimpleList_6\n{\n};\n\n/**\n *  A list of events:\n *    - mouse events\n *         -# mouse move event\n *         -# mouse click event\\n\n *            More info about the click event.\n *         -# mouse double click event\n *    - keyboard events\n *         1. key down event\n *         2. key up event\n *\n *  More text here.\n */\nclass NestedLists_1\n{\n};\n\n/**\n * Text before the list\n * - list item 1\n *   - sub item 1\n *     - sub sub item 1\n *     - sub sub item 2\n *     .\n *     The dot above ends the sub sub item list.\n *\n *     More text for the first sub item\n *   .\n *   The dot above ends the first sub item.\n *\n *   More text for the first list item\n *   - sub item 2\n *   - sub item 3\n * - list item 2\n * .\n * More text in the same paragraph.\n *\n * More text in a new paragraph.\n */\nclass NestedLists_2\n{\n};\n\n/*!\n *  A list of events:\n *  <ul>\n *  <li> mouse events\n *     <ol>\n *     <li>mouse move event\n *     <li>mouse click event<br>\n *         More info about the click event.\n *     <li>mouse double click event\n *     </ol>\n *  <li> keyboard events\n *     <ol>\n *     <li>key down event\n *     <li>key up event\n *     </ol>\n *  </ul>\n *  More text here.\n */\n class NestedLists_3\n{\n};\n\n/**\n *  A list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_4\n{\n};\n\n/**\n *  A deeply nested list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *              -# swipe left\n *              -# swipe right\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_5\n{\n};\n"
  },
  {
    "path": "examples/specific/make.bat",
    "content": "@ECHO OFF\n\nset DOXYGEN=doxygen\nfor /f \"delims=\" %%i in ('where doxygen') do set DOXYGEN=%%i\n\nset PERL=perl\nfor /f \"delims=\" %%i in ('where perl') do set PERL=%%i\n\nset HAVE_DOT=dot\nfor /f \"delims=\" %%i in ('where dot') do set HAVE_DOT=%%i\n\n@REM echo DOXYGEN  : %DOXYGEN%\n@REM echo PERL     : %PERL%\n@REM echo HAVE_DOT : %HAVE_DOT%\n\nif \"%1\" == \"\" (\n    call :all\n    goto end\n)\n\nif \"%1\" == \"all\" (\n    call :all\n    goto end\n)\n\nif \"%1\" == \"clean\" (\n    call :clean\n    goto end\n)\n\ngoto end\n\n:all\n    @REM ---------------\n    @REM General Pattern\n    @REM ---------------\n    call :doxygen nutshell.cfg\n    call :doxygen alias.cfg\n    call :doxygen rst.cfg\n    call :doxygen inline.cfg\n    call :doxygen namespacefile.cfg\n    call :doxygen array.cfg\n    call :doxygen inheritance.cfg\n    call :doxygen members.cfg\n    call :doxygen userdefined.cfg\n    call :doxygen fixedwidthfont.cfg\n    call :doxygen latexmath.cfg\n    call :doxygen functionOverload.cfg\n    call :doxygen image.cfg\n    call :doxygen name.cfg\n    call :doxygen union.cfg\n    call :doxygen group.cfg\n    call :doxygen struct.cfg\n    call :doxygen struct_function.cfg\n    call :doxygen qtsignalsandslots.cfg\n    call :doxygen lists.cfg\n    call :doxygen headings.cfg\n    call :doxygen links.cfg\n    call :doxygen parameters.cfg\n    call :doxygen template_class.cfg\n    call :doxygen template_class_non_type.cfg\n    call :doxygen template_function.cfg\n    call :doxygen template_type_alias.cfg\n    call :doxygen template_specialisation.cfg\n    call :doxygen enum.cfg\n    call :doxygen define.cfg\n    call :doxygen interface.cfg\n    call :doxygen xrefsect.cfg\n    call :doxygen tables.cfg\n    call :doxygen cpp_anon.cfg\n    call :doxygen cpp_concept.cfg\n    call :doxygen cpp_enum.cfg\n    call :doxygen cpp_union.cfg\n    call :doxygen cpp_function.cfg\n    call :doxygen cpp_friendclass.cfg\n    call :doxygen cpp_inherited_members.cfg\n    call :doxygen cpp_trailing_return_type.cfg\n    call :doxygen cpp_constexpr_hax.cfg\n    call :doxygen cpp_function_lookup.cfg\n    call :doxygen c_file.cfg\n    call :doxygen c_struct.cfg\n    call :doxygen c_enum.cfg\n    call :doxygen c_typedef.cfg\n    call :doxygen c_macro.cfg\n    call :doxygen c_union.cfg\n    call :doxygen membergroups.cfg\n    call :doxygen simplesect.cfg\n    call :doxygen code_blocks.cfg\n    call :doxygen dot_graphs.cfg\n    @REM -------------\n    @REM Special Cases\n    @REM -------------\n    call :doxygen programlisting.cfg\n    call :doxygen decl_impl.cfg\n    call :doxygen multifile.cfg\n    call :doxygen auto.cfg\n    call :doxygen class.cfg\n    call :doxygen typedef.cfg\n    goto end\n\n:clean\n    @REM ---------------\n    @REM General Pattern\n    @REM ---------------\n    call :rmdir nutshell\n    call :rmdir alias\n    call :rmdir rst\n    call :rmdir inline\n    call :rmdir namespacefile\n    call :rmdir array\n    call :rmdir inheritance\n    call :rmdir members\n    call :rmdir userdefined\n    call :rmdir fixedwidthfont\n    call :rmdir latexmath\n    call :rmdir functionOverload\n    call :rmdir image\n    call :rmdir name\n    call :rmdir union\n    call :rmdir group\n    call :rmdir struct\n    call :rmdir struct_function\n    call :rmdir qtsignalsandslots\n    call :rmdir lists\n    call :rmdir headings\n    call :rmdir links\n    call :rmdir parameters\n    call :rmdir template_class\n    call :rmdir template_class_non_type\n    call :rmdir template_function\n    call :rmdir template_type_alias\n    call :rmdir template_specialisation\n    call :rmdir enum\n    call :rmdir define\n    call :rmdir interface\n    call :rmdir xrefsect\n    call :rmdir tables\n    call :rmdir cpp_anon\n    call :rmdir cpp_concept\n    call :rmdir cpp_enum\n    call :rmdir cpp_union\n    call :rmdir cpp_function\n    call :rmdir cpp_friendclass\n    call :rmdir cpp_inherited_members\n    call :rmdir cpp_trailing_return_type\n    call :rmdir cpp_constexpr_hax\n    call :rmdir cpp_function_lookup\n    call :rmdir c_file\n    call :rmdir c_struct\n    call :rmdir c_enum\n    call :rmdir c_typedef\n    call :rmdir c_macro\n    call :rmdir c_union\n    call :rmdir membergroups\n    call :rmdir simplesect\n    call :rmdir code_blocks\n    call :rmdir dot_graphs\n    @REM -------------\n    @REM Special Cases\n    @REM -------------\n    call :rmdir programlisting\n    call :rmdir decl_impl\n    call :rmdir multifilexml\n    call :rmdir auto\n    call :rmdir class\n    call :rmdir typedef\n    goto end\n\n:doxygen\n    set CFG=%~1\n    echo Running doxygen: %CFG%\n    \"%DOXYGEN%\" %CFG%\n    goto end\n\n:rmdir\n    set DIR=%~1\n    if exist \"%DIR%\" (\n        echo Removing directory: %DIR%\n        rmdir /s/q \"%DIR%\"\n    )\n    goto end\n\n:end"
  },
  {
    "path": "examples/specific/membergroups.cfg",
    "content": "PROJECT_NAME     = \"Member Groups\"\nOUTPUT_DIRECTORY = membergroups\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = membergroups.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/membergroups.h",
    "content": "//! \\brief demonstrates member groups\nclass GroupedMembers {\n\npublic:\n\n    ///@{   @name myGroup\n    void in_mygroup_one(int myParameter);  ///< A function\n    void in_mygroup_two(int myParameter);  ///< Another function\n    ///@}\n\n    void not_in_mygroup(int myParameter);  ///< This one is not in myGroup\n\n};\n"
  },
  {
    "path": "examples/specific/members.cfg",
    "content": "PROJECT_NAME     = \"Members Option\"\nOUTPUT_DIRECTORY = members\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = members.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/members.h",
    "content": "\n\nnamespace testnamespace {\n\n//! \\brief first class inside of namespace\nclass NamespacedClassTest {\n\npublic:\n\n    //! \\brief namespaced class function\n    virtual void function() const = 0;\n\n    explicit NamespacedClassTest() {};\n\nprotected:\n\n    //! Some kind of function\n    static void functionS();\n\nprivate:\n\n\n    //! \\brief namespaced class other function\n    void anotherFunction() {};\n};\n\n}\n"
  },
  {
    "path": "examples/specific/multifile/one/Util.h",
    "content": "\n\nnamespace test {\n\ntypedef float MyFloat;\n\nvoid TestFunc() {};\n\n}\n\nclass TestClass {\npublic:\n    /// enum docs\n    enum Enum {};\n};\n"
  },
  {
    "path": "examples/specific/multifile/two/Util.h",
    "content": "#include \"../one/Util.h\"\n\nnamespace test {\n\ntypedef int MyInt;\n\nstruct TestStruct {};\n\n}\n\n/// The non-type template parameter references a different file\ntemplate <TestClass::Enum E> void TestTemplateFunction();\n"
  },
  {
    "path": "examples/specific/multifile.cfg",
    "content": "PROJECT_NAME     = \"Multifile\"\nOUTPUT_DIRECTORY = multifilexml\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = multifile\nRECURSIVE        = YES\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/name.cfg",
    "content": "# For a case where Breathe was failing on the doxygen output\n\nPROJECT_NAME     = \"Name Test\"\nOUTPUT_DIRECTORY = name\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = name.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/name.h",
    "content": "\n/*! \\brief A failing class\n *  \\class Failing */\nclass Failing {\npublic:\n    /**\n     * @name Some section .\n     * THIS IS CAUSING THE ERROR, must have an empty star line above\n     *\n     * @{\n     */\n    int getSomething() const; ///< some docs\n    bool isSomething() const; ///< some more docs\n    //@}\n};\n\n"
  },
  {
    "path": "examples/specific/namespacefile.cfg",
    "content": "PROJECT_NAME     = \"Namespace in file\"\nOUTPUT_DIRECTORY = namespacefile\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = namespacefile.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/namespacefile.h",
    "content": "\nnamespace foo {\n\n    /** This appears in the documentation */\n    class Bar {\n\n    public:\n        //! \\brief namespaced class function\n        virtual void publicFunction() const = 0;\n\n        virtual void undocumentedPublicFunction() const = 0;\n\n        //! A protected class\n        class PublicClass {};\n\n        class UndocumentedPublicClass {};\n\n    protected:\n\n        //! A protected function\n        void protectedFunction() {};\n\n        void undocumentedProtectedFunction() {};\n\n        //! A protected class\n        class ProtectedClass {};\n\n        class UndocumentedProtectedClass {};\n\n    private:\n\n        //! This is a private function\n        virtual void privateFunction() const = 0;\n\n        virtual void undocumentedPrivateFunction() const = 0;\n\n        //! A private class\n        class PrivateClass {};\n\n        class UndocumentedPrivateClass {};\n    };\n\n    /** This also appears */\n    int baz();\n\n    /** More examples in a nested namespace */\n    namespace ns {\n\n        typedef int MyInt;\n\n        enum Letters {\n            A, /**< A documented enumeration constant */\n            B,\n            C\n        };\n\n        /** Documentation here */\n        struct FooStruct {};\n\n        class FooClass {\n\n            class InnerFoo {};\n\n        };\n    }\n\n}\n\n/** This is outside the namespace */\nclass OuterBar {\n\n    /** This appears as a sub class */\n    class InnerBar {};\n\n};\n\n/** Function outside of the namespace */\nvoid outerFunction() {};\n"
  },
  {
    "path": "examples/specific/nutshell.cfg",
    "content": "PROJECT_NAME     = \"Breathe in a nutshell example\"\nOUTPUT_DIRECTORY = nutshell\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = nutshell.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/nutshell.h",
    "content": "/**\n    \\file nutshell.h\n    An overly extended example of how to use breathe\n*/\n\n/*!\n    With a little bit of a elaboration, should you feel it necessary.\n*/\nclass Nutshell\n{\npublic:\n\n    //! Our tool set\n    /*! The various tools we can opt to use to crack this particular nut */\n    enum Tool\n    {\n        kHammer = 0,          //!< What? It does the job\n        kNutCrackers,         //!< Boring\n        kNinjaThrowingStars   //!< Stealthy\n    };\n\n    //! Nutshell constructor\n    Nutshell();\n\n    //! Nutshell destructor\n    ~Nutshell();\n\n    /*! Crack that shell with specified tool\n\n      \\param tool the tool with which to crack the nut\n    */\n    void crack( Tool tool );\n\n    /*!\n      \\return Whether or not the nut is cracked\n    */\n    bool isCracked();\n\nprivate:\n\n    //! Our cracked state\n    bool m_isCracked;\n\n};\n\n\n"
  },
  {
    "path": "examples/specific/parameters.cfg",
    "content": "# For a case where Breathe was failing on the doxygen output\n\nPROJECT_NAME     = \"Parameters Test\"\nOUTPUT_DIRECTORY = parameters\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = parameters.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/parameters.h",
    "content": "\n/*! My function */\nint f(int a, float b, int* c, int (*p)[3]);\n\nclass MyClass {};\n\nint g(MyClass a, MyClass* b);\n\n"
  },
  {
    "path": "examples/specific/programlisting.cfg",
    "content": "PROJECT_NAME     = \"Program Listing Test\"\nOUTPUT_DIRECTORY = programlisting\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = programlisting.h\nEXAMPLE_PATH     = .\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nEXTRACT_ALL = YES\n\nENABLE_PREPROCESSING = YES\nMACRO_EXPANSION = YES\nEXPAND_ONLY_PREDEF = YES\nPREDEFINED = LEAP_EXPORT=\"\"\n\n"
  },
  {
    "path": "examples/specific/programlisting.h",
    "content": "\n/*! Vector class */\nclass Vector {};\n\n/*!\n * The center of the InteractionBox in device coordinates (millimeters). This point\n * is equidistant from all sides of the box.\n *\n * \\include programlistinginclude.txt\n *\n * @returns The InteractionBox center in device coordinates.\n * @since 1.0\n */\nLEAP_EXPORT Vector center() const;\n\n"
  },
  {
    "path": "examples/specific/programlistinginclude.txt",
    "content": "Vector boxCenter = interactionBox.center();\nVector max = interactionBox.max();\nVector diff = max - boxCenter;\n"
  },
  {
    "path": "examples/specific/qtsignalsandslots.cfg",
    "content": "PROJECT_NAME     = \"Qt Signals & Slots\"\nOUTPUT_DIRECTORY = qtsignalsandslots\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = qtsignalsandslots.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/qtsignalsandslots.h",
    "content": "#ifndef QT_OBJECT_H\n#define QT_OBJECT_H\n\n/*!\n*\\brief Forward declaration of QT API class\n\nQT slots and signals typically `#include <QObject>`, but this example is parsed without QT SDK installed.\n*/\nextern class QObject;\n\nclass QtSignalSlotExample: public QObject\n{\n    Q_OBJECT\n\n    public:\n\n    /*!\n     *\\param iShownParameter\n     This is shown in declaration\n     */\n    void workingFunction( int iShownParameter ) { Q_UNUSED( iShownParameter ; ) }\n\n    signals:\n\n    /*!\n     \\param iShown\n     This is in function declaration\n     */\n    void workingSignal( int iShown );\n\n    public slots:\n\n    /*!\n     \\param iShown\n     This is in function declaration\n     */\n    void workingSlot( int iShown ) { iShown; }\n};\n\n#endif\n"
  },
  {
    "path": "examples/specific/rst.cfg",
    "content": "PROJECT_NAME     = \"Rst Test\"\nOUTPUT_DIRECTORY = rst\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = rst.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nALIASES = \"rst=\\verbatim embed:rst\"\nALIASES += \"endrst=\\endverbatim\"\nALIASES += \"inlinerst=\\verbatim embed:rst:inline\"\n"
  },
  {
    "path": "examples/specific/rst.h",
    "content": "\n//! \\brief first class inside of namespace\nclass TestClass\n{\npublic:\n\n    /*!\n    Inserting additional reStructuredText information.\n\n    \\rst\n\n    This is some funky non-XML compliant text: <& !><\n\n    .. note::\n\n       This reStructuredText has been handled correctly.\n    \\endrst\n\n    This is just a standard verbatim block with code:\n\n    \\verbatim\n        child = 0;\n        while( child = parent->IterateChildren( child ) )\n    \\endverbatim\n\n    */\n    virtual void function() const = 0;\n\n    /*!\n    Inserting additional reStructuredText information.\n    \\verbatim embed:rst\n    .. note::\n\n       This reStructuredText has been handled correctly.\n    \\endverbatim\n    */\n    virtual void rawVerbatim() const = 0;\n\n   /*!\n    * Inserting additional reStructuredText information.\n    *\n    * \\verbatim embed:rst:leading-asterisk\n    *     Some example code::\n    *\n    *        int example(int x) {\n    *            return x * 2;\n    *        }\n    * \\endverbatim\n    */\n    virtual void rawLeadingAsteriskVerbatim() const = 0;\n\n    /// Some kind of method\n    ///\n    /// @param something a parameter\n    ///\n    /// @verbatim embed:rst:leading-slashes\n    ///    .. code-block:: c\n    ///       :linenos:\n    ///\n    ///       bool foo(bool something) {\n    ///           return something;\n    ///       };\n    ///\n    /// @endverbatim\n    /// @note Documentation using `///` should begin and end in a blank line.\n\n    virtual void rawLeadingSlashesVerbatim(int something) const = 0;\n\n    /*!\n    Inserting an inline reStructuredText snippet.\n    Linking to another function: \\inlinerst :cpp:func:`TestClass::rawVerbatim` \\endrst\n    */\n    virtual void rawInlineVerbatim() const = 0;\n\n    //! Brief description\n    virtual void testFunction() const {};\n};\n"
  },
  {
    "path": "examples/specific/simplesect.cfg",
    "content": "PROJECT_NAME     = \"Simplesect\"\nOUTPUT_DIRECTORY = simplesect\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = simplesect.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/simplesect.h",
    "content": "/*!\n\n  \\pre stuff must be correct\n  \\pre more stuff must be correct\n  \\post stuff will be nice\n  \\post more stuff will be nice\n  \\return nothing\n  \\par par, something\n  \\warning warning, don't do this\n  \\note note, be careful\n  \\see see, f_raw\n  \\sa sa, f_raw\n  \\remark remark, 1\n  \\remark remark, 2\n  \\remarks remarks, 1\n  \\remarks remarks, 2\n*/\ntemplate<typename T1, typename T2>\nvoid f(int a, float b, std::string c);\n"
  },
  {
    "path": "examples/specific/struct.cfg",
    "content": "PROJECT_NAME     = \"Struct Command\"\nOUTPUT_DIRECTORY = struct\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = struct.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/struct.h",
    "content": "\nnamespace testnamespace {\n\n//! \\brief first struct inside of namespace\nstruct NamespacedStructTest {\n\n\n    //! \\brief namespaced struct function\n    virtual void function() const = 0;\n\n    static void functionS();\n\n    explicit NamespacedStructTest() {};\n\n    //! \\brief namespaced struct other function\n    void anotherFunction() {};\n};\n\n\n//! \\brief second struct inside of namespace\nstruct StructTest {\n\n    //! \\brief second namespaced struct function\n    void function() {};\n\n    //! \\brief second namespaced struct other function\n    void anotherFunction() {};\n\n    //! A public class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n};\n\n\n};\n\n\n//! \\brief struct outside of namespace\nstruct StructTest {\n\n    //! \\brief namespaced class function\n    virtual void publicFunction() const = 0;\n\n    virtual void undocumentedPublicFunction() const = 0;\n\n    //! A public class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n\nprotected:\n\n    //! A protected function\n    void protectedFunction() {};\n\n    void undocumentedProtectedFunction() {};\n\n    //! A protected class\n    class ProtectedClass {};\n\n    class UndocumentedProtectedClass {};\n\nprivate:\n\n    //! This is a private function\n    virtual void privateFunction() const = 0;\n\n    virtual void undocumentedPrivateFunction() const = 0;\n\n    //! A private class\n    class PrivateClass {};\n\n    class UndocumentedPrivateClass {};\n};\n"
  },
  {
    "path": "examples/specific/struct_function.cfg",
    "content": "PROJECT_NAME     = \"Struct Function Command\"\nOUTPUT_DIRECTORY = struct_function\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = struct_function.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/struct_function.h",
    "content": "\nnamespace testnamespace {\n\n//! \\brief templated struct with functions\ntemplate <typename T>\nstruct MyClass\n{\n    //! \\brief struct empty constructor\n    MyClass();\n\n    //! \\brief struct copy constructor\n    MyClass(const MyClass&);\n\n    int myMemberVar;\n};\n\n}\n\n"
  },
  {
    "path": "examples/specific/tables.cfg",
    "content": "PROJECT_NAME     = \"Tables Option\"\nOUTPUT_DIRECTORY = tables\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = tables.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/tables.h",
    "content": "/**\n * \\brief This is a simple Markdown table example.\n *\n * Following is a simple table using Markdown syntax.\n *\n * First Header  | Second Header\n * ------------- | -------------\n * Content Cell  | Content Cell\n * Content Cell  | Content Cell\n *\n * And this is some more text.\n */\nclass Table_1\n{\n};\n\n/**\n * \\brief This is a Markdown table with alignment.\n *\n * Following is a table with alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | 1000  | 1000   | 1000  |\n *\n * And this is some more text.\n */\nclass Table_2\n{\n};\n\n/**\n * \\brief This is a Markdown table with rowspan and alignment.\n *\n * Following is a table with rowspan and alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | ^     | 1000   | 1000  |\n *\n * And this is some more text.\n */\nclass Table_3\n{\n};\n\n/**\n * \\brief This is a Markdown table with colspan and alignment.\n *\n * Following is a table with colspan and alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | 1000  |||\n *\n * And this is some more text.\n */\nclass Table_4\n{\n};\n\n/**\n * \\brief This is a Doxygen table.\n *\n * Following is a table using Doxygen syntax (and all supported features).\n *\n * <table>\n * <caption id=\"multi_row\">Complex table</caption>\n * <tr><th>Column 1                      <th>Column 2        <th>Column 3\n * <tr><td rowspan=\"2\">cell row=1+2,col=1<td>cell row=1,col=2<td>cell row=1,col=3\n * <tr><td rowspan=\"2\">cell row=2+3,col=2                    <td>cell row=2,col=3\n * <tr><td>cell row=3,col=1                                  <td rowspan=\"2\">cell row=3+4,col=3\n * <tr><td colspan=\"2\">cell row=4,col=1+2\n * <tr><td>cell row=5,col=1              <td colspan=\"2\">cell row=5,col=2+3\n * <tr><td colspan=\"2\" rowspan=\"2\">cell row=6+7,col=1+2      <td>cell row=6,col=3\n * <tr>                                                      <td>cell row=7,col=3\n * <tr><td>cell row=8,col=1              <td>cell row=8,col=2\\n\n *   <table>\n *     <tr><td>Inner cell row=1,col=1<td>Inner cell row=1,col=2\n *     <tr><td>Inner cell row=2,col=1<td>Inner cell row=2,col=2\n *   </table>\n *   <td>cell row=8,col=3\n *   <ul>\n *     <li>Item 1\n *     <li>Item 2\n *   </ul>\n * </table>\n *\n * And this is some more text.\n */\nclass Table_5\n{\n};\n"
  },
  {
    "path": "examples/specific/template_class.cfg",
    "content": "PROJECT_NAME = \"Template Class\"\nOUTPUT_DIRECTORY = template_class\nGENERATE_LATEX = NO\nGENERATE_MAN = NO\nGENERATE_RTF = NO\nCASE_SENSE_NAMES = NO\nINPUT = template_class.h\nQUIET = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/template_class.h",
    "content": "/**\n * @brief a class with a template parameter\n * \n * @tparam T this is the template parameter\n */\ntemplate <typename T>\nclass templateclass\n{\npublic:\n\n  /// default constructor\n  templateclass() {}\n  \n  /**\n   * @brief constructor with template argument\n   *\n   * @param m the argument\n   */\n  templateclass(T const & m) : member(m) {}\n  \n  /**\n   * @brief member accepting template argument and returning template argument\n   * \n   * @param t argument of type T\n   * @return returns value of type T\n   */\n  T method(T const & t);\n\nprivate:\n    /// a member with templated type\n    T member;\n};\n"
  },
  {
    "path": "examples/specific/template_class_non_type.cfg",
    "content": "PROJECT_NAME = \"Template Class Non Type\"\nOUTPUT_DIRECTORY = template_class_non_type\nGENERATE_LATEX = NO\nGENERATE_MAN = NO\nGENERATE_RTF = NO\nCASE_SENSE_NAMES = NO\nINPUT = template_class_non_type.h\nQUIET = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/template_class_non_type.h",
    "content": "/**\n * @brief a class with three template parameters\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n */\ntemplate <typename T, typename U, int N>\nclass anothertemplateclass\n{\npublic:\n  /// default constructor\n  anothertemplateclass() {}\n  \n  /**\n   * @brief constructor with two template argument\n   *\n   * @param m1 first argument\n   * @param m2 second argument\n   */\n  anothertemplateclass(T const & m1, U const & m2) : \n    member1(m1), member2(m2) {}\n    \n  /**\n   * @brief member accepting template argument and returning template argument\n   * \n   * @param t argument\n   * @return returns value of type U\n   */\n  U method(T const & t);\n\n  private:\n    /// a member with templated type\n    T member1;\n    \n    /// another member with templated type\n    U member2;\n};\n"
  },
  {
    "path": "examples/specific/template_function.cfg",
    "content": "PROJECT_NAME = \"Template Function\"\nOUTPUT_DIRECTORY = template_function\nGENERATE_LATEX = NO\nGENERATE_MAN = NO\nGENERATE_RTF = NO\nCASE_SENSE_NAMES = NO\nINPUT = template_function.h\nQUIET = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/template_function.h",
    "content": "#include <string>\n\n/**\n * @brief a function with one template arguments\n * \n * @tparam T this is the template parameter\n * \n * @param arg1 argument of type T\n * \n * @return return value of type T\n */\ntemplate <typename T>\nT function1(T arg1)\n{}\n\n\n/**\n * @brief a function with one template argument specialized for `std::string`\n *\n * @param arg1 argument of type `std::string`\n *\n * @return return value of type `std::string`\n */\ntemplate <>\nstd::string function1<std::string>(std::string arg1)\n{}\n\n\n/**\n * @brief a function with three template arguments\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n * \n * @param arg1 first argument of type T\n * @param arg2 second argument of type U\n * \n * @return return value of type T\n */\ntemplate <typename T, typename U, int N>\nT function2(T arg1, U arg2)\n{}\n"
  },
  {
    "path": "examples/specific/template_specialisation.cfg",
    "content": "PROJECT_NAME     = \"Template Specialisation\"\nOUTPUT_DIRECTORY = template_specialisation\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = template_specialisation.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/template_specialisation.h",
    "content": "\n/*!\nA generic template class.\n*/\ntemplate<typename T>\nclass TemplateClass\n{\n};\n\n/*! \nA partial specialization of TemplateClass for pointer types.\n*/\ntemplate<typename T>\nclass TemplateClass<T*>\n{\n};\n\n/*!\nA generic template class.\n*/\ntemplate<typename T>\nclass SecondTemplateClass\n{\n};\n\n/*!\nA partial specialization of SecondTemplateClass for pointer types.\n*/\ntemplate<typename T>\nclass SecondTemplateClass<T*>\n{\n};\n"
  },
  {
    "path": "examples/specific/template_type_alias.cfg",
    "content": "PROJECT_NAME = \"Template Type Alias\"\nOUTPUT_DIRECTORY = template_type_alias\nGENERATE_LATEX = NO\nGENERATE_MAN = NO\nGENERATE_RTF = NO\nCASE_SENSE_NAMES = NO\nINPUT = template_type_alias.h\nQUIET = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/template_type_alias.h",
    "content": "/**\n * @brief a type alias with one template argument\n * \n * @tparam T this is the template parameter\n * \n */\ntemplate <typename T>\nusing IsFuzzy = std::is_fuzzy<T>;\n\n\n/**\n * @brief a type alias with three template arguments\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n * \n */\ntemplate <typename T, typename U, int N>\nusing IsFurry = std::is_furry<T,U,N>;\n"
  },
  {
    "path": "examples/specific/typedef.cfg",
    "content": "PROJECT_NAME     = \"Function Type Def Command\"\nOUTPUT_DIRECTORY = typedef\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = typedef.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/typedef.h",
    "content": "\nclass TypeDefTest {\n};\n\n/* A dummy typedef */\ntypedef TypeDefTest (*TypeDefTestFuncPtr)(void);\n\ntypedef void* (*voidFuncPtr)(float, int);\n\ntypedef void* voidPointer;\n\ntypedef float* floatPointer;\n\ntypedef float floatingPointNumber;\n\ntypedef int TestTypedef;\n\nnamespace TypeDefNamespace {\n  typedef char *AnotherTypedef;\n}\n\nclass TestClass {\n public:\n  /** A typedef defined in a class. */\n  typedef void *MemberTypedef;\n\n  typedef void (*MemberTypedefFuncPointer)(int, double);\n};\n\nusing TypeAlias = int;\n"
  },
  {
    "path": "examples/specific/union.cfg",
    "content": "PROJECT_NAME     = \"Union\"\nOUTPUT_DIRECTORY = union\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = union.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/union.h",
    "content": "\n\n/// A union of two values\nunion SeparateUnion\n{\n    int size;     ///< The size of the thing\n    float depth;  ///< How deep it is\n};\n\n\nnamespace foo {\n\n/// A union of two values\nunion MyUnion\n{\n    int someInt;      ///< The int of it all\n    float someFloat;  ///< The float side of things\n};\n\n}\n\n/// A class with a union\nclass ClassWithUnion\n{\n    /// A union with two values\n    union UnionInClass\n    {\n        int intvalue;       ///< An int value\n        float floatvalue;   ///< A float value\n    };\n\n    /// Documented class\n    class ExtraClass\n    {\n        int a_member;\n        float another_member;\n    };\n};\n"
  },
  {
    "path": "examples/specific/userdefined.cfg",
    "content": "PROJECT_NAME     = \"User Defined Example\"\nOUTPUT_DIRECTORY = userdefined\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = userdefined.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nDISTRIBUTE_GROUP_DOC = YES\n\nWARN_IF_UNDOCUMENTED = NO\n"
  },
  {
    "path": "examples/specific/userdefined.h",
    "content": "// Example from Doxygen documentation\n\n/** A class. More details about the UserDefinedGroupTest class */\nclass UserDefinedGroupTest\n{\n  public:\n    //@{\n    /** Same documentation for both members. Details */\n    void func1InGroup1();\n    void func2InGroup1();\n    //@}\n\n    /** Function without group. Details. */\n    void ungroupedFunction();\n    void func1InCustomGroup();\n  protected:\n    void func2InCustomGroup();\n};\n\nvoid UserDefinedGroupTest::func1InGroup1() {}\nvoid UserDefinedGroupTest::func2InGroup1() {}\n\n/** @name Custom Group\n *  Description of custom group\n */\n//@{\n/** Function 2 in custom group. Details. */\nvoid UserDefinedGroupTest::func2InCustomGroup() {}\n/** Function 1 in custom group. Details. */\nvoid UserDefinedGroupTest::func1InCustomGroup() {}\n//@}\n"
  },
  {
    "path": "examples/specific/using_in_ns.cfg",
    "content": "PROJECT_NAME     = \"UsingInNS\"\nOUTPUT_DIRECTORY = using_in_ns\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = using_in_ns.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\n"
  },
  {
    "path": "examples/specific/using_in_ns.h",
    "content": "//\n// When declaring a type using a \"using\" directive inside a namespace,\n// Doxygen adds a spurious \"typedef\" in the corresponding XML definition\n//\n// $ doxygen --version\n// 1.8.11\n//\n\nnamespace foo {\nusing foo_int = int; // <definition>using foo::foo_int = typedef int</definition>\n}\n\nusing global_int = int; // <definition>using global_int =  int</definition>\n"
  },
  {
    "path": "examples/specific/xrefsect.cfg",
    "content": "PROJECT_NAME     = \"Doxygen xrefsect\"\nOUTPUT_DIRECTORY = xrefsect\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nINPUT            = xrefsect.h\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nALIASES = \"xrefsample=\\xrefitem xrefsample \\\"xref Sample\\\" \\\"xref Sample\\\" \"\n"
  },
  {
    "path": "examples/specific/xrefsect.h",
    "content": "/**\n *  @file xrefsect.h\n *  A few examples of xrefsect items support.\n */\n\n/**\n * An example of using Doxygen's todo command.\n *\n * @todo Implement this function.\n */\nint unimplemented(void);\n\n/**\n * An example of using Doxygen's bug and test commands.\n *\n * @bug Does not work yet.\n *\n * @test Add proper unit testing first.\n */\nvoid buggy_function(int param);\n\n/**\n * An example of using Doxygen's deprecated command.\n *\n * @deprecated Should not be used on new code.\n */\nvoid old_function(void);\n\n/**\n * An example of a custom Doxygen xrefitem declared as an ALIAS.\n *\n * @xrefsample This text shows up in the xref output.\n */\nvoid sample_xrefitem_function(void);\n"
  },
  {
    "path": "make.bat",
    "content": "@ECHO OFF\n\nset GENERATED_MOD=\"breathe\\_parser.py\"\n\nif \"%1\" == \"html\"               goto html\nif \"%1\" == \"pdf\"                goto pdf\nif \"%1\" == \"data\"               goto data\nif \"%1\" == \"clean\"              goto clean\nif \"%1\" == \"distclean\"          goto distclean\nif \"%1\" == \"test\"               goto test\nif \"%1\" == \"dev-test\"           goto dev-test\nif \"%1\" == \"ruff\"               goto ruff\nif \"%1\" == \"type-check\"         goto type-check\nif \"%1\" == \"version-check\"      goto version-check\nif \"%1\" == \"%GENERATED_MOD%\"    goto _parser\nif \"%1\" == \"all\"                goto all\ngoto end\n\n:html\n    call :data\n    cd documentation\n    call make.bat html\n    cd ..\n    goto end\n\n:pdf\n    call :data\n    cd documentation\n    call make.bat latexpdf\n    cd ..\n    goto end\n\n:data\n    cd examples\\doxygen\n    call make.bat all\n    cd ..\\..\n    cd examples\\tinyxml\n    call make.bat all\n    cd ..\\..\n    cd examples\\specific\n    call make.bat all\n    cd ..\\..\n    goto end\n\n:clean\n    cd examples\\doxygen\n    call make.bat clean\n    cd ..\\..\n    cd examples\\tinyxml\n    call make.bat clean\n    cd ..\\..\n    cd examples\\specific\n    call make.bat clean\n    cd ..\\..\n    if exist \"%GENERATED_MOD%\" (\n        echo Removing file: %GENERATED_MOD%\n        del \"%DIR%\"\n    )\n    goto end\n\n:distclean\n    call :clean\n    cd documentation\n    call make.bat clean\n    cd ..\n    goto end\n\n:test\n    cd tests\n    python -m pytest -v\n    cd ..\n    goto end\n\n:dev-test\n    call :_parser\n    cd tests\n    set PYTHONPATH=..\\;%PYTHONPATH%\n    python -m pytest -v\n    cd ..\n    goto end\n\n:ruff\n    ruff check\n    ruff format\n    goto end\n\n:type-check\n    mypy --warn-redundant-casts --warn-unused-ignores breathe tests\n    goto end\n\n:version-check\n    call :_parser\n    set PYTHONPATH=..\\;%PYTHONPATH%\n    python scripts\\version-check.py\n    goto end\n\n:_parser\n    echo Generating %GENERATED_MOD% from xml_parser_generator\\schema.json\n    python xml_parser_generator\\setuptools_builder.py\n    goto end\n\n:all\n    call :html\n    call :pdf\n    goto end\n\n:end\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"flit_core>=3.7\"]\nbuild-backend = \"flit_core.buildapi\"\n\n# project metadata\n[project]\nname = \"breathe\"\ndescription = \"Sphinx Doxygen renderer\"\nreadme = \"README.rst\"\nlicense.text = \"BSD-3-Clause\"\nrequires-python = \">=3.9\"\n\n# Classifiers list: https://pypi.org/classifiers/\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Environment :: Console\",\n    \"Environment :: Web Environment\",\n    \"Framework :: Sphinx\",\n    \"Framework :: Sphinx :: Extension\",\n    \"Intended Audience :: Developers\",\n    \"Intended Audience :: Education\",\n    \"License :: OSI Approved :: BSD License\",\n    \"Operating System :: OS Independent\",\n    \"Programming Language :: Python\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3 :: Only\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Topic :: Documentation\",\n    \"Topic :: Documentation :: Sphinx\",\n    \"Topic :: Software Development\",\n    \"Topic :: Software Development :: Documentation\",\n    \"Topic :: Text Processing\",\n    \"Topic :: Utilities\",\n]\ndependencies = [\n    \"Sphinx>=7.2\",\n]\ndynamic = [\"version\"]\n\n[project.optional-dependencies]\nbuild = [\n    \"setuptools>=80.9.0\"\n]\ndocs = [\n    \"furo\",\n    \"sphinx-copybutton\",\n    \"sphinxcontrib-spelling\",\n]\nlint = [\n    \"ruff==0.9.2\",\n    \"mypy>=1\",\n    \"types-docutils\",\n    \"types-Pygments\",\n    \"pytest>=8.0\",  # for mypy\n    \"sphinxcontrib-phpdomain\",  # for mypy\n    # The API that we depend on is only implemented in rogerbarton's fork of sphinx-csharp\n    # and not in the one that is published to PyPI. But we can't publish Breathe to PyPI with\n    # a listed git dependency so we comment it out for the moment\n    # \"sphinx-csharp @ git+https://github.com/rogerbarton/sphinx-csharp.git\",  # for mypy\n]\ntest = [\n    \"pytest>=8.0\",\n    \"Sphinx[test]\"\n]\n\n[project.urls]\nChangelog = \"https://github.com/breathe-doc/breathe/blob/main/CHANGELOG.rst\"\nCode = \"https://github.com/breathe-doc/breathe/\"\nDownload = \"https://pypi.org/project/breathe/\"\nDocumentation = \"https://breathe.readthedocs.io/\"\nHomepage = \"https://www.breathe-doc.org/\"\n\"Issue tracker\" = \"https://github.com/breathe-doc/breathe/issues\"\n\n[[project.authors]]\nname = \"Michael Jones\"\nemail = \"m.pricejones@gmail.com\"\n\n[project.scripts]\nbreathe-apidoc = \"breathe.apidoc:main\"\n\n[tool.flit.module]\nname = \"breathe\"\n\n[tool.flit.sdist]\ninclude = [\n    \"LICENSE\",\n    \"CHANGELOG.rst\",\n    \"CONTRIBUTING.rst\",\n    \"CONTRIBUTORS.rst\",\n    # Documentation\n    \"documentation/\",\n    # Tests\n    \"tests/\",\n    # Utilities\n    \"Makefile\",\n    \"mkrelease\",\n]\nexclude = [\n    \"documentation/build\",\n]\n\n[tool.mypy]\nfiles = [\n    \"breathe\",\n    \"examples\",\n    \"tests\",\n]\nshow_column_numbers = true\nshow_error_context = true\npython_version = \"3.9\"\nwarn_unused_configs = true\nwarn_redundant_casts = true\nwarn_unused_ignores = true\n\n# TODO: Remove if possible\n[[tool.mypy.overrides]]\nmodule = [\n    \"breathe.parser.compound\",\n    \"breathe.parser.compoundsuper\",\n    \"breathe.parser.index\",\n    \"breathe.parser.indexsuper\",\n]\nignore_errors = true\n"
  },
  {
    "path": "scripts/doxygen_cache.py",
    "content": "\"\"\"Run Doxygen on all test samples and save the results.\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport pathlib\nimport shutil\nimport subprocess\n\nfrom breathe.process import AUTOCFG_TEMPLATE\n\nPROJECT_DIR = pathlib.Path(__file__).parent.parent\nDATA_DIR = PROJECT_DIR / \"tests\" / \"data\"\nEXAMPLES_DIR = DATA_DIR / \"examples\"\nCACHE_DIR = EXAMPLES_DIR / \"_cache\"\n\n\ndef run_one(p, name, template, exec):\n    print(f\"generating output for {name}\")\n    os.chdir(p)\n    out_dir = CACHE_DIR / name\n    out_dir.mkdir(exist_ok=True)\n    doxyfile = out_dir / \"Doxyfile\"\n    doxycontent = template.format(output=out_dir)\n    extra_opts = pathlib.Path(\"extra_dox_opts.txt\")\n    if extra_opts.exists():\n        doxycontent += extra_opts.read_text(encoding=\"utf-8\")\n    doxyfile.write_text(doxycontent, encoding=\"utf-8\")\n\n    subprocess.run([exec, doxyfile], check=True)\n\n\ndef make_cache():\n    template = (EXAMPLES_DIR / \"doxyfile_template\").read_text(encoding=\"utf-8\")\n\n    exec = shutil.which(\"doxygen\")\n    if exec is None:\n        raise ValueError(\"cannot find doxygen executable\")\n\n    CACHE_DIR.mkdir(exist_ok=True)\n    prev_dir = os.getcwd()\n\n    r = subprocess.run(\n        [exec, \"--version\"], check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True\n    )\n    (CACHE_DIR / \"version.txt\").write_text(r.stdout, encoding=\"utf-8\")\n\n    try:\n        for p in EXAMPLES_DIR.glob(\"test_*\"):\n            run_one(p, p.name, template, exec)\n\n        print(\"generating output for auto\")\n        os.chdir(DATA_DIR / \"auto\")\n        out_dir = CACHE_DIR / \"auto\"\n        out_dir.mkdir(exist_ok=True)\n\n        doxyfile = out_dir / \"Doxyfile\"\n        doxyfile.write_text(\n            AUTOCFG_TEMPLATE.format(\n                project_name=\"example\",\n                output_dir=str(out_dir),\n                input='\"auto_class.h\" \"auto_function.h\"',\n                extra=\"\",\n            ),\n            encoding=\"utf-8\",\n        )\n\n        subprocess.run([exec, doxyfile], check=True)\n\n        for c in \"AB\":\n            run_one(DATA_DIR / \"multi_project\" / c, f\"multi_project.{c}\", template, exec)\n    finally:\n        os.chdir(prev_dir)\n\n\nif __name__ == \"__main__\":\n    make_cache()\n"
  },
  {
    "path": "scripts/generate_tests_results.py",
    "content": "\"\"\"For any test that is missing the \"compare.xml\" file, run the test, strip the\noutput of certain attributes and save the results as \"compare_draft.xml\" in the\nfolder where \"compare.xml\" belongs.\n\nThe resulting file will need to be inspected manually to make sure it is\nactually correct. Then it can be saved as \"compare.xml\".\n\nThe output file omits a number of attributes from the docutils XML format that\nare either unimportant for ensuring correctness of Breathe or has a value that\ndepends on an unimportant factor, such as the exact version of Sphinx, or the\ndirectories of input files.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport os.path\nimport pathlib\nimport shutil\nimport subprocess\nimport tempfile\n\nimport docutils.nodes\nimport docutils.writers.docutils_xml\nfrom sphinx.testing.util import SphinxTestApp\n\nTEST_DATA_DIR = pathlib.Path(__file__).parent.parent / \"tests\" / \"data\"\nCSS_PATH = TEST_DATA_DIR / \"docutils.css\"\n\nC_FILE_SUFFIXES = frozenset((\".h\", \".c\", \".hpp\", \".cpp\"))\n\n# if either of these are changed, tests/data/examples/README.rst should be\n# updated\nIGNORED_ELEMENTS = frozenset(())\nIGNORED_ATTRIBUTES = frozenset((\n    \"ids\",\n    \"names\",\n    \"no-contents-entry\",\n    \"no-index\",\n    \"no-index-entry\",\n    \"no-typesetting\",\n    \"nocontentsentry\",\n    \"noindex\",\n    \"noindexentry\",\n    \"is_multiline\",\n    \"multi_line_parameter_list\",\n    \"add_permalink\",\n    \"xml:space\",\n    \"source\",\n    \"translation_progress\",\n    \"options\",\n    \"original_uri\",\n    \"_toc_name\",\n    \"_toc_parts\",\n    \"xmlns:c\",\n    \"xmlns:changeset\",\n    \"xmlns:citation\",\n    \"xmlns:cpp\",\n    \"xmlns:index\",\n    \"xmlns:js\",\n    \"xmlns:math\",\n    \"xmlns:py\",\n    \"xmlns:rst\",\n    \"xmlns:std\",\n))\n\nDEFAULT_CONF = {\n    \"project\": \"test\",\n    \"breathe_default_project\": \"example\",\n    \"breathe_show_include\": False,\n    \"extensions\": [\"breathe\", \"sphinx.ext.graphviz\"],\n}\n\n\ndef attlist(self):\n    return sorted(\n        item for item in self.non_default_attributes().items() if item[0] not in IGNORED_ATTRIBUTES\n    )\n\n\ndocutils.nodes.Element.attlist = attlist\n\n\nclass Translator(docutils.writers.docutils_xml.XMLTranslator):\n    doctype = \"\"\n\n    def __init__(self, document):\n        super().__init__(document)\n        self.ignore = 0\n\n    def default_visit(self, node):\n        if self.ignore or node.tagname in IGNORED_ELEMENTS:\n            self.ignore += 1\n        else:\n            super().default_visit(node)\n\n    def default_departure(self, node):\n        if self.ignore:\n            self.ignore -= 1\n        else:\n            super().default_departure(node)\n\n    def visit_Text(self, node):\n        if not self.ignore:\n            super().visit_Text(node)\n\n    def depart_Text(self, node):\n        if not self.ignore:\n            super().depart_Text(node)\n\n\nclass DirChange:\n    def __init__(self, path):\n        self.path = path\n        self._old_path = os.getcwd()\n\n    def __enter__(self):\n        os.chdir(self.path)\n\n    def __exit__(self, *args):\n        os.chdir(self._old_path)\n\n\nclass TmpDir:\n    \"\"\"A wrapper for tempfile.TemporaryDirectory that returns an instance of\n    pathlib.Path in its __enter__ method\"\"\"\n\n    def __init__(self, *args, **kwds):\n        self.base = tempfile.TemporaryDirectory(*args, **kwds)\n\n    def __enter__(self):\n        return pathlib.Path(self.base.__enter__())\n\n    def __exit__(self, *args):\n        self.base.__exit__(*args)\n\n\ndef get_individual_tests():\n    return (TEST_DATA_DIR / \"examples\").glob(\"test_*\")\n\n\ndef filter_c_files(input_dir):\n    for p in input_dir.iterdir():\n        if p.suffix in C_FILE_SUFFIXES:\n            full = str(p)\n            if '\"' in full:\n                raise ValueError(\"quotations marks not allowed in path names\")\n            yield f'\"{full}\"'\n\n\ndef conf_overrides(extra):\n    conf = DEFAULT_CONF.copy()\n    conf.update(extra)\n    return conf\n\n\nclass Doxygen:\n    def __init__(self):\n        exe = shutil.which(\"doxygen\")\n        if exe is None:\n            raise ValueError(\"cannot find doxygen executable\")\n        self.exe = exe\n\n        self.template = (TEST_DATA_DIR / \"examples\" / \"doxyfile_template\").read_text(\n            encoding=\"utf-8\"\n        )\n\n    def run_one(self, tmp_path, outname):\n        doxyfile = tmp_path / \"Doxyfile\"\n        doxycontent = self.template.format(output=tmp_path)\n        extra_opts = pathlib.Path(\"extra_dox_opts.txt\")\n        if extra_opts.exists():\n            doxycontent += extra_opts.read_text(encoding=\"utf-8\")\n        doxyfile.write_text(doxycontent, encoding=\"utf-8\")\n\n        subprocess.run([self.exe, doxyfile], check=True)\n        if outname != \"xml\":\n            os.rename(tmp_path / \"xml\", tmp_path / outname)\n\n\ndef run_sphinx_and_copy_output(tmp_path, input_path, overrides):\n    dest = tmp_path / \"conf.py\"\n    ec = pathlib.Path(\"extra_conf.py\")\n    if ec.exists():\n        shutil.copyfile(ec, dest)\n    else:\n        dest.touch()\n\n    app = SphinxTestApp(buildername=\"xml\", srcdir=tmp_path, confoverrides=conf_overrides(overrides))\n    app.set_translator(\"xml\", Translator, True)\n    app.build()\n    app.cleanup()\n\n    # shutil.copyfile(tmp_path / '_build' / 'xml' / 'index.xml', input_path / 'compare_draft.xml')\n    # copy index.xml to compare_draft.xml with an extra stylesheet line\n    with (\n        open(tmp_path / \"_build\" / \"xml\" / \"index.xml\", encoding=\"utf-8\") as f_in,\n        open(input_path / \"compare_draft.xml\", \"w\", encoding=\"utf-8\") as f_out,\n    ):\n        itr_in = iter(f_in)\n        line = next(itr_in)\n        assert line\n        assert line.startswith(\"<?xml \")\n        f_out.write(line)\n        # os.path.relpath must be used instead of Path.relative_to because the\n        # latter requires that CSS_PATH is below input_path\n        f_out.write(f'<?xml-stylesheet href=\"{os.path.relpath(CSS_PATH, input_path)}\"?>\\n')\n\n        line = next(itr_in)\n        # the next line is a comment with the docutils version, which we don't\n        # need and is misleading because the output is altered by us\n        if not line.startswith(\"<!--\"):\n            # or if it isn't, keep it\n            f_out.write(line)\n\n        f_out.writelines(itr_in)\n\n\ndef gen_example(dox, test_input):\n    if (test_input / \"compare.xml\").exists():\n        return\n\n    with DirChange(test_input), TmpDir() as tmp_path:\n        dox.run_one(tmp_path, \"xml\")\n        shutil.copyfile(test_input / \"input.rst\", tmp_path / \"index.rst\")\n        run_sphinx_and_copy_output(\n            tmp_path, test_input, {\"breathe_projects\": {\"example\": str(tmp_path / \"xml\")}}\n        )\n\n\ndef gen_auto():\n    test_input = TEST_DATA_DIR / \"auto\"\n    if (test_input / \"compare.xml\").exists():\n        return\n\n    with DirChange(test_input), TmpDir() as tmp_path:\n        shutil.copyfile(test_input / \"input.rst\", tmp_path / \"index.rst\")\n        run_sphinx_and_copy_output(\n            tmp_path,\n            test_input,\n            {\n                \"breathe_projects_source\": {\n                    \"example\": (test_input.absolute(), [\"auto_class.h\", \"auto_function.h\"])\n                }\n            },\n        )\n\n\ndef gen_multi_project(dox):\n    test_input = TEST_DATA_DIR / \"multi_project\"\n\n    if (test_input / \"compare.xml\").exists():\n        return\n\n    with TmpDir() as tmp_path:\n        for c in \"ABC\":\n            with DirChange(test_input / c):\n                dox.run_one(tmp_path, f\"xml{c}\")\n\n        (tmp_path / \"conf.py\").touch()\n        (tmp_path / \"index.rst\").write_text(\n            (test_input / \"input.rst\")\n            .read_text(encoding=\"utf-8\")\n            .format(project_c_path=str(tmp_path / \"xmlC\")),\n            encoding=\"utf-8\",\n        )\n\n        run_sphinx_and_copy_output(\n            tmp_path,\n            test_input,\n            {\"breathe_projects\": {\"A\": str(tmp_path / \"xmlA\"), \"B\": str(tmp_path / \"xmlB\")}},\n        )\n\n\ndef main():\n    dox = Doxygen()\n    for t in get_individual_tests():\n        gen_example(dox, t)\n    gen_auto()\n    gen_multi_project(dox)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "from __future__ import annotations\n\nimport pathlib\n\nimport pytest\n\n# Register sphinx fixtures\n#\n# Disable ruff warnings about unused imports as the import is the registration (I think)\nfrom sphinx.testing.fixtures import (\n    app_params,  # noqa: F401\n    make_app,  # noqa: F401\n    rootdir,  # noqa: F401\n    shared_result,  # noqa: F401\n    sphinx_test_tempdir,  # noqa: F401\n    test_params,  # noqa: F401\n)\n\n\n# Disable ruff warnings about unused arguments as they are there by convention (I assume)\n@pytest.fixture\ndef app(test_params, app_params, make_app, shared_result):  # noqa: F811\n    \"\"\"\n    Based on sphinx.testing.fixtures.app\n    \"\"\"\n    args, kwargs = app_params\n    assert \"srcdir\" in kwargs\n    pathlib.Path(kwargs[\"srcdir\"]).mkdir(parents=True, exist_ok=True)\n    (kwargs[\"srcdir\"] / \"conf.py\").write_text(\"\", encoding=\"utf-8\")\n    app_ = make_app(*args, **kwargs)\n    yield app_\n\n    print(\"# testroot:\", kwargs.get(\"testroot\", \"root\"))\n    print(\"# builder:\", app_.builder.name)\n    print(\"# srcdir:\", app_.srcdir)\n    print(\"# outdir:\", app_.outdir)\n    print(\"# status:\", \"\\n\" + app_._status.getvalue())\n    print(\"# warning:\", \"\\n\" + app_._warning.getvalue())\n\n    if test_params[\"shared_result\"]:\n        shared_result.store(test_params[\"shared_result\"], app_)\n"
  },
  {
    "path": "tests/data/arange.xml",
    "content": "<doxygen lang=\"\" version=\"\">\n<compounddef id=\"\" kind=\"type\" prot=\"public\">\n<compoundname></compoundname>\n<sectiondef kind=\"typedef\">\n<memberdef kind=\"function\" id=\"1\" prot=\"public\" static=\"no\" const=\"yes\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar end, const TensorOptions &amp;options={})</argsstring>\n  <name>arange</name>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type>const TensorOptions &amp;</type>\n    <declname>options</declname>\n    <defval>{}</defval>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n<memberdef kind=\"function\" id=\"2\" prot=\"public\" static=\"no\" const=\"yes\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar end, c10::optional&lt; ScalarType &gt; dtype, c10::optional&lt; Layout &gt; layout, c10::optional&lt; Device &gt; device, c10::optional&lt; bool &gt; pin_memory)</argsstring>\n  <name>arange</name>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; ScalarType &gt;</type>\n    <declname>dtype</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Layout &gt;</type>\n    <declname>layout</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Device &gt;</type>\n    <declname>device</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; bool &gt;</type>\n    <declname>pin_memory</declname>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n<memberdef kind=\"function\" id=\"3\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar start, Scalar end, const TensorOptions &amp;options={})</argsstring>\n  <name>arange</name>\n  <param>\n    <type>Scalar</type>\n    <declname>start</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type>const TensorOptions &amp;</type>\n    <declname>options</declname>\n    <defval>{}</defval>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n<memberdef kind=\"function\" id=\"4\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar start, Scalar end, c10::optional&lt; ScalarType &gt; dtype, c10::optional&lt; Layout &gt; layout, c10::optional&lt; Device &gt; device, c10::optional&lt; bool &gt; pin_memory)</argsstring>\n  <name>arange</name>\n  <param>\n    <type>Scalar</type>\n    <declname>start</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; ScalarType &gt;</type>\n    <declname>dtype</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Layout &gt;</type>\n    <declname>layout</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Device &gt;</type>\n    <declname>device</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; bool &gt;</type>\n    <declname>pin_memory</declname>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n<memberdef kind=\"function\" id=\"5\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar start, Scalar end, Scalar step, const TensorOptions &amp;options={})</argsstring>\n  <name>range</name>\n  <param>\n    <type>Scalar</type>\n    <declname>start</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>step</declname>\n  </param>\n  <param>\n    <type>const TensorOptions &amp;</type>\n    <declname>options</declname>\n    <defval>{}</defval>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n<memberdef kind=\"function\" id=\"6\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type><ref refid=\"classat_1_1_tensor\" kindref=\"compound\">Tensor</ref></type>\n  <definition>Tensor at::arange</definition>\n  <argsstring>(Scalar start, Scalar end, Scalar step, c10::optional&lt; ScalarType &gt; dtype, c10::optional&lt; Layout &gt; layout, c10::optional&lt; Device &gt; device, c10::optional&lt; bool &gt; pin_memory)</argsstring>\n  <name>range</name>\n  <param>\n    <type>Scalar</type>\n    <declname>start</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>end</declname>\n  </param>\n  <param>\n    <type>Scalar</type>\n    <declname>step</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; ScalarType &gt;</type>\n    <declname>dtype</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Layout &gt;</type>\n    <declname>layout</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; Device &gt;</type>\n    <declname>device</declname>\n  </param>\n  <param>\n    <type><ref refid=\"classc10_1_1optional\" kindref=\"compound\">c10::optional</ref>&lt; bool &gt;</type>\n    <declname>pin_memory</declname>\n  </param>\n  <location file=\"\" line=\"0\"/>\n</memberdef>\n</sectiondef>\n</compounddef>\n</doxygen>\n"
  },
  {
    "path": "tests/data/auto/auto_class.h",
    "content": "\n//! \\brief class outside of namespace\nclass AutoClassTest {\n\n    //! \\brief non-namespaced class function\n    void member() {};\n\n    //! \\brief non-namespaced class other function\n    void anotherMember() {};\n};\n\n\n"
  },
  {
    "path": "tests/data/auto/auto_function.h",
    "content": "\n//! \\brief non-namespaced class function\nvoid autoFunction() {};\n\n//! \\brief non-namespaced class other function\nvoid anotherAutoFunction() {};\n"
  },
  {
    "path": "tests/data/auto/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Generated by Docutils 0.20.1 -->\n<document>\n    <index entries=\"['single',\\ 'AutoClassTest\\ (C++\\ class)',\\ '_CPPv413AutoClassTest',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">AutoClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>class outside of namespace </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"private-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Private Functions</rubric>\n                <index entries=\"['single',\\ 'AutoClassTest::member\\ (C++\\ function)',\\ '_CPPv4N13AutoClassTest6memberEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">member</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>non-namespaced class function </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'AutoClassTest::anotherMember\\ (C++\\ function)',\\ '_CPPv4N13AutoClassTest13anotherMemberEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anotherMember</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>non-namespaced class other function </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'autoFunction\\ (C++\\ function)',\\ '_CPPv412autoFunctionv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">autoFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>non-namespaced class function </paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'anotherAutoFunction\\ (C++\\ function)',\\ '_CPPv419anotherAutoFunctionv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anotherAutoFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>non-namespaced class other function </paragraph>\n            </desc_content>\n        </desc>\n    </container>\n</document>\n"
  },
  {
    "path": "tests/data/auto/input.rst",
    "content": ".. autodoxygenfile:: auto_class.h\n.. autodoxygenfile:: auto_function.h\n"
  },
  {
    "path": "tests/data/classSample.xml",
    "content": "<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n<!-- don't remove the spaces from briefdescription/detaileddescription, they are\npart of the test -->\n<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"compound.xsd\" version=\"1.9.8\" xml:lang=\"en-US\">\n  <compounddef id=\"classSample\" kind=\"class\" language=\"C++\" prot=\"public\">\n    <compoundname>Sample</compoundname>\n    <includes local=\"no\">sample.hpp</includes>\n    <sectiondef kind=\"public-attrib\">\n      <memberdef kind=\"variable\" id=\"classSample_1a16fb7dea2229144983e3a0ee85c42638\" prot=\"public\" static=\"no\" mutable=\"no\">\n        <type>int</type>\n        <definition>int public_field</definition>\n        <argsstring></argsstring>\n        <name>public_field</name>\n        <qualifiedname>Sample::public_field</qualifiedname>\n        <briefdescription><para>Something</para></briefdescription>\n        <detaileddescription> </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"3\" column=\"9\" bodyfile=\"sample.hpp\" bodystart=\"3\" bodyend=\"-1\"/>\n      </memberdef>\n    </sectiondef>\n    <sectiondef kind=\"protected-attrib\">\n      <memberdef kind=\"variable\" id=\"classSample_1aa74f9bf144eba684220918da47d9dd3c\" prot=\"protected\" static=\"no\" mutable=\"no\">\n        <type>int</type>\n        <definition>int protected_field</definition>\n        <argsstring></argsstring>\n        <name>protected_field</name>\n        <qualifiedname>Sample::protected_field</qualifiedname>\n        <briefdescription>   </briefdescription>\n        <detaileddescription> </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"6\" column=\"9\" bodyfile=\"sample.hpp\" bodystart=\"6\" bodyend=\"-1\"/>\n      </memberdef>\n    </sectiondef>\n    <sectiondef kind=\"private-attrib\">\n      <memberdef kind=\"variable\" id=\"classSample_1aac1a8bab0d52a9682f04aeabf9d6c9a3\" prot=\"private\" static=\"no\" mutable=\"no\">\n        <type>int</type>\n        <definition>int private_field</definition>\n        <argsstring></argsstring>\n        <name>private_field</name>\n        <qualifiedname>Sample::private_field</qualifiedname>\n        <briefdescription><para>Something</para></briefdescription>\n        <detaileddescription>\n        </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"9\" column=\"9\" bodyfile=\"sample.hpp\" bodystart=\"9\" bodyend=\"-1\"/>\n      </memberdef>\n    </sectiondef>\n    <sectiondef kind=\"public-func\">\n      <memberdef kind=\"function\" id=\"classSample_1a2b45c317c9f08980edcaa2e9fe2fd6fa\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n        <type>int</type>\n        <definition>int public_method</definition>\n        <argsstring>(int x)</argsstring>\n        <name>public_method</name>\n        <qualifiedname>Sample::public_method</qualifiedname>\n        <param>\n          <type>int</type>\n          <declname>x</declname>\n        </param>\n        <briefdescription> </briefdescription>\n        <detaileddescription> </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"4\" column=\"9\"/>\n      </memberdef>\n    </sectiondef>\n    <sectiondef kind=\"protected-func\">\n      <memberdef kind=\"function\" id=\"classSample_1a616a74c248e6b1ae328239b0a1096412\" prot=\"protected\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n        <type>int</type>\n        <definition>int protected_method</definition>\n        <argsstring>(int x)</argsstring>\n        <name>protected_method</name>\n        <qualifiedname>Sample::protected_method</qualifiedname>\n        <param>\n          <type>int</type>\n          <declname>x</declname>\n        </param>\n        <briefdescription><para>Something</para></briefdescription>\n        <detaileddescription> </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"7\" column=\"9\"/>\n      </memberdef>\n    </sectiondef>\n    <sectiondef kind=\"private-func\">\n      <memberdef kind=\"function\" id=\"classSample_1a91d3ebf8bf238bea8c7cef360f4956f3\" prot=\"private\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n        <type>int</type>\n        <definition>int private_method</definition>\n        <argsstring>(int x)</argsstring>\n        <name>private_method</name>\n        <qualifiedname>Sample::private_method</qualifiedname>\n        <param>\n          <type>int</type>\n          <declname>x</declname>\n        </param>\n        <briefdescription>\n  \n        </briefdescription>\n        <detaileddescription> </detaileddescription>\n        <inbodydescription></inbodydescription>\n        <location file=\"sample.hpp\" line=\"10\" column=\"9\"/>\n      </memberdef>\n    </sectiondef>\n    <briefdescription>\n    </briefdescription>\n    <detaileddescription>\n    </detaileddescription>\n    <location file=\"sample.hpp\" line=\"1\" column=\"1\" bodyfile=\"sample.hpp\" bodystart=\"1\" bodyend=\"11\"/>\n    <listofallmembers>\n      <member refid=\"classSample_1aac1a8bab0d52a9682f04aeabf9d6c9a3\" prot=\"private\" virt=\"non-virtual\"><scope>Sample</scope><name>private_field</name></member>\n      <member refid=\"classSample_1a91d3ebf8bf238bea8c7cef360f4956f3\" prot=\"private\" virt=\"non-virtual\"><scope>Sample</scope><name>private_method</name></member>\n      <member refid=\"classSample_1aa74f9bf144eba684220918da47d9dd3c\" prot=\"protected\" virt=\"non-virtual\"><scope>Sample</scope><name>protected_field</name></member>\n      <member refid=\"classSample_1a616a74c248e6b1ae328239b0a1096412\" prot=\"protected\" virt=\"non-virtual\"><scope>Sample</scope><name>protected_method</name></member>\n      <member refid=\"classSample_1a16fb7dea2229144983e3a0ee85c42638\" prot=\"public\" virt=\"non-virtual\"><scope>Sample</scope><name>public_field</name></member>\n      <member refid=\"classSample_1a2b45c317c9f08980edcaa2e9fe2fd6fa\" prot=\"public\" virt=\"non-virtual\"><scope>Sample</scope><name>public_method</name></member>\n    </listofallmembers>\n  </compounddef>\n</doxygen>\n"
  },
  {
    "path": "tests/data/docutils.css",
    "content": "/* A style sheet for the \"compare.xml\" files in the example tests.\n\nThis lets the files be viewed in a browser and makes them much easier to\ninspect manually. */\n\ndocument { display: block; }\ndesc {\n    display: block;\n    margin-bottom: 1em;\n}\ndesc_content {\n    display: block;\n    margin-left: 2em;\n}\ndesc_signature_line { display: block; }\ndesc_sig_keyword { color: rgb(9, 9, 167); }\ndesc_sig_keyword_type { color: rgb(57, 93, 160); }\ndesc_name { color: darkcyan; }\nparagraph {\n    display: block;\n    margin: 1em 0;\n}\nemphasis { font-style: italic; }\nstrong { font-weight: bold; }\ncomment { color: darkgreen; }\nindex::before {\n    display: block;\n    content: attr(entries);\n    color: gray;\n    font-style: italic;\n}\ndesc_parameterlist::before { content: \"(\"; }\ndesc_parameterlist::after { content: \")\"; }\ndesc_parameter + desc_parameter::before { content: \", \"; }\n\ntable tgroup { display: table; }\ntable thead { display: table-header-group; }\ntable tbody { display: table-row-group; }\ntable row { display: table-row; }\ntable entry {\n    display: table-cell;\n    padding: 0 0.3em;\n}\ncolspec { display: none; }\n\nsection { display: block; }\nsection title { font-size: 1.5em; display: block; font-weight: bold; }\nsection section title { font-size: 1.17em; }\nsection section section title { font-size: 1em; }\n\n"
  },
  {
    "path": "tests/data/ellipsis.xml",
    "content": "<doxygen lang=\"\" version=\"\">\n<compounddef id=\"\" kind=\"type\" prot=\"public\">\n<compoundname></compoundname>\n<sectiondef kind=\"typedef\">\n<memberdef kind=\"function\" id=\"0\" prot=\"public\" static=\"no\" const=\"no\" explicit=\"no\" inline=\"no\" virt=\"non-virtual\">\n  <type>double</type>\n  <definition>double amici::spline_pos</definition>\n  <argsstring>(double t, int num,...)</argsstring>\n  <name>spline_pos</name>\n  <param>\n    <type>double</type>\n    <declname>t</declname>\n  </param>\n  <param>\n    <type>int</type>\n    <declname>num</declname>\n  </param>\n  <param>\n    <type>...</type>\n  </param>\n  <location file=\"\" line=\"0\"></location>\n</memberdef>\n</sectiondef>\n</compounddef>\n</doxygen>\n"
  },
  {
    "path": "tests/data/examples/README.rst",
    "content": "tests/data/examples\n============================\n\nEach direct child folder of \"tests/data/examples\", that starts with \"test\\_\",\ncontains a test. The tests are read and run by \"tests/test_examples.py\" when\nrun by pytest.\n\nEach test works by first creating an input file for Doxygen based on the\ntemplate \"tests/data/examples/doxyfile_template\", in a temporary folder. If a\nfile named \"extra_dox_opts.txt\" exists in the test folder, its contents are\nappended to the input file. Doxygen is run with the current directory set to the\ntest folder, thus any source code files are automatically read by Doxygen. The\noutput is stored in the temporary folder. Sphinx is run on \"input.rst\" with the\nfollowing options:\n\n.. code-block:: python\n\n    project = \"test\"\n    breathe_default_project = \"example\"\n    breathe_show_include = False\n    extensions = [\"breathe\", \"sphinx.ext.graphviz\"]\n    breathe_projects = {\"example\": SOME_TEMPORARY_FOLDER}\n\nplus any options specified by \"extra_conf.py\", if such a file exists in the test\nfolder. The output format is set to XML. The test folder contains \"compare.xml\"\nand may contain one or more \"compare-{version}.xml\" files, where ``{version}``\nis a dotted version number. The version number is compared to the version of\nDoxygen being used. The file with the greatest version number that is not\ngreater than the version of Doxygen, is used, or \"compare.xml\" is used if no\nsuch file exists. The output of Sphinx and the \"compare\" file are compared as a\nseries of start tags, end tags and text nodes. Other kinds of content are\nignored. The contents of the files must match, except the output can have\nattributes that do not appear in the \"compare\" file, as long as every attribute\nthat is in the \"compare\" file is also in the output (the order of the attributes\ndoes not matter); and the text nodes have all leading and trailing whitespace\nstripped before being compared.\n\nCertain attributes in Sphinx's XML output are either irrelevant or are dependant\non unimportant factors, such as the location of the input file or the version of\ndocutils. Thus, the \"compare\" files are always stripped of the following\nattributes:\n\n- ``ids``\n- ``names``\n- ``no-contents-entry``\n- ``no-index``\n- ``no-index-entry``\n- ``no-typesetting``\n- ``nocontentsentry``\n- ``noindex``\n- ``noindexentry``\n- ``is_multiline``\n- ``multi_line_parameter_list``\n- ``add_permalink``\n- ``xml:space``\n- ``source``\n- ``translation_progress``\n- ``options``\n- ``original_uri``\n- ``_toc_name``\n- ``_toc_parts``\n- ``xmlns:c``\n- ``xmlns:changeset``\n- ``xmlns:citation``\n- ``xmlns:cpp``\n- ``xmlns:index``\n- ``xmlns:js``\n- ``xmlns:math``\n- ``xmlns:py``\n- ``xmlns:rst``\n- ``xmlns:std``\n\nWriting the \"compare\" files by hand is tedious and error-prone. It is far easier\nto simply run Sphinx, check that it is correct (if it's not, fix the problem and\nrun it again) and take out the unneeded attributes. To this end: the script\n\"scripts/generate_test_results.py\" exists. When run, for each test, it checks if\n\"compare.xml\" exists. If it doesn't, it creates \"compare_draft.xml\", by running\nSphinx, taking the XML output and stripping the unneeded attributes.\n\nChecking that the generated \"compare_draft.xml\" is correct is also tedious, thus\nit includes a link to a style sheet (\"tests/data/docutils.css\"). This allows the\nfile to be opened in a browser (I have only tested Firefox and Chrome) and is\nmade much more readable."
  },
  {
    "path": "tests/data/examples/doxyfile_template",
    "content": "PROJECT_NAME     = \"example\"\nHAVE_DOT         = YES\nDOTFILE_DIRS     = \".\"\nGENERATE_LATEX   = NO\nGENERATE_MAN     = NO\nGENERATE_RTF     = NO\nCASE_SENSE_NAMES = NO\nOUTPUT_DIRECTORY = \"{output}\"\nIMAGE_PATH       = \".\"\nQUIET            = YES\nJAVADOC_AUTOBRIEF = YES\nGENERATE_HTML = NO\nGENERATE_XML = YES\nWARN_IF_UNDOCUMENTED = NO\nALIASES = \"rst=\\verbatim embed:rst\"\nALIASES += \"endrst=\\endverbatim\"\nALIASES += \"inlinerst=\\verbatim embed:rst:inline\"\n"
  },
  {
    "path": "tests/data/examples/test_alias/alias.h",
    "content": "\n/*! @file alias.h */\n\n/**\n * Foo frob routine.\n * \\par bob this something else\n * @sideeffect Frobs any foos.\n *\n * \\par bob this something else\n *\n * @sideeffect Frobs any foos.\n *\n * @param[out] Frobs any foos.\n */\nvoid frob_foos(void* Frobs);\n"
  },
  {
    "path": "tests/data/examples/test_alias/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'frob_foos\\ (C++\\ function)',\\ '_CPPv49frob_foosPv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">frob_foos</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">Frobs</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>Foo frob routine. </paragraph>\n                <paragraph><definition_list><definition_list_item><term><strong>bob this something else</strong></term><definition><paragraph></paragraph></definition></definition_list_item><definition_list_item><term><strong>Side Effects</strong></term><definition><paragraph>Frobs any foos.</paragraph></definition></definition_list_item><definition_list_item><term><strong>bob this something else</strong></term><definition><paragraph></paragraph></definition></definition_list_item><definition_list_item><term><strong>Side Effects</strong></term><definition><paragraph>Frobs any foos.</paragraph></definition></definition_list_item></definition_list></paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Parameters</field_name>\n                        <field_body>\n                            <paragraph><literal_strong>Frobs</literal_strong> – <strong>[out]</strong> any foos. </paragraph>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n    </container>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_alias/extra_dox_opts.txt",
    "content": "ALIASES = \"sideeffect=\\par Side Effects^^\"\n"
  },
  {
    "path": "tests/data/examples/test_alias/input.rst",
    "content": ".. doxygenfile:: alias.h\n"
  },
  {
    "path": "tests/data/examples/test_array/array.h",
    "content": "\n/** My function */\nint foo(int a[5]);\n\n/** My other function \n * \n * @test This declaration is supposed to be\n * @code{.c}\n * int bar(int n, int a[static n]);\n * @endcode\n * But, Sphinx fails to recognize `int a[static n])` as a C specific array syntax\n */\nint bar(int n, int a[]);\n"
  },
  {
    "path": "tests/data/examples/test_array/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'foo\\ (C++\\ function)',\\ '_CPPv43fooAL5E_i',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">foo</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">a</desc_sig_name><desc_sig_punctuation classes=\"p\">[</desc_sig_punctuation><desc_sig_literal_number classes=\"m\">5</desc_sig_literal_number><desc_sig_punctuation classes=\"p\">]</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>My function. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'bar\\ (C++\\ function)',\\ '_CPPv43bariA_i',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">bar</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">n</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">a</desc_sig_name><desc_sig_punctuation classes=\"p\">[</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">]</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>My other function. </paragraph>\n            <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><emphasis>Test:</emphasis></desc_signature><desc_content><paragraph>This declaration is supposed to be </paragraph></desc_content></desc><literal_block language=\"c\" linenos=\"False\">int bar(int n, int a[static n]);</literal_block> But, Sphinx fails to recognize <literal>int a[static n])</literal> as a C specific array syntax </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_array/input.rst",
    "content": ".. doxygenfunction:: foo\n.. doxygenfunction:: bar\n"
  },
  {
    "path": "tests/data/examples/test_c_enum/c_enum.h",
    "content": "\n// Example of a enum in C which has different syntax and different support in Sphinx to the C++ enum\n\n/**\n * Backup data.\n *\n * \\ingroup Backup\n */\ntypedef enum {\n\t/**\n\t * Compatibility with old gboolean used instead of format.\n\t *\n\t * File type is guessed for extension, non unicode format used\n\t * for Gammu backup.\n\t */\n\tGSM_Backup_Auto = 0,\n\t/**\n\t * Compatibility with old gboolean used instead of format.\n\t *\n\t * File type is guessed for extension, unicode format used\n\t * for Gammu backup.\n\t */\n\tGSM_Backup_AutoUnicode = 1,\n\t/**\n\t * LMB format, compatible with Logo manager, can store\n\t * phonebooks and logos.\n\t */\n\tGSM_Backup_LMB,\n\t/**\n\t * vCalendar standard, can store todo and calendar entries.\n\t */\n\tGSM_Backup_VCalendar,\n\t/**\n\t * vCard standard, can store phone phonebook entries.\n\t */\n\tGSM_Backup_VCard,\n\t/**\n\t * LDIF (LDAP Data Interchange Format), can store phone\n\t * phonebook entries.\n\t */\n\tGSM_Backup_LDIF,\n\t/**\n\t * iCalendar standard, can store todo and calendar entries.\n\t */\n\tGSM_Backup_ICS,\n\t/**\n\t * Gammu own format can store almost anything from phone.\n\t *\n\t * This is ASCII version of the format, Unicode strings are HEX\n\t * encoded. Use GSM_Backup_GammuUCS2 instead if possible.\n\t */\n\tGSM_Backup_Gammu,\n\t/**\n\t * Gammu own format can store almost anything from phone.\n\t *\n\t * This is UCS2-BE version of the format.\n\t */\n\tGSM_Backup_GammuUCS2,\n\t/**\n\t * vNote standard, can store phone notes.\n\t */\n\tGSM_Backup_VNote,\n} GSM_BackupFormat;\n"
  },
  {
    "path": "tests/data/examples/test_c_enum/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'GSM_BackupFormat\\ (C++\\ enum)',\\ '_CPPv416GSM_BackupFormat',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enum\" desctype=\"enum\" domain=\"cpp\" objtype=\"enum\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enum</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_BackupFormat</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Backup data. </paragraph>\n            <paragraph><emphasis>Values:</emphasis></paragraph>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_Auto\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat15GSM_Backup_AutoE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_Auto</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>Compatibility with old gboolean used instead of format. </paragraph>\n                    <paragraph>File type is guessed for extension, non unicode format used for Gammu backup. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_AutoUnicode\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat22GSM_Backup_AutoUnicodeE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_AutoUnicode</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>Compatibility with old gboolean used instead of format. </paragraph>\n                    <paragraph>File type is guessed for extension, unicode format used for Gammu backup. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_LMB\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat14GSM_Backup_LMBE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_LMB</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>LMB format, compatible with Logo manager, can store phonebooks and logos. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_VCalendar\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat20GSM_Backup_VCalendarE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VCalendar</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>vCalendar standard, can store todo and calendar entries. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_VCard\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat16GSM_Backup_VCardE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VCard</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>vCard standard, can store phone phonebook entries. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_LDIF\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat15GSM_Backup_LDIFE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_LDIF</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>LDIF (LDAP Data Interchange Format), can store phone phonebook entries. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_ICS\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat14GSM_Backup_ICSE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_ICS</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>iCalendar standard, can store todo and calendar entries. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_Gammu\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat16GSM_Backup_GammuE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_Gammu</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>Gammu own format can store almost anything from phone. </paragraph>\n                    <paragraph>This is ASCII version of the format, Unicode strings are HEX encoded. Use GSM_Backup_GammuUCS2 instead if possible. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_GammuUCS2\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat20GSM_Backup_GammuUCS2E',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_GammuUCS2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>Gammu own format can store almost anything from phone. </paragraph>\n                    <paragraph>This is UCS2-BE version of the format. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'GSM_BackupFormat::GSM_Backup_VNote\\ (C++\\ enumerator)',\\ '_CPPv4N16GSM_BackupFormat16GSM_Backup_VNoteE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VNote</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>vNote standard, can store phone notes. </paragraph>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_Auto\\ (C++\\ enumerator)',\\ '_CPPv415GSM_Backup_Auto',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_Auto</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Compatibility with old gboolean used instead of format. </paragraph>\n            <paragraph>File type is guessed for extension, non unicode format used for Gammu backup. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_AutoUnicode\\ (C++\\ enumerator)',\\ '_CPPv422GSM_Backup_AutoUnicode',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_AutoUnicode</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Compatibility with old gboolean used instead of format. </paragraph>\n            <paragraph>File type is guessed for extension, unicode format used for Gammu backup. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_LMB\\ (C++\\ enumerator)',\\ '_CPPv414GSM_Backup_LMB',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_LMB</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>LMB format, compatible with Logo manager, can store phonebooks and logos. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_VCalendar\\ (C++\\ enumerator)',\\ '_CPPv420GSM_Backup_VCalendar',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VCalendar</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>vCalendar standard, can store todo and calendar entries. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_VCard\\ (C++\\ enumerator)',\\ '_CPPv416GSM_Backup_VCard',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VCard</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>vCard standard, can store phone phonebook entries. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_LDIF\\ (C++\\ enumerator)',\\ '_CPPv415GSM_Backup_LDIF',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_LDIF</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>LDIF (LDAP Data Interchange Format), can store phone phonebook entries. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_ICS\\ (C++\\ enumerator)',\\ '_CPPv414GSM_Backup_ICS',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_ICS</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>iCalendar standard, can store todo and calendar entries. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_Gammu\\ (C++\\ enumerator)',\\ '_CPPv416GSM_Backup_Gammu',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_Gammu</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Gammu own format can store almost anything from phone. </paragraph>\n            <paragraph>This is ASCII version of the format, Unicode strings are HEX encoded. Use GSM_Backup_GammuUCS2 instead if possible. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_GammuUCS2\\ (C++\\ enumerator)',\\ '_CPPv420GSM_Backup_GammuUCS2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_GammuUCS2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Gammu own format can store almost anything from phone. </paragraph>\n            <paragraph>This is UCS2-BE version of the format. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'GSM_Backup_VNote\\ (C++\\ enumerator)',\\ '_CPPv416GSM_Backup_VNote',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GSM_Backup_VNote</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>vNote standard, can store phone notes. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_c_enum/input.rst",
    "content": ".. doxygenenum:: GSM_BackupFormat\n.. doxygenenumvalue:: GSM_Backup_Auto\n.. doxygenenumvalue:: GSM_Backup_AutoUnicode\n.. doxygenenumvalue:: GSM_Backup_LMB\n.. doxygenenumvalue:: GSM_Backup_VCalendar\n.. doxygenenumvalue:: GSM_Backup_VCard\n.. doxygenenumvalue:: GSM_Backup_LDIF\n.. doxygenenumvalue:: GSM_Backup_ICS\n.. doxygenenumvalue:: GSM_Backup_Gammu\n.. doxygenenumvalue:: GSM_Backup_GammuUCS2\n.. doxygenenumvalue:: GSM_Backup_VNote\n"
  },
  {
    "path": "tests/data/examples/test_c_file/c_file.h",
    "content": "/* Borrowed from git \"cache-tree.h\" as an example of C code */\n\n#ifndef CACHE_TREE_H\n#define CACHE_TREE_H\n\n#include \"tree.h\"\n#include \"tree-walk.h\"\n\nstruct cache_tree;\nstruct cache_tree_sub {\n\tstruct cache_tree *cache_tree;\n\tint namelen;\n\tint used;\n\tchar name[FLEX_ARRAY];\n};\n\nstruct cache_tree {\n\tint entry_count; /* negative means \"invalid\" */\n\tunsigned char sha1[20];\n\tint subtree_nr;\n\tint subtree_alloc;\n\tstruct cache_tree_sub **down;\n};\n\n/** Shared cache tree instance. */\nextern struct cache_tree global_cache_tree;\n\nstruct cache_tree *cache_tree(void);\nextern void cache_tree_free(struct cache_tree **);\nvoid cache_tree_invalidate_path(struct cache_tree *, const char *);\nstruct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);\n\nvoid cache_tree_write(struct strbuf *, struct cache_tree *root);\nstruct cache_tree *cache_tree_read(const char *buffer, unsigned long size);\n\nint cache_tree_fully_valid(struct cache_tree *);\nint cache_tree_update(struct cache_tree *, struct cache_entry **, int, int, int);\n\n/** bitmasks to write_cache_as_tree flags */\n#define WRITE_TREE_MISSING_OK 1\n#define WRITE_TREE_IGNORE_CACHE_TREE 2\n\n/** error return codes */\n#define WRITE_TREE_UNREADABLE_INDEX (-1)\n#define WRITE_TREE_UNMERGED_INDEX (-2)\n#define WRITE_TREE_PREFIX_ERROR (-3)\n\nint write_cache_as_tree(unsigned char *sha1, int flags, const char *prefix);\nvoid prime_cache_tree(struct cache_tree **, struct tree *);\n\nextern int cache_tree_matches_traversal(struct cache_tree *, struct name_entry *ent, struct traverse_info *info);\n\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_c_file/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"define\">\n        <rubric classes=\"breathe-sectiondef-title\">Defines</rubric>\n        <index entries=\"['single',\\ 'WRITE_TREE_MISSING_OK\\ (C\\ macro)',\\ 'c.WRITE_TREE_MISSING_OK',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">WRITE_TREE_MISSING_OK</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>bitmasks to write_cache_as_tree flags </paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'WRITE_TREE_IGNORE_CACHE_TREE\\ (C\\ macro)',\\ 'c.WRITE_TREE_IGNORE_CACHE_TREE',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">WRITE_TREE_IGNORE_CACHE_TREE</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'WRITE_TREE_UNREADABLE_INDEX\\ (C\\ macro)',\\ 'c.WRITE_TREE_UNREADABLE_INDEX',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">WRITE_TREE_UNREADABLE_INDEX</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>error return codes </paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'WRITE_TREE_UNMERGED_INDEX\\ (C\\ macro)',\\ 'c.WRITE_TREE_UNMERGED_INDEX',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">WRITE_TREE_UNMERGED_INDEX</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'WRITE_TREE_PREFIX_ERROR\\ (C\\ macro)',\\ 'c.WRITE_TREE_PREFIX_ERROR',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">WRITE_TREE_PREFIX_ERROR</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n    </container>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'cache_tree\\ (C++\\ function)',\\ '_CPPv410cache_treev',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_free\\ (C++\\ function)',\\ '_CPPv415cache_tree_freePP10cache_tree',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_free</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_invalidate_path\\ (C++\\ function)',\\ '_CPPv426cache_tree_invalidate_pathP10cache_treePKc',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_invalidate_path</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_sub\\ (C++\\ function)',\\ '_CPPv414cache_tree_subP10cache_treePKc',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv414cache_tree_subP10cache_treePKc\" reftitle=\"cache_tree_sub\"><desc_sig_name classes=\"n\">cache_tree_sub</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_sub</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_write\\ (C++\\ function)',\\ '_CPPv416cache_tree_writeP6strbufP10cache_tree',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_write</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">strbuf</desc_sig_name><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">root</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_read\\ (C++\\ function)',\\ '_CPPv415cache_tree_readPKcm',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_read</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">buffer</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">unsigned</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">long</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">size</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_fully_valid\\ (C++\\ function)',\\ '_CPPv422cache_tree_fully_validP10cache_tree',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_fully_valid</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_update\\ (C++\\ function)',\\ '_CPPv417cache_tree_updateP10cache_treePP11cache_entryiii',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_update</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">cache_entry</desc_sig_name><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'write_cache_as_tree\\ (C++\\ function)',\\ '_CPPv419write_cache_as_treePhiPKc',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">write_cache_as_tree</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">unsigned</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">sha1</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">flags</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">prefix</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'prime_cache_tree\\ (C++\\ function)',\\ '_CPPv416prime_cache_treePP10cache_treeP4tree',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">prime_cache_tree</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">tree</desc_sig_name><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'cache_tree_matches_traversal\\ (C++\\ function)',\\ '_CPPv428cache_tree_matches_traversalP10cache_treeP10name_entryP13traverse_info',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_matches_traversal</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">name_entry</desc_sig_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">ent</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">traverse_info</desc_sig_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">info</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n    </container>\n    <container classes=\"breathe-sectiondef\" objtype=\"var\">\n        <rubric classes=\"breathe-sectiondef-title\">Variables</rubric>\n        <index entries=\"['single',\\ 'global_cache_tree\\ (C++\\ member)',\\ '_CPPv417global_cache_tree',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv410cache_treev\" reftitle=\"cache_tree\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">global_cache_tree</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>Shared cache tree instance. </paragraph>\n            </desc_content>\n        </desc>\n    </container>\n    <index entries=\"['single',\\ 'cache_tree_sub\\ (C++\\ struct)',\\ '_CPPv414cache_tree_sub',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree_sub</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'cache_tree\\ (C++\\ struct)',\\ '_CPPv410cache_tree',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">cache_tree</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_c_file/input.rst",
    "content": ".. doxygenfile:: c_file.h\n"
  },
  {
    "path": "tests/data/examples/test_class/class.cpp",
    "content": "#include \"class.h\"\n\n/*! More documentation in the impl file */\nvoid ClassTest::function(int myIntParameter)\n{\n}\n\n/*! More documentation in the impl file */\nvoid ClassTest::anotherFunction()\n{\n}\n\n"
  },
  {
    "path": "tests/data/examples/test_class/class.h",
    "content": "#include <string>\n\nnamespace TestNamespaceClasses {\n\n//! \\brief first class inside of namespace\nclass NamespacedClassTest {\n\npublic:\n\n    //! \\brief namespaced class function\n    virtual void function() const = 0;\n\n    static void functionS();\n\n    explicit NamespacedClassTest() {}\n\n    //! \\brief namespaced class other function\n    void anotherFunction() {}\n};\n\n\n//! \\brief second class inside of namespace\nclass ClassTest {\n\npublic:\n\n    //! \\brief second namespaced class function\n    void function() {}\n\n    //! \\brief second namespaced class other function\n    void anotherFunction() {}\n\n};\n\n\n} // TestNamespaceClasses\n\n//! \\brief class outside of namespace\nclass OuterClass {\n\npublic:\n\n    //! \\brief inner class\n    class InnerClass {};\n\n};\n\n\n//! \\brief class outside of namespace\nclass ClassTest {\n\npublic:\n\n    /*! \\brief non-namespaced class function\n\n        More details in the header file.\n      */\n    void function(int myParameter);\n \n    //! \\brief non-namespaced class other function\n    void anotherFunction();\n\n    //! \\brief namespaced class function\n    virtual void publicFunction() const = 0;\n\n    virtual void undocumentedPublicFunction() const = 0;\n\n    //! A public class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n\n    //! A public struct\n    struct PublicStruct {};\n\n    struct UndocumentedPublicStruct {};\n\nprotected:\n\n    //! A protected function\n    void protectedFunction() {}\n\n    void undocumentedProtectedFunction() {}\n\n    //! A protected class\n    class ProtectedClass {};\n\n    class UndocumentedProtectedClass {};\n\n    //! A protected struct\n    struct ProtectedStruct {};\n\n    struct UndocumentedProtectedStruct {};\n\nprivate:\n\n    //! This is a private function\n    virtual void privateFunction() const = 0;\n\n    virtual void undocumentedPrivateFunction() const = 0;\n\n    //! A private class\n    class PrivateClass {};\n\n    class UndocumentedPrivateClass {};\n\n    //! A private struct\n    struct PrivateStruct {};\n\n    struct UndocumentedPrivateStruct {};\n};\n\n\ntemplate<typename T>\nvoid f0();\n\ntemplate<>\nvoid f0<std::string>();\n\nnamespace NS1 {\n\ntemplate<typename T>\nvoid f1();\n\ntemplate<>\nvoid f1<std::string>();\n\nnamespace NS2 {\n\ntemplate<typename T>\nvoid f2();\n\ntemplate<>\nvoid f2<std::string>();\n\n} // namespace NS2\n} // namespace NS1\n"
  },
  {
    "path": "tests/data/examples/test_class/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'f0\\ (C++\\ function)',\\ '_CPPv4I0E2f0vv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f0</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'f0&lt;std::string&gt;\\ (C++\\ function)',\\ '_CPPv4IE2f0INSt6stringEEvv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f0</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n            </desc_content>\n        </desc>\n    </container>\n    <index entries=\"['single',\\ 'OuterClass\\ (C++\\ class)',\\ '_CPPv410OuterClass',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">OuterClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>class outside of namespace </paragraph>\n            <index entries=\"['single',\\ 'OuterClass::InnerClass\\ (C++\\ class)',\\ '_CPPv4N10OuterClass10InnerClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">InnerClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>inner class </paragraph>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ClassTest\\ (C++\\ class)',\\ '_CPPv49ClassTest',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>class outside of namespace </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'ClassTest::function\\ (C++\\ function)',\\ '_CPPv4N9ClassTest8functionEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">myParameter</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>non-namespaced class function </paragraph>\n                        <paragraph>More details in the header file.</paragraph>\n                        <paragraph>More documentation in the impl file </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'ClassTest::anotherFunction\\ (C++\\ function)',\\ '_CPPv4N9ClassTest15anotherFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anotherFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>non-namespaced class other function </paragraph>\n                        <paragraph>More documentation in the impl file </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'ClassTest::publicFunction\\ (C++\\ function)',\\ '_CPPv4NK9ClassTest14publicFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">publicFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>namespaced class function </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'ClassTest::undocumentedPublicFunction\\ (C++\\ function)',\\ '_CPPv4NK9ClassTest26undocumentedPublicFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">undocumentedPublicFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"protected-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Protected Functions</rubric>\n                <index entries=\"['single',\\ 'ClassTest::protectedFunction\\ (C++\\ function)',\\ '_CPPv4N9ClassTest17protectedFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">protectedFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>A protected function. </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'ClassTest::undocumentedProtectedFunction\\ (C++\\ function)',\\ '_CPPv4N9ClassTest29undocumentedProtectedFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">undocumentedProtectedFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"private-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Private Functions</rubric>\n                <index entries=\"['single',\\ 'ClassTest::privateFunction\\ (C++\\ function)',\\ '_CPPv4NK9ClassTest15privateFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">privateFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>This is a private function. </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'ClassTest::undocumentedPrivateFunction\\ (C++\\ function)',\\ '_CPPv4NK9ClassTest27undocumentedPrivateFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">undocumentedPrivateFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <index entries=\"['single',\\ 'ClassTest::PrivateClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest12PrivateClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PrivateClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A private class. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::PrivateStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest13PrivateStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PrivateStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A private struct. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::ProtectedClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest14ProtectedClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ProtectedClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A protected class. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::ProtectedStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest15ProtectedStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ProtectedStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A protected struct. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::PublicClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest11PublicClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A public class. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::PublicStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest12PublicStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PublicStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A public struct. </paragraph>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedPrivateClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest24UndocumentedPrivateClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPrivateClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedPrivateStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest25UndocumentedPrivateStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPrivateStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedProtectedClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest26UndocumentedProtectedClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedProtectedClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedProtectedStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest27UndocumentedProtectedStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedProtectedStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedPublicClass\\ (C++\\ class)',\\ '_CPPv4N9ClassTest23UndocumentedPublicClassE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'ClassTest::UndocumentedPublicStruct\\ (C++\\ struct)',\\ '_CPPv4N9ClassTest24UndocumentedPublicStructE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPublicStruct</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'TestNamespaceClasses\\ (C++\\ type)',\\ '_CPPv420TestNamespaceClasses',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">namespace</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">TestNamespaceClasses</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <index entries=\"['single',\\ 'TestNamespaceClasses::ClassTest\\ (C++\\ class)',\\ '_CPPv4N20TestNamespaceClasses9ClassTestE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>second class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::ClassTest::function\\ (C++\\ function)',\\ '_CPPv4N20TestNamespaceClasses9ClassTest8functionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>second namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::ClassTest::anotherFunction\\ (C++\\ function)',\\ '_CPPv4N20TestNamespaceClasses9ClassTest15anotherFunctionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anotherFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>second namespaced class other function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n            <index entries=\"['single',\\ 'TestNamespaceClasses::NamespacedClassTest\\ (C++\\ class)',\\ '_CPPv4N20TestNamespaceClasses19NamespacedClassTestE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NamespacedClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>first class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::NamespacedClassTest::function\\ (C++\\ function)',\\ '_CPPv4NK20TestNamespaceClasses19NamespacedClassTest8functionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::NamespacedClassTest::NamespacedClassTest\\ (C++\\ function)',\\ '_CPPv4N20TestNamespaceClasses19NamespacedClassTest19NamespacedClassTestEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">explicit</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NamespacedClassTest</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                            </desc_content>\n                        </desc>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::NamespacedClassTest::anotherFunction\\ (C++\\ function)',\\ '_CPPv4N20TestNamespaceClasses19NamespacedClassTest15anotherFunctionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anotherFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>namespaced class other function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-static-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Static Functions</rubric>\n                        <index entries=\"['single',\\ 'TestNamespaceClasses::NamespacedClassTest::functionS\\ (C++\\ function)',\\ '_CPPv4N20TestNamespaceClasses19NamespacedClassTest9functionSEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">static</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">functionS</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NS1\\ (C++\\ type)',\\ '_CPPv43NS1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">namespace</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NS1</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <container classes=\"breathe-sectiondef\" objtype=\"func\">\n                <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n                <index entries=\"['single',\\ 'NS1::f1\\ (C++\\ function)',\\ '_CPPv4I0EN3NS12f1Evv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'NS1::f1&lt;std::string&gt;\\ (C++\\ function)',\\ '_CPPv4IEN3NS12f1INSt6stringEEEvv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f1</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <index entries=\"['single',\\ 'NS1::NS2\\ (C++\\ type)',\\ '_CPPv4N3NS13NS2E',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">namespace</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NS2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n                        <index entries=\"['single',\\ 'NS1::NS2::f2\\ (C++\\ function)',\\ '_CPPv4I0EN3NS13NS22f2Evv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                            </desc_content>\n                        </desc>\n                        <index entries=\"['single',\\ 'NS1::NS2::f2&lt;std::string&gt;\\ (C++\\ function)',\\ '_CPPv4IEN3NS13NS22f2INSt6stringEEEvv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f2</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_class/input.rst",
    "content": ".. doxygenfile:: class.h\n"
  },
  {
    "path": "tests/data/examples/test_code_blocks/code_blocks.h",
    "content": "\n/** A function with an unannotated code block with C/C++ code.\n *\n * @code\n * char* buffer = new char[42];\n * int charsAdded = sprintf(buffer, \"Tabs are normally %d spaces\\n\", 8);\n * @endcode\n */\nvoid with_standard_code_block();\n\n/** A function with an unannotated code block with non-C/C++ code.\n *\n * @code\n * set(user_list A B C)\n * foreach(element ${user_list})\n *     message(STATUS \"Element is ${element}\")\n * endforeach()\n * @endcode\n * \n * Another code-block that explicitly remains not highlighted.\n * @code{.unparsed}\n * Show this as is.\n * @endcode\n */\nvoid with_unannotated_cmake_code_block();\n\n/** A function with an annotated cmake code block.\n *\n * @code{.cmake}\n * set(user_list A B C)\n * foreach(element ${user_list})\n *     message(STATUS \"Element is ${element}\")\n * endforeach()\n * @endcode\n */\nvoid with_annotated_cmake_code_block();\n"
  },
  {
    "path": "tests/data/examples/test_code_blocks/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'with_standard_code_block\\ (C++\\ function)',\\ '_CPPv424with_standard_code_blockv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">with_standard_code_block</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>A function with an unannotated code block with C/C++ code. </paragraph>\n                <literal_block force=\"False\" language=\"default\" linenos=\"False\">char* buffer = new char[42];\nint charsAdded = sprintf(buffer, \"Tabs are normally %d spaces\\n\", 8);</literal_block>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'with_unannotated_cmake_code_block\\ (C++\\ function)',\\ '_CPPv433with_unannotated_cmake_code_blockv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">with_unannotated_cmake_code_block</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>A function with an unannotated code block with non-C/C++ code. </paragraph>\n                <literal_block force=\"False\" language=\"default\" linenos=\"False\">set(user_list A B C)\nforeach(element ${user_list})\n    message(STATUS \"Element is ${element}\")\nendforeach()</literal_block>\n                <paragraph>Another code-block that explicitly remains not highlighted. <literal_block language=\"text\" linenos=\"False\">Show this as is.</literal_block></paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'with_annotated_cmake_code_block\\ (C++\\ function)',\\ '_CPPv431with_annotated_cmake_code_blockv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">with_annotated_cmake_code_block</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>A function with an annotated cmake code block. </paragraph>\n                <literal_block language=\"cmake\" linenos=\"False\">set(user_list A B C)\nforeach(element ${user_list})\n    message(STATUS \"Element is ${element}\")\nendforeach()</literal_block>\n            </desc_content>\n        </desc>\n    </container>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_code_blocks/input.rst",
    "content": ".. doxygenfile:: code_blocks.h\n"
  },
  {
    "path": "tests/data/examples/test_cpp_concept/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Hashable\\ (C++\\ concept)',\\ '_CPPv4I0E8Hashable',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp concept\" desctype=\"concept\" domain=\"cpp\" objtype=\"concept\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><desc_sig_keyword classes=\"k\">concept</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Hashable</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_concept/cpp_concept.h",
    "content": "template<typename T>\nconcept Hashable = requires(T a)\n{\n    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;\n};\n"
  },
  {
    "path": "tests/data/examples/test_cpp_concept/input.rst",
    "content": ".. doxygenconcept:: Hashable\n"
  },
  {
    "path": "tests/data/examples/test_cpp_enum/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Unscoped\\ (C++\\ enum)',\\ '_CPPv48Unscoped',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enum\" desctype=\"enum\" domain=\"cpp\" objtype=\"enum\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enum</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Unscoped</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><emphasis>Values:</emphasis></paragraph>\n            <index entries=\"['single',\\ 'Unscoped::UnscopedEnumerator\\ (C++\\ enumerator)',\\ '_CPPv4N8Unscoped18UnscopedEnumeratorE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UnscopedEnumerator</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ScopedStruct\\ (C++\\ enum)',\\ '_CPPv412ScopedStruct',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enum-class\" desctype=\"enum-class\" domain=\"cpp\" objtype=\"enum-class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enum</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ScopedStruct</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><emphasis>Values:</emphasis></paragraph>\n            <index entries=\"['single',\\ 'ScopedStruct::Enumerator\\ (C++\\ enumerator)',\\ '_CPPv4N12ScopedStruct10EnumeratorE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Enumerator</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ScopedClass\\ (C++\\ enum)',\\ '_CPPv411ScopedClass',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enum-class\" desctype=\"enum-class\" domain=\"cpp\" objtype=\"enum-class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enum</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ScopedClass</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><emphasis>Values:</emphasis></paragraph>\n            <index entries=\"['single',\\ 'ScopedClass::Enumerator\\ (C++\\ enumerator)',\\ '_CPPv4N11ScopedClass10EnumeratorE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Enumerator</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ScopedClassNoUnderlying\\ (C++\\ enum)',\\ '_CPPv423ScopedClassNoUnderlying',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp enum-class\" desctype=\"enum-class\" domain=\"cpp\" objtype=\"enum-class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enum</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ScopedClassNoUnderlying</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><emphasis>Values:</emphasis></paragraph>\n            <index entries=\"['single',\\ 'ScopedClassNoUnderlying::Enumerator\\ (C++\\ enumerator)',\\ '_CPPv4N23ScopedClassNoUnderlying10EnumeratorE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp enumerator\" desctype=\"enumerator\" domain=\"cpp\" objtype=\"enumerator\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">enumerator</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Enumerator</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_enum/cpp_enum.h",
    "content": "enum Unscoped : int {\n\tUnscopedEnumerator = 42\n};\n\nenum struct ScopedStruct : int {\n\tEnumerator = 42\n};\n\nenum class ScopedClass : int {\n\tEnumerator = 42\n};\n\nenum class ScopedClassNoUnderlying {\n\tEnumerator = 42\n};\n"
  },
  {
    "path": "tests/data/examples/test_cpp_enum/input.rst",
    "content": ".. doxygenenum:: Unscoped\n.. doxygenenum:: ScopedStruct\n.. doxygenenum:: ScopedClass\n.. doxygenenum:: ScopedClassNoUnderlying\n"
  },
  {
    "path": "tests/data/examples/test_cpp_friendclass/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'A\\ (C++\\ struct)',\\ '_CPPv41A',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">A</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'B\\ (C++\\ struct)',\\ '_CPPv41B',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">B</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'C\\ (C++\\ struct)',\\ '_CPPv41C',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">C</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <container classes=\"breathe-sectiondef\" objtype=\"friend\">\n                <rubric classes=\"breathe-sectiondef-title\">Friends</rubric>\n                <desc domain=\"cpp\" objtype=\"friendclass\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_annotation>friend class</desc_annotation> A</desc_signature>\n                </desc>\n                <desc domain=\"cpp\" objtype=\"friendclass\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_annotation>friend struct</desc_annotation> B</desc_signature>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_friendclass/cpp_friendclass.h",
    "content": "struct A {};\nstruct B {};\n\nstruct C {\n\tfriend class A;\n\tfriend struct B;\n};\n"
  },
  {
    "path": "tests/data/examples/test_cpp_friendclass/input.rst",
    "content": ".. doxygenstruct:: A\n.. doxygenstruct:: B\n\n.. doxygenstruct:: C\n    :members:\n    :undoc-members:\n"
  },
  {
    "path": "tests/data/examples/test_cpp_function/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Foo\\ (C++\\ struct)',\\ '_CPPv43Foo',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Foo</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Class\\ (C++\\ struct)',\\ '_CPPv45Class',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Class</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'Class::f1\\ (C++\\ function)',\\ '_CPPv4NVKR5Class2f1Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">volatile</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">&amp;</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'Class::f2\\ (C++\\ function)',\\ '_CPPv4NVKO5Class2f2Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">volatile</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">&amp;&amp;</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'Class::f_issue_338\\ (C++\\ function)',\\ '_CPPv4N5Class11f_issue_338Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_338</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">noexcept</desc_sig_keyword></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'Class::anon_params\\ (C++\\ function)',\\ '_CPPv4N5Class11anon_paramsEiiiPc',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anon_params</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">x</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'Class::f_issue_489\\ (C++\\ member)',\\ '_CPPv4N5Class11f_issue_489E',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">(</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_489</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">)</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">(</desc_sig_punctuation><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv43Foo\" reftitle=\"Foo\"><desc_sig_name classes=\"n\">Foo</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n\">foo</desc_sig_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">value</desc_sig_name><desc_sig_punctuation classes=\"p\">)</desc_sig_punctuation></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-static-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Static Functions</rubric>\n                <index entries=\"['single',\\ 'Class::f3\\ (C++\\ function)',\\ '_CPPv4N5Class2f3Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">static</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f3</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'TestNamespaceFunction\\ (C++\\ type)',\\ '_CPPv421TestNamespaceFunction',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">namespace</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">TestNamespaceFunction</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A namespace to demonstrate a namespaced function. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"func\">\n                <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n                <index entries=\"['single',\\ 'TestNamespaceFunction::namespaceFunc\\ (C++\\ function)',\\ '_CPPv4N21TestNamespaceFunction13namespaceFuncEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">namespaceFunc</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>A function within a namspace. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_function/cpp_function.h",
    "content": "struct Foo{};\nstruct Class {\n\tvirtual void f1() const volatile & = 0;\n\tvirtual void f2() const volatile && = 0;\n\tstatic void f3();\n\n\n\tvoid (*f_issue_489)(struct Foo *foo, int value);\n\n\tint f_issue_338() noexcept;\n\n    int anon_params(int, int, int x, char*);\n};\n\n/** A namespace to demonstrate a namespaced function */\nnamespace TestNamespaceFunction {\n/** A function within a namspace. */\nvoid namespaceFunc();\n}\n"
  },
  {
    "path": "tests/data/examples/test_cpp_function/input.rst",
    "content": ".. doxygenfile:: cpp_function.h\n"
  },
  {
    "path": "tests/data/examples/test_cpp_inherited_members/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Base\\ (C++\\ class)',\\ '_CPPv44Base',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Base</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><reference internal=\"True\" refid=\"class_base\"><inline classes=\"std std-ref\">Base</inline></reference> class. </paragraph>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_a\"><inline classes=\"std std-ref\">A</inline></reference>, <reference internal=\"True\" refid=\"class_b\"><inline classes=\"std std-ref\">B</inline></reference></paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'Base::f_issue_356\\ (C++\\ function)',\\ '_CPPv4N4Base11f_issue_356Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_356</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Base-class member function. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'A\\ (C++\\ class)',\\ '_CPPv41A',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">A</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv44Base\" reftitle=\"Base\"><desc_sig_name classes=\"n\">Base</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Class <reference internal=\"True\" refid=\"class_a\"><inline classes=\"std std-ref\">A</inline></reference>. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'A::f_issue_356\\ (C++\\ function)',\\ '_CPPv4N1A11f_issue_356Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_356</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Base-class member function. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'B\\ (C++\\ class)',\\ '_CPPv41B',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">B</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv44Base\" reftitle=\"Base\"><desc_sig_name classes=\"n\">Base</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Class <reference internal=\"True\" refid=\"class_b\"><inline classes=\"std std-ref\">B</inline></reference>. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'B::f_issue_356\\ (C++\\ function)',\\ '_CPPv4N1B11f_issue_356Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_356</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Base-class member function. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_inherited_members/cpp_inherited_members.h",
    "content": "/**\n * @file\n */\n\n/// Base class\nclass Base\n{\npublic:\n    /// Base-class member function\n    void f_issue_356();\n};\n\n/// Class A\nclass A : public Base {};\n/// Class B\nclass B : public Base {};\n"
  },
  {
    "path": "tests/data/examples/test_cpp_inherited_members/extra_dox_opts.txt",
    "content": "INLINE_INHERITED_MEMB = YES\n"
  },
  {
    "path": "tests/data/examples/test_cpp_inherited_members/input.rst",
    "content": ".. doxygenfile:: cpp_inherited_members.h\n"
  },
  {
    "path": "tests/data/examples/test_cpp_trailing_return_type/compare-1.11.0.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'f_issue_441\\ (C++\\ function)',\\ '_CPPv411f_issue_441v',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv46Thingy\" reftitle=\"Thingy\"><desc_sig_name classes=\"n\">Thingy</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_441</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>Function that creates a thingy. </paragraph>\n            </desc_content>\n        </desc>\n    </container>\n    <index entries=\"['single',\\ 'Thingy\\ (C++\\ class)',\\ '_CPPv46Thingy',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Thingy</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>needed for references in global function return type </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_trailing_return_type/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'f_issue_441\\ (C++\\ function)',\\ '_CPPv411f_issue_441v',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">auto</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f_issue_441</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_operator classes=\"o\">-&gt;</desc_sig_operator><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv46Thingy\" reftitle=\"Thingy\"><desc_sig_name classes=\"n\">Thingy</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>Function that creates a thingy. </paragraph>\n            </desc_content>\n        </desc>\n    </container>\n    <index entries=\"['single',\\ 'Thingy\\ (C++\\ class)',\\ '_CPPv46Thingy',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Thingy</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>needed for references in global function return type </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_cpp_trailing_return_type/cpp_trailing_return_type.h",
    "content": "/*! \\file cpp_trailing_return_type.h */\n\n/*! needed for references in global function return type */\nclass Thingy {};\n\n//! \\brief Function that creates a thingy.\nauto f_issue_441() -> Thingy*;\n"
  },
  {
    "path": "tests/data/examples/test_cpp_trailing_return_type/input.rst",
    "content": ".. doxygenfile:: cpp_trailing_return_type.h\n"
  },
  {
    "path": "tests/data/examples/test_define/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'USE_STUFF\\ (C\\ macro)',\\ 'c.USE_STUFF',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">USE_STUFF</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A simple define without a value. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'MAX_LENGTH\\ (C\\ macro)',\\ 'c.MAX_LENGTH',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">MAX_LENGTH</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A define with a simple value. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'MAXIMUM\\ (C\\ macro)',\\ 'c.MAXIMUM',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">MAXIMUM</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">A</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">B</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A define with some parameters. </paragraph>\n            <field_list>\n                <field>\n                    <field_name>Parameters</field_name>\n                    <field_body>\n                        <bullet_list>\n                            <list_item>\n                                <paragraph><literal_strong>A</literal_strong> – The parameter A </paragraph>\n                            </list_item>\n                            <list_item>\n                                <paragraph><literal_strong>B</literal_strong> – The parameter B</paragraph>\n                            </list_item>\n                        </bullet_list>\n                    </field_body>\n                </field>\n                <field>\n                    <field_name>Returns</field_name>\n                    <field_body>\n                        <paragraph>The maximum of A and B </paragraph>\n                    </field_body>\n                </field>\n            </field_list>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SWAP\\ (C\\ macro)',\\ 'c.SWAP',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp macro\" desctype=\"macro\" domain=\"cpp\" objtype=\"macro\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SWAP</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">A</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">B</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A define which spans multiple lines. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_define/define.h",
    "content": "/**\n * A simple define without a value\n */\n#define USE_STUFF\n\n\n/**\n * A define with a simple value\n */\n#define MAX_LENGTH 100\n\n\n/**\n * A define with some parameters\n *\n * \\param A The parameter A\n * \\param B The parameter B\n *\n * \\returns The maximum of A and B\n */\n#define MAXIMUM(A,B) ((A > B)?(A):(B))\n\n\n/**\n * A define which spans multiple lines\n */\n#define SWAP(A,B) {             \\\n                    (a) ^= (b); \\\n                    (b) ^= (a); \\\n                    (a) ^= (b); \\\n                  }\n"
  },
  {
    "path": "tests/data/examples/test_define/input.rst",
    "content": ".. doxygendefine:: USE_STUFF\n.. doxygendefine:: MAX_LENGTH\n.. doxygendefine:: MAXIMUM\n.. doxygendefine:: SWAP\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'A\\ (C++\\ class)',\\ '_CPPv41A',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">A</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Inheritance diagram for A:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"A\" tooltip=\"A\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" [label=\"C\" tooltip=\"C\"]&#10;    \"3\" [label=\"D\" tooltip=\"D\"]&#10;    \"4\" [label=\"E\" tooltip=\"E\"]&#10;    \"2\" -&gt; \"1\" [dir=forward tooltip=\"public-inheritance\"]&#10;    \"3\" -&gt; \"1\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"4\" -&gt; \"3\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Collaboration diagram for A:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"A\" tooltip=\"A\" fillcolor=\"#BFBFBF\"]&#10;    \"1\" -&gt; \"1\" [dir=forward tooltip=\"usage\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_c\"><inline classes=\"std std-ref\">C</inline></reference>, <reference internal=\"True\" refid=\"class_d\"><inline classes=\"std std-ref\">D</inline></reference></paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'A::m_self\\ (C++\\ member)',\\ '_CPPv4N1A6m_selfE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv41A\" reftitle=\"A\"><desc_sig_name classes=\"n\">A</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">m_self</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'B\\ (C++\\ class)',\\ '_CPPv41B',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">B</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Inheritance diagram for B:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"B\" tooltip=\"B\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" [label=\"D\" tooltip=\"D\"]&#10;    \"3\" [label=\"E\" tooltip=\"E\"]&#10;    \"2\" -&gt; \"1\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"3\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Collaboration diagram for B:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"A\" tooltip=\"A\"]&#10;    \"1\" [label=\"B\" tooltip=\"B\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_d\"><inline classes=\"std std-ref\">D</inline></reference></paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'B::m_a\\ (C++\\ member)',\\ '_CPPv4N1B3m_aE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv41A\" reftitle=\"A\"><desc_sig_name classes=\"n\">A</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">m_a</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'C\\ (C++\\ class)',\\ '_CPPv41C',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">C</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv41A\" reftitle=\"A\"><desc_sig_name classes=\"n\">A</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Inheritance diagram for C:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"A\" tooltip=\"A\"]&#10;    \"1\" [label=\"C\" tooltip=\"C\" fillcolor=\"#BFBFBF\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Collaboration diagram for C:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"A\" tooltip=\"A\"]&#10;    \"4\" [label=\"B\" tooltip=\"B\"]&#10;    \"1\" [label=\"C\" tooltip=\"C\" fillcolor=\"#BFBFBF\"]&#10;    \"3\" [label=\"D\" tooltip=\"D\"]&#10;    \"2\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"4\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;    \"1\" -&gt; \"3\" [dir=forward tooltip=\"usage\"]&#10;    \"3\" -&gt; \"2\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"3\" -&gt; \"4\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"3\" -&gt; \"1\" [dir=forward tooltip=\"usage\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'C::m_d\\ (C++\\ member)',\\ '_CPPv4N1C3m_dE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv41D\" reftitle=\"D\"><desc_sig_name classes=\"n\">D</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">m_d</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'D\\ (C++\\ class)',\\ '_CPPv41D',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">D</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">protected</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv41A\" reftitle=\"A\"><desc_sig_name classes=\"n\">A</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">private</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv41B\" reftitle=\"B\"><desc_sig_name classes=\"n\">B</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Inheritance diagram for D:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"A\" tooltip=\"A\"]&#10;    \"3\" [label=\"B\" tooltip=\"B\"]&#10;    \"1\" [label=\"D\" tooltip=\"D\" fillcolor=\"#BFBFBF\"]&#10;    \"4\" [label=\"E\" tooltip=\"E\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"1\" -&gt; \"3\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"4\" -&gt; \"1\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Collaboration diagram for D:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"A\" tooltip=\"A\"]&#10;    \"3\" [label=\"B\" tooltip=\"B\"]&#10;    \"4\" [label=\"C\" tooltip=\"C\"]&#10;    \"1\" [label=\"D\" tooltip=\"D\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"3\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"4\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;    \"4\" -&gt; \"1\" [dir=forward tooltip=\"usage\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"1\" -&gt; \"3\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"1\" -&gt; \"4\" [dir=forward tooltip=\"usage\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_e\"><inline classes=\"std std-ref\">E</inline></reference></paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'D::m_c\\ (C++\\ member)',\\ '_CPPv4N1D3m_cE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv41C\" reftitle=\"C\"><desc_sig_name classes=\"n\">C</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">m_c</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'E\\ (C++\\ class)',\\ '_CPPv41E',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">E</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv41D\" reftitle=\"D\"><desc_sig_name classes=\"n\">D</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Inheritance diagram for E:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"3\" [label=\"A\" tooltip=\"A\"]&#10;    \"4\" [label=\"B\" tooltip=\"B\"]&#10;    \"2\" [label=\"D\" tooltip=\"D\"]&#10;    \"1\" [label=\"E\" tooltip=\"E\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" -&gt; \"3\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"2\" -&gt; \"4\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>Collaboration diagram for E:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"3\" [label=\"A\" tooltip=\"A\"]&#10;    \"4\" [label=\"B\" tooltip=\"B\"]&#10;    \"5\" [label=\"C\" tooltip=\"C\"]&#10;    \"2\" [label=\"D\" tooltip=\"D\"]&#10;    \"1\" [label=\"E\" tooltip=\"E\" fillcolor=\"#BFBFBF\"]&#10;    \"3\" -&gt; \"3\" [dir=forward tooltip=\"usage\"]&#10;    \"4\" -&gt; \"3\" [dir=forward tooltip=\"usage\"]&#10;    \"5\" -&gt; \"3\" [dir=forward tooltip=\"public-inheritance\"]&#10;    \"5\" -&gt; \"2\" [dir=forward tooltip=\"usage\"]&#10;    \"2\" -&gt; \"3\" [dir=forward tooltip=\"protected-inheritance\" color=\"#006400\"]&#10;    \"2\" -&gt; \"4\" [dir=forward tooltip=\"private-inheritance\" color=\"#8B1A1A\"]&#10;    \"2\" -&gt; \"5\" [dir=forward tooltip=\"usage\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"public-inheritance\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"file\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>file</emphasis> <desc_name classes=\"sig-name descname\">diagrams_a.h</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This graph shows which files directly or indirectly include diagrams_a.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"diagrams_a.h\" tooltip=\"diagrams_a.h\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" [label=\"diagrams_d.h\" tooltip=\"diagrams_d.h\"]&#10;    \"3\" [label=\"diagrams_e.h\" tooltip=\"diagrams_e.h\"]&#10;    \"1\" -&gt; \"2\" [dir=back tooltip=\"include\"]&#10;    \"2\" -&gt; \"3\" [dir=back tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"file\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>file</emphasis> <desc_name classes=\"sig-name descname\">diagrams_b.h</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This graph shows which files directly or indirectly include diagrams_b.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"diagrams_b.h\" tooltip=\"diagrams_b.h\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" [label=\"diagrams_d.h\" tooltip=\"diagrams_d.h\"]&#10;    \"3\" [label=\"diagrams_e.h\" tooltip=\"diagrams_e.h\"]&#10;    \"1\" -&gt; \"2\" [dir=back tooltip=\"include\"]&#10;    \"2\" -&gt; \"3\" [dir=back tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"file\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>file</emphasis> <desc_name classes=\"sig-name descname\">diagrams_c.h</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>Include dependency graph for diagrams_c.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"diagrams_c.h\" tooltip=\"diagrams_c.h\" fillcolor=\"#BFBFBF\"]&#10;    \"1\" -&gt; \"1\" [dir=forward tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>This graph shows which files directly or indirectly include diagrams_c.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"diagrams_c.h\" tooltip=\"diagrams_c.h\" fillcolor=\"#BFBFBF\"]&#10;    \"1\" -&gt; \"1\" [dir=back tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"file\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>file</emphasis> <desc_name classes=\"sig-name descname\">diagrams_d.h</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>Include dependency graph for diagrams_d.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"2\" [label=\"diagrams_a.h\" tooltip=\"diagrams_a.h\"]&#10;    \"3\" [label=\"diagrams_b.h\" tooltip=\"diagrams_b.h\"]&#10;    \"1\" [label=\"diagrams_d.h\" tooltip=\"diagrams_d.h\" fillcolor=\"#BFBFBF\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"include\"]&#10;    \"1\" -&gt; \"3\" [dir=forward tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n            <paragraph>This graph shows which files directly or indirectly include diagrams_d.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"1\" [label=\"diagrams_d.h\" tooltip=\"diagrams_d.h\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" [label=\"diagrams_e.h\" tooltip=\"diagrams_e.h\"]&#10;    \"1\" -&gt; \"2\" [dir=back tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"file\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>file</emphasis> <desc_name classes=\"sig-name descname\">diagrams_e.h</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>Include dependency graph for diagrams_e.h:</paragraph>\n            <figure>\n                <graphviz align=\"center\" code='digraph {&#10;    graph [bgcolor=\"#00000000\"]&#10;    node [shape=rectangle style=filled fillcolor=\"#FFFFFF\" font=Helvetica padding=2]&#10;    edge [color=\"#1414CE\"]&#10;    \"3\" [label=\"diagrams_a.h\" tooltip=\"diagrams_a.h\"]&#10;    \"4\" [label=\"diagrams_b.h\" tooltip=\"diagrams_b.h\"]&#10;    \"2\" [label=\"diagrams_d.h\" tooltip=\"diagrams_d.h\"]&#10;    \"1\" [label=\"diagrams_e.h\" tooltip=\"diagrams_e.h\" fillcolor=\"#BFBFBF\"]&#10;    \"2\" -&gt; \"3\" [dir=forward tooltip=\"include\"]&#10;    \"2\" -&gt; \"4\" [dir=forward tooltip=\"include\"]&#10;    \"1\" -&gt; \"2\" [dir=forward tooltip=\"include\"]&#10;}'>\n                </graphviz>\n            </figure>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/diagrams_a.h",
    "content": "#ifndef _DIAGRAMS_A_H\n#define _DIAGRAMS_A_H\nclass A { public: A *m_self; };\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/diagrams_b.h",
    "content": "#ifndef _DIAGRAMS_B_H\n#define _DIAGRAMS_B_H\nclass A;\nclass B { public: A *m_a; };\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/diagrams_c.h",
    "content": "#ifndef _DIAGRAMS_C_H\n#define _DIAGRAMS_C_H\n#include \"diagrams_c.h\"\nclass D;\nclass C : public A { public: D *m_d; };\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/diagrams_d.h",
    "content": "#ifndef _DIAGRAM_D_H\n#define _DIAGRAM_D_H\n#include \"diagrams_a.h\"\n#include \"diagrams_b.h\"\nclass C;\nclass D : virtual protected  A, private B { public: C m_c; };\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/diagrams_e.h",
    "content": "#ifndef _DIAGRAM_E_H\n#define _DIAGRAM_E_H\n#include \"diagrams_d.h\"\nclass E : public D {};\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/extra_dox_opts.txt",
    "content": "ENABLE_PREPROCESSING       = YES\n"
  },
  {
    "path": "tests/data/examples/test_diagrams/input.rst",
    "content": ".. doxygenindex::\n   :allow-dot-graphs:\n"
  },
  {
    "path": "tests/data/examples/test_dot_graphs/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">Dot Graph Demonstrations</desc_name></desc_signature>\n        <desc_content>\n            <section>\n                <title>Using @dot command</title>\n                <target refid=\"dotgraphs_1dotcmd\"></target>\n                <paragraph><figure><graphviz code='&#10;digraph G {&#10;    bgcolor=\"purple:pink\" label=\"a graph\" fontcolor=\"white\"&#10;    subgraph cluster1 {&#10;        fillcolor=\"blue:cyan\" label=\"a cluster\" fontcolor=\"white\" style=\"filled\" gradientangle=\"270\"&#10;        node [shape=box fillcolor=\"red:yellow\" style=\"filled\" gradientangle=90]&#10;    \"a node\";&#10;   }&#10;}&#10;'></graphviz><caption>basic graph elements</caption></figure></paragraph>\n            </section>\n            <section>\n                <title>Using @dotfile command</title>\n                <target refid=\"dotgraphs_1dotfilecmd\"></target>\n                <paragraph><figure><graphviz code='digraph G {bgcolor=\"red:cyan\" gradientangle=0&#10;&#10;    subgraph cluster_0 {&#10;        style=filled;&#10;        color=lightgrey;&#10;        fillcolor=\"blue:yellow\";&#10;        gradientangle=90;&#10;        node [fillcolor=\"yellow:green\" style=filled gradientangle=270] a0;&#10;        node [fillcolor=\"green:red\"] a1;&#10;        node [fillcolor=\"red:cyan\"] a2;&#10;        node [fillcolor=\"cyan:blue\"] a3;&#10;&#10;        a0 -&gt; a1 -&gt; a2 -&gt; a3;&#10;        label = \"process #1\";&#10;    }&#10;&#10;    subgraph cluster_1 {&#10;        node [fillcolor=\"yellow:magenta\"&#10;             style=filled gradientangle=270] b0;&#10;        node [fillcolor=\"magenta:cyan\"] b1;&#10;        node [fillcolor=\"cyan:red\"] b2;&#10;        node [fillcolor=\"red:blue\"] b3;&#10;&#10;        b0 -&gt; b1 -&gt; b2 -&gt; b3;&#10;        label = \"process #2\";&#10;        color=blue&#10;        fillcolor=\"blue:yellow\";&#10;        style=filled;&#10;        gradientangle=90;&#10;    }&#10;    start -&gt; a0;&#10;    start -&gt; b0;&#10;    a1 -&gt; b3;&#10;    b2 -&gt; a3;&#10;    a3 -&gt; a0;&#10;    a3 -&gt; end;&#10;    b3 -&gt; end;&#10;&#10;    start [shape=Mdiamond ,&#10;        fillcolor=\"yellow:brown\",&#10;        gradientangle=90,&#10;        style=radial];&#10;    end [shape=Msquare,&#10;        fillcolor=\"orange:blue\",&#10;        style=radial,&#10;        gradientangle=90];&#10;}&#10;'></graphviz><caption>Captions go here</caption></figure></paragraph>\n            </section>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_dot_graphs/dot_graphs.h",
    "content": "/**\n * @file dot_graphs.h\n *\n * @page dotgraphs Dot Graph Demonstrations\n *\n * @section dotcmd Using \\@dot command\n *\n * @dot \"basic graph elements\"\n * digraph G {\n *     bgcolor=\"purple:pink\" label=\"a graph\" fontcolor=\"white\"\n *     subgraph cluster1 {\n *         fillcolor=\"blue:cyan\" label=\"a cluster\" fontcolor=\"white\" style=\"filled\" gradientangle=\"270\"\n *         node [shape=box fillcolor=\"red:yellow\" style=\"filled\" gradientangle=90]\n *\t\t\"a node\";\n *    }\n * }\n * @enddot\n *\n * @section dotfilecmd Using \\@dotfile command\n *\n * @dotfile \"dotfile.dot\" \"Captions go here\"\n */\n"
  },
  {
    "path": "tests/data/examples/test_dot_graphs/dotfile.dot",
    "content": "digraph G {bgcolor=\"red:cyan\" gradientangle=0\n\n    subgraph cluster_0 {\n        style=filled;\n        color=lightgrey;\n        fillcolor=\"blue:yellow\";\n        gradientangle=90;\n        node [fillcolor=\"yellow:green\" style=filled gradientangle=270] a0;\n        node [fillcolor=\"green:red\"] a1;\n        node [fillcolor=\"red:cyan\"] a2;\n        node [fillcolor=\"cyan:blue\"] a3;\n\n        a0 -> a1 -> a2 -> a3;\n        label = \"process #1\";\n    }\n\n    subgraph cluster_1 {\n        node [fillcolor=\"yellow:magenta\"\n             style=filled gradientangle=270] b0;\n        node [fillcolor=\"magenta:cyan\"] b1;\n        node [fillcolor=\"cyan:red\"] b2;\n        node [fillcolor=\"red:blue\"] b3;\n\n        b0 -> b1 -> b2 -> b3;\n        label = \"process #2\";\n        color=blue\n        fillcolor=\"blue:yellow\";\n        style=filled;\n        gradientangle=90;\n    }\n    start -> a0;\n    start -> b0;\n    a1 -> b3;\n    b2 -> a3;\n    a3 -> a0;\n    a3 -> end;\n    b3 -> end;\n\n    start [shape=Mdiamond ,\n        fillcolor=\"yellow:brown\",\n        gradientangle=90,\n        style=radial];\n    end [shape=Msquare,\n        fillcolor=\"orange:blue\",\n        style=radial,\n        gradientangle=90];\n}\n"
  },
  {
    "path": "tests/data/examples/test_dot_graphs/input.rst",
    "content": ".. doxygenpage:: dotgraphs\n"
  },
  {
    "path": "tests/data/examples/test_group/compare-1.10.0.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <desc domain=\"cpp\" objtype=\"group\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>group</emphasis> <desc_name classes=\"sig-name descname\">mygroup</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This is the first group</paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"func\">\n                <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n                <index entries=\"['single',\\ 'groupedFunction\\ (C++\\ function)',\\ '_CPPv415groupedFunctionv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">groupedFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>This function is in MyGroup. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n            <index entries=\"['single',\\ 'GroupedClassTest\\ (C++\\ class)',\\ '_CPPv416GroupedClassTest',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GroupedClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>first class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'GroupedClassTest::publicFunction\\ (C++\\ function)',\\ '_CPPv4NK16GroupedClassTest14publicFunctionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">publicFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                    <index entries=\"['single',\\ 'GroupedClassTest::PublicClass\\ (C++\\ class)',\\ '_CPPv4N16GroupedClassTest11PublicClassE',\\ '',\\ None]\"></index>\n                    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                        <desc_content>\n                            <paragraph>A protected class. </paragraph>\n                        </desc_content>\n                    </desc>\n                    <index entries=\"['single',\\ 'GroupedClassTest::UndocumentedPublicClass\\ (C++\\ class)',\\ '_CPPv4N16GroupedClassTest23UndocumentedPublicClassE',\\ '',\\ None]\"></index>\n                    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                        <desc_content>\n                        </desc_content>\n                    </desc>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"group\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>group</emphasis> <desc_name classes=\"sig-name descname\">innergroup</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This is an inner group</paragraph>\n            <index entries=\"['single',\\ 'InnerGroupClassTest\\ (C++\\ class)',\\ '_CPPv419InnerGroupClassTest',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">InnerGroupClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>inner class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'InnerGroupClassTest::function\\ (C++\\ function)',\\ '_CPPv4N19InnerGroupClassTest8functionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>inner namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_group/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <desc domain=\"cpp\" objtype=\"group\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>group</emphasis> <desc_name classes=\"sig-name descname\">My Group</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This is the first group. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"func\">\n                <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n                <index entries=\"['single',\\ 'groupedFunction\\ (C++\\ function)',\\ '_CPPv415groupedFunctionv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">groupedFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>This function is in MyGroup. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n            <index entries=\"['single',\\ 'GroupedClassTest\\ (C++\\ class)',\\ '_CPPv416GroupedClassTest',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GroupedClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>first class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'GroupedClassTest::publicFunction\\ (C++\\ function)',\\ '_CPPv4NK16GroupedClassTest14publicFunctionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">publicFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                    <index entries=\"['single',\\ 'GroupedClassTest::PublicClass\\ (C++\\ class)',\\ '_CPPv4N16GroupedClassTest11PublicClassE',\\ '',\\ None]\"></index>\n                    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">PublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                        <desc_content>\n                            <paragraph>A protected class. </paragraph>\n                        </desc_content>\n                    </desc>\n                    <index entries=\"['single',\\ 'GroupedClassTest::UndocumentedPublicClass\\ (C++\\ class)',\\ '_CPPv4N16GroupedClassTest23UndocumentedPublicClassE',\\ '',\\ None]\"></index>\n                    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UndocumentedPublicClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                        <desc_content>\n                        </desc_content>\n                    </desc>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"group\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>group</emphasis> <desc_name classes=\"sig-name descname\">Inner Group</desc_name></desc_signature>\n        <desc_content>\n            <paragraph>This is an inner group. </paragraph>\n            <index entries=\"['single',\\ 'InnerGroupClassTest\\ (C++\\ class)',\\ '_CPPv419InnerGroupClassTest',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">InnerGroupClassTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>inner class inside of namespace </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                        <index entries=\"['single',\\ 'InnerGroupClassTest::function\\ (C++\\ function)',\\ '_CPPv4N19InnerGroupClassTest8functionEv',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>inner namespaced class function </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_group/group.h",
    "content": "\n/** @defgroup mygroup My Group\n *  This is the first group\n *  @{\n */\n\n//! \\brief first class inside of namespace\nclass GroupedClassTest {\n\npublic:\n    //! \\brief namespaced class function\n    virtual void publicFunction() const = 0;\n\n    virtual void undocumentedPublicFunction() const = 0;\n\n    //! A protected class\n    class PublicClass {};\n\n    class UndocumentedPublicClass {};\n\nprotected:\n\n    //! A protected function\n    void protectedFunction() {};\n\n    void undocumentedProtectedFunction() {};\n\n    //! A protected class\n    class ProtectedClass {};\n\n    class UndocumentedProtectedClass {};\n\nprivate:\n\n    //! This is a private function\n    virtual void privateFunction() const = 0;\n\n    virtual void undocumentedPrivateFunction() const = 0;\n\n    //! A private class\n    class PrivateClass {};\n\n    class UndocumentedPrivateClass {};\n};\n\n//! This function is in MyGroup\nvoid groupedFunction();\n\n/** @} */ // end of mygroup\n\n/** @defgroup innergroup Inner Group\n *  @ingroup mygroup\n *  This is an inner group\n *  @{\n */\n\n//! \\brief inner class inside of namespace\nclass InnerGroupClassTest {\n\npublic:\n    //! \\brief inner namespaced class function\n    void function() {};\n\nprivate:\n\n    //! A private function\n    void innerGroupPrivateFunction() {};\n\n    class PrivateClass {};\n};\n\n/** @} */ // end of innergroup\n\n//! \\brief second class inside of namespace\nclass UngroupedClassTest {\n\npublic:\n    //! \\brief second namespaced class function\n    void function() {};\n\nprivate:\n\n    //! A private function\n    void ungroupedPrivateFunction() {};\n\n    class PrivateClass {};\n};\n\n//! Ungrouped function\nvoid ungroupedFunction();\n"
  },
  {
    "path": "tests/data/examples/test_group/input.rst",
    "content": ".. doxygengroup:: mygroup\n    :members:\n.. doxygengroup:: innergroup\n    :members:\n"
  },
  {
    "path": "tests/data/examples/test_group_content_only/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Structy\\ (C++\\ struct)',\\ '_CPPv47Structy',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp struct\" desctype=\"struct\" domain=\"cpp\" objtype=\"struct\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">struct</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Structy</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Hello. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_group_content_only/group_content_only.hpp",
    "content": "\n/// @defgroup structy_group StructyGroup\n/// @{\n\n\n/// Hello\ntypedef struct {\n  const unsigned char* data_1;\n  unsigned int size_1;\n  const unsigned char* data_2;\n  unsigned int size_2;\n} Structy;\n\n\n/// @}\n\n\n"
  },
  {
    "path": "tests/data/examples/test_group_content_only/input.rst",
    "content": ".. doxygengroup:: structy_group\n    :content-only:\n"
  },
  {
    "path": "tests/data/examples/test_group_member_ref/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <paragraph>The XML output of Doxygen changed in 1.9.7, see\n        <reference refuri=\"https://github.com/breathe-doc/breathe/pull/934\">https://github.com/breathe-doc/breathe/pull/934</reference></paragraph>\n    <index entries=\"['single',\\ 'func2\\ (C++\\ function)',\\ '_CPPv45func2v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">func2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>another function in group 1 </paragraph>\n        </desc_content>\n    </desc>\n</document>"
  },
  {
    "path": "tests/data/examples/test_group_member_ref/group.cpp",
    "content": "/** @defgroup group1 The First Group\n *  This is the first group\n *  @{\n */\n\n/** @brief class C1 in group 1 */\nclass C1 {};\n\n/** @brief class C2 in group 1 */\nclass C2 {};\n\n/** function in group 1 */\nvoid func1() {}\n\n/** @} */ // end of group1\n\n/**\n *  @defgroup group2 The Second Group\n *  This is the second group\n */\n\n/** @defgroup group3 The Third Group\n *  This is the third group\n */\n\n/** @defgroup group4 The Fourth Group\n *  @ingroup group3\n *  Group 4 is a subgroup of group 3\n */\n\n/**\n *  @ingroup group2\n *  @brief class C3 in group 2\n */\nclass C3 {};\n\n/** @ingroup group2\n *  @brief class C4 in group 2\n */\nclass C4 {};\n\n/** @ingroup group3\n *  @brief class C5 in @link group3 the third group@endlink.\n */\nclass C5 {};\n\n/** @ingroup group1 group2 group3 group4\n *  namespace N1 is in four groups\n *  @sa @link group1 The first group@endlink, group2, group3, group4 \n *\n *  Also see @ref mypage2\n */\nnamespace N1 {};\n\n/** @file\n *  @ingroup group3\n *  @brief this file in group 3\n */\n\n/** @defgroup group5 The Fifth Group\n *  This is the fifth group\n *  @{\n */\n\n/** @page mypage1 This is a section in group 5\n *  Text of the first section\n */\n\n/** @page mypage2 This is another section in group 5\n *  Text of the second section\n */\n\n/** @} */ // end of group5\n\n/** @addtogroup group1\n *  \n *  More documentation for the first group.\n *  @{\n */\n\n/** another function in group 1 */\nvoid func2() {}\n\n/** yet another function in group 1 */\nvoid func3() {}\n\n/** @} */ // end of group1\n\n"
  },
  {
    "path": "tests/data/examples/test_group_member_ref/input.rst",
    "content": "The XML output of Doxygen changed in 1.9.7, see\nhttps://github.com/breathe-doc/breathe/pull/934\n\n\n.. doxygenfunction:: func2"
  },
  {
    "path": "tests/data/examples/test_headings/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'HeadingsTest1\\ (C++\\ class)',\\ '_CPPv413HeadingsTest1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">HeadingsTest1</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a documentation. </paragraph>\n            <paragraph>This is more documentation.</paragraph>\n            <paragraph><emphasis>Header</emphasis></paragraph>\n            <paragraph>Text</paragraph>\n            <paragraph><emphasis>Header <strong>Bold Header Text</strong></emphasis></paragraph>\n            <paragraph>Text</paragraph>\n            <emphasis>Header</emphasis>\n            <target refid=\"class_headings_test1_1autotoc_md0\"></target>\n            <paragraph>Text</paragraph>\n            <emphasis>Header</emphasis>\n            <target refid=\"class_headings_test1_1autotoc_md1\"></target>\n            <paragraph>Text </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'HeadingsTest2\\ (C++\\ class)',\\ '_CPPv413HeadingsTest2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">HeadingsTest2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <section>\n                <title>Header 1</title>\n                <target refid=\"class_headings_test2_1autotoc_md2\"></target>\n                <paragraph>Blah</paragraph>\n                <section>\n                    <title>Header 2</title>\n                    <target refid=\"class_headings_test2_1autotoc_md3\"></target>\n                    <paragraph>Blah blah</paragraph>\n                    <section>\n                        <title>Header 3</title>\n                        <target refid=\"class_headings_test2_1autotoc_md4\"></target>\n                        <paragraph>Blah blah blah </paragraph>\n                    </section>\n                </section>\n            </section>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'HeadingsTest3\\ (C++\\ class)',\\ '_CPPv413HeadingsTest3',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">HeadingsTest3</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <emphasis>Header3</emphasis>\n            <target refid=\"class_headings_test3_1autotoc_md5\"></target>\n            <paragraph>Text </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'HeadingsTest4\\ (C++\\ class)',\\ '_CPPv413HeadingsTest4',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">HeadingsTest4</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <section>\n                <title>Header 1</title>\n                <target refid=\"class_headings_test4_1autotoc_md6\"></target>\n                <paragraph>Text</paragraph>\n                <emphasis>Header 3</emphasis>\n                <target refid=\"class_headings_test4_1autotoc_md7\"></target>\n                <paragraph>Text text text </paragraph>\n            </section>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_headings/extra_dox_opts.txt",
    "content": "WARN_IF_DOC_ERROR = NO\n"
  },
  {
    "path": "tests/data/examples/test_headings/headings.h",
    "content": "/*! \\brief This is a documentation\n\nThis is more documentation.\n\n<h2>Header</h2>\nText\n\n<h2>Header <b>Bold Header Text</b></h2>\nText\n\nHeader\n---------\nText\n\n### Header ###\nText\n*/\nclass HeadingsTest1 {};\n\n/*!\n# Header 1\n\nBlah\n\n## Header 2\n\nBlah blah\n\n### Header 3\n\nBlah blah blah\n*/\nclass HeadingsTest2 {};\n\n/*!\n### Header3 ###\nText\n*/\nclass HeadingsTest3 {};\n\n/*!\n# Header 1\n\nText\n\n### Header 3\n\nText text text\n*/\nclass HeadingsTest4 {};\n"
  },
  {
    "path": "tests/data/examples/test_headings/input.rst",
    "content": ".. doxygenclass:: HeadingsTest1\n.. doxygenclass:: HeadingsTest2\n.. doxygenclass:: HeadingsTest3\n.. doxygenclass:: HeadingsTest4\n"
  },
  {
    "path": "tests/data/examples/test_html_entities/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'noop\\ (C++\\ function)',\\ '_CPPv44noopv',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">noop</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>x ¡¢£¤¥¦§¨©ª «¬­®¯°±²³´µ¶ ·¸¹º»¼½¾¿À ÁÂÃÄÅÆÇÈÉÊ ËÌÍÎÏÐÑÒÓÔ ÕÖ×ØÙÚÛÜÝÞ ßàáâãäåæçè éêëìíîïðñò óôõö÷øùúûü ýþÿƒΑΒΓΔΕΖΗ ΘΙΚΛΜΝΞΟΠΡΣΤ ΥΦΧΨΩαβγδεζ ηθικλμνξοπρς στυφχψωϑϒϖ• …′″‾⁄℘ℑℜ™ℵ ←↑→↓↔↵⇐⇑⇒⇓⇔∀ ∂∃∅∇∈∉∋∏∑−∗√ ∝∞∠∧∨∩∪∫∴∼≅≈≠ ≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈ ⌉⌊⌋⟨⟩◊♠♣♥♦Œ œŠšŸˆ˜   ‌‍ ‎‏–—‘’‚“”„† ‡‰‹›€™’x </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_html_entities/entities.h",
    "content": "/**\n * x&nbsp;&iexcl;&cent;&pound;&curren;&yen;&brvbar;&sect;&uml;&copy;&ordf;\n * &laquo;&not;&shy;&reg;&macr;&deg;&plusmn;&sup2;&sup3;&acute;&micro;&para;\n * &middot;&cedil;&sup1;&ordm;&raquo;&frac14;&frac12;&frac34;&iquest;&Agrave;\n * &Aacute;&Acirc;&Atilde;&Auml;&Aring;&AElig;&Ccedil;&Egrave;&Eacute;&Ecirc;\n * &Euml;&Igrave;&Iacute;&Icirc;&Iuml;&ETH;&Ntilde;&Ograve;&Oacute;&Ocirc;\n * &Otilde;&Ouml;&times;&Oslash;&Ugrave;&Uacute;&Ucirc;&Uuml;&Yacute;&THORN;\n * &szlig;&agrave;&aacute;&acirc;&atilde;&auml;&aring;&aelig;&ccedil;&egrave;\n * &eacute;&ecirc;&euml;&igrave;&iacute;&icirc;&iuml;&eth;&ntilde;&ograve;\n * &oacute;&ocirc;&otilde;&ouml;&divide;&oslash;&ugrave;&uacute;&ucirc;&uuml;\n * &yacute;&thorn;&yuml;&fnof;&Alpha;&Beta;&Gamma;&Delta;&Epsilon;&Zeta;&Eta;\n * &Theta;&Iota;&Kappa;&Lambda;&Mu;&Nu;&Xi;&Omicron;&Pi;&Rho;&Sigma;&Tau;\n * &Upsilon;&Phi;&Chi;&Psi;&Omega;&alpha;&beta;&gamma;&delta;&epsilon;&zeta;\n * &eta;&theta;&iota;&kappa;&lambda;&mu;&nu;&xi;&omicron;&pi;&rho;&sigmaf;\n * &sigma;&tau;&upsilon;&phi;&chi;&psi;&omega;&thetasym;&upsih;&piv;&bull;\n * &hellip;&prime;&Prime;&oline;&frasl;&weierp;&image;&real;&trade;&alefsym;\n * &larr;&uarr;&rarr;&darr;&harr;&crarr;&lArr;&uArr;&rArr;&dArr;&hArr;&forall;\n * &part;&exist;&empty;&nabla;&isin;&notin;&ni;&prod;&sum;&minus;&lowast;&radic;\n * &prop;&infin;&ang;&and;&or;&cap;&cup;&int;&there4;&sim;&cong;&asymp;&ne;\n * &equiv;&le;&ge;&sub;&sup;&nsub;&sube;&supe;&oplus;&otimes;&perp;&sdot;&lceil;\n * &rceil;&lfloor;&rfloor;&lang;&rang;&loz;&spades;&clubs;&hearts;&diams;&OElig;\n * &oelig;&Scaron;&scaron;&Yuml;&circ;&tilde;&ensp;&emsp;&thinsp;&zwnj;&zwj;\n * &lrm;&rlm;&ndash;&mdash;&lsquo;&rsquo;&sbquo;&ldquo;&rdquo;&bdquo;&dagger;\n * &Dagger;&permil;&lsaquo;&rsaquo;&euro;&tm;&apos;x\n */\nvoid noop();\n"
  },
  {
    "path": "tests/data/examples/test_html_entities/input.rst",
    "content": ".. doxygenfunction:: noop\n"
  },
  {
    "path": "tests/data/examples/test_image/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'ImageClass\\ (C++\\ class)',\\ '_CPPv410ImageClass',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ImageClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a class with an image in the description. </paragraph>\n            <paragraph>It renders like this:</paragraph>\n            <paragraph><image candidates=\"{'*': 'xml/pixel.png'}\" uri=\"xml/pixel.png\"></image></paragraph>\n            <paragraph>Breathe &amp; Sphinx should automatically copy the image from the doxygen output directory into the _images folder of the Sphinx output. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_image/image.h",
    "content": "/**\n* This is a class with an image in the description. It renders like this:\n*\n* \\image HTML pixel.png\n*\n* Breathe & Sphinx should automatically copy the image from the doxygen output directory into the\n* _images folder of the Sphinx output.\n*/\nclass ImageClass {};\n"
  },
  {
    "path": "tests/data/examples/test_image/input.rst",
    "content": ".. doxygenclass:: ImageClass\n"
  },
  {
    "path": "tests/data/examples/test_inheritance/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'BaseA\\ (C++\\ class)',\\ '_CPPv45BaseA',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">BaseA</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_child_v1\"><inline classes=\"std std-ref\">ChildV1</inline></reference>, <reference internal=\"True\" refid=\"class_child_v2\"><inline classes=\"std std-ref\">ChildV2</inline></reference>, <reference internal=\"True\" refid=\"class_main\"><inline classes=\"std std-ref\">Main</inline></reference></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'BaseB\\ (C++\\ class)',\\ '_CPPv45BaseB',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">BaseB</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_main\"><inline classes=\"std std-ref\">Main</inline></reference></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Main\\ (C++\\ class)',\\ '_CPPv44Main',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Main</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv45BaseA\" reftitle=\"BaseA\"><desc_sig_name classes=\"n\">BaseA</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">private</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv45BaseB\" reftitle=\"BaseB\"><desc_sig_name classes=\"n\">BaseB</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is the main class we’re interested in. </paragraph>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_child_a\"><inline classes=\"std std-ref\">ChildA</inline></reference>, <reference internal=\"True\" refid=\"class_child_b\"><inline classes=\"std std-ref\">ChildB</inline></reference></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ChildA\\ (C++\\ class)',\\ '_CPPv46ChildA',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ChildA</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv44Main\" reftitle=\"Main\"><desc_sig_name classes=\"n\">Main</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ChildB\\ (C++\\ class)',\\ '_CPPv46ChildB',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ChildB</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv44Main\" reftitle=\"Main\"><desc_sig_name classes=\"n\">Main</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ChildV1\\ (C++\\ class)',\\ '_CPPv47ChildV1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ChildV1</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv45BaseA\" reftitle=\"BaseA\"><desc_sig_name classes=\"n\">BaseA</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_child_v3\"><inline classes=\"std std-ref\">ChildV3</inline></reference></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ChildV2\\ (C++\\ class)',\\ '_CPPv47ChildV2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ChildV2</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv45BaseA\" reftitle=\"BaseA\"><desc_sig_name classes=\"n\">BaseA</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Subclassed by <reference internal=\"True\" refid=\"class_child_v3\"><inline classes=\"std std-ref\">ChildV3</inline></reference></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'ChildV3\\ (C++\\ class)',\\ '_CPPv47ChildV3',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ChildV3</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv47ChildV1\" reftitle=\"ChildV1\"><desc_sig_name classes=\"n\">ChildV1</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">private</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv47ChildV2\" reftitle=\"ChildV2\"><desc_sig_name classes=\"n\">ChildV2</desc_sig_name></reference></desc_signature_line></desc_signature>\n        <desc_content>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_inheritance/inheritance.h",
    "content": "\nclass BaseA {};\nclass BaseB {};\n\n/*! \\brief This is the main class we're interested in */\nclass Main : public BaseA, BaseB {};\n\nclass ChildA : public Main {};\nclass ChildB : public Main {};\n\nclass ChildV1 : virtual public BaseA {};\nclass ChildV2 : virtual public BaseA {};\nclass ChildV3 : public ChildV1, ChildV2 {};\n"
  },
  {
    "path": "tests/data/examples/test_inheritance/input.rst",
    "content": ".. doxygenfile:: inheritance.h\n"
  },
  {
    "path": "tests/data/examples/test_inline/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'InlineTest\\ (C++\\ class)',\\ '_CPPv410InlineTest',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">InlineTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A class to demonstrate inline documentation syntax. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'InlineTest::member\\ (C++\\ function)',\\ '_CPPv4N10InlineTest6memberEci',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">member</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">char</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">c</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">n</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>A member function. </paragraph>\n                        <paragraph>Details about member function</paragraph>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <bullet_list>\n                                        <list_item>\n                                            <paragraph><literal_strong>c</literal_strong> – c a character. </paragraph>\n                                        </list_item>\n                                        <list_item>\n                                            <paragraph><literal_strong>n</literal_strong> – n an integer. </paragraph>\n                                        </list_item>\n                                    </bullet_list>\n                                </field_body>\n                            </field>\n                            <field>\n                                <field_name>Throws</field_name>\n                                <field_body>\n                                    <paragraph><inline><desc_inline classes=\"cpp-expr sig sig-inline cpp\" domain=\"cpp\"><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">out_of_range</desc_sig_name></desc_inline></inline> – parameter is out of range. </paragraph>\n                                </field_body>\n                            </field>\n                            <field>\n                                <field_name>Returns</field_name>\n                                <field_body>\n                                    <paragraph>a character pointer. </paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_inline/inline.h",
    "content": "#include <stdexcept>\n/** A class to demonstrate inline documentation syntax. */\nclass InlineTest\n{\n public:\n /** A member function.\n  *\n  * Details about member function\n  *\n  *  \\exception std::out_of_range parameter is out of range.\n  *  @return a character pointer.\n  */\n const char *member(char c, ///< c a character.\n                    int n)  ///< n an integer.\n\n throw(std::out_of_range);\n};\n"
  },
  {
    "path": "tests/data/examples/test_inline/input.rst",
    "content": ".. doxygenclass:: InlineTest\n    :members:\n"
  },
  {
    "path": "tests/data/examples/test_latexmath/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'MathHelper\\ (C++\\ class)',\\ '_CPPv410MathHelper',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">MathHelper</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A class. </paragraph>\n            <paragraph>A inline formula: <math docname=\"index\" label=\"True\" nowrap=\"False\" number=\"True\"> f(x) = a + b </math></paragraph>\n            <paragraph>A display style formula:  <math_block docname=\"index\" label=\"True\" nowrap=\"False\" number=\"True\">\n\\int_a^b f(x) dx = F(b) - F(a)\n</math_block></paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_latexmath/input.rst",
    "content": ".. doxygenclass:: MathHelper\n"
  },
  {
    "path": "tests/data/examples/test_latexmath/latexmath.h",
    "content": "\n/**\n * @brief A class\n *\n * A inline formula: \\f$ f(x) = a + b \\f$\n *\n * A display style formula:\n * @f[\n * \\int_a^b f(x) dx = F(b) - F(a)\n * @f]\n */\nclass MathHelper\n{\npublic:\n  MathHelper() {}\n  ~MathHelper() {}\n}\n\n"
  },
  {
    "path": "tests/data/examples/test_links/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'LinksTest\\ (C++\\ class)',\\ '_CPPv49LinksTest',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">LinksTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>first struct inside of namespace </paragraph>\n            <paragraph>This is a longer description with a link to a webpage in the text <reference refuri=\"http://www.github.com\">http://www.github.com</reference> in order to test out Breathe’s handling of links. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_links/input.rst",
    "content": ".. doxygenclass:: LinksTest\n"
  },
  {
    "path": "tests/data/examples/test_links/links.h",
    "content": "\n/*! \\brief first struct inside of namespace\n\n  This is a longer description with a link to a webpage \n  in the text http://www.github.com in order to test out Breathe's\n  handling of links.\n\n */\nclass LinksTest {};\n"
  },
  {
    "path": "tests/data/examples/test_lists/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'SimpleList_1\\ (C++\\ class)',\\ '_CPPv412SimpleList_1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_1</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is a list using ‘+’ for bullets:<bullet_list><list_item><paragraph>One item.</paragraph></list_item><list_item><paragraph>Two items.</paragraph></list_item><list_item><paragraph>Three items.</paragraph></list_item><list_item><paragraph>Four.</paragraph></list_item></bullet_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SimpleList_2\\ (C++\\ class)',\\ '_CPPv412SimpleList_2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is a list using ‘-’ for bullets:<bullet_list><list_item><paragraph>One item.</paragraph></list_item><list_item><paragraph>Two items.</paragraph></list_item><list_item><paragraph>Three items.</paragraph></list_item><list_item><paragraph>Four.</paragraph></list_item></bullet_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SimpleList_3\\ (C++\\ class)',\\ '_CPPv412SimpleList_3',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_3</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is a list using ‘*’ for bullets:<bullet_list><list_item><paragraph>One item.</paragraph></list_item><list_item><paragraph>Two items.</paragraph></list_item><list_item><paragraph>Three items.</paragraph></list_item><list_item><paragraph>Four.</paragraph></list_item></bullet_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SimpleList_4\\ (C++\\ class)',\\ '_CPPv412SimpleList_4',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_4</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is an auto-numbered list:<enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>One item.</paragraph></list_item><list_item><paragraph>Two items.</paragraph></list_item><list_item><paragraph>Three items.</paragraph></list_item><list_item><paragraph>Four.</paragraph></list_item></enumerated_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SimpleList_5\\ (C++\\ class)',\\ '_CPPv412SimpleList_5',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_5</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is a numbered list:<enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>One item.</paragraph></list_item><list_item><paragraph>Two items.</paragraph></list_item><list_item><paragraph>Three items.</paragraph></list_item><list_item><paragraph>Four.</paragraph></list_item></enumerated_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'SimpleList_6\\ (C++\\ class)',\\ '_CPPv412SimpleList_6',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SimpleList_6</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a list example. </paragraph>\n            <paragraph>Following is an unordered list using ‘HTML’ tags: <bullet_list><list_item><paragraph>One item. </paragraph></list_item><list_item><paragraph>Two items. </paragraph></list_item><list_item><paragraph>Three items. </paragraph></list_item><list_item><paragraph>Four. </paragraph></list_item></bullet_list></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NestedLists_1\\ (C++\\ class)',\\ '_CPPv413NestedLists_1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NestedLists_1</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A list of events: </paragraph>\n            <paragraph><bullet_list><list_item><paragraph>mouse events<enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse move event</paragraph></list_item><list_item><paragraph><paragraph>mouse click event</paragraph><paragraph>More info about the click event.</paragraph></paragraph></list_item><list_item><paragraph>mouse double click event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>keyboard events<enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>key down event</paragraph></list_item><list_item><paragraph>key up event</paragraph></list_item></enumerated_list></paragraph></list_item></bullet_list></paragraph>\n            <paragraph>More text here. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NestedLists_2\\ (C++\\ class)',\\ '_CPPv413NestedLists_2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NestedLists_2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Text before the list. </paragraph>\n            <paragraph><bullet_list><list_item><paragraph>list item 1<bullet_list><list_item><paragraph>sub item 1<bullet_list><list_item><paragraph>sub sub item 1</paragraph></list_item><list_item><paragraph>sub sub item 2</paragraph></list_item></bullet_list>\n                                        The dot above ends the sub sub item list.</paragraph><paragraph>More text for the first sub item</paragraph></list_item></bullet_list>\n                            The dot above ends the first sub item.</paragraph><paragraph>More text for the first list item<bullet_list><list_item><paragraph>sub item 2</paragraph></list_item><list_item><paragraph>sub item 3</paragraph></list_item></bullet_list></paragraph></list_item><list_item><paragraph>list item 2</paragraph></list_item></bullet_list>\n                More text in the same paragraph.</paragraph>\n            <paragraph>More text in a new paragraph. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NestedLists_3\\ (C++\\ class)',\\ '_CPPv413NestedLists_3',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NestedLists_3</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A list of events: <bullet_list><list_item><paragraph>mouse events <enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse move event </paragraph></list_item><list_item><paragraph><paragraph>mouse click event</paragraph><paragraph>More info about the click event.</paragraph></paragraph></list_item><list_item><paragraph>mouse double click event </paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>keyboard events <enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>key down event </paragraph></list_item><list_item><paragraph>key up event </paragraph></list_item></enumerated_list></paragraph></list_item></bullet_list>\n                More text here. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NestedLists_4\\ (C++\\ class)',\\ '_CPPv413NestedLists_4',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NestedLists_4</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A list of events: </paragraph>\n            <paragraph><enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse move event<enumerated_list enumtype=\"upperalpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>swipe event</paragraph></list_item><list_item><paragraph>circle event</paragraph></list_item><list_item><paragraph>wave event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph><paragraph>mouse click event</paragraph><paragraph>More info about the click event.</paragraph></paragraph></list_item><list_item><paragraph>mouse double click event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>keyboard events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>key down event</paragraph></list_item><list_item><paragraph>key up event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>touch events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>pinch event</paragraph></list_item><list_item><paragraph>swipe event More text here. </paragraph></list_item></enumerated_list></paragraph></list_item></enumerated_list></paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'NestedLists_5\\ (C++\\ class)',\\ '_CPPv413NestedLists_5',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">NestedLists_5</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A deeply nested list of events: </paragraph>\n            <paragraph><enumerated_list enumtype=\"loweralpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>mouse move event<enumerated_list enumtype=\"upperalpha\" prefix=\"\" suffix=\".\"><list_item><paragraph>swipe event<enumerated_list enumtype=\"upperroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>swipe left</paragraph></list_item><list_item><paragraph>swipe right</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>circle event</paragraph></list_item><list_item><paragraph>wave event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph><paragraph>mouse click event</paragraph><paragraph>More info about the click event.</paragraph></paragraph></list_item><list_item><paragraph>mouse double click event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>keyboard events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>key down event</paragraph></list_item><list_item><paragraph>key up event</paragraph></list_item></enumerated_list></paragraph></list_item><list_item><paragraph>touch events<enumerated_list enumtype=\"lowerroman\" prefix=\"\" suffix=\".\"><list_item><paragraph>pinch event</paragraph></list_item><list_item><paragraph>swipe event More text here. </paragraph></list_item></enumerated_list></paragraph></list_item></enumerated_list></paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_lists/input.rst",
    "content": ".. doxygenfile:: lists.h\n"
  },
  {
    "path": "tests/data/examples/test_lists/lists.h",
    "content": "/**\n * \\brief This is a list example.\n *\n * Following is a list using '+' for bullets:\n *      + One item.\n *      + Two items.\n *      + Three items.\n *      + Four.\n *\n * And this is some more text.\n */\nclass SimpleList_1\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a list using '-' for bullets:\n *      - One item.\n *      - Two items.\n *      - Three items.\n *      - Four.\n *\n * And this is some more text.\n */\nclass SimpleList_2\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a list using '*' for bullets:\n *      * One item.\n *      * Two items.\n *      * Three items.\n *      * Four.\n *\n * And this is some more text.\n */\nclass SimpleList_3\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is an auto-numbered list:\n *      -# One item.\n *      -# Two items.\n *      -# Three items.\n *      -# Four.\n *\n * And this is some more text.\n */\nclass SimpleList_4\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is a numbered list:\n *      1. One item.\n *      2. Two items.\n *      3. Three items.\n *      4. Four.\n *\n * And this is some more text.\n */\nclass SimpleList_5\n{\n};\n\n/**\n * \\brief This is a list example.\n *\n * Following is an unordered list using 'HTML' tags:\n *      <ul><li> One item.\n *      <li> Two items.\n *      <li> Three items.\n *      <li> Four.\n *      </ul>\n *\n * And this is some more text.\n */\nclass SimpleList_6\n{\n};\n\n/**\n *  A list of events:\n *    - mouse events\n *         -# mouse move event\n *         -# mouse click event\\n\n *            More info about the click event.\n *         -# mouse double click event\n *    - keyboard events\n *         1. key down event\n *         2. key up event\n *\n *  More text here.\n */\nclass NestedLists_1\n{\n};\n\n/**\n * Text before the list\n * - list item 1\n *   - sub item 1\n *     - sub sub item 1\n *     - sub sub item 2\n *     .\n *     The dot above ends the sub sub item list.\n *\n *     More text for the first sub item\n *   .\n *   The dot above ends the first sub item.\n *\n *   More text for the first list item\n *   - sub item 2\n *   - sub item 3\n * - list item 2\n * .\n * More text in the same paragraph.\n *\n * More text in a new paragraph.\n */\nclass NestedLists_2\n{\n};\n\n/*!\n *  A list of events:\n *  <ul>\n *  <li> mouse events\n *     <ol>\n *     <li>mouse move event\n *     <li>mouse click event<br>\n *         More info about the click event.\n *     <li>mouse double click event\n *     </ol>\n *  <li> keyboard events\n *     <ol>\n *     <li>key down event\n *     <li>key up event\n *     </ol>\n *  </ul>\n *  More text here.\n */\n class NestedLists_3\n{\n};\n\n/**\n *  A list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_4\n{\n};\n\n/**\n *  A deeply nested list of events:\n *    1. mouse events\n *        -# mouse move event\n *            1. swipe event\n *              -# swipe left\n *              -# swipe right\n *            2. circle event\n *            3. wave event\n *        -# mouse click event\\n\n *            More info about the click event.\n *        -# mouse double click event\n *    2. keyboard events\n *        -# key down event\n *        -# key up event\n *    3. touch events\n *        -# pinch event\n *        -# swipe event\n *  More text here.\n */\nclass NestedLists_5\n{\n};\n"
  },
  {
    "path": "tests/data/examples/test_membergroups/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'GroupedMembers\\ (C++\\ class)',\\ '_CPPv414GroupedMembers',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">GroupedMembers</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>demonstrates member groups </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"user-defined\">\n                <rubric classes=\"breathe-sectiondef-title\">myGroup</rubric>\n                <index entries=\"['single',\\ 'GroupedMembers::in_mygroup_one\\ (C++\\ function)',\\ '_CPPv4N14GroupedMembers14in_mygroup_oneEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">in_mygroup_one</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">myParameter</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>A function. </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'GroupedMembers::in_mygroup_two\\ (C++\\ function)',\\ '_CPPv4N14GroupedMembers14in_mygroup_twoEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">in_mygroup_two</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">myParameter</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Another function. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'GroupedMembers::not_in_mygroup\\ (C++\\ function)',\\ '_CPPv4N14GroupedMembers14not_in_mygroupEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">not_in_mygroup</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">myParameter</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>This one is not in myGroup. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_membergroups/input.rst",
    "content": ".. doxygenclass:: GroupedMembers\n    :members:\n"
  },
  {
    "path": "tests/data/examples/test_membergroups/membergroups.h",
    "content": "//! \\brief demonstrates member groups\nclass GroupedMembers {\n\npublic:\n\n    ///@{   @name myGroup\n    void in_mygroup_one(int myParameter);  ///< A function\n    void in_mygroup_two(int myParameter);  ///< Another function\n    ///@}\n\n    void not_in_mygroup(int myParameter);  ///< This one is not in myGroup\n\n};\n"
  },
  {
    "path": "tests/data/examples/test_param_dirs/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'process\\ (C++\\ function)',\\ '_CPPv47processPvPvPv',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">process</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">i</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">o</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">*</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">io</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <field_list>\n                <field>\n                    <field_name>Parameters</field_name>\n                    <field_body>\n                        <bullet_list>\n                            <list_item>\n                                <paragraph><literal_strong>i</literal_strong> – <strong>[in]</strong> Input </paragraph>\n                            </list_item>\n                            <list_item>\n                                <paragraph><literal_strong>o</literal_strong> – <strong>[out]</strong> Output </paragraph>\n                            </list_item>\n                            <list_item>\n                                <paragraph><literal_strong>io</literal_strong> – <strong>[inout]</strong> Input and output </paragraph>\n                            </list_item>\n                        </bullet_list>\n                    </field_body>\n                </field>\n            </field_list>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_param_dirs/input.rst",
    "content": ".. doxygenfunction:: process\n"
  },
  {
    "path": "tests/data/examples/test_param_dirs/param_dirs.h",
    "content": "/**\n * @param[in] i Input\n * @param[out] o Output\n * @param[in,out] io Input and output\n */\nint process(void *i, void *o, void *io);\n"
  },
  {
    "path": "tests/data/examples/test_qtsignalsandslots/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'QtSignalSlotExample\\ (C++\\ class)',\\ '_CPPv419QtSignalSlotExample',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">QtSignalSlotExample</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">:</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">public</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">QObject</desc_sig_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'QtSignalSlotExample::workingFunction\\ (C++\\ function)',\\ '_CPPv4N19QtSignalSlotExample15workingFunctionEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">workingFunction</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">iShownParameter</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <paragraph><literal_strong>iShownParameter</literal_strong> – This is shown in declaration </paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-slot\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Slots</rubric>\n                <index entries=\"['single',\\ 'QtSignalSlotExample::workingSlot\\ (C++\\ function)',\\ '_CPPv4N19QtSignalSlotExample11workingSlotEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">workingSlot</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">iShown</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <paragraph><literal_strong>iShown</literal_strong> – This is in function declaration </paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"signal\">\n                <rubric classes=\"breathe-sectiondef-title\">Signals</rubric>\n                <index entries=\"['single',\\ 'QtSignalSlotExample::workingSignal\\ (C++\\ function)',\\ '_CPPv4N19QtSignalSlotExample13workingSignalEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">workingSignal</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">iShown</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <paragraph><literal_strong>iShown</literal_strong> – This is in function declaration </paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_qtsignalsandslots/input.rst",
    "content": ".. doxygenfile:: qtsignalsandslots.h\n"
  },
  {
    "path": "tests/data/examples/test_qtsignalsandslots/qtsignalsandslots.h",
    "content": "#ifndef QT_OBJECT_H\n#define QT_OBJECT_H\n\n/*!\n*\\brief Forward declaration of QT API class\n\nQT slots and signals typically `#include <QObject>`, but this example is parsed without QT SDK installed.\n*/\nextern class QObject;\n\nclass QtSignalSlotExample: public QObject\n{\n    Q_OBJECT\n\n    public:\n\n    /*!\n     *\\param iShownParameter\n     This is shown in declaration\n     */\n    void workingFunction( int iShownParameter ) { Q_UNUSED( iShownParameter ; ) }\n\n    signals:\n\n    /*!\n     \\param iShown\n     This is in function declaration\n     */\n    void workingSignal( int iShown );\n\n    public slots:\n\n    /*!\n     \\param iShown\n     This is in function declaration\n     */\n    void workingSlot( int iShown ) { iShown; }\n};\n\n#endif\n"
  },
  {
    "path": "tests/data/examples/test_rst/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'TestClass\\ (C++\\ class)',\\ '_CPPv49TestClass',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">TestClass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>first class inside of namespace </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'TestClass::function\\ (C++\\ function)',\\ '_CPPv4NK9TestClass8functionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Inserting additional reStructuredText information.</paragraph>\n                        <paragraph>This is some funky non-XML compliant text: &lt;&amp; !&gt;&lt;</paragraph>\n                        <paragraph>This is just a standard verbatim block with code:</paragraph>\n                        <literal_block force=\"False\" language=\"default\" linenos=\"False\">    child = 0;\n    while( child = parent-&gt;IterateChildren( child ) )</literal_block>\n                        <note>\n                            <paragraph>This reStructuredText has been handled correctly.</paragraph>\n                        </note>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'TestClass::rawVerbatim\\ (C++\\ function)',\\ '_CPPv4NK9TestClass11rawVerbatimEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">rawVerbatim</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Inserting additional reStructuredText information. <paragraph></paragraph></paragraph>\n                        <note>\n                            <paragraph>This reStructuredText has been handled correctly.</paragraph>\n                        </note>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'TestClass::rawLeadingAsteriskVerbatim\\ (C++\\ function)',\\ '_CPPv4NK9TestClass26rawLeadingAsteriskVerbatimEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">rawLeadingAsteriskVerbatim</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Inserting additional reStructuredText information.</paragraph>\n                        <paragraph><paragraph>Some example code:</paragraph><literal_block force=\"False\" language=\"default\" linenos=\"False\">int example(int x) {\n    return x * 2;\n}</literal_block></paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'TestClass::rawLeadingSlashesVerbatim\\ (C++\\ function)',\\ '_CPPv4NK9TestClass25rawLeadingSlashesVerbatimEi',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">rawLeadingSlashesVerbatim</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">something</desc_sig_name></desc_parameter></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Some kind of method. </paragraph>\n                        <paragraph><paragraph><literal_block force=\"False\" highlight_args=\"{}\" language=\"c\" linenos=\"True\">bool foo(bool something) {\n    return something;\n};</literal_block></paragraph> </paragraph>\n                        <note>\n                            <paragraph>Documentation using <literal>///</literal> should begin and end in a blank line. </paragraph>\n                        </note>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <paragraph><literal_strong>something</literal_strong> – a parameter</paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'TestClass::rawInlineVerbatim\\ (C++\\ function)',\\ '_CPPv4NK9TestClass17rawInlineVerbatimEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">rawInlineVerbatim</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_literal_number classes=\"m\">0</desc_sig_literal_number></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Inserting an inline reStructuredText snippet. Linking to another function: <inline> <reference internal=\"True\" refid=\"_CPPv4NK9TestClass11rawVerbatimEv\" reftitle=\"TestClass::rawVerbatim\"><literal classes=\"xref cpp cpp-func\">TestClass::rawVerbatim()</literal></reference> </inline></paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'TestClass::testFunction\\ (C++\\ function)',\\ '_CPPv4NK9TestClass12testFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">virtual</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">testFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Brief description. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_rst/input.rst",
    "content": ".. doxygenclass:: TestClass\n    :members:\n"
  },
  {
    "path": "tests/data/examples/test_rst/rst.h",
    "content": "\n//! \\brief first class inside of namespace\nclass TestClass\n{\npublic:\n\n    /*!\n    Inserting additional reStructuredText information.\n\n    \\rst\n\n    This is some funky non-XML compliant text: <& !><\n\n    .. note::\n\n       This reStructuredText has been handled correctly.\n    \\endrst\n\n    This is just a standard verbatim block with code:\n\n    \\verbatim\n        child = 0;\n        while( child = parent->IterateChildren( child ) )\n    \\endverbatim\n\n    */\n    virtual void function() const = 0;\n\n    /*!\n    Inserting additional reStructuredText information.\n    \\verbatim embed:rst\n    .. note::\n\n       This reStructuredText has been handled correctly.\n    \\endverbatim\n    */\n    virtual void rawVerbatim() const = 0;\n\n   /*!\n    * Inserting additional reStructuredText information.\n    *\n    * \\verbatim embed:rst:leading-asterisk\n    *     Some example code::\n    *\n    *        int example(int x) {\n    *            return x * 2;\n    *        }\n    * \\endverbatim\n    */\n    virtual void rawLeadingAsteriskVerbatim() const = 0;\n\n    /// Some kind of method\n    ///\n    /// @param something a parameter\n    ///\n    /// @verbatim embed:rst:leading-slashes\n    ///    .. code-block:: c\n    ///       :linenos:\n    ///\n    ///       bool foo(bool something) {\n    ///           return something;\n    ///       };\n    ///\n    /// @endverbatim\n    /// @note Documentation using `///` should begin and end in a blank line.\n\n    virtual void rawLeadingSlashesVerbatim(int something) const = 0;\n\n    /*!\n    Inserting an inline reStructuredText snippet.\n    Linking to another function: \\inlinerst :cpp:func:`TestClass::rawVerbatim` \\endrst\n    */\n    virtual void rawInlineVerbatim() const = 0;\n\n    //! Brief description\n    virtual void testFunction() const {};\n};\n"
  },
  {
    "path": "tests/data/examples/test_simplesect/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'f\\ (C++\\ function)',\\ '_CPPv4I00E1fvifNSt6stringE',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T1</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T2</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">f</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">a</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">float</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">b</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">c</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph><seealso><paragraph>see, f_raw </paragraph></seealso><seealso><paragraph>sa, f_raw </paragraph></seealso><admonition classes=\"remark\"><title>Remark</title><paragraph>remark, 1 </paragraph></admonition><admonition classes=\"remark\"><title>Remark</title><paragraph>remark, 2 </paragraph></admonition><admonition classes=\"remark\"><title>Remark</title><paragraph>remarks, 1 </paragraph></admonition><admonition classes=\"remark\"><title>Remark</title><paragraph>remarks, 2 </paragraph></admonition><definition_list><definition_list_item><term><strong>par, something</strong></term><definition><paragraph></paragraph></definition></definition_list_item></definition_list></paragraph>\n            <note>\n                <paragraph>note, be careful </paragraph>\n            </note>\n            <warning>\n                <paragraph>warning, don’t do this </paragraph>\n            </warning>\n            <field_list>\n                <field>\n                    <field_name>Pre</field_name>\n                    <field_body>\n                        <paragraph>stuff must be correct </paragraph>\n                    </field_body>\n                </field>\n                <field>\n                    <field_name>Pre</field_name>\n                    <field_body>\n                        <paragraph>more stuff must be correct </paragraph>\n                    </field_body>\n                </field>\n                <field>\n                    <field_name>Post</field_name>\n                    <field_body>\n                        <paragraph>stuff will be nice </paragraph>\n                    </field_body>\n                </field>\n                <field>\n                    <field_name>Post</field_name>\n                    <field_body>\n                        <paragraph>more stuff will be nice </paragraph>\n                    </field_body>\n                </field>\n                <field>\n                    <field_name>Returns</field_name>\n                    <field_body>\n                        <paragraph>nothing </paragraph>\n                    </field_body>\n                </field>\n            </field_list>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_simplesect/input.rst",
    "content": ".. doxygenfunction:: f\n"
  },
  {
    "path": "tests/data/examples/test_simplesect/simplesect.h",
    "content": "/*!\n\n  \\pre stuff must be correct\n  \\pre more stuff must be correct\n  \\post stuff will be nice\n  \\post more stuff will be nice\n  \\return nothing\n  \\par par, something\n  \\warning warning, don't do this\n  \\note note, be careful\n  \\see see, f_raw\n  \\sa sa, f_raw\n  \\remark remark, 1\n  \\remark remark, 2\n  \\remarks remarks, 1\n  \\remarks remarks, 2\n*/\ntemplate<typename T1, typename T2>\nvoid f(int a, float b, std::string c);\n"
  },
  {
    "path": "tests/data/examples/test_tables/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'Table_1\\ (C++\\ class)',\\ '_CPPv47Table_1',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Table_1</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a simple Markdown table example. </paragraph>\n            <paragraph>Following is a simple table using Markdown syntax.</paragraph>\n            <paragraph><table classes=\"colwidths-auto\"><tgroup cols=\"2\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><thead><row><entry heading=\"True\"><paragraph>First Header   </paragraph></entry><entry heading=\"True\"><paragraph>Second Header    </paragraph></entry></row></thead><tbody><row><entry><paragraph>Content Cell   </paragraph></entry><entry><paragraph>Content Cell    </paragraph></entry></row><row><entry><paragraph>Content Cell   </paragraph></entry><entry><paragraph>Content Cell   </paragraph></entry></row></tbody></tgroup></table></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Table_2\\ (C++\\ class)',\\ '_CPPv47Table_2',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Table_2</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a Markdown table with alignment. </paragraph>\n            <paragraph>Following is a table with alignment using Markdown syntax.</paragraph>\n            <paragraph><table classes=\"colwidths-auto\"><tgroup cols=\"3\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><thead><row><entry heading=\"True\"><paragraph>Right   </paragraph></entry><entry heading=\"True\"><paragraph>Center   </paragraph></entry><entry heading=\"True\"><paragraph>Left    </paragraph></entry></row></thead><tbody><row><entry><paragraph>10   </paragraph></entry><entry><paragraph>10   </paragraph></entry><entry><paragraph>10    </paragraph></entry></row><row><entry><paragraph>1000   </paragraph></entry><entry><paragraph>1000   </paragraph></entry><entry><paragraph>1000   </paragraph></entry></row></tbody></tgroup></table></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Table_3\\ (C++\\ class)',\\ '_CPPv47Table_3',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Table_3</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a Markdown table with rowspan and alignment. </paragraph>\n            <paragraph>Following is a table with rowspan and alignment using Markdown syntax.</paragraph>\n            <paragraph><table classes=\"colwidths-auto\"><tgroup cols=\"3\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><thead><row><entry heading=\"True\"><paragraph>Right   </paragraph></entry><entry heading=\"True\"><paragraph>Center   </paragraph></entry><entry heading=\"True\"><paragraph>Left    </paragraph></entry></row></thead><tbody><row><entry morerows=\"1\"><paragraph>10   </paragraph></entry><entry><paragraph>10   </paragraph></entry><entry><paragraph>10    </paragraph></entry></row><row><entry><paragraph>1000   </paragraph></entry><entry><paragraph>1000   </paragraph></entry></row></tbody></tgroup></table></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Table_4\\ (C++\\ class)',\\ '_CPPv47Table_4',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Table_4</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a Markdown table with colspan and alignment. </paragraph>\n            <paragraph>Following is a table with colspan and alignment using Markdown syntax.</paragraph>\n            <paragraph><table classes=\"colwidths-auto\"><tgroup cols=\"3\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><thead><row><entry heading=\"True\"><paragraph>Right   </paragraph></entry><entry heading=\"True\"><paragraph>Center   </paragraph></entry><entry heading=\"True\"><paragraph>Left    </paragraph></entry></row></thead><tbody><row><entry><paragraph>10   </paragraph></entry><entry><paragraph>10   </paragraph></entry><entry><paragraph>10    </paragraph></entry></row><row><entry morecols=\"2\"><paragraph>1000   </paragraph></entry></row></tbody></tgroup></table></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'Table_5\\ (C++\\ class)',\\ '_CPPv47Table_5',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">Table_5</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>This is a Doxygen table. </paragraph>\n            <paragraph>Following is a table using Doxygen syntax (and all supported features).</paragraph>\n            <paragraph><table classes=\"colwidths-auto\"><tgroup cols=\"3\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><thead><row><entry heading=\"True\"><paragraph>Column 1 </paragraph></entry><entry heading=\"True\"><paragraph>Column 2 </paragraph></entry><entry heading=\"True\"><paragraph>Column 3 </paragraph></entry></row></thead><tbody><row><entry morerows=\"1\"><paragraph>cell row=1+2,col=1</paragraph></entry><entry><paragraph>cell row=1,col=2</paragraph></entry><entry><paragraph>cell row=1,col=3 </paragraph></entry></row><row><entry morerows=\"1\"><paragraph>cell row=2+3,col=2 </paragraph></entry><entry><paragraph>cell row=2,col=3 </paragraph></entry></row><row><entry><paragraph>cell row=3,col=1 </paragraph></entry><entry morerows=\"1\"><paragraph>cell row=3+4,col=3 </paragraph></entry></row><row><entry morecols=\"1\"><paragraph>cell row=4,col=1+2 </paragraph></entry></row><row><entry><paragraph>cell row=5,col=1 </paragraph></entry><entry morecols=\"1\"><paragraph>cell row=5,col=2+3 </paragraph></entry></row><row><entry morecols=\"1\" morerows=\"1\"><paragraph>cell row=6+7,col=1+2 </paragraph></entry><entry><paragraph>cell row=6,col=3 </paragraph></entry></row><row><entry><paragraph>cell row=7,col=3 </paragraph></entry></row><row><entry><paragraph>cell row=8,col=1 </paragraph></entry><entry><paragraph>cell row=8,col=2<table classes=\"colwidths-auto\"><tgroup cols=\"2\"><colspec colwidth=\"auto\"></colspec><colspec colwidth=\"auto\"></colspec><tbody><row><entry><paragraph>Inner cell row=1,col=1</paragraph></entry><entry><paragraph>Inner cell row=1,col=2 </paragraph></entry></row><row><entry><paragraph>Inner cell row=2,col=1</paragraph></entry><entry><paragraph>Inner cell row=2,col=2 </paragraph></entry></row></tbody></tgroup></table></paragraph></entry><entry><paragraph>cell row=8,col=3 <bullet_list><list_item><paragraph>Item 1 </paragraph></list_item><list_item><paragraph>Item 2 </paragraph></list_item></bullet_list></paragraph></entry></row></tbody></tgroup></table></paragraph>\n            <paragraph>And this is some more text. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_tables/input.rst",
    "content": ".. doxygenfile:: tables.h\n"
  },
  {
    "path": "tests/data/examples/test_tables/tables.h",
    "content": "/**\n * \\brief This is a simple Markdown table example.\n *\n * Following is a simple table using Markdown syntax.\n *\n * First Header  | Second Header\n * ------------- | -------------\n * Content Cell  | Content Cell\n * Content Cell  | Content Cell\n *\n * And this is some more text.\n */\nclass Table_1\n{\n};\n\n/**\n * \\brief This is a Markdown table with alignment.\n *\n * Following is a table with alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | 1000  | 1000   | 1000  |\n *\n * And this is some more text.\n */\nclass Table_2\n{\n};\n\n/**\n * \\brief This is a Markdown table with rowspan and alignment.\n *\n * Following is a table with rowspan and alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | ^     | 1000   | 1000  |\n *\n * And this is some more text.\n */\nclass Table_3\n{\n};\n\n/**\n * \\brief This is a Markdown table with colspan and alignment.\n *\n * Following is a table with colspan and alignment using Markdown syntax.\n *\n * | Right | Center | Left  |\n * | ----: | :----: | :---- |\n * | 10    | 10     | 10    |\n * | 1000  |||\n *\n * And this is some more text.\n */\nclass Table_4\n{\n};\n\n/**\n * \\brief This is a Doxygen table.\n *\n * Following is a table using Doxygen syntax (and all supported features).\n *\n * <table>\n * <caption id=\"multi_row\">Complex table</caption>\n * <tr><th>Column 1                      <th>Column 2        <th>Column 3\n * <tr><td rowspan=\"2\">cell row=1+2,col=1<td>cell row=1,col=2<td>cell row=1,col=3\n * <tr><td rowspan=\"2\">cell row=2+3,col=2                    <td>cell row=2,col=3\n * <tr><td>cell row=3,col=1                                  <td rowspan=\"2\">cell row=3+4,col=3\n * <tr><td colspan=\"2\">cell row=4,col=1+2\n * <tr><td>cell row=5,col=1              <td colspan=\"2\">cell row=5,col=2+3\n * <tr><td colspan=\"2\" rowspan=\"2\">cell row=6+7,col=1+2      <td>cell row=6,col=3\n * <tr>                                                      <td>cell row=7,col=3\n * <tr><td>cell row=8,col=1              <td>cell row=8,col=2\\n\n *   <table>\n *     <tr><td>Inner cell row=1,col=1<td>Inner cell row=1,col=2\n *     <tr><td>Inner cell row=2,col=1<td>Inner cell row=2,col=2\n *   </table>\n *   <td>cell row=8,col=3\n *   <ul>\n *     <li>Item 1\n *     <li>Item 2\n *   </ul>\n * </table>\n *\n * And this is some more text.\n */\nclass Table_5\n{\n};\n"
  },
  {
    "path": "tests/data/examples/test_template_class_non_type/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'anothertemplateclass\\ (C++\\ class)',\\ '_CPPv4I00_iE20anothertemplateclass',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">U</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">N</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anothertemplateclass</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>a class with three template parameters </paragraph>\n            <field_list>\n                <field>\n                    <field_name>Template Parameters</field_name>\n                    <field_body>\n                        <bullet_list>\n                            <list_item>\n                                <paragraph><literal_strong>T</literal_strong> – this is the first template parameter </paragraph>\n                            </list_item>\n                            <list_item>\n                                <paragraph><literal_strong>U</literal_strong> – this is the second template parameter </paragraph>\n                            </list_item>\n                            <list_item>\n                                <paragraph><literal_strong>N</literal_strong> – this is the third template parameter, it is a non-type parameter </paragraph>\n                            </list_item>\n                        </bullet_list>\n                    </field_body>\n                </field>\n            </field_list>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'anothertemplateclass::anothertemplateclass\\ (C++\\ function)',\\ '_CPPv4N20anothertemplateclass20anothertemplateclassEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anothertemplateclass</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>default constructor </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'anothertemplateclass::anothertemplateclass\\ (C++\\ function)',\\ '_CPPv4N20anothertemplateclass20anothertemplateclassERK1TRK1U',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">inline</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">anothertemplateclass</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I00_iE20anothertemplateclass\" reftitle=\"anothertemplateclass::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">&amp;</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">m1</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I00_iE20anothertemplateclass\" reftitle=\"anothertemplateclass::U\"><desc_sig_name classes=\"n\">U</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">&amp;</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">m2</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>constructor with two template argument </paragraph>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <bullet_list>\n                                        <list_item>\n                                            <paragraph><literal_strong>m1</literal_strong> – first argument </paragraph>\n                                        </list_item>\n                                        <list_item>\n                                            <paragraph><literal_strong>m2</literal_strong> – second argument </paragraph>\n                                        </list_item>\n                                    </bullet_list>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'anothertemplateclass::method\\ (C++\\ function)',\\ '_CPPv4N20anothertemplateclass6methodERK1T',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv4I00_iE20anothertemplateclass\" reftitle=\"anothertemplateclass::U\"><desc_sig_name classes=\"n\">U</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">method</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I00_iE20anothertemplateclass\" reftitle=\"anothertemplateclass::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">const</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">&amp;</desc_sig_punctuation><desc_sig_name classes=\"n sig-param\">t</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>member accepting template argument and returning template argument </paragraph>\n                        <field_list>\n                            <field>\n                                <field_name>Parameters</field_name>\n                                <field_body>\n                                    <paragraph><literal_strong>t</literal_strong> – argument </paragraph>\n                                </field_body>\n                            </field>\n                            <field>\n                                <field_name>Returns</field_name>\n                                <field_body>\n                                    <paragraph>returns value of type U </paragraph>\n                                </field_body>\n                            </field>\n                        </field_list>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_template_class_non_type/input.rst",
    "content": ".. doxygenclass:: anothertemplateclass\n    :members:\n"
  },
  {
    "path": "tests/data/examples/test_template_class_non_type/template_class_non_type.h",
    "content": "/**\n * @brief a class with three template parameters\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n */\ntemplate <typename T, typename U, int N>\nclass anothertemplateclass\n{\npublic:\n  /// default constructor\n  anothertemplateclass() {}\n  \n  /**\n   * @brief constructor with two template argument\n   *\n   * @param m1 first argument\n   * @param m2 second argument\n   */\n  anothertemplateclass(T const & m1, U const & m2) : \n    member1(m1), member2(m2) {}\n    \n  /**\n   * @brief member accepting template argument and returning template argument\n   * \n   * @param t argument\n   * @return returns value of type U\n   */\n  U method(T const & t);\n\n  private:\n    /// a member with templated type\n    T member1;\n    \n    /// another member with templated type\n    U member2;\n};\n"
  },
  {
    "path": "tests/data/examples/test_template_function/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'function1\\ (C++\\ function)',\\ '_CPPv4I0E9function11T1T',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv4I0E9function11T1T\" reftitle=\"function1::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function1</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I0E9function11T1T\" reftitle=\"function1::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">arg1</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a function with one template arguments </paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Template Parameters</field_name>\n                        <field_body>\n                            <paragraph><literal_strong>T</literal_strong> – this is the template parameter</paragraph>\n                        </field_body>\n                    </field>\n                    <field>\n                        <field_name>Parameters</field_name>\n                        <field_body>\n                            <paragraph><literal_strong>arg1</literal_strong> – argument of type T</paragraph>\n                        </field_body>\n                    </field>\n                    <field>\n                        <field_name>Returns</field_name>\n                        <field_body>\n                            <paragraph>return value of type T </paragraph>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'function1&lt;std::string&gt;\\ (C++\\ function)',\\ '_CPPv4IE9function1INSt6stringEENSt6stringENSt6stringE',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function1</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">string</desc_sig_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">arg1</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a function with one template argument specialized for <literal>std::string</literal></paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Parameters</field_name>\n                        <field_body>\n                            <paragraph><literal_strong>arg1</literal_strong> – argument of type <literal>std::string</literal></paragraph>\n                        </field_body>\n                    </field>\n                    <field>\n                        <field_name>Returns</field_name>\n                        <field_body>\n                            <paragraph>return value of type <literal>std::string</literal></paragraph>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'function2\\ (C++\\ function)',\\ '_CPPv4I00_iE9function21T1T1U',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">U</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">N</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><reference internal=\"True\" refid=\"_CPPv4I00_iE9function21T1T1U\" reftitle=\"function2::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function2</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I00_iE9function21T1T1U\" reftitle=\"function2::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">arg1</desc_sig_name></desc_parameter><desc_parameter noemph=\"True\"><reference internal=\"True\" refid=\"_CPPv4I00_iE9function21T1T1U\" reftitle=\"function2::U\"><desc_sig_name classes=\"n\">U</desc_sig_name></reference><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">arg2</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a function with three template arguments </paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Template Parameters</field_name>\n                        <field_body>\n                            <bullet_list>\n                                <list_item>\n                                    <paragraph><literal_strong>T</literal_strong> – this is the first template parameter </paragraph>\n                                </list_item>\n                                <list_item>\n                                    <paragraph><literal_strong>U</literal_strong> – this is the second template parameter </paragraph>\n                                </list_item>\n                                <list_item>\n                                    <paragraph><literal_strong>N</literal_strong> – this is the third template parameter, it is a non-type parameter</paragraph>\n                                </list_item>\n                            </bullet_list>\n                        </field_body>\n                    </field>\n                    <field>\n                        <field_name>Parameters</field_name>\n                        <field_body>\n                            <bullet_list>\n                                <list_item>\n                                    <paragraph><literal_strong>arg1</literal_strong> – first argument of type T </paragraph>\n                                </list_item>\n                                <list_item>\n                                    <paragraph><literal_strong>arg2</literal_strong> – second argument of type U</paragraph>\n                                </list_item>\n                            </bullet_list>\n                        </field_body>\n                    </field>\n                    <field>\n                        <field_name>Returns</field_name>\n                        <field_body>\n                            <paragraph>return value of type T </paragraph>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'function3\\ (C++\\ function)',\\ '_CPPv4I00_iE9function3vv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">function3</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a function with unnamed arguments and an argument with a default value </paragraph>\n            </desc_content>\n        </desc>\n    </container>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_template_function/input.rst",
    "content": ".. doxygenfile:: template_function.h\n"
  },
  {
    "path": "tests/data/examples/test_template_function/template_function.h",
    "content": "#include <string>\n\n/**\n * @brief a function with one template arguments\n * \n * @tparam T this is the template parameter\n * \n * @param arg1 argument of type T\n * \n * @return return value of type T\n */\ntemplate <typename T>\nT function1(T arg1)\n{}\n\n\n/**\n * @brief a function with one template argument specialized for `std::string`\n *\n * @param arg1 argument of type `std::string`\n *\n * @return return value of type `std::string`\n */\ntemplate <>\nstd::string function1<std::string>(std::string arg1)\n{}\n\n\n/**\n * @brief a function with three template arguments\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n * \n * @param arg1 first argument of type T\n * @param arg2 second argument of type U\n * \n * @return return value of type T\n */\ntemplate <typename T, typename U, int N>\nT function2(T arg1, U arg2)\n{}\n\n/**\n * @brief a function with unnamed arguments and an argument with a default\n * value\n */\ntemplate <typename T=void, typename, int>\nvoid function3()\n{}\n\n"
  },
  {
    "path": "tests/data/examples/test_template_type_alias/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <container classes=\"breathe-sectiondef\" objtype=\"typedef\">\n        <rubric classes=\"breathe-sectiondef-title\">Typedefs</rubric>\n        <index entries=\"['single',\\ 'IsFuzzy\\ (C++\\ type)',\\ '_CPPv4I0E7IsFuzzy',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">using</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">IsFuzzy</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">is_fuzzy</desc_sig_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><reference internal=\"True\" refid=\"_CPPv4I0E7IsFuzzy\" reftitle=\"IsFuzzy::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a type alias with one template argument </paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Template Parameters</field_name>\n                        <field_body>\n                            <paragraph><literal_strong>T</literal_strong> – this is the template parameter </paragraph>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'IsFurry\\ (C++\\ type)',\\ '_CPPv4I00_iE7IsFurry',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><desc_sig_keyword classes=\"k\">template</desc_sig_keyword><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">T</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword classes=\"k\">typename</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">U</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">N</desc_sig_name></desc_name><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">using</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">IsFurry</desc_sig_name></desc_name><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_punctuation classes=\"p\">=</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n\">std</desc_sig_name><desc_sig_punctuation classes=\"p\">::</desc_sig_punctuation><desc_sig_name classes=\"n\">is_furry</desc_sig_name><desc_sig_punctuation classes=\"p\">&lt;</desc_sig_punctuation><reference internal=\"True\" refid=\"_CPPv4I00_iE7IsFurry\" reftitle=\"IsFurry::T\"><desc_sig_name classes=\"n\">T</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv4I00_iE7IsFurry\" reftitle=\"IsFurry::U\"><desc_sig_name classes=\"n\">U</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">,</desc_sig_punctuation><desc_sig_space classes=\"w\"> </desc_sig_space><reference internal=\"True\" refid=\"_CPPv4I00_iE7IsFurry\" reftitle=\"IsFurry::N\"><desc_sig_name classes=\"n\">N</desc_sig_name></reference><desc_sig_punctuation classes=\"p\">&gt;</desc_sig_punctuation></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>a type alias with three template arguments </paragraph>\n                <field_list>\n                    <field>\n                        <field_name>Template Parameters</field_name>\n                        <field_body>\n                            <bullet_list>\n                                <list_item>\n                                    <paragraph><literal_strong>T</literal_strong> – this is the first template parameter </paragraph>\n                                </list_item>\n                                <list_item>\n                                    <paragraph><literal_strong>U</literal_strong> – this is the second template parameter </paragraph>\n                                </list_item>\n                                <list_item>\n                                    <paragraph><literal_strong>N</literal_strong> – this is the third template parameter, it is a non-type parameter </paragraph>\n                                </list_item>\n                            </bullet_list>\n                        </field_body>\n                    </field>\n                </field_list>\n            </desc_content>\n        </desc>\n    </container>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_template_type_alias/input.rst",
    "content": ".. doxygenfile:: template_type_alias.h\n"
  },
  {
    "path": "tests/data/examples/test_template_type_alias/template_type_alias.h",
    "content": "/**\n * @brief a type alias with one template argument\n * \n * @tparam T this is the template parameter\n * \n */\ntemplate <typename T>\nusing IsFuzzy = std::is_fuzzy<T>;\n\n\n/**\n * @brief a type alias with three template arguments\n * \n * @tparam T this is the first template parameter\n * @tparam U this is the second template parameter\n * @tparam N this is the third template parameter, it is a non-type parameter\n * \n */\ntemplate <typename T, typename U, int N>\nusing IsFurry = std::is_furry<T,U,N>;\n"
  },
  {
    "path": "tests/data/examples/test_union/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'SeparateUnion\\ (C++\\ union)',\\ '_CPPv413SeparateUnion',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp union\" desctype=\"union\" domain=\"cpp\" objtype=\"union\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">union</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">SeparateUnion</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A union of two values. </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                <index entries=\"['single',\\ 'SeparateUnion::size\\ (C++\\ member)',\\ '_CPPv4N13SeparateUnion4sizeE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">size</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>The size of the thing. </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'SeparateUnion::depth\\ (C++\\ member)',\\ '_CPPv4N13SeparateUnion5depthE',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">float</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">depth</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>How deep it is. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'foo\\ (C++\\ type)',\\ '_CPPv43foo',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp type\" desctype=\"type\" domain=\"cpp\" objtype=\"type\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">namespace</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">foo</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <index entries=\"['single',\\ 'foo::MyUnion\\ (C++\\ union)',\\ '_CPPv4N3foo7MyUnionE',\\ '',\\ None]\"></index>\n            <desc classes=\"cpp union\" desctype=\"union\" domain=\"cpp\" objtype=\"union\">\n                <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">union</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">MyUnion</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                <desc_content>\n                    <paragraph>A union of two values. </paragraph>\n                    <container classes=\"breathe-sectiondef\" objtype=\"public-attrib\">\n                        <rubric classes=\"breathe-sectiondef-title\">Public Members</rubric>\n                        <index entries=\"['single',\\ 'foo::MyUnion::someInt\\ (C++\\ member)',\\ '_CPPv4N3foo7MyUnion7someIntE',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">someInt</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>The int of it all. </paragraph>\n                            </desc_content>\n                        </desc>\n                        <index entries=\"['single',\\ 'foo::MyUnion::someFloat\\ (C++\\ member)',\\ '_CPPv4N3foo7MyUnion9someFloatE',\\ '',\\ None]\"></index>\n                        <desc classes=\"cpp var\" desctype=\"var\" domain=\"cpp\" objtype=\"var\">\n                            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">float</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">someFloat</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n                            <desc_content>\n                                <paragraph>The float side of things. </paragraph>\n                            </desc_content>\n                        </desc>\n                    </container>\n                </desc_content>\n            </desc>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_union/input.rst",
    "content": ".. doxygenunion:: SeparateUnion\n.. doxygennamespace:: foo\n"
  },
  {
    "path": "tests/data/examples/test_union/union.h",
    "content": "\n\n/// A union of two values\nunion SeparateUnion\n{\n    int size;     ///< The size of the thing\n    float depth;  ///< How deep it is\n};\n\n\nnamespace foo {\n\n/// A union of two values\nunion MyUnion\n{\n    int someInt;      ///< The int of it all\n    float someFloat;  ///< The float side of things\n};\n\n}\n\n/// A class with a union\nclass ClassWithUnion\n{\n    /// A union with two values\n    union UnionInClass\n    {\n        int intvalue;       ///< An int value\n        float floatvalue;   ///< A float value\n    };\n\n    /// Documented class\n    class ExtraClass\n    {\n        int a_member;\n        float another_member;\n    };\n};\n"
  },
  {
    "path": "tests/data/examples/test_userdefined/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <index entries=\"['single',\\ 'UserDefinedGroupTest\\ (C++\\ class)',\\ '_CPPv420UserDefinedGroupTest',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp class\" desctype=\"class\" domain=\"cpp\" objtype=\"class\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword classes=\"k\">class</desc_sig_keyword><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">UserDefinedGroupTest</desc_sig_name></desc_name></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>A class. </paragraph>\n            <paragraph>More details about the <reference internal=\"True\" refid=\"class_user_defined_group_test\"><inline classes=\"std std-ref\">UserDefinedGroupTest</inline></reference> class </paragraph>\n            <container classes=\"breathe-sectiondef\" objtype=\"user-defined\">\n                <rubric classes=\"breathe-sectiondef-title\">Custom Group</rubric>\n                <paragraph>Description of custom group </paragraph>\n                <index entries=\"['single',\\ 'UserDefinedGroupTest::func1InCustomGroup\\ (C++\\ function)',\\ '_CPPv4N20UserDefinedGroupTest18func1InCustomGroupEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">func1InCustomGroup</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Function 1 in custom group. </paragraph>\n                        <paragraph>Details. </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'UserDefinedGroupTest::func2InCustomGroup\\ (C++\\ function)',\\ '_CPPv4N20UserDefinedGroupTest18func2InCustomGroupEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">func2InCustomGroup</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Function 2 in custom group. </paragraph>\n                        <paragraph>Details. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n            <container classes=\"breathe-sectiondef\" objtype=\"public-func\">\n                <rubric classes=\"breathe-sectiondef-title\">Public Functions</rubric>\n                <index entries=\"['single',\\ 'UserDefinedGroupTest::func1InGroup1\\ (C++\\ function)',\\ '_CPPv4N20UserDefinedGroupTest13func1InGroup1Ev',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">func1InGroup1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Same documentation for both members. </paragraph>\n                        <paragraph>Details </paragraph>\n                    </desc_content>\n                </desc>\n                <index entries=\"['single',\\ 'UserDefinedGroupTest::ungroupedFunction\\ (C++\\ function)',\\ '_CPPv4N20UserDefinedGroupTest17ungroupedFunctionEv',\\ '',\\ None]\"></index>\n                <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n                    <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">ungroupedFunction</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n                    <desc_content>\n                        <paragraph>Function without group. </paragraph>\n                        <paragraph>Details. </paragraph>\n                    </desc_content>\n                </desc>\n            </container>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_userdefined/input.rst",
    "content": ".. doxygenclass:: UserDefinedGroupTest\n    :members:\n    :protected-members:\n"
  },
  {
    "path": "tests/data/examples/test_userdefined/userdefined.h",
    "content": "// Example from Doxygen documentation\n\n/** A class. More details about the UserDefinedGroupTest class */\nclass UserDefinedGroupTest\n{\n  public:\n    //@{\n    /** Same documentation for both members. Details */\n    void func1InGroup1();\n    void func2InGroup1();\n    //@}\n\n    /** Function without group. Details. */\n    void ungroupedFunction();\n    void func1InCustomGroup();\n  protected:\n    void func2InCustomGroup();\n};\n\nvoid UserDefinedGroupTest::func1InGroup1() {}\nvoid UserDefinedGroupTest::func2InGroup1() {}\n\n/** @name Custom Group\n *  Description of custom group\n */\n//@{\n/** Function 2 in custom group. Details. */\nvoid UserDefinedGroupTest::func2InCustomGroup() {}\n/** Function 1 in custom group. Details. */\nvoid UserDefinedGroupTest::func1InCustomGroup() {}\n//@}\n"
  },
  {
    "path": "tests/data/examples/test_xrefsect/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet href=\"../../docutils.css\"?>\n<document>\n    <paragraph>A few examples of xrefsect items support. </paragraph>\n    <container classes=\"breathe-sectiondef\" objtype=\"func\">\n        <rubric classes=\"breathe-sectiondef-title\">Functions</rubric>\n        <index entries=\"['single',\\ 'unimplemented\\ (C++\\ function)',\\ '_CPPv413unimplementedv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">unimplemented</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>An example of using Doxygen’s todo command. </paragraph>\n                <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><reference internal=\"True\" refid=\"todo_1_todo000001\"><inline classes=\"std std-ref\">Todo:</inline></reference></desc_signature><desc_content><paragraph>Implement this function. </paragraph></desc_content></desc></paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'buggy_function\\ (C++\\ function)',\\ '_CPPv414buggy_functioni',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">buggy_function</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">int</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_sig_name classes=\"n sig-param\">param</desc_sig_name></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>An example of using Doxygen’s bug and test commands. </paragraph>\n                <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><reference internal=\"True\" refid=\"bug_1_bug000001\"><inline classes=\"std std-ref\">Bug:</inline></reference></desc_signature><desc_content><paragraph>Does not work yet.</paragraph></desc_content></desc></paragraph>\n                <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><reference internal=\"True\" refid=\"test_1_test000001\"><inline classes=\"std std-ref\">Test:</inline></reference></desc_signature><desc_content><paragraph>Add proper unit testing first. </paragraph></desc_content></desc></paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'old_function\\ (C++\\ function)',\\ '_CPPv412old_functionv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">old_function</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>An example of using Doxygen’s deprecated command. </paragraph>\n                <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><reference internal=\"True\" refid=\"deprecated_1_deprecated000001\"><inline classes=\"std std-ref\">Deprecated:</inline></reference></desc_signature><desc_content><paragraph>Should not be used on new code. </paragraph></desc_content></desc></paragraph>\n            </desc_content>\n        </desc>\n        <index entries=\"['single',\\ 'sample_xrefitem_function\\ (C++\\ function)',\\ '_CPPv424sample_xrefitem_functionv',\\ '',\\ None]\"></index>\n        <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n            <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">sample_xrefitem_function</desc_sig_name></desc_name><desc_parameterlist><desc_parameter noemph=\"True\"><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type></desc_parameter></desc_parameterlist></desc_signature_line></desc_signature>\n            <desc_content>\n                <paragraph>An example of a custom Doxygen xrefitem declared as an ALIAS. </paragraph>\n                <paragraph><desc domain=\"cpp\" objtype=\"xrefsect\"><desc_signature classes=\"sig sig-object cpp\"><reference internal=\"True\" refid=\"xrefsample_1_xrefsample000001\"><inline classes=\"std std-ref\">xref Sample:</inline></reference></desc_signature><desc_content><paragraph>This text shows up in the xref output. </paragraph></desc_content></desc></paragraph>\n            </desc_content>\n        </desc>\n    </container>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">Todo List</desc_name></desc_signature>\n        <desc_content>\n            <paragraph><desc domain=\"cpp\" objtype=\"varentry\"><desc_signature classes=\"sig sig-object cpp\">Member <reference internal=\"True\" refid=\"xrefsect_8h_1aaabc1fc395849c996ef721dee24a4d15\"><inline classes=\"std std-ref\">unimplemented</inline></reference>  (void)</desc_signature><desc_content><paragraph><target></target>Implement this function. </paragraph></desc_content></desc></paragraph>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">Bug List</desc_name></desc_signature>\n        <desc_content>\n            <paragraph><desc domain=\"cpp\" objtype=\"varentry\"><desc_signature classes=\"sig sig-object cpp\">Member <reference internal=\"True\" refid=\"xrefsect_8h_1a4af8f2780237883e0fd8ce8c7cda364a\"><inline classes=\"std std-ref\">buggy_function</inline></reference>  (int param)</desc_signature><desc_content><paragraph><target></target>Does not work yet.</paragraph></desc_content></desc></paragraph>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">Test List</desc_name></desc_signature>\n        <desc_content>\n            <paragraph><desc domain=\"cpp\" objtype=\"varentry\"><desc_signature classes=\"sig sig-object cpp\">Member <reference internal=\"True\" refid=\"xrefsect_8h_1a4af8f2780237883e0fd8ce8c7cda364a\"><inline classes=\"std std-ref\">buggy_function</inline></reference>  (int param)</desc_signature><desc_content><paragraph><target></target>Add proper unit testing first. </paragraph></desc_content></desc></paragraph>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">Deprecated List</desc_name></desc_signature>\n        <desc_content>\n            <paragraph><desc domain=\"cpp\" objtype=\"varentry\"><desc_signature classes=\"sig sig-object cpp\">Member <reference internal=\"True\" refid=\"xrefsect_8h_1a726ec28ea097364e46ca633d7f33596c\"><inline classes=\"std std-ref\">old_function</inline></reference>  (void)</desc_signature><desc_content><paragraph><target></target>Should not be used on new code. </paragraph></desc_content></desc></paragraph>\n        </desc_content>\n    </desc>\n    <desc domain=\"cpp\" objtype=\"page\">\n        <desc_signature classes=\"sig sig-object cpp\"><target></target><emphasis>page</emphasis> <desc_name classes=\"sig-name descname\">xref Sample</desc_name></desc_signature>\n        <desc_content>\n            <paragraph><desc domain=\"cpp\" objtype=\"varentry\"><desc_signature classes=\"sig sig-object cpp\">Member <reference internal=\"True\" refid=\"xrefsect_8h_1a1d47f2d2bb9f6df76e98126ba67d012d\"><inline classes=\"std std-ref\">sample_xrefitem_function</inline></reference>  (void)</desc_signature><desc_content><paragraph><target></target> This text shows up in the xref output. </paragraph></desc_content></desc></paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/examples/test_xrefsect/extra_dox_opts.txt",
    "content": "ALIASES = \"xrefsample=\\xrefitem xrefsample \\\"xref Sample\\\" \\\"xref Sample\\\" \"\n"
  },
  {
    "path": "tests/data/examples/test_xrefsect/input.rst",
    "content": ".. doxygenfile:: xrefsect.h\n\n.. doxygenpage:: todo\n.. doxygenpage:: bug\n.. doxygenpage:: test\n.. doxygenpage:: deprecated\n.. doxygenpage:: xrefsample\n"
  },
  {
    "path": "tests/data/examples/test_xrefsect/xrefsect.h",
    "content": "/**\n *  @file xrefsect.h\n *  A few examples of xrefsect items support.\n */\n\n/**\n * An example of using Doxygen's todo command.\n *\n * @todo Implement this function.\n */\nint unimplemented(void);\n\n/**\n * An example of using Doxygen's bug and test commands.\n *\n * @bug Does not work yet.\n *\n * @test Add proper unit testing first.\n */\nvoid buggy_function(int param);\n\n/**\n * An example of using Doxygen's deprecated command.\n *\n * @deprecated Should not be used on new code.\n */\nvoid old_function(void);\n\n/**\n * An example of a custom Doxygen xrefitem declared as an ALIAS.\n *\n * @xrefsample This text shows up in the xref output.\n */\nvoid sample_xrefitem_function(void);\n"
  },
  {
    "path": "tests/data/multi_project/A/stuff.h",
    "content": "\n/**\n * Doc for fun1 in project A\n */\nvoid fun1();\n\n/**\n * Doc for fun2 in project A\n */\nvoid fun2();\n\n/**\n * Unique function for project A\n */\nvoid funA();\n\n"
  },
  {
    "path": "tests/data/multi_project/B/stuff.h",
    "content": "\n/**\n * Doc for fun1 in project B\n */\nvoid fun1();\n\n/**\n * Doc for fun2 in project B\n */\nvoid fun2();\n\n/**\n * Unique function for project B\n */\nvoid funB();\n\n"
  },
  {
    "path": "tests/data/multi_project/C/stuff.h",
    "content": "\n/**\n * Doc for fun1 in project C\n */\nvoid fun1();\n\n/**\n * Doc for fun2 in project C\n */\nvoid fun2();\n\n/**\n * Unique function for project C\n */\nvoid funC();\n\n"
  },
  {
    "path": "tests/data/multi_project/compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<document>\n    <index entries=\"['single',\\ 'fun1\\ (C++\\ function)',\\ '_CPPv44fun1v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun1 in project A. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'fun1\\ (C++\\ function)',\\ '_CPPv44fun1v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun1 in project B. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'fun1\\ (C++\\ function)',\\ '_CPPv44fun1v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun1</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun1 in project C. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'fun2\\ (C++\\ function)',\\ '_CPPv44fun2v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun2 in project A. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'fun2\\ (C++\\ function)',\\ '_CPPv44fun2v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun2 in project B. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'fun2\\ (C++\\ function)',\\ '_CPPv44fun2v',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">fun2</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Doc for fun2 in project C. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'funA\\ (C++\\ function)',\\ '_CPPv44funAv',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">funA</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Unique function for project A. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'funB\\ (C++\\ function)',\\ '_CPPv44funBv',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">funB</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Unique function for project B. </paragraph>\n        </desc_content>\n    </desc>\n    <index entries=\"['single',\\ 'funC\\ (C++\\ function)',\\ '_CPPv44funCv',\\ '',\\ None]\"></index>\n    <desc classes=\"cpp function\" desctype=\"function\" domain=\"cpp\" objtype=\"function\">\n        <desc_signature classes=\"sig sig-object cpp\"><desc_signature_line><target></target><desc_sig_keyword_type classes=\"kt\">void</desc_sig_keyword_type><desc_sig_space classes=\"w\"> </desc_sig_space><desc_name classes=\"sig-name descname\"><desc_sig_name classes=\"n\">funC</desc_sig_name></desc_name><desc_parameterlist></desc_parameterlist></desc_signature_line></desc_signature>\n        <desc_content>\n            <paragraph>Unique function for project C. </paragraph>\n        </desc_content>\n    </desc>\n</document>\n"
  },
  {
    "path": "tests/data/multi_project/input.rst",
    "content": ".. doxygenfunction:: fun1\n    :project: A\n\n.. doxygenfunction:: fun1\n    :project: B\n\n.. doxygenfunction:: fun1\n    :path: {project_c_path}\n\n.. doxygenfunction:: fun2\n    :project: A\n\n.. doxygenfunction:: fun2\n    :project: B\n\n.. doxygenfunction:: fun2\n    :path: {project_c_path}\n\n.. doxygenfunction:: funA\n    :project: A\n\n.. doxygenfunction:: funB\n    :project: B\n\n.. doxygenfunction:: funC\n    :path: {project_c_path}\n\n"
  },
  {
    "path": "tests/runtests.sh",
    "content": "#!/bin/sh\n\nexport PYTHONPATH=\"../${PYTHONPATH:+:$PYTHONPATH}\"\n\npython3 -m pytest -v\n"
  },
  {
    "path": "tests/test_examples.py",
    "content": "from __future__ import annotations\n\nimport dataclasses\nimport enum\nimport os\nimport pathlib\nimport shutil\nimport subprocess\nfrom typing import TYPE_CHECKING\nfrom xml.parsers import expat\n\nimport pytest\nimport sphinx\n\nfrom breathe.process import AutoDoxygenProcessHandle\n\nif TYPE_CHECKING:\n    from typing import Any\n\nsphinx_path: Any\n\nif sphinx.version_info < (7, 2, 0):\n    from sphinx.testing.path import path as sphinx_path\nelse:\n    sphinx_path = pathlib.Path\n\n\nC_FILE_SUFFIXES = frozenset((\".h\", \".c\", \".hpp\", \".cpp\"))\nIGNORED_ELEMENTS: frozenset[str] = frozenset(())\n\nBUFFER_SIZE = 0x1000\n\nTEST_DATA_DIR = pathlib.Path(__file__).parent / \"data\"\n\n# if this is changed, tests/data/examples/README.rst should be updated\nDEFAULT_CONF = {\n    \"project\": \"test\",\n    \"breathe_default_project\": \"example\",\n    \"breathe_show_include\": False,\n    \"extensions\": [\"breathe\", \"sphinx.ext.graphviz\"],\n}\n\nDOXYGEN_CACHE_KEY = \"BREATHE_DOXYGEN_TEST_CACHE\"\n\n\nclass XMLEventType(enum.Enum):\n    E_START = enum.auto()\n    E_END = enum.auto()\n    E_TEXT = enum.auto()\n\n\n@dataclasses.dataclass\nclass XMLElement:\n    name: str\n    attr: dict[str, str]\n    line_no: int\n    column_no: int\n\n\n@dataclasses.dataclass\nclass XMLElementEnd:\n    line_no: int\n    column_no: int\n\n\n@dataclasses.dataclass\nclass XMLTextElement:\n    value: str\n    line_no: int\n    column_no: int\n\n\ndef xml_stream(infile):\n    \"\"\"XML pull parser.\n\n    This is similar to xml.dom.pulldom.parse, except the locations of the\n    elements are tracked.\"\"\"\n    p = expat.ParserCreate()\n\n    pending_events = []\n    pending_text = \"\"\n\n    def dispatch_text():\n        nonlocal pending_text\n\n        if pending_text:\n            pending_events.append((\n                XMLEventType.E_TEXT,\n                XMLTextElement(pending_text, p.CurrentLineNumber, p.CurrentColumnNumber),\n            ))\n            pending_text = \"\"\n\n    def handle_start(name, attr):\n        dispatch_text()\n\n        pending_events.append((\n            XMLEventType.E_START,\n            XMLElement(name, attr, p.CurrentLineNumber, p.CurrentColumnNumber),\n        ))\n\n    p.StartElementHandler = handle_start\n\n    def handle_end(_):\n        dispatch_text()\n        pending_events.append((\n            XMLEventType.E_END,\n            XMLElementEnd(p.CurrentLineNumber, p.CurrentColumnNumber),\n        ))\n\n    p.EndElementHandler = handle_end\n\n    def handle_text(data):\n        nonlocal pending_text\n        pending_text += data\n\n    p.CharacterDataHandler = handle_text\n\n    while True:\n        data = infile.read(BUFFER_SIZE)\n        if not data:\n            dispatch_text()\n            p.Parse(data, True)\n            yield from pending_events\n            break\n        p.Parse(data, False)\n        if pending_events:\n            yield from pending_events\n            pending_events.clear()\n\n\ndef get_individual_tests():\n    return (TEST_DATA_DIR / \"examples\").glob(\"test_*\")\n\n\ndef filtered_xml(infile):\n    ignore = 0\n    for event, node in xml_stream(infile):\n        if event == XMLEventType.E_START:\n            if ignore or node.name in IGNORED_ELEMENTS:\n                ignore += 1\n            else:\n                yield event, node\n        elif event == XMLEventType.E_END:\n            if ignore:\n                ignore -= 1\n            else:\n                yield event, node\n        else:\n            if not ignore:\n                text = node.value.strip()\n                if text:\n                    node.value = text\n                    yield event, node\n\n\ndef conf_overrides(extra):\n    conf = DEFAULT_CONF.copy()\n    conf.update(extra)\n    return conf\n\n\ndef str_to_set(x):\n    return frozenset(x.split())\n\n\ndef attr_compare(name, actual, expected):\n    if name == \"classes\":\n        return str_to_set(actual) >= str_to_set(expected)\n\n    return actual == expected\n\n\n@dataclasses.dataclass\nclass VersionedFile:\n    file: str\n    version: tuple[int, ...]\n\n\n@dataclasses.dataclass\nclass DoxygenExe(VersionedFile):\n    template: str\n\n\ndef str_to_version(v_str):\n    return tuple(map(int, v_str.strip().split(\".\")))\n\n\ndef versioned_model(p):\n    return VersionedFile(str(p), str_to_version(str(p.name)[len(\"compare-\") : -len(\".xml\")]))\n\n\ndef compare_xml(generated, input_dir, version):\n    alt_models = list(map(versioned_model, input_dir.glob(\"compare-*.xml\")))\n    alt_models.sort(key=(lambda f: f.version), reverse=True)\n\n    model = input_dir / \"compare.xml\"\n    for alt_m in alt_models:\n        if version >= alt_m.version:\n            model = alt_m.file\n            break\n\n    event_str = {\n        XMLEventType.E_START: \"element start\",\n        XMLEventType.E_END: \"element end\",\n        XMLEventType.E_TEXT: \"text\",\n    }\n\n    with open(generated, encoding=\"utf-8\") as o_file, open(model, encoding=\"utf-8\") as c_file:\n        for o, c in zip(filtered_xml(o_file), filtered_xml(c_file)):\n            o_type, o_node = o\n            c_type, c_node = c\n            assert o_type == c_type, (\n                f\"at line {o_node.line_no}: found {event_str[o_type]} when expecting {event_str[c_type]}\"  # noqa: E501\n            )\n\n            if o_type == XMLEventType.E_START:\n                assert o_node.name == c_node.name, (\n                    f\"wrong tag at line {o_node.line_no}: expected {c_node.name}, found {o_node.name}\"  # noqa: E501\n                )\n\n                # ignore extra attributes in o_node\n                for key, value in c_node.attr.items():\n                    if (\n                        c_node.name == \"desc_inline\"\n                        and key == \"domain\"\n                        and sphinx.version_info[0] < 6\n                    ):\n                        # prior to Sphinx 6, this attribute was not present\n                        continue\n\n                    assert key in o_node.attr, f\"missing attribute at line {o_node.line_no}: {key}\"\n                    o_value = o_node.attr[key]\n                    assert attr_compare(key, o_value, value), (\n                        f'wrong value for attribute \"{key}\" at line {o_node.line_no}: expected \"{value}\", found \"{o_value}\"'  # noqa: E501\n                    )\n            elif o_type == XMLEventType.E_TEXT:\n                assert o_node.value == c_node.value, (\n                    f'wrong content at line {o_node.line_no}: expected \"{c_node.value}\", found \"{o_node.value}\"'  # noqa: E501\n                )\n\n\n@pytest.fixture(scope=\"module\")\ndef doxygen_cache():\n    dc = os.environ.get(DOXYGEN_CACHE_KEY)\n    if not dc:\n        return None\n    return pathlib.Path(dc).absolute()\n\n\n@pytest.fixture(scope=\"module\")\ndef doxygen(doxygen_cache):\n    if doxygen_cache is None:\n        exc = shutil.which(\"doxygen\")\n        if not exc:\n            raise ValueError(\"cannot find doxygen executable\")\n\n        v_str = subprocess.run(\n            [exc, \"--version\"],\n            check=True,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.STDOUT,\n            encoding=\"utf-8\",\n        ).stdout\n    else:\n        exc = \"\"\n        v_str = (doxygen_cache / \"version.txt\").read_text(encoding=\"utf-8\")\n\n    return DoxygenExe(\n        exc,\n        str_to_version(v_str.split()[0]),\n        (TEST_DATA_DIR / \"examples\" / \"doxyfile_template\").read_text(encoding=\"utf-8\"),\n    )\n\n\ndef run_doxygen_with_template(doxygen, tmp_path, cache, example_name, output_name):\n    doxyfile = tmp_path / \"Doxyfile\"\n    doxycontent = doxygen.template.format(output=tmp_path)\n    extra_opts = pathlib.Path(\"extra_dox_opts.txt\")\n    if extra_opts.exists():\n        doxycontent += extra_opts.read_text(encoding=\"utf-8\")\n    doxyfile.write_text(doxycontent, encoding=\"utf-8\")\n\n    if cache is not None:\n        # instead of passing a different path to breathe_projects.example, the\n        # folder is copied to the same place it would be without caching so that\n        # all paths in the generated output remain the same\n        shutil.copytree(cache / example_name / output_name, tmp_path / output_name)\n    else:\n        subprocess.run([doxygen.file, doxyfile], check=True)\n        if output_name != \"xml\":\n            os.rename(tmp_path / \"xml\", tmp_path / output_name)\n\n\ndef run_sphinx_and_compare(make_app, tmp_path, test_input, overrides, version):\n    dest = tmp_path / \"conf.py\"\n    ec = pathlib.Path(\"extra_conf.py\")\n    if ec.exists():\n        shutil.copyfile(ec, dest)\n    else:\n        dest.touch()\n\n    make_app(\n        buildername=\"xml\",\n        srcdir=sphinx_path(tmp_path),\n        confoverrides=conf_overrides(overrides),\n    ).build()\n\n    compare_xml(tmp_path / \"_build\" / \"xml\" / \"index.xml\", test_input, version)\n\n\n@pytest.mark.parametrize(\"test_input\", get_individual_tests(), ids=(lambda x: x.name[5:]))\ndef test_example(make_app, tmp_path, test_input, monkeypatch, doxygen, doxygen_cache):\n    monkeypatch.chdir(test_input)\n\n    run_doxygen_with_template(doxygen, tmp_path, doxygen_cache, test_input.name, \"xml\")\n    shutil.copyfile(test_input / \"input.rst\", tmp_path / \"index.rst\")\n    run_sphinx_and_compare(\n        make_app,\n        tmp_path,\n        test_input,\n        {\"breathe_projects\": {\"example\": str(tmp_path / \"xml\")}},\n        doxygen.version,\n    )\n\n\ndef test_auto(make_app, tmp_path, monkeypatch, doxygen, doxygen_cache):\n    test_input = TEST_DATA_DIR / \"auto\"\n    monkeypatch.chdir(test_input)\n\n    if doxygen_cache is not None:\n        xml_path = str(doxygen_cache / \"auto\" / \"xml\")\n        monkeypatch.setattr(AutoDoxygenProcessHandle, \"process\", (lambda *args, **kwds: xml_path))\n\n    shutil.copyfile(test_input / \"input.rst\", tmp_path / \"index.rst\")\n    run_sphinx_and_compare(\n        make_app,\n        tmp_path,\n        test_input,\n        {\n            \"breathe_projects_source\": {\n                \"example\": (str(test_input.absolute()), [\"auto_class.h\", \"auto_function.h\"])\n            }\n        },\n        doxygen.version,\n    )\n\n\ndef test_multiple_projects(make_app, tmp_path, monkeypatch, doxygen, doxygen_cache):\n    test_input = TEST_DATA_DIR / \"multi_project\"\n\n    for c in \"ABC\":\n        monkeypatch.chdir(test_input / c)\n        run_doxygen_with_template(doxygen, tmp_path, doxygen_cache, f\"multi_project.{c}\", f\"xml{c}\")\n\n    (tmp_path / \"index.rst\").write_text(\n        (test_input / \"input.rst\")\n        .read_text(encoding=\"utf-8\")\n        .format(project_c_path=str(tmp_path / \"xmlC\")),\n        encoding=\"utf-8\",\n    )\n    run_sphinx_and_compare(\n        make_app,\n        tmp_path,\n        test_input,\n        {\"breathe_projects\": {\"A\": str(tmp_path / \"xmlA\"), \"B\": str(tmp_path / \"xmlB\")}},\n        doxygen.version,\n    )\n"
  },
  {
    "path": "tests/test_filters.py",
    "content": "from __future__ import annotations\n\nimport os.path\nfrom typing import NamedTuple\n\nimport pytest\n\nfrom breathe import parser\nfrom breathe.renderer import TaggedNode, filter\n\nDEFAULT_OPTS = {\"path\": \"\", \"project\": \"\", \"membergroups\": \"\", \"show\": \"\"}\n\n\n@pytest.fixture(scope=\"module\")\ndef class_doc():\n    with open(os.path.join(os.path.dirname(__file__), \"data\", \"classSample.xml\"), \"rb\") as fid:\n        return parser.parse_file(fid).value\n\n\nclass SampleMembers(NamedTuple):\n    public_field: filter.NodeStack\n    public_method: filter.NodeStack\n    protected_field: filter.NodeStack\n    protected_method: filter.NodeStack\n    private_field: filter.NodeStack\n    private_method: filter.NodeStack\n\n\n@pytest.fixture\ndef members(class_doc):\n    common = [TaggedNode(None, class_doc.compounddef[0]), TaggedNode(None, class_doc)]\n\n    memberdefs = {}\n\n    for sect in class_doc.compounddef[0].sectiondef:\n        member = sect.memberdef[0]\n        memberdefs[member.name] = filter.NodeStack(\n            [TaggedNode(None, member), TaggedNode(None, sect)] + common\n        )\n\n    return SampleMembers(\n        memberdefs[\"public_field\"],\n        memberdefs[\"public_method\"],\n        memberdefs[\"protected_field\"],\n        memberdefs[\"protected_method\"],\n        memberdefs[\"private_field\"],\n        memberdefs[\"private_method\"],\n    )\n\n\ndef create_class_filter(app, extra_ops):\n    opts = DEFAULT_OPTS.copy()\n    opts.update(extra_ops)\n    return filter.create_class_filter(app, \"Sample\", opts)\n\n\ndef test_members(app, members):\n    app.config.breathe_default_members = []\n\n    filter = create_class_filter(app, {})\n\n    assert not filter(members.public_field)\n    assert not filter(members.public_method)\n    assert not filter(members.protected_field)\n    assert not filter(members.protected_method)\n    assert not filter(members.private_field)\n    assert not filter(members.private_method)\n\n\nbools = (True, False)\n\n\n@pytest.mark.parametrize(\"public\", bools)\n@pytest.mark.parametrize(\"private\", bools)\n@pytest.mark.parametrize(\"protected\", bools)\n@pytest.mark.parametrize(\"undocumented\", bools)\ndef test_public_class_members(app, members, public, private, protected, undocumented):\n    app.config.breathe_default_members = []\n\n    opts = {}\n    if public:\n        opts[\"members\"] = None\n    if private:\n        opts[\"private-members\"] = None\n    if protected:\n        opts[\"protected-members\"] = None\n    if undocumented:\n        opts[\"undoc-members\"] = None\n    filter = create_class_filter(app, opts)\n\n    assert filter(members.public_field) == public\n    assert filter(members.public_method) == (public and undocumented)\n    assert filter(members.protected_field) == (protected and undocumented)\n    assert filter(members.protected_method) == protected\n    assert filter(members.private_field) == private\n    assert filter(members.private_method) == (private and undocumented)\n\n\ndef test_specific_class_members(app, members):\n    app.config.breathe_default_members = []\n\n    filter = create_class_filter(\n        app, {\"members\": \"public_method,protected_method,private_field\", \"undoc-members\": None}\n    )\n\n    assert not filter(members.public_field)\n    assert filter(members.public_method)\n    assert not filter(members.protected_field)\n    assert filter(members.protected_method)\n    assert filter(members.private_field)\n    assert not filter(members.private_method)\n\n\n# def test_nested_class_filtered(app):\n#     app.config.breathe_default_members = []\n#\n#     doc = parser.parse_str(\n#         \"\"\"<doxygen version=\"1.9.8\">\n#         <compounddef id=\"sample_8hpp\" kind=\"file\" language=\"C++\">\n#             <compoundname>sample.hpp</compoundname>\n#             <innerclass refid=\"classSample\" prot=\"public\">Sample</innerclass>\n#             <innerclass refid=\"classSample_1_1Inner\" prot=\"public\">Sample::Inner</innerclass>\n#             <location file=\"sample.hpp\"/>\n#         </compounddef>\n#         </doxygen>\"\"\"\n#     )\n#\n#     compounddef = doc.value.compounddef[0]\n#     ref_outer, ref_inner = compounddef.innerclass\n#\n#     filter_ = filter.create_file_filter(\n#         app, \"sample.hpp\", DEFAULT_OPTS, init_valid_names=(\"Sample\", \"Sample::Inner\")\n#     )\n#     assert filter_(filter.NodeStack([TaggedNode(\"innerclass\", ref_outer), TaggedNode(None, compounddef)]))  # noqa: E501\n#     assert not filter_(\n#         filter.NodeStack([TaggedNode(\"innerclass\", ref_inner), TaggedNode(None, compounddef)])\n#     )\n"
  },
  {
    "path": "tests/test_parser.py",
    "content": "from __future__ import annotations\n\nimport pytest\n\nfrom breathe import parser\n\n\ndef test_bad_content():\n    xml = \"\"\"<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n        <doxygen version=\"1.9.8\" xml:lang=\"en-US\">\n          <compounddef id=\"classSample\" kind=\"class\" language=\"C++\" prot=\"public\">\n            <compoundname>Sample</compoundname>\n            <includes local=\"no\">sample.hpp</includes>\n            <sectiondef kind=\"INVALID KIND\">\n              <memberdef kind=\"variable\" id=\"1\" prot=\"public\" static=\"no\" mutable=\"no\">\n                <type>int</type>\n                <definition>int public_field</definition>\n                <argsstring></argsstring>\n                <name>public_field</name>\n                <qualifiedname>Sample::public_field</qualifiedname>\n                <location file=\"sample.hpp\"/>\n              </memberdef>\n            </sectiondef>\n            <location file=\"sample.hpp\" line=\"1\"/>\n          </compounddef>\n        </doxygen>\"\"\"\n\n    with pytest.raises(parser.ParseError) as exc:\n        parser.parse_str(xml)\n    assert exc.value.lineno == 6\n\n\ndef test_malformed():\n    xml = \"\"\"<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n        <doxygen version=\"1.9.8\" xml:lang=\"en-US\">\n          <compounddef id=\"classSample\" kind=\"class\" language=\"C++\" prot=\"public\">\n            <compoundname>Sample</compoundname>\n            <includes local=\"no\">sample.hpp</includes>\n            <sectiondef kind=\"public-attrib\">\n              <memberdef kind=\"variable\" id=\"1\" prot=\"public\" static=\"no\" mutable=\"no\">\n                <type>int</type>\"\"\"\n\n    with pytest.raises(parser.ParseError):\n        parser.parse_str(xml)\n\n\ndef test_unknown_tag():\n    xml = \"\"\"<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n        <doxygen version=\"1.9.8\" xml:lang=\"en-US\">\n          <compounddef id=\"classSample\" kind=\"class\" language=\"C++\" prot=\"public\">\n            <compoundname>Sample</compoundname>\n            <FAKE_TAG>\n              <compoundname>Sample</compoundname>\n            </FAKE_TAG>\n            <includes local=\"no\">sample.hpp</includes>\n            <sectiondef kind=\"public-attrib\">\n              <memberdef kind=\"variable\" id=\"1\" prot=\"public\" static=\"no\" mutable=\"no\">\n                <type>int</type>\n                <definition>int public_field</definition>\n                <argsstring></argsstring>\n                <name>public_field</name>\n                <qualifiedname>Sample::public_field</qualifiedname>\n                <location file=\"sample.hpp\" line=\"3\"/>\n              </memberdef>\n            </sectiondef>\n            <location file=\"sample.hpp\" line=\"1\"/>\n          </compounddef>\n        </doxygen>\"\"\"\n\n    with pytest.warns(parser.ParseWarning) as record:\n        parser.parse_str(xml)\n    assert len(record) == 1\n    assert \"Warning on line 5:\" in str(record[0].message)\n\n\ndef test_string_coalesce():\n    xml = \"\"\"<?xml version='1.0' encoding='UTF-8' standalone='no'?>\n        <doxygen version=\"1.9.8\" xml:lang=\"en-US\">\n          <compounddef id=\"classSample\" kind=\"class\" language=\"C++\" prot=\"public\">\n            <compoundname>Sample</compoundname>\n            <includes local=\"no\">sample.hpp</includes>\n            <sectiondef kind=\"public-attrib\">\n              <memberdef kind=\"variable\" id=\"1\" prot=\"public\" static=\"no\" mutable=\"no\">\n                <type>int</type>\n                <definition>int a</definition>\n                <argsstring></argsstring>\n                <name>a</name>\n                <qualifiedname>Sample::a</qualifiedname>\n                <detaileddescription><para>a<nonbreakablespace/>b</para></detaileddescription>\n                <location file=\"sample.hpp\" line=\"3\"/>\n              </memberdef>\n              <memberdef kind=\"variable\" id=\"2\" prot=\"public\" static=\"no\" mutable=\"no\">\n                <type>int</type>\n                <definition>int b</definition>\n                <argsstring></argsstring>\n                <name>b</name>\n                <qualifiedname>Sample::b</qualifiedname>\n                <detaileddescription><para><trademark/>c<plusmn/></para></detaileddescription>\n                <location file=\"sample.hpp\" line=\"3\"/>\n              </memberdef>\n            </sectiondef>\n            <location file=\"sample.hpp\" line=\"1\"/>\n          </compounddef>\n        </doxygen>\"\"\"\n\n    doc = parser.parse_str(xml).value\n    assert isinstance(doc, parser.Node_DoxygenType)\n    members = doc.compounddef[0].sectiondef[0].memberdef\n    desc1 = members[0].detaileddescription\n    desc2 = members[1].detaileddescription\n    assert desc1 is not None\n    assert desc2 is not None\n    tv1 = desc1[0]\n    tv2 = desc2[0]\n    assert isinstance(tv1, parser.TaggedValue)\n    assert isinstance(tv2, parser.TaggedValue)\n    p1 = tv1.value\n    p2 = tv2.value\n    assert isinstance(p1, parser.Node_docParaType)\n    assert isinstance(p2, parser.Node_docParaType)\n    assert len(p1) == 1\n    assert len(p2) == 1\n    assert p1[0] == \"a\\N{NO-BREAK SPACE}b\"\n    assert p2[0] == \"\\N{TRADE MARK SIGN}c\\N{PLUS-MINUS SIGN}\"\n"
  },
  {
    "path": "tests/test_renderer.py",
    "content": "from __future__ import annotations\n\nimport os\nfrom typing import TYPE_CHECKING\n\nimport docutils.parsers.rst\nimport sphinx.addnodes\nimport sphinx.environment\nimport sphinx.locale\nfrom docutils import frontend, nodes, utils\n\nfrom breathe import parser, renderer\nfrom breathe.renderer.sphinxrenderer import SphinxRenderer\n\nif TYPE_CHECKING:\n    from breathe.renderer import filter\n\n\nsphinx.locale.init([], \"\")\nCOMMON_ARGS_memberdefType = {\n    \"id\": \"\",\n    \"prot\": parser.DoxProtectionKind.public,\n    \"static\": False,\n    \"location\": parser.Node_locationType(file=\"\", line=0),\n}\n\n\nclass MockMemo:\n    def __init__(self):\n        self.title_styles = \"\"\n        self.section_level = \"\"\n\n\nclass MockState:\n    def __init__(self, app):\n        from breathe.parser import DoxygenParser\n        from breathe.project import ProjectInfoFactory\n\n        env = sphinx.environment.BuildEnvironment(app)\n        env.setup(app)\n        env.temp_data[\"docname\"] = \"mock-doc\"\n        env.temp_data[\"breathe_project_info_factory\"] = ProjectInfoFactory(app)\n        env.temp_data[\"breathe_dox_parser\"] = DoxygenParser(app)\n        if hasattr(frontend, \"get_default_settings\"):\n            settings = frontend.get_default_settings(docutils.parsers.rst.Parser)\n        else:\n            settings = frontend.OptionParser(\n                components=(docutils.parsers.rst.Parser,)\n            ).get_default_values()\n        settings.env = env\n        self.document = utils.new_document(\"\", settings)\n\n        # In sphinx 5.3.0 the method state.nested_parse is not called directly\n        # so this memo object should exist here\n        self.memo = MockMemo()\n\n    def nested_parse(self, content, content_offset, contentnode, match_titles=1):\n        pass\n\n\nclass MockReporter:\n    def __init__(self):\n        pass\n\n    def warning(self, description, line):\n        pass\n\n    def debug(self, message):\n        pass\n\n\nclass MockStateMachine:\n    def __init__(self):\n        self.reporter = MockReporter()\n\n    def get_source_and_line(self, lineno: int):\n        if lineno is None:\n            lineno = 42\n        return \"mock-doc\", lineno\n\n\nclass MockMaskFactory:\n    def __init__(self):\n        pass\n\n    def mask(self, node):\n        return node\n\n\nclass MockContext:\n    def __init__(self, app, node_stack, domain=None, options=[]):\n        self.domain = domain\n        self.node_stack = node_stack\n        self.directive_args = [\n            None,  # name\n            None,  # arguments\n            options,  # options\n            \"\",  # content\n            None,  # lineno\n            None,  # content_offset\n            None,  # block_text\n            MockState(app),\n            MockStateMachine(),\n        ]\n        self.child = None\n        self.mask_factory = MockMaskFactory()\n\n    def create_child_context(self, attribute, tag):\n        return self\n\n\nclass MockTargetHandler:\n    def __init__(self):\n        pass\n\n    def __call__(self, document, refid):\n        return []\n\n\nclass MockDocument:\n    def __init__(self):\n        self.reporter = MockReporter()\n\n\nclass MockCompoundParser:\n    \"\"\"\n    A compound parser reads a doxygen XML file from disk; this mock implements\n    a mapping of what would be the file name on disk to data using a dict.\n    \"\"\"\n\n    def __init__(self, compound_dict):\n        self.compound_dict = compound_dict\n\n    class MockFileData:\n        def __init__(self, compounddef):\n            self.compounddef = [compounddef]\n\n    class MockCompound:\n        def __init__(self, root):\n            self.root = root\n\n    def parse_compound(self, compoundname, project_info):\n        compounddef = self.compound_dict[compoundname]\n        return self.MockCompound(self.MockFileData(compounddef))\n\n\nclass NodeFinder(nodes.NodeVisitor):\n    \"\"\"Find node with specified class name.\"\"\"\n\n    def __init__(self, name, document):\n        nodes.NodeVisitor.__init__(self, document)\n        self.name = name\n        self.found_nodes = []\n\n    def unknown_visit(self, node):\n        if node.__class__.__name__ == self.name:\n            self.found_nodes.append(node)\n\n\ndef find_nodes(nodes, name):\n    \"\"\"Find all docutils nodes with specified class name in *nodes*.\"\"\"\n    finder = NodeFinder(name, MockDocument())\n    for node in nodes:\n        node.walk(finder)\n    return finder.found_nodes\n\n\ndef find_node(nodes, name):\n    \"\"\"\n    Find a single docutils node with specified class name in *nodes*.\n    Throw an exception if there isn't exactly one such node.\n    \"\"\"\n    found_nodes = find_nodes(nodes, name)\n    if len(found_nodes) != 1:\n        raise Exception(f\"the number of nodes {name} is {len(found_nodes)}\")\n    return found_nodes[0]\n\n\ndef test_find_nodes():\n    section = nodes.section()\n    foo = nodes.Text(\"foo\")\n    desc = nodes.description()\n    bar = nodes.Text(\"bar\")\n    section.children = [foo, desc, bar]\n    assert find_nodes(section, \"description\") == [desc]\n    assert find_nodes([section, desc], \"description\") == [desc, desc]\n    assert find_nodes([], \"description\") == []\n    assert find_nodes(section, \"unknown\") == []\n    assert find_nodes(section, \"Text\") == [foo, bar]\n\n\ndef check_exception(func, message):\n    \"\"\"Check if func() throws an exception with the specified message.\"\"\"\n    exception = None\n    try:\n        func()\n    except Exception as e:\n        exception = e\n    print(str(exception))\n    assert exception\n    assert str(exception) == message\n\n\ndef test_find_node():\n    section = nodes.section()\n    foo = nodes.Text(\"foo\")\n    desc = nodes.description()\n    bar = nodes.Text(\"bar\")\n    section.children = [foo, desc, bar]\n    assert find_node(section, \"description\") == desc\n    check_exception(\n        lambda: find_node([section, desc], \"description\"), \"the number of nodes description is 2\"\n    )\n    check_exception(lambda: find_node([], \"description\"), \"the number of nodes description is 0\")\n    check_exception(lambda: find_node([section], \"unknown\"), \"the number of nodes unknown is 0\")\n    check_exception(lambda: find_node([section], \"Text\"), \"the number of nodes Text is 2\")\n\n\ndef render(\n    app, member_def, domain=None, show_define_initializer=False, dox_parser=None, options=[]\n):\n    \"\"\"Render Doxygen *member_def* with *renderer_class*.\"\"\"\n\n    app.config.breathe_separate_member_pages = False\n    app.config.breathe_use_project_refids = False\n    app.config.breathe_show_define_initializer = show_define_initializer\n    app.config.breathe_order_parameters_first = False\n    app.config.breathe_debug_trace_directives = False\n    app.config.breathe_debug_trace_doxygen_ids = False\n    app.config.breathe_debug_trace_qualification = False\n    r = SphinxRenderer(\n        app,\n        None,  # project_info\n        [],  # node_stack\n        None,  # state\n        None,  # document\n        MockTargetHandler(),\n        dox_parser,\n        (lambda nstack: True),\n    )\n    r.context = MockContext(app, [renderer.TaggedNode(None, member_def)], domain, options)\n    return r.render(member_def)\n\n\ndef test_render_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void foo\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"foo\",\n        argsstring=\"(int)\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        param=[parser.Node_paramType(type=parser.Node_linkedTextType([\"int\"]))],\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext().startswith(\"void\")\n    n = find_node(signature, \"desc_name\")[0]\n    assert isinstance(n, sphinx.addnodes.desc_sig_name)\n    assert len(n) == 1\n    assert n[0] == \"foo\"\n    params = find_node(signature, \"desc_parameterlist\")\n    assert len(params) == 1\n    param = params[0]\n    assert isinstance(param[0], sphinx.addnodes.desc_sig_keyword_type)\n    assert param[0][0] == \"int\"\n\n\ndef test_render_typedef(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.typedef,\n        definition=\"typedef int foo\",\n        type=parser.Node_linkedTextType([\"int\"]),\n        name=\"foo\",\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext() == \"typedef int foo\"\n\n\ndef test_render_c_typedef(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.typedef,\n        definition=\"typedef unsigned int bar\",\n        type=parser.Node_linkedTextType([\"unsigned int\"]),\n        name=\"bar\",\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def, domain=\"c\"), \"desc_signature\")\n    assert signature.astext() == \"typedef unsigned int bar\"\n\n\ndef test_render_c_function_typedef(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.typedef,\n        definition=\"typedef void* (*voidFuncPtr)(float, int)\",\n        type=parser.Node_linkedTextType([\"void* (*\"]),\n        name=\"voidFuncPtr\",\n        argsstring=\")(float, int)\",\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def, domain=\"c\"), \"desc_signature\")\n    assert signature.astext().startswith(\"typedef void *\")\n    # the use of desc_parameterlist in this case was not correct,\n    # it should only be used for a top-level function\n\n\ndef test_render_using_alias(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.typedef,\n        definition=\"using foo = int\",\n        type=parser.Node_linkedTextType([\"int\"]),\n        name=\"foo\",\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext() == \"using foo = int\"\n\n\ndef test_render_const_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void f\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"f\",\n        argsstring=\"() const\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        const=True,\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert \"_CPPv2NK1fEv\" in signature[\"ids\"]\n\n\ndef test_render_lvalue_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void f\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"f\",\n        argsstring=\"() &\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        refqual=parser.DoxRefQualifierKind.lvalue,\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext().endswith(\"&\")\n\n\ndef test_render_rvalue_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void f\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"f\",\n        argsstring=\"() &&\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        refqual=parser.DoxRefQualifierKind.rvalue,\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext().endswith(\"&&\")\n\n\ndef test_render_const_lvalue_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void f\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"f\",\n        argsstring=\"() const &\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        const=True,\n        refqual=parser.DoxRefQualifierKind.lvalue,\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext().endswith(\"const &\")\n\n\ndef test_render_const_rvalue_func(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.function,\n        definition=\"void f\",\n        type=parser.Node_linkedTextType([\"void\"]),\n        name=\"f\",\n        argsstring=\"() const &&\",\n        virt=parser.DoxVirtualKind.non_virtual,\n        const=True,\n        refqual=parser.DoxRefQualifierKind.rvalue,\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext().endswith(\"const &&\")\n\n\ndef test_render_variable_initializer(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.variable,\n        definition=\"const int EOF\",\n        type=parser.Node_linkedTextType([\"const int\"]),\n        name=\"EOF\",\n        initializer=parser.Node_linkedTextType([\"= -1\"]),\n        **COMMON_ARGS_memberdefType,\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext() == \"const int EOF = -1\"\n\n\ndef test_render_define_initializer(app):\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.define,\n        name=\"MAX_LENGTH\",\n        initializer=parser.Node_linkedTextType([\"100\"]),\n        **COMMON_ARGS_memberdefType,\n    )\n    signature_w_initializer = find_node(\n        render(app, member_def, show_define_initializer=True), \"desc_signature\"\n    )\n    assert signature_w_initializer.astext() == \"MAX_LENGTH 100\"\n\n    member_def_no_show = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.define,\n        name=\"MAX_LENGTH_NO_INITIALIZER\",\n        initializer=parser.Node_linkedTextType([\"100\"]),\n        **COMMON_ARGS_memberdefType,\n    )\n\n    signature_wo_initializer = find_node(\n        render(app, member_def_no_show, show_define_initializer=False), \"desc_signature\"\n    )\n    assert signature_wo_initializer.astext() == \"MAX_LENGTH_NO_INITIALIZER\"\n\n\ndef test_render_define_no_initializer(app):\n    sphinx.addnodes.setup(app)\n    member_def = parser.Node_memberdefType(\n        kind=parser.DoxMemberKind.define, name=\"USE_MILK\", **COMMON_ARGS_memberdefType\n    )\n    signature = find_node(render(app, member_def), \"desc_signature\")\n    assert signature.astext() == \"USE_MILK\"\n\n\ndef test_render_innergroup(app):\n    refid = \"group__innergroup\"\n    mock_compound_parser = MockCompoundParser({\n        refid: parser.Node_compounddefType(\n            kind=parser.DoxCompoundKind.group,\n            compoundname=\"InnerGroup\",\n            briefdescription=parser.Node_descriptionType([\"InnerGroup\"]),\n            id=\"\",\n            prot=parser.DoxProtectionKind.public,\n        )\n    })\n    ref = parser.Node_refType([\"InnerGroup\"], refid=refid)\n    compound_def = parser.Node_compounddefType(\n        kind=parser.DoxCompoundKind.group,\n        compoundname=\"OuterGroup\",\n        briefdescription=parser.Node_descriptionType([\"OuterGroup\"]),\n        innergroup=[ref],\n        id=\"\",\n        prot=parser.DoxProtectionKind.public,\n    )\n    assert all(\n        el.astext() != \"InnerGroup\"\n        for el in render(app, compound_def, dox_parser=mock_compound_parser)\n    )\n    assert any(\n        el.astext() == \"InnerGroup\"\n        for el in render(app, compound_def, dox_parser=mock_compound_parser, options=[\"inner\"])\n    )\n\n\ndef get_directive(app):\n    from docutils.statemachine import StringList\n\n    from breathe.directives.function import DoxygenFunctionDirective\n\n    app.config.breathe_separate_member_pages = False\n    app.config.breathe_default_project = \"test_project\"\n    app.config.breathe_domain_by_extension = {}\n    app.config.breathe_domain_by_file_pattern = {}\n    app.config.breathe_use_project_refids = False\n    cls_args = (\n        \"doxygenclass\",\n        [\"at::Tensor\"],\n        {\"members\": \"\", \"protected-members\": None, \"undoc-members\": None},\n        StringList([], items=[]),\n        20,\n        24,\n        (\n            \".. doxygenclass:: at::Tensor\\n   :members:\\n\"\n            \"   :protected-members:\\n   :undoc-members:\"\n        ),\n        MockState(app),\n        MockStateMachine(),\n    )  # fmt: skip\n    return DoxygenFunctionDirective(*cls_args)\n\n\ndef get_matches(datafile) -> tuple[list[str], list[filter.FinderMatch]]:\n    with open(os.path.join(os.path.dirname(__file__), \"data\", datafile), \"rb\") as fid:\n        doc = parser.parse_file(fid)\n    assert isinstance(doc.value, parser.Node_DoxygenType)\n\n    sectiondef = doc.value.compounddef[0].sectiondef[0]\n    argsstrings = [child.argsstring for child in sectiondef.memberdef if child.argsstring]\n    matches = [\n        [renderer.TaggedNode(None, m), renderer.TaggedNode(None, sectiondef)]\n        for m in sectiondef.memberdef\n    ]\n    return argsstrings, matches\n\n\ndef test_resolve_overrides(app):\n    # Test that multiple function overrides works\n    argsstrings, matches = get_matches(\"arange.xml\")\n    cls = get_directive(app)\n\n    # Verify that the exact arguments returns one override\n    for args in argsstrings:\n        ast_param = cls._parse_args(args)\n        _ = cls._resolve_function(matches, ast_param, None)\n\n\ndef test_ellipsis(app):\n    argsstrings, matches = get_matches(\"ellipsis.xml\")\n    cls = get_directive(app)\n\n    # Verify that parsing an ellipsis works\n    ast_param = cls._parse_args(argsstrings[0])\n    _ = cls._resolve_function(matches, ast_param, None)\n"
  },
  {
    "path": "tests/test_utils.py",
    "content": "from __future__ import annotations\n\nfrom unittest import TestCase\n\nfrom breathe import parser, path_handler\nfrom breathe.renderer.sphinxrenderer import get_definition_without_template_args, get_param_decl\n\n\nclass TestUtils(TestCase):\n    def test_param_decl(self):\n        # From xml from: examples/specific/parameters.h\n        xml = \"\"\"\n        <doxygen lang=\"\" version=\"\">\n        <compounddef id=\"\" kind=\"type\" prot=\"public\">\n        <compoundname></compoundname>\n        <sectiondef kind=\"typedef\">\n        <memberdef id=\"\" kind=\"function\" prot=\"public\" static=\"no\">\n        <name>x</name>\n        <param>\n          <type>int</type>\n          <declname>a</declname>\n        </param>\n        <param>\n          <type>float</type>\n          <declname>b</declname>\n        </param>\n        <param>\n          <type>int *</type>\n          <declname>c</declname>\n        </param>\n        <param>\n          <type>int(**)</type>\n          <declname>p</declname>\n          <array>[3]</array>\n        </param>\n        <param>\n          <type><ref refid=\"class_my_class\" kindref=\"compound\">MyClass</ref></type>\n          <declname>a</declname>\n        </param>\n        <param>\n          <type><ref refid=\"class_my_class\" kindref=\"compound\">MyClass</ref> *</type>\n          <declname>b</declname>\n        </param>\n        <param>\n          <type>int(&amp;)</type>\n          <declname>r</declname>\n          <array>[3]</array>\n        </param>\n        <location file=\"\" line=\"0\"/>\n        </memberdef>\n        </sectiondef>\n        </compounddef>\n        </doxygen>\n        \"\"\"\n\n        doc = parser.parse_str(xml)\n        assert isinstance(doc.value, parser.Node_DoxygenType)\n\n        memberdef = doc.value.compounddef[0].sectiondef[0].memberdef[0]\n\n        assert get_param_decl(memberdef.param[0]) == \"int a\"\n        assert get_param_decl(memberdef.param[1]) == \"float b\"\n        assert get_param_decl(memberdef.param[2]) == \"int * c\"\n        assert get_param_decl(memberdef.param[3]) == \"int(**p)[3]\"\n        assert get_param_decl(memberdef.param[4]) == \"MyClass a\"\n        assert get_param_decl(memberdef.param[5]) == \"MyClass  * b\"\n        assert get_param_decl(memberdef.param[6]) == \"int(&r)[3]\"\n\n    def test_definition_without_template_args(self):\n        def get_definition(definition, name, bitfield=\"\"):\n            class MockDataObject:\n                def __init__(self, definition, name, bitfield):\n                    self.definition = definition\n                    self.name = name\n                    self.bitfield = bitfield\n\n            return get_definition_without_template_args(MockDataObject(definition, name, bitfield))\n\n        assert \"void A::foo\" == get_definition(\"void A<T>::foo\", \"foo\")\n        # Template arguments in the return type should be preserved:\n        assert \"Result<T> A::f\" == get_definition(\"Result<T> A::f\", \"f\")\n        # Nested template arguments:\n        assert \"Result<T> A::f\" == get_definition(\"Result<T> A< B<C> >::f\", \"f\")\n\n        # Bit fields\n        assert \"int f : 3\" == get_definition(\"int f\", \"f\", \"3\")\n\n\ndef test_definition_without_template_args():\n    def get_definition(definition, name, bitfield=\"\"):\n        class MockDataObject:\n            def __init__(self, definition, name, bitfield):\n                self.definition = definition\n                self.name = name\n                self.bitfield = bitfield\n\n        return get_definition_without_template_args(MockDataObject(definition, name, bitfield))\n\n    assert \"void A::foo\" == get_definition(\"void A<T>::foo\", \"foo\")\n    # Template arguments in the return type should be preserved:\n    assert \"Result<T> A::f\" == get_definition(\"Result<T> A::f\", \"f\")\n    # Nested template arguments:\n    assert \"Result<T> A::f\" == get_definition(\"Result<T> A< B<C> >::f\", \"f\")\n\n    # Bit fields\n    assert \"int f : 3\" == get_definition(\"int f\", \"f\", \"3\")\n\n\ndef test_path_handler():\n    assert path_handler.includes_directory(\"directory/file.h\") is True\n    assert path_handler.includes_directory(\"directory\\\\file.h\") is True\n    assert path_handler.includes_directory(\"file.h\") is False\n"
  },
  {
    "path": "tests/warnings/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = build\n\n# User-friendly check for sphinx-build\nifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)\n$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://www.sphinx-doc.org/)\nendif\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  latexpdfja to make LaTeX files and run them through platex/dvipdfmx\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  xml        to make Docutils-native XML files\"\n\t@echo \"  pseudoxml  to make pseudoxml-XML files for display purposes\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\trm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/TestBreatheWarnings.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/TestBreatheWarnings.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/TestBreatheWarnings\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/TestBreatheWarnings\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\nlatexpdfja:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through platex and dvipdfmx...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n\nxml:\n\t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml\n\t@echo\n\t@echo \"Build finished. The XML files are in $(BUILDDIR)/xml.\"\n\npseudoxml:\n\t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml\n\t@echo\n\t@echo \"Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml.\"\n"
  },
  {
    "path": "tests/warnings/make.bat",
    "content": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUILDDIR=build\nset ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source\nset I18NSPHINXOPTS=%SPHINXOPTS% source\nif NOT \"%PAPER%\" == \"\" (\n\tset ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%\n\tset I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%\n)\n\nif \"%1\" == \"\" goto help\n\nif \"%1\" == \"help\" (\n\t:help\n\techo.Please use `make ^<target^>` where ^<target^> is one of\n\techo.  html       to make standalone HTML files\n\techo.  dirhtml    to make HTML files named index.html in directories\n\techo.  singlehtml to make a single large HTML file\n\techo.  pickle     to make pickle files\n\techo.  json       to make JSON files\n\techo.  htmlhelp   to make HTML files and a HTML help project\n\techo.  qthelp     to make HTML files and a qthelp project\n\techo.  devhelp    to make HTML files and a Devhelp project\n\techo.  epub       to make an epub\n\techo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\n\techo.  text       to make text files\n\techo.  man        to make manual pages\n\techo.  texinfo    to make Texinfo files\n\techo.  gettext    to make PO message catalogs\n\techo.  changes    to make an overview over all changed/added/deprecated items\n\techo.  xml        to make Docutils-native XML files\n\techo.  pseudoxml  to make pseudoxml-XML files for display purposes\n\techo.  linkcheck  to check all external links for integrity\n\techo.  doctest    to run all doctests embedded in the documentation if enabled\n\tgoto end\n)\n\nif \"%1\" == \"clean\" (\n\tfor /d %%i in (%BUILDDIR%\\*) do rmdir /q /s %%i\n\tdel /q /s %BUILDDIR%\\*\n\tgoto end\n)\n\n\n%SPHINXBUILD% 2> nul\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.https://www.sphinx-doc.org/\n\texit /b 1\n)\n\nif \"%1\" == \"html\" (\n\t%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/html.\n\tgoto end\n)\n\nif \"%1\" == \"dirhtml\" (\n\t%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.\n\tgoto end\n)\n\nif \"%1\" == \"singlehtml\" (\n\t%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.\n\tgoto end\n)\n\nif \"%1\" == \"pickle\" (\n\t%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the pickle files.\n\tgoto end\n)\n\nif \"%1\" == \"json\" (\n\t%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the JSON files.\n\tgoto end\n)\n\nif \"%1\" == \"htmlhelp\" (\n\t%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run HTML Help Workshop with the ^\n.hhp project file in %BUILDDIR%/htmlhelp.\n\tgoto end\n)\n\nif \"%1\" == \"qthelp\" (\n\t%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run \"qcollectiongenerator\" with the ^\n.qhcp project file in %BUILDDIR%/qthelp, like this:\n\techo.^> qcollectiongenerator %BUILDDIR%\\qthelp\\TestBreatheWarnings.qhcp\n\techo.To view the help file:\n\techo.^> assistant -collectionFile %BUILDDIR%\\qthelp\\TestBreatheWarnings.ghc\n\tgoto end\n)\n\nif \"%1\" == \"devhelp\" (\n\t%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished.\n\tgoto end\n)\n\nif \"%1\" == \"epub\" (\n\t%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The epub file is in %BUILDDIR%/epub.\n\tgoto end\n)\n\nif \"%1\" == \"latex\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; the LaTeX files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"latexpdf\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tcd %BUILDDIR%/latex\n\tmake all-pdf\n\tcd %BUILDDIR%/..\n\techo.\n\techo.Build finished; the PDF files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"latexpdfja\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tcd %BUILDDIR%/latex\n\tmake all-pdf-ja\n\tcd %BUILDDIR%/..\n\techo.\n\techo.Build finished; the PDF files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"text\" (\n\t%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The text files are in %BUILDDIR%/text.\n\tgoto end\n)\n\nif \"%1\" == \"man\" (\n\t%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The manual pages are in %BUILDDIR%/man.\n\tgoto end\n)\n\nif \"%1\" == \"texinfo\" (\n\t%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.\n\tgoto end\n)\n\nif \"%1\" == \"gettext\" (\n\t%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The message catalogs are in %BUILDDIR%/locale.\n\tgoto end\n)\n\nif \"%1\" == \"changes\" (\n\t%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.The overview file is in %BUILDDIR%/changes.\n\tgoto end\n)\n\nif \"%1\" == \"linkcheck\" (\n\t%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Link check complete; look for any errors in the above output ^\nor in %BUILDDIR%/linkcheck/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"doctest\" (\n\t%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Testing of doctests in the sources finished, look at the ^\nresults in %BUILDDIR%/doctest/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"xml\" (\n\t%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The XML files are in %BUILDDIR%/xml.\n\tgoto end\n)\n\nif \"%1\" == \"pseudoxml\" (\n\t%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.\n\tgoto end\n)\n\n:end\n"
  },
  {
    "path": "tests/warnings/source/class.rst",
    "content": "\nClass Warnings\n==============\n\nTest 'cannot find project' warning.\n\n.. doxygenclass:: MyClass\n   :project: nonexistent\n\n\nTest 'cannot find xml' warning:\n\n.. doxygenclass:: MyClass\n   :project: invalidproject\n\n\nTest 'cannot find class' warning:\n\n.. doxygenclass:: NonExistentClass\n   :project: class\n\n\n"
  },
  {
    "path": "tests/warnings/source/conf.py",
    "content": "# mypy: ignore-errors\nfrom __future__ import annotations\n\nimport sys\n\nsys.path.append(\"../../\")\n\nextensions = [\"breathe\"]\n\n# Breathe configuration parameters\nbreathe_projects = {\n    \"class\": \"../../../examples/doxygen/class/xml/\",\n    \"function\": \"../../../examples/specific/functionOverload/xml/\",\n    \"group\": \"../../../examples/specific/group/xml/\",\n    \"invalidproject\": \"invalid/path/\",\n}\n\nmaster_doc = \"index\"\nproject = \"Test Breathe Warnings\"\nhtml_theme = \"default\"\n"
  },
  {
    "path": "tests/warnings/source/define.rst",
    "content": "\nDefine Warnings\n===============\n\nTest 'cannot find project' warning.\n\n.. doxygendefine:: MY_DEFINE\n   :project: nonexistent\n\nTest 'cannot find define' warning.\n\n.. doxygendefine:: MY_DEFINE\n   :project: class\n\n"
  },
  {
    "path": "tests/warnings/source/function.rst",
    "content": "\nFunction Warnings\n=================\n\nTest 'cannot find project' warning.\n\n.. doxygenfunction:: MyFunction\n   :project: nonexistent\n\n\nTest 'cannot find xml' warning:\n\n.. doxygenfunction:: MyFunction\n   :project: invalidproject\n\n\nTest 'cannot find function' warning.\n\n.. doxygenfunction:: NonExistentFunction\n   :project: function\n\n\nTest 'too many matches' warning.\n\n.. doxygenfunction:: f\n   :project: function\n"
  },
  {
    "path": "tests/warnings/source/group.rst",
    "content": "\nFunction Warnings\n=================\n\nTest 'cannot find project' warning.\n\n.. doxygengroup:: MyFunction\n   :project: nonexistent\n\n\nTest 'cannot find xml' warning:\n\n.. doxygengroup:: MyGroup\n   :project: invalidproject\n\n\nTest 'cannot find function' warning.\n\n.. doxygengroup:: NonExistentGroup\n   :project: group\n\n\n"
  },
  {
    "path": "tests/warnings/source/index.rst",
    "content": "\nTest Breathe Warnings\n=====================\n\nThis Sphinx instance is designed to call Breathe in every single incorrect way\nin order to test that the warnings work without crashing the build process.\n\n.. toctree::\n   :maxdepth: 2\n\n   class\n   function\n   group\n   define\n\n\n\n"
  },
  {
    "path": "xml_parser_generator/make_parser.py",
    "content": "\"\"\"Parse a JSON schema file and generate the C code for a Python module to parse\nXML\"\"\"\n\nfrom __future__ import annotations\n\nimport collections\nimport dataclasses\nimport enum\nimport functools\nimport json\nimport keyword\nimport re\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING, NamedTuple, TypeVar, cast\n\nimport jinja2\n\nif TYPE_CHECKING:\n    from collections.abc import Iterable, Sequence\n    from typing import Any, Callable, Literal, NoReturn\n\nT = TypeVar(\"T\")\n\n\n# The minimum number of items a set should have before using a hash-based\n# lookup. If fewer, the strings are compared one-by-one instead.\nHASH_LOOKUP_THRESHOLD = 8\n\nSPLIT_LINE_ITEM_THRESHOLD = 5\n\nBUILTIN_ATTR_SCHEMA_TYPES = [\n    (\"string\", \"str\"),\n    (\"DoxBool\", \"bool\"),\n    (\"integer\", \"int\"),\n    (\"empty\", \"None\"),\n]\n\nRE_CHAR_TYPE = re.compile(r\"\\s*#\\s*char\\s*\\(([^\\s)]+)\\s*\\)\\s*\")\n\n\ndef comma_join(items: Sequence[str], indent: int = 4):\n    if len(items) < SPLIT_LINE_ITEM_THRESHOLD:\n        return \", \".join(items)\n\n    return (\",\\n\" + \" \" * indent).join(items)\n\n\nclass ContentType(enum.Enum):\n    \"\"\"A value specifying how children are organized when parsing an array-type\n    element\"\"\"\n\n    bare = enum.auto()\n    \"\"\"Child values are added directly to the array.\n\n    There can only be one child type, which can be an element or text.\n    \"\"\"\n\n    tuple = enum.auto()\n    \"\"\"Child elements are grouped into named tuple-like objects.\n\n    Each batch of child elements must appear in order in the XML document. Text\n    content is not allowed.\n\n    Currently, tuple child element names must be valid Python identifiers as\n    there isn't a way to have different field names.\n    \"\"\"\n\n    union = enum.auto()\n    \"\"\"Each item is either a tagged union (an instance of TaggedValue) or a\n    plain string\"\"\"\n\n\n@dataclasses.dataclass()\nclass TypeRef:\n    \"\"\"An XML element\"\"\"\n\n    name: str\n    \"\"\"the name of the element as it will appear in the XML file\"\"\"\n\n    py_name: str\n    \"\"\"The Python field name that will hold the parsed value.\n\n    This will be different from \"name\" if \"name\" is not a valid Python\n    identifier.\n    \"\"\"\n\n    type: str | SchemaType\n    \"\"\"While the schema is being parsed, this will be a string containing the\n    name of attribute's type. After parsing, this is set to the object\n    representing the type.\n    \"\"\"\n\n    is_list: bool\n    \"\"\"Whether this element can appear more than once in its context\"\"\"\n\n    min_items: Literal[0] | Literal[1]\n    \"\"\"If this is zero, the element is optional.\n\n    This can only be zero or one.\n    \"\"\"\n\n    def py_type(self, as_param=False) -> str:\n        \"\"\"Get the Python type annotation describing the type of this element.\n\n        If \"as_param\" is True, this represents a parameter type that can be\n        converted to the actual type. For example with a given type \"T\": the\n        generated parser uses FrozenList[T] to store arrays, but constructors\n        accept Iterable[T] for array fields.\n        \"\"\"\n\n        assert isinstance(self.type, SchemaType)\n        if self.is_list:\n            container = \"Iterable\" if as_param else \"FrozenList\"\n            return f\"{container}[{self.type.py_name}]\"\n        if self.min_items == 0:\n            return f\"{self.type.py_name} | None\"\n        return self.type.py_name\n\n    def needs_finish(self) -> bool:\n        \"\"\"Return True if the field value will need to be checked at the end of\n        parsing the element.\n\n        This is the case case for all fields except list fields with no minimum.\n        For most fields, we need to know how many corresponding child elements\n        exist, which can't be known until the parent element is fully parsed,\n        but list fields without minimums accept any number of child elements.\n        \"\"\"\n        return not self.is_list or self.min_items > 0\n\n\n@dataclasses.dataclass()\nclass Attribute:\n    \"\"\"An XML attribute\"\"\"\n\n    name: str\n    \"\"\"the name of the attribute as it will appear in the XML file\"\"\"\n\n    py_name: str\n    \"\"\"The Python field name that will hold the parsed value.\n\n    This will be different from \"name\" if \"name\" is not a valid Python\n    identifier.\n    \"\"\"\n\n    type: str | AttributeType\n    \"\"\"While the schema is being parsed, this will be a string containing the\n    name of attribute's type. After parsing, this is set to the object\n    representing the type.\n    \"\"\"\n\n    optional: bool\n    \"\"\"Whether the attribute may be omitted.\n\n    Fields corresponding to omitted attributes are set to None.\n    \"\"\"\n\n    def py_type(self, as_param=False) -> str:\n        \"\"\"Get the Python type annotation describing the type of this attribute.\n\n        If \"as_param\" is True, this represents a parameter type that can be\n        converted to the actual type. For example with a given type \"T\": the\n        generated parser uses FrozenList[T] to store arrays, but constructors\n        accept Iterable[T] for array fields.\n        \"\"\"\n\n        assert isinstance(self.type, SchemaType)\n        if self.optional:\n            return f\"{self.type.py_name} | None\"\n        return self.type.py_name\n\n\n@dataclasses.dataclass()\nclass SchemaType:\n    name: str\n\n    def __str__(self):\n        \"\"\"This is equal to self.name.\n\n        This is important for the Jinja template, which frequently uses the\n        names of types.\n        \"\"\"\n        return self.name\n\n    def content_names(self) -> Iterable[str]:\n        return []\n\n    @property\n    def extra_args(self) -> str:\n        \"\"\"A string to add before the closing bracket of the C function call to\n        the type's element start handler\"\"\"\n        return \"\"\n\n    def add_sorted(self, dest: list[SchemaType], visited: set[int]) -> None:\n        if id(self) not in visited:\n            visited.add(id(self))\n            dest.append(self)\n\n    if TYPE_CHECKING:\n\n        @property\n        def py_name(self) -> str:\n            raise NotImplementedError\n\n\n@dataclasses.dataclass()\nclass AttributeType(SchemaType):\n    \"\"\"A type that can be used in attributes and elements.\n\n    When used for an element, the element will not have any attributes or child\n    elements.\n    \"\"\"\n\n\n@dataclasses.dataclass()\nclass BuiltinType(SchemaType):\n    py_name: str\n    \"\"\"the name of the Python data type that will represent a value of this\n    type\"\"\"\n\n\n@dataclasses.dataclass()\nclass AddsToStringType(BuiltinType):\n    pass\n\n\n@dataclasses.dataclass()\nclass SpType(AddsToStringType):\n    \"\"\"This element represents an arbitrary character whose code point is\n    given in the attribute \"value\".\n\n    If \"value\" isn't present, the character is a space.\n    \"\"\"\n\n\n@dataclasses.dataclass()\nclass CodePointType(AddsToStringType):\n    \"\"\"This element represents a specific character.\"\"\"\n\n    char: int\n    \"\"\"The unicode code-point of the character\"\"\"\n\n    def __init__(self, char: int):\n        self.name = \"const_char\"\n        self.py_name = \"str\"\n        self.char = char\n\n    @property\n    def extra_args(self) -> str:\n        return f\",{self.char:#x}\"\n\n\n@dataclasses.dataclass()\nclass BuiltinAttributeType(BuiltinType, AttributeType):\n    pass\n\n\nclass OtherAttrAction(enum.Enum):\n    ignore = enum.auto()\n    error = enum.auto()\n\n\n@dataclasses.dataclass()\nclass ElementType(SchemaType):\n    \"\"\"An element type specified by the schema\"\"\"\n\n    bases: list[str | SchemaType]\n    \"\"\"the types to derive from\"\"\"\n\n    attributes: dict[str, Attribute]\n    \"\"\"XML attributes\"\"\"\n\n    other_attr: OtherAttrAction\n    \"\"\"how to handle attributes not in \"attributes\" \"\"\"\n\n    children: dict[str, TypeRef]\n    \"\"\"XML child elements\"\"\"\n\n    used_directly: bool\n    \"\"\"Each element that is used directly, corresponds to a separate Python\n    class. If this is False, this element is only used as a base element for\n    other types and does not produce any Python classes.\"\"\"\n\n    def fields(self) -> Iterable[TypeRef | Attribute]:\n        yield from self.attributes.values()\n        yield from self.children.values()\n\n    @property\n    def direct_field_count(self):\n        return len(self.attributes) + len(self.children)\n\n    def all_fields(self) -> Iterable[TypeRef | Attribute]:\n        for b in self.bases:\n            if isinstance(b, ElementType):\n                yield from b.all_fields()\n        yield from self.fields()\n\n    @property\n    def py_name(self) -> str:\n        return f\"Node_{self.name}\"\n\n    def add_sorted(self, dest: list[SchemaType], visited: set[int]) -> None:\n        if id(self) not in visited:\n            for b in self.bases:\n                assert isinstance(b, SchemaType)\n                b.add_sorted(dest, visited)\n            visited.add(id(self))\n            dest.append(self)\n\n\n@dataclasses.dataclass()\nclass TagOnlyElement(ElementType):\n    \"\"\"A simple element that cannot contain text (not counting whitespace) and\n    does not preserve the order of its child elements\"\"\"\n\n\n@dataclasses.dataclass()\nclass ListElement(ElementType):\n    \"\"\"An element type that gets parsed as an array type.\n\n    The items of the array depend on \"content\", \"content_type\" and \"allow_text\".\n    \"\"\"\n\n    min_items: int\n\n    content: dict[str, str | SchemaType]\n    \"\"\"Child elements that will be stored as array items.\n\n    While the schema is being parsed, the values will be strings containing the\n    names of the elements' types. After parsing, they are set to the objects\n    representing the types.\n    \"\"\"\n\n    content_type: ContentType\n\n    allow_text: bool\n\n    def content_names(self) -> Iterable[str]:\n        for b in self.bases:\n            assert isinstance(b, SchemaType)\n            yield from b.content_names()\n        yield from self.content\n\n    def all_content(self):\n        for b in self.bases:\n            if isinstance(b, ListElement):\n                yield from b.content.values()\n        yield from self.content.values()\n\n    def py_union_ref(self) -> list[str]:\n        types = self.py_union_list()\n        if len(types) <= 1:\n            return types\n        return [\"ListItem_\" + self.name]\n\n    def py_union_list(self, quote=False) -> list[str]:\n        \"\"\"Return a list of type annotations, the union of which, represent\n        every possible value of this array's elements.\n\n        This assumes self.content_type == ContentType.union.\n        \"\"\"\n        assert self.content_type == ContentType.union\n        by_type = collections.defaultdict(list)\n        needs_str = False\n        for name, t in self.content.items():\n            assert isinstance(t, SchemaType)\n            if not isinstance(t, AddsToStringType):\n                by_type[t.py_name].append(name)\n            else:\n                needs_str = True\n        types = [\n            \"TaggedValue[Literal[{}], {}]\".format(\n                comma_join(sorted(f\"'{n}'\" for n in names), 26), f'\"{t}\"' if quote else t\n            )\n            for t, names in by_type.items()\n        ]\n        str_included = False\n        for b in self.bases:\n            if isinstance(b, ListElement):\n                types.extend(b.py_union_ref())\n                if b.allow_text:\n                    str_included = True\n        if self.allow_text and not str_included:\n            types.append(\"str\")\n        elif needs_str:\n            raise ValueError(\n                f'type \"{self.name}\" cannot have #spType or '\n                + '#char(...) items unless \"allow_text\" is true'\n            )\n        return types\n\n\n@dataclasses.dataclass()\nclass Schema:\n    roots: dict[str, str | SchemaType]\n    types: dict[str, SchemaType]\n\n\nclass EnumEntry(NamedTuple):\n    xml: str\n    id: str\n\n\n@dataclasses.dataclass()\nclass SchemaEnum(AttributeType):\n    \"\"\"A type representing an enumeration.\n\n    This type is represented in python with enum.Enum.\n    \"\"\"\n\n    children: list[EnumEntry]\n    hash: HashData | None = None\n\n    def any_renamed(self) -> bool:\n        return any(c.xml != c.id for c in self.children)\n\n    @property\n    def py_name(self) -> str:\n        return self.name\n\n\n@dataclasses.dataclass()\nclass SchemaCharEnum(AttributeType):\n    \"\"\"An enumeration type whose elements are single characters.\n\n    Unlike SchemaEnum, the values are represented as strings.\n    \"\"\"\n\n    values: str\n\n    @property\n    def py_name(self) -> str:\n        return self.name\n\n\ndef unknown_type_error(ref: str, context: str, is_element: bool) -> NoReturn:\n    thing = \"element\" if is_element else \"attribute\"\n    raise ValueError(f'{thing} \"{context}\" has undefined type \"{ref}\"')\n\n\ndef check_type_ref(schema: Schema, ref: str, context: str, is_element: bool = True) -> SchemaType:\n    \"\"\"Get the schema type that represent the type named by \"ref\" \"\"\"\n\n    t = schema.types.get(ref)\n    if t is None:\n        m = RE_CHAR_TYPE.fullmatch(ref)\n        if m is not None:\n            char = int(m.group(1), 16)\n            if char > 0x10FFFF:\n                raise ValueError(\n                    f'\"char\" type at \"{context}\" must have a value between 0 and 0x10FFFF inclusive'\n                )\n            return CodePointType(char)\n        unknown_type_error(ref, context, is_element)\n    return t\n\n\ndef check_attr_type_ref(schema: Schema, ref: str, context: str) -> AttributeType:\n    \"\"\"Get the schema type that represent the type named by \"ref\" and raise an\n    exception if it's not usable in an XML attribute\"\"\"\n\n    r = check_type_ref(schema, ref, context, False)\n    if isinstance(r, AttributeType):\n        return r\n\n    raise ValueError(f'attribute \"{context}\" has incompatible type \"{ref}\"')\n\n\ndef check_py_name(name: str) -> None:\n    \"\"\"Raise ValueError if \"name\" is not suitable as a Python field name\"\"\"\n\n    if (not name.isidentifier()) or keyword.iskeyword(name):\n        raise ValueError(f'\"{name}\" is not a valid Python identifier')\n    if name == \"_children\":\n        raise ValueError('the name \"_children\" is reserved by the parser generator')\n\n\ndef resolve_refs(schema: Schema) -> tuple[list[str], list[str]]:\n    \"\"\"Replace all type reference names with actual types and return the lists\n    of all element names and attribute names\"\"\"\n\n    elements: set[str] = set()\n    attributes: set[str] = set()\n\n    def check_element_type_defined(name: str, ref: str) -> SchemaType:\n        t = check_type_ref(schema, ref, name)\n        if isinstance(t, ElementType):\n            t.used_directly = True\n        return t\n\n    for name, r in schema.roots.items():\n        elements.add(name)\n        schema.roots[name] = check_element_type_defined(name, cast(\"str\", r))\n\n    for typename, t in schema.types.items():\n        if not t.name:\n            t.name = typename\n\n        if isinstance(t, ElementType):\n            # TODO: check for recursive bases\n            for i, b in enumerate(t.bases):\n                b_type = schema.types.get(cast(\"str\", b))\n                if b_type is None:\n                    raise ValueError(f'type \"{typename}\" has undefined base \"{b}\"')\n                if not isinstance(b_type, ElementType):\n                    raise ValueError(f'\"{b}\" cannot be used as a base')\n                if isinstance(b_type, ListElement):\n                    if not isinstance(t, ListElement):\n                        raise ValueError(\"non-list elements cannot use list elements as bases\")\n                    if b_type.content_type != t.content_type:\n                        raise ValueError(\n                            \"list elements of one type cannot use list elements \"\n                            \"of another type as bases\"\n                        )\n                t.bases[i] = b_type\n            for name, child in t.children.items():\n                child.name = name\n                if not child.py_name:\n                    child.py_name = name\n                check_py_name(child.py_name)\n                elements.add(name)\n                child.type = check_element_type_defined(\n                    f\"{typename}.{name}\", cast(\"str\", child.type)\n                )\n            for name, attr in t.attributes.items():\n                attr.name = name\n                if not attr.py_name:\n                    attr.py_name = name\n                check_py_name(attr.py_name)\n                attributes.add(name)\n                t.attributes[name].type = check_attr_type_ref(schema, cast(\"str\", attr.type), name)\n            if isinstance(t, ListElement):\n                for name, r in t.content.items():\n                    elements.add(name)\n                    t.content[name] = check_element_type_defined(\n                        f\"{typename}.{name}\", cast(\"str\", r)\n                    )\n\n    elements.update(schema.roots)\n\n    return sorted(elements), sorted(attributes)\n\n\nclass HashData(NamedTuple):\n    salt1: str\n    salt2: str\n    g: list[int]\n\n\n# def generate_hash(items: list[str]) -> HashData:\n#    try:\n#        f1, f2, g = perfect_hash.generate_hash(items)\n#        return HashData(f1.salt, f2.salt, g)\n#    except ValueError:\n#        print(items, file=sys.stderr)\n#        raise\n\n\ndef collect_field_names(\n    all_fields: set[str], cur_fields: set[str], refs: Iterable[Attribute | TypeRef], type_name: str\n) -> None:\n    \"\"\"Gather all field names into \"all_fields\" and make sure they are unique in\n    \"cur_fields\" \"\"\"\n\n    for ref in refs:\n        all_fields.add(ref.py_name)\n        if ref.py_name in cur_fields:\n            raise ValueError(f'python name \"{ref.py_name}\" appears more than once in \"{type_name}\"')\n        cur_fields.add(ref.py_name)\n\n\ndef make_env(schema: Schema) -> jinja2.Environment:\n    elements, attributes = resolve_refs(schema)\n    tag_names: set[str] = set(schema.roots)\n    py_field_name_set: set[str] = set()\n    char_enum_chars: set[str] = set()\n    list_element_field_counts: set[int] = set()\n    tagonly_and_tuple_field_counts: set[int] = set()\n    tuple_field_counts: set[int] = set()\n\n    def field_count(t) -> int:\n        if not isinstance(t, ElementType):\n            return 0\n        return (\n            len(t.attributes) + len(t.children) + sum(cast(\"int\", field_count(b)) for b in t.bases)\n        )\n\n    for t in schema.types.values():\n        # if isinstance(t, SchemaEnum):\n        #    if len(t.children) >= HASH_LOOKUP_THRESHOLD:\n        #        t.hash = generate_hash([item.xml for item in t.children])\n        if isinstance(t, SchemaCharEnum):\n            char_enum_chars.update(t.values)\n        elif isinstance(t, ElementType):\n            fields: set[str] = set()\n            collect_field_names(py_field_name_set, fields, t.attributes.values(), t.name)\n            collect_field_names(py_field_name_set, fields, t.children.values(), t.name)\n\n            if isinstance(t, TagOnlyElement):\n                if t.used_directly:\n                    tagonly_and_tuple_field_counts.add(field_count(t))\n            elif isinstance(t, ListElement):\n                if t.used_directly:\n                    list_element_field_counts.add(field_count(t))\n                if t.content_type == ContentType.union:\n                    tag_names.update(\n                        name for name, t in t.content.items() if not isinstance(t, AddsToStringType)\n                    )\n                elif t.content_type == ContentType.tuple:\n                    tuple_field_counts.add(len(t.content))\n                    tagonly_and_tuple_field_counts.add(len(t.content))\n\n    py_field_names = sorted(py_field_name_set)\n\n    tmpl_env = jinja2.Environment(\n        block_start_string=\"{%\",\n        block_end_string=\"%}\",\n        variable_start_string=\"{$\",\n        variable_end_string=\"$}\",\n        comment_start_string=\"/*#\",\n        comment_end_string=\"#*/\",\n        line_statement_prefix=\"//%\",\n        line_comment_prefix=\"//#\",\n        autoescape=False,\n    )\n\n    def has_attributes(t):\n        if not isinstance(t, ElementType):\n            return False\n        return t.attributes or any(has_attributes(b) for b in t.bases)\n\n    def has_children(t):\n        if not isinstance(t, ElementType):\n            return False\n        return t.children or any(has_children(b) for b in t.bases)\n\n    def has_children_or_content(t):\n        if not isinstance(t, ElementType):\n            return False\n        return (\n            t.children\n            or (isinstance(t, ListElement) and t.content)\n            or any(has_children_or_content(b) for b in t.bases)\n        )\n\n    def has_children_or_tuple_content(t):\n        if not isinstance(t, ElementType):\n            return False\n        return (\n            t.children\n            or (\n                isinstance(t, ListElement)\n                and t.content_type == ContentType.tuple\n                and len(t.content) > 1\n            )\n            or any(has_children_or_tuple_content(b) for b in t.bases)\n        )\n\n    def base_offsets(t):\n        if not isinstance(t, ElementType):\n            return tmpl_env.undefined()\n        total = 0\n        for b in t.bases:\n            assert isinstance(b, SchemaType)\n            yield b, total\n            total += field_count(b)\n        yield None, total\n\n    def list_type_or_base(t):\n        if not isinstance(t, ElementType):\n            return False\n        return isinstance(t, ListElement) or any(list_type_or_base(b) for b in t.bases)\n\n    def allow_text(t):\n        if not isinstance(t, ListElement):\n            return False\n        return t.allow_text or any(allow_text(b) for b in t.bases)\n\n    def content_type(ct):\n        def inner(t):\n            if not isinstance(t, ListElement):\n                return False\n            return t.content_type == ct\n\n        return inner\n\n    def children(t):\n        if not isinstance(t, ElementType):\n            return tmpl_env.undefined()\n        return t.children.values()\n\n    def get_attributes(t):\n        if not isinstance(t, ElementType):\n            return tmpl_env.undefined()\n        return t.attributes.values()\n\n    def content(t):\n        if not isinstance(t, ListElement):\n            return tmpl_env.undefined()\n        return t.content.items()\n\n    def used_directly(t):\n        return isinstance(t, ElementType) and t.used_directly\n\n    def optional(ref: TypeRef | Attribute) -> bool:\n        if isinstance(ref, TypeRef):\n            return ref.is_list or ref.min_items == 0\n        return ref.optional\n\n    def array_field(ref) -> bool:\n        if isinstance(ref, TypeRef):\n            return ref.is_list\n        return False\n\n    def needs_finish_fields_call(t):\n        if not isinstance(t, ElementType):\n            return False\n        return any(c.needs_finish() for c in t.children.values()) or any(\n            map(needs_finish_fields_call, t.bases)\n        )\n\n    def needs_finish_call(t):\n        return needs_finish_fields_call(t) or (\n            isinstance(t, ListElement)\n            and t.content_type == ContentType.tuple\n            and len(t.content) > 1\n        )\n\n    def error(msg):\n        raise TypeError(msg)\n\n    class Once:\n        def __init__(self, content):\n            self.content = content\n            self.used = False\n\n        def __call__(self):\n            if self.used:\n                return \"\"\n            self.used = True\n            return self.content\n\n    # types sorted topologically with regard to base elements\n    sorted_types: list[SchemaType] = []\n    visited_types: set[int] = set()\n\n    for t in schema.types.values():\n        t.add_sorted(sorted_types, visited_types)\n        if isinstance(t, ElementType) and any(field_count(cast(\"ElementType\", b)) for b in t.bases):\n            # the code was written to support this but it has never been tested\n            raise ValueError(\n                'elements having bases that have \"attributes\" or \"children\"'\n                \" are not currently supported\"\n            )\n\n    tmpl_env.tests.update({\n        \"element\": (lambda x: isinstance(x, ElementType)),\n        \"tagonly_e\": (lambda x: isinstance(x, TagOnlyElement)),\n        \"list_e\": list_type_or_base,\n        \"builtin_t\": (lambda x: isinstance(x, BuiltinType)),\n        \"enumeration_t\": (lambda x: isinstance(x, SchemaEnum)),\n        \"char_enum_t\": (lambda x: isinstance(x, SchemaCharEnum)),\n        \"appends_str\": (lambda x: isinstance(x, AddsToStringType)),\n        \"code_point_t\": (lambda x: isinstance(x, CodePointType)),\n        \"sp_t\": (lambda x: isinstance(x, CodePointType)),\n        \"used_directly\": used_directly,\n        \"allow_text\": allow_text,\n        \"has_attributes\": has_attributes,\n        \"has_children\": has_children,\n        \"has_children_or_content\": has_children_or_content,\n        \"has_fields\": lambda x: field_count(x) > 0,\n        \"has_children_or_tuple_content\": has_children_or_tuple_content,\n        \"needs_finish_fields_call\": needs_finish_fields_call,\n        \"needs_finish_call\": needs_finish_call,\n        \"content_bare\": content_type(ContentType.bare),\n        \"content_tuple\": content_type(ContentType.tuple),\n        \"content_union\": content_type(ContentType.union),\n        \"optional\": optional,\n        \"array_field\": array_field,\n    })\n    tmpl_env.filters.update({\n        \"field_count\": field_count,\n        \"base_offsets\": base_offsets,\n        \"children\": children,\n        \"attributes\": get_attributes,\n        \"content\": content,\n        \"error\": error,\n        \"Once\": Once,\n    })\n    tmpl_env.globals.update({\n        \"types\": sorted_types,\n        \"root_elements\": list(schema.roots.items()),\n        \"element_names\": elements,\n        \"attribute_names\": attributes,\n        \"py_field_names\": py_field_names,\n        # \"e_hash\": generate_hash(elements),\n        # \"a_hash\": generate_hash(attributes),\n        # \"py_f_hash\": generate_hash(py_field_names),\n        \"union_tag_names\": sorted(tag_names),\n        \"char_enum_chars\": {c: i for i, c in enumerate(sorted(char_enum_chars))},\n        \"list_element_field_counts\": list(list_element_field_counts),\n        \"tagonly_and_tuple_field_counts\": list(tagonly_and_tuple_field_counts),\n        \"tuple_field_counts\": list(tuple_field_counts),\n        \"OtherAttrAction\": OtherAttrAction,\n    })\n\n    return tmpl_env\n\n\nclass _NoDefault:\n    pass\n\n\n_NO_DEFAULT = _NoDefault()\n\n\ndef get_json_value(\n    conv: Callable[[Any, str], T],\n    context: str,\n    d: dict[str, Any],\n    key: str,\n    default: T | _NoDefault = _NO_DEFAULT,\n) -> T:\n    r = d.get(key, _NO_DEFAULT)\n    if r is _NO_DEFAULT:\n        if default is _NO_DEFAULT:\n            raise ValueError(f'missing value for \"{context}.{key}\"')\n        return cast(\"T\", default)\n    return conv(r, context)\n\n\ndef check_simple(t: type[T], name: str) -> Callable[[Any, str], T]:\n    def inner(x, context: str) -> T:\n        if isinstance(x, t):\n            return x\n        raise TypeError(f'value for \"{context}\" must be {name}')\n\n    return inner\n\n\nget_json_bool = functools.partial(get_json_value, check_simple(bool, \"a boolean\"))\nget_json_int = functools.partial(get_json_value, check_simple(int, \"an integer\"))\n\ncheck_string = check_simple(str, \"a string\")\nget_json_str = functools.partial(get_json_value, check_string)\n\ncheck_obj = check_simple(cast(\"type[dict[str, Any]]\", dict), \"an object\")\nget_json_obj = functools.partial(get_json_value, check_obj)\n\ncheck_list = check_simple(list, \"an array\")\n\n\ndef get_json_mapping(\n    item_conv: Callable[[Any, str], T],\n    context: str,\n    d: dict,\n    key: str,\n    default: dict[str, T] | _NoDefault = _NO_DEFAULT,\n) -> dict[str, T]:\n    def check(x, context):\n        x = check_obj(x, context)\n        return {key: item_conv(value, f\"{context}.{key}\") for key, value in x.items()}\n\n    return get_json_value(check, context, d, key, default)\n\n\ndef get_json_list(\n    item_conv: Callable[[Any, str], T],\n    context: str,\n    d: dict,\n    key: str,\n    default: list[T] | _NoDefault = _NO_DEFAULT,\n) -> list[T]:\n    def check(x, context) -> list[T]:\n        x = check_list(x, context)\n        return [item_conv(value, f\"{context}[{i}]\") for i, value in enumerate(x)]\n\n    return get_json_value(check, context, d, key, default)\n\n\ndef check_zero_or_one(x, context: str) -> Literal[0] | Literal[1]:\n    if x == 0:\n        return 0\n    if x == 1:\n        return 1\n    raise TypeError(f'value for \"{context}\" must be 0 or 1')\n\n\nget_json_zero_or_one = functools.partial(get_json_value, check_zero_or_one)\n\n\ndef check_other_attr_action(x, context: str) -> OtherAttrAction:\n    if x == \"ignore\":\n        return OtherAttrAction.ignore\n    if x == \"error\":\n        return OtherAttrAction.error\n    raise TypeError(f'value for \"{context}\" must be \"error\" or \"ignore\"')\n\n\nget_json_other_attr_action = functools.partial(get_json_value, check_other_attr_action)\n\n\ndef check_typeref(x, context: str) -> TypeRef:\n    x = check_obj(x, context)\n    return TypeRef(\n        \"\",\n        get_json_str(context, x, \"py_name\", \"\"),\n        get_json_str(context, x, \"type\"),\n        get_json_bool(context, x, \"is_list\", False),\n        get_json_zero_or_one(context, x, \"min_items\", 1),\n    )\n\n\nget_json_typeref = functools.partial(get_json_value, check_typeref)\n\n\ndef check_attribute(x, context: str) -> Attribute:\n    x = check_obj(x, context)\n    return Attribute(\n        \"\",\n        get_json_str(context, x, \"py_name\", \"\"),\n        get_json_str(context, x, \"type\"),\n        get_json_bool(context, x, \"optional\", False),\n    )\n\n\nget_json_attribute = functools.partial(get_json_value, check_attribute)\n\n\ndef check_enum_entry(x, context: str) -> EnumEntry:\n    if isinstance(x, str):\n        return EnumEntry(x, x)\n    if isinstance(x, dict):\n        xml = get_json_str(context, x, \"xml\")\n        id = get_json_str(context, x, \"id\", xml)\n        if not id.isidentifier():\n            raise ValueError(f'value of \"{context}\" is not a valid Python identifier')\n        return EnumEntry(xml, id)\n    raise TypeError(f'\"{context}\" must be a string or object')\n\n\ndef make_tag_only_element(x: dict[str, Any], context: str) -> TagOnlyElement:\n    return TagOnlyElement(\n        \"\",\n        get_json_list(check_string, context, x, \"bases\", []),\n        get_json_mapping(check_attribute, context, x, \"attributes\", {}),\n        get_json_other_attr_action(context, x, \"other_attr\", OtherAttrAction.error),\n        get_json_mapping(check_typeref, context, x, \"children\", {}),\n        False,\n    )\n\n\ndef make_list_element(x: dict[str, Any], context: str, content_t: ContentType) -> ListElement:\n    return ListElement(\n        \"\",\n        get_json_list(check_string, context, x, \"bases\", []),\n        get_json_mapping(check_attribute, context, x, \"attributes\", {}),\n        get_json_other_attr_action(context, x, \"other_attr\", OtherAttrAction.error),\n        get_json_mapping(check_typeref, context, x, \"children\", {}),\n        False,\n        get_json_int(context, x, \"min_items\", 0),\n        get_json_mapping(check_string, context, x, \"content\", {}),\n        content_t,\n        get_json_bool(context, x, \"allow_text\", False),\n    )\n\n\ndef make_enumeration(x: dict[str, Any], context: str) -> SchemaEnum:\n    return SchemaEnum(\"\", get_json_list(check_enum_entry, context, x, \"values\"))\n\n\ndef make_char_enumeration(x: dict[str, Any], context: str) -> SchemaCharEnum:\n    return SchemaCharEnum(\"\", get_json_str(context, x, \"values\"))\n\n\ndef check_type(x, context: str) -> SchemaType:\n    x = check_obj(x, context)\n    kind = get_json_str(context, x, \"kind\")\n    if kind == \"tag_only_element\":\n        return make_tag_only_element(x, context)\n    if kind == \"list_element\":\n        return make_list_element(x, context, ContentType.bare)\n    if kind == \"union_list_element\":\n        return make_list_element(x, context, ContentType.union)\n    if kind == \"tuple_list_element\":\n        return make_list_element(x, context, ContentType.tuple)\n    if kind == \"enumeration\":\n        return make_enumeration(x, context)\n    if kind == \"char_enumeration\":\n        return make_char_enumeration(x, context)\n\n    raise ValueError(\n        f'\"{context}.kind\" must be \"tag_only_element\", \"list_element\", '\n        '\"mixed_element\" or \"enumeration\"'\n    )\n\n\nget_json_type = functools.partial(get_json_value, check_type)\n\n\ndef check_schema(x) -> Schema:\n    if not isinstance(x, dict):\n        raise TypeError(\"json value must be an object\")\n    r = Schema(\n        get_json_mapping(check_string, \"<root>\", x, \"roots\"),\n        get_json_mapping(check_type, \"<root>\", x, \"types\", {}),\n    )\n    r.types[\"#spType\"] = SpType(\"spType\", \"str\")\n    for t, py in BUILTIN_ATTR_SCHEMA_TYPES:\n        r.types[\"#\" + t] = BuiltinAttributeType(t, py)\n    return r\n\n\ndef generate_from_json(json_path, template_files) -> None:\n    with open(json_path, \"rb\") as ifile:\n        schema = check_schema(json.load(ifile))\n\n    env = make_env(schema)\n\n    for i_file, o_file in template_files:\n        template_str = Path(i_file).read_text(encoding=\"utf-8\")\n        with open(o_file, \"w\", encoding=\"utf-8\") as ofile:\n            env.from_string(template_str).stream().dump(ofile)\n"
  },
  {
    "path": "xml_parser_generator/module_template.py.in",
    "content": "\"\"\"\nPython module to parse Doxygen's XML output.\n\nThis module defines the following types:\n\n- TaggedValue\n\n    TaggedValue is a name/value pair for tagged union values.\n\n- Node\n\n    Node is an empty class used as a base type for all classes that start with\n    \"Node_\".\n\n- Node_X\n\n    These classes are generated according the input schema.\n\n- ListItem_X\n\n    Types that have \"kind\" equal to \"tuple_list_element\" in the schema also have\n    a companion class for their elements. It will have the same name as the main\n    class except it starts with ListItem_ instead of Node_. These are named\n    tuples.\n\n- ParseError\n\n    The exception raised when there is a problem with the XML input that cannot\n    be ignored.\n\n- ParseWarning\n\n    The warning class for possible problems in the XML input. Currently this\n    is only issued for unexpected elements and attributes.\n\n\nEach non-simple type has some or all of the following entities:\n\n- _node_class_attr__X\n\n    Attribute handlers for element X.\n\n    This is a mapping of attribute names to functions that handle the\n    attributes.\n\n- def _node_class_attr_end__X(state: _ParseState, obj)\n\n    This is called after all attributes are handled. It is used to check for\n    unset fields and to fill them with default values or raise an exception.\n    This is a separate function so that derived elements can use it.\n\n- _node_class_child__X\n\n    Element handlers for element X.\n\n    This is a mapping of element names to functions that handle the elements.\n\n- def _node_class_finish_fields__X(state: _ParseState, obj)\n\n    This is called after all child elements are handled. It is used to check for\n    unset fields and to fill them with default values or raise an exception.\n    This is a separate function so that derived elements can use it.\n\n\nIf the type is used directly, it will have its own class and the following\nfunction:\n\n- def _node_class_start__X(state: _ParseState, setter: Callable, attr: Iterable[tuple[str, str]]):\n\n    This has three responsibilities:\n    - To create the object corresponding to element X.\n    - To handle the XML attributes.\n    - To add the new object and the appropriate XML event handlers to the top of\n      the parser stack.\n\n    This function doesn't return a value immediately, instead \"setter\" is called\n    with the value when it's ready.\n\n\"\"\"\n\nfrom __future__ import annotations\n\nimport enum\nimport functools\nimport warnings\nfrom typing import (\n    TYPE_CHECKING,\n    Literal,\n    NamedTuple,\n)\nfrom xml.parsers import expat\n\nif TYPE_CHECKING:\n    import sys\n    from collections.abc import Iterable, Sequence\n    from typing import (\n        Any,\n        Callable,\n        ClassVar,\n        Generic,\n        NoReturn,\n        TypeVar,\n        Union,\n    )\n\n    if sys.version_info >= (3, 11):\n        from typing import TypeAlias\n    else:\n        from typing_extensions import TypeAlias\n\n    T = TypeVar(\"T\")\n    T_covar = TypeVar(\"T_covar\", covariant=True)\n    U_covar = TypeVar(\"U_covar\", covariant=True)\n\n\nclass ParseError(RuntimeError):\n    @property\n    def message(self, /) -> str:\n        return self.args[0]\n\n    @property\n    def lineno(self, /) -> int:\n        return self.args[1]\n    \n    def __str__(self, /) -> str:\n        if self.lineno is None:\n            return \"Error: \" + self.message\n        return f\"Error on line {self.lineno}: {self.message}\"\n\nclass ParseWarning(UserWarning):\n    pass\n\n\nclass Node:\n    __slots__ = ()\n\n    _fields: ClassVar[tuple[str, ...]]\n\n# This needs to run on Python 3.8, where built-in types don't implement\n# __class_getitem__, and Python 3.9 and 3.10, which don't allow\n# multiple-inheritance with NamedTuple.\nif TYPE_CHECKING:\n    class ListNode(list[T], Node, Generic[T]):\n        ...\n\n    class TaggedValue(NamedTuple, Generic[T_covar, U_covar]):\n        name: T_covar\n        value: U_covar\nelse:\n    class TaggedValue(NamedTuple):\n        name: str\n        value: Any\n\n        __class_getitem__ = classmethod(lambda cls, x: cls)\n\n    class ListNode(list, Node):\n        __slots__ = ()\n\n        __class_getitem__ = classmethod(lambda cls, x: cls)\n\n\n//% macro emit_fields(type)\n{%- for b in type.bases %}{$ emit_fields(b) $}{% endfor -%}\n//%   for ref in type|attributes\n    {$ ref.py_name $}: {$ ref.py_type() $}\n//%   endfor\n//%   for ref in type|children\n    {$ ref.py_name $}: {$ ref.py_type() $}\n//%   endfor\n//% endmacro\n\n//% macro emit_content_fields(type)\n{%- for b in type.bases %}{$ emit_content_fields(b) $}{% endfor -%}\n//%   for cname,ctype in type|content\n    {$ cname $}: {$ ctype.py_name $}\n//%   endfor\n//% endmacro\n\n\n//% for type in types\n//%   if type is element\n//%     if type is content_union\n//%       set members = type.py_union_list(true)|sort\n//%       if members|length > 1\nif TYPE_CHECKING:\n    ListItem_{$ type $}: TypeAlias = Union[\n//%         for m in members\n        {$ ', ' if not loop.first $}{$ m $}\n//%         endfor\n    ]\n\n//%       endif\n//%     endif\n//%     if type is used_directly\n//%       if type is content_tuple\n//%         set list_item_type = 'ListItem_'~type\nclass ListItem_{$ type $}(NamedTuple):\n//%         for cname,ctype in type|content\n    {$ cname $}: {$ ctype.py_name $}\n//%         endfor\n\n//%       elif type is content_union\n//%         if members|length > 1\n//%           set list_item_type = 'ListItem_'~type\n//%         else\n//%           set list_item_type = members|first\n//%         endif\n//%       elif type is content_bare\n//%       set list_item_type = (type|content|first)[1].py_name\n//%       elif type is list_e\n{$ \"invalid content type\"|error $}\n//%       endif\nclass Node_{$ type $}({$ 'ListNode[\"'~list_item_type~'\"]' if type is list_e else 'Node' $}):\n    __slots__ = (\n//%       for f in type.all_fields()\n        \"{$ f.py_name $}\",\n//%       endfor\n    )\n\n    _fields = __slots__\n\n//%       if type is list_e or type is has_fields\n    def __init__(\n        self,\n//%         if type is list_e\n        __children,\n//%         endif\n//%         for f in type.all_fields() if f is not optional\n        {$ f.py_name $}: {$ f.py_type(true) $},\n//%         endfor\n//%         for f in type.all_fields() if f is optional\n        {$ f.py_name $}: {$ f.py_type(true) $} = {$ '()' if f is array_field else 'None' $},\n//%         endfor\n    ):  # pragma: no cover\n//%         if type is list_e\n        super().__init__(__children)\n//%         endif\n//%         for f in type.all_fields()\n//%           if f is array_field\n        self.{$ f.py_name $} = {$ f.py_name $} if _GLOBAL_type({$ f.py_name $}) is _GLOBAL_list else _GLOBAL_list({$ f.py_name $})\n//%           else\n        self.{$ f.py_name $} = {$ f.py_name $}\n//%           endif\n//%         endfor\n\n//%       endif\n//%     endif\n//%   elif type is enumeration_t\nclass {$ type $}(enum.Enum):\n//%     for entry in type.children\n    {$ entry.id $} = \"{$ entry.xml $}\"\n//%     endfor\n\n//%   elif type is char_enum_t\n{$ type $} = Literal[{% for c in type.values %}{$ \"'\"~c~\"'\" $}{$ ',' if not loop.last $}{% endfor %}]\n//%   endif\n//% endfor\n\n\ndef parse_str(data: str, /):\n    return _parse(data, expat.XMLParserType.Parse)\n\ndef parse_file(file, /):\n    return _parse(file, expat.XMLParserType.ParseFile)\n\n\n\nif TYPE_CHECKING:\n    _ChildStartCallback = Callable[[\"_ParseState\", Any, Iterable[tuple[str, str]]], None]\n    _FinishCallback = Callable[[\"_ParseState\"], None]\n    _TextCallback = Callable[[\"_ParseState\", str], None]\n    _Setter = Callable[[Any], None]\n\n    _T_covar = TypeVar(\"_T_covar\", covariant=True)\n    _U_covar = TypeVar(\"_U_covar\", covariant=True)\n\n\n_GLOBAL_type = type\n_GLOBAL_list = list\n\n\nclass _ParseCallbacks:\n    __slots__ = \"value\", \"setter\", \"cs_call\", \"f_call\", \"t_call\"\n\n    value: Any\n    \"\"\"The value corresponding the currently visited XML element.\"\"\"\n\n    setter: _Setter | None\n    \"\"\"A callback given by the parent element to consume the value.\n    \n    This may be None if no action is needed.\n    \"\"\"\n\n    cs_call: dict[str, _ChildStartCallback] | None\n    \"\"\"A mapping of element names to callbacks for a children of the current\n    element.\n    \n    This may be None if no child elements are allowed.\n    \"\"\"\n\n    f_call: _FinishCallback | None\n    \"\"\"A callback for when the current element is closed.\n    \n    This may be None if no action is needed.\n    \"\"\"\n\n    t_call: _TextCallback | None\n    \"\"\"A callback for text contained directly inside the current element.\n    \n    This may be None if text is not allowed. If None, whitespace is ignored.\n    \"\"\"\n\n    def __init__(self, value=None, setter=None, cs_call=None, f_call=None, t_call=None):\n        self.value = value\n        self.setter = setter\n        self.cs_call = cs_call\n        self.f_call = f_call\n        self.t_call = t_call\n\n\nclass _ParseState:\n    def __init__(self, parser: expat.XMLParserType, /):\n        self.parser = parser\n        self.parse_callbacks: list[_ParseCallbacks] = []\n\n        # While this is greater than zero all XML content is ignored.\n        # \n        # This starts at zero. When an unexpected element start is encountered,\n        # a warning is issued (via PyErr_WarnFormat) and this is set to 1. Any\n        # subsequent element-starts increment this and element-ends decrement\n        # this until this is zero again, and normal parsing resumes.\n        self.ignore_level: int = 0\n\n    def start_element(self, name: str, attrs: dict[str, str], /) -> None:\n        if self.ignore_level:\n            self.ignore_level += 1\n            return\n\n        cb = self.parse_callbacks[-1]\n\n        if cb.cs_call is not None:\n            handler = cb.cs_call.get(name)\n            if handler is not None:\n                handler(self, cb.value, attrs.items())\n                return\n\n        self.set_parse_warning(f'unexpected element \"{name}\"')\n\n        self.ignore_level = 1\n\n\n    def end_element(self, unused, /) -> None:\n        if self.ignore_level:\n            self.ignore_level -= 1\n            return\n        \n        cb = self.parse_callbacks[-1]\n\n        if cb.f_call is not None:\n            cb.f_call(self)\n\n        if cb.setter is not None:\n            cb.setter(cb.value)\n        self.parse_callbacks.pop()\n\n    def character_data(self, s: str, /) -> None:\n        if self.ignore_level: return\n\n        cb = self.parse_callbacks[-1]\n\n        if cb.t_call is not None:\n            cb.t_call(self, s)\n        elif s and not s.isspace():\n            self.set_parse_warning(\"unexpected character data\")\n\n    def raise_parse_error(self, msg, /) -> NoReturn:\n        raise ParseError(msg, self.parser.CurrentLineNumber)\n\n    def set_parse_warning(self, msg, /) -> None:\n        warnings.warn(ParseWarning(f'Warning on line {self.parser.CurrentLineNumber}: {msg}'))\n\n\ndef _node_list_common_text(state: _ParseState, data: str, /):\n    value = state.parse_callbacks[-1].value\n\n    if value and type(value[-1]) is str:\n        value[-1] += data\n    else:\n        value.append(data)\n\n\ndef _push_tuple_item(\n        state: _ParseState,\n        tuple_i: int,\n        tag_names: Sequence[str],\n        cls,\n        obj,\n        /\n):\n    if tuple_i == 0:\n        if len(obj):\n            tuple_size = len(tag_names)\n            if len(obj[-1]) < tuple_size:\n                state.raise_parse_error(\n                    f'\"{tag_names[0]}\" element can only come after \"{tag_names[tuple_size-1]}\" element or be the first in its group',\n                )\n            \n            obj[-1] = cls._make(obj[-1])\n\n        # tuples are immutable so a list is used while collecting the values\n        new_tuple: list[Any] = []\n        obj.append(new_tuple)\n\n        return new_tuple.append\n\n\n    if not obj or len(obj[-1]) < tuple_i:\n        state.raise_parse_error(\n            f'\"{tag_names[tuple_i]}\" element can only come after \"{tag_names[tuple_i-1]}\" element'\n        )\n\n    return obj[-1].append\n\n\ndef _check_complete_tuple(state: _ParseState, tag_names: Sequence[str], cls, obj, /):\n    if obj:\n        last = obj[-1]\n\n        if len(last) != len(tag_names):\n            state.raise_parse_error(\n                f'\"{tag_names[len(last)]}\" element must come after \"{tag_names[len(last)-1]}\" element'\n            )\n\n        obj[-1] = cls._make(last)\n\n\ndef _warn_unexpected_attribute(state: _ParseState, name: str, /):\n    state.set_parse_warning(f'unexpected attribute \"{name}\"')\n\ndef _raise_missing_attribute_error(state: _ParseState, name: str, /):\n    state.raise_parse_error(f'missing \"{name}\" attribute')\n\ndef _raise_duplicate_element_error(state: _ParseState, name: str, /):\n    state.raise_parse_error(f'\"{name}\" cannot appear more than once in this context')\n\ndef _raise_missing_element_error(state: _ParseState, parent: Any, name: str, /):\n    state.raise_parse_error(f'\"{parent}\" missing \"{name}\" child')\n\ndef _raise_empty_list_element_error(state: _ParseState, name: str, /):\n    state.raise_parse_error(f'at least one \"{name}\" child is required')\n\ndef _raise_invalid_int_error(state: _ParseState, value: str, /):\n    state.raise_parse_error(f'\"{value}\" is not a valid integer')\n\ndef _raise_invalid_enum_error(state: _ParseState, value: str, /):\n    state.raise_parse_error(f'\"{value}\" is not one of the allowed enumeration values')\n\ndef _raise_invalid_char_enum_error(state: _ParseState, c: str, allowed: str, /):\n    state.raise_parse_error(f'\"{c}\" is not one of the allowed character values; must be one of \"{allowed}\"')\n\n\ndef _parse_DoxBool_attribute(state: _ParseState, name: str, value: str, /) -> bool:\n    if value == \"yes\":\n        return True\n    if value == \"no\":\n        return False\n\n    state.raise_parse_error(f'\"{name}\" must be \"yes\" or \"no\"')\n\ndef _node_string_text(state: _ParseState, data: str) -> None:\n    state.parse_callbacks[-1].value += data\n\ndef _node_start_string(state: _ParseState, setter: _Setter, attr: Iterable[tuple[str, str]], /):\n    for name, _ in attr:\n        _warn_unexpected_attribute(state, name)\n\n    state.parse_callbacks.append(_ParseCallbacks('', setter, None, None, _node_string_text))\n\n\ndef _node_start_empty(state: _ParseState, setter: _Setter, attr: Iterable[tuple[str, str]], /):\n    for name, _ in attr:\n        _warn_unexpected_attribute(state, name)\n\n    setter(None)\n    state.parse_callbacks.append(_ParseCallbacks())\n\n\ndef _node_start_spType(state: _ParseState, attr: Iterable[tuple[str, str]], /):\n    c = ' '\n\n    for name, value in attr:\n        if name != \"value\":\n            _warn_unexpected_attribute(state, name)\n\n        try:\n            c_i = int(value, 10)\n        except ValueError:\n            state.raise_parse_error('\"value\" must be a valid integer')\n        if 0 > c_i > 127:\n            state.raise_parse_error('\"value\" must be between 0 and 127')\n\n        c = chr(c_i)\n\n    state.parse_callbacks.append(_ParseCallbacks())\n    return c\n\ndef _node_start_const_char(state: _ParseState, attr: Iterable[tuple[str, str]], /):\n    for name, _ in attr:\n        _warn_unexpected_attribute(state, name)\n\n    state.parse_callbacks.append(_ParseCallbacks())\n\ndef _union_codepoint_element(c):\n    def inner(state: _ParseState, obj, attr: Iterable[tuple[str, str]], /) -> None:\n        if obj and type(obj[-1]) is str:\n            obj[-1] += c\n        else:\n            obj.append(c)\n        \n        _node_start_const_char(state, attr)\n    return inner\n\n_cur_list: dict[str, Callable]\ndef _add_to_list(name):\n    def inner(f):\n        global _cur_list\n        _cur_list[name] = f\n    return inner\n\n//% for type in types\n//%   if type is element\n//%     if type is has_attributes\n_node_class_attr__{$ type $} = _cur_list = {}\n//%       for b in type.bases|select('has_attributes')\n_node_class_attr__{$ type $}.update(node_class_attr__{$ b $})\n//%       endfor\n\n//%       for attr in type|attributes\n@_add_to_list(\"{$ attr.name $}\")\ndef _a__{$ type $}__{$ attr.name $}(state: _ParseState, obj, value: str, /):\n//%         if attr.type is builtin_t\n//%           if attr.type.name == \"string\"\n    obj.{$ attr.py_name $} = value\n//%           elif attr.type.name == \"integer\"\n    try:\n        obj.{$ attr.py_name $} = int(value, 10)\n    except ValueError:\n        _raise_invalid_int_error(state, value)\n//%           else\n    obj.{$ attr.py_name $} = _parse_{$ attr.type $}_attribute(state, \"{$ attr.name $}\", value)\n//%           endif\n//%         elif attr.type is enumeration_t\n    try:\n        obj.{$ attr.py_name $} = {$ attr.type $}(value.strip())\n    except ValueError:\n        _raise_invalid_enum_error(state, value)\n//%         else\n    obj.{$ attr.py_name $} = _parse__{$ attr.type $}(state, value)\n//%         endif\n\n//%       endfor\ndef _node_class_attr_end__{$ type $}(state: _ParseState, obj, /):\n//%       for b in type.bases if b is has_attributes\n    _node_class_attr_end__{$ b $}(state, obj)\n//%       endfor\n//%       for ref in type|attributes\n    if not hasattr(obj, \"{$ ref.py_name $}\"):\n//%         if ref.optional\n        obj.{$ ref.py_name $} = None\n//%         else\n        _raise_missing_attribute_error(state,\"{$ ref.name $}\")\n//%         endif\n//%       endfor\n\n//%     endif\n//%     if type is has_children_or_content\n_node_class_child__{$ type $} = _cur_list = {}\n//%       for b in type.bases|select('has_children_or_content')\n_node_class_child__{$ type $}.update(_node_class_child__{$ b $})\n//%       endfor\n\n//%       for cref in type|children\n@_add_to_list(\"{$ cref.name $}\")\ndef _e__{$ type $}__{$ cref.name $}(state: _ParseState, obj, attr: Iterable[tuple[str, str]], /):\n//%         if cref.is_list\n    _node_{$ 'start_' if cref.type is builtin_t else 'class_start__' $}{$ cref.type $}(\n        state,\n        obj.{$ cref.py_name $}.append,\n        attr{$ cref.type.extra_args $})\n//%         else\n    if hasattr(obj, \"{$ cref.py_name $}\"):\n        _raise_duplicate_element_error(state, \"{$ cref.name $}\")\n\n    _node_{$ 'start_' if cref.type is builtin_t else 'class_start__' $}{$ cref.type $}(\n        state,\n        functools.partial(setattr, obj, \"{$ cref.py_name $}\"),\n        attr{$ cref.type.extra_args $})\n//%         endif\n\n//%       endfor\n//%       for cname,ctype in type|content\n//%         if type is content_union and ctype is code_point_t\n_add_to_list(\"{$ cname $}\")(_union_codepoint_element(chr({$ ctype.char $})))\n//%         else\n@_add_to_list(\"{$ cname $}\")\ndef _e__{$ type $}__{$ cname $}(state: _ParseState, obj, attr: Iterable[tuple[str, str]], /):\n//%           if type is content_tuple\n    _node_{$ 'start_' if ctype is builtin_t else 'class_start__' $}{$ ctype $}(\n        state,\n        _push_tuple_item(\n            state,\n            {$ loop.index0 $},\n            _tuple_item_tag_names__{$ type $},\n            ListItem_{$ type $},\n            obj),\n        attr{$ ctype.extra_args $})\n//%           elif type is content_union\n//%             if ctype is appends_str\n    c = _node_{$ 'start_' if ctype is builtin_t else 'class_start__' $}{$ ctype $}(state, attr)\n    if obj and type(obj[-1]) is str:\n        obj[-1] += c\n    else:\n        obj.append(c)\n//%             else\n    _node_{$ 'start_' if ctype is builtin_t else 'class_start__' $}{$ ctype $}(\n        state,\n        (lambda x: obj.append(TaggedValue(\"{$ cname $}\", x))),\n        attr{$ ctype.extra_args $})\n//%             endif\n//%           else\n    _node_{$ 'start_' if ctype is builtin_t else 'class_start__' $}{$ ctype $}(\n        state,\n        obj.append,\n        attr{$ ctype.extra_args $})\n//%           endif\n//%         endif\n\n//%       endfor\n//%     endif\n//%     if type is used_directly\n//%       if type is content_tuple\n_tuple_item_tag_names__{$ type $} = ListItem_{$ type $}._fields\n\n//%       elif type is content_union\n//%       elif type is content_bare\n//%         set list_item_type = (type|content|first)[1].py_name\n//%       elif type is list_e\n{$ \"invalid content type\"|error $}\n//%       endif\n\ndef _node_class_start__{$ type $}(state: _ParseState, setter: Callable, attr: Iterable[tuple[str, str]], /):\n    n = Node_{$ type $}.__new__(Node_{$ type $})\n\n//%       for ref in type|children if ref.is_list\n    n.{$ ref.py_name $} = []\n//%       endfor\n\n//%       if type is has_attributes or type.other_attr == OtherAttrAction.error\n    for name, value in attr:\n//%         if type is has_attributes\n        handler = _node_class_attr__{$ type $}.get(name)\n\n        if handler is not None:\n            handler(state, n, value)\n//%           if type.other_attr == OtherAttrAction.error\n        else:\n            _warn_unexpected_attribute(state, name)\n//%           endif\n//%         else\n        _warn_unexpected_attribute(state, name)\n//%         endif\n\n//%       endif\n//%       if type is has_attributes\n    _node_class_attr_end__{$ type $}(state, n)\n//%       endif\n\n    state.parse_callbacks.append(_ParseCallbacks(\n        n,\n        setter,\n//%       if type is has_children_or_content\n        _node_class_child__{$ type $},\n//%       else\n        None,\n//%       endif\n//%       if type is needs_finish_call\n        _node_class_finish__{$ type $},\n//%       else\n        None,\n//%       endif\n//%       if type is allow_text\n        _node_list_common_text,\n//%       else\n        None,\n//%       endif\n    ))\n\n\n//%       if type is needs_finish_fields_call\ndef _node_class_finish_fields__{$ type $}(state: _ParseState, obj, /) -> None:\n//%         for b in type.bases|select('needs_finish_fields_call')\n    _node_class_finish_fields__{$ b $}(state, obj)\n//%         endfor\n//%         for ref in type|children\n//%           if ref.min_items\n//%             if ref.is_list\n    if len(obj.{$ ref.py_name $}) < 1:\n        _raise_empty_list_element_error(state,\"{$ ref.name $}\")\n//%             else\n    if not hasattr(obj, \"{$ ref.py_name $}\"):\n        _raise_missing_element_error(state, obj, \"{$ ref.name $}\")\n//%             endif\n//%           elif not ref.is_list\n    if not hasattr(obj, \"{$ ref.py_name $}\"):\n        obj.{$ ref.py_name $} = None\n//%           endif\n//%         endfor\n\n//%       endif\n//%       if type is needs_finish_call\ndef _node_class_finish__{$ type $}(state: _ParseState, /):\n    n = state.parse_callbacks[-1].value\n//%         if type is needs_finish_fields_call\n    _node_class_finish_fields__{$ type $}(state, n)\n//%         endif\n//%         if type is content_tuple and type.content|length > 1\n    _check_complete_tuple(state, _tuple_item_tag_names__{$ type $}, ListItem_{$ type $}, n)\n//%         endif\n\n//%       endif\n//%     endif\n//%   elif type is char_enum_t\ndef _parse__{$ type $}(state: _ParseState, data, /):\n    data = data.strip()\n    if len(data) != 1:\n        state.raise_parse_error(\"value must be a single character\")\n    \n    if data not in \"{$ type.values $}\":\n        _raise_invalid_char_enum_error(state, data,\"{$ type.values $}\")\n    \n    return data\n\n//%   endif\n//% endfor\n\n_top_level_handlers = _cur_list = {}\n\n//% for name,type in root_elements\n@_add_to_list(\"{$ name $}\")\ndef _(state: _ParseState, obj, attr: Iterable[tuple[str, str]], /):\n    cb = state.parse_callbacks[-1]\n    if obj is not None:\n        state.raise_parse_error(\"cannot have more than one root element\")\n\n    def setter(x):\n        cb.value = TaggedValue(\"{$ name $}\", x)\n\n    return _node_{$ 'start_' if ctype is builtin_t else 'class_start__' $}{$ type $}(state, setter, attr)\n//% endfor\n\n\ndef _parse(obj, meth, /):\n    p = expat.ParserCreate()\n    state = _ParseState(p)\n\n    state.parse_callbacks.append(_ParseCallbacks(\n        None,\n        None,\n        _top_level_handlers))\n\n    p.StartElementHandler = state.start_element\n    p.EndElementHandler = state.end_element\n    p.CharacterDataHandler = state.character_data\n\n    try:\n        meth(p, obj)\n    except expat.ExpatError as e:\n        raise ParseError(expat.errors.messages[e.code], e.lineno)\n    finally:\n        # break reference cycle for faster garbage collection\n        p.StartElementHandler = None\n        p.EndElementHandler = None\n        p.CharacterDataHandler = None\n\n    value = state.parse_callbacks[0].value\n    if value is None:\n        raise ParseError(\"document without a recognized root element\", None)\n\n    return value\n"
  },
  {
    "path": "xml_parser_generator/schema.json",
    "content": "{\n  \"roots\": {\n    \"doxygen\": \"DoxygenType\",\n    \"doxygenindex\": \"DoxygenTypeIndex\"\n  },\n  \"types\": {\n    \"DoxygenTypeIndex\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"version\":              {\"type\": \"#string\"}\n      },\n      \"other_attr\":             \"ignore\",\n      \"children\": {\n        \"compound\":             {\"type\": \"CompoundType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"CompoundType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"},\n        \"kind\":                 {\"type\": \"CompoundKind\"}\n      },\n      \"children\": {\n        \"name\":                 {\"type\": \"#string\"},\n        \"member\":               {\"type\": \"MemberType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"DoxygenType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"version\":              {\"type\": \"#string\"}\n      },\n      \"other_attr\":             \"ignore\",\n      \"children\": {\n        \"compounddef\":          {\"type\": \"compounddefType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"compounddefType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"abstract\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"final\":                {\"type\": \"#DoxBool\", \"optional\": true},\n        \"id\":                   {\"type\": \"#string\"},\n        \"inline\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"kind\":                 {\"type\": \"DoxCompoundKind\"},\n        \"language\":             {\"type\": \"DoxLanguage\", \"optional\": true},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\", \"optional\": true},\n        \"sealed\":               {\"type\": \"#DoxBool\", \"optional\": true}\n      },\n      \"children\": {\n        \"basecompoundref\":      {\"type\": \"compoundRefType\", \"is_list\": true, \"min_items\": 0},\n        \"briefdescription\":     {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"collaborationgraph\":   {\"type\": \"graphType\", \"min_items\": 0},\n        \"compoundname\":         {\"type\": \"#string\"},\n        \"derivedcompoundref\":   {\"type\": \"compoundRefType\", \"is_list\": true, \"min_items\": 0},\n        \"detaileddescription\":  {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"exports\":              {\"type\": \"exportsType\", \"min_items\": 0},\n        \"incdepgraph\":          {\"type\": \"graphType\", \"min_items\": 0},\n        \"includedby\":           {\"type\": \"incType\", \"is_list\": true, \"min_items\": 0},\n        \"includes\":             {\"type\": \"incType\", \"is_list\": true, \"min_items\": 0},\n        \"inheritancegraph\":     {\"type\": \"graphType\", \"min_items\": 0},\n        \"initializer\":          {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"innerclass\":           {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innerconcept\":         {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innerdir\":             {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innerfile\":            {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innergroup\":           {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innermodule\":          {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innernamespace\":       {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"innerpage\":            {\"type\": \"refType\", \"is_list\": true, \"min_items\": 0},\n        \"invincdepgraph\":       {\"type\": \"graphType\", \"min_items\": 0},\n        \"listofallmembers\":     {\"type\": \"listofallmembersType\", \"min_items\": 0},\n        \"location\":             {\"type\": \"locationType\", \"min_items\": 0},\n        \"programlisting\":       {\"type\": \"listingType\", \"min_items\": 0},\n        \"qualifier\":            {\"type\": \"#string\", \"is_list\": true, \"min_items\": 0},\n        \"requiresclause\":       {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"sectiondef\":           {\"type\": \"sectiondefType\", \"is_list\": true, \"min_items\": 0},\n        \"tableofcontents\":      {\"type\": \"tableofcontentsType\", \"min_items\": 0},\n        \"templateparamlist\":    {\"type\": \"templateparamlistType\", \"min_items\": 0},\n        \"title\":                {\"type\": \"#string\", \"min_items\": 0}\n      }\n    },\n    \"graphType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"node\":                 {\"type\": \"nodeType\", \"is_list\": true, \"min_items\": 1}\n      }\n    },\n    \"templateparamlistType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"param\":                {\"type\": \"paramType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"sectiondefType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"kind\":                 {\"type\": \"DoxSectionKind\"}\n      },\n      \"children\": {\n        \"description\":          {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"header\":               {\"type\": \"#string\", \"min_items\": 0},\n        \"member\":               {\"type\": \"MemberType\", \"is_list\": true, \"min_items\": 0},\n        \"memberdef\":            {\"type\": \"memberdefType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"tableofcontentsType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"tocsect\":              {\"type\": \"tableofcontentsKindType\", \"is_list\": true, \"min_items\": 1},\n        \"tableofcontents\":      {\"type\": \"tableofcontentsType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"linkedTextType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"ref\":                  \"refTextType\"\n      }\n    },\n    \"descriptionType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"children\": {\n        \"title\":                {\"type\": \"#string\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"internal\":             \"docInternalType\",\n        \"para\":                 \"docParaType\",\n        \"sect1\":                \"docSect1Type\",\n        \"sect2\":                \"docSect2Type\",\n        \"sect3\":                \"docSect3Type\"\n      }\n    },\n    \"exportsType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"export\":               {\"type\": \"exportType\", \"is_list\": true, \"min_items\": 1}\n      }\n    },\n    \"listingType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"filename\":             {\"type\": \"#string\", \"optional\": true}\n      },\n      \"children\": {\n        \"codeline\":             {\"type\": \"codelineType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"locationType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"bodyend\":              {\"type\": \"#integer\", \"optional\": true},\n        \"bodyfile\":             {\"type\": \"#string\", \"optional\": true},\n        \"bodystart\":            {\"type\": \"#integer\", \"optional\": true},\n        \"column\":               {\"type\": \"#integer\", \"optional\": true},\n        \"declcolumn\":           {\"type\": \"#integer\", \"optional\": true},\n        \"declfile\":             {\"type\": \"#string\", \"optional\": true},\n        \"declline\":             {\"type\": \"#integer\", \"optional\": true},\n        \"file\":                 {\"type\": \"#string\"},\n        \"line\":                 {\"type\": \"#integer\", \"optional\": true}\n      }\n    },\n    \"listofallmembersType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"member\":               {\"type\": \"memberRefType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"memberRefType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"ambiguityscope\":       {\"type\": \"#string\", \"optional\": true},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\"},\n        \"refid\":                {\"type\": \"#string\"},\n        \"virt\":                 {\"type\": \"DoxVirtualKind\"}\n      },\n      \"children\": {\n        \"name\":                 {\"type\": \"#string\"},\n        \"scope\":                {\"type\": \"#string\"}\n      }\n    },\n    \"memberdefType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"accessor\":             {\"type\": \"DoxAccessor\", \"optional\": true},\n        \"add\":                  {\"type\": \"#DoxBool\", \"optional\": true},\n        \"attribute\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"bound\":                {\"type\": \"#DoxBool\", \"optional\": true},\n        \"const\":                {\"type\": \"#DoxBool\", \"optional\": true},\n        \"constexpr\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"consteval\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"constinit\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"constrained\":          {\"type\": \"#DoxBool\", \"optional\": true},\n        \"explicit\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"extern\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"final\":                {\"type\": \"#DoxBool\", \"optional\": true},\n        \"gettable\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"id\":                   {\"type\": \"#string\"},\n        \"initonly\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"inline\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"kind\":                 {\"type\": \"DoxMemberKind\"},\n        \"maybeambiguous\":       {\"type\": \"#DoxBool\", \"optional\": true},\n        \"maybedefault\":         {\"type\": \"#DoxBool\", \"optional\": true},\n        \"maybevoid\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"mutable\":              {\"type\": \"#DoxBool\", \"optional\": true},\n        \"new\":                  {\"type\": \"#DoxBool\", \"optional\": true},\n        \"nodiscard\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"noexcept\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"noexceptexpression\":   {\"type\": \"#string\",  \"optional\": true},\n        \"optional\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"privategettable\":      {\"type\": \"#DoxBool\", \"optional\": true},\n        \"privatesettable\":      {\"type\": \"#DoxBool\", \"optional\": true},\n        \"property\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\"},\n        \"protectedgettable\":    {\"type\": \"#DoxBool\", \"optional\": true},\n        \"protectedsettable\":    {\"type\": \"#DoxBool\", \"optional\": true},\n        \"raise\":                {\"type\": \"#DoxBool\", \"optional\": true, \"py_name\": \"raise_\"},\n        \"readable\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"readonly\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"refqual\":              {\"type\": \"DoxRefQualifierKind\", \"optional\": true},\n        \"removable\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"remove\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"required\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"sealed\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"settable\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"static\":               {\"type\": \"#DoxBool\"},\n        \"strong\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"transient\":            {\"type\": \"#DoxBool\", \"optional\": true},\n        \"virt\":                 {\"type\": \"DoxVirtualKind\", \"optional\": true},\n        \"volatile\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"writable\":             {\"type\": \"#DoxBool\", \"optional\": true}\n      },\n      \"children\": {\n        \"argsstring\":           {\"type\": \"#string\", \"min_items\": 0},\n        \"bitfield\":             {\"type\": \"#string\", \"min_items\": 0},\n        \"briefdescription\":     {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"definition\":           {\"type\": \"#string\", \"min_items\": 0},\n        \"detaileddescription\":  {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"enumvalue\":            {\"type\": \"enumvalueType\", \"is_list\": true, \"min_items\": 0},\n        \"exceptions\":           {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"inbodydescription\":    {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"initializer\":          {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"location\":             {\"type\": \"locationType\"},\n        \"name\":                 {\"type\": \"#string\"},\n        \"param\":                {\"type\": \"paramType\", \"is_list\": true, \"min_items\": 0},\n        \"qualifiedname\":        {\"type\": \"#string\", \"min_items\": 0},\n        \"qualifier\":            {\"type\": \"#string\", \"is_list\": true, \"min_items\": 0},\n        \"read\":                 {\"type\": \"#string\", \"min_items\": 0},\n        \"referencedby\":         {\"type\": \"referenceType\", \"is_list\": true, \"min_items\": 0},\n        \"references\":           {\"type\": \"referenceType\", \"is_list\": true, \"min_items\": 0},\n        \"reimplementedby\":      {\"type\": \"reimplementType\", \"is_list\": true, \"min_items\": 0},\n        \"reimplements\":         {\"type\": \"reimplementType\", \"is_list\": true, \"min_items\": 0},\n        \"requiresclause\":       {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"templateparamlist\":    {\"type\": \"templateparamlistType\", \"min_items\": 0},\n        \"type\":                 {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"write\":                {\"type\": \"#string\", \"min_items\": 0}\n      }\n    },\n    \"MemberType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"kind\":                 {\"type\": \"MemberKind\"},\n        \"refid\":                {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"name\":                 {\"type\": \"#string\"}\n      }\n    },\n    \"paramType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"array\":                {\"type\": \"#string\", \"min_items\": 0},\n        \"attributes\":           {\"type\": \"#string\", \"min_items\": 0},\n        \"briefdescription\":     {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"declname\":             {\"type\": \"#string\", \"min_items\": 0},\n        \"defname\":              {\"type\": \"#string\", \"min_items\": 0},\n        \"defval\":               {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"type\":                 {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"typeconstraint\":       {\"type\": \"linkedTextType\", \"min_items\": 0}\n      }\n    },\n    \"enumvalueType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\"}\n      },\n      \"children\": {\n        \"briefdescription\":     {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"detaileddescription\":  {\"type\": \"descriptionType\", \"min_items\": 0},\n        \"initializer\":          {\"type\": \"linkedTextType\", \"min_items\": 0},\n        \"name\":                 {\"type\": \"#string\"}\n      }\n    },\n    \"referenceType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"compoundref\":          {\"type\": \"#string\", \"optional\": true},\n        \"endline\":              {\"type\": \"#integer\", \"optional\": true},\n        \"refid\":                {\"type\": \"#string\"},\n        \"startline\":            {\"type\": \"#integer\", \"optional\": true}\n      }\n    },\n    \"docInternalType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect1\":                \"docSect1Type\"\n      }\n    },\n    \"docSect1Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect2\":                \"docSect2Type\",\n        \"sect3\":                \"docSect3Type\",\n        \"internal\":             \"docInternalS1Type\"\n      }\n    },\n    \"nodeType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"childnode\":            {\"type\": \"childnodeType\", \"is_list\": true, \"min_items\": 0},\n        \"label\":                {\"type\": \"#string\"},\n        \"link\":                 {\"type\": \"linkType\", \"min_items\": 0}\n      }\n    },\n    \"linkType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"external\":             {\"type\": \"#string\", \"optional\": true},\n        \"refid\":                {\"type\": \"#string\"}\n      }\n    },\n    \"childnodeType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"},\n        \"relation\":             {\"type\": \"DoxGraphRelation\"}\n      },\n      \"children\": {\n        \"edgelabel\":            {\"type\": \"#string\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"codelineType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"external\":             {\"type\": \"#DoxBool\", \"optional\": true},\n        \"lineno\":               {\"type\": \"#integer\", \"optional\": true},\n        \"refid\":                {\"type\": \"#string\", \"optional\": true},\n        \"refkind\":              {\"type\": \"DoxRefKind\", \"optional\": true}\n      },\n      \"children\": {\n        \"highlight\":            {\"type\": \"highlightType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"highlightType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"class\":                {\"type\": \"DoxHighlightClass\", \"py_name\": \"class_\"}\n      },\n      \"content\": {\n        \"sp\":                   \"#spType\",\n        \"ref\":                  \"refTextType\"\n      }\n    },\n    \"docInternalS1Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect2\":                \"docSect2Type\"\n      }\n    },\n    \"docSect2Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect3\":                \"docSect3Type\",\n        \"internal\":             \"docInternalS2Type\"\n      }\n    },\n    \"docSect3Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect4\":                \"docSect4Type\",\n        \"internal\":             \"docInternalS3Type\"\n      }\n    },\n    \"docInternalS2Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect3\":                \"docSect3Type\"\n      }\n    },\n    \"docSect4Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect5\":                \"docSect5Type\",\n        \"internal\":             \"docInternalS4Type\"\n      }\n    },\n    \"docSect5Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect6\":                \"docSect6Type\",\n        \"internal\":             \"docInternalS5Type\"\n      }\n    },\n    \"docSect6Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"internal\":             \"docInternalS6Type\"\n      }\n    },\n    \"docInternalS3Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect3\":                \"docSect4Type\"\n      }\n    },\n    \"docInternalS4Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect5\":                \"docSect4Type\"\n      }\n    },\n    \"docInternalS5Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\",\n        \"sect6\":                \"docSect4Type\"\n      }\n    },\n    \"docInternalS6Type\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"para\":                 \"docParaType\"\n      }\n    },\n    \"docListItemType\": {\n      \"kind\": \"list_element\",\n      \"attributes\": {\n        \"override\":             {\"type\": \"DoxCheck\", \"optional\": true},\n        \"value\":                {\"type\": \"#integer\", \"optional\": true}\n      },\n      \"content\": {\n        \"para\":                 \"docParaType\"\n      }\n    },\n    \"docCaptionType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      }\n    },\n    \"docRowType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"entry\":                {\"type\": \"docEntryType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docEntryType\": {\n      \"kind\": \"tag_only_element\",\n      \"any_attr\": true,\n      \"attributes\": {\n        \"align\":                {\"type\": \"DoxAlign\", \"optional\": true},\n        \"class\":                {\"type\": \"#string\", \"py_name\": \"class_\", \"optional\": true},\n        \"colspan\":              {\"type\": \"#integer\", \"optional\": true},\n        \"rowspan\":              {\"type\": \"#integer\", \"optional\": true},\n        \"thead\":                {\"type\": \"#DoxBool\"},\n        \"valign\":               {\"type\": \"DoxVerticalAlign\", \"optional\": true},\n        \"width\":                {\"type\": \"#string\", \"optional\": true}\n      },\n      \"children\": {\n        \"para\":                 {\"type\": \"docParaType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docTocItemType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      }\n    },\n    \"docParamListItem\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"parameterdescription\": {\"type\": \"descriptionType\"},\n        \"parameternamelist\":    {\"type\": \"docParamNameList\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docParamNameList\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"parametername\":        {\"type\": \"docParamName\", \"is_list\": true, \"min_items\": 0},\n        \"parametertype\":        {\"type\": \"docParamType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docParamType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"ref\":                  \"refTextType\"\n      }\n    },\n    \"docParamName\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"direction\":            {\"type\": \"DoxParamDir\", \"optional\": true}\n      },\n      \"content\": {\n        \"ref\":                  \"refTextType\"\n      }\n    },\n    \"tableofcontentsKindType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"name\":                 {\"type\": \"#string\"},\n        \"reference\":            {\"type\": \"#string\"},\n        \"tableofcontents\":      {\"type\": \"tableofcontentsType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"incType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\", \"optional\": true},\n        \"local\":                {\"type\": \"#DoxBool\"}\n      }\n    },\n    \"compoundRefType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\", \"optional\": true},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\"},\n        \"virt\":                 {\"type\": \"DoxVirtualKind\"}\n      }\n    },\n    \"refType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"},\n        \"prot\":                 {\"type\": \"DoxProtectionKind\", \"optional\": true},\n        \"inline\":               {\"type\": \"#DoxBool\", \"optional\": true}\n      }\n    },\n    \"exportType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"refTextType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"},\n        \"kindref\":              {\"type\": \"DoxRefKind\"},\n        \"external\":             {\"type\": \"#string\", \"optional\": true},\n        \"tooltip\":              {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"reimplementType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"}\n      }\n    },\n    \"DoxRefKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\"compound\", \"member\"]\n    },\n    \"MemberKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"define\",\n        \"property\",\n        \"event\",\n        \"variable\",\n        \"typedef\",\n        \"enum\",\n        \"enumvalue\",\n        \"function\",\n        \"signal\",\n        \"prototype\",\n        \"friend\",\n        \"dcop\",\n        \"slot\"\n      ]\n    },\n    \"DoxMemberKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"define\",\n        \"property\",\n        \"event\",\n        \"variable\",\n        \"typedef\",\n        \"enum\",\n        \"function\",\n        \"signal\",\n        \"prototype\",\n        \"friend\",\n        \"dcop\",\n        \"slot\",\n        \"interface\",\n        \"service\"\n      ]\n    },\n    \"docTitleCmdGroup\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"content\": {\n        \"ulink\": \"docURLLink\",\n        \"bold\": \"docMarkupType\",\n        \"s\": \"docMarkupType\",\n        \"strike\": \"docMarkupType\",\n        \"underline\": \"docMarkupType\",\n        \"emphasis\": \"docMarkupType\",\n        \"computeroutput\": \"docMarkupType\",\n        \"subscript\": \"docMarkupType\",\n        \"superscript\": \"docMarkupType\",\n        \"center\": \"docMarkupType\",\n        \"small\": \"docMarkupType\",\n        \"cite\": \"docMarkupType\",\n        \"del\": \"docMarkupType\",\n        \"ins\": \"docMarkupType\",\n        \"htmlonly\": \"docHtmlOnlyType\",\n        \"manonly\": \"#string\",\n        \"xmlonly\": \"#string\",\n        \"rtfonly\": \"#string\",\n        \"latexonly\": \"#string\",\n        \"docbookonly\": \"#string\",\n        \"image\": \"docImageType\",\n        \"dot\": \"docDotMscType\",\n        \"msc\": \"docDotMscType\",\n        \"plantuml\": \"docPlantumlType\",\n        \"anchor\": \"docAnchorType\",\n        \"formula\": \"docFormulaType\",\n        \"ref\": \"docRefTextType\",\n        \"emoji\": \"docEmojiType\",\n        \"linebreak\": \"#char(A)\",\n        \"nonbreakablespace\": \"#char(A0)\",\n        \"iexcl\": \"#char(A1)\",\n        \"cent\": \"#char(A2)\",\n        \"pound\": \"#char(A3)\",\n        \"curren\": \"#char(A4)\",\n        \"yen\": \"#char(A5)\",\n        \"brvbar\": \"#char(A6)\",\n        \"sect\": \"#char(A7)\",\n        \"umlaut\": \"#char(A8)\",\n        \"copy\": \"#char(A9)\",\n        \"ordf\": \"#char(AA)\",\n        \"laquo\": \"#char(AB)\",\n        \"not\": \"#char(AC)\",\n        \"shy\": \"#char(AD)\",\n        \"registered\": \"#char(AE)\",\n        \"macr\": \"#char(AF)\",\n        \"deg\": \"#char(B0)\",\n        \"plusmn\": \"#char(B1)\",\n        \"sup2\": \"#char(B2)\",\n        \"sup3\": \"#char(B3)\",\n        \"acute\": \"#char(B4)\",\n        \"micro\": \"#char(B5)\",\n        \"para\": \"#char(B6)\",\n        \"middot\": \"#char(B7)\",\n        \"cedil\": \"#char(B8)\",\n        \"sup1\": \"#char(B9)\",\n        \"ordm\": \"#char(BA)\",\n        \"raquo\": \"#char(BB)\",\n        \"frac14\": \"#char(BC)\",\n        \"frac12\": \"#char(BD)\",\n        \"frac34\": \"#char(BE)\",\n        \"iquest\": \"#char(BF)\",\n        \"Agrave\": \"#char(C0)\",\n        \"Aacute\": \"#char(C1)\",\n        \"Acirc\": \"#char(C2)\",\n        \"Atilde\": \"#char(C3)\",\n        \"Aumlaut\": \"#char(C4)\",\n        \"Aring\": \"#char(C5)\",\n        \"AElig\": \"#char(C6)\",\n        \"Ccedil\": \"#char(C7)\",\n        \"Egrave\": \"#char(C8)\",\n        \"Eacute\": \"#char(C9)\",\n        \"Ecirc\": \"#char(CA)\",\n        \"Eumlaut\": \"#char(CB)\",\n        \"Igrave\": \"#char(CC)\",\n        \"Iacute\": \"#char(CD)\",\n        \"Icirc\": \"#char(CE)\",\n        \"Iumlaut\": \"#char(CF)\",\n        \"ETH\": \"#char(D0)\",\n        \"Ntilde\": \"#char(D1)\",\n        \"Ograve\": \"#char(D2)\",\n        \"Oacute\": \"#char(D3)\",\n        \"Ocirc\": \"#char(D4)\",\n        \"Otilde\": \"#char(D5)\",\n        \"Oumlaut\": \"#char(D6)\",\n        \"times\": \"#char(D7)\",\n        \"Oslash\": \"#char(D8)\",\n        \"Ugrave\": \"#char(D9)\",\n        \"Uacute\": \"#char(DA)\",\n        \"Ucirc\": \"#char(DB)\",\n        \"Uumlaut\": \"#char(DC)\",\n        \"Yacute\": \"#char(DD)\",\n        \"THORN\": \"#char(DE)\",\n        \"szlig\": \"#char(DF)\",\n        \"agrave\": \"#char(E0)\",\n        \"aacute\": \"#char(E1)\",\n        \"acirc\": \"#char(E2)\",\n        \"atilde\": \"#char(E3)\",\n        \"aumlaut\": \"#char(E4)\",\n        \"aring\": \"#char(E5)\",\n        \"aelig\": \"#char(E6)\",\n        \"ccedil\": \"#char(E7)\",\n        \"egrave\": \"#char(E8)\",\n        \"eacute\": \"#char(E9)\",\n        \"ecirc\": \"#char(EA)\",\n        \"eumlaut\": \"#char(EB)\",\n        \"igrave\": \"#char(EC)\",\n        \"iacute\": \"#char(ED)\",\n        \"icirc\": \"#char(EE)\",\n        \"iumlaut\": \"#char(EF)\",\n        \"eth\": \"#char(F0)\",\n        \"ntilde\": \"#char(F1)\",\n        \"ograve\": \"#char(F2)\",\n        \"oacute\": \"#char(F3)\",\n        \"ocirc\": \"#char(F4)\",\n        \"otilde\": \"#char(F5)\",\n        \"oumlaut\": \"#char(F6)\",\n        \"divide\": \"#char(F7)\",\n        \"oslash\": \"#char(F8)\",\n        \"ugrave\": \"#char(F9)\",\n        \"uacute\": \"#char(FA)\",\n        \"ucirc\": \"#char(FB)\",\n        \"uumlaut\": \"#char(FC)\",\n        \"yacute\": \"#char(FD)\",\n        \"thorn\": \"#char(FE)\",\n        \"yumlaut\": \"#char(FF)\",\n        \"fnof\": \"#char(192)\",\n        \"Alpha\": \"#char(391)\",\n        \"Beta\": \"#char(392)\",\n        \"Gamma\": \"#char(393)\",\n        \"Delta\": \"#char(394)\",\n        \"Epsilon\": \"#char(395)\",\n        \"Zeta\": \"#char(396)\",\n        \"Eta\": \"#char(397)\",\n        \"Theta\": \"#char(398)\",\n        \"Iota\": \"#char(399)\",\n        \"Kappa\": \"#char(39A)\",\n        \"Lambda\": \"#char(39B)\",\n        \"Mu\": \"#char(39C)\",\n        \"Nu\": \"#char(39D)\",\n        \"Xi\": \"#char(39E)\",\n        \"Omicron\": \"#char(39F)\",\n        \"Pi\": \"#char(3A0)\",\n        \"Rho\": \"#char(3A1)\",\n        \"Sigma\": \"#char(3A3)\",\n        \"Tau\": \"#char(3A4)\",\n        \"Upsilon\": \"#char(3A5)\",\n        \"Phi\": \"#char(3A6)\",\n        \"Chi\": \"#char(3A7)\",\n        \"Psi\": \"#char(3A8)\",\n        \"Omega\": \"#char(3A9)\",\n        \"alpha\": \"#char(3B1)\",\n        \"beta\": \"#char(3B2)\",\n        \"gamma\": \"#char(3B3)\",\n        \"delta\": \"#char(3B4)\",\n        \"epsilon\": \"#char(3B5)\",\n        \"zeta\": \"#char(3B6)\",\n        \"eta\": \"#char(3B7)\",\n        \"theta\": \"#char(3B8)\",\n        \"iota\": \"#char(3B9)\",\n        \"kappa\": \"#char(3BA)\",\n        \"lambda\": \"#char(3BB)\",\n        \"mu\": \"#char(3BC)\",\n        \"nu\": \"#char(3BD)\",\n        \"xi\": \"#char(3BE)\",\n        \"omicron\": \"#char(3BF)\",\n        \"pi\": \"#char(3C0)\",\n        \"rho\": \"#char(3C1)\",\n        \"sigmaf\": \"#char(3C2)\",\n        \"sigma\": \"#char(3C3)\",\n        \"tau\": \"#char(3C4)\",\n        \"upsilon\": \"#char(3C5)\",\n        \"phi\": \"#char(3C6)\",\n        \"chi\": \"#char(3C7)\",\n        \"psi\": \"#char(3C8)\",\n        \"omega\": \"#char(3C9)\",\n        \"thetasym\": \"#char(3D1)\",\n        \"upsih\": \"#char(3D2)\",\n        \"piv\": \"#char(3D6)\",\n        \"bull\": \"#char(2022)\",\n        \"hellip\": \"#char(2026)\",\n        \"prime\": \"#char(2032)\",\n        \"Prime\": \"#char(2033)\",\n        \"oline\": \"#char(203E)\",\n        \"frasl\": \"#char(2044)\",\n        \"weierp\": \"#char(2118)\",\n        \"imaginary\": \"#char(2111)\",\n        \"real\": \"#char(211C)\",\n        \"trademark\": \"#char(2122)\",\n        \"alefsym\": \"#char(2135)\",\n        \"larr\": \"#char(2190)\",\n        \"uarr\": \"#char(2191)\",\n        \"rarr\": \"#char(2192)\",\n        \"darr\": \"#char(2193)\",\n        \"harr\": \"#char(2194)\",\n        \"crarr\": \"#char(21B5)\",\n        \"lArr\": \"#char(21D0)\",\n        \"uArr\": \"#char(21D1)\",\n        \"rArr\": \"#char(21D2)\",\n        \"dArr\": \"#char(21D3)\",\n        \"hArr\": \"#char(21D4)\",\n        \"forall\": \"#char(2200)\",\n        \"part\": \"#char(2202)\",\n        \"exist\": \"#char(2203)\",\n        \"empty\": \"#char(2205)\",\n        \"nabla\": \"#char(2207)\",\n        \"isin\": \"#char(2208)\",\n        \"notin\": \"#char(2209)\",\n        \"ni\": \"#char(220B)\",\n        \"prod\": \"#char(220F)\",\n        \"sum\": \"#char(2211)\",\n        \"minus\": \"#char(2212)\",\n        \"lowast\": \"#char(2217)\",\n        \"radic\": \"#char(221A)\",\n        \"prop\": \"#char(221D)\",\n        \"infin\": \"#char(221E)\",\n        \"ang\": \"#char(2220)\",\n        \"and\": \"#char(2227)\",\n        \"or\": \"#char(2228)\",\n        \"cap\": \"#char(2229)\",\n        \"cup\": \"#char(222A)\",\n        \"int\": \"#char(222B)\",\n        \"there4\": \"#char(2234)\",\n        \"sim\": \"#char(223C)\",\n        \"cong\": \"#char(2245)\",\n        \"asymp\": \"#char(2248)\",\n        \"ne\": \"#char(2260)\",\n        \"equiv\": \"#char(2261)\",\n        \"le\": \"#char(2264)\",\n        \"ge\": \"#char(2265)\",\n        \"sub\": \"#char(2282)\",\n        \"sup\": \"#char(2283)\",\n        \"nsub\": \"#char(2284)\",\n        \"sube\": \"#char(2286)\",\n        \"supe\": \"#char(2287)\",\n        \"oplus\": \"#char(2295)\",\n        \"otimes\": \"#char(2297)\",\n        \"perp\": \"#char(22A5)\",\n        \"sdot\": \"#char(22C5)\",\n        \"lceil\": \"#char(2308)\",\n        \"rceil\": \"#char(2309)\",\n        \"lfloor\": \"#char(230A)\",\n        \"rfloor\": \"#char(230B)\",\n        \"lang\": \"#char(27E8)\",\n        \"rang\": \"#char(27E9)\",\n        \"loz\": \"#char(25CA)\",\n        \"spades\": \"#char(2660)\",\n        \"clubs\": \"#char(2663)\",\n        \"hearts\": \"#char(2665)\",\n        \"diams\": \"#char(2666)\",\n        \"OElig\": \"#char(152)\",\n        \"oelig\": \"#char(153)\",\n        \"Scaron\": \"#char(160)\",\n        \"scaron\": \"#char(161)\",\n        \"Yumlaut\": \"#char(178)\",\n        \"circ\": \"#char(2C6)\",\n        \"tilde\": \"#char(2DC)\",\n        \"ensp\": \"#char(2002)\",\n        \"emsp\": \"#char(2003)\",\n        \"thinsp\": \"#char(2009)\",\n        \"zwnj\": \"#char(200C)\",\n        \"zwj\": \"#char(200D)\",\n        \"lrm\": \"#char(200E)\",\n        \"rlm\": \"#char(200F)\",\n        \"ndash\": \"#char(2013)\",\n        \"mdash\": \"#char(2014)\",\n        \"lsquo\": \"#char(2018)\",\n        \"rsquo\": \"#char(2019)\",\n        \"sbquo\": \"#char(201A)\",\n        \"ldquo\": \"#char(201C)\",\n        \"rdquo\": \"#char(201D)\",\n        \"bdquo\": \"#char(201E)\",\n        \"dagger\": \"#char(2020)\",\n        \"Dagger\": \"#char(2021)\",\n        \"permil\": \"#char(2030)\",\n        \"lsaquo\": \"#char(2039)\",\n        \"rsaquo\": \"#char(203A)\",\n        \"euro\": \"#char(20AC)\",\n        \"tm\": \"#char(2122)\"\n      }\n    },\n    \"docCmdGroup\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"content\": {\n        \"hruler\": \"#empty\",\n        \"preformatted\": \"docMarkupType\",\n        \"programlisting\": \"listingType\",\n        \"verbatim\": \"#string\",\n        \"javadocliteral\": \"#string\",\n        \"javadoccode\": \"#string\",\n        \"indexentry\": \"docIndexEntryType\",\n        \"orderedlist\": \"docListType\",\n        \"itemizedlist\": \"docListType\",\n        \"simplesect\": \"docSimpleSectType\",\n        \"title\": \"docTitleType\",\n        \"variablelist\": \"docVariableListType\",\n        \"table\": \"docTableType\",\n        \"heading\": \"docHeadingType\",\n        \"dotfile\": \"docImageFileType\",\n        \"mscfile\": \"docImageFileType\",\n        \"diafile\": \"docImageFileType\",\n        \"plantumlfile\": \"docImageFileType\",\n        \"toclist\": \"docTocListType\",\n        \"language\": \"docLanguageType\",\n        \"parameterlist\": \"docParamListType\",\n        \"xrefsect\": \"docXRefSectType\",\n        \"copydoc\": \"docCopyType\",\n        \"details\": \"docDetailsType\",\n        \"blockquote\": \"docBlockQuoteType\",\n        \"parblock\": \"docParBlockType\"\n      }\n    },\n    \"docParaType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docCmdGroup\"]\n    },\n    \"docMarkupType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docCmdGroup\"]\n    },\n    \"docTitleType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"]\n    },\n    \"docSummaryType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"]\n    },\n    \"docURLLink\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"url\":  {\"type\": \"#string\"}\n      }\n    },\n    \"docHtmlOnlyType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"block\":  {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"docImageType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"type\":                 {\"type\": \"DoxImageKind\", \"optional\": true},\n        \"name\":                 {\"type\": \"#string\", \"optional\": true},\n        \"width\":                {\"type\": \"#string\", \"optional\": true},\n        \"height\":               {\"type\": \"#string\", \"optional\": true},\n        \"alt\":                  {\"type\": \"#string\", \"optional\": true},\n        \"inline\":               {\"type\": \"#DoxBool\", \"optional\": true},\n        \"caption\":              {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"docDotMscType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"name\":                 {\"type\": \"#string\", \"optional\": true},\n        \"width\":                {\"type\": \"#string\", \"optional\": true},\n        \"height\":               {\"type\": \"#string\", \"optional\": true},\n        \"caption\":              {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"docPlantumlType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"name\":                 {\"type\": \"#string\", \"optional\": true},\n        \"width\":                {\"type\": \"#string\", \"optional\": true},\n        \"height\":               {\"type\": \"#string\", \"optional\": true},\n        \"caption\":              {\"type\": \"#string\", \"optional\": true},\n        \"engine\":               {\"type\": \"DoxPlantumlEngine\", \"optional\": true}\n      }\n    },\n    \"docRefTextType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"refid\":                {\"type\": \"#string\"},\n        \"kindref\":              {\"type\": \"#string\"},\n        \"external\":             {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"docHeadingType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"level\":                {\"type\": \"#integer\"}\n      }\n    },\n    \"docImageFileType\": {\n      \"kind\": \"union_list_element\",\n      \"bases\": [\"docTitleCmdGroup\"],\n      \"attributes\": {\n        \"name\":                 {\"type\": \"#string\", \"optional\": true},\n        \"width\":                {\"type\": \"#string\", \"optional\": true},\n        \"height\":               {\"type\": \"#string\", \"optional\": true}\n      }\n    },\n    \"docAnchorType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      }\n    },\n    \"docFormulaType\": {\n      \"kind\": \"union_list_element\",\n      \"allow_text\": true,\n      \"attributes\": {\n        \"id\":                   {\"type\": \"#string\"}\n      }\n    },\n    \"docEmojiType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"name\":                 {\"type\": \"#string\"},\n        \"unicode\":              {\"type\": \"#string\"}\n      }\n    },\n    \"docIndexEntryType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"primaryie\":            {\"type\": \"#string\"},\n        \"secondaryie\":          {\"type\": \"#string\"}\n      }\n    },\n    \"docListType\": {\n      \"kind\": \"list_element\",\n      \"min_items\": 1,\n      \"attributes\": {\n        \"type\":                 {\"type\": \"DoxOlType\", \"optional\": true},\n        \"start\":                {\"type\": \"#integer\", \"optional\": true}\n      },\n      \"content\": {\n        \"listitem\":   \"docListItemType\"\n      }\n    },\n    \"docSimpleSectType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"kind\":                 {\"type\": \"DoxSimpleSectKind\"}\n      },\n      \"children\": {\n        \"title\":                {\"type\": \"docTitleType\", \"min_items\": 0},\n        \"para\":                 {\"type\": \"docParaType\", \"is_list\": true}\n      }\n    },\n    \"docVariableListType\": {\n      \"kind\": \"tuple_list_element\",\n      \"min_items\": 1,\n      \"content\": {\n        \"varlistentry\":  \"docVarListEntryType\",\n        \"listitem\":      \"docListItemType\"\n      }\n    },\n    \"docTableType\" : {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"rows\":                 {\"type\": \"#integer\"},\n        \"cols\":                 {\"type\": \"#integer\"},\n        \"width\":                {\"type\": \"#string\", \"optional\": true}\n      },\n      \"children\": {\n        \"caption\":              {\"type\": \"docCaptionType\", \"min_items\": 0},\n        \"row\":                  {\"type\": \"docRowType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docTocListType\": {\n      \"kind\": \"list_element\",\n      \"content\": {\n        \"tocitem\": \"docTocItemType\"\n      }\n    },\n    \"docLanguageType\": {\n      \"kind\": \"list_element\",\n      \"attributes\": {\n        \"langid\":               {\"type\": \"#string\"}\n      },\n      \"content\": {\n        \"para\": \"docParaType\"\n      }\n    },\n    \"docParamListType\": {\n      \"kind\": \"list_element\",\n      \"attributes\": {\n        \"kind\":                 {\"type\": \"DoxParamListKind\"}\n      },\n      \"content\": {\n        \"parameteritem\": \"docParamListItem\"\n      }\n    },\n    \"docXRefSectType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"id\":    {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"xreftitle\":            {\"type\": \"#string\", \"is_list\": true, \"min_items\": 0},\n        \"xrefdescription\":      {\"type\": \"descriptionType\"}\n      }\n    },\n    \"docCopyType\": {\n      \"kind\": \"tag_only_element\",\n      \"attributes\": {\n        \"link\":    {\"type\": \"#string\"}\n      },\n      \"children\": {\n        \"para\":                 {\"type\": \"docParaType\", \"is_list\": true, \"min_items\": 0},\n        \"sec1\":                 {\"type\": \"docSect1Type\", \"is_list\": true, \"min_items\": 0},\n        \"internal\":             {\"type\": \"docInternalType\", \"min_items\": 0}\n      }\n    },\n    \"docDetailsType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"summary\":              {\"type\": \"docSummaryType\", \"min_items\": 0},\n        \"para\":                 {\"type\": \"docParaType\", \"is_list\": true, \"min_items\": 0}\n      }\n    },\n    \"docBlockQuoteType\": {\n      \"kind\": \"list_element\",\n      \"content\": {\n        \"para\": \"docParaType\"\n      }\n    },\n    \"docParBlockType\": {\n      \"kind\": \"list_element\",\n      \"content\": {\n        \"para\": \"docParaType\"\n      }\n    },\n    \"docVarListEntryType\": {\n      \"kind\": \"tag_only_element\",\n      \"children\": {\n        \"term\":                 {\"type\": \"docTitleType\"}\n      }\n    },\n    \"DoxCompoundKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        {\"xml\": \"class\", \"id\": \"class_\"},\n        \"struct\",\n        \"union\",\n        \"interface\",\n        \"protocol\",\n        \"category\",\n        \"exception\",\n        \"service\",\n        \"singleton\",\n        \"module\",\n        \"type\",\n        \"file\",\n        \"namespace\",\n        \"group\",\n        \"page\",\n        \"example\",\n        \"dir\",\n        \"concept\"\n      ]\n    },\n    \"CompoundKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        {\"xml\": \"class\", \"id\": \"class_\"},\n        \"struct\",\n        \"union\",\n        \"interface\",\n        \"protocol\",\n        \"category\",\n        \"exception\",\n        \"module\",\n        \"type\",\n        \"file\",\n        \"namespace\",\n        \"group\",\n        \"page\",\n        \"example\",\n        \"dir\",\n        \"concept\"\n      ]\n    },\n    \"DoxLanguage\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"Unknown\",\n        \"IDL\",\n        \"Java\",\n        {\"xml\": \"C#\", \"id\": \"CSharp\"},\n        \"D\",\n        \"PHP\",\n        {\"xml\": \"Objective-C\", \"id\": \"Objective_C\"},\n        {\"xml\": \"C++\", \"id\": \"CPlusPlus\"},\n        \"JavaScript\",\n        \"Python\",\n        \"Fortran\",\n        \"VHDL\",\n        \"XML\",\n        \"SQL\",\n        \"Markdown\",\n        \"Slice\",\n        \"Lex\"\n      ]\n    },\n    \"DoxProtectionKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"public\",\n        \"protected\",\n        \"private\",\n        \"package\"\n      ]\n    },\n    \"DoxRefQualifierKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"lvalue\",\n        \"rvalue\"\n      ]\n    },\n    \"DoxVirtualKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        {\"xml\": \"non-virtual\", \"id\": \"non_virtual\"},\n        \"virtual\",\n        {\"xml\": \"pure-virtual\", \"id\": \"pure_virtual\"}\n      ]\n    },\n    \"DoxSectionKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        {\"xml\": \"user-defined\", \"id\": \"user_defined\"},\n        {\"xml\": \"public-type\", \"id\": \"public_type\"},\n        {\"xml\": \"public-func\", \"id\": \"public_func\"},\n        {\"xml\": \"public-attrib\", \"id\": \"public_attrib\"},\n        {\"xml\": \"public-slot\", \"id\": \"public_slot\"},\n        \"signal\",\n        {\"xml\": \"dcop-func\", \"id\": \"dcop_func\"},\n        \"property\",\n        \"event\",\n        {\"xml\": \"public-static-func\", \"id\": \"public_static_func\"},\n        {\"xml\": \"public-static-attrib\", \"id\": \"public_static_attrib\"},\n        {\"xml\": \"protected-type\", \"id\": \"protected_type\"},\n        {\"xml\": \"protected-func\", \"id\": \"protected_func\"},\n        {\"xml\": \"protected-attrib\", \"id\": \"protected_attrib\"},\n        {\"xml\": \"protected-slot\", \"id\": \"protected_slot\"},\n        {\"xml\": \"protected-static-func\", \"id\": \"protected_static_func\"},\n        {\"xml\": \"protected-static-attrib\", \"id\": \"protected_static_attrib\"},\n        {\"xml\": \"package-type\", \"id\": \"package_type\"},\n        {\"xml\": \"package-func\", \"id\": \"package_func\"},\n        {\"xml\": \"package-attrib\", \"id\": \"package_attrib\"},\n        {\"xml\": \"package-static-func\", \"id\": \"package_static_func\"},\n        {\"xml\": \"package-static-attrib\", \"id\": \"package_static_attrib\"},\n        {\"xml\": \"private-type\", \"id\": \"private_type\"},\n        {\"xml\": \"private-func\", \"id\": \"private_func\"},\n        {\"xml\": \"private-attrib\", \"id\": \"private_attrib\"},\n        {\"xml\": \"private-slot\", \"id\": \"private_slot\"},\n        {\"xml\": \"private-static-func\", \"id\": \"private_static_func\"},\n        {\"xml\": \"private-static-attrib\", \"id\": \"private_static_attrib\"},\n        \"friend\",\n        \"related\",\n        \"define\",\n        \"prototype\",\n        \"typedef\",\n        \"enum\",\n        \"func\",\n        \"var\"\n      ]\n    },\n    \"DoxHighlightClass\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"comment\",\n        \"normal\",\n        \"preprocessor\",\n        \"keyword\",\n        \"keywordtype\",\n        \"keywordflow\",\n        \"stringliteral\",\n        \"xmlcdata\",\n        \"charliteral\",\n        \"vhdlkeyword\",\n        \"vhdllogic\",\n        \"vhdlchar\",\n        \"vhdldigit\"\n      ]\n    },\n    \"DoxSimpleSectKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"see\",\n        {\"xml\": \"return\", \"id\": \"return_\"},\n        \"author\",\n        \"authors\",\n        \"version\",\n        \"since\",\n        \"date\",\n        \"note\",\n        \"warning\",\n        \"pre\",\n        \"post\",\n        \"copyright\",\n        \"invariant\",\n        \"remark\",\n        \"attention\",\n        \"important\",\n        \"par\",\n        \"rcs\"\n      ]\n    },\n    \"DoxImageKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"html\",\n        \"latex\",\n        \"docbook\",\n        \"rtf\",\n        \"xml\"\n      ]\n    },\n    \"DoxPlantumlEngine\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"uml\",\n        \"bpm\",\n        \"wire\",\n        \"dot\",\n        \"ditaa\",\n        \"salt\",\n        \"math\",\n        \"latex\",\n        \"gantt\",\n        \"mindmap\",\n        \"wbs\",\n        \"yaml\",\n        \"creole\",\n        \"json\",\n        \"flow\",\n        \"board\",\n        \"git\",\n        \"hcl\",\n        \"regex\",\n        \"ebnf\",\n        \"files\"\n      ]\n    },\n    \"DoxParamListKind\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"param\",\n        \"retval\",\n        \"exception\",\n        \"templateparam\"\n      ]\n    },\n    \"DoxParamDir\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        {\"xml\": \"in\", \"id\": \"in_\"},\n        \"out\",\n        \"inout\"\n      ]\n    },\n    \"DoxAccessor\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"retain\",\n        \"copy\",\n        \"assign\",\n        \"weak\",\n        \"strong\",\n        \"unretained\"\n      ]\n    },\n    \"DoxAlign\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"left\",\n        \"right\",\n        \"center\"\n      ]\n    },\n    \"DoxVerticalAlign\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"bottom\",\n        \"top\",\n        \"middle\"\n      ]\n    },\n    \"DoxGraphRelation\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"include\",\n        \"usage\",\n        {\"xml\": \"template-instance\", \"id\": \"template_instance\"},\n        {\"xml\": \"public-inheritance\", \"id\": \"public_inheritance\"},\n        {\"xml\": \"protected-inheritance\", \"id\": \"protected_inheritance\"},\n        {\"xml\": \"private-inheritance\", \"id\": \"private_inheritance\"},\n        {\"xml\": \"type-constraint\", \"id\": \"type_constraint\"}\n      ]\n    },\n    \"DoxCheck\": {\n      \"kind\": \"enumeration\",\n      \"values\": [\n        \"checked\",\n        \"unchecked\"\n      ]\n    },\n    \"DoxOlType\": {\n      \"kind\": \"char_enumeration\",\n      \"values\": \"1aAiI\"\n    }\n  }\n}\n"
  },
  {
    "path": "xml_parser_generator/setuptools_builder.py",
    "content": "from __future__ import annotations\n\nimport os.path\n\nfrom setuptools.command.build_py import build_py\n\ntry:\n    from setuptools.modified import newer_group\nexcept ImportError:\n    from distutils.dep_util import newer_group\n\nfrom distutils import log\nfrom distutils.dir_util import mkpath\n\nimport make_parser\n\n\nclass CustomBuildPy(build_py):\n    SCHEMA_FILE = os.path.join(\"xml_parser_generator\", \"schema.json\")\n    PY_MODULE_TEMPLATE = os.path.join(\"xml_parser_generator\", \"module_template.py.in\")\n    MAKER_SOURCE = os.path.join(\"xml_parser_generator\", \"make_parser.py\")\n    PARSER_DEST = os.path.join(\"breathe\", \"_parser.py\")\n\n    PY_M_DEPENDENCIES = [SCHEMA_FILE, PY_MODULE_TEMPLATE, MAKER_SOURCE]\n\n    def make_parser(self):\n        dest = self.PARSER_DEST\n        if not self.editable_mode:\n            dest = os.path.join(self.build_lib, dest)\n            mkpath(os.path.dirname(dest), dry_run=self.dry_run)\n\n        if self.force or newer_group(self.PY_M_DEPENDENCIES, dest):\n            log.info(f'generating \"{dest}\" source from template')\n            if not self.dry_run:\n                make_parser.generate_from_json(self.SCHEMA_FILE, [(self.PY_MODULE_TEMPLATE, dest)])\n        else:\n            log.debug(f'\"{dest}\" is up-to-date')\n\n    def run(self):\n        super().run()\n        self.make_parser()\n\n\nif __name__ == \"__main__\":\n    make_parser.generate_from_json(\n        CustomBuildPy.SCHEMA_FILE, [(CustomBuildPy.PY_MODULE_TEMPLATE, CustomBuildPy.PARSER_DEST)]\n    )\n"
  },
  {
    "path": "xml_parser_generator/stubs_template.pyi.in",
    "content": "import enum\nfrom typing import ClassVar, Generic, Literal, overload, Protocol, Self, SupportsIndex, TypeVar\nfrom collections.abc import Iterable\n\nT = TypeVar('T',covariant=True)\nU = TypeVar('U',covariant=True)\n\nclass SupportsRead(Protocol):\n    def read(self, length: int, /) -> bytes | bytearray: ...\n\nclass FrozenListItr(Generic[T]):\n    def __iter__(self) -> Self: ...\n    def __next__(self) -> T: ...\n\nclass FrozenList(Generic[T]):\n    def __init__(self, items: Iterable[T]): ...\n    def __len__(self) -> int: ...\n    def __getitem__(self, i: SupportsIndex) -> T: ...\n    def __iter__(self) -> FrozenListItr[T]: ...\n\nclass TaggedValue(Generic[T, U]):\n    @property\n    def name(self) -> T: ...\n\n    @property\n    def value(self) -> U: ...\n\n    def __init__(self, name: T, value: U): ...\n\n    def __len__(self) -> Literal[2]: ...\n\n    @overload\n    def __getitem__(self, i: Literal[0]) -> T: ...\n\n    @overload\n    def __getitem__(self, i: Literal[1]) -> U: ...\n\n    @overload\n    def __getitem__(self, i: SupportsIndex) -> T | U: ...\n\nclass Node:\n    _fields: ClassVar[tuple[str, ...]]\n\nclass ParseError(RuntimeError):\n    @property\n    def message(self) -> str: ...\n    @property\n    def lineno(self) -> int: ...\n\nclass ParseWarning(UserWarning):\n    pass\n\nTopLevel = (\n//% for name,type in root_elements\n    {$ '| ' if not loop.first $}TaggedValue[Literal['{$ name $}'],{$ type.py_name $}]\n//% endfor\n)\n\ndef parse_str(data: str, /) -> TopLevel: ...\n\ndef parse_file(file: SupportsRead, /) -> TopLevel: ...\n\n\n//% macro emit_fields(type)\n{%- for b in type.bases %}{$ emit_fields(b) $}{% endfor -%}\n//%   for ref in type|attributes\n    {$ ref.py_name $}: {$ ref.py_type() $}\n//%   endfor\n//%   for ref in type|children\n    {$ ref.py_name $}: {$ ref.py_type() $}\n//%   endfor\n//% endmacro\n\n//% macro emit_content_fields(type)\n{%- for b in type.bases %}{$ emit_content_fields(b) $}{% endfor -%}\n//%   for cname,ctype in type|content\n    {$ cname $}: {$ ctype.py_name $}\n//%   endfor\n//% endmacro\n\n//% for type in types\n//%   if type is content_tuple\n//%     set list_item_type = 'ListItem_'~type\nclass ListItem_{$ type $}:\n{$ emit_content_fields(type) $}\n    def __init__(self{% for cname,ctype in type|content %}, {$ cname $}: {$ ctype.py_name $}{% endfor %}): ...\n\n    def __len__(self) -> Literal[{$ type|content|length $}]: ...\n//%     for cname,ctype in type|content\n    @overload\n    def __getitem__(self,i: Literal[{$ loop.index0 $}]) -> {$ ctype.py_name $}: ...\n//%     endfor\n    @overload\n    def __getitem__(self,i: SupportsIndex) -> {$ type|content|map('last')|map(attribute='py_name')|join(' | ') $}: ...\n\n//%   elif type is content_union\n//%     set members = type.py_union_list()|sort\n//%     if members|length > 1\n//%       set list_item_type = 'ListItem_'~type\nListItem_{$ type $} = (\n//%       for m in members\n    {$ '| ' if not loop.first $}{$ m $}\n//%       endfor\n)\n\n//%     else\n//%       set list_item_type = members|first\n//%     endif\n//%   elif type is content_bare\n//%     set list_item_type = (type|content|first)[1].py_name\n//%   elif type is list_e\n{$ \"invalid content type\"|error $}\n//%   endif\n//%   if type is used_directly\nclass Node_{$ type $}(Node{$ ', FrozenList['~list_item_type~']' if type is list_e $}):\n{$ emit_fields(type) $}\n    def __init__(self{$ ', __items: Iterable['~list_item_type~'], /' if type is list_e $}\n        {%- if type|field_count -%}, *\n            {%- for f in type.all_fields() if f is not optional %}, {$ f.py_name $}: {$ f.py_type(true) $}{% endfor -%}\n            {%- for f in type.all_fields() if f is optional %}, {$ f.py_name $}: {$ f.py_type(true) $} = ...{% endfor -%}\n        {%- endif %}): ...\n\n//%   elif type is enumeration_t\nclass {$ type $}(enum.Enum):\n//%     for entry in type.children\n    {$ entry.id $} = '{$ entry.xml $}'\n//%     endfor\n\n//%   elif type is char_enum_t\n{$ type $} = Literal[{% for c in type.values %}{$ \"'\"~c~\"'\" $}{$ ',' if not loop.last $}{% endfor %}]\n//%   endif\n//% endfor\n"
  }
]