Full Code of TorstenRobitzki/bluetoe for AI

master 98e708af02b9 cached
289 files
2.8 MB
754.1k tokens
4435 symbols
1 requests
Download .txt
Showing preview only (3,015K chars total). Download the full file or copy to clipboard to get everything.
Repository: TorstenRobitzki/bluetoe
Branch: master
Commit: 98e708af02b9
Files: 289
Total size: 2.8 MB

Directory structure:
gitextract_0w9214oa/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── codeql.yml
├── .gitignore
├── .gitlab-ci.yml
├── .travis.yml
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── Doxyfile
├── LICENSE
├── README.md
├── bluetoe/
│   ├── adv_service_list.hpp
│   ├── appearance.hpp
│   ├── attribute_generator.hpp
│   ├── attribute_handle.hpp
│   ├── bindings/
│   │   ├── CMakeLists.txt
│   │   ├── hci/
│   │   │   └── include_libusb/
│   │   │       └── bluetoe/
│   │   │           ├── device.hpp
│   │   │           └── libsub.hpp
│   │   └── nordic/
│   │       ├── CMakeLists.txt
│   │       ├── include/
│   │       │   └── bluetoe/
│   │       │       └── nrf.hpp
│   │       ├── nrf51/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── include/
│   │       │   │   └── bluetoe/
│   │       │   │       ├── device.hpp
│   │       │   │       └── nrf51.hpp
│   │       │   └── nrf51.cpp
│   │       ├── nrf52/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── include/
│   │       │   │   └── bluetoe/
│   │       │   │       ├── device.hpp
│   │       │   │       ├── nrf52.hpp
│   │       │   │       └── security_tool_box.hpp
│   │       │   ├── nrf52.cpp
│   │       │   └── security_tool_box.cpp
│   │       └── uECC/
│   │           ├── CMakeLists.txt
│   │           ├── asm_arm.inc
│   │           ├── uECC.c
│   │           └── uECC.h
│   ├── characteristic.hpp
│   ├── characteristic_value.hpp
│   ├── custom_advertising.hpp
│   ├── descriptor.hpp
│   ├── encryption.hpp
│   ├── filter.hpp
│   ├── find_notification_data.hpp
│   ├── gap_service.hpp
│   ├── gatt_options.hpp
│   ├── hci/
│   │   ├── CMakeLists.txt
│   │   └── include/
│   │       └── bluetoe/
│   │           └── link_layer.hpp
│   ├── l2cap.hpp
│   ├── l2cap_channels.hpp
│   ├── link_layer/
│   │   ├── CMakeLists.txt
│   │   ├── channel_map.cpp
│   │   ├── connection_details.cpp
│   │   ├── delta_time.cpp
│   │   ├── include/
│   │   │   └── bluetoe/
│   │   │       ├── advertising.hpp
│   │   │       ├── buffer.hpp
│   │   │       ├── channel_map.hpp
│   │   │       ├── connection_callbacks.hpp
│   │   │       ├── connection_details.hpp
│   │   │       ├── connection_event_callback.hpp
│   │   │       ├── connection_events.hpp
│   │   │       ├── default_pdu_layout.hpp
│   │   │       ├── delta_time.hpp
│   │   │       ├── l2cap_signaling_channel.hpp
│   │   │       ├── link_layer.hpp
│   │   │       ├── ll_data_pdu_buffer.hpp
│   │   │       ├── ll_l2cap_sdu_buffer.hpp
│   │   │       ├── ll_meta_types.hpp
│   │   │       ├── ll_options.hpp
│   │   │       ├── peripheral_latency.hpp
│   │   │       ├── phy_encodings.hpp
│   │   │       ├── ring_buffer.hpp
│   │   │       └── white_list.hpp
│   │   └── scheduled_radio.hpp
│   ├── link_state.hpp
│   ├── mainpage.hpp
│   ├── meta_types.hpp
│   ├── mixin.hpp
│   ├── notification_queue.hpp
│   ├── outgoing_priority.hpp
│   ├── pairing_status.hpp
│   ├── peripheral_connection_interval_range.hpp
│   ├── scattered_access.hpp
│   ├── sensor_location.hpp
│   ├── server.hpp
│   ├── server_meta_type.hpp
│   ├── server_name.hpp
│   ├── service.hpp
│   ├── service_uuid.hpp
│   ├── services/
│   │   ├── CMakeLists.txt
│   │   ├── bas.hpp
│   │   ├── bootloader.hpp
│   │   ├── bootloader.md
│   │   ├── csc.hpp
│   │   ├── dis.hpp
│   │   ├── gatt.hpp
│   │   └── hid.hpp
│   ├── sm/
│   │   ├── CMakeLists.txt
│   │   └── include/
│   │       └── bluetoe/
│   │           ├── io_capabilities.hpp
│   │           ├── oob_authentication.hpp
│   │           ├── security_connection_data.hpp
│   │           └── security_manager.hpp
│   ├── utility/
│   │   ├── CMakeLists.txt
│   │   ├── address.cpp
│   │   └── include/
│   │       └── bluetoe/
│   │           ├── address.hpp
│   │           ├── attribute.hpp
│   │           ├── bits.hpp
│   │           ├── client_characteristic_configuration.hpp
│   │           ├── codes.hpp
│   │           ├── meta_tools.hpp
│   │           └── ring.hpp
│   ├── uuid.hpp
│   └── write_queue.hpp
├── config/
│   ├── travisci_rsa.enc
│   └── travisci_rsa.pub
├── documentation/
│   ├── Logo_Bluetoe.eps
│   └── customdoxygen.css
├── examples/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── assert/
│   │   ├── CMakeLists.txt
│   │   ├── assert.cpp
│   │   ├── assert.h
│   │   └── cassert
│   ├── ble_flash/
│   │   ├── CMakeLists.txt
│   │   ├── ble_flash.coffee
│   │   ├── crc.coffee
│   │   ├── crc_tests.coffee
│   │   ├── flash.coffee
│   │   └── flash_tests.coffee
│   ├── blinky.cpp
│   ├── blinky_with_lesc_and_legacy_pairing.cpp
│   ├── blinky_with_oob.cpp
│   ├── blinky_without_encryption.cpp
│   ├── bootloader.cpp
│   ├── cc2650/
│   │   ├── cc26x0f128.lds
│   │   ├── ccfg.c
│   │   └── startup_gcc.c
│   ├── cmake/
│   │   ├── deduce.cmake
│   │   └── gcc-arm-none-eabi.cmake
│   ├── custom_advertising.cpp
│   ├── cycling_speed_and_cadence.cpp
│   ├── docker/
│   │   ├── Dockerfile
│   │   └── Makefile
│   ├── doxygen/
│   │   ├── CMakeLists.txt
│   │   ├── change_advertising_example.cpp
│   │   ├── include_example.cpp
│   │   ├── priorities_example.cpp
│   │   ├── read_write_handler_example.cpp
│   │   └── server_example.cpp
│   ├── gpio.cpp
│   ├── keyboard.cpp
│   ├── nrf51_toolchain_support/
│   │   ├── CMakeLists.txt
│   │   ├── gcc_nrf51_common.ld
│   │   ├── gcc_startup_nrf51.s
│   │   ├── nrf51_xxaa.ld
│   │   ├── platform.cmake
│   │   ├── system_nrf51.h
│   │   └── system_nrf51422.c
│   ├── nrf52_high_cpu_load.cpp
│   ├── nrf52_toolchain_support/
│   │   ├── CMakeLists.txt
│   │   ├── gcc_nrf5x_common.ld
│   │   ├── gcc_startup_nrf52.s
│   │   ├── nrf52.ld
│   │   ├── platform.cmake
│   │   ├── system_nrf52.c
│   │   └── system_nrf52.h
│   ├── resources.hpp
│   ├── runtime_gcc.cpp
│   ├── scheduled_radio_tests.cpp
│   ├── spl/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── flash.hpp
│   │   ├── gpio.hpp
│   │   ├── temperature.cpp
│   │   ├── temperature.hpp
│   │   └── timer.hpp
│   ├── synchronized_callbacks.cpp
│   ├── thermometer.cpp
│   └── ucontroller.hpp
├── publish-doxygen
└── tests/
    ├── CMakeLists.txt
    ├── advertising_tests.cpp
    ├── att/
    │   ├── CMakeLists.txt
    │   ├── descriptor_tests.cpp
    │   ├── execute_write_tests.cpp
    │   ├── find_by_type_value_tests.cpp
    │   ├── find_information_tests.cpp
    │   ├── find_notification_data_tests.cpp
    │   ├── indication_tests.cpp
    │   ├── mtu_exchange_tests.cpp
    │   ├── notification_tests.cpp
    │   ├── outgoing_priority_tests.cpp
    │   ├── prepare_write_tests.cpp
    │   ├── read_blob_tests.cpp
    │   ├── read_by_group_type_tests.cpp
    │   ├── read_by_type_tests.cpp
    │   ├── read_multiple_tests.cpp
    │   ├── read_tests.cpp
    │   ├── request_not_supported_tests.cpp
    │   ├── write_command_tests.cpp
    │   └── write_tests.cpp
    ├── attribute_handle_tests.cpp
    ├── auto_uuid_tests.cpp
    ├── bits_tests.cpp
    ├── characteristic_tests.cpp
    ├── characteristic_value_tests.cpp
    ├── connect.coffee
    ├── encryption_tests.cpp
    ├── filter_tests.cpp
    ├── gap_service_tests.cpp
    ├── hci/
    │   ├── CMakeLists.txt
    │   ├── hci_advertising_tests.cpp
    │   └── transport.hpp
    ├── l2cap_tests.cpp
    ├── link_layer/
    │   ├── CMakeLists.txt
    │   ├── address_tests.cpp
    │   ├── advertiser_tests.cpp
    │   ├── channel_map_tests.cpp
    │   ├── connected.hpp
    │   ├── connection_callbacks_tests.cpp
    │   ├── connection_event_callback_tests.cpp
    │   ├── connection_parameter_update_procedure_tests.cpp
    │   ├── delta_time_tests.cpp
    │   ├── ll_advertising_tests.cpp
    │   ├── ll_connecting_tests.cpp
    │   ├── ll_connection_tests.cpp
    │   ├── ll_control_tests.cpp
    │   ├── ll_data_pdu_buffer_tests.cpp
    │   ├── ll_data_tests.cpp
    │   ├── ll_encryption_tests.cpp
    │   ├── ll_l2cap_sdu_buffer_tests.cpp
    │   ├── ll_notification_tests.cpp
    │   ├── ll_peripheral_latency_tests.cpp
    │   ├── ll_phy_update_tests.cpp
    │   ├── ll_remote_request_tests.cpp
    │   ├── peripheral_latency_tests.cpp
    │   ├── ring_buffer_tests.cpp
    │   ├── signaling_channel_tests.cpp
    │   ├── test_radio_tests.cpp
    │   └── white_list_tests.cpp
    ├── notification_queue_tests.cpp
    ├── options_tests.cpp
    ├── read_write_handler_tests.cpp
    ├── ring_tests.cpp
    ├── scattered_access_tests.cpp
    ├── security_manager/
    │   ├── CMakeLists.txt
    │   ├── authentication_stage_tests1.cpp
    │   ├── authentication_stage_tests2.cpp
    │   ├── bonding_tests.cpp
    │   ├── encryption_example_tests.cpp
    │   ├── io_capabilities_tests.cpp
    │   ├── key_distribution_tests.cpp
    │   ├── pairing_confirm_tests.cpp
    │   ├── pairing_random_tests.cpp
    │   ├── pairing_request_tests.cpp
    │   ├── pairing_tests.cpp
    │   ├── public_key_exchange_tests.cpp
    │   ├── test_sm.hpp
    │   └── test_sm_tests.cpp
    ├── server_tests.cpp
    ├── service_tests.cpp
    ├── services/
    │   ├── CMakeLists.txt
    │   ├── battery_tests.cpp
    │   ├── bootloader_tests.cpp
    │   ├── cscs_tests.cpp
    │   ├── test_gatt.cpp
    │   └── test_gatt.hpp
    ├── test_attribute_access.hpp
    ├── test_characteristics.hpp
    ├── test_tools/
    │   ├── CMakeLists.txt
    │   ├── address_io.cpp
    │   ├── aes.c
    │   ├── aes.h
    │   ├── attribute_io.cpp
    │   ├── attribute_io.hpp
    │   ├── buffer_io.cpp
    │   ├── buffer_io.hpp
    │   ├── hexdump.cpp
    │   ├── hexdump.hpp
    │   ├── pairing_status_io.cpp
    │   ├── pairing_status_io.hpp
    │   ├── test_layout.hpp
    │   ├── test_radio.cpp
    │   ├── test_radio.hpp
    │   ├── test_servers.cpp
    │   ├── test_servers.hpp
    │   ├── test_services.hpp
    │   ├── test_uuid.cpp
    │   ├── test_uuid.hpp
    │   ├── uECC.c
    │   └── uECC.h
    ├── test_tuple.hpp
    └── write_queue_tests.cpp

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

================================================
FILE: .editorconfig
================================================
[*]
indent_style = space
indent_size = 4


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]
  schedule:
    - cron: "32 17 * * 5"

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ cpp ]

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v2
        with:
          languages: ${{ matrix.language }}
          queries: +security-and-quality

      - name: Autobuild
        uses: github/codeql-action/autobuild@v2

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v2
        with:
          category: "/language:${{ matrix.language }}"


================================================
FILE: .gitignore
================================================
# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
build*/
documentation/html/
.gdbinit
node_modules/

*.pcapng
/.vs


================================================
FILE: .gitlab-ci.yml
================================================
before_script:
    - apt-get update -qq
    - c++ -v

tests:
    script:
        - cd bluetoe
        - mkdir build && cd build && cmake .. && make && ctest

================================================
FILE: .travis.yml
================================================
sudo: required
dist: bionic
language: cpp

notifications:
  email:
    on_success: change
    on_failure: change

# matrix:
#   include:
    # - compiler: gcc
    #   addons:
    #     apt:
    #       sources:
    #         - ubuntu-toolchain-r-test
    #       packages:
    #         - g++
    #   env: COMPILER=g++
    # - compiler: gcc
    #   addons:
    #     apt:
    #       sources:
    #         - ubuntu-toolchain-r-test
    #       packages:
    #         - g++-5
    #   env: COMPILER=g++-5
    # - compiler: clang
    #   addons:
    #     apt:
    #       sources:
    #         - ubuntu-toolchain-r-test
    #         - llvm-toolchain-precise-3.6
    #       packages:
    #         - clang-3.6
    #   env: COMPILER=clang++-3.6
    # - compiler: clang
    #   addons:
    #     apt:
    #       sources:
    #         - ubuntu-toolchain-r-test
    #         - llvm-toolchain-precise-3.7
    #       packages:
    #         - clang-3.7
    #   env: COMPILER=clang++-3.7

env:
    global:
        COMPILER=g++
        BUILD_ON_TRAVIS=1
        BUILD_DOXYGEN_COMPILE=g++

script:
  - $COMPILER -v
  - mkdir build
  - cd build
  - /opt/cmake/bin/cmake --version
  - /opt/cmake/bin/cmake -DCMAKE_CXX_COMPILER=$COMPILER -DBLUETOE_EXCLUDE_SLOW_TESTS=1 -DBLUETOE_BUILD_UNIT_TESTS=1 ..
  - make
  - ctest --verbose

after_success:
  - cd $TRAVIS_BUILD_DIR
  # - sudo apt-get install --yes graphviz
  # - ls -la
  # - pwd
  # - doxygen -v
  # - ./publish-doxygen

before_install:
  - sudo apt-get update -qq
  - wget https://github.com/Kitware/CMake/releases/download/v3.19.4/cmake-3.19.4-Linux-x86_64.sh
  - wget https://cmake.org/files/v3.11/cmake-3.11.4-Linux-x86_64.sh
  - mkdir /opt/cmake
  - sh cmake-3.19.4-Linux-x86_64.sh --prefix=/opt/cmake --skip-license
  - wget https://launchpad.net/%7Eboost-latest/+archive/ubuntu/ppa/+files/libboost1.55-dev_1.55.0-1ppa1%7Esaucy1_amd64.deb
  - sudo dpkg --install libboost1.55-dev_1.55.0-1ppa1~saucy1_amd64.deb
  # - openssl aes-256-cbc -K $encrypted_eb6359394db6_key -iv $encrypted_eb6359394db6_iv -in config/travisci_rsa.enc -out config/travisci_rsa -d


================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.13)

# Prevent in source build, add this options before project keyword
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
project(lib_bluetoe CXX)

option(BLUETOE_BUILD_UNIT_TESTS "If true, unit test targets are added are build.")

# Libray required by everything in Bluetoe. If there is need to add build options,
# add them on bluetoe::iface.
add_library(bluetoe_iface INTERFACE)
add_library(bluetoe::iface ALIAS bluetoe_iface)
target_compile_features(bluetoe_iface INTERFACE cxx_std_11)
target_include_directories(bluetoe_iface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

# Link Layer implementation based on radio hardware
add_subdirectory(bluetoe/link_layer)

# Link Layer implementation based on HCI over some serial interface
add_subdirectory(bluetoe/hci)

# Utilities
add_subdirectory(bluetoe/utility)

# Security Manager
add_subdirectory(bluetoe/sm)

# Predefined Services (like DIS, CSC and so on)
add_subdirectory(bluetoe/services)

if (CMAKE_CROSSCOMPILING)
    add_subdirectory(bluetoe/bindings/nordic)
endif()

if (NOT CMAKE_CROSSCOMPILING AND BLUETOE_BUILD_UNIT_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()



================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at Torsten At Robitzki dot de. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: Doxyfile
================================================
# Doxyfile 1.9.6

# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#
# Note:
#
# Use doxygen to compare the used configuration file with the template
# configuration file:
# doxygen -x [configFile]
# Use doxygen to compare the used configuration file with the template
# configuration file without replacing the environment variables or CMake type
# replacement variables:
# doxygen -x_noenv [configFile]

#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------

# This tag specifies the encoding used for all characters in the configuration
# file that follow. The default is UTF-8 which is also the encoding used for all
# text before the first occurrence of this tag. Doxygen uses libiconv (or the
# iconv built into libc) for the transcoding. See
# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
# The default value is: UTF-8.

DOXYFILE_ENCODING      = UTF-8

# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
# project for which the documentation is generated. This name is used in the
# title of most generated pages and in a few other places.
# The default value is: My Project.

PROJECT_NAME           = BlueToe

# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.

PROJECT_NUMBER         =

# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.

PROJECT_BRIEF          = "an alternative GATT/BLE implementation"

# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.

PROJECT_LOGO           = documentation/Logo_Bluetoe.svg

# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.

OUTPUT_DIRECTORY       = documentation/

# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format
# and will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
# control the number of sub-directories.
# The default value is: NO.

CREATE_SUBDIRS         = NO

# Controls the number of sub-directories that will be created when
# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
# level increment doubles the number of directories, resulting in 4096
# directories at level 8 which is the default and also the maximum value. The
# sub-directories are organized in 2 levels, the first level always has a fixed
# number of 16 directories.
# Minimum value: 0, maximum value: 8, default value: 8.
# This tag requires that the tag CREATE_SUBDIRS is set to YES.

CREATE_SUBDIRS_LEVEL   = 8

# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
# U+3044.
# The default value is: NO.

ALLOW_UNICODE_NAMES    = NO

# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
# English messages), Korean, Korean-en (Korean with English messages), Latvian,
# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
# Swedish, Turkish, Ukrainian and Vietnamese.
# The default value is: English.

OUTPUT_LANGUAGE        = English

# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.

BRIEF_MEMBER_DESC      = YES

# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
# description of a member or function before the detailed description
#
# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
# The default value is: YES.

REPEAT_BRIEF           = YES

# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
# as the leading text of the brief description, will be stripped from the text
# and the result, after processing the whole list, is used as the annotated
# text. Otherwise, the brief description is used as-is. If left blank, the
# following values are used ($name is automatically replaced with the name of
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.

ABBREVIATE_BRIEF       =

# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.

ALWAYS_DETAILED_SEC    = NO

# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
# The default value is: NO.

INLINE_INHERITED_MEMB  = NO

# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.

FULL_PATH_NAMES        = YES

# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
# part of the path. The tag can be used to show relative paths in the file list.
# If left blank the directory from which doxygen is run is used as the path to
# strip.
#
# Note that you can specify absolute paths here, but also relative paths, which
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.

STRIP_FROM_PATH        = .

# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
# header file to include in order to use a class. If left blank only the name of
# the header file containing the class definition is used. Otherwise one should
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.

STRIP_FROM_INC_PATH    = .

# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.

SHORT_NAMES            = NO

# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
# description. If set to NO, the Javadoc-style will behave just like regular Qt-
# style comments (thus requiring an explicit @brief command for a brief
# description.)
# The default value is: NO.

JAVADOC_AUTOBRIEF      = NO

# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
# such as
# /***************
# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
# Javadoc-style will behave just like regular comments and it will not be
# interpreted by doxygen.
# The default value is: NO.

JAVADOC_BANNER         = NO

# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.

QT_AUTOBRIEF           = NO

# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
# a brief description. This used to be the default behavior. The new default is
# to treat a multi-line C++ comment block as a detailed description. Set this
# tag to YES if you prefer the old behavior instead.
#
# Note that setting this tag to YES also means that rational rose comments are
# not recognized any more.
# The default value is: NO.

MULTILINE_CPP_IS_BRIEF = NO

# By default Python docstrings are displayed as preformatted text and doxygen's
# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
# doxygen's special commands can be used and the contents of the docstring
# documentation blocks is shown as doxygen documentation.
# The default value is: YES.

PYTHON_DOCSTRING       = YES

# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.

INHERIT_DOCS           = YES

# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
# page for each member. If set to NO, the documentation of a member will be part
# of the file/class/namespace that contains it.
# The default value is: NO.

SEPARATE_MEMBER_PAGES  = NO

# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.

TAB_SIZE               = 4

# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
# name=value
# For example adding
# "sideeffect=@par Side Effects:^^"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
# "Side Effects:". Note that you cannot put \n's in the value part of an alias
# to insert newlines (in the resulting output). You can put ^^ in the value part
# of an alias to insert a newline as if a physical newline was in the original
# file. When you need a literal { or } or , in the value part of an alias you
# have to escape them by means of a backslash (\), this can lead to conflicts
# with the commands \{ and \} for these it is advised to use the version @{ and
# @} or use a double escape (\\{ and \\})

ALIASES                =

# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
# members will be omitted, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_FOR_C  = NO

# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
# for that language. For instance, namespaces will be presented as packages,
# qualified scopes will look different, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_JAVA   = NO

# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.

OPTIMIZE_FOR_FORTRAN   = NO

# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.

OPTIMIZE_OUTPUT_VHDL   = NO

# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
# sources only. Doxygen will then generate output that is more tailored for that
# language. For instance, namespaces will be presented as modules, types will be
# separated into more groups, etc.
# The default value is: NO.

OPTIMIZE_OUTPUT_SLICE  = NO

# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
# tries to guess whether the code is fixed or free formatted code, this is the
# default for Fortran type files). For instance to make doxygen treat .inc files
# as Fortran files (default is PHP), and .f files as C (default is Fortran),
# use: inc=Fortran f=C.
#
# Note: For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen. When specifying no_extension you should add
# * to the FILE_PATTERNS.
#
# Note see also the list of default file extension mappings.

EXTENSION_MAPPING      =

# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
# documentation. See https://daringfireball.net/projects/markdown/ for details.
# The output of markdown processing is further processed by doxygen, so you can
# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
# case of backward compatibilities issues.
# The default value is: YES.

MARKDOWN_SUPPORT       = YES

# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
# to that level are automatically included in the table of contents, even if
# they do not have an id attribute.
# Note: This feature currently applies only to Markdown headings.
# Minimum value: 0, maximum value: 99, default value: 5.
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.

TOC_INCLUDE_HEADINGS   = 5

# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by putting a % sign in front of the word or
# globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.

AUTOLINK_SUPPORT       = YES

# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
# tag to YES in order to let doxygen match functions declarations and
# definitions whose arguments contain STL classes (e.g. func(std::string);
# versus func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.

BUILTIN_STL_SUPPORT    = NO

# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.

CPP_CLI_SUPPORT        = NO

# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
# will parse them like normal C++ but will assume all classes use public instead
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.

SIP_SUPPORT            = NO

# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
# doxygen to replace the get and set methods by a property in the documentation.
# This will only work if the methods are indeed getting or setting a simple
# type. If this is not the case, or you want to show the methods anyway, you
# should set this option to NO.
# The default value is: YES.

IDL_PROPERTY_SUPPORT   = YES

# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES then doxygen will reuse the documentation of the first
# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
# The default value is: NO.

DISTRIBUTE_GROUP_DOC   = NO

# If one adds a struct or class to a group and this option is enabled, then also
# any nested class or struct is added to the same group. By default this option
# is disabled and one has to add nested compounds explicitly via \ingroup.
# The default value is: NO.

GROUP_NESTED_COMPOUNDS = NO

# Set the SUBGROUPING tag to YES to allow class member groups of the same type
# (for instance a group of public functions) to be put as a subgroup of that
# type (e.g. under the Public Functions section). Set it to NO to prevent
# subgrouping. Alternatively, this can be done per class using the
# \nosubgrouping command.
# The default value is: YES.

SUBGROUPING            = YES

# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
# and RTF).
#
# Note that this feature does not work in combination with
# SEPARATE_MEMBER_PAGES.
# The default value is: NO.

INLINE_GROUPED_CLASSES = NO

# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
# with only public data fields or simple typedef fields will be shown inline in
# the documentation of the scope in which they are defined (i.e. file,
# namespace, or group documentation), provided this scope is documented. If set
# to NO, structs, classes, and unions are shown on a separate page (for HTML and
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.

INLINE_SIMPLE_STRUCTS  = NO

# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
# with name TypeT. When disabled the typedef will appear as a member of a file,
# namespace, or class. And the struct will be named TypeS. This can typically be
# useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.

TYPEDEF_HIDES_STRUCT   = NO

# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
# an expensive process and often the same symbol appears multiple times in the
# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
# doxygen will become slower. If the cache is too large, memory is wasted. The
# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
# symbols. At the end of a run doxygen will report the cache usage and suggest
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.

LOOKUP_CACHE_SIZE      = 0

# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
# during processing. When set to 0 doxygen will based this on the number of
# cores available in the system. You can set it explicitly to a value larger
# than 0 to get more control over the balance between CPU load and processing
# speed. At this moment only the input processing can be done using multiple
# threads. Since this is still an experimental feature the default is set to 1,
# which effectively disables parallel processing. Please report any issues you
# encounter. Generating dot graphs in parallel is controlled by the
# DOT_NUM_THREADS setting.
# Minimum value: 0, maximum value: 32, default value: 1.

NUM_PROC_THREADS       = 1

#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------

# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
# documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
# Note: This will also disable the warnings about undocumented members that are
# normally produced when WARNINGS is set to YES.
# The default value is: NO.

EXTRACT_ALL            = NO

# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
# be included in the documentation.
# The default value is: NO.

EXTRACT_PRIVATE        = NO

# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
# methods of a class will be included in the documentation.
# The default value is: NO.

EXTRACT_PRIV_VIRTUAL   = NO

# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.

EXTRACT_PACKAGE        = NO

# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
# included in the documentation.
# The default value is: NO.

EXTRACT_STATIC         = NO

# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
# locally in source files will be included in the documentation. If set to NO,
# only classes defined in header files are included. Does not have any effect
# for Java sources.
# The default value is: YES.

EXTRACT_LOCAL_CLASSES  = YES

# This flag is only useful for Objective-C code. If set to YES, local methods,
# which are defined in the implementation section but not in the interface are
# included in the documentation. If set to NO, only methods in the interface are
# included.
# The default value is: NO.

EXTRACT_LOCAL_METHODS  = NO

# If this flag is set to YES, the members of anonymous namespaces will be
# extracted and appear in the documentation as a namespace called
# 'anonymous_namespace{file}', where file will be replaced with the base name of
# the file that contains the anonymous namespace. By default anonymous namespace
# are hidden.
# The default value is: NO.

EXTRACT_ANON_NSPACES   = NO

# If this flag is set to YES, the name of an unnamed parameter in a declaration
# will be determined by the corresponding definition. By default unnamed
# parameters remain unnamed in the output.
# The default value is: YES.

RESOLVE_UNNAMED_PARAMS = YES

# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_MEMBERS     = NO

# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
# to NO, these classes will be included in the various overviews. This option
# will also hide undocumented C++ concepts if enabled. This option has no effect
# if EXTRACT_ALL is enabled.
# The default value is: NO.

HIDE_UNDOC_CLASSES     = NO

# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# declarations. If set to NO, these declarations will be included in the
# documentation.
# The default value is: NO.

HIDE_FRIEND_COMPOUNDS  = NO

# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO, these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.

HIDE_IN_BODY_DOCS      = NO

# The INTERNAL_DOCS tag determines if documentation that is typed after a
# \internal command is included. If the tag is set to NO then the documentation
# will be excluded. Set it to YES to include the internal documentation.
# The default value is: NO.

INTERNAL_DOCS          = NO

# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
# able to match the capabilities of the underlying filesystem. In case the
# filesystem is case sensitive (i.e. it supports files in the same directory
# whose names only differ in casing), the option must be set to YES to properly
# deal with such files in case they appear in the input. For filesystems that
# are not case sensitive the option should be set to NO to properly deal with
# output files written for symbols that only differ in casing, such as for two
# classes, one named CLASS and the other named Class, and to also support
# references to files without having to specify the exact matching casing. On
# Windows (including Cygwin) and MacOS, users should typically set this option
# to NO, whereas on Linux or other Unix flavors it should typically be set to
# YES.
# Possible values are: SYSTEM, NO and YES.
# The default value is: SYSTEM.

CASE_SENSE_NAMES       = NO

# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES, the
# scope will be hidden.
# The default value is: NO.

HIDE_SCOPE_NAMES       = NO

# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
# append additional text to a page's title, such as Class Reference. If set to
# YES the compound reference will be hidden.
# The default value is: NO.

HIDE_COMPOUND_REFERENCE= NO

# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
# will show which file needs to be included to use the class.
# The default value is: YES.

SHOW_HEADERFILE        = YES

# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.

SHOW_INCLUDE_FILES     = YES

# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
# which file to include in order to use the member.
# The default value is: NO.

SHOW_GROUPED_MEMB_INC  = NO

# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.

FORCE_LOCAL_INCLUDES   = NO

# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
# documentation for inline members.
# The default value is: YES.

INLINE_INFO            = YES

# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order.
# The default value is: YES.

SORT_MEMBER_DOCS       = YES

# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order. Note that
# this will also influence the order of the classes in the class list.
# The default value is: NO.

SORT_BRIEF_DOCS        = NO

# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
# destructors are listed first. If set to NO the constructors will appear in the
# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
# member documentation.
# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
# detailed member documentation.
# The default value is: NO.

SORT_MEMBERS_CTORS_1ST = NO

# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
# of group names into alphabetical order. If set to NO the group names will
# appear in their defined order.
# The default value is: NO.

SORT_GROUP_NAMES       = NO

# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
# fully-qualified names, including namespaces. If set to NO, the class list will
# be sorted only by class name, not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
# Note: This option applies only to the class list, not to the alphabetical
# list.
# The default value is: NO.

SORT_BY_SCOPE_NAME     = NO

# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
# the prototype and the implementation of a member function even if there is
# only one candidate or it is obvious which candidate to choose by doing a
# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
# accept a match between prototype and implementation in such cases.
# The default value is: NO.

STRICT_PROTO_MATCHING  = NO

# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
# list. This list is created by putting \todo commands in the documentation.
# The default value is: YES.

GENERATE_TODOLIST      = YES

# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
# list. This list is created by putting \test commands in the documentation.
# The default value is: YES.

GENERATE_TESTLIST      = YES

# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.

GENERATE_BUGLIST       = YES

# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.

GENERATE_DEPRECATEDLIST= YES

# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.

ENABLED_SECTIONS       =

# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
# documentation. If the initializer consists of more lines than specified here
# it will be hidden. Use a value of 0 to hide initializers completely. The
# appearance of the value of individual variables and macros / defines can be
# controlled using \showinitializer or \hideinitializer command in the
# documentation regardless of this setting.
# Minimum value: 0, maximum value: 10000, default value: 30.

MAX_INITIALIZER_LINES  = 30

# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
# the bottom of the documentation of classes and structs. If set to YES, the
# list will mention the files that were used to generate the documentation.
# The default value is: YES.

SHOW_USED_FILES        = YES

# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
# will remove the Files entry from the Quick Index and from the Folder Tree View
# (if specified).
# The default value is: YES.

SHOW_FILES             = YES

# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
# page. This will remove the Namespaces entry from the Quick Index and from the
# Folder Tree View (if specified).
# The default value is: YES.

SHOW_NAMESPACES        = YES

# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from
# the version control system). Doxygen will invoke the program by executing (via
# popen()) the command command input-file, where command is the value of the
# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.

FILE_VERSION_FILTER    =

# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
# will be used as the name of the layout file. See also section "Changing the
# layout of pages" for information.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.

LAYOUT_FILE            =

# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
# extension is automatically appended if omitted. This requires the bibtex tool
# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
# For LaTeX the style of the bibliography can be controlled using
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. See also \cite for info how to create references.

CITE_BIB_FILES         =

#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------

# The QUIET tag can be used to turn on/off the messages that are generated to
# standard output by doxygen. If QUIET is set to YES this implies that the
# messages are off.
# The default value is: NO.

QUIET                  = NO

# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
# this implies that the warnings are on.
#
# Tip: Turn warnings on while writing the documentation.
# The default value is: YES.

WARNINGS               = YES

# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.

WARN_IF_UNDOCUMENTED   = YES

# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as documenting some parameters in
# a documented function twice, or documenting parameters that don't exist or
# using markup commands wrongly.
# The default value is: YES.

WARN_IF_DOC_ERROR      = YES

# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
# function parameter documentation. If set to NO, doxygen will accept that some
# parameters have no documentation without warning.
# The default value is: YES.

WARN_IF_INCOMPLETE_DOC = YES

# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
# value. If set to NO, doxygen will only warn about wrong parameter
# documentation, but not about the absence of documentation. If EXTRACT_ALL is
# set to YES then this flag will automatically be disabled. See also
# WARN_IF_INCOMPLETE_DOC
# The default value is: NO.

WARN_NO_PARAMDOC       = NO

# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
# undocumented enumeration values. If set to NO, doxygen will accept
# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: NO.

WARN_IF_UNDOC_ENUM_VAL = NO

# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
# at the end of the doxygen process doxygen will return with a non-zero status.
# Possible values are: NO, YES and FAIL_ON_WARNINGS.
# The default value is: NO.

WARN_AS_ERROR          = NO

# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
# will be replaced by the file and line number from which the warning originated
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text.

WARN_FORMAT            = "$file:$line: $text"

# In the $text part of the WARN_FORMAT command it is possible that a reference
# to a more specific place is given. To make it easier to jump to this place
# (outside of doxygen) the user can define a custom "cut" / "paste" string.
# Example:
# WARN_LINE_FORMAT = "'vi $file +$line'"
# See also: WARN_FORMAT
# The default value is: at line $line of file $file.

WARN_LINE_FORMAT       = "at line $line of file $file"

# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr). In case the file specified cannot be opened for writing the
# warning and error messages are written to standard error. When as file - is
# specified the warning and error messages are written to standard output
# (stdout).

WARN_LOGFILE           =

#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------

# The INPUT tag is used to specify the files and/or directories that contain
# documented source files. You may enter file names like myfile.cpp or
# directories like /usr/src/myproject. Separate the files or directories with
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.

INPUT                  = bluetoe/

# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see:
# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8.

INPUT_ENCODING         = UTF-8

# This tag can be used to specify the character encoding of the source files
# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
# character encoding on a per file pattern basis. Doxygen will compare the file
# name with each pattern and apply the encoding instead of the default
# INPUT_ENCODING) if there is a match. The character encodings are a list of the
# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
# "INPUT_ENCODING" for further information on supported encodings.

INPUT_FILE_ENCODING    =

# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# read by doxygen.
#
# Note the list of default checked file patterns might differ from the list of
# default file extension mappings.
#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
# *.vhdl, *.ucf, *.qsf and *.ice.

FILE_PATTERNS          = *.hpp \
                         *.md

# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.

RECURSIVE              = YES

# The EXCLUDE tag can be used to specify files and/or directories that should be
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
#
# Note that relative paths are relative to the directory from which doxygen is
# run.

EXCLUDE                =

# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
# The default value is: NO.

EXCLUDE_SYMLINKS       = NO

# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
# certain files from those directories.
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*

EXCLUDE_PATTERNS       =

# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
# ANamespace::AClass, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*

EXCLUDE_SYMBOLS        = bluetoe::details::* \
                         bluetoe::nrf_details::* \
                         bluetoe::nrf51_details::* \
                         bluetoe::nrf52_details::* \
                         bluetoe::link_layer::details::* \
                         bluetoe::hid::details::*

# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).

EXAMPLE_PATH           = examples/doxygen

# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.

EXAMPLE_PATTERNS       =

# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.

EXAMPLE_RECURSIVE      = NO

# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
# \image command).

IMAGE_PATH             =

# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
# by executing (via popen()) the command:
#
# <filter> <input-file>
#
# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
# name of an input file. Doxygen will then use the output that the filter
# program writes to standard output. If FILTER_PATTERNS is specified, this tag
# will be ignored.
#
# Note that the filter must not add or remove lines; it is applied before the
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
# Note that doxygen will use the data processed and written to standard output
# for further processing, therefore nothing else, like debug statements or used
# commands (so in case of a Windows batch file always use @echo OFF), should be
# written to standard output.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.

INPUT_FILTER           =

# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
# filter if there is a match. The filters are a list of the form: pattern=filter
# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied.
#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.

FILTER_PATTERNS        =

# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will also be used to filter the input files that are used for
# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO.

FILTER_SOURCE_FILES    = NO

# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
# it is also possible to disable source filtering for a specific pattern using
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.

FILTER_SOURCE_PATTERNS =

# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
# and want to reuse the introduction page also for the doxygen output.

USE_MDFILE_AS_MAINPAGE =

# The Fortran standard specifies that for fixed formatted Fortran code all
# characters from position 72 are to be considered as comment. A common
# extension is to allow longer lines before the automatic comment starts. The
# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
# be processed before the automatic comment starts.
# Minimum value: 7, maximum value: 10000, default value: 72.

FORTRAN_COMMENT_AFTER  = 72

#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------

# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
# generated. Documented entities will be cross-referenced with these sources.
#
# Note: To get rid of all source code in the generated output, make sure that
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.

SOURCE_BROWSER         = NO

# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
# The default value is: NO.

INLINE_SOURCES         = NO

# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.

STRIP_CODE_COMMENTS    = YES

# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
# entity all documented functions referencing it will be listed.
# The default value is: NO.

REFERENCED_BY_RELATION = NO

# If the REFERENCES_RELATION tag is set to YES then for each documented function
# all documented entities called/used by that function will be listed.
# The default value is: NO.

REFERENCES_RELATION    = NO

# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
# to YES then the hyperlinks from functions in REFERENCES_RELATION and
# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
# link to the documentation.
# The default value is: YES.

REFERENCES_LINK_SOURCE = YES

# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
# source code will show a tooltip with additional information such as prototype,
# brief description and links to the definition and documentation. Since this
# will make the HTML file larger and loading of large files a bit slower, you
# can opt to disable this feature.
# The default value is: YES.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

SOURCE_TOOLTIPS        = YES

# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
# source browser. The htags tool is part of GNU's global source tagging system
# (see https://www.gnu.org/software/global/global.html). You will need version
# 4.8.6 or higher.
#
# To use it do the following:
# - Install the latest version of global
# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
# - Make sure the INPUT points to the root of the source tree
# - Run doxygen as normal
#
# Doxygen will invoke htags (and that will in turn invoke gtags), so these
# tools must be available from the command line (i.e. in the search path).
#
# The result: instead of the source browser generated by doxygen, the links to
# source code will now point to the output of htags.
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.

USE_HTAGS              = NO

# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
# verbatim copy of the header file for each class for which an include is
# specified. Set to NO to disable this.
# See also: Section \class.
# The default value is: YES.

VERBATIM_HEADERS       = YES

#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------

# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
# compounds will be generated. Enable this if the project contains a lot of
# classes, structs, unions or interfaces.
# The default value is: YES.

ALPHABETICAL_INDEX     = YES

# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
# that should be ignored while generating the index headers. The IGNORE_PREFIX
# tag works for classes, function and member names. The entity will be placed in
# the alphabetical list under the first letter of the entity name that remains
# after removing the prefix.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.

IGNORE_PREFIX          =

#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------

# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
# The default value is: YES.

GENERATE_HTML          = YES

# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_OUTPUT            = html

# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
# The default value is: .html.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FILE_EXTENSION    = .html

# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
# each generated HTML page. If the tag is left blank doxygen will generate a
# standard header.
#
# To get valid HTML the header file that includes any scripts and style sheets
# that doxygen needs, which is dependent on the configuration options used (e.g.
# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
# default header using
# doxygen -w html new_header.html new_footer.html new_stylesheet.css
# YourConfigFile
# and then modify the file new_header.html. See also section "Doxygen usage"
# for information on how to generate the default header that doxygen normally
# uses.
# Note: The header is subject to change so you typically have to regenerate the
# default header when upgrading to a newer version of doxygen. For a description
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_HEADER            =

# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
# footer. See HTML_HEADER for more information on how to generate a default
# footer and what special commands can be used inside the footer. See also
# section "Doxygen usage" for information on how to generate the default footer
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FOOTER            =

# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
# the HTML output. If left blank doxygen will generate a default style sheet.
# See also section "Doxygen usage" for information on how to generate the style
# sheet that doxygen normally uses.
# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
# it is more robust and this tag (HTML_STYLESHEET) will in the future become
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_STYLESHEET        = ./documentation/customdoxygen.css

# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_STYLESHEET  =

# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
# that these files will be copied to the base HTML output directory. Use the
# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_EXTRA_FILES       =

# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
# should be rendered with a dark or light theme.
# Possible values are: LIGHT always generate light mode output, DARK always
# generate dark mode output, AUTO_LIGHT automatically set the mode according to
# the user preference, use light mode if no preference is set (the default),
# AUTO_DARK automatically set the mode according to the user preference, use
# dark mode if no preference is set and TOGGLE allow to user to switch between
# light and dark mode via a button.
# The default value is: AUTO_LIGHT.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE        = AUTO_LIGHT

# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
# this color. Hue is specified as an angle on a color-wheel, see
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_HUE    = 220

# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use gray-scales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_SAT    = 100

# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
# gradually make the output lighter, whereas values above 100 make the output
# darker. The value divided by 100 is the actual gamma applied, so 80 represents
# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
# change the gamma.
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_COLORSTYLE_GAMMA  = 80

# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to YES can help to show when doxygen was last run and thus if the
# documentation is up to date.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_TIMESTAMP         = YES

# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
# documentation will contain a main index with vertical navigation menus that
# are dynamically created via JavaScript. If disabled, the navigation index will
# consists of multiple levels of tabs that are statically embedded in every HTML
# page. Disable this option to support browsers that do not have JavaScript,
# like the Qt help browser.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_DYNAMIC_MENUS     = YES

# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
# page has loaded.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_DYNAMIC_SECTIONS  = NO

# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to
# such a level that at most the specified number of entries are visible (unless
# a fully collapsed tree already exceeds this amount). So setting the number of
# entries 1 will produce a full collapsed tree by default. 0 is a special value
# representing an infinite number of entries and will result in a full expanded
# tree by default.
# Minimum value: 0, maximum value: 9999, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_INDEX_NUM_ENTRIES = 100

# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
# environment (see:
# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
# create a documentation set, doxygen will generate a Makefile in the HTML
# output directory. Running make will produce the docset in that directory and
# running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
# genXcode/_index.html for more information.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_DOCSET        = NO

# This tag determines the name of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# The default value is: Doxygen generated docs.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_FEEDNAME        = "Doxygen generated docs"

# This tag determines the URL of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_FEEDURL         =

# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_BUNDLE_ID       = org.doxygen.Project

# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style
# string, e.g. com.mycompany.MyDocSet.documentation.
# The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_ID    = org.doxygen.Publisher

# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.

DOCSET_PUBLISHER_NAME  = Publisher

# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
# on Windows. In the beginning of 2021 Microsoft took the original page, with
# a.o. the download links, offline the HTML help workshop was already many years
# in maintenance mode). You can download the HTML help workshop from the web
# archives at Installation executable (see:
# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
# files are now used as the Windows 98 help format, and will replace the old
# Windows help format (.hlp) on all Windows platforms in the future. Compressed
# HTML files also contain an index, a table of contents, and you can search for
# words in the documentation. The HTML workshop also contains a viewer for
# compressed HTML files.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_HTMLHELP      = NO

# The CHM_FILE tag can be used to specify the file name of the resulting .chm
# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_FILE               =

# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler (hhc.exe). If non-empty,
# doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

HHC_LOCATION           =

# The GENERATE_CHI flag controls if a separate .chi index file is generated
# (YES) or that it should be included in the main .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

GENERATE_CHI           = NO

# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

CHM_INDEX_ENCODING     =

# The BINARY_TOC flag controls whether a binary table of contents is generated
# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
# enables the Previous and Next buttons.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

BINARY_TOC             = NO

# The TOC_EXPAND flag can be set to YES to add extra items for group members to
# the table of contents of the HTML help documentation and to the tree view.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.

TOC_EXPAND             = NO

# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
# (.qch) of the generated HTML documentation.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_QHP           = NO

# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
# the file name of the resulting .qch file. The path specified is relative to
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.

QCH_FILE               =

# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
# (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_NAMESPACE          = org.doxygen.Project

# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
# Folders (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_VIRTUAL_FOLDER     = doc

# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
# Filters (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_NAME   =

# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
# Filters (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_CUST_FILTER_ATTRS  =

# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.

QHP_SECT_FILTER_ATTRS  =

# The QHG_LOCATION tag can be used to specify the location (absolute path
# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
# run qhelpgenerator on the generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.

QHG_LOCATION           =

# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
# install this plugin and make it available under the help contents menu in
# Eclipse, the contents of the directory containing the HTML and XML files needs
# to be copied into the plugins directory of eclipse. The name of the directory
# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
# After copying Eclipse needs to be restarted before the help appears.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_ECLIPSEHELP   = NO

# A unique identifier for the Eclipse help plugin. When installing the plugin
# the directory name containing the HTML and XML files should also have this
# name. Each documentation set should have its own identifier.
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.

ECLIPSE_DOC_ID         = org.doxygen.Project

# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
# of each HTML page. A value of NO enables the index and the value YES disables
# it. Since the tabs in the index contain the same information as the navigation
# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

DISABLE_INDEX          = NO

# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
# value is set to YES, a side panel will be generated containing a tree-like
# index structure (just like the one that is generated for HTML Help). For this
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
# further fine tune the look of the index (see "Fine-tuning the output"). As an
# example, the default style sheet generated by doxygen has an example that
# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
# Since the tree basically has the same information as the tab index, you could
# consider setting DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

GENERATE_TREEVIEW      = NO

# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
# area (value NO) or if it should extend to the full height of the window (value
# YES). Setting this to YES gives a layout similar to
# https://docs.readthedocs.io with more room for contents, but less room for the
# project logo, title, and description. If either GENERATE_TREEVIEW or
# DISABLE_INDEX is set to NO, this option has no effect.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

FULL_SIDEBAR           = NO

# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
# Note that a value of 0 will completely suppress the enum values from appearing
# in the overview section.
# Minimum value: 0, maximum value: 20, default value: 4.
# This tag requires that the tag GENERATE_HTML is set to YES.

ENUM_VALUES_PER_LINE   = 4

# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.

TREEVIEW_WIDTH         = 250

# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

EXT_LINKS_IN_WINDOW    = NO

# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
# addresses.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

OBFUSCATE_EMAILS       = YES

# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
# the HTML output. These images will generally look nicer at scaled resolutions.
# Possible values are: png (the default) and svg (looks nicer but requires the
# pdf2svg or inkscape tool).
# The default value is: png.
# This tag requires that the tag GENERATE_HTML is set to YES.

HTML_FORMULA_FORMAT    = png

# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
# output directory to force them to be regenerated.
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.

FORMULA_FONTSIZE       = 10

# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details.

FORMULA_MACROFILE      =

# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# https://www.mathjax.org) which uses client side JavaScript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path
# to it using the MATHJAX_RELPATH option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.

USE_MATHJAX            = NO

# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
# Note that the different versions of MathJax have different requirements with
# regards to the different settings, so it is possible that also other MathJax
# settings have to be changed when switching between the different MathJax
# versions.
# Possible values are: MathJax_2 and MathJax_3.
# The default value is: MathJax_2.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_VERSION        = MathJax_2

# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. For more details about the output format see MathJax
# version 2 (see:
# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
# (see:
# http://docs.mathjax.org/en/latest/web/components/output.html).
# Possible values are: HTML-CSS (which is slower, but has the best
# compatibility. This is the name for Mathjax version 2, for MathJax version 3
# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
# is the name for Mathjax version 3, for MathJax version 2 this will be
# translated into HTML-CSS) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_FORMAT         = HTML-CSS

# When MathJax is enabled you need to specify the location relative to the HTML
# output directory using the MATHJAX_RELPATH option. The destination directory
# should contain the MathJax.js script. For instance, if the mathjax directory
# is located at the same level as the HTML output directory, then
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
# MathJax from https://www.mathjax.org before deployment. The default value is:
# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest

# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
# for MathJax version 2 (see
# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# For example for MathJax version 3 (see
# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
# MATHJAX_EXTENSIONS = ams
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_EXTENSIONS     =

# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
# (see:
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.

MATHJAX_CODEFILE       =

# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
# should work on any modern browser. Note that when using HTML help
# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
# there is already a search function so this one should typically be disabled.
# For large projects the javascript based search engine can be slow, then
# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
# search using the keyboard; to jump to the search box use <access key> + S
# (what the <access key> is depends on the OS and browser, but it is typically
# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
# key> to jump into the search results window, the results can be navigated
# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
# the search. The filter options can be selected when the cursor is inside the
# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
# to select a filter and <Enter> or <escape> to activate or cancel the filter
# option.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.

SEARCHENGINE           = YES

# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using JavaScript. There
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
# setting. When disabled, doxygen will generate a PHP script for searching and
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
# and searching needs to be provided by external tools. See the section
# "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.

SERVER_BASED_SEARCH    = NO

# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
# script for searching. Instead the search results are written to an XML file
# which needs to be processed by an external indexer. Doxygen will invoke an
# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
# search results.
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see:
# https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTERNAL_SEARCH        = NO

# The SEARCHENGINE_URL should point to a search engine hosted by a web server
# which will return the search results when EXTERNAL_SEARCH is enabled.
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see:
# https://xapian.org/). See the section "External Indexing and Searching" for
# details.
# This tag requires that the tag SEARCHENGINE is set to YES.

SEARCHENGINE_URL       =

# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
# search data is written to a file for indexing by an external tool. With the
# SEARCHDATA_FILE tag the name of this file can be specified.
# The default file is: searchdata.xml.
# This tag requires that the tag SEARCHENGINE is set to YES.

SEARCHDATA_FILE        = searchdata.xml

# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
# projects and redirect the results back to the right project.
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTERNAL_SEARCH_ID     =

# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
# projects other than the one defined by this configuration file, but that are
# all added to the same external search index. Each project needs to have a
# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
# to a relative location where the documentation can be found. The format is:
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
# This tag requires that the tag SEARCHENGINE is set to YES.

EXTRA_SEARCH_MAPPINGS  =

#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------

# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
# The default value is: YES.

GENERATE_LATEX         = NO

# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_OUTPUT           = latex

# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
#
# Note that when not enabling USE_PDFLATEX the default is latex when enabling
# USE_PDFLATEX the default is pdflatex and when in the later case latex is
# chosen this is overwritten by pdflatex. For specific output languages the
# default can have been set differently, this depends on the implementation of
# the output language.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_CMD_NAME         = latex

# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
# Note: This tag is used in the Makefile / make.bat.
# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
# (.tex).
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

MAKEINDEX_CMD_NAME     = makeindex

# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
# generate index for LaTeX. In case there is no backslash (\) as first character
# it will be automatically added in the LaTeX code.
# Note: This tag is used in the generated output file (.tex).
# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
# The default value is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_MAKEINDEX_CMD    = makeindex

# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

COMPACT_LATEX          = NO

# The PAPER_TYPE tag can be used to set the paper type that is used by the
# printer.
# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
# 14 inches) and executive (7.25 x 10.5 inches).
# The default value is: a4.
# This tag requires that the tag GENERATE_LATEX is set to YES.

PAPER_TYPE             = a4

# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
# that should be included in the LaTeX output. The package can be specified just
# by its name or with the correct syntax as to be used with the LaTeX
# \usepackage command. To get the times font for instance you can specify :
# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
# To use the option intlimits with the amsmath package you can specify:
# EXTRA_PACKAGES=[intlimits]{amsmath}
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.

EXTRA_PACKAGES         =

# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
# the generated LaTeX document. The header should contain everything until the
# first chapter. If it is left blank doxygen will generate a standard header. It
# is highly recommended to start with a default header using
# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
# and then modify the file new_header.tex. See also section "Doxygen usage" for
# information on how to generate the default header that doxygen normally uses.
#
# Note: Only use a user-defined header if you know what you are doing!
# Note: The header is subject to change so you typically have to regenerate the
# default header when upgrading to a newer version of doxygen. The following
# commands have a special meaning inside the header (and footer): For a
# description of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_HEADER           =

# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
# the generated LaTeX document. The footer should contain everything after the
# last chapter. If it is left blank doxygen will generate a standard footer. See
# LATEX_HEADER for more information on how to generate a default footer and what
# special commands can be used inside the footer. See also section "Doxygen
# usage" for information on how to generate the default footer that doxygen
# normally uses. Note: Only use a user-defined footer if you know what you are
# doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_FOOTER           =

# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# LaTeX style sheets that are included after the standard style sheets created
# by doxygen. Using this option one can overrule certain style aspects. Doxygen
# will copy the style sheet files to the output directory.
# Note: The order of the extra style sheet files is of importance (e.g. the last
# style sheet in the list overrules the setting of the previous ones in the
# list).
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_EXTRA_STYLESHEET =

# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the LATEX_OUTPUT output
# directory. Note that the files will be copied as-is; there are no commands or
# markers available.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_EXTRA_FILES      =

# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
# contain links (just like the HTML output) instead of page references. This
# makes the output suitable for online browsing using a PDF viewer.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.

PDF_HYPERLINKS         = YES

# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
# files. Set this option to YES, to get a higher quality PDF documentation.
#
# See also section LATEX_CMD_NAME for selecting the engine.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.

USE_PDFLATEX           = YES

# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
# if errors occur, instead of asking the user for help.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_BATCHMODE        = NO

# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
# index chapters (such as File Index, Compound Index, etc.) in the output.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_HIDE_INDICES     = NO

# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
# The default value is: plain.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_BIB_STYLE        = plain

# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
# page will contain the date and time when the page was generated. Setting this
# to NO can help when comparing the output of multiple runs.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_TIMESTAMP        = NO

# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
# path from which the emoji images will be read. If a relative path is entered,
# it will be relative to the LATEX_OUTPUT directory. If left blank the
# LATEX_OUTPUT directory will be used.
# This tag requires that the tag GENERATE_LATEX is set to YES.

LATEX_EMOJI_DIRECTORY  =

#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------

# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
# RTF output is optimized for Word 97 and may not look too pretty with other RTF
# readers/editors.
# The default value is: NO.

GENERATE_RTF           = NO

# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: rtf.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_OUTPUT             = rtf

# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
# documents. This may be useful for small projects and may help to save some
# trees in general.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.

COMPACT_RTF            = NO

# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
# contain hyperlink fields. The RTF file will contain links (just like the HTML
# output) instead of page references. This makes the output suitable for online
# browsing using Word or some other Word compatible readers that support those
# fields.
#
# Note: WordPad (write) and others do not support links.
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_HYPERLINKS         = NO

# Load stylesheet definitions from file. Syntax is similar to doxygen's
# configuration file, i.e. a series of assignments. You only have to provide
# replacements, missing definitions are set to their default value.
#
# See also section "Doxygen usage" for information on how to generate the
# default style sheet that doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_STYLESHEET_FILE    =

# Set optional variables used in the generation of an RTF document. Syntax is
# similar to doxygen's configuration file. A template extensions file can be
# generated using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.

RTF_EXTENSIONS_FILE    =

#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------

# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
# classes and files.
# The default value is: NO.

GENERATE_MAN           = NO

# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it. A directory man3 will be created inside the directory specified by
# MAN_OUTPUT.
# The default directory is: man.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_OUTPUT             = man

# The MAN_EXTENSION tag determines the extension that is added to the generated
# man pages. In case the manual section does not start with a number, the number
# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
# optional.
# The default value is: .3.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_EXTENSION          = .3

# The MAN_SUBDIR tag determines the name of the directory created within
# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
# MAN_EXTENSION with the initial . removed.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_SUBDIR             =

# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
# man page(s). These additional files only source the real man page, but without
# them the man command would be unable to find the correct page.
# The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES.

MAN_LINKS              = NO

#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------

# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
# captures the structure of the code including all documentation.
# The default value is: NO.

GENERATE_XML           = NO

# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
# it.
# The default directory is: xml.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_OUTPUT             = xml

# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size
# of the XML output.
# The default value is: YES.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_PROGRAMLISTING     = YES

# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
# namespace members in file scope as well, matching the HTML output.
# The default value is: NO.
# This tag requires that the tag GENERATE_XML is set to YES.

XML_NS_MEMB_FILE_SCOPE = NO

#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------

# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
# that can be used to generate PDF.
# The default value is: NO.

GENERATE_DOCBOOK       = NO

# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
# front of it.
# The default directory is: docbook.
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.

DOCBOOK_OUTPUT         = docbook

#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------

# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
# the structure of the code including all documentation. Note that this feature
# is still experimental and incomplete at the moment.
# The default value is: NO.

GENERATE_AUTOGEN_DEF   = NO

#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------

# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
# file that captures the structure of the code including all documentation.
#
# Note that this feature is still experimental and incomplete at the moment.
# The default value is: NO.

GENERATE_PERLMOD       = NO

# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
# output from the Perl module output.
# The default value is: NO.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_LATEX          = NO

# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
# formatted so it can be parsed by a human reader. This is useful if you want to
# understand what is going on. On the other hand, if this tag is set to NO, the
# size of the Perl module output will be much smaller and Perl will parse it
# just the same.
# The default value is: YES.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_PRETTY         = YES

# The names of the make variables in the generated doxyrules.make file are
# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
# so different doxyrules.make files included by the same Makefile don't
# overwrite each other's variables.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.

PERLMOD_MAKEVAR_PREFIX =

#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------

# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.

ENABLE_PREPROCESSING   = YES

# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
# in the source code. If set to NO, only conditional compilation will be
# performed. Macro expansion can be done in a controlled way by setting
# EXPAND_ONLY_PREDEF to YES.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

MACRO_EXPANSION        = NO

# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
# EXPAND_AS_DEFINED tags.
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

EXPAND_ONLY_PREDEF     = NO

# If the SEARCH_INCLUDES tag is set to YES, the include files in the
# INCLUDE_PATH will be searched if a #include is found.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

SEARCH_INCLUDES        = YES

# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
# RECURSIVE has no effect here.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.

INCLUDE_PATH           =

# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
# directories. If left blank, the patterns specified with FILE_PATTERNS will be
# used.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

INCLUDE_FILE_PATTERNS  =

# The PREDEFINED tag can be used to specify one or more macro names that are
# defined before the preprocessor is started (similar to the -D option of e.g.
# gcc). The argument of the tag is a list of macros of the form: name or
# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
# is assumed. To prevent a macro definition from being undefined via #undef or
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

PREDEFINED             =

# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
# macro definition that is found in the sources will be used. Use the PREDEFINED
# tag if you want to use a different macro definition that overrules the
# definition found in the source code.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

EXPAND_AS_DEFINED      =

# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all references to function-like macros that are alone on a line, have
# an all uppercase name, and do not end with a semicolon. Such function macros
# are typically used for boiler-plate code, and will confuse the parser if not
# removed.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

SKIP_FUNCTION_MACROS   = YES

#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------

# The TAGFILES tag can be used to specify one or more tag files. For each tag
# file the location of the external documentation should be added. The format of
# a tag file without this location is as follows:
# TAGFILES = file1 file2 ...
# Adding location for the tag files is done as follows:
# TAGFILES = file1=loc1 "file2 = loc2" ...
# where loc1 and loc2 can be relative or absolute paths or URLs. See the
# section "Linking to external documentation" for more information about the use
# of tag files.
# Note: Each tag file must have a unique name (where the name does NOT include
# the path). If a tag file is not located in the directory in which doxygen is
# run, you must also specify the path to the tagfile here.

TAGFILES               =

# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.

GENERATE_TAGFILE       =

# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be
# listed.
# The default value is: NO.

ALLEXTERNALS           = NO

# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.

EXTERNAL_GROUPS        = YES

# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
# the related pages index. If set to NO, only the current project's pages will
# be listed.
# The default value is: YES.

EXTERNAL_PAGES         = YES

#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------

# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.

DIA_PATH               =

# If set to YES the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.

HIDE_UNDOC_RELATIONS   = YES

# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
# The default value is: NO.

HAVE_DOT               = NO

# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
# to run in parallel. When set to 0 doxygen will base this on the number of
# processors available in the system. You can set it explicitly to a value
# larger than 0 to get control over the balance between CPU load and processing
# speed.
# Minimum value: 0, maximum value: 32, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_NUM_THREADS        = 0

# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
# subgraphs. When you want a differently looking font in the dot files that
# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
# Edge and Graph Attributes specification</a> You need to make sure dot is able
# to find the font, which can be done by putting it in a standard location or by
# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
# directory containing the font. Default graphviz fontsize is 14.
# The default value is: fontname=Helvetica,fontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_COMMON_ATTR        = "fontname=Helvetica,fontsize=10"

# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
# arrows shapes.</a>
# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_EDGE_ATTR          = "labelfontname=Helvetica,labelfontsize=10"

# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
# around nodes set 'shape=plain' or 'shape=plaintext' <a
# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_NODE_ATTR          = "shape=box,height=0.2,width=0.4"

# You can set the path where dot can find font specified with fontname in
# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_FONTPATH           =

# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
# graph for each documented class showing the direct and indirect inheritance
# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
# to TEXT the direct and indirect inheritance relations will be shown as texts /
# links.
# Possible values are: NO, YES, TEXT and GRAPH.
# The default value is: YES.

CLASS_GRAPH            = YES

# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the
# class with other documented classes.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

COLLABORATION_GRAPH    = YES

# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies. See also the chapter Grouping
# in the manual.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GROUP_GRAPHS           = YES

# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

UML_LOOK               = NO

# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
# class node. If there are many fields or methods and many nodes the graph may
# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
# number of items for each type to make the size more manageable. Set this to 0
# for no limit. Note that the threshold may be exceeded by 50% before the limit
# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
# This tag requires that the tag UML_LOOK is set to YES.

UML_LIMIT_NUM_FIELDS   = 10

# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
# tag is set to YES, doxygen will add type and arguments for attributes and
# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
# will not generate fields with class member information in the UML graphs. The
# class diagrams will look similar to the default class diagrams but using UML
# notation for the relationships.
# Possible values are: NO, YES and NONE.
# The default value is: NO.
# This tag requires that the tag UML_LOOK is set to YES.

DOT_UML_DETAILS        = NO

# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
# to display on a single line. If the actual line length exceeds this threshold
# significantly it will wrapped across multiple lines. Some heuristics are apply
# to avoid ugly line breaks.
# Minimum value: 0, maximum value: 1000, default value: 17.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_WRAP_THRESHOLD     = 17

# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

TEMPLATE_RELATIONS     = NO

# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
# YES then doxygen will generate a graph for each documented file showing the
# direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

INCLUDE_GRAPH          = YES

# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
# the direct and indirect include dependencies of the file with other documented
# files.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

INCLUDED_BY_GRAPH      = YES

# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable call graphs for selected
# functions only using the \callgraph command. Disabling a call graph can be
# accomplished by means of the command \hidecallgraph.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

CALL_GRAPH             = NO

# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
# dependency graph for every global function or class method.
#
# Note that enabling this option will significantly increase the time of a run.
# So in most cases it will be better to enable caller graphs for selected
# functions only using the \callergraph command. Disabling a caller graph can be
# accomplished by means of the command \hidecallergraph.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

CALLER_GRAPH           = NO

# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
# hierarchy of all classes instead of a textual one.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GRAPHICAL_HIERARCHY    = YES

# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between the
# files in the directories.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

DIRECTORY_GRAPH        = YES

# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
# of child directories generated in directory dependency graphs by dot.
# Minimum value: 1, maximum value: 25, default value: 1.
# This tag requires that the tag DIRECTORY_GRAPH is set to YES.

DIR_GRAPH_MAX_DEPTH    = 1

# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see:
# http://www.graphviz.org/)).
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement).
# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
# png:gdiplus:gdiplus.
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_IMAGE_FORMAT       = png

# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
# enable generation of interactive SVG images that allow zooming and panning.
#
# Note that this requires a modern browser other than Internet Explorer. Tested
# and working are Firefox, Chrome, Safari, and Opera.
# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
# the SVG files visible. Older versions of IE do not have SVG support.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

INTERACTIVE_SVG        = NO

# The DOT_PATH tag can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_PATH               =

# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the \dotfile
# command).
# This tag requires that the tag HAVE_DOT is set to YES.

DOTFILE_DIRS           =

# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).

MSCFILE_DIRS           =

# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
# command).

DIAFILE_DIRS           =

# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
# path where java can find the plantuml.jar file or to the filename of jar file
# to be used. If left blank, it is assumed PlantUML is not used or called during
# a preprocessing step. Doxygen will generate a warning when it encounters a
# \startuml command in this case and will not generate output for the diagram.

PLANTUML_JAR_PATH      =

# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
# configuration file for plantuml.

PLANTUML_CFG_FILE      =

# When using plantuml, the specified paths are searched for files specified by
# the !include statement in a plantuml block.

PLANTUML_INCLUDE_PATH  =

# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
# larger than this value, doxygen will truncate the graph, which is visualized
# by representing a node as a red box. Note that doxygen if the number of direct
# children of the root node in a graph is already larger than
# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
# Minimum value: 0, maximum value: 10000, default value: 50.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_GRAPH_MAX_NODES    = 50

# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
# generated by dot. A depth value of 3 means that only nodes reachable from the
# root by following a path via at most 3 edges will be shown. Nodes that lay
# further from the root node will be omitted. Note that setting this option to 1
# or 2 may greatly reduce the computation time needed for large code bases. Also
# note that the size of a graph can be further restricted by
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
# Minimum value: 0, maximum value: 1000, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.

MAX_DOT_GRAPH_DEPTH    = 0

# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
# this, this feature is disabled by default.
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.

DOT_MULTI_TARGETS      = NO

# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
# graphical representation for inheritance and collaboration diagrams is used.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.

GENERATE_LEGEND        = YES

# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
# files that are used to generate the various graphs.
#
# Note: This setting is not only used for dot files but also for msc temporary
# files.
# The default value is: YES.

DOT_CLEANUP            = YES


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Torsten Robitzki

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

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

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



================================================
FILE: README.md
================================================
# Bluetoe [![Build Status](https://travis-ci.org/TorstenRobitzki/bluetoe.svg?branch=master)](https://travis-ci.org/TorstenRobitzki/bluetoe) [![Join the chat at https://gitter.im/TorstenRobitzki/bluetoe](https://badges.gitter.im/TorstenRobitzki/bluetoe.svg)](https://gitter.im/TorstenRobitzki/bluetoe?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/TorstenRobitzki/bluetoe.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/TorstenRobitzki/bluetoe/context:cpp)

![Bluetoe Logo](https://github.com/TorstenRobitzki/bluetoe/blob/master/documentation/Logo_Bluetoe.svg?raw=true)

## Putin's Invasion of Ukraine

Please consider donating to one of the funds that help victims of the war in Ukraine:
- https://spendenkonto-nothilfe.de

## Overview

Bluetoe implements a GATT server with a very low memory footprint and a convenient C++ interface. Bluetoe makes things easy but gives you the opportunity to fiddle with all the low-level GATT details if necessary. Bluetoe's primary target is very small microcontrollers. Here is a complete example of a small GATT server that allows a client to controll an IO pin, running on a nRF52832:

    #include <bluetoe/server.hpp>
    #include <bluetoe/device.hpp>
    #include <nrf.h>

    using namespace bluetoe;

    // LED1 on a nRF52 eval board
    static constexpr int io_pin = 17;

    static std::uint8_t io_pin_write_handler( bool state )
    {
        // On an nRF52 eval board, the pin is connected to the LED's cathode. This inverts the logic.
        NRF_GPIO->OUT = state
            ? NRF_GPIO->OUT & ~( 1 << io_pin )
            : NRF_GPIO->OUT | ( 1 << io_pin );

        return error_codes::success;
    }

    using blinky_server = server<
        service<
            service_uuid< 0xC11169E1, 0x6252, 0x4450, 0x931C, 0x1B43A318783B >,
            characteristic<
                requires_encryption,
                free_write_handler< bool, io_pin_write_handler >
            >
        >
    >;

    blinky_server gatt;

    device< blinky_server > gatt_srv;

    int main()
    {
        // Init GPIO pin
        NRF_GPIO->PIN_CNF[ io_pin ] =
            ( GPIO_PIN_CNF_DRIVE_S0H1 << GPIO_PIN_CNF_DRIVE_Pos ) |
            ( GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos );

        for ( ;; )
            gatt_srv.run( gatt );
    }

## Documentation

http://torstenrobitzki.github.io/bluetoe/

## L2CAP

Bluetoe ships with its own fully-usable link layer based on the nRF52832. The link layer implementation is based and tested on an abstract device called a scheduled radio, and should be easy to port to similar hardware. As Bluetoe is a GATT server implementation, only parts of the link layer relevant to GATT have been implemented. Bluetoe can be easily adapted to any other existing L2CAP implementation (those based on HCI, for example).

## Current State

The following table shows the list of supported GATT procedures, along with and their current and planned implementation status:

Feature | Sub-Procedure | Status
--------|---------------|-------
Server Configuration|Exchange MTU|implemented
Primary Service Discovery|Discover All Primary Services|implemented
<br/> |Discover Primary Service By Service UUID|implemented
Relationship Discovery|Find Included Services|implemented
<br/> |Declare Secondary Services|implemented
Characteristic Discovery|Discover All Characteristic of a Service|implemented
<br/> |Discover Characteristic by UUID|implemented
Characteristic Descriptor Discovery|Discover All Characteristic Descriptors|implemented
Characteristic Value Read|Read Characteristic Value|implemented
<br/> |Read Using Characteristic UUID|implemented
<br/> |Read Long Characteristic Value|implemented
<br/> |Read Multiple Characteristic Values|implemented
Characteristic Value Write| Write Without Response|implemented
<br/> |Signed Write Without Response|not planned
<br/> |Write Characteristic Value|implemented
<br/> |Write Long Characteristic Values|implemented
<br/> |Characteristic Value Reliable Writes|implemented
Characteristic Value Notification|Notifications|implemented
Characteristic Value Indication|Indications|implemented
Characteristic Descriptor Value Read|Read Characteristic Descriptors|implemented
<br/> |Read Long Characteristic Descriptors|implemented
Characteristic Descriptor Value Write|Write Characteristic Descriptors|implemented
<br/> |Write Long Characteristic Descriptors|implemented
Cryptography|Encryption|implemented
<br/> |Authentication|planned

This is the current state of implemented Advertising Data:

Advertising Data|Format|Status
----------------|------|------
Service UUID|Incomplete List of 16-bit Service UUIDs|implemented
<br/> |Complete List of 16-bit Service UUIDs|implemented
<br/> |Incomplete List of 32-bit Service UUIDs|not planned
<br/> |Complete List of 32-bit Service UUIDs|not planned
<br/> |Incomplete List of 128-bit Service UUIDs|implemented
<br/> |Complete List of 128-bit Service UUIDs|implemented
Local Name|Shortened Local Name|implemented
<br/> |Complete Local Name|implemented
Flags|Flags|implemented
Manufacturer Specific Data|Manufacturer Specific Data|planned
TX Power Level|TX Power Level|planned
Secure Simple Pairing Out of Band||not planned
Security Manager Out of Band||not planned
Security Manager TK Value||not planned
Slave Connection Interval Range||not planned
Service Solicitation||not planned
Service Data||not planned
Appearance|Appearance|implemented
LE Role|LE Role|planned

This is the current state of the Link Layer implementation:

Aspect | Feature | Status
-------|---------|--------
Roles|Slave Role|implemented
<br/> |Master Role|not planned
Advertising|connectable undirected advertising|implemented
<br/> |connectable directed advertising|implemented
<br/> |non-connectable undirected advertising|implemented
<br/> |scannable undirected advertising|implemented
Device Filtering||implemented
Connections|Single Connection|implemented
<br/> |Multiple Connection|not planned
Connection|Slave Latency|planned
Feature Support|LE Encryption|implemented
<br/> |Connection Parameters Request Procedure|implemented
<br/> |Extended Reject Indication|planned
<br/> |Slave-initiated Features Exchange|planned
<br/> |LE Ping|implemented
<br/> |LE Data Packet Length Extension|planned
<br/> |LL Privacy|not planned
<br/> |Extended Scanner Filter Policies|not planned

<br/> Pull requests are welcome.

## Dependencies

- Boost for Unit tests
- CMake for build
- A decent C++ compiler supporting C++11

# Current Measurements

All measurements were done without any traffic and a slave latency of 0.
Average current was measured using various connection intervals.

## nRF52840 blinky without encryption

- Calibrated RC Sleep Clock (500ppm) (13608 Bytes binary size)
  * 546µA average at 7.5ms
  * 283µA average at 15ms
  * 155µA average at 30ms

- Crystal Oscilator Sleep Clock (20ppm) (13364 Bytes binary size)
  * 526µA average at 7.5ms
  * 207µA average at 15ms
  * 143µA average at 30ms
  * 22.4µA average at 660ms

## nRF52840 blinky with encryption

- Calibrated RC Sleep Clock (500ppm) (22848 Bytes binary size)
  * 613µA average at 7.5ms
  * 211µA average at 30ms
  * 113µA average at 660ms

- Crystal Oscilator Sleep Clock (20ppm) (22608 Bytes binary size)
  * 589µA average at 7.5ms
  * 197µA average at 30ms

- Synthesized Sleep Clock (40ppm) (22596 Bytes binary size)
  * 1.09mA average at 7.5ms
  * 776µA average at 30ms

- Old radio implementation (40ppm) (22212 Bytes binary size)
  * 1.08mA average at 7.5ms
  * 874µA average at 15ms
  * 770µA average at 30ms
  * 674µA average at 660ms

## nRF52820 blinky with encryption

- Calibrated RC Sleep Clock (500ppm / 1ms HFXO startup time) (21880 Bytes binary size)
  * 347µA average at 15ms
  * 217µA average at 30ms
  * 94µA average at 660ms

- Calibrated RC Sleep Clock (500ppm / 0.3ms HFXO startup time) (21880 Bytes binary size)
  * 316µA average at 15ms
  * 103µA average at 660ms





================================================
FILE: bluetoe/adv_service_list.hpp
================================================
#ifndef BLUETOE_ADV_SERVICE_LIST_HPP
#define BLUETOE_ADV_SERVICE_LIST_HPP

#include <bluetoe/codes.hpp>
#include <bluetoe/bits.hpp>
#include <bluetoe/meta_tools.hpp>
#include <bluetoe/service_uuid.hpp>
#include <bluetoe/meta_types.hpp>

#include <algorithm>

namespace bluetoe {

    namespace details {
        struct list_of_16_bit_service_uuids_tag {};
        struct list_of_128_bit_service_uuids_tag {};
    }

    /**
     * @brief complete / incomplete list of 16 bit service UUIDs to be added to the advertising data
     *
     * If there is enough room to add all given UUIDs to the advertising data, a complete list AD type
     * is added. If there is not enough room, the list will be incomplete. UUIDs from the beginning
     * of the list are added as long as there is room. If there is no room for a single UUID, no
     * advertising data is added.
     */
    template < typename ... UUID16 >
    struct list_of_16_bit_service_uuids {
        /** @cond HIDDEN_SYMBOLS */
        struct meta_type
            : details::list_of_16_bit_service_uuids_tag
            , details::valid_server_option_meta_type
        {};

        static std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* end )
        {
            const std::size_t buffer_size = end - begin;

            if ( buffer_size < 4 )
                return begin;

            const std::size_t max_uuids = std::min( (buffer_size - 2) / 2, sizeof ...(UUID16));

            *begin = 1 + 2 * max_uuids;
            ++begin;

            *begin = max_uuids == sizeof ...(UUID16)
                ? bits( details::gap_types::complete_service_uuids_16 )
                : bits( details::gap_types::incomplete_service_uuids_16 );
            ++begin;

            for ( std::size_t uuid = 0; uuid != max_uuids; ++uuid )
            {
                begin = details::write_16bit( begin, values_[ uuid ] );
            }

            return begin;
        }

        static constexpr std::uint16_t values_[ sizeof ...(UUID16) ] = { UUID16::as_16bit()...};
        /** @endcond */
    };

    /** @cond HIDDEN_SYMBOLS */
    template < typename ... UUID16 >
    constexpr std::uint16_t list_of_16_bit_service_uuids< UUID16... >::values_[ sizeof ...(UUID16) ];
    /** @endcond */

    /** @cond HIDDEN_SYMBOLS */
    template <>
    struct list_of_16_bit_service_uuids<> {
        struct meta_type
            : details::list_of_16_bit_service_uuids_tag
            , details::valid_server_option_meta_type
        {};

        static std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* )
        {
            return begin;
        }
    };

    template < typename ... UUID16 >
    struct list_of_16_bit_service_uuids< std::tuple< UUID16... > > : list_of_16_bit_service_uuids< UUID16... > {};
    /** @endcond */

    struct no_list_of_service_uuids {
        /** @cond HIDDEN_SYMBOLS */
        struct meta_type
            : details::list_of_16_bit_service_uuids_tag
            , details::list_of_128_bit_service_uuids_tag
            , details::valid_server_option_meta_type
        {};

        static constexpr std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* )
        {
            return begin;
        }
        /** @endcond */
    };

    namespace details {

        struct uuid_128_writer
        {
            constexpr uuid_128_writer( std::uint8_t*& b, std::uint8_t* e )
                : begin( b )
                , end( e )
            {
            }

            template< typename UUID >
            void each()
            {
                if ( begin + sizeof( UUID::bytes ) <= end )
                {
                    std::copy( std::begin( UUID::bytes ), std::end( UUID::bytes ), begin );
                    begin += sizeof( UUID::bytes );
                }
            }

            std::uint8_t*&      begin;
            std::uint8_t* const end;
        };
    }

    template < typename ... UUID128 >
    struct list_of_128_bit_service_uuids {
        /** @cond HIDDEN_SYMBOLS */
        struct meta_type :
            details::list_of_128_bit_service_uuids_tag,
            details::valid_server_option_meta_type {};

        static std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* end )
        {
            static constexpr std::size_t uuid_size = 16;
            const std::size_t buffer_size = end - begin;

            if ( buffer_size < 2 + uuid_size )
                return begin;

            const std::size_t max_uuids = std::min( (buffer_size - 2) / uuid_size, sizeof ...(UUID128));

            *begin = 1 + uuid_size * max_uuids;
            ++begin;

            *begin = max_uuids == sizeof ...(UUID128)
                ? bits( details::gap_types::complete_service_uuids_128 )
                : bits( details::gap_types::incomplete_service_uuids_128 );
            ++begin;

            details::for_< UUID128... >::each( details::uuid_128_writer( begin, end ) );

            return begin;
        }
        /** @endcond */
    };

    /** @cond HIDDEN_SYMBOLS */
    template < typename ... UUID16 >
    struct list_of_128_bit_service_uuids< std::tuple< UUID16... > > : list_of_128_bit_service_uuids< UUID16... > {};

    template <>
    struct list_of_128_bit_service_uuids<> {
        struct meta_type :
            details::list_of_128_bit_service_uuids_tag,
            details::valid_server_option_meta_type {};

        static constexpr std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* ) {
            return begin;
        }
    };
    /** @endcond */

    namespace details {
        template < typename T >
        struct extract_uuid {
            using type = typename T::uuid;
        };

        template < typename Filter, typename ... Services >
        struct create_list_of_service_uuids
        {
            typedef typename bluetoe::details::transform_list<
                std::tuple< Services... >,
                extract_uuid >::type uuids;

            typedef typename find_all_by_meta_type< Filter, uuids >::type type;
        };

        template < typename ServiceList >
        struct default_list_of_16_bit_service_uuids;

        template < typename ... Services >
        struct default_list_of_16_bit_service_uuids< std::tuple< Services... > > : list_of_16_bit_service_uuids<
            typename create_list_of_service_uuids< bluetoe::details::service_uuid_16_meta_type, Services... >::type > {};

        template < typename ServiceList >
        struct default_list_of_128_bit_service_uuids;

        template < typename ... Services >
        struct default_list_of_128_bit_service_uuids< std::tuple< Services... > > : list_of_128_bit_service_uuids<
            typename create_list_of_service_uuids< bluetoe::details::service_uuid_128_meta_type, Services... >::type > {};
    }
}

#endif


================================================
FILE: bluetoe/appearance.hpp
================================================
#ifndef BLUETOE_APPEARANCE_HPP
#define BLUETOE_APPEARANCE_HPP

#include <bluetoe/meta_types.hpp>

namespace bluetoe {

    namespace details {
        struct device_appearance_meta_type {};
        struct advertise_appearance_meta_type {};
    }

    /**
     * @brief type to keep a bluetoe::appearance value
     */
    template < std::uint16_t A >
    struct device_appearance
    {
        /** @cond HIDDEN_SYMBOLS */
        struct meta_type :
            details::device_appearance_meta_type,
            details::valid_server_option_meta_type {};

        static constexpr std::uint16_t                  value = A;
        /** @endcond */
    };

    /**
     * @brief enumeration of appearances (org.bluetooth.characteristic.gap.appearance)
     *
     * The class contains a lot of alias-declarations for known, assigned device appearances.
     * Pass one of the types to the server definition, to define the appearance to the GATT client.
     *
     * This will define, the GAP Appearance Characteristic value of the GAP service for GATT server.
     *
     * @sa advertise_appearance
     *
     * @code
    unsigned temperature_value = 0;

    typedef bluetoe::server<
        bluetoe::service<
            bluetoe::appearance::thermometer,
            bluetoe::advertise_appearance
            ...
        >
    > small_temperature_service;
     * @endcode
     * @sa server
     */
    struct appearance
    {
        /// Unknown
        using unknown                                 = device_appearance< 0x0000 >;
        /// Generic Phone
        using phone                                   = device_appearance< 0x0040 >;
        /// Generic Computer
        using computer                                = device_appearance< 0x0080 >;
        /// Generic Watch
        using watch                                   = device_appearance< 0x00c0 >;
        /// Watch: Sports Watch
        using sports_watch                            = device_appearance< 0x00c1 >;
        /// Generic Clock
        using clock                                   = device_appearance< 0x0100 >;
        /// Generic Display
        using display                                 = device_appearance< 0x0140 >;
        /// Generic Remote Control
        using remote_control                          = device_appearance< 0x0180 >;
        /// Generic Eye-glasses
        using eye_glasses                             = device_appearance< 0x01c0 >;
        /// Generic Tag
        using tag                                     = device_appearance< 0x0200 >;
        /// Generic Keyring
        using keyring                                 = device_appearance< 0x0240 >;
        /// Generic Media Player
        using media_player                            = device_appearance< 0x0280 >;
        /// Generic Barcode Scanner
        using barcode_scanner                         = device_appearance< 0x02c0 >;
        /// Generic Thermometer
        using thermometer                             = device_appearance< 0x0300 >;
        /// Thermometer: Ear
        using ear_thermometer                         = device_appearance< 0x0301 >;
        /// Generic Heart rate Sensor
        using heart_rate_sensor                       = device_appearance< 0x0340 >;
        /// Heart Rate Sensor: Heart Rate Belt
        using heart_rate_belt                         = device_appearance< 0x0341 >;
        /// Generic Blood Pressure
        using blood_pressure                          = device_appearance< 0x0380 >;
        /// Blood Pressure: Arm
        using blood_pressure_arm                      = device_appearance< 0x0381 >;
        /// Blood Pressure: Wrist
        using blood_pressure_wrist                    = device_appearance< 0x0382 >;
        /// Human Interface Device (HID)
        using human_interface_device                  = device_appearance< 0x03c0 >;
        /// Keyboard (HID subtype)
        using keyboard                                = device_appearance< 0x03c1 >;
        /// Mouse (HID subtype)
        using mouse                                   = device_appearance< 0x03c2 >;
        /// Joystick (HID subtype)
        using joystick                                = device_appearance< 0x03c3 >;
        /// Gamepad (HID subtype)
        using gamepad                                 = device_appearance< 0x03c4 >;
        /// Digitizer Tablet (HID subtype)
        using digitizer_tablet                        = device_appearance< 0x03c5 >;
        /// Card Reader (HID subtype)
        using card_reader                             = device_appearance< 0x03c6 >;
        /// Digital Pen (HID subtype)
        using digital_pen                             = device_appearance< 0x03c7 >;
        /// Barcode Scanner (HID subtype)
        using hid_barcode_scanner                     = device_appearance< 0x03c8 >;
        /// Generic Glucose Meter
        using glucose_meter                           = device_appearance< 0x0400 >;
        /// Generic: Running Walking Sensor
        using running_walking_sensor                  = device_appearance< 0x0440 >;
        /// Running Walking Sensor: In-Shoe
        using in_shoe_running_walking_sensor          = device_appearance< 0x0441 >;
        /// Running Walking Sensor: On-Shoe
        using on_shoe_running_walking_sensor          = device_appearance< 0x0442 >;
        /// Running Walking Sensor: On-Hip
        using on_hip_running_walking_sensor           = device_appearance< 0x0443 >;
        /// Generic: Cycling
        using cycling                                 = device_appearance< 0x0480 >;
        /// Cycling: Cycling Computer
        using cycling_computer                        = device_appearance< 0x0481 >;
        /// Cycling: Speed Sensor
        using cycling_speed_sensor                    = device_appearance< 0x0482 >;
        /// Cycling: Cadence Sensor
        using cycling_cadence_sensor                  = device_appearance< 0x0483 >;
        /// Cycling: Power Sensor
        using cycling_power_sensor                    = device_appearance< 0x0484 >;
        /// Cycling: Speed and Cadence Sensor
        using cycling_speed_and_cadence_sensor        = device_appearance< 0x0485 >;
        /// Generic: Pulse Oximeter
        using pulse_oximeter                          = device_appearance< 0x0c40 >;
        /// Fingertip (Pulse Oximeter)
        using fingertip_pulse_oximeter                = device_appearance< 0x0c41 >;
        /// Wrist Worn (Pulse Oximeter)
        using wrist_worn_pulse_oximeter               = device_appearance< 0x0c42 >;
        /// Generic: Weight Scale
        using weight_scale                            = device_appearance< 0x0c80 >;
        /// Generic: Outdoor Sports Activity
        using outdoor_sports_activity                 = device_appearance< 0x1440 >;
        /// Location Display Device
        using location_display_device                 = device_appearance< 0x1441 >;
        /// Location and Navigation Display Device
        using location_and_navigation_display_device  = device_appearance< 0x1442 >;
        /// Location Pod
        using location_pod                            = device_appearance< 0x1443 >;
        /// Location and Navigation Pod
        using location_and_navigation_pod             = device_appearance< 0x1444 >;
    };

    /**
     * @brief add the appearance of the device to the advertising data
     *
     * If no advertising is configured, `unknown` appearance is advertised.
     *
     * @sa device_appearance
     */
    struct advertise_appearance
    {
        /** @cond HIDDEN_SYMBOLS */
        struct meta_type :
            details::advertise_appearance_meta_type,
            details::valid_server_option_meta_type {};

        template < typename Adv >
        static std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* end )
        {
            static constexpr std::size_t adv_data_size = 4u;

            if ( std::size_t(end - begin) >= adv_data_size )
            {
                *begin = static_cast< std::uint8_t >( adv_data_size - 1 );
                ++begin;
                *begin = bits( details::gap_types::appearance );
                ++begin;
                begin = details::write_16bit( begin, Adv::value );
            }

            return begin;
        }
        /** @endcond */
    };

    /** @cond HIDDEN_SYMBOLS */
    // the default to use
    struct no_advertise_appearance
    {
        struct meta_type :
            details::advertise_appearance_meta_type,
            details::valid_server_option_meta_type {};

        template < typename >
        static std::uint8_t* advertising_data( std::uint8_t* begin, std::uint8_t* )
        {
            return begin;
        }
    };
    /** @endcond */
}

#endif // include guard


================================================
FILE: bluetoe/attribute_generator.hpp
================================================
#ifndef BLUETOE_ATTRIBUTE_GENERATOR_HPP
#define BLUETOE_ATTRIBUTE_GENERATOR_HPP

#include <tuple>
#include <bluetoe/meta_tools.hpp>

namespace bluetoe {
namespace details {

    /** @cond HIDDEN_SYMBOLS */

    /**
     *
     */
    template < typename, typename, std::size_t, typename, typename, typename ... Options >
    struct generate_attribute;

    /**
     * generate a const static array of attributes out of a list of tuples, containing the parameter to generate an attribute
     *
     *  Attributes: A std::tuple, containing a tuple for every attribute to generate.
     *
     *  ClientCharacteristicIndex: The index of the characteristic to be generate in the containing service
     *
     *  Options: All options that where given to the characteristic
     */
    template < typename Attributes, typename CCCDIndices, std::size_t ClientCharacteristicIndex, typename Service, typename Server, typename ... Options >
    struct generate_attribute_list;

    template < typename CCCDIndices,std::size_t ClientCharacteristicIndex, typename Service, typename Server, typename ... Options >
    struct generate_attribute_list< std::tuple<>, CCCDIndices, ClientCharacteristicIndex, Service, Server, std::tuple< Options... > >
    {
        static const attribute attribute_at( std::size_t )
        {
            assert( !"should not happen" );
            return attribute();
        }
    };

    template < typename ... Attributes, typename ... CCCDIndices, std::size_t ClientCharacteristicIndex, typename Service, typename Server, typename ... Options >
    struct generate_attribute_list< std::tuple< Attributes... >, std::tuple< CCCDIndices... >, ClientCharacteristicIndex, Service, Server, std::tuple< Options... > >
    {
        static const attribute attribute_at( std::size_t index )
        {
            return attributes[ index ];
        }

        static const attribute attributes[ sizeof ...(Attributes) ];
    };

    template < typename ... Attributes, typename ... CCCDIndices, std::size_t ClientCharacteristicIndex, typename Service, typename Server, typename ... Options >
    const attribute generate_attribute_list< std::tuple< Attributes... >, std::tuple< CCCDIndices... >, ClientCharacteristicIndex, Service, Server, std::tuple< Options... > >::attributes[ sizeof ...(Attributes) ] =
    {
        generate_attribute< Attributes, std::tuple< CCCDIndices... >, ClientCharacteristicIndex, Service, Server, Options... >::attr...
    };

    template < typename OptionsList, typename MetaTypeList, typename OptionsDefault = std::tuple<> >
    struct count_attributes;

    template < typename OptionsList, typename ... MetaTypes, typename OptionsDefault >
    struct count_attributes< OptionsList, std::tuple< MetaTypes... >, OptionsDefault >
    {
        using attribute_generation_parameters = typename group_by_meta_types_without_empty_groups<
            typename add_type< OptionsList, OptionsDefault >::type,
            MetaTypes...
        >::type;

        enum { number_of_attributes = std::tuple_size< attribute_generation_parameters >::value };
    };

    template < typename OptionsList, typename MetaTypeList, typename CCCDIndices, typename OptionsDefault = std::tuple<> >
    struct generate_attributes;

    template < typename OptionsList, typename ... MetaTypes, typename CCCDIndices, typename OptionsDefault >
    struct generate_attributes< OptionsList, std::tuple< MetaTypes... >, CCCDIndices, OptionsDefault >
        : count_attributes< OptionsList, std::tuple< MetaTypes... >, OptionsDefault >
    {
        using attribute_generation_parameters = typename group_by_meta_types_without_empty_groups<
            typename add_type< OptionsList, OptionsDefault >::type,
            MetaTypes...
        >::type;

        attribute_generation_parameters get_attribute_generation_parameters() { return attribute_generation_parameters(); }

        template < std::size_t ClientCharacteristicIndex, typename Service, typename Server >
        static const attribute attribute_at( std::size_t index )
        {
            return generate_attribute_list<
                attribute_generation_parameters,
                CCCDIndices,
                ClientCharacteristicIndex,
                Service,
                Server,
                OptionsList
            >::attribute_at( index );
        }
    };

    /** @endcond */
}
}

#endif // include guard


================================================
FILE: bluetoe/attribute_handle.hpp
================================================
#ifndef BLUETOE_ATTRIBUTE_HANDLE_HPP
#define BLUETOE_ATTRIBUTE_HANDLE_HPP

#include <bluetoe/meta_types.hpp>
#include <bluetoe/meta_tools.hpp>

#include <cstdint>
#include <cstdlib>
#include <cassert>
#include <algorithm>

namespace bluetoe {

    namespace details {
        struct attribute_handle_meta_type {};
        struct attribute_handles_meta_type {};
    }

    /**
     * @brief define the first attribute handle used by a characteristic or service
     *
     * If this option is given to a service, the service attribute will be assigned
     * to the given handle value. For a characteristic, the Characteristic Declaration
     * attribute will be assigned to the given handle value.
     *
     * All following attrbutes are assigned handles with a larger value.
     *
     * @sa attribute_handles
     * @sa service
     * @sa characteristic
     */
    template < std::uint16_t AttributeHandleValue >
    struct attribute_handle
    {
        /** @cond HIDDEN_SYMBOLS */
        static constexpr std::uint16_t attribute_handle_value = AttributeHandleValue;

        struct meta_type :
            details::attribute_handle_meta_type,
            details::valid_service_option_meta_type,
            details::valid_characteristic_option_meta_type {};
        /** @endcond */
    };

    /**
     * @brief define the attributes handles for the characteristic declaration, characteristic
     *        value and optional, for a Client Characteristic Configuration descriptor.
     *
     * If the characteristic has no Client Characteristic Configuration descriptor, the CCCD
     * parameter has to be 0. Value has to be larger than Declaration and CCCD has to larger
     * than Value (or 0).
     *
     * @sa attribute_handle
     * @sa characteristic
     */
    template < std::uint16_t Declaration, std::uint16_t Value, std::uint16_t CCCD = 0x0000 >
    struct attribute_handles
    {
        /** @cond HIDDEN_SYMBOLS */
        static constexpr std::uint16_t declaration_handle = Declaration;
        static constexpr std::uint16_t value_handle       = Value;
        static constexpr std::uint16_t cccd_handle        = CCCD;

        static_assert( value_handle > declaration_handle, "value handle has to be larger than declaration handle" );
        static_assert( cccd_handle > declaration_handle || cccd_handle == 0, "CCCD handle has to be larger than declaration handle" );
        static_assert( cccd_handle > value_handle || cccd_handle == 0, "CCCD handle has to be larger than value handle" );

        struct meta_type :
            details::attribute_handles_meta_type,
            details::valid_characteristic_option_meta_type {};
        /** @endcond */
    };

    template < typename ... Options >
    class server;

    template < typename ... Options >
    class service;

    template < typename ... Options >
    class characteristic;

    namespace details {

        static constexpr std::uint16_t invalid_attribute_handle = 0;
        static constexpr std::size_t   invalid_attribute_index  = ~0;

        /*
         * select one of attribute_handle< H > or attribute_handle< H, B, C >
         */
        template < std::uint16_t Default, class, class >
        struct select_attribute_handles
        {
            static constexpr std::uint16_t declaration_handle = Default;
            static constexpr std::uint16_t value_handle       = Default + 1;
            static constexpr std::uint16_t cccd_handle        = Default + 2;
        };

        template < std::uint16_t Default, std::uint16_t AttributeHandleValue, typename T >
        struct select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, T >
        {
            static constexpr std::uint16_t declaration_handle = AttributeHandleValue;
            static constexpr std::uint16_t value_handle       = AttributeHandleValue + 1;
            static constexpr std::uint16_t cccd_handle        = AttributeHandleValue + 2;
        };

        template < std::uint16_t Default, typename T, std::uint16_t Declaration, std::uint16_t Value, std::uint16_t CCCD >
        struct select_attribute_handles< Default, T, attribute_handles< Declaration, Value, CCCD > >
        {
            static constexpr std::uint16_t declaration_handle = Declaration;
            static constexpr std::uint16_t value_handle       = Value;
            static constexpr std::uint16_t cccd_handle        = CCCD == 0 ? Value + 1 : CCCD;
        };

        template < std::uint16_t Default, std::uint16_t AttributeHandleValue, std::uint16_t Declaration, std::uint16_t Value, std::uint16_t CCCD >
        struct select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, attribute_handles< Declaration, Value, CCCD > >
        {
            static_assert( Declaration == Value, "either attribute_handle<> or attribute_handles<> can be used as characteristic<> option, not both." );
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ... Options >
        struct characteristic_index_mapping
        {
            using characteristic_t = ::bluetoe::characteristic< Options... >;

            using attribute_handles_t = select_attribute_handles< StartHandle,
                typename find_by_meta_type< attribute_handle_meta_type, Options... >::type,
                typename find_by_meta_type< attribute_handles_meta_type, Options... >::type
            >;

            static_assert( attribute_handles_t::declaration_handle >= StartHandle, "attribute_handle<> can only be used to create increasing attribute handles." );

            static constexpr std::uint16_t end_handle   = characteristic_t::number_of_attributes == 2
                ? attribute_handles_t::value_handle + 1
                : attribute_handles_t::cccd_handle + ( characteristic_t::number_of_attributes - 2 );
            static constexpr std::uint16_t end_index    = StartIndex + characteristic_t::number_of_attributes;

            static constexpr std::size_t declaration_position = 0;
            static constexpr std::size_t value_position       = 1;
            static constexpr std::size_t cccd_position        = 2;

            static std::uint16_t characteristic_attribute_handle_by_index( std::size_t index )
            {
                const std::size_t relative_index = index - StartIndex;

                assert( relative_index < characteristic_t::number_of_attributes );

                switch ( relative_index )
                {
                    case declaration_position:
                        return attribute_handles_t::declaration_handle;
                        break;

                    case value_position:
                        return attribute_handles_t::value_handle;
                        break;

                    case cccd_position:
                        return attribute_handles_t::cccd_handle;
                        break;
                }

                return relative_index - cccd_position + attribute_handles_t::cccd_handle;
            }

            static std::size_t characteristic_attribute_index_by_handle( std::uint16_t handle )
            {
                if ( handle <= attribute_handles_t::declaration_handle )
                    return StartIndex + declaration_position;

                if ( handle <= attribute_handles_t::value_handle )
                    return StartIndex + value_position;

                if ( handle <= attribute_handles_t::cccd_handle )
                    return StartIndex + cccd_position;

                return StartIndex + cccd_position + handle - attribute_handles_t::cccd_handle;
            }
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename CharacteristicList >
        struct interate_characteristic_index_mappings;

        template < std::uint16_t StartHandle, std::uint16_t StartIndex >
        struct interate_characteristic_index_mappings< StartHandle, StartIndex, std::tuple<> >
        {
            static std::uint16_t attribute_handle_by_index( std::size_t )
            {
                return invalid_attribute_handle;
            }

            static std::size_t attribute_index_by_handle( std::uint16_t )
            {
                return invalid_attribute_index;
            }

            static constexpr std::uint16_t last_characteristic_end_handle = StartHandle;
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename Characteristics, typename ... Options >
        using next_characteristic_mapping = interate_characteristic_index_mappings<
            characteristic_index_mapping< StartHandle, StartIndex, Options... >::end_handle,
            characteristic_index_mapping< StartHandle, StartIndex, Options... >::end_index,
            Characteristics
        >;

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ...Options, typename ... Chars >
        struct interate_characteristic_index_mappings< StartHandle, StartIndex, std::tuple< ::bluetoe::characteristic< Options... >, Chars... > >
            : characteristic_index_mapping< StartHandle, StartIndex, Options... >
            , next_characteristic_mapping< StartHandle, StartIndex, std::tuple< Chars... >, Options... >
        {
            static constexpr std::uint16_t last_characteristic_end_handle =
                next_characteristic_mapping< StartHandle, StartIndex, std::tuple< Chars... >, Options... >::last_characteristic_end_handle;

            using next = characteristic_index_mapping< StartHandle, StartIndex, Options... >;

            static std::uint16_t attribute_handle_by_index( std::size_t index )
            {
                if ( index < next::end_index )
                    return next::characteristic_attribute_handle_by_index( index );

                return next_characteristic_mapping< StartHandle, StartIndex, std::tuple< Chars... >, Options... >::attribute_handle_by_index( index );
            }

            static std::size_t attribute_index_by_handle( std::uint16_t handle )
            {
                if ( handle < next::end_handle )
                    return next::characteristic_attribute_index_by_handle( handle );

                return next_characteristic_mapping< StartHandle, StartIndex, std::tuple< Chars... >, Options... >::attribute_index_by_handle( handle );
            }
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ... Options >
        struct service_start_handle
        {
            using start_handle_t = typename find_by_meta_type< attribute_handle_meta_type, Options..., attribute_handle< StartHandle > >::type;

            static constexpr std::uint16_t value = start_handle_t::attribute_handle_value;
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ... Options >
        using next_char_mapping = interate_characteristic_index_mappings<
                service_start_handle< StartHandle, StartIndex, Options... >::value + 1, StartIndex + 1,
                typename find_all_by_meta_type< characteristic_meta_type, Options... >::type >;

        /*
         * Map index to handle within a single service
         */
        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ... Options >
        struct service_index_mapping
            : next_char_mapping< StartHandle, StartIndex, Options... >
        {
            using service_t = ::bluetoe::service< Options... >;

            static constexpr std::uint16_t service_handle = service_start_handle< StartHandle, StartIndex, Options... >::value;

            static_assert( service_handle >= StartHandle, "attribute_handle<> can only be used to create increasing attribute handles." );

            static constexpr std::uint16_t end_handle   = next_char_mapping< StartHandle, StartIndex, Options... >::last_characteristic_end_handle;
            static constexpr std::uint16_t end_index    = StartIndex + service_t::number_of_attributes;

            static std::uint16_t characteristic_handle_by_index( std::size_t index )
            {
                if ( index == StartIndex )
                    return service_handle;

                return next_char_mapping< StartHandle, StartIndex, Options... >::attribute_handle_by_index( index );
            }

            static std::size_t characteristic_first_index_by_handle( std::uint16_t handle )
            {
                if ( handle <= service_handle )
                    return StartIndex;

                return next_char_mapping< StartHandle, StartIndex, Options... >::attribute_index_by_handle( handle );
            }
        };

        /*
         * Iterate over all services in a server
         */
        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename OptionTuple >
        struct interate_service_index_mappings;

        template < std::uint16_t StartHandle, std::uint16_t StartIndex >
        struct interate_service_index_mappings< StartHandle, StartIndex, std::tuple<> >
        {
            static std::uint16_t service_handle_by_index( std::size_t )
            {
                return invalid_attribute_handle;
            }

            static std::size_t service_first_index_by_handle( std::uint16_t )
            {
                return invalid_attribute_index;
            }
        };

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename Services, typename ... Options >
        using next_service_mapping = interate_service_index_mappings<
            service_index_mapping< StartHandle, StartIndex, Options... >::end_handle,
            service_index_mapping< StartHandle, StartIndex, Options... >::end_index,
            Services
        >;

        template < std::uint16_t StartHandle, std::uint16_t StartIndex, typename ... Options, typename ... Services >
        struct interate_service_index_mappings< StartHandle, StartIndex, std::tuple< ::bluetoe::service< Options... >, Services... > >
            : service_index_mapping< StartHandle, StartIndex, Options... >
            , next_service_mapping< StartHandle, StartIndex, std::tuple< Services... >, Options... >
        {
            static std::uint16_t service_handle_by_index( std::size_t index )
            {
                if ( index < service_index_mapping< StartHandle, StartIndex, Options... >::end_index )
                    return service_index_mapping< StartHandle, StartIndex, Options... >::characteristic_handle_by_index( index );

                return next_service_mapping< StartHandle, StartIndex, std::tuple< Services... >, Options... >::service_handle_by_index( index );
            }

            static std::size_t service_first_index_by_handle( std::uint16_t handle )
            {
                if ( handle < service_index_mapping< StartHandle, StartIndex, Options... >::end_handle )
                    return service_index_mapping< StartHandle, StartIndex, Options... >::characteristic_first_index_by_handle( handle );

                return next_service_mapping< StartHandle, StartIndex, std::tuple< Services... >, Options... >::service_first_index_by_handle( handle );
            }
        };

        /*
         * Interface, providing function to map from 0-based attribute index to ATT attribute handle and vice versa
         *
         * An attribute index is a 0-based into an array of all attributes contained in a server. Accessing the
         * attribute by table is very fast. If neither attribute_handle<> or attribute_handles<> is used, the mapping
         * is trivial and an index I is mapped to a handle I + 1.
         */
        template < typename Server >
        struct handle_index_mapping;

        template < typename ... Options >
        struct handle_index_mapping< ::bluetoe::server< Options... > >
            : private interate_service_index_mappings< 1u, 0u, typename ::bluetoe::server< Options... >::services >
        {
            static constexpr std::size_t   invalid_attribute_index  = ::bluetoe::details::invalid_attribute_index;
            static constexpr std::uint16_t invalid_attribute_handle = ::bluetoe::details::invalid_attribute_handle;

            using iterator = interate_service_index_mappings< 1u, 0u, typename ::bluetoe::server< Options... >::services >;

            static std::uint16_t handle_by_index( std::size_t index )
            {
                return iterator::service_handle_by_index( index );
            }

            /**
             * @brief attribute index for a given handle
             *
             * Returns the index to the attribute with the lowest handle that is
             * equal or larger than the given handle.
             */
            static std::size_t first_index_by_handle( std::uint16_t handle )
            {
                return iterator::service_first_index_by_handle( handle );
            }

            static std::size_t index_by_handle( std::uint16_t handle )
            {
                std::size_t result = first_index_by_handle( handle );
                if ( result != invalid_attribute_index && handle_by_index( result ) != handle )
                    result = invalid_attribute_index;

                return result;
            }
        };

    }
}

#endif



================================================
FILE: bluetoe/bindings/CMakeLists.txt
================================================
add_subdirectory(nordic)

================================================
FILE: bluetoe/bindings/hci/include_libusb/bluetoe/device.hpp
================================================
#ifndef BLUETOE_BINDINGS_HCI_DEVICE_HPP
#define BLUETOE_BINDINGS_HCI_DEVICE_HPP

#include <bluetoe/link_layer.hpp>
#include <bluetoe/libsub.hpp>

namespace bluetoe
{
    template < class Server, typename ... Options >
    using device = bluetoe::hci::link_layer< Server, hci_details::libsub_transport, Options... >;
}

#endif



================================================
FILE: bluetoe/bindings/hci/include_libusb/bluetoe/libsub.hpp
================================================
#ifndef BLUETOE_BINDINGS_HCI_LIBUSB_HPP
#define BLUETOE_BINDINGS_HCI_LIBUSB_HPP

namespace bluetoe {

    namespace hci_details {
        template < typename LinkLayer >
        class libsub_transport {

        };
    }
}

#endif


================================================
FILE: bluetoe/bindings/nordic/CMakeLists.txt
================================================
add_library(bluetoe_bindings_nordic INTERFACE EXCLUDE_FROM_ALL)
add_library(bluetoe::bindings::nordic ALIAS bluetoe_bindings_nordic)

target_include_directories(bluetoe_bindings_nordic INTERFACE include)
target_link_libraries(bluetoe_bindings_nordic
    INTERFACE
        toolchain::${BINDING})

add_subdirectory(uECC)
add_subdirectory(nrf51)
add_subdirectory(nrf52)



================================================
FILE: bluetoe/bindings/nordic/include/bluetoe/nrf.hpp
================================================
#ifndef BLUETOE_BINDINGS_NRF_HPP
#define BLUETOE_BINDINGS_NRF_HPP

#include <bluetoe/meta_types.hpp>
#include <bluetoe/default_pdu_layout.hpp>

#include <nrf.h>

namespace bluetoe
{
    namespace nrf52_details {
        void gpio_debug_hfxo_stopped();
        void init_calibration_timer();
        void deassign_hfxo();
    }

    /**
     * @brief namespace with nRF51/52 specific configuration options
     */
    namespace nrf
    {
        /*
         * Some aliases that can be used in the debugger
         */
        static NRF_RADIO_Type* const        nrf_radio            = NRF_RADIO;
        static NRF_TIMER_Type* const        nrf_timer            = NRF_TIMER0;
        static NRF_TIMER_Type* const        nrf_cb_timer         = NRF_TIMER1;
        static NRF_CLOCK_Type* const        nrf_clock            = NRF_CLOCK;
        static NRF_TEMP_Type* const         nrf_temp             = NRF_TEMP;
        static NRF_RTC_Type* const          nrf_rtc              = NRF_RTC0;
        static NRF_CCM_Type* const          nrf_ccm              = NRF_CCM;
        static NRF_AAR_Type* const          nrf_aar              = NRF_AAR;
        static NRF_PPI_Type* const          nrf_ppi              = NRF_PPI;
        static NRF_RNG_Type* const          nrf_random           = NRF_RNG;
        static NRF_ECB_Type* const          nrf_aes              = NRF_ECB;
        static NRF_GPIOTE_Type* const       nrf_gpiote           = NRF_GPIOTE;
        static NVIC_Type* const             nvic                 = NVIC;

        static constexpr auto lfxo_clk_freq = 32768;

        /*
         * Interrupt priorities
         */
        static constexpr uint32_t nrf_interrupt_prio_ble = 0;
        static constexpr uint32_t nrf_interrupt_prio_user_cb = 1 << ( __NVIC_PRIO_BITS - 1 );
        static constexpr uint32_t nrf_interrupt_prio_calibrate_rtc = nrf_interrupt_prio_user_cb - 1;

        namespace nrf_details {
            struct radio_option_meta_type : ::bluetoe::details::binding_option_meta_type {};
            struct sleep_clock_source_meta_type : radio_option_meta_type {};
            struct hfxo_startup_time_meta_type : radio_option_meta_type {};
            struct leave_run_on_interrupt_type : radio_option_meta_type {};

            static void start_high_frequency_clock()
            {
                // This tasks starts the high frequency crystal oscillator (HFXO)
                nrf_clock->TASKS_HFCLKSTART = 1;

                // TODO: do not wait busy
                // Issue: do not poll for readiness of the high frequency clock #63
                while ( !nrf_clock->EVENTS_HFCLKSTARTED )
                    ;

                nrf_clock->EVENTS_HFCLKSTARTED = 0;
            }

            inline void start_lfclock_and_rtc()
            {
                nrf_clock->EVENTS_LFCLKSTARTED = 0;
                nrf_clock->TASKS_LFCLKSTART = 1;

                while ( nrf_clock->EVENTS_LFCLKSTARTED == 0 )
                    ;

                // https://infocenter.nordicsemi.com/topic/errata_nRF52840_Rev3/ERR/nRF52840/Rev3/latest/anomaly_840_20.html#anomaly_840_20
                nrf_rtc->TASKS_STOP = 0;
                nrf_rtc->TASKS_START = 1;

                // Configure the RTC to generate these two events
                // Overflow flag does not harm the power performance much and is used for
                // debugging.
                nrf_rtc->EVTEN =
                    ( RTC_EVTEN_COMPARE0_Enabled << RTC_EVTEN_COMPARE0_Pos )
                  | ( RTC_EVTEN_COMPARE1_Enabled << RTC_EVTEN_COMPARE1_Pos )
                  | ( RTC_EVTEN_OVRFLW_Enabled << RTC_EVTEN_OVRFLW_Pos );
            }
        }

        /**
         * @brief configure the low frequency clock to be sourced out of the high frequency clock
         *
         * The resulting sleep clock accurary is then the accuarcy of your high frequency clock source.
         *
         * @sa bluetoe::link_layer::sleep_clock_accuracy_ppm
         * @sa bluetoe::nrf::sleep_clock_crystal_oscillator
         * @sa bluetoe::nrf::calibrated_rc_sleep_clock
         */
        struct synthesized_sleep_clock
        {
            /** @cond HIDDEN_SYMBOLS */
            using meta_type = nrf_details::sleep_clock_source_meta_type;

            static void start_clocks()
            {
                nrf_details::start_high_frequency_clock();

                nrf_clock->LFCLKSRC = CLOCK_LFCLKSRCCOPY_SRC_Synth << CLOCK_LFCLKSRCCOPY_SRC_Pos;
                nrf_details::start_lfclock_and_rtc();
            }

            static void stop_high_frequency_crystal_oscilator()
            {
            }
            /** @endcond */
        };

        /**
         * @brief configure the low frequency clock to be sourced from a crystal oscilator
         *
         * @sa bluetoe::link_layer::sleep_clock_accuracy_ppm
         * @sa bluetoe::nrf::synthesized_sleep_clock
         * @sa bluetoe::nrf::calibrated_rc_sleep_clock
         */
        struct sleep_clock_crystal_oscillator
        {
            /** @cond HIDDEN_SYMBOLS */
            using meta_type = nrf_details::sleep_clock_source_meta_type;

            static void start_clocks()
            {
                nrf_details::start_high_frequency_clock();

                nrf_clock->LFCLKSRC = CLOCK_LFCLKSRCCOPY_SRC_Xtal << CLOCK_LFCLKSRCCOPY_SRC_Pos;
                nrf_details::start_lfclock_and_rtc();
            }

            static void stop_high_frequency_crystal_oscilator()
            {
                nrf_clock->TASKS_HFCLKSTOP = 1;

#               if defined BLUETOE_NRF52_RADIO_DEBUG
                    bluetoe::nrf52_details::gpio_debug_hfxo_stopped();
#               endif

            }
            /** @endcond */
        };

        /**
         * @brief configure the low frequency clock to run from the RC oscilator.
         *
         * That low frequency RC oscilator will be calibrated by the high frequency
         * crystal oscilator periodically.
         *
         * According to the datasheet, the resulting sleep clock accuarcy is then 500ppm.
         * If no sleep clock configuration is given, this is the default.
         *
         * @sa bluetoe::link_layer::sleep_clock_accuracy_ppm
         * @sa bluetoe::nrf::synthesized_sleep_clock
         * @sa bluetoe::nrf::sleep_clock_crystal_oscillator
         */
        struct calibrated_rc_sleep_clock
        {
            /** @cond HIDDEN_SYMBOLS */
            using meta_type = nrf_details::sleep_clock_source_meta_type;

            static void start_clocks()
            {
                nrf_details::start_high_frequency_clock();

                nrf_clock->LFCLKSRC = CLOCK_LFCLKSRCCOPY_SRC_RC << CLOCK_LFCLKSRCCOPY_SRC_Pos;
                nrf_details::start_lfclock_and_rtc();
                nrf52_details::init_calibration_timer();
            }

            static void stop_high_frequency_crystal_oscilator()
            {
                nrf52_details::deassign_hfxo();
            }
            /** @endcond */
        };

        /**
         * @brief configure the high frequency crystal oscillator startup time
         *
         * Unless bluetoe::nrf::synthesized_sleep_clock is used as the sleep clock
         * source, the nRF52 binding is switching on and off the high frequency clock
         * oscillator to save power. It's important that this parameter is in configured
         * to meet the real hardwares startup time to have the best power perfomance
         * _and_ a stable connection.
         *
         * The given value in µs is roundet up to the next full period of the low frequency
         * clock (30.52µs).
         *
         * If this configuration value is not given, 300µs (bluetoe::nrf::high_frequency_crystal_oscillator_startup_time_default)
         * is used as the default.
         *
         * @sa bluetoe::nrf::sleep_clock_crystal_oscillator
         * @sa bluetoe::nrf::calibrated_rc_sleep_clock
         */
        template < unsigned StartupTimeMicroSeconds >
        struct high_frequency_crystal_oscillator_startup_time
        {
            /** @cond HIDDEN_SYMBOLS */
            using meta_type = nrf_details::hfxo_startup_time_meta_type;

            static constexpr unsigned value = StartupTimeMicroSeconds;
            /** @endcond */
        };

        /**
         * @brief default value for the high frequency crystal oscillator startup time
         *
         * @sa bluetoe::nrf::high_frequency_crystal_oscillator_startup_time
         */
        using high_frequency_crystal_oscillator_startup_time_default = high_frequency_crystal_oscillator_startup_time< 300 >;

        /**
         * @brief configures the radio::run() function to return on every interrupt
         *
         * Usually, run() will return on a call to radio::wake(). With this option, run()
         * will only block for a single call to the WFI ARM assembler instruction. Once that
         * instruction returns, the function will be left.
         */
        struct leave_run_on_interrupt {
            /** @cond HIDDEN_SYMBOLS */
            using meta_type = nrf_details::leave_run_on_interrupt_type;
            /** @endcond */
        };
    }

    namespace nrf_details
    {
        struct encrypted_pdu_layout : bluetoe::link_layer::details::layout_base< encrypted_pdu_layout >
        {
            /** @cond HIDDEN_SYMBOLS */
            static constexpr std::size_t header_size = sizeof( std::uint16_t );

            using bluetoe::link_layer::details::layout_base< encrypted_pdu_layout >::header;

            static std::uint16_t header( const std::uint8_t* pdu )
            {
                return ::bluetoe::details::read_16bit( pdu );
            }

            static void header( std::uint8_t* pdu, std::uint16_t header_value )
            {
                ::bluetoe::details::write_16bit( pdu, header_value );
            }

            static std::pair< std::uint8_t*, std::uint8_t* > body( const link_layer::read_buffer& pdu )
            {
                assert( pdu.size >= header_size );

                return { &pdu.buffer[ header_size + 1 ], &pdu.buffer[ pdu.size ] };
            }

            static std::pair< const std::uint8_t*, const std::uint8_t* > body( const link_layer::write_buffer& pdu )
            {
                assert( pdu.size >= header_size );

                return { &pdu.buffer[ header_size + 1 ], &pdu.buffer[ pdu.size ] };
            }

            static constexpr std::size_t data_channel_pdu_memory_size( std::size_t payload_size )
            {
                return header_size + payload_size + 1;
            }
            /** @endcond */
        };
    }
}

#endif



================================================
FILE: bluetoe/bindings/nordic/nrf51/CMakeLists.txt
================================================
add_library(bluetoe_bindings_nrf51 STATIC EXCLUDE_FROM_ALL
            nrf51.cpp)
add_library(bluetoe::bindings::nrf51 ALIAS bluetoe_bindings_nrf51)

target_include_directories(bluetoe_bindings_nrf51 PUBLIC include)

target_link_libraries(bluetoe_bindings_nrf51
    PUBLIC
        bluetoe::utility
        bluetoe::sm
        bluetoe::iface
        bluetoe::link_layer
        bluetoe::bindings::nordic
    PRIVATE
        bluetoe::bindings::nrf::uecc
        toolchain::${BINDING}
)

target_compile_features(bluetoe_bindings_nrf51 PRIVATE cxx_std_11)
target_compile_options(bluetoe_bindings_nrf51 PRIVATE -Wall -pedantic -Wextra -Wfatal-errors -Wno-parentheses)


================================================
FILE: bluetoe/bindings/nordic/nrf51/include/bluetoe/device.hpp
================================================
#ifndef BLUETOE_DEVICE_HPP
#define BLUETOE_DEVICE_HPP

#include <bluetoe/nrf51.hpp>

namespace bluetoe
{
    template < class Server, typename ... Options >
    using device = link_layer::link_layer<
        Server,
        nrf51_details::template scheduled_radio_factory<
            nrf51_details::scheduled_radio_base_with_encryption< Options... >
        >::template scheduled_radio,
        Options...
    >;
}

#endif //BLUETOE_DEVICE_HPP


================================================
FILE: bluetoe/bindings/nordic/nrf51/include/bluetoe/nrf51.hpp
================================================
#ifndef BLUETOE_BINDINGS_NRF51_HPP
#define BLUETOE_BINDINGS_NRF51_HPP

#include <bluetoe/link_layer.hpp>
#include <bluetoe/ll_data_pdu_buffer.hpp>
#include <bluetoe/nrf.hpp>
#include <cstdint>

extern "C" void RADIO_IRQHandler(void);
extern "C" void TIMER0_IRQHandler(void);

namespace bluetoe
{
    namespace nrf51_details
    {
        /* Counter used for CCM */
        struct counter {
            std::uint32_t   low;
            std::uint8_t    high;

            // set to zero
            counter();

            void increment();
            void copy_to( std::uint8_t* target ) const;
        };

        // map compile time callbacks to runtime callbacks for faster development cycles.
        class adv_callbacks
        {
        public:
            virtual void adv_received( const link_layer::read_buffer& receive ) = 0;
            virtual void adv_timeout() = 0;
            virtual void timeout() = 0;
            virtual void end_event() = 0;

            virtual link_layer::write_buffer received_data( const link_layer::read_buffer& ) = 0;
            virtual link_layer::write_buffer next_transmit() = 0;
            virtual link_layer::read_buffer allocate_receive_buffer() = 0;
            virtual void load_transmit_counter() = 0;

            virtual bool is_scan_request_in_filter_callback( const link_layer::device_address& ) const = 0;
        };

        class scheduled_radio_base
        {
        public:
            class lock_guard
            {
            public:
                lock_guard();
                ~lock_guard();

                lock_guard( const lock_guard& ) = delete;
                lock_guard& operator=( const lock_guard& ) = delete;
            private:
                const std::uint32_t context_;
            };

            scheduled_radio_base( adv_callbacks&, std::uint32_t encrypted_area );
            explicit scheduled_radio_base( adv_callbacks& );

            void schedule_advertisment(
                unsigned                        channel,
                const link_layer::write_buffer& advertising_data,
                const link_layer::write_buffer& response_data,
                link_layer::delta_time          when,
                const link_layer::read_buffer&  receive );

            void set_access_address_and_crc_init( std::uint32_t access_address, std::uint32_t crc_init );

            void run();

            void wake_up();

            std::uint32_t static_random_address_seed() const;

            // no native white list implementation atm
            static constexpr std::size_t radio_maximum_white_list_entries = 0;

            static constexpr bool hardware_supports_encryption = false;

            void increment_receive_packet_counter()
            {
            }

            void increment_transmit_packet_counter()
            {
            }

            /**
             * @brief experimental interface to be called from a connection event callback
             *
             * To be called, once the CPU will be stopped due to flash memory eraseing.
             */
            void nrf_flash_memory_access_begin();
            void nrf_flash_memory_access_end();

        protected:

            bluetoe::link_layer::delta_time start_connection_event_impl(
                unsigned                        channel,
                bluetoe::link_layer::delta_time start_receive,
                bluetoe::link_layer::delta_time end_receive,
                const link_layer::read_buffer&  receive_buffer );

            void configure_encryption( bool receive, bool transmit );

        private:
            friend void ::RADIO_IRQHandler(void);
            friend void ::TIMER0_IRQHandler(void);

            bool is_valid_scan_request() const;
            void stop_radio();

            void adv_radio_interrupt();
            void adv_timer_interrupt();
            void evt_radio_interrupt();
            void evt_timer_interrupt();
            void radio_interrupt();
            void timer_interrupt();

            unsigned frequency_from_channel( unsigned channel ) const;

            adv_callbacks& callbacks_;
            volatile bool timeout_;
            volatile bool received_;
            volatile bool evt_timeout_;
            volatile bool end_evt_;
            volatile int  wake_up_;

            static constexpr unsigned connection_event_type_base = 100;

            enum class state {
                idle,
                // timeout while receiving, stopping the radio, waiting for the radio to become disabled
                adv_transmitting,
                adv_receiving,
                adv_transmitting_response,
                // connection event
                evt_wait_connect    = connection_event_type_base,
                evt_transmiting_closing,
            };

            volatile state                  state_;

            bluetoe::link_layer::delta_time anchor_offset_;

            link_layer::read_buffer         receive_buffer_;
            link_layer::write_buffer        response_data_;
            std::uint8_t                    empty_receive_[ 3 ];
            bool                            receive_encrypted_;
            bool                            transmit_encrypted_;
            std::uint32_t                   encrypted_area_;
        };

        class scheduled_radio_base_with_encryption_base : public scheduled_radio_base
        {
        protected:
            scheduled_radio_base_with_encryption_base( adv_callbacks& cbs, std::uint32_t scratch_area, std::uint32_t encrypted_area );

            void load_transmit_packet_counter();

            bluetoe::link_layer::delta_time start_connection_event(
                unsigned                        channel,
                bluetoe::link_layer::delta_time start_receive,
                bluetoe::link_layer::delta_time end_receive,
                const link_layer::read_buffer&  receive_buffer )
            {
                load_receive_packet_counter();
                return start_connection_event_impl( channel, start_receive, end_receive, receive_buffer );
            }

        public:
            static constexpr bool hardware_supports_lesc_pairing    = true;
            static constexpr bool hardware_supports_legacy_pairing  = true;
            static constexpr bool hardware_supports_encryption      = hardware_supports_lesc_pairing || hardware_supports_legacy_pairing;

            /**
             * security tool box required by legacy pairing
             */
            bluetoe::details::uint128_t create_srand();

            bluetoe::details::longterm_key_t create_long_term_key();

            bluetoe::details::uint128_t c1(
                const bluetoe::details::uint128_t& temp_key,
                const bluetoe::details::uint128_t& rand,
                const bluetoe::details::uint128_t& p1,
                const bluetoe::details::uint128_t& p2 ) const;

            bluetoe::details::uint128_t s1(
                const bluetoe::details::uint128_t& temp_key,
                const bluetoe::details::uint128_t& srand,
                const bluetoe::details::uint128_t& mrand );

            /**
             * security tool box required by LESC pairing
             */
            bool is_valid_public_key( const std::uint8_t* public_key ) const;

            std::pair< bluetoe::details::ecdh_public_key_t, bluetoe::details::ecdh_private_key_t > generate_keys();

            bluetoe::details::uint128_t select_random_nonce();

            bluetoe::details::ecdh_shared_secret_t p256( const std::uint8_t* private_key, const std::uint8_t* public_key );

            bluetoe::details::uint128_t f4( const std::uint8_t* u, const std::uint8_t* v, const std::array< std::uint8_t, 16 >& k, std::uint8_t z );

            std::pair< bluetoe::details::uint128_t, bluetoe::details::uint128_t > f5(
                const bluetoe::details::ecdh_shared_secret_t dh_key,
                const bluetoe::details::uint128_t& nonce_central,
                const bluetoe::details::uint128_t& nonce_periperal,
                const bluetoe::link_layer::device_address& addr_controller,
                const bluetoe::link_layer::device_address& addr_peripheral );

            bluetoe::details::uint128_t f6(
                const bluetoe::details::uint128_t& key,
                const bluetoe::details::uint128_t& n1,
                const bluetoe::details::uint128_t& n2,
                const bluetoe::details::uint128_t& r,
                const bluetoe::details::io_capabilities_t& io_caps,
                const bluetoe::link_layer::device_address& addr_controller,
                const bluetoe::link_layer::device_address& addr_peripheral );

            std::uint32_t g2(
                const std::uint8_t*                 u,
                const std::uint8_t*                 v,
                const bluetoe::details::uint128_t&  x,
                const bluetoe::details::uint128_t&  y );

            /**
             * Functions required by IO capabilties
             */
            bluetoe::details::uint128_t create_passkey();

            /**
             * Functions required by the link layer
             */
            std::pair< std::uint64_t, std::uint32_t > setup_encryption( bluetoe::details::uint128_t key, std::uint64_t skdm, std::uint32_t ivm );

            void start_receive_encrypted();
            void start_transmit_encrypted();
            void stop_receive_encrypted();
            void stop_transmit_encrypted();

            void increment_receive_packet_counter()
            {
                rx_counter_.increment();
            }

            void increment_transmit_packet_counter()
            {
                tx_counter_.increment();
            }

            /**
             * @brief sets an IRK filter for incomming scan requests and connection requests
             *
             * Has to be called when the radio is not in a connection or after disconnected.
             * Experimental!
             */
            void set_identity_resolving_key( const details::identity_resolving_key_t& irk );

        private:
       
Download .txt
gitextract_0w9214oa/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── codeql.yml
├── .gitignore
├── .gitlab-ci.yml
├── .travis.yml
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── Doxyfile
├── LICENSE
├── README.md
├── bluetoe/
│   ├── adv_service_list.hpp
│   ├── appearance.hpp
│   ├── attribute_generator.hpp
│   ├── attribute_handle.hpp
│   ├── bindings/
│   │   ├── CMakeLists.txt
│   │   ├── hci/
│   │   │   └── include_libusb/
│   │   │       └── bluetoe/
│   │   │           ├── device.hpp
│   │   │           └── libsub.hpp
│   │   └── nordic/
│   │       ├── CMakeLists.txt
│   │       ├── include/
│   │       │   └── bluetoe/
│   │       │       └── nrf.hpp
│   │       ├── nrf51/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── include/
│   │       │   │   └── bluetoe/
│   │       │   │       ├── device.hpp
│   │       │   │       └── nrf51.hpp
│   │       │   └── nrf51.cpp
│   │       ├── nrf52/
│   │       │   ├── CMakeLists.txt
│   │       │   ├── include/
│   │       │   │   └── bluetoe/
│   │       │   │       ├── device.hpp
│   │       │   │       ├── nrf52.hpp
│   │       │   │       └── security_tool_box.hpp
│   │       │   ├── nrf52.cpp
│   │       │   └── security_tool_box.cpp
│   │       └── uECC/
│   │           ├── CMakeLists.txt
│   │           ├── asm_arm.inc
│   │           ├── uECC.c
│   │           └── uECC.h
│   ├── characteristic.hpp
│   ├── characteristic_value.hpp
│   ├── custom_advertising.hpp
│   ├── descriptor.hpp
│   ├── encryption.hpp
│   ├── filter.hpp
│   ├── find_notification_data.hpp
│   ├── gap_service.hpp
│   ├── gatt_options.hpp
│   ├── hci/
│   │   ├── CMakeLists.txt
│   │   └── include/
│   │       └── bluetoe/
│   │           └── link_layer.hpp
│   ├── l2cap.hpp
│   ├── l2cap_channels.hpp
│   ├── link_layer/
│   │   ├── CMakeLists.txt
│   │   ├── channel_map.cpp
│   │   ├── connection_details.cpp
│   │   ├── delta_time.cpp
│   │   ├── include/
│   │   │   └── bluetoe/
│   │   │       ├── advertising.hpp
│   │   │       ├── buffer.hpp
│   │   │       ├── channel_map.hpp
│   │   │       ├── connection_callbacks.hpp
│   │   │       ├── connection_details.hpp
│   │   │       ├── connection_event_callback.hpp
│   │   │       ├── connection_events.hpp
│   │   │       ├── default_pdu_layout.hpp
│   │   │       ├── delta_time.hpp
│   │   │       ├── l2cap_signaling_channel.hpp
│   │   │       ├── link_layer.hpp
│   │   │       ├── ll_data_pdu_buffer.hpp
│   │   │       ├── ll_l2cap_sdu_buffer.hpp
│   │   │       ├── ll_meta_types.hpp
│   │   │       ├── ll_options.hpp
│   │   │       ├── peripheral_latency.hpp
│   │   │       ├── phy_encodings.hpp
│   │   │       ├── ring_buffer.hpp
│   │   │       └── white_list.hpp
│   │   └── scheduled_radio.hpp
│   ├── link_state.hpp
│   ├── mainpage.hpp
│   ├── meta_types.hpp
│   ├── mixin.hpp
│   ├── notification_queue.hpp
│   ├── outgoing_priority.hpp
│   ├── pairing_status.hpp
│   ├── peripheral_connection_interval_range.hpp
│   ├── scattered_access.hpp
│   ├── sensor_location.hpp
│   ├── server.hpp
│   ├── server_meta_type.hpp
│   ├── server_name.hpp
│   ├── service.hpp
│   ├── service_uuid.hpp
│   ├── services/
│   │   ├── CMakeLists.txt
│   │   ├── bas.hpp
│   │   ├── bootloader.hpp
│   │   ├── bootloader.md
│   │   ├── csc.hpp
│   │   ├── dis.hpp
│   │   ├── gatt.hpp
│   │   └── hid.hpp
│   ├── sm/
│   │   ├── CMakeLists.txt
│   │   └── include/
│   │       └── bluetoe/
│   │           ├── io_capabilities.hpp
│   │           ├── oob_authentication.hpp
│   │           ├── security_connection_data.hpp
│   │           └── security_manager.hpp
│   ├── utility/
│   │   ├── CMakeLists.txt
│   │   ├── address.cpp
│   │   └── include/
│   │       └── bluetoe/
│   │           ├── address.hpp
│   │           ├── attribute.hpp
│   │           ├── bits.hpp
│   │           ├── client_characteristic_configuration.hpp
│   │           ├── codes.hpp
│   │           ├── meta_tools.hpp
│   │           └── ring.hpp
│   ├── uuid.hpp
│   └── write_queue.hpp
├── config/
│   ├── travisci_rsa.enc
│   └── travisci_rsa.pub
├── documentation/
│   ├── Logo_Bluetoe.eps
│   └── customdoxygen.css
├── examples/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── assert/
│   │   ├── CMakeLists.txt
│   │   ├── assert.cpp
│   │   ├── assert.h
│   │   └── cassert
│   ├── ble_flash/
│   │   ├── CMakeLists.txt
│   │   ├── ble_flash.coffee
│   │   ├── crc.coffee
│   │   ├── crc_tests.coffee
│   │   ├── flash.coffee
│   │   └── flash_tests.coffee
│   ├── blinky.cpp
│   ├── blinky_with_lesc_and_legacy_pairing.cpp
│   ├── blinky_with_oob.cpp
│   ├── blinky_without_encryption.cpp
│   ├── bootloader.cpp
│   ├── cc2650/
│   │   ├── cc26x0f128.lds
│   │   ├── ccfg.c
│   │   └── startup_gcc.c
│   ├── cmake/
│   │   ├── deduce.cmake
│   │   └── gcc-arm-none-eabi.cmake
│   ├── custom_advertising.cpp
│   ├── cycling_speed_and_cadence.cpp
│   ├── docker/
│   │   ├── Dockerfile
│   │   └── Makefile
│   ├── doxygen/
│   │   ├── CMakeLists.txt
│   │   ├── change_advertising_example.cpp
│   │   ├── include_example.cpp
│   │   ├── priorities_example.cpp
│   │   ├── read_write_handler_example.cpp
│   │   └── server_example.cpp
│   ├── gpio.cpp
│   ├── keyboard.cpp
│   ├── nrf51_toolchain_support/
│   │   ├── CMakeLists.txt
│   │   ├── gcc_nrf51_common.ld
│   │   ├── gcc_startup_nrf51.s
│   │   ├── nrf51_xxaa.ld
│   │   ├── platform.cmake
│   │   ├── system_nrf51.h
│   │   └── system_nrf51422.c
│   ├── nrf52_high_cpu_load.cpp
│   ├── nrf52_toolchain_support/
│   │   ├── CMakeLists.txt
│   │   ├── gcc_nrf5x_common.ld
│   │   ├── gcc_startup_nrf52.s
│   │   ├── nrf52.ld
│   │   ├── platform.cmake
│   │   ├── system_nrf52.c
│   │   └── system_nrf52.h
│   ├── resources.hpp
│   ├── runtime_gcc.cpp
│   ├── scheduled_radio_tests.cpp
│   ├── spl/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── flash.hpp
│   │   ├── gpio.hpp
│   │   ├── temperature.cpp
│   │   ├── temperature.hpp
│   │   └── timer.hpp
│   ├── synchronized_callbacks.cpp
│   ├── thermometer.cpp
│   └── ucontroller.hpp
├── publish-doxygen
└── tests/
    ├── CMakeLists.txt
    ├── advertising_tests.cpp
    ├── att/
    │   ├── CMakeLists.txt
    │   ├── descriptor_tests.cpp
    │   ├── execute_write_tests.cpp
    │   ├── find_by_type_value_tests.cpp
    │   ├── find_information_tests.cpp
    │   ├── find_notification_data_tests.cpp
    │   ├── indication_tests.cpp
    │   ├── mtu_exchange_tests.cpp
    │   ├── notification_tests.cpp
    │   ├── outgoing_priority_tests.cpp
    │   ├── prepare_write_tests.cpp
    │   ├── read_blob_tests.cpp
    │   ├── read_by_group_type_tests.cpp
    │   ├── read_by_type_tests.cpp
    │   ├── read_multiple_tests.cpp
    │   ├── read_tests.cpp
    │   ├── request_not_supported_tests.cpp
    │   ├── write_command_tests.cpp
    │   └── write_tests.cpp
    ├── attribute_handle_tests.cpp
    ├── auto_uuid_tests.cpp
    ├── bits_tests.cpp
    ├── characteristic_tests.cpp
    ├── characteristic_value_tests.cpp
    ├── connect.coffee
    ├── encryption_tests.cpp
    ├── filter_tests.cpp
    ├── gap_service_tests.cpp
    ├── hci/
    │   ├── CMakeLists.txt
    │   ├── hci_advertising_tests.cpp
    │   └── transport.hpp
    ├── l2cap_tests.cpp
    ├── link_layer/
    │   ├── CMakeLists.txt
    │   ├── address_tests.cpp
    │   ├── advertiser_tests.cpp
    │   ├── channel_map_tests.cpp
    │   ├── connected.hpp
    │   ├── connection_callbacks_tests.cpp
    │   ├── connection_event_callback_tests.cpp
    │   ├── connection_parameter_update_procedure_tests.cpp
    │   ├── delta_time_tests.cpp
    │   ├── ll_advertising_tests.cpp
    │   ├── ll_connecting_tests.cpp
    │   ├── ll_connection_tests.cpp
    │   ├── ll_control_tests.cpp
    │   ├── ll_data_pdu_buffer_tests.cpp
    │   ├── ll_data_tests.cpp
    │   ├── ll_encryption_tests.cpp
    │   ├── ll_l2cap_sdu_buffer_tests.cpp
    │   ├── ll_notification_tests.cpp
    │   ├── ll_peripheral_latency_tests.cpp
    │   ├── ll_phy_update_tests.cpp
    │   ├── ll_remote_request_tests.cpp
    │   ├── peripheral_latency_tests.cpp
    │   ├── ring_buffer_tests.cpp
    │   ├── signaling_channel_tests.cpp
    │   ├── test_radio_tests.cpp
    │   └── white_list_tests.cpp
    ├── notification_queue_tests.cpp
    ├── options_tests.cpp
    ├── read_write_handler_tests.cpp
    ├── ring_tests.cpp
    ├── scattered_access_tests.cpp
    ├── security_manager/
    │   ├── CMakeLists.txt
    │   ├── authentication_stage_tests1.cpp
    │   ├── authentication_stage_tests2.cpp
    │   ├── bonding_tests.cpp
    │   ├── encryption_example_tests.cpp
    │   ├── io_capabilities_tests.cpp
    │   ├── key_distribution_tests.cpp
    │   ├── pairing_confirm_tests.cpp
    │   ├── pairing_random_tests.cpp
    │   ├── pairing_request_tests.cpp
    │   ├── pairing_tests.cpp
    │   ├── public_key_exchange_tests.cpp
    │   ├── test_sm.hpp
    │   └── test_sm_tests.cpp
    ├── server_tests.cpp
    ├── service_tests.cpp
    ├── services/
    │   ├── CMakeLists.txt
    │   ├── battery_tests.cpp
    │   ├── bootloader_tests.cpp
    │   ├── cscs_tests.cpp
    │   ├── test_gatt.cpp
    │   └── test_gatt.hpp
    ├── test_attribute_access.hpp
    ├── test_characteristics.hpp
    ├── test_tools/
    │   ├── CMakeLists.txt
    │   ├── address_io.cpp
    │   ├── aes.c
    │   ├── aes.h
    │   ├── attribute_io.cpp
    │   ├── attribute_io.hpp
    │   ├── buffer_io.cpp
    │   ├── buffer_io.hpp
    │   ├── hexdump.cpp
    │   ├── hexdump.hpp
    │   ├── pairing_status_io.cpp
    │   ├── pairing_status_io.hpp
    │   ├── test_layout.hpp
    │   ├── test_radio.cpp
    │   ├── test_radio.hpp
    │   ├── test_servers.cpp
    │   ├── test_servers.hpp
    │   ├── test_services.hpp
    │   ├── test_uuid.cpp
    │   ├── test_uuid.hpp
    │   ├── uECC.c
    │   └── uECC.h
    ├── test_tuple.hpp
    └── write_queue_tests.cpp
Download .txt
Showing preview only (488K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4435 symbols across 216 files)

FILE: bluetoe/adv_service_list.hpp
  type bluetoe (line 12) | namespace bluetoe {
    type details (line 14) | namespace details {
      type list_of_16_bit_service_uuids_tag (line 15) | struct list_of_16_bit_service_uuids_tag {}
      type list_of_128_bit_service_uuids_tag (line 16) | struct list_of_128_bit_service_uuids_tag {}
      type uuid_128_writer (line 104) | struct uuid_128_writer
        method uuid_128_writer (line 106) | constexpr uuid_128_writer( std::uint8_t*& b, std::uint8_t* e )
        method each (line 113) | void each()
      type extract_uuid (line 177) | struct extract_uuid {
      type create_list_of_service_uuids (line 182) | struct create_list_of_service_uuids
      type default_list_of_16_bit_service_uuids (line 192) | struct default_list_of_16_bit_service_uuids
      type default_list_of_128_bit_service_uuids (line 199) | struct default_list_of_128_bit_service_uuids
    type list_of_16_bit_service_uuids (line 28) | struct list_of_16_bit_service_uuids {
      type meta_type (line 30) | struct meta_type
    type list_of_16_bit_service_uuids<> (line 71) | struct list_of_16_bit_service_uuids<> {
      type meta_type (line 72) | struct meta_type
    type no_list_of_service_uuids (line 87) | struct no_list_of_service_uuids {
      type meta_type (line 89) | struct meta_type
    type details (line 102) | namespace details {
      type list_of_16_bit_service_uuids_tag (line 15) | struct list_of_16_bit_service_uuids_tag {}
      type list_of_128_bit_service_uuids_tag (line 16) | struct list_of_128_bit_service_uuids_tag {}
      type uuid_128_writer (line 104) | struct uuid_128_writer
        method uuid_128_writer (line 106) | constexpr uuid_128_writer( std::uint8_t*& b, std::uint8_t* e )
        method each (line 113) | void each()
      type extract_uuid (line 177) | struct extract_uuid {
      type create_list_of_service_uuids (line 182) | struct create_list_of_service_uuids
      type default_list_of_16_bit_service_uuids (line 192) | struct default_list_of_16_bit_service_uuids
      type default_list_of_128_bit_service_uuids (line 199) | struct default_list_of_128_bit_service_uuids
    type list_of_128_bit_service_uuids (line 128) | struct list_of_128_bit_service_uuids {
      type meta_type (line 130) | struct meta_type :
    type list_of_128_bit_service_uuids<> (line 164) | struct list_of_128_bit_service_uuids<> {
      type meta_type (line 165) | struct meta_type :
    type details (line 175) | namespace details {
      type list_of_16_bit_service_uuids_tag (line 15) | struct list_of_16_bit_service_uuids_tag {}
      type list_of_128_bit_service_uuids_tag (line 16) | struct list_of_128_bit_service_uuids_tag {}
      type uuid_128_writer (line 104) | struct uuid_128_writer
        method uuid_128_writer (line 106) | constexpr uuid_128_writer( std::uint8_t*& b, std::uint8_t* e )
        method each (line 113) | void each()
      type extract_uuid (line 177) | struct extract_uuid {
      type create_list_of_service_uuids (line 182) | struct create_list_of_service_uuids
      type default_list_of_16_bit_service_uuids (line 192) | struct default_list_of_16_bit_service_uuids
      type default_list_of_128_bit_service_uuids (line 199) | struct default_list_of_128_bit_service_uuids
  type list_of_16_bit_service_uuids< std::tuple< UUID16... > > (line 84) | struct list_of_16_bit_service_uuids< std::tuple< UUID16... > > : list_of...
  type list_of_128_bit_service_uuids< std::tuple< UUID16... > > (line 161) | struct list_of_128_bit_service_uuids< std::tuple< UUID16... > > : list_o...
  type default_list_of_16_bit_service_uuids< std::tuple< Services... > > (line 195) | struct default_list_of_16_bit_service_uuids< std::tuple< Services... > >...
  type default_list_of_128_bit_service_uuids< std::tuple< Services... > > (line 202) | struct default_list_of_128_bit_service_uuids< std::tuple< Services... > ...

FILE: bluetoe/appearance.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type details (line 8) | namespace details {
      type device_appearance_meta_type (line 9) | struct device_appearance_meta_type {}
      type advertise_appearance_meta_type (line 10) | struct advertise_appearance_meta_type {}
    type device_appearance (line 17) | struct device_appearance
      type meta_type (line 20) | struct meta_type :
    type appearance (line 51) | struct appearance
    type advertise_appearance (line 160) | struct advertise_appearance
      type meta_type (line 163) | struct meta_type :
    type no_advertise_appearance (line 188) | struct no_advertise_appearance
      type meta_type (line 190) | struct meta_type :

FILE: bluetoe/attribute_generator.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type details (line 8) | namespace details {
      type generate_attribute (line 16) | struct generate_attribute
      type generate_attribute_list (line 28) | struct generate_attribute_list
      type count_attributes (line 58) | struct count_attributes
      type generate_attributes (line 72) | struct generate_attributes
  type generate_attribute_list< std::tuple<>, CCCDIndices, ClientCharacteristicIndex, Service, Server, std::tuple< Options... > > (line 31) | struct generate_attribute_list< std::tuple<>, CCCDIndices, ClientCharact...
    method attribute (line 33) | static const attribute attribute_at( std::size_t )
  type generate_attribute_list< std::tuple< Attributes... >, std::tuple< CCCDIndices... >, ClientCharacteristicIndex, Service, Server, std::tuple< Options... > > (line 41) | struct generate_attribute_list< std::tuple< Attributes... >, std::tuple<...
    method attribute (line 43) | static const attribute attribute_at( std::size_t index )
  type count_attributes< OptionsList, std::tuple< MetaTypes... >, OptionsDefault > (line 61) | struct count_attributes< OptionsList, std::tuple< MetaTypes... >, Option...
  type generate_attributes< OptionsList, std::tuple< MetaTypes... >, CCCDIndices, OptionsDefault > (line 75) | struct generate_attributes< OptionsList, std::tuple< MetaTypes... >, CCC...
    method attribute_generation_parameters (line 83) | attribute_generation_parameters get_attribute_generation_parameters() ...
    method attribute (line 86) | static const attribute attribute_at( std::size_t index )

FILE: bluetoe/attribute_handle.hpp
  type bluetoe (line 12) | namespace bluetoe {
    type details (line 14) | namespace details {
      type attribute_handle_meta_type (line 15) | struct attribute_handle_meta_type {}
      type attribute_handles_meta_type (line 16) | struct attribute_handles_meta_type {}
      type select_attribute_handles (line 92) | struct select_attribute_handles
      type select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, T > (line 100) | struct select_attribute_handles< Default, attribute_handle< Attribut...
      type select_attribute_handles< Default, T, attribute_handles< Declaration, Value, CCCD > > (line 108) | struct select_attribute_handles< Default, T, attribute_handles< Decl...
      type select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, attribute_handles< Declaration, Value, CCCD > > (line 116) | struct select_attribute_handles< Default, attribute_handle< Attribut...
      type characteristic_index_mapping (line 122) | struct characteristic_index_mapping
        method characteristic_attribute_handle_by_index (line 142) | static std::uint16_t characteristic_attribute_handle_by_index( std...
        method characteristic_attribute_index_by_handle (line 166) | static std::size_t characteristic_attribute_index_by_handle( std::...
      type interate_characteristic_index_mappings (line 182) | struct interate_characteristic_index_mappings
      type interate_characteristic_index_mappings< StartHandle, StartIndex, std::tuple<> > (line 185) | struct interate_characteristic_index_mappings< StartHandle, StartInd...
        method attribute_handle_by_index (line 187) | static std::uint16_t attribute_handle_by_index( std::size_t )
        method attribute_index_by_handle (line 192) | static std::size_t attribute_index_by_handle( std::uint16_t )
      type service_start_handle (line 235) | struct service_start_handle
      type service_index_mapping (line 251) | struct service_index_mapping
        method characteristic_handle_by_index (line 263) | static std::uint16_t characteristic_handle_by_index( std::size_t i...
        method characteristic_first_index_by_handle (line 271) | static std::size_t characteristic_first_index_by_handle( std::uint...
      type interate_service_index_mappings (line 284) | struct interate_service_index_mappings
      type interate_service_index_mappings< StartHandle, StartIndex, std::tuple<> > (line 287) | struct interate_service_index_mappings< StartHandle, StartIndex, std...
        method service_handle_by_index (line 289) | static std::uint16_t service_handle_by_index( std::size_t )
        method service_first_index_by_handle (line 294) | static std::size_t service_first_index_by_handle( std::uint16_t )
      type handle_index_mapping (line 337) | struct handle_index_mapping
    type attribute_handle (line 33) | struct attribute_handle
      type meta_type (line 38) | struct meta_type :
    type attribute_handles (line 57) | struct attribute_handles
      type meta_type (line 68) | struct meta_type :
    class server (line 75) | class server
    class service (line 78) | class service
    class characteristic (line 81) | class characteristic
    type details (line 83) | namespace details {
      type attribute_handle_meta_type (line 15) | struct attribute_handle_meta_type {}
      type attribute_handles_meta_type (line 16) | struct attribute_handles_meta_type {}
      type select_attribute_handles (line 92) | struct select_attribute_handles
      type select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, T > (line 100) | struct select_attribute_handles< Default, attribute_handle< Attribut...
      type select_attribute_handles< Default, T, attribute_handles< Declaration, Value, CCCD > > (line 108) | struct select_attribute_handles< Default, T, attribute_handles< Decl...
      type select_attribute_handles< Default, attribute_handle< AttributeHandleValue >, attribute_handles< Declaration, Value, CCCD > > (line 116) | struct select_attribute_handles< Default, attribute_handle< Attribut...
      type characteristic_index_mapping (line 122) | struct characteristic_index_mapping
        method characteristic_attribute_handle_by_index (line 142) | static std::uint16_t characteristic_attribute_handle_by_index( std...
        method characteristic_attribute_index_by_handle (line 166) | static std::size_t characteristic_attribute_index_by_handle( std::...
      type interate_characteristic_index_mappings (line 182) | struct interate_characteristic_index_mappings
      type interate_characteristic_index_mappings< StartHandle, StartIndex, std::tuple<> > (line 185) | struct interate_characteristic_index_mappings< StartHandle, StartInd...
        method attribute_handle_by_index (line 187) | static std::uint16_t attribute_handle_by_index( std::size_t )
        method attribute_index_by_handle (line 192) | static std::size_t attribute_index_by_handle( std::uint16_t )
      type service_start_handle (line 235) | struct service_start_handle
      type service_index_mapping (line 251) | struct service_index_mapping
        method characteristic_handle_by_index (line 263) | static std::uint16_t characteristic_handle_by_index( std::size_t i...
        method characteristic_first_index_by_handle (line 271) | static std::size_t characteristic_first_index_by_handle( std::uint...
      type interate_service_index_mappings (line 284) | struct interate_service_index_mappings
      type interate_service_index_mappings< StartHandle, StartIndex, std::tuple<> > (line 287) | struct interate_service_index_mappings< StartHandle, StartIndex, std...
        method service_handle_by_index (line 289) | static std::uint16_t service_handle_by_index( std::size_t )
        method service_first_index_by_handle (line 294) | static std::size_t service_first_index_by_handle( std::uint16_t )
      type handle_index_mapping (line 337) | struct handle_index_mapping
  type interate_characteristic_index_mappings< StartHandle, StartIndex, std::tuple< ::bluetoe::characteristic< Options... >, Chars... > > (line 208) | struct interate_characteristic_index_mappings< StartHandle, StartIndex, ...
    method attribute_handle_by_index (line 217) | static std::uint16_t attribute_handle_by_index( std::size_t index )
    method attribute_index_by_handle (line 225) | static std::size_t attribute_index_by_handle( std::uint16_t handle )
  type interate_service_index_mappings< StartHandle, StartIndex, std::tuple< ::bluetoe::service< Options... >, Services... > > (line 308) | struct interate_service_index_mappings< StartHandle, StartIndex, std::tu...
    method service_handle_by_index (line 312) | static std::uint16_t service_handle_by_index( std::size_t index )
    method service_first_index_by_handle (line 320) | static std::size_t service_first_index_by_handle( std::uint16_t handle )
  type handle_index_mapping< ::bluetoe::server< Options... > > (line 340) | struct handle_index_mapping< ::bluetoe::server< Options... > >
    method handle_by_index (line 348) | static std::uint16_t handle_by_index( std::size_t index )
    method first_index_by_handle (line 359) | static std::size_t first_index_by_handle( std::uint16_t handle )
    method index_by_handle (line 364) | static std::size_t index_by_handle( std::uint16_t handle )

FILE: bluetoe/bindings/hci/include_libusb/bluetoe/device.hpp
  type bluetoe (line 7) | namespace bluetoe

FILE: bluetoe/bindings/hci/include_libusb/bluetoe/libsub.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type hci_details (line 6) | namespace hci_details {
      class libsub_transport (line 8) | class libsub_transport {

FILE: bluetoe/bindings/nordic/include/bluetoe/nrf.hpp
  type bluetoe (line 9) | namespace bluetoe
    type nrf52_details (line 11) | namespace nrf52_details {
    type nrf (line 20) | namespace nrf
      type nrf_details (line 48) | namespace nrf_details {
        type radio_option_meta_type (line 49) | struct radio_option_meta_type : ::bluetoe::details::binding_option...
        type sleep_clock_source_meta_type (line 50) | struct sleep_clock_source_meta_type : radio_option_meta_type {}
        type hfxo_startup_time_meta_type (line 51) | struct hfxo_startup_time_meta_type : radio_option_meta_type {}
        type leave_run_on_interrupt_type (line 52) | struct leave_run_on_interrupt_type : radio_option_meta_type {}
        function start_high_frequency_clock (line 54) | static void start_high_frequency_clock()
        function start_lfclock_and_rtc (line 67) | inline void start_lfclock_and_rtc()
      type synthesized_sleep_clock (line 98) | struct synthesized_sleep_clock
        method start_clocks (line 103) | static void start_clocks()
        method stop_high_frequency_crystal_oscilator (line 111) | static void stop_high_frequency_crystal_oscilator()
      type sleep_clock_crystal_oscillator (line 124) | struct sleep_clock_crystal_oscillator
        method start_clocks (line 129) | static void start_clocks()
        method stop_high_frequency_crystal_oscilator (line 137) | static void stop_high_frequency_crystal_oscilator()
      type calibrated_rc_sleep_clock (line 162) | struct calibrated_rc_sleep_clock
        method start_clocks (line 167) | static void start_clocks()
        method stop_high_frequency_crystal_oscilator (line 176) | static void stop_high_frequency_crystal_oscilator()
      type high_frequency_crystal_oscillator_startup_time (line 202) | struct high_frequency_crystal_oscillator_startup_time
      type leave_run_on_interrupt (line 225) | struct leave_run_on_interrupt {
    type nrf_details (line 232) | namespace nrf_details
      type encrypted_pdu_layout (line 234) | struct encrypted_pdu_layout : bluetoe::link_layer::details::layout_b...
        method header (line 241) | static std::uint16_t header( const std::uint8_t* pdu )
        method header (line 246) | static void header( std::uint8_t* pdu, std::uint16_t header_value )
        method body (line 251) | static std::pair< std::uint8_t*, std::uint8_t* > body( const link_...
        method body (line 258) | static std::pair< const std::uint8_t*, const std::uint8_t* > body(...
        method data_channel_pdu_memory_size (line 265) | static constexpr std::size_t data_channel_pdu_memory_size( std::si...

FILE: bluetoe/bindings/nordic/nrf51/include/bluetoe/device.hpp
  type bluetoe (line 6) | namespace bluetoe

FILE: bluetoe/bindings/nordic/nrf51/include/bluetoe/nrf51.hpp
  type bluetoe (line 12) | namespace bluetoe
    type nrf51_details (line 14) | namespace nrf51_details
      type counter (line 17) | struct counter {
      class adv_callbacks (line 29) | class adv_callbacks
      class scheduled_radio_base (line 45) | class scheduled_radio_base
        class lock_guard (line 48) | class lock_guard
          method lock_guard (line 54) | lock_guard( const lock_guard& ) = delete;
          method lock_guard (line 55) | lock_guard& operator=( const lock_guard& ) = delete;
        method increment_receive_packet_counter (line 83) | void increment_receive_packet_counter()
        method increment_transmit_packet_counter (line 87) | void increment_transmit_packet_counter()
        type state (line 134) | enum class state {
      class scheduled_radio_base_with_encryption_base (line 157) | class scheduled_radio_base_with_encryption_base : public scheduled_r...
        method start_connection_event (line 164) | bluetoe::link_layer::delta_time start_connection_event(
        method increment_receive_packet_counter (line 247) | void increment_receive_packet_counter()
        method increment_transmit_packet_counter (line 252) | void increment_transmit_packet_counter()
      class scheduled_radio_base_with_encryption (line 277) | class scheduled_radio_base_with_encryption : public scheduled_radio_...
        method scheduled_radio_base_with_encryption (line 280) | scheduled_radio_base_with_encryption( adv_callbacks& cbs )
        type scratch_area_t (line 292) | struct alignas( 4 ) scratch_area_t {
        type encrypted_message_t (line 299) | struct alignas( 4 ) encrypted_message_t {
      class scheduled_radio_without_encryption_base (line 304) | class scheduled_radio_without_encryption_base : public scheduled_rad...
        method start_connection_event (line 307) | bluetoe::link_layer::delta_time start_connection_event(
        method scheduled_radio_without_encryption_base (line 316) | scheduled_radio_without_encryption_base( adv_callbacks& cbs ) : sc...
        method load_transmit_packet_counter (line 320) | void load_transmit_packet_counter()
      class scheduled_radio (line 326) | class scheduled_radio :
        method scheduled_radio (line 332) | scheduled_radio() : Base( static_cast< adv_callbacks& >( *this ) )
        method schedule_connection_event (line 336) | bluetoe::link_layer::delta_time schedule_connection_event(
        method adv_received (line 353) | void adv_received( const link_layer::read_buffer& receive ) override
        method adv_timeout (line 358) | void adv_timeout() override
        method timeout (line 363) | void timeout() override
        method end_event (line 368) | void end_event() override
        method received_data (line 373) | link_layer::write_buffer received_data( const link_layer::read_buf...
        method next_transmit (line 379) | link_layer::write_buffer next_transmit() override
        method allocate_receive_buffer (line 385) | link_layer::read_buffer allocate_receive_buffer() override
        method load_transmit_counter (line 390) | void load_transmit_counter() override
        method is_scan_request_in_filter_callback (line 395) | bool is_scan_request_in_filter_callback( const link_layer::device_...
      type scheduled_radio_factory (line 402) | struct scheduled_radio_factory
    type link_layer (line 431) | namespace link_layer {
  type pdu_layout_by_radio<
            nrf51_details::scheduled_radio< TransmitSize, ReceiveSize, CallBack, nrf51_details::scheduled_radio_base_with_encryption< Options... > > > (line 439) | struct pdu_layout_by_radio<

FILE: bluetoe/bindings/nordic/nrf51/nrf51.cpp
  type bluetoe (line 16) | namespace bluetoe {
    type nrf51_details (line 17) | namespace nrf51_details {
      function init_debug (line 61) | void init_debug()
      function init_debug (line 118) | void init_debug() {}
      function override_correction (line 145) | static auto override_correction(F* ficr, R* radio) -> decltype(F::OV...
      function override_correction (line 170) | static void override_correction(...)
      function init_radio (line 174) | static void init_radio( bool encryption_possible )
      function pdu_gap_required_by_encryption (line 216) | static int pdu_gap_required_by_encryption()
      function init_timer (line 223) | static void init_timer()
      type ccm_data_struct_t (line 514) | struct alignas( 4 ) ccm_data_struct_t {
      function random_number8 (line 902) | static std::uint8_t random_number8()
      function random_number16 (line 914) | static std::uint16_t random_number16()
      function random_number32 (line 920) | static std::uint32_t random_number32()
      function random_number64 (line 926) | static std::uint64_t random_number64()
      function init_ccm_data_structure (line 941) | static void init_ccm_data_structure( std::uint32_t scratch_area )
      function setup_ccm_data_structure (line 954) | static void setup_ccm_data_structure( const bluetoe::details::uint12...
      function aes_le (line 963) | static bluetoe::details::uint128_t aes_le( const bluetoe::details::u...
      function aes_le (line 991) | static bluetoe::details::uint128_t aes_le( const bluetoe::details::u...
      function xor_ (line 996) | static bluetoe::details::uint128_t xor_( bluetoe::details::uint128_t...
      function xor_ (line 1011) | static bluetoe::details::uint128_t xor_( bluetoe::details::uint128_t...
      function left_shift (line 1127) | static bluetoe::details::uint128_t left_shift(const bluetoe::details...
      function aes_cmac_k1_subkey_generation (line 1141) | static bluetoe::details::uint128_t aes_cmac_k1_subkey_generation( co...
      function aes_cmac_k2_subkey_generation (line 1155) | static bluetoe::details::uint128_t aes_cmac_k2_subkey_generation( co...
      function f5_cmac (line 1184) | static bluetoe::details::uint128_t f5_cmac(
      function f5_key (line 1200) | static bluetoe::details::uint128_t f5_key( const bluetoe::details::e...
  function RADIO_IRQHandler (line 1385) | void RADIO_IRQHandler(void)
  function TIMER0_IRQHandler (line 1390) | void TIMER0_IRQHandler(void)

FILE: bluetoe/bindings/nordic/nrf52/include/bluetoe/device.hpp
  type bluetoe (line 6) | namespace bluetoe

FILE: bluetoe/bindings/nordic/nrf52/include/bluetoe/nrf52.hpp
  type bluetoe (line 44) | namespace bluetoe
    type nrf52_details (line 46) | namespace nrf52_details
      type counter (line 72) | struct counter {
      class radio_hardware_without_crypto_support (line 88) | class radio_hardware_without_crypto_support
        method pdu_gap_required_by_encryption (line 91) | static int pdu_gap_required_by_encryption()
        method setup_identity_resolving (line 153) | static void setup_identity_resolving(
        method resolving_address_invalid (line 158) | static bool resolving_address_invalid()
        class lock_guard (line 205) | class lock_guard
          method lock_guard (line 209) | lock_guard()
          method lock_guard (line 220) | lock_guard( const lock_guard& ) = delete;
          method lock_guard (line 221) | lock_guard& operator=( const lock_guard& ) = delete;
      class radio_hardware_with_crypto_support (line 250) | class radio_hardware_with_crypto_support : public radio_hardware_wit...
        method pdu_gap_required_by_encryption (line 253) | static int pdu_gap_required_by_encryption()
        method increment_receive_packet_counter (line 278) | static void increment_receive_packet_counter()
        method increment_transmit_packet_counter (line 283) | static void increment_transmit_packet_counter()
      type radio_options (line 315) | struct radio_options
      type link_layer_options (line 324) | struct link_layer_options
      class nrf52_radio_base (line 333) | class nrf52_radio_base : public Buffer
        method nrf52_radio_base (line 336) | nrf52_radio_base()
        method nrf52_radio_base (line 344) | nrf52_radio_base( std::uint8_t* receive_buffer )
        method schedule_advertisment (line 352) | void schedule_advertisment(
        method schedule_connection_event (line 385) | link_layer::delta_time schedule_connection_event(
        method disarm_connection_event (line 428) | std::pair< bool, link_layer::delta_time > disarm_connection_event()
        method schedule_synchronized_user_timer (line 443) | bool schedule_synchronized_user_timer(
        method cancel_synchronized_user_timer (line 456) | bool cancel_synchronized_user_timer()
        method set_access_address_and_crc_init (line 461) | void set_access_address_and_crc_init( std::uint32_t access_address...
        method run (line 466) | void run()
        method wake_up (line 533) | void wake_up()
        method request_event_cancelation (line 538) | void request_event_cancelation()
        method static_random_address_seed (line 544) | std::uint32_t static_random_address_seed() const
        method nrf_flash_memory_access_begin (line 549) | void nrf_flash_memory_access_begin()
        method nrf_flash_memory_access_end (line 558) | void nrf_flash_memory_access_end()
        method radio_set_phy (line 568) | void radio_set_phy(
        method receive_buffer (line 620) | link_layer::read_buffer receive_buffer()
        method radio_interrupt_handler (line 629) | void radio_interrupt_handler()
        method is_valid_scan_request (line 739) | bool is_valid_scan_request() const
        type state (line 786) | enum class state {
      class nrf52_radio (line 814) | class nrf52_radio
      type link_layer_factory (line 934) | struct link_layer_factory
    type link_layer (line 955) | namespace link_layer {
  class nrf52_radio< TransmitSize, ReceiveSize, false, CallBacks, Hardware, RadioOptions... > (line 823) | class nrf52_radio< TransmitSize, ReceiveSize, false, CallBacks, Hardware...
    method increment_receive_packet_counter (line 830) | void increment_receive_packet_counter() {}
    method increment_transmit_packet_counter (line 831) | void increment_transmit_packet_counter() {}
  class nrf52_radio< TransmitSize, ReceiveSize, true, CallBacks, Hardware, RadioOptions... > (line 841) | class nrf52_radio< TransmitSize, ReceiveSize, true, CallBacks, Hardware,...
    method nrf52_radio (line 862) | nrf52_radio() : radio_base_t( encrypted_message_.data )
    method setup_encryption (line 866) | std::pair< std::uint64_t, std::uint32_t > setup_encryption( bluetoe::d...
    method start_receive_encrypted (line 874) | void start_receive_encrypted()
    method start_transmit_encrypted (line 882) | void start_transmit_encrypted()
    method stop_receive_encrypted (line 890) | void stop_receive_encrypted()
    method stop_transmit_encrypted (line 898) | void stop_transmit_encrypted()
    method increment_receive_packet_counter (line 903) | void increment_receive_packet_counter()
    method increment_transmit_packet_counter (line 908) | void increment_transmit_packet_counter()
    method set_identity_resolving_key (line 919) | void set_identity_resolving_key( const details::identity_resolving_key...
    type encrypted_message_t (line 928) | struct alignas( 4 ) encrypted_message_t {
  type link_layer_factory< Server, EnabledEncryption, std::tuple< RadioOptions... >, std::tuple< LinkLayerOptions... > > (line 937) | struct link_layer_factory< Server, EnabledEncryption, std::tuple< RadioO...
  type pdu_layout_by_radio<
            nrf52_details::nrf52_radio< TransmitSize, ReceiveSize, true, CallBacks, Hardware, RadioOptions... > > (line 969) | struct pdu_layout_by_radio<

FILE: bluetoe/bindings/nordic/nrf52/include/bluetoe/security_tool_box.hpp
  type bluetoe (line 9) | namespace bluetoe
    type nrf52_details (line 11) | namespace nrf52_details
      class security_tool_box (line 22) | class security_tool_box

FILE: bluetoe/bindings/nordic/nrf52/nrf52.cpp
  type bluetoe (line 8) | namespace bluetoe
    type nrf52_details (line 12) | namespace nrf52_details
      type ppi_channels_used (line 40) | enum ppi_channels_used {
      type rtc_capture_registers (line 62) | enum rtc_capture_registers {
      type timer_capture_registers (line 69) | enum timer_capture_registers {
      type cb_timer_capture_registers (line 77) | enum cb_timer_capture_registers {
      function assign_channel (line 82) | static void assign_channel(
      function init_debug (line 102) | void init_debug()
      function toggle_debug_pin (line 170) | void toggle_debug_pin()
      function set_isr_pin (line 176) | void set_isr_pin()
      function reset_isr_pin (line 181) | void reset_isr_pin()
      function gpio_debug_hfxo_stopped (line 186) | void gpio_debug_hfxo_stopped()
      type record_long_distance_timer_params_t (line 191) | struct record_long_distance_timer_params_t {
      function record_long_distance_timer (line 209) | void record_long_distance_timer(
      function init_debug (line 236) | void init_debug() {}
      function toggle_debug_pin (line 238) | void toggle_debug_pin() {}
      function set_isr_pin (line 239) | void set_isr_pin() {}
      function reset_isr_pin (line 240) | void reset_isr_pin() {}
      function gpio_debug_hfxo_stopped (line 241) | void gpio_debug_hfxo_stopped() {}
      function record_long_distance_timer (line 242) | void record_long_distance_timer(
      function override_correction (line 254) | static auto override_correction(F* ficr, R* radio) -> decltype(F::OV...
      function override_correction (line 279) | static void override_correction(...)
      function init_radio (line 283) | static void init_radio( bool encryption_possible )
      function configure_timer_for_1us (line 323) | static void configure_timer_for_1us( NRF_TIMER_Type& timer )
      function init_timer (line 337) | static void init_timer()
      function init_ppi (line 342) | static void init_ppi()
      function enable_interrupts (line 353) | static void enable_interrupts( void (*isr)( void* ), void* that )
      function frequency_from_channel (line 363) | static unsigned frequency_from_channel( unsigned channel )
      function config_phy (line 433) | static void config_phy( bool transmit_2mbit )
      function setup_long_distance_timer (line 591) | static void setup_long_distance_timer(
      function enable_radio_disabled_interrupt (line 644) | static void enable_radio_disabled_interrupt()
      type ccm_data_struct_t (line 831) | struct alignas( 4 ) ccm_data_struct_t {
      type scratch_area_t (line 835) | struct alignas( 4 ) scratch_area_t {
      function setup_ccm_data_structure (line 839) | static void setup_ccm_data_structure( const bluetoe::details::uint12...
      function clock_calibrate_isr (line 1157) | static void clock_calibrate_isr()
      function init_calibration_timer (line 1198) | void init_calibration_timer()
      function deassign_hfxo (line 1221) | void deassign_hfxo()
  function RADIO_IRQHandler (line 1250) | void RADIO_IRQHandler(void)
  function POWER_CLOCK_IRQHandler (line 1273) | void POWER_CLOCK_IRQHandler()
  function TIMER1_IRQHandler (line 1278) | void TIMER1_IRQHandler()

FILE: bluetoe/bindings/nordic/nrf52/security_tool_box.cpp
  type bluetoe (line 7) | namespace bluetoe
    type nrf52_details (line 11) | namespace nrf52_details
      function random_number8 (line 22) | static std::uint8_t random_number8()
      function random_number16 (line 34) | static std::uint16_t random_number16()
      function random_number32 (line 40) | std::uint32_t random_number32()
      function random_number64 (line 46) | std::uint64_t random_number64()
      function aes_le (line 58) | static bluetoe::details::uint128_t aes_le( const bluetoe::details::u...
      function aes_le (line 86) | bluetoe::details::uint128_t aes_le( const bluetoe::details::uint128_...
      function xor_ (line 91) | static bluetoe::details::uint128_t xor_( bluetoe::details::uint128_t...
      function xor_ (line 106) | static bluetoe::details::uint128_t xor_( bluetoe::details::uint128_t...
      function left_shift (line 214) | static bluetoe::details::uint128_t left_shift(const bluetoe::details...
      function aes_cmac_k1_subkey_generation (line 230) | static bluetoe::details::uint128_t aes_cmac_k1_subkey_generation( co...
      function aes_cmac_k2_subkey_generation (line 244) | static bluetoe::details::uint128_t aes_cmac_k2_subkey_generation( co...
      function f5_cmac (line 273) | static bluetoe::details::uint128_t f5_cmac(
      function f5_key (line 289) | static bluetoe::details::uint128_t f5_key( const bluetoe::details::e...

FILE: bluetoe/bindings/nordic/uECC/uECC.c
  type uECC_word_t (line 76) | typedef uint8_t uECC_word_t;
  type uECC_dword_t (line 77) | typedef uint16_t uECC_dword_t;
  type wordcount_t (line 78) | typedef uint8_t wordcount_t;
  type swordcount_t (line 79) | typedef int8_t swordcount_t;
  type bitcount_t (line 80) | typedef int16_t bitcount_t;
  type cmpresult_t (line 81) | typedef int8_t cmpresult_t;
  type uECC_word_t (line 205) | typedef uint32_t uECC_word_t;
  type uECC_dword_t (line 206) | typedef uint64_t uECC_dword_t;
  type wordcount_t (line 207) | typedef unsigned wordcount_t;
  type swordcount_t (line 208) | typedef int swordcount_t;
  type bitcount_t (line 209) | typedef int bitcount_t;
  type cmpresult_t (line 210) | typedef int cmpresult_t;
  type uECC_word_t (line 284) | typedef uint64_t uECC_word_t;
  type uECC_dword_t (line 286) | typedef unsigned __int128 uECC_dword_t;
  type wordcount_t (line 288) | typedef unsigned wordcount_t;
  type swordcount_t (line 289) | typedef int swordcount_t;
  type bitcount_t (line 290) | typedef int bitcount_t;
  type cmpresult_t (line 291) | typedef int cmpresult_t;
  type EccPoint (line 362) | typedef struct EccPoint {
  function default_RNG (line 412) | static int default_RNG(uint8_t *dest, unsigned size) {
  function default_RNG (line 435) | static int default_RNG(uint8_t *dest, unsigned size) {
  function default_RNG (line 462) | static int default_RNG(uint8_t *dest, unsigned size) {
  function uECC_set_rng (line 470) | void uECC_set_rng(uECC_RNG_Function rng_function) {
  function vli_clear (line 486) | static void vli_clear(uECC_word_t *vli) {
  function uECC_word_t (line 496) | static uECC_word_t vli_isZero(const uECC_word_t *vli) {
  function uECC_word_t (line 509) | static uECC_word_t vli_testBit(const uECC_word_t *vli, bitcount_t bit) {
  function wordcount_t (line 516) | static wordcount_t vli_numDigits(const uECC_word_t *vli, wordcount_t max...
  function bitcount_t (line 527) | static bitcount_t vli_numBits(const uECC_word_t *vli, wordcount_t max_wo...
  function vli_set (line 547) | static void vli_set(uECC_word_t *dest, const uECC_word_t *src) {
  function cmpresult_t (line 557) | static cmpresult_t vli_cmp(const uECC_word_t *left, const uECC_word_t *r...
  function cmpresult_t (line 570) | static cmpresult_t vli_equal(const uECC_word_t *left, const uECC_word_t ...
  function vli_rshift1 (line 581) | static void vli_rshift1(uECC_word_t *vli) {
  function uECC_word_t (line 596) | static uECC_word_t vli_add(uECC_word_t *result, const uECC_word_t *left,...
  function uECC_word_t (line 612) | static uECC_word_t vli_sub(uECC_word_t *result, const uECC_word_t *left,...
  function muladd (line 627) | static void muladd(uECC_word_t a,
  function vli_mult (line 670) | static void vli_mult(uECC_word_t *result, const uECC_word_t *left, const...
  function mul2add (line 702) | static void mul2add(uECC_word_t a,
  function vli_square (line 749) | static void vli_square(uECC_word_t *result, const uECC_word_t *left) {
  function vli_modAdd (line 785) | static void vli_modAdd(uECC_word_t *result,
  function vli_modSub (line 800) | static void vli_modSub(uECC_word_t *result,
  function vli_mmod_fast (line 827) | static void vli_mmod_fast(uECC_word_t *RESTRICT result, uECC_word_t *RES...
  function omega_mult (line 855) | static void omega_mult(uint8_t * RESTRICT result, const uint8_t * RESTRI...
  function omega_mult (line 872) | static void omega_mult(uint32_t * RESTRICT result, const uint32_t * REST...
  function vli_mmod_fast (line 895) | static void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT pr...
  function vli_mmod_fast (line 927) | static void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT ...
  function vli_mmod_fast (line 953) | static void vli_mmod_fast(uint64_t *RESTRICT result, uint64_t *RESTRICT ...
  function vli_mmod_fast (line 982) | static void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT pr...
  function vli_mmod_fast (line 1087) | static void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT ...
  function vli_mmod_fast (line 1185) | static void vli_mmod_fast(uint64_t *RESTRICT result, uint64_t *RESTRICT ...
  function omega_mult (line 1264) | static void omega_mult(uint8_t * RESTRICT result, const uint8_t * RESTRI...
  function omega_mult (line 1293) | static void omega_mult(uint32_t * RESTRICT result, const uint32_t * REST...
  function omega_mult (line 1308) | static void omega_mult(uint64_t * RESTRICT result, const uint64_t * REST...
  function vli_mmod_fast (line 1332) | void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT product) {
  function vli_mmod_fast (line 1387) | void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT product)
  function vli_modMult_fast (line 1443) | static void vli_modMult_fast(uECC_word_t *result,
  function vli_modSquare_fast (line 1454) | static void vli_modSquare_fast(uECC_word_t *result, const uECC_word_t *l...
  function vli_modInv (line 1472) | static void vli_modInv(uECC_word_t *result, const uECC_word_t *input, co...
  function cmpresult_t (line 1544) | static cmpresult_t EccPoint_isZero(const EccPoint *point) {
  function EccPoint_double_jacobian (line 1554) | static void EccPoint_double_jacobian(uECC_word_t * RESTRICT X1,
  function EccPoint_double_jacobian (line 1591) | static void EccPoint_double_jacobian(uECC_word_t * RESTRICT X1,
  function apply_z (line 1638) | static void apply_z(uECC_word_t * RESTRICT X1,
  function XYcZ_initial_double (line 1650) | static void XYcZ_initial_double(uECC_word_t * RESTRICT X1,
  function XYcZ_add (line 1675) | static void XYcZ_add(uECC_word_t * RESTRICT X1,
  function XYcZ_addC (line 1704) | static void XYcZ_addC(uECC_word_t * RESTRICT X1,
  function EccPoint_mult (line 1739) | static void EccPoint_mult(EccPoint * RESTRICT result,
  function EccPoint_compute_public_key (line 1781) | static int EccPoint_compute_public_key(EccPoint *result, uECC_word_t *pr...
  function mod_sqrt_secp224r1_rs (line 1819) | static void mod_sqrt_secp224r1_rs(uECC_word_t *d1,
  function mod_sqrt_secp224r1_rss (line 1837) | static void mod_sqrt_secp224r1_rss(uECC_word_t *d1,
  function mod_sqrt_secp224r1_rm (line 1855) | static void mod_sqrt_secp224r1_rm(uECC_word_t *d2,
  function mod_sqrt_secp224r1_rp (line 1881) | static void mod_sqrt_secp224r1_rp(uECC_word_t *d1,
  function mod_sqrt (line 1906) | static void mod_sqrt(uECC_word_t *a) {
  function mod_sqrt (line 1934) | static void mod_sqrt(uECC_word_t *a) {
  function vli_nativeToBytes (line 1954) | static void vli_nativeToBytes(uint8_t * RESTRICT dest, const uint8_t * R...
  function vli_nativeToBytes (line 1965) | static void vli_nativeToBytes(uint8_t *bytes, const uint32_t *native) {
  function vli_bytesToNative (line 1976) | static void vli_bytesToNative(uint32_t *native, const uint8_t *bytes) {
  function vli_nativeToBytes (line 1987) | static void vli_nativeToBytes(uint8_t *bytes, const uint64_t *native) {
  function vli_bytesToNative (line 2002) | static void vli_bytesToNative(uint64_t *native, const uint8_t *bytes) {
  function uECC_make_key (line 2015) | int uECC_make_key(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[...
  function uECC_shared_secret (line 2031) | int uECC_shared_secret(const uint8_t public_key[uECC_BYTES*2],
  function uECC_compress (line 2073) | void uECC_compress(const uint8_t public_key[uECC_BYTES*2], uint8_t compr...
  function curve_x_side (line 2082) | static void curve_x_side(uECC_word_t * RESTRICT result, const uECC_word_...
  function uECC_decompress (line 2097) | void uECC_decompress(const uint8_t compressed[uECC_BYTES+1], uint8_t pub...
  function uECC_valid_public_key (line 2111) | int uECC_valid_public_key(const uint8_t public_key[uECC_BYTES*2]) {
  function uECC_compute_public_key (line 2136) | int uECC_compute_public_key(const uint8_t private_key[uECC_BYTES],
  function uECC_bytes (line 2152) | int uECC_bytes(void) {
  function uECC_curve (line 2156) | int uECC_curve(void) {
  function vli_clear_n (line 2163) | static void vli_clear_n(uECC_word_t *vli) {
  function uECC_word_t (line 2168) | static uECC_word_t vli_isZero_n(const uECC_word_t *vli) {
  function vli_set_n (line 2175) | static void vli_set_n(uECC_word_t *dest, const uECC_word_t *src) {
  function cmpresult_t (line 2180) | static cmpresult_t vli_cmp_n(const uECC_word_t *left, const uECC_word_t ...
  function vli_rshift1_n (line 2189) | static void vli_rshift1_n(uECC_word_t *vli) {
  function uECC_word_t (line 2195) | static uECC_word_t vli_add_n(uECC_word_t *result,
  function uECC_word_t (line 2207) | static uECC_word_t vli_sub_n(uECC_word_t *result,
  function muladd (line 2220) | static void muladd(uECC_word_t a,
  function vli_mult_n (line 2235) | static void vli_mult_n(uECC_word_t *result, const uECC_word_t *left, con...
  function vli_modAdd_n (line 2255) | static void vli_modAdd_n(uECC_word_t *result,
  function vli_modInv_n (line 2265) | static void vli_modInv_n(uECC_word_t *result, const uECC_word_t *input, ...
  function vli2_rshift1_n (line 2333) | static void vli2_rshift1_n(uECC_word_t *vli) {
  function uECC_word_t (line 2339) | static uECC_word_t vli2_sub_n(uECC_word_t *result,
  function vli_modMult_n (line 2355) | static void vli_modMult_n(uECC_word_t *result, const uECC_word_t *left, ...
  function vli2_rshift1 (line 2386) | static void vli2_rshift1(uECC_word_t *vli) {
  function uECC_word_t (line 2392) | static uECC_word_t vli2_sub(uECC_word_t *result,
  function vli_modMult_n (line 2408) | static void vli_modMult_n(uECC_word_t *result, const uECC_word_t *left, ...
  function uECC_sign_with_k (line 2429) | static int uECC_sign_with_k(const uint8_t private_key[uECC_BYTES],
  function uECC_sign (line 2517) | int uECC_sign(const uint8_t private_key[uECC_BYTES],
  function HMAC_init (line 2538) | static void HMAC_init(uECC_HashContext *hash_context, const uint8_t *K) {
  function HMAC_update (line 2550) | static void HMAC_update(uECC_HashContext *hash_context,
  function HMAC_finish (line 2556) | static void HMAC_finish(uECC_HashContext *hash_context, const uint8_t *K...
  function update_V (line 2573) | static void update_V(uECC_HashContext *hash_context, uint8_t *K, uint8_t...
  function uECC_sign_deterministic (line 2585) | int uECC_sign_deterministic(const uint8_t private_key[uECC_BYTES],
  function bitcount_t (line 2647) | static bitcount_t smax(bitcount_t a, bitcount_t b) {
  function uECC_verify (line 2651) | int uECC_verify(const uint8_t public_key[uECC_BYTES*2],

FILE: bluetoe/bindings/nordic/uECC/uECC.h
  type uECC_HashContext (line 184) | typedef struct uECC_HashContext {

FILE: bluetoe/characteristic.hpp
  type bluetoe (line 25) | namespace bluetoe {
    type details (line 27) | namespace details {
      type characteristic_uuid_meta_type (line 28) | struct characteristic_uuid_meta_type {}
      type characteristic_declaration_parameter (line 30) | struct characteristic_declaration_parameter {}
      type characteristic_user_description_parameter (line 31) | struct characteristic_user_description_parameter {}
      type generate_characteristic_attributes (line 34) | struct generate_characteristic_attributes
      type count_characteristic_attributes (line 37) | struct count_characteristic_attributes
      type sum_by_attributes (line 40) | struct sum_by_attributes
      type sum_by_client_configs (line 43) | struct sum_by_client_configs
      type characteristic_or_service_uuid (line 252) | struct characteristic_or_service_uuid
      type generate_characteristic_attributes (line 530) | struct generate_characteristic_attributes : generate_attributes<
      type count_characteristic_attributes (line 547) | struct count_characteristic_attributes
      type sum_by_attributes (line 562) | struct sum_by_attributes
      type sum_by_client_configs (line 568) | struct sum_by_client_configs
    type characteristic_uuid (line 61) | struct characteristic_uuid : details::uuid< A, B, C, D, E >
      type meta_type (line 64) | struct meta_type :
    type characteristic_uuid16 (line 78) | struct characteristic_uuid16 : details::uuid16< UUID >
      type meta_type (line 81) | struct meta_type :
    class characteristic (line 159) | class characteristic
      type meta_type (line 172) | struct meta_type :
    type characteristic_name (line 226) | struct characteristic_name
      type meta_type (line 229) | struct meta_type :
    type details (line 250) | namespace details {
      type characteristic_uuid_meta_type (line 28) | struct characteristic_uuid_meta_type {}
      type characteristic_declaration_parameter (line 30) | struct characteristic_declaration_parameter {}
      type characteristic_user_description_parameter (line 31) | struct characteristic_user_description_parameter {}
      type generate_characteristic_attributes (line 34) | struct generate_characteristic_attributes
      type count_characteristic_attributes (line 37) | struct count_characteristic_attributes
      type sum_by_attributes (line 40) | struct sum_by_attributes
      type sum_by_client_configs (line 43) | struct sum_by_client_configs
      type characteristic_or_service_uuid (line 252) | struct characteristic_or_service_uuid
      type generate_characteristic_attributes (line 530) | struct generate_characteristic_attributes : generate_attributes<
      type count_characteristic_attributes (line 547) | struct count_characteristic_attributes
      type sum_by_attributes (line 562) | struct sum_by_attributes
      type sum_by_client_configs (line 568) | struct sum_by_client_configs
  type generate_attribute< std::tuple< characteristic_declaration_parameter, AttrOptions... >, CCCDIndices, ClientCharacteristicIndex, service< ServiceOptions...>, Server, Options... > (line 269) | struct generate_attribute< std::tuple< characteristic_declaration_parame...
    method fixup_auto_uuid (line 275) | static void fixup_auto_uuid( details::attribute_access_arguments& args )
    method char_declaration_access (line 298) | static details::attribute_access_result char_declaration_access( detai...
  type generate_attribute< std::tuple< characteristic_value_declaration_parameter, AttrOptions... >, CCCDIndices, ClientCharacteristicIndex, Service, Server, Options... > (line 353) | struct generate_attribute< std::tuple< characteristic_value_declaration_...
  type generate_attribute< std::tuple< characteristic_user_description_parameter, characteristic_name< Name > >, CCCDIndices, ClientCharacteristicIndex, Service, Server, Options... > (line 375) | struct generate_attribute< std::tuple< characteristic_user_description_p...
    method access (line 379) | static details::attribute_access_result access( attribute_access_argum...
  type generate_attribute< std::tuple< client_characteristic_configuration_parameter, AttrOptions... >, CCCDIndices, ClientCharacteristicIndex, Service, Server, Options... > (line 414) | struct generate_attribute< std::tuple< client_characteristic_configurati...
    method access (line 422) | static details::attribute_access_result access( attribute_access_argum...
  type generate_attribute< std::tuple< descriptor_parameter, descriptor< UUID, Value, Size > >, CCCDIndices, ClientCharacteristicIndex, Service, Server, Options... > (line 501) | struct generate_attribute< std::tuple< descriptor_parameter, descriptor<...
    method access (line 505) | static details::attribute_access_result access( attribute_access_argum...

FILE: bluetoe/characteristic_value.hpp
  type bluetoe (line 12) | namespace bluetoe {
    type details (line 14) | namespace details {
      type characteristic_value_meta_type (line 16) | struct characteristic_value_meta_type {}
      type characteristic_parameter_meta_type (line 18) | struct characteristic_parameter_meta_type {}
      type characteristic_value_read_handler_meta_type (line 20) | struct characteristic_value_read_handler_meta_type {}
      type characteristic_value_write_handler_meta_type (line 22) | struct characteristic_value_write_handler_meta_type {}
      type characteristic_value_declaration_parameter (line 24) | struct characteristic_value_declaration_parameter {}
      type client_characteristic_configuration_parameter (line 25) | struct client_characteristic_configuration_parameter {}
      type characteristic_subscription_call_back_meta_type (line 26) | struct characteristic_subscription_call_back_meta_type {}
      type encryption_requirements (line 217) | struct encryption_requirements
      type encryption_requirements< false > (line 220) | struct encryption_requirements< false > {
        method attribute_access_result (line 221) | static attribute_access_result check( const connection_security_at...
      type encryption_requirements< true > (line 227) | struct encryption_requirements< true > {
        method attribute_access_result (line 228) | static attribute_access_result check( const connection_security_at...
      type value_impl_base (line 243) | struct value_impl_base
      type invoke_read_handler (line 527) | struct invoke_read_handler {
        method call_read_handler (line 529) | static constexpr std::uint8_t call_read_handler( std::size_t offse...
      type invoke_read_handler< no_such_type > (line 536) | struct invoke_read_handler< no_such_type > {
        method call_read_handler (line 538) | static constexpr std::uint8_t call_read_handler( std::size_t, std:...
      type invoke_write_handler (line 545) | struct invoke_write_handler {
        method call_write_handler (line 547) | static constexpr std::uint8_t call_write_handler( std::size_t offs...
      type invoke_write_handler< no_such_type > (line 554) | struct invoke_write_handler< no_such_type > {
        method call_write_handler (line 556) | static constexpr std::uint8_t call_write_handler( std::size_t, std...
      type value_handler_base (line 562) | struct value_handler_base {
        class value_impl (line 565) | class value_impl : public details::value_impl_base< Options... >
          method attribute_access_result (line 588) | static attribute_access_result characteristic_value_access( attr...
          method is_this (line 611) | static constexpr bool is_this( const void* /* value */ )
        type meta_type (line 617) | struct meta_type :
      function deserialize (line 624) | inline std::pair< std::uint8_t, T > deserialize( std::size_t write_s...
      function deserialize (line 642) | inline std::pair< std::uint8_t, bool > deserialize( std::size_t writ...
    type no_read_access (line 47) | struct no_read_access {
    type no_write_access (line 69) | struct no_write_access {
    type notify (line 89) | struct notify {
      type meta_type (line 91) | struct meta_type :
    type indicate (line 110) | struct indicate {
      type meta_type (line 112) | struct meta_type :
    type notify_on_subscription (line 127) | struct notify_on_subscription {
      method on_subscription (line 130) | static void on_subscription( std::uint16_t flags, Server& srv )
      type meta_type (line 136) | struct meta_type :
    type indicate_on_subscription (line 151) | struct indicate_on_subscription {
      method on_subscription (line 154) | static void on_subscription( std::uint16_t flags, Server& srv )
      type meta_type (line 160) | struct meta_type :
    type default_on_characteristic_subscription (line 168) | struct default_on_characteristic_subscription {
      method on_subscription (line 170) | static void on_subscription( std::uint16_t, Server& ) {}
      type meta_type (line 172) | struct meta_type :
    type write_without_response (line 190) | struct write_without_response {
      type meta_type (line 192) | struct meta_type :
    type only_write_without_response (line 207) | struct only_write_without_response {
      type meta_type (line 209) | struct meta_type :
    type details (line 215) | namespace details {
      type characteristic_value_meta_type (line 16) | struct characteristic_value_meta_type {}
      type characteristic_parameter_meta_type (line 18) | struct characteristic_parameter_meta_type {}
      type characteristic_value_read_handler_meta_type (line 20) | struct characteristic_value_read_handler_meta_type {}
      type characteristic_value_write_handler_meta_type (line 22) | struct characteristic_value_write_handler_meta_type {}
      type characteristic_value_declaration_parameter (line 24) | struct characteristic_value_declaration_parameter {}
      type client_characteristic_configuration_parameter (line 25) | struct client_characteristic_configuration_parameter {}
      type characteristic_subscription_call_back_meta_type (line 26) | struct characteristic_subscription_call_back_meta_type {}
      type encryption_requirements (line 217) | struct encryption_requirements
      type encryption_requirements< false > (line 220) | struct encryption_requirements< false > {
        method attribute_access_result (line 221) | static attribute_access_result check( const connection_security_at...
      type encryption_requirements< true > (line 227) | struct encryption_requirements< true > {
        method attribute_access_result (line 228) | static attribute_access_result check( const connection_security_at...
      type value_impl_base (line 243) | struct value_impl_base
      type invoke_read_handler (line 527) | struct invoke_read_handler {
        method call_read_handler (line 529) | static constexpr std::uint8_t call_read_handler( std::size_t offse...
      type invoke_read_handler< no_such_type > (line 536) | struct invoke_read_handler< no_such_type > {
        method call_read_handler (line 538) | static constexpr std::uint8_t call_read_handler( std::size_t, std:...
      type invoke_write_handler (line 545) | struct invoke_write_handler {
        method call_write_handler (line 547) | static constexpr std::uint8_t call_write_handler( std::size_t offs...
      type invoke_write_handler< no_such_type > (line 554) | struct invoke_write_handler< no_such_type > {
        method call_write_handler (line 556) | static constexpr std::uint8_t call_write_handler( std::size_t, std...
      type value_handler_base (line 562) | struct value_handler_base {
        class value_impl (line 565) | class value_impl : public details::value_impl_base< Options... >
          method attribute_access_result (line 588) | static attribute_access_result characteristic_value_access( attr...
          method is_this (line 611) | static constexpr bool is_this( const void* /* value */ )
        type meta_type (line 617) | struct meta_type :
      function deserialize (line 624) | inline std::pair< std::uint8_t, T > deserialize( std::size_t write_s...
      function deserialize (line 642) | inline std::pair< std::uint8_t, bool > deserialize( std::size_t writ...
    class bind_characteristic_value (line 253) | class bind_characteristic_value
      class value_impl (line 261) | class value_impl : public details::value_impl_base< Options... >
        method characteristic_value_access (line 271) | static details::attribute_access_result characteristic_value_acces...
        method is_this (line 293) | static constexpr bool is_this( const void* value )
        method characteristic_value_read_access (line 299) | static constexpr details::attribute_access_result characteristic_v...
        method characteristic_value_read_access (line 304) | static constexpr details::attribute_access_result characteristic_v...
        method characteristic_value_write_access (line 309) | static details::attribute_access_result characteristic_value_write...
        method characteristic_value_write_access (line 325) | static constexpr details::attribute_access_result characteristic_v...
      type meta_type (line 332) | struct meta_type :
    type fixed_value (line 345) | struct fixed_value {
      class value_impl (line 350) | class value_impl : public details::value_impl_base< Options... >
        method characteristic_value_access (line 360) | static details::attribute_access_result characteristic_value_acces...
        method is_this (line 386) | static constexpr bool is_this( const void* )
      type meta_type (line 392) | struct meta_type :
    type cstring_wrapper (line 428) | struct cstring_wrapper
      class value_impl (line 434) | class value_impl : public details::value_impl_base< Options... >
        method characteristic_value_access (line 444) | static details::attribute_access_result characteristic_value_acces...
        method is_this (line 468) | static constexpr bool is_this( const void* )
      type meta_type (line 475) | struct meta_type :
    type cstring_value (line 486) | struct cstring_value : cstring_wrapper< cstring_value< Name > >
      method size (line 496) | static constexpr std::size_t size()
    type fixed_blob_value (line 510) | struct fixed_blob_value : cstring_wrapper< fixed_blob_value< Value, Si...
      method size (line 518) | static constexpr std::size_t size()
    type details (line 525) | namespace details {
      type characteristic_value_meta_type (line 16) | struct characteristic_value_meta_type {}
      type characteristic_parameter_meta_type (line 18) | struct characteristic_parameter_meta_type {}
      type characteristic_value_read_handler_meta_type (line 20) | struct characteristic_value_read_handler_meta_type {}
      type characteristic_value_write_handler_meta_type (line 22) | struct characteristic_value_write_handler_meta_type {}
      type characteristic_value_declaration_parameter (line 24) | struct characteristic_value_declaration_parameter {}
      type client_characteristic_configuration_parameter (line 25) | struct client_characteristic_configuration_parameter {}
      type characteristic_subscription_call_back_meta_type (line 26) | struct characteristic_subscription_call_back_meta_type {}
      type encryption_requirements (line 217) | struct encryption_requirements
      type encryption_requirements< false > (line 220) | struct encryption_requirements< false > {
        method attribute_access_result (line 221) | static attribute_access_result check( const connection_security_at...
      type encryption_requirements< true > (line 227) | struct encryption_requirements< true > {
        method attribute_access_result (line 228) | static attribute_access_result check( const connection_security_at...
      type value_impl_base (line 243) | struct value_impl_base
      type invoke_read_handler (line 527) | struct invoke_read_handler {
        method call_read_handler (line 529) | static constexpr std::uint8_t call_read_handler( std::size_t offse...
      type invoke_read_handler< no_such_type > (line 536) | struct invoke_read_handler< no_such_type > {
        method call_read_handler (line 538) | static constexpr std::uint8_t call_read_handler( std::size_t, std:...
      type invoke_write_handler (line 545) | struct invoke_write_handler {
        method call_write_handler (line 547) | static constexpr std::uint8_t call_write_handler( std::size_t offs...
      type invoke_write_handler< no_such_type > (line 554) | struct invoke_write_handler< no_such_type > {
        method call_write_handler (line 556) | static constexpr std::uint8_t call_write_handler( std::size_t, std...
      type value_handler_base (line 562) | struct value_handler_base {
        class value_impl (line 565) | class value_impl : public details::value_impl_base< Options... >
          method attribute_access_result (line 588) | static attribute_access_result characteristic_value_access( attr...
          method is_this (line 611) | static constexpr bool is_this( const void* /* value */ )
        type meta_type (line 617) | struct meta_type :
      function deserialize (line 624) | inline std::pair< std::uint8_t, T > deserialize( std::size_t write_s...
      function deserialize (line 642) | inline std::pair< std::uint8_t, bool > deserialize( std::size_t writ...
    type free_read_blob_handler (line 691) | struct free_read_blob_handler : details::value_handler_base
      method call_read_handler (line 695) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 700) | struct meta_type : details::value_handler_base::meta_type, details::...
    type free_read_handler (line 734) | struct free_read_handler : details::value_handler_base
      method call_read_handler (line 738) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 745) | struct meta_type : details::value_handler_base::meta_type, details::...
    type free_write_blob_handler (line 777) | struct free_write_blob_handler : details::value_handler_base
      method call_write_handler (line 781) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 786) | struct meta_type : details::value_handler_base::meta_type, details::...
    type free_raw_write_handler (line 814) | struct free_raw_write_handler : details::value_handler_base
      method call_write_handler (line 818) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 825) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_blob_handler (line 830) | struct read_blob_handler : details::value_handler_base
      method call_read_handler (line 834) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 839) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_blob_handler_c (line 844) | struct read_blob_handler_c : details::value_handler_base
      method call_read_handler (line 848) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 853) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_blob_handler_v (line 858) | struct read_blob_handler_v : details::value_handler_base
      method call_read_handler (line 862) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 867) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_blob_handler_cv (line 872) | struct read_blob_handler_cv : details::value_handler_base
      method call_read_handler (line 876) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 881) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_handler (line 886) | struct read_handler : details::value_handler_base
      method call_read_handler (line 890) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 897) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_handler_c (line 902) | struct read_handler_c : details::value_handler_base
      method call_read_handler (line 906) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 913) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_handler_v (line 918) | struct read_handler_v : details::value_handler_base
      method call_read_handler (line 922) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 929) | struct meta_type : details::value_handler_base::meta_type, details::...
    type read_handler_cv (line 934) | struct read_handler_cv : details::value_handler_base
      method call_read_handler (line 938) | static constexpr std::uint8_t call_read_handler( std::size_t offset,...
      type meta_type (line 945) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_blob_handler (line 950) | struct write_blob_handler : details::value_handler_base
      method call_write_handler (line 954) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 959) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_blob_handler_c (line 964) | struct write_blob_handler_c : details::value_handler_base
      method call_write_handler (line 968) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 973) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_blob_handler_v (line 978) | struct write_blob_handler_v : details::value_handler_base
      method call_write_handler (line 982) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 987) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_blob_handler_cv (line 992) | struct write_blob_handler_cv : details::value_handler_base
      method call_write_handler (line 996) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 1001) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_handler (line 1006) | struct write_handler : details::value_handler_base
      method call_write_handler (line 1010) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 1017) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_handler_c (line 1022) | struct write_handler_c : details::value_handler_base
      method call_write_handler (line 1026) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 1033) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_handler_v (line 1038) | struct write_handler_v : details::value_handler_base
      method call_write_handler (line 1042) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1049) | struct meta_type : details::value_handler_base::meta_type, details::...
    type write_handler_cv (line 1054) | struct write_handler_cv : details::value_handler_base
      method call_write_handler (line 1058) | static constexpr std::uint8_t call_write_handler( std::size_t offset...
      type meta_type (line 1065) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_read_handler (line 1070) | struct mixin_read_handler : details::value_handler_base
      method call_read_handler (line 1074) | static std::uint8_t call_read_handler( std::size_t offset, std::size...
      type meta_type (line 1087) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_write_handler (line 1092) | struct mixin_write_handler : details::value_handler_base
      method call_write_handler (line 1096) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1108) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_read_blob_handler (line 1113) | struct mixin_read_blob_handler : details::value_handler_base
      method call_read_handler (line 1117) | static std::uint8_t call_read_handler( std::size_t offset, std::size...
      type meta_type (line 1126) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_write_blob_handler (line 1131) | struct mixin_write_blob_handler : details::value_handler_base
      method call_write_handler (line 1135) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1144) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_write_indication_control_point_handler (line 1158) | struct mixin_write_indication_control_point_handler : details::value_h...
      method call_write_handler (line 1162) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1186) | struct meta_type : details::value_handler_base::meta_type, details::...
    type mixin_write_notification_control_point_handler (line 1197) | struct mixin_write_notification_control_point_handler : details::value...
      method call_write_handler (line 1201) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1225) | struct meta_type : details::value_handler_base::meta_type, details::...
    type free_write_handler (line 1252) | struct free_write_handler : details::value_handler_base
      method call_write_handler (line 1256) | static std::uint8_t call_write_handler( std::size_t offset, std::siz...
      type meta_type (line 1269) | struct meta_type : details::value_handler_base::meta_type, details::...

FILE: bluetoe/custom_advertising.hpp
  type bluetoe (line 10) | namespace bluetoe {
    type custom_advertising_data (line 16) | struct custom_advertising_data
      method advertising_data_dirty (line 19) | constexpr bool advertising_data_dirty() const
      method advertising_data (line 24) | std::size_t advertising_data( std::uint8_t* begin, std::size_t buffe...
      type meta_type (line 32) | struct meta_type :
    type auto_advertising_data (line 38) | struct auto_advertising_data
      method advertising_data_dirty (line 41) | constexpr bool advertising_data_dirty() const
      type meta_type (line 46) | struct meta_type :
    type runtime_custom_advertising_data (line 58) | struct runtime_custom_advertising_data
      method set_runtime_custom_advertising_data (line 66) | void set_runtime_custom_advertising_data( const std::uint8_t* begin,...
      method runtime_custom_advertising_data (line 75) | runtime_custom_advertising_data()
      method advertising_data_dirty (line 81) | bool advertising_data_dirty()
      method advertising_data (line 89) | std::size_t advertising_data( std::uint8_t* begin, std::size_t buffe...
      type meta_type (line 97) | struct meta_type :
    type custom_scan_response_data (line 116) | struct custom_scan_response_data
      method scan_response_data_dirty (line 119) | constexpr bool scan_response_data_dirty() const
      method scan_response_data (line 124) | std::size_t scan_response_data( std::uint8_t* begin, std::size_t buf...
      type meta_type (line 132) | struct meta_type :
    type auto_scan_response_data (line 147) | struct auto_scan_response_data
      method scan_response_data_dirty (line 150) | constexpr bool scan_response_data_dirty() const
      type meta_type (line 155) | struct meta_type :
    type runtime_custom_scan_response_data (line 167) | struct runtime_custom_scan_response_data
      method set_runtime_custom_scan_response_data (line 175) | void set_runtime_custom_scan_response_data( const std::uint8_t* begi...
      method runtime_custom_scan_response_data (line 184) | runtime_custom_scan_response_data()
      method scan_response_data (line 190) | std::size_t scan_response_data( std::uint8_t* begin, std::size_t buf...
      method scan_response_data_dirty (line 198) | bool scan_response_data_dirty()
      type meta_type (line 206) | struct meta_type :

FILE: bluetoe/descriptor.hpp
  type bluetoe (line 8) | namespace bluetoe {
    type details (line 10) | namespace details {
      type descriptor_parameter (line 11) | struct descriptor_parameter {}
    type descriptor (line 21) | struct descriptor
      type meta_type (line 24) | struct meta_type : details::descriptor_parameter, details::valid_cha...

FILE: bluetoe/encryption.hpp
  type bluetoe (line 7) | namespace bluetoe {
    class server (line 10) | class server
    class service (line 13) | class service
    class characteristic (line 16) | class characteristic
    type details (line 18) | namespace details {
      type requires_encryption_meta_type (line 19) | struct requires_encryption_meta_type {}
      type no_encryption_required_meta_type (line 20) | struct no_encryption_required_meta_type {}
      type may_require_encryption_meta_type (line 21) | struct may_require_encryption_meta_type {}
      type requires_encryption_support_t (line 136) | struct requires_encryption_support_t
      type encryption_default (line 158) | struct encryption_default
      type characteristic_requires_encryption (line 210) | struct characteristic_requires_encryption
    type requires_encryption (line 75) | struct requires_encryption {
      type meta_type (line 77) | struct meta_type :
    type no_encryption_required (line 97) | struct no_encryption_required {
      type meta_type (line 99) | struct meta_type :
    type may_require_encryption (line 123) | struct may_require_encryption {
      type meta_type (line 125) | struct meta_type :
    type details (line 133) | namespace details {
      type requires_encryption_meta_type (line 19) | struct requires_encryption_meta_type {}
      type no_encryption_required_meta_type (line 20) | struct no_encryption_required_meta_type {}
      type may_require_encryption_meta_type (line 21) | struct may_require_encryption_meta_type {}
      type requires_encryption_support_t (line 136) | struct requires_encryption_support_t
      type encryption_default (line 158) | struct encryption_default
      type characteristic_requires_encryption (line 210) | struct characteristic_requires_encryption
  type requires_encryption_support_t< std::tuple< T, Options... >, false > (line 142) | struct requires_encryption_support_t< std::tuple< T, Options... >, false >
  type requires_encryption_support_t< std::tuple< T, Options... >, true > (line 150) | struct requires_encryption_support_t< std::tuple< T, Options... >, true >
  type requires_encryption_support_t< bluetoe::server< Options... >, Default > (line 184) | struct requires_encryption_support_t< bluetoe::server< Options... >, Def...
  type requires_encryption_support_t< bluetoe::service< Options... >, Default > (line 194) | struct requires_encryption_support_t< bluetoe::service< Options... >, De...
  type requires_encryption_support_t< bluetoe::characteristic< Options... >, Default > (line 204) | struct requires_encryption_support_t< bluetoe::characteristic< Options.....
  type characteristic_requires_encryption<
            bluetoe::characteristic< CharacteristicOptions... >,
            bluetoe::service< ServiceOptions... >,
            bluetoe::server< ServerOptions... > > (line 213) | struct characteristic_requires_encryption<

FILE: bluetoe/filter.hpp
  type bluetoe (line 11) | namespace bluetoe {
    type details (line 12) | namespace details {
      class uuid_filter (line 17) | class uuid_filter
        method uuid_filter (line 26) | uuid_filter( const std::uint8_t* bytes, bool is_128bit )
        method representable_as_16bit_uuid (line 59) | static bool representable_as_16bit_uuid( const std::uint8_t* bytes )
      type uuid16_filter (line 79) | struct uuid16_filter
      type uuid16_filter< uuid16< UUID, Check > > (line 82) | struct uuid16_filter< uuid16< UUID, Check > >
      type all_uuid_filter (line 93) | struct all_uuid_filter

FILE: bluetoe/find_notification_data.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type details (line 7) | namespace details {
      type impl (line 9) | namespace impl {
        type filter_characteristics_with_cccd (line 11) | struct filter_characteristics_with_cccd
        type characteristic_with_service_attribute_offset (line 21) | struct characteristic_with_service_attribute_offset
        type preudo_first_char (line 28) | struct preudo_first_char
        type characteristic_index_pair (line 34) | struct characteristic_index_pair
        type add_index_to_characteristic (line 42) | struct add_index_to_characteristic
        type attribute_at (line 54) | struct attribute_at
          method attribute_at (line 56) | constexpr attribute_at( std::size_t& r, std::size_t i )
          method each (line 62) | void each()
        type order_by_prio (line 77) | struct order_by_prio
        type add_cccd_position (line 83) | struct add_cccd_position
          type with_cccd_position (line 86) | struct with_cccd_position : HandlePair
        type add_cccd_handle (line 100) | struct add_cccd_handle
          type with_cccd_handle (line 103) | struct with_cccd_handle : HandlePair
        type select_cccd_position (line 117) | struct select_cccd_position {
      type find_notification_data_in_list (line 127) | struct find_notification_data_in_list
        type characteristics_from_service (line 130) | struct characteristics_from_service
          type add_service_offset (line 133) | struct add_service_offset
        method notification_data (line 159) | static notification_data find_notification_data_by_index( std::siz...
        type attribute_value (line 167) | struct attribute_value
          method attribute_value (line 169) | constexpr attribute_value( notification_data& r, const void* v )
          method each (line 176) | void each()
        method notification_data (line 189) | static notification_data find_notification_data( const void* value )
      type find_notification_by_uuid (line 205) | struct find_notification_by_uuid
        type equal_char (line 210) | struct equal_char
        method notification_data (line 219) | static notification_data data()
  type add_service_offset< std::tuple< C, Cs... > > (line 141) | struct add_service_offset< std::tuple< C, Cs... > >

FILE: bluetoe/gap_service.hpp
  type bluetoe (line 9) | namespace bluetoe {
    type details (line 11) | namespace details {
      type gap_service_definition_meta_type (line 12) | struct gap_service_definition_meta_type {}
      type check_gap_service_for_gatt_servers_parameter (line 15) | struct check_gap_service_for_gatt_servers_parameter
    type no_gap_service_for_gatt_servers (line 28) | struct no_gap_service_for_gatt_servers {
      type meta_type (line 30) | struct meta_type :
      type add_service (line 35) | struct add_service {
    type gap_service_for_gatt_servers (line 50) | struct gap_service_for_gatt_servers
      type meta_type (line 53) | struct meta_type :
      type add_service (line 72) | struct add_service {

FILE: bluetoe/gatt_options.hpp
  type bluetoe (line 9) | namespace bluetoe {
    type details (line 11) | namespace details {
      type mtu_size_meta_type (line 12) | struct mtu_size_meta_type {}
      type cccd_callback_meta_type (line 13) | struct cccd_callback_meta_type {}
    type max_mtu_size (line 24) | struct max_mtu_size {
      type meta_type (line 26) | struct meta_type :
    type client_characteristic_configuration_update_callback (line 48) | struct client_characteristic_configuration_update_callback
      type meta_type (line 51) | struct meta_type :
      method client_characteristic_configuration_updated (line 56) | static void client_characteristic_configuration_updated( Server& srv...
    type no_client_characteristic_configuration_update_callback (line 64) | struct no_client_characteristic_configuration_update_callback
      type meta_type (line 66) | struct meta_type :
      method client_characteristic_configuration_updated (line 71) | static void client_characteristic_configuration_updated( Server&, co...

FILE: bluetoe/hci/include/bluetoe/link_layer.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type hci (line 7) | namespace hci {
      class link_layer (line 18) | class link_layer : Transport< link_layer< Server, Transport, Options...

FILE: bluetoe/l2cap.hpp
  type bluetoe (line 21) | namespace bluetoe {
    type details (line 23) | namespace details {
      class l2cap_channel (line 29) | class l2cap_channel
      type maximum_min_channel_mtu_size (line 47) | struct maximum_min_channel_mtu_size
      type maximum_max_channel_mtu_size (line 58) | struct maximum_max_channel_mtu_size
      type add_channel_data (line 69) | struct add_channel_data
      class l2cap (line 97) | class l2cap : public derive_from< std::tuple< Channels... > >
        type l2cap_input_handler (line 143) | struct l2cap_input_handler
          method l2cap_input_handler (line 145) | l2cap_input_handler( l2cap* t, std::uint16_t ci, const std::uint...
          method each (line 158) | void each()
        class l2cap_output_handler (line 178) | class l2cap_output_handler
          method l2cap_output_handler (line 181) | l2cap_output_handler( l2cap* t, std::uint8_t* out, std::size_t s...
          method each (line 191) | void each()
        method LinkLayer (line 209) | LinkLayer& link_layer()

FILE: bluetoe/l2cap_channels.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type l2cap_channel_ids (line 6) | namespace l2cap_channel_ids {
      type l2cap_channel_ids (line 10) | enum l2cap_channel_ids : std::uint16_t {

FILE: bluetoe/link_layer/channel_map.cpp
  type bluetoe (line 4) | namespace bluetoe {
    type link_layer (line 5) | namespace link_layer {
      function in_map (line 12) | static bool in_map( const std::uint8_t* map, unsigned index )

FILE: bluetoe/link_layer/connection_details.cpp
  type bluetoe (line 3) | namespace bluetoe {
    type link_layer (line 4) | namespace link_layer {
      function channel_map (line 18) | const channel_map& connection_details::channels() const
      function device_address (line 50) | const device_address& connection_addresses::remote_address() const
      function device_address (line 55) | const device_address& connection_addresses::local_address() const

FILE: bluetoe/link_layer/delta_time.cpp
  type bluetoe (line 5) | namespace bluetoe {
    type link_layer (line 6) | namespace link_layer {
      function delta_time (line 8) | delta_time delta_time::usec( std::uint32_t usec )
      function delta_time (line 13) | delta_time delta_time::msec( std::uint32_t msec )
      function delta_time (line 21) | delta_time delta_time::seconds( int s )
      function delta_time (line 26) | delta_time delta_time::now()
      function delta_time (line 39) | delta_time& delta_time::operator+=( const delta_time& rhs )
      function delta_time (line 49) | delta_time& delta_time::operator-=( const delta_time& rhs )
      function delta_time (line 59) | delta_time& delta_time::operator*=( unsigned rhs )
      function delta_time (line 130) | delta_time delta_time::ppm( unsigned part ) const
      function delta_time (line 147) | delta_time operator+( delta_time lhs, delta_time rhs )
      function delta_time (line 153) | delta_time operator-( delta_time lhs, delta_time rhs )
      function delta_time (line 159) | delta_time operator*( delta_time lhs, unsigned rhs )
      function delta_time (line 165) | delta_time operator*( unsigned lhs, delta_time rhs )

FILE: bluetoe/link_layer/include/bluetoe/advertising.hpp
  type bluetoe (line 21) | namespace bluetoe {
    type link_layer (line 22) | namespace link_layer {
      type details (line 24) | namespace details {
        type advertising_type_meta_type (line 25) | struct advertising_type_meta_type {}
        type advertising_startup_meta_type (line 26) | struct advertising_startup_meta_type {}
        type advertising_interval_meta_type (line 27) | struct advertising_interval_meta_type {}
        type advertising_channel_map_meta_type (line 28) | struct advertising_channel_map_meta_type {}
        type check_advertising_interval_parameter (line 31) | struct check_advertising_interval_parameter {
        type advertising_type_base (line 38) | struct advertising_type_base {
          method is_valid_scan_request (line 57) | static bool is_valid_scan_request( const read_buffer& receive, c...
          method is_valid_connect_request (line 79) | static bool is_valid_connect_request( const read_buffer& receive...
          method fill_empty_scan_response_data (line 100) | static std::size_t fill_empty_scan_response_data( const device_a...
        type advertising_channel_map_base (line 872) | struct advertising_channel_map_base {
        class advertiser (line 1015) | class advertiser
        type advertiser_base_base (line 1017) | struct advertiser_base_base
        class advertiser_base (line 1024) | class advertiser_base :
          method read_buffer (line 1040) | read_buffer advertising_buffer()
          method read_buffer (line 1049) | read_buffer scan_response_buffer()
          method read_buffer (line 1059) | read_buffer advertising_receive_buffer()
          method maximum_required_advertising_buffer (line 1070) | static constexpr std::size_t maximum_required_advertising_buffer()
          method advertiser_base (line 1080) | advertiser_base()
          method delta_time (line 1085) | delta_time next_adv_event()
          method LinkLayer (line 1095) | LinkLayer& base_link_layer()
        type start_stop_implementation (line 1107) | struct start_stop_implementation :
        class multipl_advertiser_base (line 1215) | class multipl_advertiser_base
        class multipl_advertiser_base< LinkLayer, Options, Advertiser > (line 1218) | class multipl_advertiser_base< LinkLayer, Options, Advertiser >
          method read_buffer (line 1221) | read_buffer fill_advertising_data( unsigned )
          method read_buffer (line 1226) | read_buffer get_advertising_data( unsigned )
          method read_buffer (line 1231) | read_buffer get_scan_response_data( unsigned )
          method is_valid_scan_request (line 1236) | bool is_valid_scan_request( const read_buffer&, unsigned ) const
          method is_valid_connect_request (line 1241) | bool is_valid_connect_request( const read_buffer&, unsigned ) const
      class connectable_undirected_advertising (line 146) | class connectable_undirected_advertising
        type meta_type (line 164) | struct meta_type :
        class impl (line 169) | class impl : protected details::advertising_type_base
          method read_buffer (line 172) | read_buffer fill_advertising_data()
          method read_buffer (line 201) | read_buffer get_advertising_data()
          method read_buffer (line 206) | read_buffer get_scan_response_data()
          method is_valid_scan_request (line 211) | bool is_valid_scan_request( const read_buffer& receive ) const
          method is_valid_connect_request (line 217) | bool is_valid_connect_request( const read_buffer& receive ) const
          method fill_scan_response_data (line 227) | void fill_scan_response_data()
          method LinkLayer (line 251) | LinkLayer& link_layer()
          method LinkLayer (line 256) | const LinkLayer& link_layer() const
          method Advertiser (line 261) | Advertiser& advertiser()
      class connectable_directed_advertising (line 284) | class connectable_directed_advertising
        type meta_type (line 310) | struct meta_type :
        class impl (line 315) | class impl : protected details::advertising_type_base
          method directed_advertising_address (line 318) | void directed_advertising_address( const device_address& addr )
          method impl (line 331) | impl()
          method read_buffer (line 337) | read_buffer fill_advertising_data()
          method read_buffer (line 370) | read_buffer get_advertising_data()
          method read_buffer (line 375) | read_buffer get_scan_response_data() const
          method is_valid_scan_request (line 380) | bool is_valid_scan_request( const read_buffer& ) const
          method is_valid_connect_request (line 385) | bool is_valid_connect_request( const read_buffer& receive ) const
          method LinkLayer (line 403) | LinkLayer& link_layer()
          method LinkLayer (line 408) | const LinkLayer& link_layer() const
          method Advertiser (line 413) | Advertiser& advertiser()
      type scannable_undirected_advertising (line 432) | struct scannable_undirected_advertising
        type meta_type (line 449) | struct meta_type :
        class impl (line 454) | class impl : protected details::advertising_type_base
          method read_buffer (line 458) | read_buffer fill_advertising_data()
          method read_buffer (line 486) | read_buffer get_advertising_data()
          method read_buffer (line 491) | read_buffer get_scan_response_data()
          method is_valid_scan_request (line 496) | bool is_valid_scan_request( const read_buffer& receive ) const
          method is_valid_connect_request (line 501) | bool is_valid_connect_request( const read_buffer& ) const
          method fill_scan_response_data (line 510) | void fill_scan_response_data()
          method LinkLayer (line 518) | LinkLayer& link_layer()
          method LinkLayer (line 523) | const LinkLayer& link_layer() const
          method Advertiser (line 528) | Advertiser& advertiser()
      type non_connectable_undirected_advertising (line 546) | struct non_connectable_undirected_advertising
        type meta_type (line 563) | struct meta_type :
        class impl (line 568) | class impl : protected details::advertising_type_base
          method read_buffer (line 571) | read_buffer fill_advertising_data()
          method read_buffer (line 598) | read_buffer get_advertising_data()
          method read_buffer (line 603) | read_buffer get_scan_response_data() const
          method is_valid_scan_request (line 608) | bool is_valid_scan_request( const read_buffer& ) const
          method is_valid_connect_request (line 613) | bool is_valid_connect_request( const read_buffer& ) const
          method LinkLayer (line 621) | LinkLayer& link_layer()
          method Advertiser (line 626) | Advertiser& advertiser()
      class auto_start_advertising (line 644) | class auto_start_advertising
        type meta_type (line 648) | struct meta_type :
        type impl (line 653) | struct impl
          method begin_of_advertising_events (line 655) | bool begin_of_advertising_events() const
          method continued_advertising_events (line 660) | bool continued_advertising_events() const
          method end_of_advertising_events (line 665) | void end_of_advertising_events()
      class no_auto_start_advertising (line 683) | class no_auto_start_advertising
        type meta_type (line 706) | struct meta_type :
        class impl (line 711) | class impl
          method impl (line 714) | impl()
          method start_advertising (line 720) | void start_advertising()
          method start_advertising (line 735) | void start_advertising( unsigned count )
          method stop_advertising (line 751) | void stop_advertising()
          method begin_of_advertising_events (line 758) | bool begin_of_advertising_events()
          method continued_advertising_events (line 773) | bool continued_advertising_events()
          method end_of_advertising_events (line 787) | void end_of_advertising_events()
      type advertising_interval (line 804) | struct advertising_interval
        type meta_type (line 807) | struct meta_type :
        method delta_time (line 816) | delta_time current_advertising_interval() const
      type variable_advertising_interval (line 828) | struct variable_advertising_interval
        method variable_advertising_interval (line 831) | variable_advertising_interval()
        method advertising_interval_ms (line 839) | void advertising_interval_ms( unsigned interval_ms )
        method advertising_interval (line 848) | void advertising_interval( delta_time interval )
        method delta_time (line 857) | delta_time current_advertising_interval() const
        type meta_type (line 863) | struct meta_type :
      type details (line 871) | namespace details {
        type advertising_type_meta_type (line 25) | struct advertising_type_meta_type {}
        type advertising_startup_meta_type (line 26) | struct advertising_startup_meta_type {}
        type advertising_interval_meta_type (line 27) | struct advertising_interval_meta_type {}
        type advertising_channel_map_meta_type (line 28) | struct advertising_channel_map_meta_type {}
        type check_advertising_interval_parameter (line 31) | struct check_advertising_interval_parameter {
        type advertising_type_base (line 38) | struct advertising_type_base {
          method is_valid_scan_request (line 57) | static bool is_valid_scan_request( const read_buffer& receive, c...
          method is_valid_connect_request (line 79) | static bool is_valid_connect_request( const read_buffer& receive...
          method fill_empty_scan_response_data (line 100) | static std::size_t fill_empty_scan_response_data( const device_a...
        type advertising_channel_map_base (line 872) | struct advertising_channel_map_base {
        class advertiser (line 1015) | class advertiser
        type advertiser_base_base (line 1017) | struct advertiser_base_base
        class advertiser_base (line 1024) | class advertiser_base :
          method read_buffer (line 1040) | read_buffer advertising_buffer()
          method read_buffer (line 1049) | read_buffer scan_response_buffer()
          method read_buffer (line 1059) | read_buffer advertising_receive_buffer()
          method maximum_required_advertising_buffer (line 1070) | static constexpr std::size_t maximum_required_advertising_buffer()
          method advertiser_base (line 1080) | advertiser_base()
          method delta_time (line 1085) | delta_time next_adv_event()
          method LinkLayer (line 1095) | LinkLayer& base_link_layer()
        type start_stop_implementation (line 1107) | struct start_stop_implementation :
        class multipl_advertiser_base (line 1215) | class multipl_advertiser_base
        class multipl_advertiser_base< LinkLayer, Options, Advertiser > (line 1218) | class multipl_advertiser_base< LinkLayer, Options, Advertiser >
          method read_buffer (line 1221) | read_buffer fill_advertising_data( unsigned )
          method read_buffer (line 1226) | read_buffer get_advertising_data( unsigned )
          method read_buffer (line 1231) | read_buffer get_scan_response_data( unsigned )
          method is_valid_scan_request (line 1236) | bool is_valid_scan_request( const read_buffer&, unsigned ) const
          method is_valid_connect_request (line 1241) | bool is_valid_connect_request( const read_buffer&, unsigned ) const
      type variable_advertising_channel_map (line 889) | struct variable_advertising_channel_map : details::advertising_chann...
        method add_channel_to_advertising_channel_map (line 894) | void add_channel_to_advertising_channel_map( unsigned channel )
        method remove_channel_from_advertsing_channel_map (line 910) | void remove_channel_from_advertsing_channel_map( unsigned channel )
        type meta_type (line 923) | struct meta_type :
        method variable_advertising_channel_map (line 927) | variable_advertising_channel_map()
        method current_channel (line 932) | unsigned current_channel() const
        method next_channel (line 937) | void next_channel()
        method first_channel_selected (line 951) | bool first_channel_selected() const
        method first_channel_index (line 957) | unsigned first_channel_index() const
      type all_advertising_channel_map (line 976) | struct all_advertising_channel_map : details::advertising_channel_ma...
        type meta_type (line 979) | struct meta_type :
        method all_advertising_channel_map (line 984) | all_advertising_channel_map()
        method current_channel (line 988) | unsigned current_channel() const
        method next_channel (line 993) | void next_channel()
        method first_channel_selected (line 1000) | bool first_channel_selected() const
      type details (line 1010) | namespace details {
        type advertising_type_meta_type (line 25) | struct advertising_type_meta_type {}
        type advertising_startup_meta_type (line 26) | struct advertising_startup_meta_type {}
        type advertising_interval_meta_type (line 27) | struct advertising_interval_meta_type {}
        type advertising_channel_map_meta_type (line 28) | struct advertising_channel_map_meta_type {}
        type check_advertising_interval_parameter (line 31) | struct check_advertising_interval_parameter {
        type advertising_type_base (line 38) | struct advertising_type_base {
          method is_valid_scan_request (line 57) | static bool is_valid_scan_request( const read_buffer& receive, c...
          method is_valid_connect_request (line 79) | static bool is_valid_connect_request( const read_buffer& receive...
          method fill_empty_scan_response_data (line 100) | static std::size_t fill_empty_scan_response_data( const device_a...
        type advertising_channel_map_base (line 872) | struct advertising_channel_map_base {
        class advertiser (line 1015) | class advertiser
        type advertiser_base_base (line 1017) | struct advertiser_base_base
        class advertiser_base (line 1024) | class advertiser_base :
          method read_buffer (line 1040) | read_buffer advertising_buffer()
          method read_buffer (line 1049) | read_buffer scan_response_buffer()
          method read_buffer (line 1059) | read_buffer advertising_receive_buffer()
          method maximum_required_advertising_buffer (line 1070) | static constexpr std::size_t maximum_required_advertising_buffer()
          method advertiser_base (line 1080) | advertiser_base()
          method delta_time (line 1085) | delta_time next_adv_event()
          method LinkLayer (line 1095) | LinkLayer& base_link_layer()
        type start_stop_implementation (line 1107) | struct start_stop_implementation :
        class multipl_advertiser_base (line 1215) | class multipl_advertiser_base
        class multipl_advertiser_base< LinkLayer, Options, Advertiser > (line 1218) | class multipl_advertiser_base< LinkLayer, Options, Advertiser >
          method read_buffer (line 1221) | read_buffer fill_advertising_data( unsigned )
          method read_buffer (line 1226) | read_buffer get_advertising_data( unsigned )
          method read_buffer (line 1231) | read_buffer get_scan_response_data( unsigned )
          method is_valid_scan_request (line 1236) | bool is_valid_scan_request( const read_buffer&, unsigned ) const
          method is_valid_connect_request (line 1241) | bool is_valid_connect_request( const read_buffer&, unsigned ) const
  class advertiser< LinkLayer, std::tuple< Options... >, std::tuple< Advertising > > (line 1124) | class advertiser< LinkLayer, std::tuple< Options... >, std::tuple< Adver...
    method handle_start_advertising (line 1134) | void handle_start_advertising()
    method handle_stop_advertising (line 1154) | void handle_stop_advertising()
    method handle_adv_receive (line 1162) | bool handle_adv_receive( read_buffer receive, device_address& remote_a...
    method handle_adv_timeout (line 1182) | void handle_adv_timeout()
  class advertiser< LinkLayer, std::tuple< Options... >, std::tuple<> > (line 1209) | class advertiser< LinkLayer, std::tuple< Options... >, std::tuple<> > :
  class multipl_advertiser_base< LinkLayer, Options, Advertiser, Type, Types... > (line 1248) | class multipl_advertiser_base< LinkLayer, Options, Advertiser, Type, Typ...
    method read_buffer (line 1254) | read_buffer fill_advertising_data( unsigned selected )
    method read_buffer (line 1261) | read_buffer get_advertising_data( unsigned selected )
    method read_buffer (line 1268) | read_buffer get_scan_response_data( unsigned selected )
    method is_valid_scan_request (line 1275) | bool is_valid_scan_request( const read_buffer& b, unsigned selected ) ...
    method is_valid_connect_request (line 1282) | bool is_valid_connect_request( const read_buffer& b, unsigned selected...
  class advertiser< LinkLayer, std::tuple< Options... >, std::tuple< FirstAdv, SecondAdv, Advertisings... > > (line 1298) | class advertiser< LinkLayer, std::tuple< Options... >, std::tuple< First...
    method advertiser (line 1309) | advertiser()
    method handle_start_advertising (line 1315) | void handle_start_advertising()
    method handle_stop_advertising (line 1336) | void handle_stop_advertising()
    method handle_adv_receive (line 1341) | bool handle_adv_receive( read_buffer receive, device_address& remote_a...
    method handle_adv_timeout (line 1361) | void handle_adv_timeout()
    method change_advertising (line 1390) | void change_advertising()

FILE: bluetoe/link_layer/include/bluetoe/buffer.hpp
  type bluetoe (line 10) | namespace bluetoe {
    type link_layer (line 11) | namespace link_layer {
      type read_buffer (line 17) | struct read_buffer
        method empty (line 35) | bool empty() const
        method fill (line 44) | void fill( std::initializer_list< std::uint8_t > data )
      function fill (line 61) | void fill( const read_buffer& buffer, std::initializer_list< std::ui...
      type write_buffer (line 84) | struct write_buffer
        method empty (line 95) | bool empty() const
        method write_buffer (line 103) | explicit write_buffer( const read_buffer& rhs )
        method write_buffer (line 111) | write_buffer()
        method write_buffer (line 120) | write_buffer( const std::uint8_t* b, std::size_t s )

FILE: bluetoe/link_layer/include/bluetoe/channel_map.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type link_layer (line 7) | namespace link_layer {
      class channel_map (line 12) | class channel_map

FILE: bluetoe/link_layer/include/bluetoe/connection_callbacks.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type link_layer (line 8) | namespace link_layer {
      class connection_details (line 9) | class connection_details
      type details (line 11) | namespace details {
        type connection_callbacks_meta_type (line 12) | struct connection_callbacks_meta_type {}
        type no_connection_callbacks (line 452) | struct no_connection_callbacks {
          type meta_type (line 453) | struct meta_type :
          method connection_request (line 457) | void connection_request( const connection_addresses& ) {}
          method connection_requested (line 460) | void connection_requested(
          method connection_attempt_timeout (line 466) | void connection_attempt_timeout( Connection&, Radio& ) {}
          method connection_established (line 469) | void connection_established(
          method connection_changed (line 475) | void connection_changed( const bluetoe::link_layer::connection_d...
          method connection_closed (line 478) | void connection_closed( std::uint8_t, Connection&, Radio& ) {}
          method handle_connection_events (line 481) | void handle_connection_events() {}
          method version_indication_received (line 484) | void version_indication_received( const std::uint8_t*, Connectio...
          method procedure_rejected (line 487) | void procedure_rejected( std::uint8_t, Connection&, Radio& ) {}
          method procedure_unknown (line 490) | void procedure_unknown( std::uint8_t, Connection&, Radio& ) {}
          method remote_features_received (line 493) | void remote_features_received( const std::uint8_t[8], Connection...
          method phy_update (line 496) | void phy_update( std::uint8_t, std::uint8_t, Connection&, Radio&...
      type connection_callbacks (line 71) | struct connection_callbacks {
        type meta_type (line 73) | struct meta_type :
        method connection_request (line 77) | void connection_request( const connection_addresses& addresses )
        method connection_requested (line 83) | void connection_requested(
        method connection_established (line 97) | void connection_established(
        method connection_attempt_timeout (line 109) | void connection_attempt_timeout( Connection& connection, Radio& r )
        method connection_changed (line 118) | void connection_changed( const bluetoe::link_layer::connection_det...
        method connection_closed (line 127) | void connection_closed( std::uint8_t reason, Connection& connectio...
        method procedure_rejected (line 137) | void procedure_rejected( std::uint8_t error_code, Connection& conn...
        method procedure_unknown (line 147) | void procedure_unknown( std::uint8_t error_code, Connection& conne...
        method version_indication_received (line 157) | void version_indication_received( const std::uint8_t* details, Con...
        method remote_features_received (line 167) | void remote_features_received( const std::uint8_t rf[ 8 ], Connect...
        method phy_update (line 177) | void phy_update( std::uint8_t phy_c_to_p, std::uint8_t phy_p_to_c,...
        method handle_connection_events (line 188) | void handle_connection_events() {
        type event_type_t (line 243) | enum event_type_t {
        type event_data (line 261) | struct event_data {
          method event_data (line 267) | event_data( event_type_t ev, void* con, connection_details d = c...
          method event_data (line 273) | event_data() {}
        method call_ll_connection_requested (line 286) | auto call_ll_connection_requested(
        method call_ll_connection_attempt_timeout (line 299) | auto call_ll_connection_attempt_timeout( TT& obj, Connection& conn...
        method call_ll_connection_established (line 308) | auto call_ll_connection_established(
        method call_ll_connection_changed (line 321) | auto call_ll_connection_changed( TT& obj, const bluetoe::link_laye...
        method call_ll_connection_closed (line 330) | auto call_ll_connection_closed( TT& obj, std::uint8_t reason, Conn...
        method call_ll_version (line 339) | auto call_ll_version( TT& obj, Connection& connection, std::uint8_...
        method call_ll_rejected (line 352) | auto call_ll_rejected( TT& obj, Connection& connection, std::uint8...
        method call_ll_unknown (line 363) | auto call_ll_unknown( TT& obj, Connection& connection, std::uint8_...
        method call_ll_remote_features (line 374) | auto call_ll_remote_features( TT& obj, Connection& connection, std...
        method call_ll_phy_updated (line 385) | auto call_ll_phy_updated( TT& obj, Connection& connection,
        method call_ll_connection_requested (line 399) | void call_ll_connection_requested( ... )
        method call_ll_connection_attempt_timeout (line 404) | void call_ll_connection_attempt_timeout( ... )
        method call_ll_connection_established (line 409) | void call_ll_connection_established( ... )
        method call_ll_connection_changed (line 414) | void call_ll_connection_changed( ... )
        method call_ll_connection_closed (line 419) | void call_ll_connection_closed( ... )
        method call_ll_version (line 424) | void call_ll_version( ... )
        method call_ll_rejected (line 429) | void call_ll_rejected( ... )
        method call_ll_unknown (line 434) | void call_ll_unknown( ... )
        method call_ll_remote_features (line 439) | void call_ll_remote_features( ... )
        method call_ll_phy_updated (line 444) | void call_ll_phy_updated( ... )
      type details (line 451) | namespace details {
        type connection_callbacks_meta_type (line 12) | struct connection_callbacks_meta_type {}
        type no_connection_callbacks (line 452) | struct no_connection_callbacks {
          type meta_type (line 453) | struct meta_type :
          method connection_request (line 457) | void connection_request( const connection_addresses& ) {}
          method connection_requested (line 460) | void connection_requested(
          method connection_attempt_timeout (line 466) | void connection_attempt_timeout( Connection&, Radio& ) {}
          method connection_established (line 469) | void connection_established(
          method connection_changed (line 475) | void connection_changed( const bluetoe::link_layer::connection_d...
          method connection_closed (line 478) | void connection_closed( std::uint8_t, Connection&, Radio& ) {}
          method handle_connection_events (line 481) | void handle_connection_events() {}
          method version_indication_received (line 484) | void version_indication_received( const std::uint8_t*, Connectio...
          method procedure_rejected (line 487) | void procedure_rejected( std::uint8_t, Connection&, Radio& ) {}
          method procedure_unknown (line 490) | void procedure_unknown( std::uint8_t, Connection&, Radio& ) {}
          method remote_features_received (line 493) | void remote_features_received( const std::uint8_t[8], Connection...
          method phy_update (line 496) | void phy_update( std::uint8_t, std::uint8_t, Connection&, Radio&...

FILE: bluetoe/link_layer/include/bluetoe/connection_details.hpp
  type bluetoe (line 8) | namespace bluetoe {
    type link_layer (line 9) | namespace link_layer {
      class connection_details (line 14) | class connection_details
        method connection_details (line 20) | connection_details() = default;
      class connection_addresses (line 78) | class connection_addresses
        method connection_addresses (line 81) | connection_addresses() = default;

FILE: bluetoe/link_layer/include/bluetoe/connection_event_callback.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type link_layer (line 8) | namespace link_layer {
      type details (line 10) | namespace details {
        type connection_event_callback_meta_type (line 11) | struct connection_event_callback_meta_type : details::valid_link_l...
        type synchronized_connection_event_callback_meta_type (line 12) | struct synchronized_connection_event_callback_meta_type : details:...
        type check_synchronized_connection_event_callback_meta_type (line 13) | struct check_synchronized_connection_event_callback_meta_type : de...
        type default_connection_event_callback (line 15) | struct default_connection_event_callback
          method call_connection_event_callback (line 17) | static void call_connection_event_callback( const delta_time& )
      type connection_event_callback (line 41) | struct connection_event_callback
        method call_connection_event_callback (line 44) | static void call_connection_event_callback( const delta_time& time...
      type synchronized_connection_event_callback (line 150) | struct synchronized_connection_event_callback
        type impl (line 172) | struct impl {
          method impl (line 173) | impl()
          method stop_synchronized_connection_event_callbacks (line 180) | void stop_synchronized_connection_event_callbacks()
          method restart_synchronized_connection_event_callbacks (line 188) | void restart_synchronized_connection_event_callbacks()
          method force_synchronized_connection_event_callback (line 198) | void force_synchronized_connection_event_callback()
          method synchronized_connection_event_callback_new_connection (line 203) | void synchronized_connection_event_callback_new_connection( delt...
          method synchronized_connection_event_callback_start_changing_connection (line 218) | void synchronized_connection_event_callback_start_changing_conne...
          method synchronized_connection_event_callback_connection_changed (line 223) | void synchronized_connection_event_callback_connection_changed( ...
          method synchronized_connection_event_callback_disconnect (line 236) | void synchronized_connection_event_callback_disconnect()
          method synchronized_connection_event_callback_timeout (line 242) | void synchronized_connection_event_callback_timeout( bool anchor...
          method call_ll_connect (line 275) | auto call_ll_connect( bluetoe::link_layer::delta_time connection...
          method call_ll_connect (line 284) | void call_ll_connect( ... )
          method call_ll_disconnect (line 289) | auto call_ll_disconnect( int ) -> decltype(&TT::ll_synchronized_...
          method call_ll_disconnect (line 296) | void call_ll_disconnect( ... )
          method call_ll_update (line 301) | auto call_ll_update(
          method call_ll_update (line 310) | void call_ll_update( ... )
          method setup_timer (line 314) | void setup_timer( delta_time dt )
          method LinkLayer (line 321) | LinkLayer& link_layer()
          method calculate_effective_period (line 326) | void calculate_effective_period( delta_time connection_interval )
          method delta_time (line 348) | delta_time first_timeout() const
      type no_synchronized_connection_event_callback (line 383) | struct no_synchronized_connection_event_callback
        type impl (line 387) | struct impl {
          method synchronized_connection_event_callback_new_connection (line 388) | void synchronized_connection_event_callback_new_connection( delt...
          method synchronized_connection_event_callback_start_changing_connection (line 392) | void synchronized_connection_event_callback_start_changing_conne...
          method synchronized_connection_event_callback_connection_changed (line 396) | void synchronized_connection_event_callback_connection_changed( ...
          method synchronized_connection_event_callback_timeout (line 400) | void synchronized_connection_event_callback_timeout( bool )
          method synchronized_connection_event_callback_disconnect (line 404) | void synchronized_connection_event_callback_disconnect()
      type ranged_check_synchronized_connection_event_callback (line 427) | struct ranged_check_synchronized_connection_event_callback
        method check (line 431) | static void check( const no_synchronized_connection_event_callback& )
        method check (line 436) | static void check( const synchronized_connection_event_callback< T...
      type no_check_synchronized_connection_event_callback (line 469) | struct no_check_synchronized_connection_event_callback
        method check (line 473) | static void check( const CBs& )

FILE: bluetoe/link_layer/include/bluetoe/connection_events.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type link_layer (line 5) | namespace link_layer {
      type connection_event_events (line 13) | struct connection_event_events
        method connection_event_events (line 50) | connection_event_events()
        method connection_event_events (line 63) | connection_event_events(

FILE: bluetoe/link_layer/include/bluetoe/default_pdu_layout.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type link_layer (line 8) | namespace link_layer {
      type details (line 10) | namespace details {
        type layout_base (line 13) | struct layout_base
          method header (line 15) | static std::uint16_t header( const read_buffer& pdu )
          method header (line 22) | static std::uint16_t header( const write_buffer& pdu )
          method header (line 29) | static void header( const read_buffer& pdu, std::uint16_t header...
      type default_pdu_layout (line 42) | struct default_pdu_layout : details::layout_base< default_pdu_layout >{
        method header (line 53) | static std::uint16_t header( const std::uint8_t* pdu )
        method header (line 61) | static void header( std::uint8_t* pdu, std::uint16_t header_value )
        method body (line 71) | static std::pair< std::uint8_t*, std::uint8_t* > body( const read_...
        method body (line 81) | static std::pair< const std::uint8_t*, const std::uint8_t* > body(...
        method data_channel_pdu_memory_size (line 92) | static constexpr std::size_t data_channel_pdu_memory_size( std::si...
      type pdu_layout_by_radio (line 104) | struct pdu_layout_by_radio {

FILE: bluetoe/link_layer/include/bluetoe/delta_time.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type link_layer (line 8) | namespace link_layer {
      class delta_time (line 13) | class delta_time
        method delta_time (line 16) | constexpr delta_time() : usec_( 0 )
        method delta_time (line 23) | constexpr explicit delta_time( std::uint32_t usec ) : usec_( usec )

FILE: bluetoe/link_layer/include/bluetoe/l2cap_signaling_channel.hpp
  type bluetoe (line 11) | namespace bluetoe {
    type details (line 13) | namespace details {
      type signaling_channel_meta_type (line 14) | struct signaling_channel_meta_type {}
    type l2cap (line 17) | namespace l2cap {
      class signaling_channel (line 25) | class signaling_channel
        type meta_type (line 63) | struct meta_type :
      class no_signaling_channel (line 92) | class no_signaling_channel
        method l2cap_input (line 99) | void l2cap_input( const std::uint8_t*, std::size_t, std::uint8_t*,...
        method l2cap_output (line 108) | void l2cap_output( std::uint8_t*, std::size_t& out_size, Connectio...
        method connection_parameter_update_request (line 116) | bool connection_parameter_update_request( std::uint16_t, std::uint...
        method channel_mtu_size (line 124) | constexpr std::size_t channel_mtu_size() const

FILE: bluetoe/link_layer/include/bluetoe/link_layer.hpp
  type bluetoe (line 30) | namespace bluetoe {
    type details (line 31) | namespace details {
      class notification_data (line 32) | class notification_data
    type link_layer (line 35) | namespace link_layer {
      class link_layer (line 47) | class link_layer
        type ll_result (line 728) | enum class ll_result {
        type link_layer_feature (line 784) | struct link_layer_feature {
          type std::uint16_t (line 785) | enum : std::uint16_t {
        type state (line 834) | enum class state
      type details (line 49) | namespace details {
        type buffer_sizes (line 51) | struct buffer_sizes
        type security_manager (line 64) | struct security_manager {
        type signaling_channel (line 80) | struct signaling_channel {
        type connection_callbacks (line 88) | struct connection_callbacks
        type white_list (line 97) | struct white_list
        type link_layer_security_impl (line 112) | struct link_layer_security_impl
          class impl (line 115) | class impl
            method impl (line 118) | impl()
            method LinkLayer (line 123) | LinkLayer& that()
            method handle_encryption_pdus (line 128) | bool handle_encryption_pdus( std::uint8_t opcode, std::uint8_t...
            method transmit_pending_security_pdus (line 197) | void transmit_pending_security_pdus()
            method reset_encryption (line 225) | void reset_encryption()
        type link_layer_no_security_impl (line 240) | struct link_layer_no_security_impl
          type impl (line 243) | struct impl
            method handle_encryption_pdus (line 245) | bool handle_encryption_pdus( std::uint8_t, std::uint8_t, write...
            method transmit_pending_security_pdus (line 250) | void transmit_pending_security_pdus()
            method reset_encryption (line 254) | void reset_encryption()
        type phy_update_request_impl (line 265) | struct phy_update_request_impl
          method handle_phy_request (line 268) | bool handle_phy_request( std::uint8_t opcode, std::uint8_t size,...
          method handle_pending_phy_request (line 314) | bool handle_pending_phy_request( std::uint8_t opcode, LL& link_l...
          method reset_phy (line 337) | void reset_phy( LL& link_layer )
          method valid_phy_encoding (line 343) | bool valid_phy_encoding( std::uint8_t c ) const
        type no_phy_update_request_impl (line 351) | struct no_phy_update_request_impl
          method handle_phy_request (line 354) | bool handle_phy_request( std::uint8_t, std::uint8_t, const write...
          method handle_pending_phy_request (line 360) | bool handle_pending_phy_request( std::uint8_t, LL& )
          method reset_phy (line 366) | void reset_phy( LL& )
        type l2cap_layer (line 407) | struct l2cap_layer {
          type default_l2cap_layer (line 410) | struct default_l2cap_layer {
      class link_layer (line 482) | class link_layer :
        type ll_result (line 728) | enum class ll_result {
        type link_layer_feature (line 784) | struct link_layer_feature {
          type std::uint16_t (line 785) | enum : std::uint16_t {
        type state (line 834) | enum class state
      function delta_time (line 1219) | delta_time link_layer< Server, ScheduledRadio, Options... >::setup_n...
      function connection_details (line 1739) | connection_details link_layer< Server, ScheduledRadio, Options... >:...
      function device_address (line 1768) | const device_address& link_layer< Server, ScheduledRadio, Options......

FILE: bluetoe/link_layer/include/bluetoe/ll_data_pdu_buffer.hpp
  type bluetoe (line 13) | namespace bluetoe {
    type link_layer (line 14) | namespace link_layer {
      class ll_data_pdu_buffer (line 37) | class ll_data_pdu_buffer
        method max_max_rx_size (line 93) | constexpr std::size_t max_max_rx_size() const
        method max_max_tx_size (line 123) | constexpr std::size_t max_max_tx_size() const
      function read_buffer (line 421) | read_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >::...
      function write_buffer (line 462) | write_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >:...
      function write_buffer (line 478) | write_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >:...
      function read_buffer (line 542) | read_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >::...
      function write_buffer (line 548) | write_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >:...
      function read_buffer (line 564) | read_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >::...
      function write_buffer (line 570) | write_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >:...
      function write_buffer (line 595) | write_buffer ll_data_pdu_buffer< TransmitSize, ReceiveSize, Radio >:...

FILE: bluetoe/link_layer/include/bluetoe/ll_l2cap_sdu_buffer.hpp
  type bluetoe (line 8) | namespace bluetoe {
    type link_layer (line 9) | namespace link_layer {
      class ll_l2cap_sdu_buffer (line 20) | class ll_l2cap_sdu_buffer : public BufferedRadio
      class ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, bluetoe::details::default_att_mtu_size > (line 120) | class ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, bluetoe:...
      function read_buffer (line 148) | read_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, MT...
      function read_buffer (line 159) | read_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, MT...
      function write_buffer (line 185) | write_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, M...
      function read_buffer (line 313) | read_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, bl...
      function read_buffer (line 319) | read_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, bl...
      function write_buffer (line 337) | write_buffer ll_l2cap_sdu_buffer< BufferedRadio, ReceiveCallbacks, b...

FILE: bluetoe/link_layer/include/bluetoe/ll_meta_types.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type link_layer (line 5) | namespace link_layer {
      type details (line 6) | namespace details {
        type valid_link_layer_option_meta_type (line 11) | struct valid_link_layer_option_meta_type {}

FILE: bluetoe/link_layer/include/bluetoe/ll_options.hpp
  type bluetoe (line 9) | namespace bluetoe
    type link_layer (line 11) | namespace link_layer
      type details (line 13) | namespace details {
        type device_address_meta_type (line 14) | struct device_address_meta_type {}
        type buffer_sizes_meta_type (line 15) | struct buffer_sizes_meta_type {}
        type desired_connection_parameters_meta_type (line 16) | struct desired_connection_parameters_meta_type {}
        type custom_l2cap_layer_meta_type (line 17) | struct custom_l2cap_layer_meta_type {}
        type ll_pdu_receive_data_callback_meta_type (line 18) | struct ll_pdu_receive_data_callback_meta_type {}
        type sleep_clock_accuracy_meta_type (line 87) | struct sleep_clock_accuracy_meta_type {}
        type check_sleep_clock_accuracy_ppm (line 90) | struct check_sleep_clock_accuracy_ppm {
        type requested_connection_parameters (line 146) | struct requested_connection_parameters
        type desired_connection_parameters_base (line 154) | struct desired_connection_parameters_base
          method parse_and_check_params (line 165) | static bool parse_and_check_params( const write_buffer& request,...
      type random_static_address (line 27) | struct random_static_address
        method is_random (line 32) | static constexpr bool is_random()
        method random_device_address (line 41) | static random_device_address address( const Radio& r )
        type meta_type (line 47) | struct meta_type :
      type static_address (line 59) | struct static_address
        method is_random (line 64) | static constexpr bool is_random()
        method random_device_address (line 73) | static random_device_address address( const Radio& )
        type meta_type (line 80) | struct meta_type :
      type details (line 86) | namespace details {
        type device_address_meta_type (line 14) | struct device_address_meta_type {}
        type buffer_sizes_meta_type (line 15) | struct buffer_sizes_meta_type {}
        type desired_connection_parameters_meta_type (line 16) | struct desired_connection_parameters_meta_type {}
        type custom_l2cap_layer_meta_type (line 17) | struct custom_l2cap_layer_meta_type {}
        type ll_pdu_receive_data_callback_meta_type (line 18) | struct ll_pdu_receive_data_callback_meta_type {}
        type sleep_clock_accuracy_meta_type (line 87) | struct sleep_clock_accuracy_meta_type {}
        type check_sleep_clock_accuracy_ppm (line 90) | struct check_sleep_clock_accuracy_ppm {
        type requested_connection_parameters (line 146) | struct requested_connection_parameters
        type desired_connection_parameters_base (line 154) | struct desired_connection_parameters_base
          method parse_and_check_params (line 165) | static bool parse_and_check_params( const write_buffer& request,...
      type sleep_clock_accuracy_ppm (line 107) | struct sleep_clock_accuracy_ppm
        type meta_type (line 115) | struct meta_type :
      type buffer_sizes (line 125) | struct buffer_sizes
        type meta_type (line 128) | struct meta_type :
      type details (line 144) | namespace details
        type device_address_meta_type (line 14) | struct device_address_meta_type {}
        type buffer_sizes_meta_type (line 15) | struct buffer_sizes_meta_type {}
        type desired_connection_parameters_meta_type (line 16) | struct desired_connection_parameters_meta_type {}
        type custom_l2cap_layer_meta_type (line 17) | struct custom_l2cap_layer_meta_type {}
        type ll_pdu_receive_data_callback_meta_type (line 18) | struct ll_pdu_receive_data_callback_meta_type {}
        type sleep_clock_accuracy_meta_type (line 87) | struct sleep_clock_accuracy_meta_type {}
        type check_sleep_clock_accuracy_ppm (line 90) | struct check_sleep_clock_accuracy_ppm {
        type requested_connection_parameters (line 146) | struct requested_connection_parameters
        type desired_connection_parameters_base (line 154) | struct desired_connection_parameters_base
          method parse_and_check_params (line 165) | static bool parse_and_check_params( const write_buffer& request,...
      type desired_connection_parameters (line 220) | struct desired_connection_parameters : private details::desired_conn...
        type meta_type (line 223) | struct meta_type :
        method handle_connection_parameters_request (line 228) | bool handle_connection_parameters_request(
        method connection_parameters_response_fill (line 276) | void connection_parameters_response_fill( read_buffer )
        method connection_parameters_response_pending (line 279) | bool connection_parameters_response_pending() const
        method reset_connection_parameter_request (line 284) | void reset_connection_parameter_request()
      type asynchronous_connection_parameter_request (line 296) | struct asynchronous_connection_parameter_request : private details::...
        method connection_parameters_request_reply (line 299) | void connection_parameters_request_reply(
        method connection_parameters_request_negative_reply (line 313) | void connection_parameters_request_negative_reply( std::uint8_t re...
        type meta_type (line 321) | struct meta_type :
        method handle_connection_parameters_request (line 327) | bool handle_connection_parameters_request(
        method connection_parameters_response_fill (line 357) | void connection_parameters_response_fill( read_buffer response )
        method connection_parameters_response_pending (line 396) | bool connection_parameters_response_pending() const
        method reset_connection_parameter_request (line 401) | void reset_connection_parameter_request()
      type no_desired_connection_parameters (line 418) | struct no_desired_connection_parameters : private details::desired_c...
        type meta_type (line 420) | struct meta_type :
        method handle_connection_parameters_request (line 425) | bool handle_connection_parameters_request(
        method connection_parameters_response_fill (line 443) | void connection_parameters_response_fill( read_buffer )
        method connection_parameters_response_pending (line 446) | bool connection_parameters_response_pending() const
        method reset_connection_parameter_request (line 451) | void reset_connection_parameter_request()
      type ll_custom_l2cap_layer (line 461) | struct ll_custom_l2cap_layer
        type meta_type (line 464) | struct meta_type :
      type l2cap_callback (line 474) | struct l2cap_callback
        method pdu_receive_data_callback (line 477) | void pdu_receive_data_callback( const write_buffer& ll_pdu_contain...
        type meta_type (line 482) | struct meta_type :
      type no_l2cap_callback (line 487) | struct no_l2cap_callback
        method pdu_receive_data_callback (line 490) | void pdu_receive_data_callback( const write_buffer& )
        type meta_type (line 494) | struct meta_type :

FILE: bluetoe/link_layer/include/bluetoe/peripheral_latency.hpp
  type bluetoe (line 20) | namespace bluetoe {
    type link_layer (line 21) | namespace link_layer {
      type details (line 23) | namespace details {
        type peripheral_latency_meta_type (line 24) | struct peripheral_latency_meta_type {}
        type wrap_latency_option (line 104) | struct wrap_latency_option {}
        type feature_enabled (line 107) | struct feature_enabled
        class connection_state_base (line 278) | class connection_state_base
          method current_channel_index (line 284) | unsigned      current_channel_index() const
          method connection_event_counter (line 292) | std::uint16_t connection_event_counter() const
          method delta_time (line 304) | delta_time    time_since_last_event() const
          method plan_next_connection_event_after_timeout (line 312) | void plan_next_connection_event_after_timeout(
          method plan_next_connection_event (line 323) | void plan_next_connection_event(
          method reschedule_on_pending_data (line 372) | bool reschedule_on_pending_data( Radio&, delta_time )
          method reset_connection_state (line 380) | void reset_connection_state()
          method peripheral_latency_move_connection_event (line 388) | void peripheral_latency_move_connection_event( int count, delta_...
          method Base (line 409) | Base& base()
        class disarmable_connection_state (line 416) | class disarmable_connection_state
        class disarmable_connection_state< std::true_type, State > (line 419) | class disarmable_connection_state< std::true_type, State >
          method disarmable_connection_state_last_latency (line 422) | void disarmable_connection_state_last_latency( int l )
          method reschedule_on_pending_data_impl (line 430) | bool reschedule_on_pending_data_impl( Radio& radio, delta_time c...
        class disarmable_connection_state< std::false_type, State > (line 460) | class disarmable_connection_state< std::false_type, State >
          method disarmable_connection_state_last_latency (line 463) | void disarmable_connection_state_last_latency( int ) {}
          method reschedule_on_pending_data_impl (line 467) | bool reschedule_on_pending_data_impl( Radio&, delta_time )
        class peripheral_latency_state (line 477) | class peripheral_latency_state
        type listen_if_pending_transmit_data_is_part_of_any_configuration (line 519) | struct listen_if_pending_transmit_data_is_part_of_any_configuration
        type has_feature_enabled_impl (line 568) | struct has_feature_enabled_impl
        type is_part_of_all_configurations (line 578) | struct is_part_of_all_configurations
        type is_part_of_no_configurations (line 591) | struct is_part_of_no_configurations
        type peripheral_latency_feature_checker (line 619) | struct peripheral_latency_feature_checker
          method peripheral_latency_feature_checker (line 621) | inline explicit peripheral_latency_feature_checker( int config )
          method each (line 628) | void each()
      type peripheral_latency (line 45) | enum class peripheral_latency
      type details (line 102) | namespace details {
        type peripheral_latency_meta_type (line 24) | struct peripheral_latency_meta_type {}
        type wrap_latency_option (line 104) | struct wrap_latency_option {}
        type feature_enabled (line 107) | struct feature_enabled
        class connection_state_base (line 278) | class connection_state_base
          method current_channel_index (line 284) | unsigned      current_channel_index() const
          method connection_event_counter (line 292) | std::uint16_t connection_event_counter() const
          method delta_time (line 304) | delta_time    time_since_last_event() const
          method plan_next_connection_event_after_timeout (line 312) | void plan_next_connection_event_after_timeout(
          method plan_next_connection_event (line 323) | void plan_next_connection_event(
          method reschedule_on_pending_data (line 372) | bool reschedule_on_pending_data( Radio&, delta_time )
          method reset_connection_state (line 380) | void reset_connection_state()
          method peripheral_latency_move_connection_event (line 388) | void peripheral_latency_move_connection_event( int count, delta_...
          method Base (line 409) | Base& base()
        class disarmable_connection_state (line 416) | class disarmable_connection_state
        class disarmable_connection_state< std::true_type, State > (line 419) | class disarmable_connection_state< std::true_type, State >
          method disarmable_connection_state_last_latency (line 422) | void disarmable_connection_state_last_latency( int l )
          method reschedule_on_pending_data_impl (line 430) | bool reschedule_on_pending_data_impl( Radio& radio, delta_time c...
        class disarmable_connection_state< std::false_type, State > (line 460) | class disarmable_connection_state< std::false_type, State >
          method disarmable_connection_state_last_latency (line 463) | void disarmable_connection_state_last_latency( int ) {}
          method reschedule_on_pending_data_impl (line 467) | bool reschedule_on_pending_data_impl( Radio&, delta_time )
        class peripheral_latency_state (line 477) | class peripheral_latency_state
        type listen_if_pending_transmit_data_is_part_of_any_configuration (line 519) | struct listen_if_pending_transmit_data_is_part_of_any_configuration
        type has_feature_enabled_impl (line 568) | struct has_feature_enabled_impl
        type is_part_of_all_configurations (line 578) | struct is_part_of_all_configurations
        type is_part_of_no_configurations (line 591) | struct is_part_of_no_configurations
        type peripheral_latency_feature_checker (line 619) | struct peripheral_latency_feature_checker
          method peripheral_latency_feature_checker (line 621) | inline explicit peripheral_latency_feature_checker( int config )
          method each (line 628) | void each()
      type peripheral_latency_configuration (line 137) | struct peripheral_latency_configuration
        type meta_type (line 140) | struct meta_type :
      class peripheral_latency_configuration_set (line 173) | class peripheral_latency_configuration_set
        type meta_type (line 186) | struct meta_type :
      type details (line 267) | namespace details {
        type peripheral_latency_meta_type (line 24) | struct peripheral_latency_meta_type {}
        type wrap_latency_option (line 104) | struct wrap_latency_option {}
        type feature_enabled (line 107) | struct feature_enabled
        class connection_state_base (line 278) | class connection_state_base
          method current_channel_index (line 284) | unsigned      current_channel_index() const
          method connection_event_counter (line 292) | std::uint16_t connection_event_counter() const
          method delta_time (line 304) | delta_time    time_since_last_event() const
          method plan_next_connection_event_after_timeout (line 312) | void plan_next_connection_event_after_timeout(
          method plan_next_connection_event (line 323) | void plan_next_connection_event(
          method reschedule_on_pending_data (line 372) | bool reschedule_on_pending_data( Radio&, delta_time )
          method reset_connection_state (line 380) | void reset_connection_state()
          method peripheral_latency_move_connection_event (line 388) | void peripheral_latency_move_connection_event( int count, delta_...
          method Base (line 409) | Base& base()
        class disarmable_connection_state (line 416) | class disarmable_connection_state
        class disarmable_connection_state< std::true_type, State > (line 419) | class disarmable_connection_state< std::true_type, State >
          method disarmable_connection_state_last_latency (line 422) | void disarmable_connection_state_last_latency( int l )
          method reschedule_on_pending_data_impl (line 430) | bool reschedule_on_pending_data_impl( Radio& radio, delta_time c...
        class disarmable_connection_state< std::false_type, State > (line 460) | class disarmable_connection_state< std::false_type, State >
          method disarmable_connection_state_last_latency (line 463) | void disarmable_connection_state_last_latency( int ) {}
          method reschedule_on_pending_data_impl (line 467) | bool reschedule_on_pending_data_impl( Radio&, delta_time )
        class peripheral_latency_state (line 477) | class peripheral_latency_state
        type listen_if_pending_transmit_data_is_part_of_any_configuration (line 519) | struct listen_if_pending_transmit_data_is_part_of_any_configuration
        type has_feature_enabled_impl (line 568) | struct has_feature_enabled_impl
        type is_part_of_all_configurations (line 578) | struct is_part_of_all_configurations
        type is_part_of_no_configurations (line 591) | struct is_part_of_no_configurations
        type peripheral_latency_feature_checker (line 619) | struct peripheral_latency_feature_checker
          method peripheral_latency_feature_checker (line 621) | inline explicit peripheral_latency_feature_checker( int config )
          method each (line 628) | void each()
  class peripheral_latency_state< peripheral_latency_configuration< Options... > > (line 480) | class peripheral_latency_state< peripheral_latency_configuration< Option...
    method reschedule_on_pending_data (line 505) | bool reschedule_on_pending_data( Radio& radio, delta_time connection_i...
    method peripheral_latency_feature (line 511) | constexpr bool peripheral_latency_feature() const
  class peripheral_latency_state< peripheral_latency_configuration_set< Configurations... > > (line 525) | class peripheral_latency_state< peripheral_latency_configuration_set< Co...
    method peripheral_latency_state (line 537) | peripheral_latency_state()
    method reschedule_on_pending_data (line 543) | bool reschedule_on_pending_data( Radio& radio, delta_time connection_i...
    method change_peripheral_latency (line 549) | void change_peripheral_latency()
  type has_feature_enabled_impl< RequestedFeature, peripheral_latency_configuration< Options... > > (line 571) | struct has_feature_enabled_impl< RequestedFeature, peripheral_latency_co...

FILE: bluetoe/link_layer/include/bluetoe/phy_encodings.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type link_layer (line 5) | namespace link_layer {
      type phy_ll_encoding (line 7) | namespace phy_ll_encoding {
        type phy_ll_encoding_t (line 8) | enum phy_ll_encoding_t : std::uint8_t {

FILE: bluetoe/link_layer/include/bluetoe/ring_buffer.hpp
  type bluetoe (line 11) | namespace bluetoe {
    type link_layer (line 12) | namespace link_layer {
      class pdu_ring_buffer (line 27) | class pdu_ring_buffer
      function Buffer (line 131) | Buffer pdu_ring_buffer< Size, Buffer, Layout >::alloc_front( std::ui...
      function Buffer (line 185) | Buffer pdu_ring_buffer< Size, Buffer, Layout >::next_end() const

FILE: bluetoe/link_layer/include/bluetoe/white_list.hpp
  type bluetoe (line 10) | namespace bluetoe {
    type link_layer (line 11) | namespace link_layer {
      type details (line 13) | namespace details {
        type white_list_meta_type (line 14) | struct white_list_meta_type {}
        class white_list_implementation (line 17) | class white_list_implementation
        class white_list_implementation< Size, true, Radio, LinkLayer > (line 174) | class white_list_implementation< Size, true, Radio, LinkLayer >
          method white_list_implementation (line 179) | white_list_implementation()
          method white_list_free_size (line 187) | std::size_t white_list_free_size() const
          method clear_white_list (line 192) | void clear_white_list()
          method add_to_white_list (line 197) | bool add_to_white_list( const device_address& addr )
          method is_in_white_list (line 210) | bool is_in_white_list( const device_address& addr ) const
          method remove_from_white_list (line 216) | bool remove_from_white_list( const device_address& addr )
          method connection_request_filter (line 230) | void connection_request_filter( bool b )
          method connection_request_filter (line 235) | bool connection_request_filter() const
          method scan_request_filter (line 240) | void scan_request_filter( bool b )
          method scan_request_filter (line 245) | bool scan_request_filter() const
          method is_connection_request_in_filter (line 250) | bool is_connection_request_in_filter( const device_address& addr...
          method is_scan_request_in_filter (line 255) | bool is_scan_request_in_filter( const device_address& addr ) const
        class white_list_implementation< Size, false, Radio, LinkLayer > (line 272) | class white_list_implementation< Size, false, Radio, LinkLayer >
          method white_list_free_size (line 277) | std::size_t white_list_free_size() const
          method clear_white_list (line 282) | void clear_white_list()
          method add_to_white_list (line 287) | bool add_to_white_list( const device_address& addr )
          method is_in_white_list (line 292) | bool is_in_white_list( const device_address& addr ) const
          method remove_from_white_list (line 297) | bool remove_from_white_list( const device_address& addr )
          method connection_request_filter (line 302) | void connection_request_filter( bool b )
          method connection_request_filter (line 307) | bool connection_request_filter() const
          method scan_request_filter (line 312) | void scan_request_filter( bool b )
          method scan_request_filter (line 317) | bool scan_request_filter() const
          method is_connection_request_in_filter (line 322) | bool is_connection_request_in_filter( const device_address& addr...
          method is_scan_request_in_filter (line 327) | bool is_scan_request_in_filter( const device_address& addr ) const
          method Radio (line 332) | Radio& this_to_radio()
          method Radio (line 337) | const Radio& this_to_radio() const
      class white_list (line 30) | class white_list
        type meta_type (line 125) | struct meta_type :
        type impl (line 130) | struct impl :
      type no_white_list (line 147) | struct no_white_list {
        type impl (line 150) | struct impl {
          method is_connection_request_in_filter (line 151) | bool is_connection_request_in_filter( const device_address& ) const
          method is_scan_request_in_filter (line 156) | bool is_scan_request_in_filter( const device_address& ) const
        type meta_type (line 162) | struct meta_type :
      type details (line 168) | namespace details {
        type white_list_meta_type (line 14) | struct white_list_meta_type {}
        class white_list_implementation (line 17) | class white_list_implementation
        class white_list_implementation< Size, true, Radio, LinkLayer > (line 174) | class white_list_implementation< Size, true, Radio, LinkLayer >
          method white_list_implementation (line 179) | white_list_implementation()
          method white_list_free_size (line 187) | std::size_t white_list_free_size() const
          method clear_white_list (line 192) | void clear_white_list()
          method add_to_white_list (line 197) | bool add_to_white_list( const device_address& addr )
          method is_in_white_list (line 210) | bool is_in_white_list( const device_address& addr ) const
          method remove_from_white_list (line 216) | bool remove_from_white_list( const device_address& addr )
          method connection_request_filter (line 230) | void connection_request_filter( bool b )
          method connection_request_filter (line 235) | bool connection_request_filter() const
          method scan_request_filter (line 240) | void scan_request_filter( bool b )
          method scan_request_filter (line 245) | bool scan_request_filter() const
          method is_connection_request_in_filter (line 250) | bool is_connection_request_in_filter( const device_address& addr...
          method is_scan_request_in_filter (line 255) | bool is_scan_request_in_filter( const device_address& addr ) const
        class white_list_implementation< Size, false, Radio, LinkLayer > (line 272) | class white_list_implementation< Size, false, Radio, LinkLayer >
          method white_list_free_size (line 277) | std::size_t white_list_free_size() const
          method clear_white_list (line 282) | void clear_white_list()
          method add_to_white_list (line 287) | bool add_to_white_list( const device_address& addr )
          method is_in_white_list (line 292) | bool is_in_white_list( const device_address& addr ) const
          method remove_from_white_list (line 297) | bool remove_from_white_list( const device_address& addr )
          method connection_request_filter (line 302) | void connection_request_filter( bool b )
          method connection_request_filter (line 307) | bool connection_request_filter() const
          method scan_request_filter (line 312) | void scan_request_filter( bool b )
          method scan_request_filter (line 317) | bool scan_request_filter() const
          method is_connection_request_in_filter (line 322) | bool is_connection_request_in_filter( const device_address& addr...
          method is_scan_request_in_filter (line 327) | bool is_scan_request_in_filter( const device_address& addr ) const
          method Radio (line 332) | Radio& this_to_radio()
          method Radio (line 337) | const Radio& this_to_radio() const

FILE: bluetoe/link_layer/scheduled_radio.hpp
  type bluetoe (line 9) | namespace bluetoe {
    type link_layer (line 10) | namespace link_layer {
      class delta_time (line 12) | class delta_time
      class write_buffer (line 13) | class write_buffer
      class read_buffer (line 14) | class read_buffer
      class scheduled_radio (line 27) | class scheduled_radio : public ll_data_pdu_buffer< TransmitSize, Rec...
        class lock_guard (line 166) | class lock_guard
      class scheduled_radio_with_encryption (line 291) | class scheduled_radio_with_encryption : public scheduled_radio< Tran...
      type pdu_layout (line 463) | struct pdu_layout {

FILE: bluetoe/link_state.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type details (line 8) | namespace details {
      class link_state (line 19) | class link_state
        method link_state (line 22) | link_state()
        method is_encrypted (line 31) | bool is_encrypted() const
        method is_encrypted (line 41) | bool is_encrypted( bool encrypted )
        method device_pairing_status (line 52) | device_pairing_status pairing_status() const
        method pairing_status (line 60) | void pairing_status( device_pairing_status status )
        method connection_security_attributes (line 68) | connection_security_attributes security_attributes() const
      class link_state_no_security (line 81) | class link_state_no_security
        method is_encrypted (line 84) | bool is_encrypted() const
        method device_pairing_status (line 92) | device_pairing_status pairing_status() const
        method connection_security_attributes (line 100) | connection_security_attributes security_attributes() const

FILE: bluetoe/meta_types.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type details (line 6) | namespace details {
      type valid_characteristic_option_meta_type (line 11) | struct valid_characteristic_option_meta_type {}
      type valid_service_option_meta_type (line 16) | struct valid_service_option_meta_type {}
      type valid_server_option_meta_type (line 21) | struct valid_server_option_meta_type {}
      type service_meta_type (line 26) | struct service_meta_type {}
      type characteristic_meta_type (line 31) | struct characteristic_meta_type {}
      type advertising_data_meta_type (line 36) | struct advertising_data_meta_type {}
      type scan_response_data_meta_type (line 41) | struct scan_response_data_meta_type {}
      type binding_option_meta_type (line 46) | struct binding_option_meta_type {}

FILE: bluetoe/mixin.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type mixin (line 8) | struct mixin
      type meta_type (line 80) | struct meta_type :
    class server (line 11) | class server
    type details (line 13) | namespace details {
      type mixin_meta_type (line 14) | struct mixin_meta_type {}
      type sum_mixins (line 17) | struct sum_mixins
      type sum_mixins< std::tuple<> > (line 20) | struct sum_mixins< std::tuple<> >
      type extract_service_mixins (line 33) | struct extract_service_mixins
      type collect_mixins (line 49) | struct collect_mixins
    type mixin (line 78) | struct mixin {
      type meta_type (line 80) | struct meta_type :
  type sum_mixins< std::tuple< mixin< Ts... >, Ms... > > (line 26) | struct sum_mixins< std::tuple< mixin< Ts... >, Ms... > >{
  type extract_service_mixins< std::tuple< Ms... >, bluetoe::service< Options... > > (line 36) | struct extract_service_mixins< std::tuple< Ms... >, bluetoe::service< Op...
  type extract_service_mixins< std::tuple< Ms... >, T > (line 43) | struct extract_service_mixins< std::tuple< Ms... >, T >

FILE: bluetoe/notification_queue.hpp
  type bluetoe (line 11) | namespace bluetoe {
    type details (line 13) | namespace details {
      type notification_queue_entry_type (line 17) | enum class notification_queue_entry_type {
      class notification_queue_impl_base (line 27) | class notification_queue_impl_base
      class notification_queue_impl (line 168) | class notification_queue_impl
        method notification_queue_impl (line 171) | notification_queue_impl()
        method queue_notification (line 176) | bool queue_notification( std::size_t index )
        method queue_indication (line 182) | bool queue_indication( std::size_t index )
        method dequeue_indication_or_confirmation (line 189) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 218) | void clear_indications_and_confirmations()
        method at (line 225) | int at( std::size_t index )
        method add (line 234) | bool add( std::size_t index, int bits )
        method remove (line 247) | void remove( std::size_t index, int bits )
        type char_bits (line 259) | enum char_bits {
      class notification_queue_impl< 1, C > (line 272) | class notification_queue_impl< 1, C >
        method notification_queue_impl (line 275) | notification_queue_impl()
        method queue_notification (line 280) | bool queue_notification( std::size_t idx )
        method queue_indication (line 293) | bool queue_indication( std::size_t idx )
        method dequeue_indication_or_confirmation (line 305) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 320) | void clear_indications_and_confirmations()
      class notification_queue_impl_base< std::tuple<>, C > (line 329) | class notification_queue_impl_base< std::tuple<>, C >
        method queue_notification (line 332) | bool queue_notification( std::size_t ) { return false; }
        method queue_indication (line 333) | bool queue_indication( std::size_t ) { return false; }
        method dequeue_indication_or_confirmation (line 335) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 340) | void clear_indications_and_confirmations() {}
    class notification_queue (line 46) | class notification_queue : public Mixin, details::notification_queue_i...
    type details (line 164) | namespace details
      type notification_queue_entry_type (line 17) | enum class notification_queue_entry_type {
      class notification_queue_impl_base (line 27) | class notification_queue_impl_base
      class notification_queue_impl (line 168) | class notification_queue_impl
        method notification_queue_impl (line 171) | notification_queue_impl()
        method queue_notification (line 176) | bool queue_notification( std::size_t index )
        method queue_indication (line 182) | bool queue_indication( std::size_t index )
        method dequeue_indication_or_confirmation (line 189) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 218) | void clear_indications_and_confirmations()
        method at (line 225) | int at( std::size_t index )
        method add (line 234) | bool add( std::size_t index, int bits )
        method remove (line 247) | void remove( std::size_t index, int bits )
        type char_bits (line 259) | enum char_bits {
      class notification_queue_impl< 1, C > (line 272) | class notification_queue_impl< 1, C >
        method notification_queue_impl (line 275) | notification_queue_impl()
        method queue_notification (line 280) | bool queue_notification( std::size_t idx )
        method queue_indication (line 293) | bool queue_indication( std::size_t idx )
        method dequeue_indication_or_confirmation (line 305) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 320) | void clear_indications_and_confirmations()
      class notification_queue_impl_base< std::tuple<>, C > (line 329) | class notification_queue_impl_base< std::tuple<>, C >
        method queue_notification (line 332) | bool queue_notification( std::size_t ) { return false; }
        method queue_indication (line 333) | bool queue_indication( std::size_t ) { return false; }
        method dequeue_indication_or_confirmation (line 335) | std::pair< notification_queue_entry_type, std::size_t > dequeue_in...
        method clear_indications_and_confirmations (line 340) | void clear_indications_and_confirmations() {}
  class notification_queue_impl_base< std::tuple< std::integral_constant< int, Size >, Ts... >, C > (line 344) | class notification_queue_impl_base< std::tuple< std::integral_constant< ...
    method queue_notification (line 352) | bool queue_notification( std::size_t idx )
    method queue_indication (line 359) | bool queue_indication( std::size_t idx )
    method dequeue_indication_or_confirmation (line 366) | std::pair< notification_queue_entry_type, std::size_t > dequeue_indica...
    method clear_indications_and_confirmations (line 380) | void clear_indications_and_confirmations()

FILE: bluetoe/outgoing_priority.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type details (line 8) | namespace details {
      type outgoing_priority_meta_type (line 9) | struct outgoing_priority_meta_type {}
      type number_of_additional_priorities (line 12) | struct number_of_additional_priorities
      type check_server_parameter (line 33) | struct check_server_parameter
      type check_service_parameter (line 42) | struct check_service_parameter
      type add_prio (line 51) | struct add_prio
      type add_prio< std::tuple<>, 0 > (line 54) | struct add_prio< std::tuple<>, 0 >
      type add_prio< std::tuple<>, Prio > (line 66) | struct add_prio< std::tuple<>, Prio >
    type higher_outgoing_priority (line 160) | struct higher_outgoing_priority {
      type meta_type (line 162) | struct meta_type :
      type service_base_priority (line 168) | struct service_base_priority
        type optional_sum_prio (line 171) | struct optional_sum_prio
      type expand_shared_priorities (line 194) | struct expand_shared_priorities
      type characteristic_priority (line 211) | struct characteristic_priority
      type numbers_from_char (line 230) | struct numbers_from_char
        type impl (line 233) | struct impl
      type numbers (line 242) | struct numbers
      type characteristic_position (line 265) | struct characteristic_position
    type lower_outgoing_priority (line 284) | struct lower_outgoing_priority {
      type meta_type (line 286) | struct meta_type :
  type add_prio< std::tuple< std::integral_constant< int, N >, Ts... >, 0 > (line 60) | struct add_prio< std::tuple< std::integral_constant< int, N >, Ts... >, 0 >
  type add_prio< std::tuple< std::integral_constant< int, N >, Ts... >, Prio > (line 74) | struct add_prio< std::tuple< std::integral_constant< int, N >, Ts... >, ...

FILE: bluetoe/pairing_status.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type device_pairing_status (line 11) | enum class device_pairing_status {
    type connection_security_attributes (line 23) | struct connection_security_attributes
      method connection_security_attributes (line 38) | constexpr connection_security_attributes()
      method connection_security_attributes (line 47) | constexpr connection_security_attributes( bool encrypted, device_pai...

FILE: bluetoe/peripheral_connection_interval_range.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type details (line 8) | namespace details {
      type peripheral_connection_interval_range_meta_type (line 9) | struct peripheral_connection_interval_range_meta_type {}
      type check_peripheral_connection_interval_range_parameters (line 14) | struct check_peripheral_connection_interval_range_parameters
      type no_peripheral_connection_interval_range (line 28) | struct no_peripheral_connection_interval_range
    type peripheral_connection_interval_range (line 52) | struct peripheral_connection_interval_range
      type meta_type (line 55) | struct meta_type :

FILE: bluetoe/scattered_access.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type details (line 8) | namespace details {
      function scattered_read_access (line 23) | void scattered_read_access(

FILE: bluetoe/sensor_location.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type details (line 6) | namespace details {
      type sensor_location_meta_type (line 7) | struct sensor_location_meta_type {}
    type sensor_location_tag (line 14) | struct sensor_location_tag
      type meta_type (line 17) | struct meta_type :
    type sensor_location (line 30) | struct sensor_location

FILE: bluetoe/server.hpp
  type bluetoe (line 32) | namespace bluetoe {
    type details (line 33) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
    class server (line 80) | class server
      class connection_data (line 120) | class connection_data
        method connection_data (line 124) | connection_data()
        method negotiated_mtu (line 132) | std::uint16_t negotiated_mtu() const
        method client_mtu (line 144) | void client_mtu( std::uint16_t mtu )
        method client_mtu (line 155) | std::uint16_t client_mtu() const
        method server_mtu (line 164) | std::uint16_t server_mtu() const
      class channel_data_t (line 351) | class channel_data_t
    type extend_server (line 480) | struct extend_server
    type details (line 599) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
    type details (line 1031) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
    type details (line 1163) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
    type details (line 1265) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
    type details (line 1554) | namespace details {
      type copy_name (line 602) | struct copy_name
      type copy_name< false > (line 628) | struct copy_name< false >
      type value_filter (line 1033) | struct value_filter
        method value_filter (line 1035) | value_filter( const std::uint8_t* begin, const std::uint8_t* end, ...
      type collect_find_by_type_groups (line 1053) | struct collect_find_by_type_groups
        method collect_find_by_type_groups (line 1055) | collect_find_by_type_groups( std::uint8_t* begin, std::uint8_t* end )
        method size (line 1076) | std::uint8_t size() const
      type collect_attributes (line 1165) | struct collect_attributes
        method collect_attributes (line 1198) | collect_attributes( std::uint8_t* begin, std::uint8_t* end,
        method size (line 1213) | std::uint8_t size() const
        method data_size (line 1218) | std::uint8_t data_size() const
        method empty (line 1223) | bool empty() const
      type collect_primary_services (line 1267) | struct collect_primary_services
        method collect_primary_services (line 1269) | collect_primary_services( std::uint8_t*& output, std::uint8_t* end...
        method each (line 1284) | void each()
      type services_by_group (line 1556) | struct services_by_group
        method services_by_group (line 1558) | services_by_group( std::uint16_t starting_handle, std::uint16_t en...
        method each (line 1574) | void each()
  type extend_server< server< ServerOptions... >, Options... > (line 483) | struct extend_server< server< ServerOptions... >, Options... > : server<...

FILE: bluetoe/server_meta_type.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type details (line 5) | namespace details {
      type server_meta_type (line 6) | struct server_meta_type {}

FILE: bluetoe/server_name.hpp
  type bluetoe (line 6) | namespace bluetoe {
    type details (line 8) | namespace details {
      type server_name_meta_type (line 9) | struct server_name_meta_type {}
    type server_name (line 16) | struct server_name {
      type meta_type (line 18) | struct meta_type :
      method size (line 29) | static constexpr std::size_t size()

FILE: bluetoe/service.hpp
  type bluetoe (line 19) | namespace bluetoe {
    type service_name (line 22) | struct service_name {
    type details (line 28) | namespace details {
      type is_secondary_service_meta_type (line 29) | struct is_secondary_service_meta_type {}
      type include_service_meta_type (line 30) | struct include_service_meta_type {}
      type service_defintion_tag (line 31) | struct service_defintion_tag {}
      type count_service_attributes (line 34) | struct count_service_attributes
      type find_service_by_uuid (line 339) | struct find_service_by_uuid
        type equal_uuid (line 342) | struct equal_uuid : std::is_same< typename T::uuid, UUID > {}
      type service_handles (line 348) | struct service_handles
      type count_service_attributes (line 514) | struct count_service_attributes{
    class service_uuid (line 53) | class service_uuid
      type meta_type (line 60) | struct meta_type :
    class service_uuid16 (line 76) | class service_uuid16
      type meta_type (line 83) | struct meta_type :
    class start_handle (line 95) | class start_handle
      type meta_type (line 99) | struct meta_type :
    class service (line 149) | class service
      type meta_type (line 175) | struct meta_type :
    type is_secondary_service (line 207) | struct is_secondary_service {
      type meta_type (line 209) | struct meta_type :
    type secondary_service (line 227) | struct secondary_service : service< Options..., is_secondary_service > {}
    type include_service (line 241) | struct include_service
    type include_service< service_uuid< A, B, C, D, E > > (line 249) | struct include_service< service_uuid< A, B, C, D, E > >
      type meta_type (line 252) | struct meta_type :
    type include_service< service_uuid16< UUID > > (line 259) | struct include_service< service_uuid16< UUID > >
      type meta_type (line 262) | struct meta_type :
    type details (line 276) | namespace details {
      type is_secondary_service_meta_type (line 29) | struct is_secondary_service_meta_type {}
      type include_service_meta_type (line 30) | struct include_service_meta_type {}
      type service_defintion_tag (line 31) | struct service_defintion_tag {}
      type count_service_attributes (line 34) | struct count_service_attributes
      type find_service_by_uuid (line 339) | struct find_service_by_uuid
        type equal_uuid (line 342) | struct equal_uuid : std::is_same< typename T::uuid, UUID > {}
      type service_handles (line 348) | struct service_handles
      type count_service_attributes (line 514) | struct count_service_attributes{
    type details (line 336) | namespace details {
      type is_secondary_service_meta_type (line 29) | struct is_secondary_service_meta_type {}
      type include_service_meta_type (line 30) | struct include_service_meta_type {}
      type service_defintion_tag (line 31) | struct service_defintion_tag {}
      type count_service_attributes (line 34) | struct count_service_attributes
      type find_service_by_uuid (line 339) | struct find_service_by_uuid
        type equal_uuid (line 342) | struct equal_uuid : std::is_same< typename T::uuid, UUID > {}
      type service_handles (line 348) | struct service_handles
      type count_service_attributes (line 514) | struct count_service_attributes{
  type service_handles< std::tuple< Service, Ss... >, Service, Handle > (line 351) | struct service_handles< std::tuple< Service, Ss... >, Service, Handle >
  type service_handles< std::tuple< S, Ss... >, Service, Handle > (line 358) | struct service_handles< std::tuple< S, Ss... >, Service, Handle >
  type generate_attribute< service_defintion_tag, CCCDIndices, ClientCharacteristicIndex, ServiceUUID, Server, Options... > (line 370) | struct generate_attribute< service_defintion_tag, CCCDIndices, ClientCha...
    method attribute_access_result (line 372) | static attribute_access_result access( attribute_access_arguments& arg...
  type generate_attribute< include_service< service_uuid16< UUID > >, CCCDIndices, ClientCharacteristicIndex, ServiceUUID, Server, Options... > (line 420) | struct generate_attribute< include_service< service_uuid16< UUID > >, CC...
    method access (line 429) | static details::attribute_access_result access( attribute_access_argum...
  type generate_attribute< include_service< service_uuid< A, B, C, D, E > >, CCCDIndices, ClientCharacteristicIndex, ServiceUUID, Server, Options... > (line 473) | struct generate_attribute< include_service< service_uuid< A, B, C, D, E ...
    method access (line 482) | static details::attribute_access_result access( attribute_access_argum...

FILE: bluetoe/service_uuid.hpp
  type bluetoe (line 4) | namespace bluetoe {
    type details (line 5) | namespace details {
      type service_uuid_meta_type (line 6) | struct service_uuid_meta_type {}
      type service_uuid_16_meta_type (line 7) | struct service_uuid_16_meta_type : service_uuid_meta_type {}
      type service_uuid_128_meta_type (line 8) | struct service_uuid_128_meta_type : service_uuid_meta_type {}

FILE: bluetoe/services/bas.hpp
  type bluetoe (line 7) | namespace bluetoe
    type bas (line 9) | namespace bas
      type details (line 21) | namespace details {
        type handler_tag (line 23) | struct handler_tag {}
        type no_battery_level_notifications_tag (line 24) | struct no_battery_level_notifications_tag {}
        type valid_bas_service_option_tag (line 25) | struct valid_bas_service_option_tag {}
        type handler_impl (line 28) | struct handler_impl
          type read_handler (line 30) | struct read_handler : bluetoe::details::value_handler_base
            method call_read_handler (line 33) | static std::uint8_t call_read_handler( std::size_t offset, std...
            type meta_type (line 50) | struct meta_type :
          method notifiy_battery_level (line 56) | void notifiy_battery_level( Server& srv )
        type service_impl (line 63) | struct service_impl
        type calculate_service (line 84) | struct calculate_service {
      type no_battery_level_notifications (line 105) | struct no_battery_level_notifications {
        type meta_type (line 107) | struct meta_type : details::no_battery_level_notifications_tag
      type handler (line 124) | struct handler {
        type meta_type (line 128) | struct meta_type : details::handler_tag
  type service_impl< Handler, std::tuple< Options... > > (line 66) | struct service_impl< Handler, std::tuple< Options... > >

FILE: bluetoe/services/bootloader.hpp
  type bluetoe (line 17) | namespace bluetoe
    type bootloader (line 19) | namespace bootloader {
      type details (line 22) | namespace details {
        type handler_meta_type (line 23) | struct handler_meta_type {}
        type memory_region_meta_type (line 24) | struct memory_region_meta_type {}
        type page_size_meta_type (line 25) | struct page_size_meta_type {}
        class flash_buffer (line 157) | class flash_buffer
          method flash_buffer (line 160) | flash_buffer()
          method free_size (line 166) | std::uint32_t free_size() const
          method set_start_address (line 174) | void set_start_address( std::uintptr_t address, Handler& h, std:...
          method write_data (line 187) | std::size_t write_data( std::size_t write_size, const std::uint8...
          method flush (line 207) | bool flush( Handler& h )
          method crc (line 223) | std::uint32_t crc() const
          method free (line 228) | void free()
          method empty (line 234) | bool empty() const
          method consecutive (line 239) | std::uint16_t consecutive() const
        type opcode (line 257) | enum opcode : std::uint8_t
        type data_code (line 271) | enum data_code : std::uint8_t
        class controller (line 277) | class controller : public UserHandler
          method controller (line 280) | controller()
          method read_address (line 292) | std::uintptr_t read_address( const std::uint8_t* rend )
          method bootloader_write_control_point (line 304) | std::pair< std::uint8_t, bool > bootloader_write_control_point( ...
          method bootloader_read_control_point (line 417) | std::uint8_t bootloader_read_control_point( std::size_t read_siz...
          method bootloader_write_data (line 491) | std::uint8_t bootloader_write_data( std::size_t write_size, cons...
          method bootloader_read_data (line 517) | std::uint8_t bootloader_read_data( std::size_t read_size, std::u...
          method bootloader_progress_data (line 548) | std::uint8_t bootloader_progress_data( std::size_t read_size, st...
          method end_flash (line 567) | void end_flash( Server& server )
          method bootloader_control_point_notification (line 573) | void bootloader_control_point_notification( Server& server )
          method bootloader_data_indication (line 579) | void bootloader_data_indication( Server& server )
          method free_size (line 585) | std::uint32_t free_size() const
          method find_next_buffer (line 595) | bool find_next_buffer( std::size_t start_address )
          method request_error (line 611) | std::pair< std::uint8_t, bool > request_error( std::uint8_t code )
        type calculate_service (line 634) | struct calculate_service {
      type page_size (line 33) | struct page_size
      type memory_region (line 48) | struct memory_region {}
      type white_list (line 54) | struct white_list
      type white_list<> (line 70) | struct white_list<>
        method acceptable (line 72) | static bool acceptable( std::uintptr_t, std::uintptr_t )
      type handler (line 85) | struct handler {
      function end_flash (line 96) | void end_flash( Server& srv )
      type att_error_codes (line 124) | enum att_error_codes : std::uint8_t {
      type error_codes (line 137) | enum class error_codes : std::uint8_t {
      type details (line 150) | namespace details {
        type handler_meta_type (line 23) | struct handler_meta_type {}
        type memory_region_meta_type (line 24) | struct memory_region_meta_type {}
        type page_size_meta_type (line 25) | struct page_size_meta_type {}
        class flash_buffer (line 157) | class flash_buffer
          method flash_buffer (line 160) | flash_buffer()
          method free_size (line 166) | std::uint32_t free_size() const
          method set_start_address (line 174) | void set_start_address( std::uintptr_t address, Handler& h, std:...
          method write_data (line 187) | std::size_t write_data( std::size_t write_size, const std::uint8...
          method flush (line 207) | bool flush( Handler& h )
          method crc (line 223) | std::uint32_t crc() const
          method free (line 228) | void free()
          method empty (line 234) | bool empty() const
          method consecutive (line 239) | std::uint16_t consecutive() const
        type opcode (line 257) | enum opcode : std::uint8_t
        type data_code (line 271) | enum data_code : std::uint8_t
        class controller (line 277) | class controller : public UserHandler
          method controller (line 280) | controller()
          method read_address (line 292) | std::uintptr_t read_address( const std::uint8_t* rend )
          method bootloader_write_control_point (line 304) | std::pair< std::uint8_t, bool > bootloader_write_control_point( ...
          method bootloader_read_control_point (line 417) | std::uint8_t bootloader_read_control_point( std::size_t read_siz...
          method bootloader_write_data (line 491) | std::uint8_t bootloader_write_data( std::size_t write_size, cons...
          method bootloader_read_data (line 517) | std::uint8_t bootloader_read_data( std::size_t read_size, std::u...
          method bootloader_progress_data (line 548) | std::uint8_t bootloader_progress_data( std::size_t read_size, st...
          method end_flash (line 567) | void end_flash( Server& server )
          method bootloader_control_point_notification (line 573) | void bootloader_control_point_notification( Server& server )
          method bootloader_data_indication (line 579) | void bootloader_data_indication( Server& server )
          method free_size (line 585) | std::uint32_t free_size() const
          method find_next_buffer (line 595) | bool find_next_buffer( std::size_t start_address )
          method request_error (line 611) | std::pair< std::uint8_t, bool > request_error( std::uint8_t code )
        type calculate_service (line 634) | struct calculate_service {
      class bootloader_handler_prototype (line 699) | class bootloader_handler_prototype
  type white_list< memory_region< Start, End >, Regions ... > (line 58) | struct white_list< memory_region< Start, End >, Regions ... >
    method acceptable (line 60) | static bool acceptable( std::uintptr_t start, std::uintptr_t end )

FILE: bluetoe/services/csc.hpp
  type bluetoe (line 10) | namespace bluetoe {
    type csc (line 12) | namespace csc {
      type details (line 19) | namespace details {
        type handler_tag (line 21) | struct handler_tag {}
        type wheel_revolution_data_handler_tag (line 23) | struct wheel_revolution_data_handler_tag {}
        type crank_revolution_data_handler_tag (line 24) | struct crank_revolution_data_handler_tag {}
        type service_from_parameters (line 114) | struct service_from_parameters
        type no_wheel_revolution_data_supported (line 121) | struct no_wheel_revolution_data_supported {
          method add_wheel_mesurement (line 125) | void add_wheel_mesurement( std::uint8_t&, std::uint8_t*&, T& ) {}
        type no_crank_revolution_data_supported (line 130) | struct no_crank_revolution_data_supported {
          method add_crank_mesurement (line 134) | void add_crank_mesurement( std::uint8_t&, std::uint8_t*&, T& ) {}
        class sensor_position_handler (line 154) | class sensor_position_handler
        class no_sensor_position_handler (line 235) | class no_sensor_position_handler
          method request_supported_sensor_locations_opcode_response (line 238) | std::uint8_t request_supported_sensor_locations_opcode_response(...
          method update_sensor_location_opcode_response (line 252) | std::uint8_t update_sensor_location_opcode_response( std::size_t...
          method set_sensor_position (line 266) | void set_sensor_position( std::uint8_t ) {}
        class control_point_handler (line 270) | class control_point_handler : public SensorPositionHandler
          method control_point_handler (line 273) | control_point_handler()
          method csc_read_control_point (line 278) | std::uint8_t csc_read_control_point( std::size_t read_size, std:...
          method csc_write_control_point (line 323) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
        type no_control_point_handler (line 372) | struct no_control_point_handler {
          method csc_read_control_point (line 373) | std::uint8_t csc_read_control_point( std::size_t, std::uint8_t*,...
          method csc_write_control_point (line 378) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
        class implementation (line 384) | class implementation : public Base, WheelHandler, CrankHandler, pu...
          method csc_wheel_revolution (line 389) | void csc_wheel_revolution( std::uint32_t, std::uint32_t )
          method csc_mesurement (line 393) | std::uint8_t csc_mesurement( std::size_t read_size, std::uint8_t...
          method csc_read_control_point (line 409) | std::uint8_t csc_read_control_point( std::size_t read_size, std:...
          method csc_write_control_point (line 414) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
          method notify_timed_update (line 420) | void notify_timed_update( Server& server )
          method confirm_cumulative_wheel_revolutions (line 426) | void confirm_cumulative_wheel_revolutions( Server& server )
        type select_sensorlocation_implementation (line 434) | struct select_sensorlocation_implementation
        type select_sensorlocation_implementation< false, false, SensorList > (line 437) | struct select_sensorlocation_implementation< false, false, SensorL...
        type select_sensorlocation_implementation< true, false, std::tuple< SensorPosition > > (line 443) | struct select_sensorlocation_implementation< true, false, std::tup...
        type select_sensorlocation_implementation< true, true, SensorList > (line 453) | struct select_sensorlocation_implementation< true, true, SensorList >
        type calculate_service (line 466) | struct calculate_service
      type handler (line 34) | struct handler
        type meta_type (line 37) | struct meta_type :
      type wheel_revolution_data_supported (line 62) | struct wheel_revolution_data_supported {
        type meta_type (line 64) | struct meta_type :
        method add_wheel_mesurement (line 70) | void add_wheel_mesurement( std::uint8_t& flags, std::uint8_t*& out...
      type crank_revolution_data_supported (line 83) | struct crank_revolution_data_supported {
        type meta_type (line 85) | struct meta_type :
        method add_crank_mesurement (line 90) | void add_crank_mesurement( std::uint8_t& flags, std::uint8_t*& out...
      type details (line 103) | namespace details {
        type handler_tag (line 21) | struct handler_tag {}
        type wheel_revolution_data_handler_tag (line 23) | struct wheel_revolution_data_handler_tag {}
        type crank_revolution_data_handler_tag (line 24) | struct crank_revolution_data_handler_tag {}
        type service_from_parameters (line 114) | struct service_from_parameters
        type no_wheel_revolution_data_supported (line 121) | struct no_wheel_revolution_data_supported {
          method add_wheel_mesurement (line 125) | void add_wheel_mesurement( std::uint8_t&, std::uint8_t*&, T& ) {}
        type no_crank_revolution_data_supported (line 130) | struct no_crank_revolution_data_supported {
          method add_crank_mesurement (line 134) | void add_crank_mesurement( std::uint8_t&, std::uint8_t*&, T& ) {}
        class sensor_position_handler (line 154) | class sensor_position_handler
        class no_sensor_position_handler (line 235) | class no_sensor_position_handler
          method request_supported_sensor_locations_opcode_response (line 238) | std::uint8_t request_supported_sensor_locations_opcode_response(...
          method update_sensor_location_opcode_response (line 252) | std::uint8_t update_sensor_location_opcode_response( std::size_t...
          method set_sensor_position (line 266) | void set_sensor_position( std::uint8_t ) {}
        class control_point_handler (line 270) | class control_point_handler : public SensorPositionHandler
          method control_point_handler (line 273) | control_point_handler()
          method csc_read_control_point (line 278) | std::uint8_t csc_read_control_point( std::size_t read_size, std:...
          method csc_write_control_point (line 323) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
        type no_control_point_handler (line 372) | struct no_control_point_handler {
          method csc_read_control_point (line 373) | std::uint8_t csc_read_control_point( std::size_t, std::uint8_t*,...
          method csc_write_control_point (line 378) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
        class implementation (line 384) | class implementation : public Base, WheelHandler, CrankHandler, pu...
          method csc_wheel_revolution (line 389) | void csc_wheel_revolution( std::uint32_t, std::uint32_t )
          method csc_mesurement (line 393) | std::uint8_t csc_mesurement( std::size_t read_size, std::uint8_t...
          method csc_read_control_point (line 409) | std::uint8_t csc_read_control_point( std::size_t read_size, std:...
          method csc_write_control_point (line 414) | std::pair< std::uint8_t, bool > csc_write_control_point( std::si...
          method notify_timed_update (line 420) | void notify_timed_update( Server& server )
          method confirm_cumulative_wheel_revolutions (line 426) | void confirm_cumulative_wheel_revolutions( Server& server )
        type select_sensorlocation_implementation (line 434) | struct select_sensorlocation_implementation
        type select_sensorlocation_implementation< false, false, SensorList > (line 437) | struct select_sensorlocation_implementation< false, false, SensorL...
        type select_sensorlocation_implementation< true, false, std::tuple< SensorPosition > > (line 443) | struct select_sensorlocation_implementation< true, false, std::tup...
        type select_sensorlocation_implementation< true, true, SensorList > (line 453) | struct select_sensorlocation_implementation< true, true, SensorList >
        type calculate_service (line 466) | struct calculate_service
    class cycling_speed_and_cadence_handler_prototype (line 576) | class cycling_speed_and_cadence_handler_prototype
  type service_from_parameters< std::tuple< Ts... > > (line 117) | struct service_from_parameters< std::tuple< Ts... > > {
  class sensor_position_handler< std::tuple< SensorLocations... > > (line 157) | class sensor_position_handler< std::tuple< SensorLocations... > >
    method sensor_position_handler (line 160) | sensor_position_handler()
    method request_supported_sensor_locations_opcode_response (line 166) | std::uint8_t request_supported_sensor_locations_opcode_response( std::...
    method update_sensor_location_opcode_response (line 183) | std::uint8_t update_sensor_location_opcode_response( std::size_t read_...
    method set_sensor_position (line 209) | void set_sensor_position( std::uint8_t new_sensor_position )
    method csc_sensor_location (line 214) | std::uint8_t csc_sensor_location( std::size_t read_size, std::uint8_t*...

FILE: bluetoe/services/dis.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type dis (line 9) | namespace dis {
      type system_id (line 96) | struct system_id
      type ieee_11073_20601_regulatory_certification_data_list (line 104) | struct ieee_11073_20601_regulatory_certification_data_list
      type vendor_id_source_t (line 111) | enum class vendor_id_source_t : std::uint8_t
      type details (line 124) | namespace details {
        type pnp_id_value (line 127) | struct pnp_id_value : bluetoe::cstring_wrapper< pnp_id_value< Vend...
          method size (line 149) | static constexpr std::size_t size()

FILE: bluetoe/services/gatt.hpp
  type bluetoe (line 8) | namespace bluetoe {
    type gatt (line 10) | namespace gatt {

FILE: bluetoe/services/hid.hpp
  type bluetoe (line 7) | namespace bluetoe {
    type hid (line 9) | namespace hid {
      type report_type (line 26) | enum class report_type : std::uint8_t {
      type details (line 32) | namespace details {
        type report_reference_impl (line 34) | struct report_reference_impl {

FILE: bluetoe/sm/include/bluetoe/io_capabilities.hpp
  type bluetoe (line 8) | namespace bluetoe
    type details (line 10) | namespace details {
      type pairing_input_capabilty_meta_type (line 11) | struct pairing_input_capabilty_meta_type {}
      type pairing_output_capabilty_meta_type (line 12) | struct pairing_output_capabilty_meta_type {}
      type pairing_just_works_meta_type (line 13) | struct pairing_just_works_meta_type {}
      type io_capabilities (line 15) | enum class io_capabilities : std::uint8_t {
      type legacy_pairing_algorithm (line 24) | enum class legacy_pairing_algorithm : std::uint8_t {
      type lesc_pairing_algorithm (line 31) | enum class lesc_pairing_algorithm : std::uint8_t {
      class io_capabilities_matrix (line 389) | class io_capabilities_matrix
        method io_capabilities (line 395) | static io_capabilities get_io_capabilities()
        method legacy_pairing_algorithm (line 400) | static legacy_pairing_algorithm select_legacy_pairing_algorithm( s...
        method legacy_pairing_algorithm (line 405) | static legacy_pairing_algorithm select_legacy_pairing_algorithm( i...
        method lesc_pairing_algorithm (line 410) | static lesc_pairing_algorithm select_lesc_pairing_algorithm( std::...
        method lesc_pairing_algorithm (line 415) | static lesc_pairing_algorithm select_lesc_pairing_algorithm( io_ca...
        method sm_pairing_numeric_output (line 420) | static void sm_pairing_numeric_output( const std::array< std::uint...
        method sm_pairing_numeric_compare_output (line 426) | static void sm_pairing_numeric_compare_output( const S& state, F& ...
        method sm_pairing_passkey (line 431) | static std::array< std::uint8_t, 16 > sm_pairing_passkey()
        method sm_pairing_request_yes_no (line 437) | static void sm_pairing_request_yes_no( S& state )
    type pairing_no_input (line 49) | struct pairing_no_input
      method sm_pairing_passkey (line 52) | static std::array< std::uint8_t, 16 > sm_pairing_passkey()
      method sm_pairing_request_yes_no (line 58) | static bool sm_pairing_request_yes_no( const S& )
      type meta_type (line 63) | struct meta_type :
    class pairing_yes_no_response (line 75) | class pairing_yes_no_response
    type pairing_yes_no (line 102) | struct pairing_yes_no
      method sm_pairing_passkey (line 105) | static std::array< std::uint8_t, 16 > sm_pairing_passkey()
      method sm_pairing_request_yes_no (line 111) | static void sm_pairing_request_yes_no( S& state )
      type meta_type (line 117) | struct meta_type :
    type pairing_keyboard (line 139) | struct pairing_keyboard
      method sm_pairing_passkey (line 142) | static std::array< std::uint8_t, 16 > sm_pairing_passkey()
      type meta_type (line 150) | struct meta_type :
    type pairing_no_output (line 159) | struct pairing_no_output
      method get_io_capabilities (line 162) | static details::io_capabilities get_io_capabilities( const pairing_n...
      method get_io_capabilities (line 168) | static details::io_capabilities get_io_capabilities( const pairing_y...
      method get_io_capabilities (line 174) | static details::io_capabilities get_io_capabilities( const pairing_k...
      method select_legacy_pairing_algorithm (line 179) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_legacy_pairing_algorithm (line 185) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_legacy_pairing_algorithm (line 191) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_lesc_pairing_algorithm (line 199) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method select_lesc_pairing_algorithm (line 205) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method select_lesc_pairing_algorithm (line 211) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method sm_pairing_numeric_output (line 219) | static void sm_pairing_numeric_output( const std::array< std::uint8_...
      method sm_pairing_numeric_compare_output (line 224) | static void sm_pairing_numeric_compare_output( const S&, F& )
      type meta_type (line 228) | struct meta_type :
    type pairing_numeric_output (line 246) | struct pairing_numeric_output
      method get_io_capabilities (line 249) | static details::io_capabilities get_io_capabilities( const pairing_n...
      method get_io_capabilities (line 255) | static details::io_capabilities get_io_capabilities( const pairing_y...
      method get_io_capabilities (line 261) | static details::io_capabilities get_io_capabilities( const pairing_k...
      method select_legacy_pairing_algorithm (line 266) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_legacy_pairing_algorithm (line 275) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_legacy_pairing_algorithm (line 284) | static details::legacy_pairing_algorithm select_legacy_pairing_algor...
      method select_lesc_pairing_algorithm (line 295) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method select_lesc_pairing_algorithm (line 304) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method select_lesc_pairing_algorithm (line 316) | static details::lesc_pairing_algorithm select_lesc_pairing_algorithm...
      method sm_pairing_numeric_output (line 330) | static void sm_pairing_numeric_output( const std::array< std::uint8_...
      method sm_pairing_numeric_compare_output (line 336) | static void sm_pairing_numeric_compare_output( const S& state, F& fu...
      type meta_type (line 347) | struct meta_type :
    type pairing_no_just_works (line 362) | struct pairing_no_just_works
      type meta_type (line 365) | struct meta_type :
    type pairing_allow_just_works (line 377) | struct pairing_allow_just_works
      type meta_type (line 380) | struct meta_type :
    type details (line 386) | namespace details
      type pairing_input_capabilty_meta_type (line 11) | struct pairing_input_capabilty_meta_type {}
      type pairing_output_capabilty_meta_type (line 12) | struct pairing_output_capabilty_meta_type {}
      type pairing_just_works_meta_type (line 13) | struct pairing_just_works_meta_type {}
      type io_capabilities (line 15) | enum class io_capabilities : std::uint8_t {
Condensed preview — 289 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,074K chars).
[
  {
    "path": ".editorconfig",
    "chars": 41,
    "preview": "[*]\nindent_style = space\nindent_size = 4\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 835,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n  schedule:\n    - cron"
  },
  {
    "path": ".gitignore",
    "chars": 308,
    "preview": "# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dyl"
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 156,
    "preview": "before_script:\n    - apt-get update -qq\n    - c++ -v\n\ntests:\n    script:\n        - cd bluetoe\n        - mkdir build && c"
  },
  {
    "path": ".travis.yml",
    "chars": 2111,
    "preview": "sudo: required\ndist: bionic\nlanguage: cpp\n\nnotifications:\n  email:\n    on_success: change\n    on_failure: change\n\n# matr"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 1196,
    "preview": "cmake_minimum_required(VERSION 3.13)\n\n# Prevent in source build, add this options before project keyword\nset(CMAKE_DISAB"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3223,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "Doxyfile",
    "chars": 119863,
    "preview": "# Doxyfile 1.9.6\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) "
  },
  {
    "path": "LICENSE",
    "chars": 1084,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Torsten Robitzki\n\nPermission is hereby granted, free of charge, to any person "
  },
  {
    "path": "README.md",
    "chars": 8009,
    "preview": "# Bluetoe [![Build Status](https://travis-ci.org/TorstenRobitzki/bluetoe.svg?branch=master)](https://travis-ci.org/Torst"
  },
  {
    "path": "bluetoe/adv_service_list.hpp",
    "chars": 6837,
    "preview": "#ifndef BLUETOE_ADV_SERVICE_LIST_HPP\n#define BLUETOE_ADV_SERVICE_LIST_HPP\n\n#include <bluetoe/codes.hpp>\n#include <blueto"
  },
  {
    "path": "bluetoe/appearance.hpp",
    "chars": 8805,
    "preview": "#ifndef BLUETOE_APPEARANCE_HPP\n#define BLUETOE_APPEARANCE_HPP\n\n#include <bluetoe/meta_types.hpp>\n\nnamespace bluetoe {\n\n "
  },
  {
    "path": "bluetoe/attribute_generator.hpp",
    "chars": 4411,
    "preview": "#ifndef BLUETOE_ATTRIBUTE_GENERATOR_HPP\n#define BLUETOE_ATTRIBUTE_GENERATOR_HPP\n\n#include <tuple>\n#include <bluetoe/meta"
  },
  {
    "path": "bluetoe/attribute_handle.hpp",
    "chars": 17299,
    "preview": "#ifndef BLUETOE_ATTRIBUTE_HANDLE_HPP\n#define BLUETOE_ATTRIBUTE_HANDLE_HPP\n\n#include <bluetoe/meta_types.hpp>\n#include <b"
  },
  {
    "path": "bluetoe/bindings/CMakeLists.txt",
    "chars": 24,
    "preview": "add_subdirectory(nordic)"
  },
  {
    "path": "bluetoe/bindings/hci/include_libusb/bluetoe/device.hpp",
    "chars": 327,
    "preview": "#ifndef BLUETOE_BINDINGS_HCI_DEVICE_HPP\n#define BLUETOE_BINDINGS_HCI_DEVICE_HPP\n\n#include <bluetoe/link_layer.hpp>\n#incl"
  },
  {
    "path": "bluetoe/bindings/hci/include_libusb/bluetoe/libsub.hpp",
    "chars": 231,
    "preview": "#ifndef BLUETOE_BINDINGS_HCI_LIBUSB_HPP\n#define BLUETOE_BINDINGS_HCI_LIBUSB_HPP\n\nnamespace bluetoe {\n\n    namespace hci_"
  },
  {
    "path": "bluetoe/bindings/nordic/CMakeLists.txt",
    "chars": 368,
    "preview": "add_library(bluetoe_bindings_nordic INTERFACE EXCLUDE_FROM_ALL)\nadd_library(bluetoe::bindings::nordic ALIAS bluetoe_bind"
  },
  {
    "path": "bluetoe/bindings/nordic/include/bluetoe/nrf.hpp",
    "chars": 10660,
    "preview": "#ifndef BLUETOE_BINDINGS_NRF_HPP\n#define BLUETOE_BINDINGS_NRF_HPP\n\n#include <bluetoe/meta_types.hpp>\n#include <bluetoe/d"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf51/CMakeLists.txt",
    "chars": 663,
    "preview": "add_library(bluetoe_bindings_nrf51 STATIC EXCLUDE_FROM_ALL\n            nrf51.cpp)\nadd_library(bluetoe::bindings::nrf51 A"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf51/include/bluetoe/device.hpp",
    "chars": 445,
    "preview": "#ifndef BLUETOE_DEVICE_HPP\n#define BLUETOE_DEVICE_HPP\n\n#include <bluetoe/nrf51.hpp>\n\nnamespace bluetoe\n{\n    template < "
  },
  {
    "path": "bluetoe/bindings/nordic/nrf51/include/bluetoe/nrf51.hpp",
    "chars": 17475,
    "preview": "#ifndef BLUETOE_BINDINGS_NRF51_HPP\n#define BLUETOE_BINDINGS_NRF51_HPP\n\n#include <bluetoe/link_layer.hpp>\n#include <bluet"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf51/nrf51.cpp",
    "chars": 53623,
    "preview": "#include <bluetoe/nrf51.hpp>\n\n#include <nrf.h>\n\n#include <cassert>\n#include <cstdint>\n#include <algorithm>\n#include <cst"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/CMakeLists.txt",
    "chars": 713,
    "preview": "add_library(\n    bluetoe_bindings_nrf52\n    STATIC\n    EXCLUDE_FROM_ALL\n    nrf52.cpp\n    security_tool_box.cpp\n)\n\nadd_l"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/include/bluetoe/device.hpp",
    "chars": 574,
    "preview": "#ifndef BLUETOE_DEVICE_HPP\n#define BLUETOE_DEVICE_HPP\n\n#include <bluetoe/nrf52.hpp>\n\nnamespace bluetoe\n{\n    /**\n     * "
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/include/bluetoe/nrf52.hpp",
    "chars": 40570,
    "preview": "#ifndef BLUETOE_BINDINGS_NRF52_HPP\n#define BLUETOE_BINDINGS_NRF52_HPP\n\n#include <bluetoe/link_layer.hpp>\n#include <bluet"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/include/bluetoe/security_tool_box.hpp",
    "chars": 4217,
    "preview": "#ifndef BLUETOE_BINDING_NORDIC_NRF52_SECURITY_TOOL_BOX_HPP\n#define BLUETOE_BINDING_NORDIC_NRF52_SECURITY_TOOL_BOX_HPP\n\n#"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/nrf52.cpp",
    "chars": 51996,
    "preview": "#include <bluetoe/nrf52.hpp>\n\n#include <bluetoe/bits.hpp>\n\n#include <cstring>\n#include <algorithm>\n\nnamespace bluetoe\n{\n"
  },
  {
    "path": "bluetoe/bindings/nordic/nrf52/security_tool_box.cpp",
    "chars": 13936,
    "preview": "#include <cassert>\n#include <bluetoe/security_tool_box.hpp>\n#include <bluetoe/nrf.hpp>\n\n#include \"uECC.h\"\n\nnamespace blu"
  },
  {
    "path": "bluetoe/bindings/nordic/uECC/CMakeLists.txt",
    "chars": 397,
    "preview": "add_library(bluetoe_bindings_uECC STATIC\n            uECC.c)\n\nadd_library(bluetoe::bindings::nrf::uecc ALIAS bluetoe_bin"
  },
  {
    "path": "bluetoe/bindings/nordic/uECC/asm_arm.inc",
    "chars": 74272,
    "preview": "#define DEC_5 4\n#define DEC_6 5\n#define DEC_7 6\n#define DEC_8 7\n\n#define DEC(N) uECC_CONCAT(DEC_, N)\n\n#define REPEAT_1(s"
  },
  {
    "path": "bluetoe/bindings/nordic/uECC/uECC.c",
    "chars": 94176,
    "preview": "/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#include \"uECC.h\"\n\n#ifndef uECC_PLATFORM"
  },
  {
    "path": "bluetoe/bindings/nordic/uECC/uECC.h",
    "chars": 10572,
    "preview": "/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _MICRO_ECC_H_\n#define _MICRO_ECC"
  },
  {
    "path": "bluetoe/characteristic.hpp",
    "chars": 28293,
    "preview": "#ifndef BLUETOE_CHARACTERISTIC_HPP\n#define BLUETOE_CHARACTERISTIC_HPP\n\n#include <bluetoe/characteristic_value.hpp>\n#incl"
  },
  {
    "path": "bluetoe/characteristic_value.hpp",
    "chars": 60203,
    "preview": "#ifndef BLUETOE_CHARACTERISTIC_VALUE_HPP\n#define BLUETOE_CHARACTERISTIC_VALUE_HPP\n\n#include <bluetoe/meta_tools.hpp>\n#in"
  },
  {
    "path": "bluetoe/custom_advertising.hpp",
    "chars": 6487,
    "preview": "#ifndef BLUETOE_CUSTOM_ADVERTISING_HPP\n#define BLUETOE_CUSTOM_ADVERTISING_HPP\n\n#include <bluetoe/meta_types.hpp>\n\n#inclu"
  },
  {
    "path": "bluetoe/descriptor.hpp",
    "chars": 761,
    "preview": "#ifndef BLUETOE_DESCRIPTOR_HPP\n#define BLUETOE_DESCRIPTOR_HPP\n\n#include <bluetoe/meta_types.hpp>\n#include <cstdint>\n#inc"
  },
  {
    "path": "bluetoe/encryption.hpp",
    "chars": 8857,
    "preview": "#ifndef BLUETOE_ENCRYPTION_HPP\n#define BLUETOE_ENCRYPTION_HPP\n\n#include <bluetoe/meta_tools.hpp>\n#include <bluetoe/meta_"
  },
  {
    "path": "bluetoe/filter.hpp",
    "chars": 2858,
    "preview": "#ifndef BLUETOE_FILTER_HPP\n#define BLUETOE_FILTER_HPP\n\n#include <bluetoe/attribute.hpp>\n#include <bluetoe/bits.hpp>\n#inc"
  },
  {
    "path": "bluetoe/find_notification_data.hpp",
    "chars": 8407,
    "preview": "#ifndef BLUETOE_FIND_NOTIFICATION_DATA_HPP\n#define BLUETOE_FIND_NOTIFICATION_DATA_HPP\n\n#include <bluetoe/meta_tools.hpp>"
  },
  {
    "path": "bluetoe/gap_service.hpp",
    "chars": 3286,
    "preview": "#ifndef BLUETOE_GAP_SERVICE_HPP\n#define BLUETOE_GAP_SERVICE_HPP\n\n#include <cstdint>\n#include <bluetoe/service.hpp>\n#incl"
  },
  {
    "path": "bluetoe/gatt_options.hpp",
    "chars": 2278,
    "preview": "#ifndef BLUETOE_GATT_OPTIONS_HPP\n#define BLUETOE_GATT_OPTIONS_HPP\n\n#include <bluetoe/meta_types.hpp>\n\n#include <cstdint>"
  },
  {
    "path": "bluetoe/hci/CMakeLists.txt",
    "chars": 282,
    "preview": "add_library(bluetoe_hci INTERFACE)\n\nadd_library(bluetoe::hci ALIAS bluetoe_hci)\n\ntarget_include_directories(bluetoe_hci "
  },
  {
    "path": "bluetoe/hci/include/bluetoe/link_layer.hpp",
    "chars": 1950,
    "preview": "#ifndef BLUETOE_HCI_LINK_LAYER_HPP\n#define BLUETOE_HCI_LINK_LAYER_HPP\n\n#include <bluetoe/address.hpp>\n\nnamespace bluetoe"
  },
  {
    "path": "bluetoe/l2cap.hpp",
    "chars": 10691,
    "preview": "#ifndef BLUETOE_L2CAP_HPP\n#define BLUETOE_L2CAP_HPP\n\n#include <cstdint>\n#include <cstddef>\n#include <cassert>\n\n#include "
  },
  {
    "path": "bluetoe/l2cap_channels.hpp",
    "chars": 380,
    "preview": "#ifndef BLUETOE_L2CAP_CHANNELS_HPP\n#define BLUETOE_L2CAP_CHANNELS_HPP\n\nnamespace bluetoe {\n\n    namespace l2cap_channel_"
  },
  {
    "path": "bluetoe/link_layer/CMakeLists.txt",
    "chars": 491,
    "preview": "add_library(bluetoe_linklayer STATIC\n            delta_time.cpp\n            channel_map.cpp\n            connection_detai"
  },
  {
    "path": "bluetoe/link_layer/channel_map.cpp",
    "chars": 1849,
    "preview": "#include <bluetoe/channel_map.hpp>\n#include <cassert>\n\nnamespace bluetoe {\nnamespace link_layer {\n\n    channel_map::chan"
  },
  {
    "path": "bluetoe/link_layer/connection_details.cpp",
    "chars": 1314,
    "preview": "#include <bluetoe/connection_details.hpp>\n\nnamespace bluetoe {\nnamespace link_layer {\n\n    connection_details::connectio"
  },
  {
    "path": "bluetoe/link_layer/delta_time.cpp",
    "chars": 3670,
    "preview": "#include <bluetoe/delta_time.hpp>\n#include <ostream>\n#include <cassert>\n\nnamespace bluetoe {\nnamespace link_layer {\n\n   "
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/advertising.hpp",
    "chars": 50535,
    "preview": "#ifndef BLUETOE_LINK_LAYER_ADVERTISING_HPP\n#define BLUETOE_LINK_LAYER_ADVERTISING_HPP\n\n#include <bluetoe/meta_tools.hpp>"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/buffer.hpp",
    "chars": 3431,
    "preview": "#ifndef BLUETOE_LINK_LAYER_BUFFER_HPP\n#define BLUETOE_LINK_LAYER_BUFFER_HPP\n\n#include <cstdlib>\n#include <cstdint>\n#incl"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/channel_map.hpp",
    "chars": 1789,
    "preview": "#ifndef BLUETOE_LINK_LAYER_CHANNEL_MAP_HPP\n#define BLUETOE_LINK_LAYER_CHANNEL_MAP_HPP\n\n#include <cstdint>\n\nnamespace blu"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/connection_callbacks.hpp",
    "chars": 18323,
    "preview": "#ifndef BLUETOE_LINK_LAYER_CONNECTION_CALLBACKS_HPP\n#define BLUETOE_LINK_LAYER_CONNECTION_CALLBACKS_HPP\n\n#include <bluet"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/connection_details.hpp",
    "chars": 2920,
    "preview": "#ifndef BLUETOE_LINK_LAYER_CONNECTION_DETAILS_HPP\n#define BLUETOE_LINK_LAYER_CONNECTION_DETAILS_HPP\n\n#include <bluetoe/a"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/connection_event_callback.hpp",
    "chars": 20513,
    "preview": "#ifndef BLUETOE_LINK_LAYER_CONNECTION_EVENT_CALLBACK_HPP\n#define BLUETOE_LINK_LAYER_CONNECTION_EVENT_CALLBACK_HPP\n\n#incl"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/connection_events.hpp",
    "chars": 2595,
    "preview": "#ifndef BLUETOE_LINK_LAYER_CONNECTION_EVENT_HPP\n#define BLUETOE_LINK_LAYER_CONNECTION_EVENT_HPP\n\nnamespace bluetoe {\nnam"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/default_pdu_layout.hpp",
    "chars": 3464,
    "preview": "#ifndef BLUETOE_LINK_LAYER_DEFAULT_PDU_LAYOUT_HPP\n#define BLUETOE_LINK_LAYER_DEFAULT_PDU_LAYOUT_HPP\n\n#include <bluetoe/b"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/delta_time.hpp",
    "chars": 4247,
    "preview": "#ifndef BLUETOE_LINK_LAYER_DELTA_TIME_HPP\n#define BLUETOE_LINK_LAYER_DELTA_TIME_HPP\n\n#include <cstdint>\n#include <iosfwd"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/l2cap_signaling_channel.hpp",
    "chars": 8513,
    "preview": "#ifndef BLUETOE_LINK_LAYER_L2CAP_SIGNALING_CHANNEL_HPP\n#define BLUETOE_LINK_LAYER_L2CAP_SIGNALING_CHANNEL_HPP\n\n#include "
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/link_layer.hpp",
    "chars": 78509,
    "preview": "#ifndef BLUETOE_LINK_LAYER_LINK_LAYER_HPP\n#define BLUETOE_LINK_LAYER_LINK_LAYER_HPP\n\n#include <bluetoe/buffer.hpp>\n#incl"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/ll_data_pdu_buffer.hpp",
    "chars": 22353,
    "preview": "#ifndef BLUETOE_LINK_LAYER_LL_DAAT_BUFFER_HPP\n#define BLUETOE_LINK_LAYER_LL_DAAT_BUFFER_HPP\n\n#include <cstdlib>\n#include"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/ll_l2cap_sdu_buffer.hpp",
    "chars": 14653,
    "preview": "#ifndef BLUETOE_LINK_LAYER_L_L2CAP_SDU_BUFFER_HPP\n#define BLUETOE_LINK_LAYER_L_L2CAP_SDU_BUFFER_HPP\n\n#include <bluetoe/b"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/ll_meta_types.hpp",
    "chars": 340,
    "preview": "#ifndef BLUETOE_LINK_LAYER_META_TYPES_HPP\n#define BLUETOE_LINK_LAYER_META_TYPES_HPP\n\nnamespace bluetoe {\n    namespace l"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/ll_options.hpp",
    "chars": 17337,
    "preview": "#ifndef BLUETOE_LINK_LAYER_OPTIONS_HPP\n#define BLUETOE_LINK_LAYER_OPTIONS_HPP\n\n#include <bluetoe/address.hpp>\n#include <"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/peripheral_latency.hpp",
    "chars": 27079,
    "preview": "#ifndef BLUETOE_LINK_LAYER_PERIPHERAL_LATENCY_HPP\n#define BLUETOE_LINK_LAYER_PERIPHERAL_LATENCY_HPP\n\n#include <bluetoe/l"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/phy_encodings.hpp",
    "chars": 404,
    "preview": "#ifndef BLUETOE_LINK_LAYER_PHY_ENCODINGS_HPP\n#define BLUETOE_LINK_LAYER_PHY_ENCODINGS_HPP\n\nnamespace bluetoe {\nnamespace"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/ring_buffer.hpp",
    "chars": 7769,
    "preview": "#ifndef BLUETOE_LINK_LAYER_RING_BUFFER_HPP\n#define BLUETOE_LINK_LAYER_RING_BUFFER_HPP\n\n#include <cstdint>\n#include <cass"
  },
  {
    "path": "bluetoe/link_layer/include/bluetoe/white_list.hpp",
    "chars": 10890,
    "preview": "#ifndef BLUETOE_LINK_LAYER_WHITE_LIST_HPP\n#define BLUETOE_LINK_LAYER_WHITE_LIST_HPP\n\n#include <bluetoe/address.hpp>\n#inc"
  },
  {
    "path": "bluetoe/link_layer/scheduled_radio.hpp",
    "chars": 22228,
    "preview": "#ifndef BLUETOE_LINK_LAYER_SCHEDULED_RADIO_HPP\n#define BLUETOE_LINK_LAYER_SCHEDULED_RADIO_HPP\n\n#include <cstdint>\n#inclu"
  },
  {
    "path": "bluetoe/link_state.hpp",
    "chars": 2794,
    "preview": "#ifndef BLUETOE_LINK_STATE_HPP\n#define BLUETOE_LINK_STATE_HPP\n\n#include <bluetoe/pairing_status.hpp>\n#include <bluetoe/c"
  },
  {
    "path": "bluetoe/mainpage.hpp",
    "chars": 10567,
    "preview": "/*! @mainpage Bluetoe\n\n@section intro_sec Introduction\n\nBluetoe is an attempt to simplify the implementation of firmware"
  },
  {
    "path": "bluetoe/meta_types.hpp",
    "chars": 1185,
    "preview": "#ifndef BLUETOE_META_TYPES_HPP\n#define BLUETOE_META_TYPES_HPP\n\nnamespace bluetoe {\n\n    namespace details {\n\n        /*\n"
  },
  {
    "path": "bluetoe/mixin.hpp",
    "chars": 3077,
    "preview": "#ifndef BLUETOE_MIXIN_HPP\n#define BLUETOE_MIXIN_HPP\n\n#include <bluetoe/meta_tools.hpp>\n\nnamespace bluetoe {\n    template"
  },
  {
    "path": "bluetoe/notification_queue.hpp",
    "chars": 14545,
    "preview": "#ifndef BLUETOE_NOTIFICATION_QUEUE_HPP\n#define BLUETOE_NOTIFICATION_QUEUE_HPP\n\n#include <cstdint>\n#include <cstdlib>\n#in"
  },
  {
    "path": "bluetoe/outgoing_priority.hpp",
    "chars": 12858,
    "preview": "#ifndef BLUETOE_OUTGOING_PRIORITY_HPP\n#define BLUETOE_OUTGOING_PRIORITY_HPP\n\n#include <bluetoe/meta_tools.hpp>\n\nnamespac"
  },
  {
    "path": "bluetoe/pairing_status.hpp",
    "chars": 1435,
    "preview": "#ifndef BLUETOE_SM_PAIRING_STATUS_HPP\n#define BLUETOE_SM_PAIRING_STATUS_HPP\n\nnamespace bluetoe {\n\n    /**\n     * @brief "
  },
  {
    "path": "bluetoe/peripheral_connection_interval_range.hpp",
    "chars": 3314,
    "preview": "#ifndef BLUETOE_PERIPHERAL_CONNECTION_INTERVAL_RANGE_HPP\n#define BLUETOE_PERIPHERAL_CONNECTION_INTERVAL_RANGE_HPP\n\nnames"
  },
  {
    "path": "bluetoe/scattered_access.hpp",
    "chars": 1247,
    "preview": "#ifndef BLUETOE_SCATTERED_ACCESS_HPP\n#define BLUETOE_SCATTERED_ACCESS_HPP\n\n#include <bluetoe/attribute.hpp>\n#include <al"
  },
  {
    "path": "bluetoe/sensor_location.hpp",
    "chars": 2122,
    "preview": "#ifndef BLUETOE_SENSOR_LOCATION_HPP\n#define BLUETOE_SENSOR_LOCATION_HPP\n\nnamespace bluetoe {\n\n    namespace details {\n  "
  },
  {
    "path": "bluetoe/server.hpp",
    "chars": 74254,
    "preview": "#ifndef BLUETOE_SERVER_HPP\n#define BLUETOE_SERVER_HPP\n\n#include <bluetoe/codes.hpp>\n#include <bluetoe/service.hpp>\n#incl"
  },
  {
    "path": "bluetoe/server_meta_type.hpp",
    "chars": 171,
    "preview": "#ifndef BLUETOE_SERVER_META_TYPE_HPP\n#define BLUETOE_SERVER_META_TYPE_HPP\n\nnamespace bluetoe {\n    namespace details {\n "
  },
  {
    "path": "bluetoe/server_name.hpp",
    "chars": 771,
    "preview": "#ifndef BLUETOE_SERVER_NAME_HPP\n#define BLUETOE_SERVER_NAME_HPP\n\n#include <bluetoe/meta_types.hpp>\n\nnamespace bluetoe {\n"
  },
  {
    "path": "bluetoe/service.hpp",
    "chars": 21410,
    "preview": "#ifndef BLUETOE_SERVICE_HPP\n#define BLUETOE_SERVICE_HPP\n\n#include <bluetoe/service_uuid.hpp>\n#include <bluetoe/attribute"
  },
  {
    "path": "bluetoe/service_uuid.hpp",
    "chars": 307,
    "preview": "#ifndef BLUETOE_SERVICE_UUID_HPP\n#define BLUETOE_SERVICE_UUID_HPP\n\nnamespace bluetoe {\nnamespace details {\n    struct se"
  },
  {
    "path": "bluetoe/services/CMakeLists.txt",
    "chars": 177,
    "preview": "add_library(bluetoe_services INTERFACE)\nadd_library(bluetoe::services ALIAS bluetoe_services)\ntarget_include_directories"
  },
  {
    "path": "bluetoe/services/bas.hpp",
    "chars": 5525,
    "preview": "#ifndef BLUTOE_SERVICES_BAS_HPP\n\n#include <bluetoe/service.hpp>\n#include <bluetoe/mixin.hpp>\n#include <type_traits>\n\nnam"
  },
  {
    "path": "bluetoe/services/bootloader.hpp",
    "chars": 31193,
    "preview": "#ifndef BLUETOE_SERVICES_BOOTLOADER_HPP\n#define BLUETOE_SERVICES_BOOTLOADER_HPP\n\n#include <bluetoe/service.hpp>\n#include"
  },
  {
    "path": "bluetoe/services/bootloader.md",
    "chars": 14665,
    "preview": "@section Bootloader-Protocol\n\nGATT\n====\nThe Bootloader is one service containing three characteristics. The UUID of the "
  },
  {
    "path": "bluetoe/services/csc.hpp",
    "chars": 26653,
    "preview": "#ifndef BLUETOE_SERVICES_CSC_HPP\n#define BLUETOE_SERVICES_CSC_HPP\n\n#include <bluetoe/service.hpp>\n#include <bluetoe/serv"
  },
  {
    "path": "bluetoe/services/dis.hpp",
    "chars": 6756,
    "preview": "#ifndef BLUETOE_SERVICES_DIS_HPP\n#define BLUETOE_SERVICES_DIS_HPP\n\n#include <bluetoe/service.hpp>\n#include <bluetoe/char"
  },
  {
    "path": "bluetoe/services/gatt.hpp",
    "chars": 2428,
    "preview": "#ifndef BLUETOE_SERVICES_GATT_HPP\n#define BLUETOE_SERVICES_GATT_HPP\n\n#include <bluetoe/service.hpp>\n#include <bluetoe/ch"
  },
  {
    "path": "bluetoe/services/hid.hpp",
    "chars": 2500,
    "preview": "#ifndef BLUETOE_SERVICES_HID_HPP\n#define BLUETOE_SERVICES_HID_HPP\n\n#include <bluetoe/service.hpp>\n#include <bluetoe/char"
  },
  {
    "path": "bluetoe/sm/CMakeLists.txt",
    "chars": 176,
    "preview": "add_library(bluetoe_security_manager INTERFACE)\nadd_library(bluetoe::sm ALIAS bluetoe_security_manager)\n\ntarget_include_"
  },
  {
    "path": "bluetoe/sm/include/bluetoe/io_capabilities.hpp",
    "chars": 16603,
    "preview": "#ifndef BLUETOE_SM_INCLUDE_IO_CAPABILTIES_HPP\n#define BLUETOE_SM_INCLUDE_IO_CAPABILTIES_HPP\n\n#include <bluetoe/meta_tool"
  },
  {
    "path": "bluetoe/sm/include/bluetoe/oob_authentication.hpp",
    "chars": 2952,
    "preview": "#ifndef BLUETOE_SM_INCLUDE_OOB_AUTHENTICATION_HPP\n#define BLUETOE_SM_INCLUDE_OOB_AUTHENTICATION_HPP\n\n#include <bluetoe/l"
  },
  {
    "path": "bluetoe/sm/include/bluetoe/security_connection_data.hpp",
    "chars": 23801,
    "preview": "#ifndef BLUETOE_SM_SECURITY_CONNECTION_DATA_HPP\n#define BLUETOE_SM_SECURITY_CONNECTION_DATA_HPP\n\nnamespace bluetoe {\n\n  "
  },
  {
    "path": "bluetoe/sm/include/bluetoe/security_manager.hpp",
    "chars": 59350,
    "preview": "#ifndef BLUETOE_SM_SECURITY_MANAGER_HPP\n#define BLUETOE_SM_SECURITY_MANAGER_HPP\n\n#include <cstddef>\n#include <cstdint>\n#"
  },
  {
    "path": "bluetoe/utility/CMakeLists.txt",
    "chars": 319,
    "preview": "add_library(bluetoe_utility STATIC\n            address.cpp)\nadd_library(bluetoe::utility ALIAS bluetoe_utility)\n\ntarget_"
  },
  {
    "path": "bluetoe/utility/address.cpp",
    "chars": 2381,
    "preview": "#include <bluetoe/address.hpp>\n#include <cassert>\n#include <algorithm>\n#include <iterator>\n\nnamespace bluetoe {\nnamespac"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/address.hpp",
    "chars": 8894,
    "preview": "#ifndef BLUETOE_LINK_LAYER_ADDRESS_HPP\n#define BLUETOE_LINK_LAYER_ADDRESS_HPP\n\n#include <cstdint>\n#include <initializer_"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/attribute.hpp",
    "chars": 16218,
    "preview": "#ifndef BLUETOE_ATTRIBUTE_HPP\n#define BLUETOE_ATTRIBUTE_HPP\n\n#include <bluetoe/meta_tools.hpp>\n#include <bluetoe/client_"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/bits.hpp",
    "chars": 3401,
    "preview": "#ifndef BLUETOE_BITS_HPP\n#define BLUETOE_BITS_HPP\n\n#include <cstdint>\n#include <type_traits>\n\nnamespace bluetoe {\nnamesp"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/client_characteristic_configuration.hpp",
    "chars": 4080,
    "preview": "#ifndef BLUETOE_CLIENT_CHARACTERISTIC_CONFIGURATION_HPP\n#define BLUETOE_CLIENT_CHARACTERISTIC_CONFIGURATION_HPP\n\n#includ"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/codes.hpp",
    "chars": 8141,
    "preview": "#ifndef BLUETOE_CODES_HPP\n#define BLUETOE_CODES_HPP\n\n#include <cstdint>\n\nnamespace bluetoe {\nnamespace details {\n\n    st"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/meta_tools.hpp",
    "chars": 25197,
    "preview": "#ifndef BLUETOE_META_TOOLS_HPP\n#define BLUETOE_META_TOOLS_HPP\n\n#include <utility>\n#include <type_traits>\n#include <tuple"
  },
  {
    "path": "bluetoe/utility/include/bluetoe/ring.hpp",
    "chars": 1944,
    "preview": "#ifndef BLUETOE_UTILITY_RING_HPP\n#define BLUETOE_UTILITY_RING_HPP\n\n#include <atomic>\n#include <cstdint>\n\nnamespace bluet"
  },
  {
    "path": "bluetoe/uuid.hpp",
    "chars": 3492,
    "preview": "#ifndef BLUETOE_UUID_HPP\n#define BLUETOE_UUID_HPP\n\nnamespace bluetoe {\nnamespace details {\n\n    template < std::uint64_t"
  },
  {
    "path": "bluetoe/write_queue.hpp",
    "chars": 7268,
    "preview": "#ifndef BLUETOE_WRITE_QUEUE_HPP\n#define BLUETOE_WRITE_QUEUE_HPP\n\n#include <cstdint>\n#include <cstddef>\n#include <cassert"
  },
  {
    "path": "config/travisci_rsa.pub",
    "chars": 400,
    "preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOIT9BGmfHAWtMT3qEEAdZBVl56x20zZ1lhOL+LVezhbxEdKVtsJleU/Eetxr9uZ/9Fwtaa1tmezT554jB"
  },
  {
    "path": "documentation/customdoxygen.css",
    "chars": 33607,
    "preview": "/* The standard CSS for doxygen 1.9.2 */\n\nbody, table, div, p, dl {\n\tfont: 400 14px/22px Roboto,sans-serif;\n}\n\np.referen"
  },
  {
    "path": "examples/CMakeLists.txt",
    "chars": 5333,
    "preview": "cmake_minimum_required(VERSION 3.13)\n\n# Prevent in source build, add this options before project keyword\nset(CMAKE_DISAB"
  },
  {
    "path": "examples/README.md",
    "chars": 3988,
    "preview": "# Bluetoe Examples\n\n## Predicates / Required Tools and Libraries\n\nBluetoe used CMake for building and GCC as compiler. D"
  },
  {
    "path": "examples/assert/CMakeLists.txt",
    "chars": 208,
    "preview": "add_library(arm_assert INTERFACE)\nadd_library(assert::arm ALIAS arm_assert)\n\ntarget_sources(arm_assert\n    INTERFACE\n   "
  },
  {
    "path": "examples/assert/assert.cpp",
    "chars": 170,
    "preview": "#include <assert.h>\n\nextern \"C\" void HardFault_Handler() __attribute__ ((noreturn));\n\nextern \"C\" void __assert_hash_func"
  },
  {
    "path": "examples/assert/assert.h",
    "chars": 728,
    "preview": "#ifndef SOURCE_ASSERT_ASSERT_H\n#define SOURCE_ASSERT_ASSERT_H\n\n#include <cstdint>\n\n#ifdef USING_ASSERT_HASH\nextern \"C++\""
  },
  {
    "path": "examples/assert/cassert",
    "chars": 19,
    "preview": "#include <assert.h>"
  },
  {
    "path": "examples/ble_flash/CMakeLists.txt",
    "chars": 275,
    "preview": "add_custom_target(flash_tests.run\n   COMMAND mocha --compilers coffee:coffee-script/register ${CMAKE_CURRENT_LIST_DIR}/f"
  },
  {
    "path": "examples/ble_flash/ble_flash.coffee",
    "chars": 12837,
    "preview": "raise = (text)->\n    console.log text\n    process.exit 1\n\nFlashMemory = require( './flash.coffee' ).FlashMemory\nnoble   "
  },
  {
    "path": "examples/ble_flash/crc.coffee",
    "chars": 534,
    "preview": "exports.buf = (()->\n    crcTable = (()->\n        crcTable = []\n\n        for n in [ 0...256 ]\n            c = n\n\n        "
  },
  {
    "path": "examples/ble_flash/crc_tests.coffee",
    "chars": 519,
    "preview": "expect  = require( 'chai' ).expect\nassert  = require 'assert'\ncrc     = require './crc.coffee'\n\ndescribe 'crc', ->\n    i"
  },
  {
    "path": "examples/ble_flash/flash.coffee",
    "chars": 4412,
    "preview": "crc32 = require './crc.coffee'\n\nTIMEOUT_MS       = 500\n\nclass FlashRange\n    ###\n     @peripheral ble abstraction expect"
  },
  {
    "path": "examples/ble_flash/flash_tests.coffee",
    "chars": 17171,
    "preview": "expect  = require( 'chai' ).expect\nassert  = require 'assert'\nsinon   = require 'sinon'\nflash   = require './flash.coffe"
  },
  {
    "path": "examples/blinky.cpp",
    "chars": 998,
    "preview": "/**\n * @example blinky.cpp\n *\n * This example shows, how to implement a very simple GATT server that\n * provides one ser"
  },
  {
    "path": "examples/blinky_with_lesc_and_legacy_pairing.cpp",
    "chars": 1051,
    "preview": "/**\n * @example blinky_with_lesc_and_legacy_pairing.cpp\n *\n * This example shows, how to implement a very simple GATT se"
  },
  {
    "path": "examples/blinky_with_oob.cpp",
    "chars": 1581,
    "preview": "/**\n * @example blinky_with_oob.cpp\n *\n * This example shows, how to implement a very simple GATT server that\n * provide"
  },
  {
    "path": "examples/blinky_without_encryption.cpp",
    "chars": 887,
    "preview": "/**\n * @example blinky_without_encryption.cpp\n *\n * This example shows, how to implement a very simple GATT server that\n"
  },
  {
    "path": "examples/bootloader.cpp",
    "chars": 9538,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/device.hpp>\n#include <bluetoe/services/bootloader.hpp>\n#include <bluetoe"
  },
  {
    "path": "examples/cc2650/cc26x0f128.lds",
    "chars": 3464,
    "preview": "/*\r\n @file       cc26x0f128.lds\r\n @brief      CC26x0F128 linker configuration file for GNU compiler.\r\n\r\n @Revised     $D"
  },
  {
    "path": "examples/cc2650/ccfg.c",
    "chars": 23609,
    "preview": "/******************************************************************************\r\n*  Filename:       ccfg.c\r\n*  Revised: "
  },
  {
    "path": "examples/cc2650/startup_gcc.c",
    "chars": 13275,
    "preview": "/******************************************************************************\r\n*  Filename:       startup_gcc.c\r\n*  Re"
  },
  {
    "path": "examples/cmake/deduce.cmake",
    "chars": 909,
    "preview": "set(board_controller_mapping\n    PCA10056 NRF52840\n    PCA10040 NRF52832)\n\n# Map given in the form \"key1 value1 key2 val"
  },
  {
    "path": "examples/cmake/gcc-arm-none-eabi.cmake",
    "chars": 1227,
    "preview": "set(CMAKE_SYSTEM_NAME       Generic)\nset(CMAKE_SYSTEM_PROCESSOR  arm)\n\nset(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES ARM_GCC_"
  },
  {
    "path": "examples/custom_advertising.cpp",
    "chars": 1354,
    "preview": "/**\n * @example purpose of this example is, to show how any required advertising data of scan response can\n *          b"
  },
  {
    "path": "examples/cycling_speed_and_cadence.cpp",
    "chars": 4726,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/device.hpp>\n#include <bluetoe/services/csc.hpp>\n#include <bluetoe/sensor"
  },
  {
    "path": "examples/docker/Dockerfile",
    "chars": 1031,
    "preview": "FROM frolvlad/alpine-glibc as base\n\nRUN  apk update \\\n     && apk add --no-cache --update git tar wget ncurses libusb un"
  },
  {
    "path": "examples/docker/Makefile",
    "chars": 2716,
    "preview": "# Container engine to be used (typically: podman|docker)\nCONTAINER_ENGINE := docker\n\n# Name of the container image\nCONTA"
  },
  {
    "path": "examples/doxygen/CMakeLists.txt",
    "chars": 399,
    "preview": "function(add_doxygen_example TARGETNAME)\n    add_library(${TARGETNAME} ${TARGETNAME}.cpp)\n    add_dependencies(build_exa"
  },
  {
    "path": "examples/doxygen/change_advertising_example.cpp",
    "chars": 1091,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/bindings/nrf52.hpp>\n\nstatic std::uint8_t write_handler( bool flag );\n\nus"
  },
  {
    "path": "examples/doxygen/include_example.cpp",
    "chars": 888,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/service.hpp>\n#include <bluetoe/characteristic.hpp>\n#include <cstdint>\n\ns"
  },
  {
    "path": "examples/doxygen/priorities_example.cpp",
    "chars": 2816,
    "preview": "\n#include <bluetoe/server.hpp>\n#include <bluetoe/service.hpp>\n#include <bluetoe/characteristic.hpp>\n#include <bluetoe/ou"
  },
  {
    "path": "examples/doxygen/read_write_handler_example.cpp",
    "chars": 3154,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/service.hpp>\n#include <bluetoe/codes.hpp>\n\nstd::uint8_t read_blob_handle"
  },
  {
    "path": "examples/doxygen/server_example.cpp",
    "chars": 540,
    "preview": "\n#include <bluetoe/server.hpp>\n#include <bluetoe/service.hpp>\n#include <bluetoe/characteristic.hpp>\n#include <cstdint>\n\n"
  },
  {
    "path": "examples/gpio.cpp",
    "chars": 8848,
    "preview": "/**\n * @brief the purpose of this example is to show:\n * - How pairing can be configured\n * - How bonding can be impleme"
  },
  {
    "path": "examples/keyboard.cpp",
    "chars": 10413,
    "preview": "#include <bluetoe/server.hpp>\n#include <bluetoe/device.hpp>\n#include <bluetoe/services/bas.hpp>\n#include <bluetoe/servic"
  },
  {
    "path": "examples/nrf51_toolchain_support/CMakeLists.txt",
    "chars": 2755,
    "preview": "if(CMAKE_CROSSCOMPILING)\n    if (NOT DEFINED NRF5_SDK_ROOT)\n        message(FATAL_ERROR \"Please define NRF5_SDK_ROOT to "
  },
  {
    "path": "examples/nrf51_toolchain_support/gcc_nrf51_common.ld",
    "chars": 3722,
    "preview": "/* Linker script for Nordic Semiconductor nRF5 devices\r *\r * Version: Sourcery G++ 4.5-1\r * Support: https://support.cod"
  },
  {
    "path": "examples/nrf51_toolchain_support/gcc_startup_nrf51.s",
    "chars": 7640,
    "preview": "/*\nCopyright (c) 2015, Nordic Semiconductor ASA\nAll rights reserved.\n\nRedistribution and use in source and binary forms,"
  },
  {
    "path": "examples/nrf51_toolchain_support/nrf51_xxaa.ld",
    "chars": 431,
    "preview": "/* Linker script to configure memory regions. */\n\nGROUP(-lgcc -lc -lnosys)\n\nMEMORY\n{\n    FLASH (rx) : ORIGIN = 0x0000000"
  },
  {
    "path": "examples/nrf51_toolchain_support/platform.cmake",
    "chars": 433,
    "preview": "if(CMAKE_CROSSCOMPILING)\n    # set global compile options that depend on hardware and must apply to\n    # all targets of"
  },
  {
    "path": "examples/nrf51_toolchain_support/system_nrf51.h",
    "chars": 2374,
    "preview": "/* Copyright (c) 2015, Nordic Semiconductor ASA\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and bi"
  },
  {
    "path": "examples/nrf51_toolchain_support/system_nrf51422.c",
    "chars": 4965,
    "preview": "/* Copyright (c) 2013, Nordic Semiconductor ASA\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and bi"
  },
  {
    "path": "examples/nrf52_high_cpu_load.cpp",
    "chars": 3796,
    "preview": "/*\n * Example to prove, that the nrf52 binding is robust to miss some connection events due to\n * high CPU load.\n */\n\n#i"
  },
  {
    "path": "examples/nrf52_toolchain_support/CMakeLists.txt",
    "chars": 2859,
    "preview": "if(CMAKE_CROSSCOMPILING)\n    if (NOT DEFINED NRF5_SDK_ROOT)\n        message(FATAL_ERROR \"Please define NRF5_SDK_ROOT to "
  },
  {
    "path": "examples/nrf52_toolchain_support/gcc_nrf5x_common.ld",
    "chars": 3722,
    "preview": "/* Linker script for Nordic Semiconductor nRF5 devices\r *\r * Version: Sourcery G++ 4.5-1\r * Support: https://support.cod"
  },
  {
    "path": "examples/nrf52_toolchain_support/gcc_startup_nrf52.s",
    "chars": 19216,
    "preview": "/* \r\nCopyright (c) 2015, Nordic Semiconductor ASA\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary f"
  },
  {
    "path": "examples/nrf52_toolchain_support/nrf52.ld",
    "chars": 229,
    "preview": "/* Linker script to configure memory regions. */\r\n\r\nGROUP(-lgcc -lc -lnosys)\r\n\r\nMEMORY\r\n{\r\n  FLASH (rx) : ORIGIN = 0x000"
  },
  {
    "path": "examples/nrf52_toolchain_support/platform.cmake",
    "chars": 442,
    "preview": "if(CMAKE_CROSSCOMPILING)\n    # set global compile options that depend on hardware and must apply to\n    # all targets of"
  },
  {
    "path": "examples/nrf52_toolchain_support/system_nrf52.c",
    "chars": 7650,
    "preview": "/* Copyright (c) 2015, Nordic Semiconductor ASA\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and bi"
  },
  {
    "path": "examples/nrf52_toolchain_support/system_nrf52.h",
    "chars": 2374,
    "preview": "/* Copyright (c) 2015, Nordic Semiconductor ASA\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and bi"
  },
  {
    "path": "examples/resources.hpp",
    "chars": 1674,
    "preview": "#ifndef BLUETOE_EXAMPLES_RESOURCES_HPP\n#define BLUETOE_EXAMPLES_RESOURCES_HPP\n\n#include <spl/gpio.hpp>\n#include <spl/tem"
  },
  {
    "path": "examples/runtime_gcc.cpp",
    "chars": 1479,
    "preview": "#include <cstdint>\n\nextern \"C\" void __cxa_pure_virtual(void) {}\n\nextern \"C\" void (*__preinit_array_start []) (void) __at"
  },
  {
    "path": "examples/scheduled_radio_tests.cpp",
    "chars": 17355,
    "preview": "#include <bluetoe/nrf51.hpp>\n#include <cassert>\n#include <algorithm>\n#include <functional>\n\nstruct radio_t : bluetoe::nr"
  },
  {
    "path": "examples/spl/CMakeLists.txt",
    "chars": 205,
    "preview": "add_library(spl STATIC)\n\ntarget_include_directories(spl PUBLIC ${CMAKE_CURRENT_LIST_DIR}/..)\ntarget_link_libraries(spl P"
  },
  {
    "path": "examples/spl/README.md",
    "chars": 264,
    "preview": "Standard Peripheral Library\n---------------------------\n\nThis is a very small library that should provide plattform (too"
  },
  {
    "path": "examples/spl/flash.hpp",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/spl/gpio.hpp",
    "chars": 5488,
    "preview": "#ifndef SPL_GPIO_HPP\n#define SPL_GPIO_HPP\n\n#include <bluetoe/meta_tools.hpp>\n\n#include <type_traits>\n\n#include <nrf.h>\n\n"
  },
  {
    "path": "examples/spl/temperature.cpp",
    "chars": 540,
    "preview": "#include \"spl/temperature.hpp\"\n\n#include <nrf.h>\n\nstatic std::uint32_t sensor_value = 0;\n\nvoid spl::details::nrf52_tempe"
  },
  {
    "path": "examples/spl/temperature.hpp",
    "chars": 1072,
    "preview": "#ifndef SPL_TEMPERATURE_HPP\n#define SPL_TEMPERATURE_HPP\n\n#include <cstdint>\n\nnamespace spl {\n\n    namespace details {\n  "
  },
  {
    "path": "examples/spl/timer.hpp",
    "chars": 180,
    "preview": "#ifndef SPL_TIMER_HPP\n#define SPL_TIMER_HPP\n\nnamespace spl {\n\n    template < typename ... Options >\n    class timer\n    "
  },
  {
    "path": "examples/synchronized_callbacks.cpp",
    "chars": 3527,
    "preview": "/*\n * Example of callbacks that are synchronized to the connection event.\n *\n * API Documentation: link_layer/include/bl"
  },
  {
    "path": "examples/thermometer.cpp",
    "chars": 2515,
    "preview": "/**\n * @example thermometer.cpp\n *\n * This example demonstrates, how notifications work in Bluetoe. To send out a notifi"
  },
  {
    "path": "examples/ucontroller.hpp",
    "chars": 331,
    "preview": "#ifndef BLUETOE_EXAMPLES_UCONTROLLER_HPP\n#define BLUETOE_EXAMPLES_UCONTROLLER_HPP\n\n#if !defined BLUETOE_CONTROLLER\n#   i"
  },
  {
    "path": "publish-doxygen",
    "chars": 1207,
    "preview": "# leave the script if we build on travis-ci and this is not the clang++-3.7 build\nif [[ $BUILD_ON_TRAVIS ]] && [[ \"$COMP"
  },
  {
    "path": "tests/CMakeLists.txt",
    "chars": 1852,
    "preview": "#set(Boost_DEBUG 1)\nfind_package( Boost REQUIRED )\n\nadd_compile_options(-Wall -pedantic -Wextra -Wfatal-errors)\n\nif (CMA"
  },
  {
    "path": "tests/advertising_tests.cpp",
    "chars": 12596,
    "preview": "#include <bluetoe/custom_advertising.hpp>\n#include <bluetoe/adv_service_list.hpp>\n\n#define BOOST_TEST_MODULE\n#include <b"
  },
  {
    "path": "tests/att/CMakeLists.txt",
    "chars": 849,
    "preview": "add_and_register_test(find_information_tests)\nadd_and_register_test(find_by_type_value_tests)\nadd_and_register_test(find"
  },
  {
    "path": "tests/att/descriptor_tests.cpp",
    "chars": 5637,
    "preview": "#include <bluetoe/descriptor.hpp>\n\n#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"tes"
  },
  {
    "path": "tests/att/execute_write_tests.cpp",
    "chars": 7604,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n#include <array>\n\nBO"
  },
  {
    "path": "tests/att/find_by_type_value_tests.cpp",
    "chars": 9323,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n#include \"test_servi"
  },
  {
    "path": "tests/att/find_information_tests.cpp",
    "chars": 9294,
    "preview": "\n#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nnamespace {\n    co"
  },
  {
    "path": "tests/att/find_notification_data_tests.cpp",
    "chars": 8572,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <bluetoe/server.hpp>\n#include <bluetoe/"
  },
  {
    "path": "tests/att/indication_tests.cpp",
    "chars": 8910,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <bluetoe/server.hpp>\n\n#include \"test_se"
  },
  {
    "path": "tests/att/mtu_exchange_tests.cpp",
    "chars": 2261,
    "preview": "\n#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_FIXTURE_TEST"
  },
  {
    "path": "tests/att/notification_tests.cpp",
    "chars": 31196,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <bluetoe/notification_queue.hpp>\n\n#incl"
  },
  {
    "path": "tests/att/outgoing_priority_tests.cpp",
    "chars": 13709,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <bluetoe/server.hpp>\n#include <bluetoe/"
  },
  {
    "path": "tests/att/prepare_write_tests.cpp",
    "chars": 5539,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/att/read_blob_tests.cpp",
    "chars": 3600,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/att/read_by_group_type_tests.cpp",
    "chars": 10576,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <test_servers.hpp>\n#include <test_servi"
  },
  {
    "path": "tests/att/read_by_type_tests.cpp",
    "chars": 10893,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <test_servers.hpp>\n#include <test_servi"
  },
  {
    "path": "tests/att/read_multiple_tests.cpp",
    "chars": 5669,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/att/read_tests.cpp",
    "chars": 4818,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/att/request_not_supported_tests.cpp",
    "chars": 532,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_FIXTURE_TEST_"
  },
  {
    "path": "tests/att/write_command_tests.cpp",
    "chars": 1647,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/att/write_tests.cpp",
    "chars": 3740,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include \"test_servers.hpp\"\n\nBOOST_AUTO_TEST_SUI"
  },
  {
    "path": "tests/attribute_handle_tests.cpp",
    "chars": 39826,
    "preview": "#include <bluetoe/attribute_handle.hpp>\n#include <bluetoe/server.hpp>\n\n#define BOOST_TEST_MODULE\n#include <boost/test/in"
  },
  {
    "path": "tests/auto_uuid_tests.cpp",
    "chars": 2589,
    "preview": "#include <iostream>\n#include <array>\n#include <bluetoe/service.hpp>\n\n#define BOOST_TEST_MODULE\n#include <boost/test/incl"
  },
  {
    "path": "tests/bits_tests.cpp",
    "chars": 1862,
    "preview": "#define BOOST_TEST_MODULE\n#include <boost/test/included/unit_test.hpp>\n\n#include <bluetoe/bits.hpp>\n\nBOOST_AUTO_TEST_CAS"
  },
  {
    "path": "tests/characteristic_tests.cpp",
    "chars": 30475,
    "preview": "#include <iostream>\n#include <cstdint>\n\n#include <bluetoe/characteristic.hpp>\n#include <bluetoe/service.hpp>\n#include <b"
  },
  {
    "path": "tests/characteristic_value_tests.cpp",
    "chars": 20450,
    "preview": "#include <bluetoe/characteristic.hpp>\n#include <bluetoe/service.hpp>\n#include <bluetoe/encryption.hpp>\n#include <bluetoe"
  }
]

// ... and 89 more files (download for full content)

About this extraction

This page contains the full source code of the TorstenRobitzki/bluetoe GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 289 files (2.8 MB), approximately 754.1k tokens, and a symbol index with 4435 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!