diff --git a/.clang-format b/.clang-format index 5c63f8e8335..9a795f477f4 100644 --- a/.clang-format +++ b/.clang-format @@ -1,11 +1,11 @@ --- BasedOnStyle: LLVM Language: Cpp -Standard: Cpp11 +Standard: c++17 AllowShortFunctionsOnASingleLine: Inline AllowShortBlocksOnASingleLine: true AllowShortIfStatementsOnASingleLine: true -AlwaysBreakTemplateDeclarations: true +AlwaysBreakTemplateDeclarations: Yes BreakBeforeBraces: Custom BraceWrapping: AfterClass: true diff --git a/.gitattributes b/.gitattributes index 9a3e60b023a..5b8437bca81 100644 --- a/.gitattributes +++ b/.gitattributes @@ -21,3 +21,4 @@ *.pvm binary *.exr binary *.pfm binary +*.webp binary diff --git a/.github/workflows/build-matrix.yml b/.github/workflows/build-matrix.yml index d8061758eee..becfeb9a8dc 100644 --- a/.github/workflows/build-matrix.yml +++ b/.github/workflows/build-matrix.yml @@ -50,14 +50,6 @@ on: required: false type: string default: "false" - qt5: - required: false - type: string - default: "true" - qt6: - required: false - type: string - default: "true" env: ext-dir: $GITHUB_WORKSPACE/external/install/ @@ -78,7 +70,7 @@ jobs: [[ "true" == "${{ inputs.windows }}" && "true" == "${{inputs.linux}}" ]] && echo ',' [[ "true" == "${{ inputs.linux }}" ]] && echo '{ "name": "Ubuntu gcc", "os": "ubuntu-latest", "cc": "gcc-10", "cxx": "g++-10", "icon": "Linux", "extra-flags": "-DCMAKE_CXX_FLAGS=-Wno-deprecated-declarations -DRADIUM_ENABLE_GL_TESTING=ON" }' [[ "true" == "${{ inputs.windows }}" || "true" == "${{inputs.linux}}" ]] && [[ "true" == "${{inputs.macos}}" ]] && echo ',' - [[ "true" == "${{ inputs.macos }}" ]] && echo '{ "name": "MacOS clang", "os": "macos-latest", "cc": "clang", "cxx": "clang++", "icon": "Apple", "extra-flags": "-DCMAKE_CXX_FLAGS=-Wno-deprecated-declarations" }' + [[ "true" == "${{ inputs.macos }}" ]] && echo '{ "name": "MacOS clang", "os": "macos-13", "cc": "clang", "cxx": "clang++", "icon": "Apple", "extra-flags": "-DCMAKE_CXX_FLAGS=-Wno-deprecated-declarations" }' echo '],' echo '"build-type" : [' [[ "true" == "${{ inputs.build-debug }}" ]] && echo '"Debug"' @@ -89,11 +81,7 @@ jobs: echo '{ "name": "float", "value": "OFF"}' [[ "true" == "${{ inputs.use-double }}" ]] && echo ', { "name": "double", "value": "ON" }' echo '],' - echo '"qtversion" : [' - [[ "true" == "${{ inputs.qt5 }}" ]] && echo '{ "name" : "qt5", "value" : "5.15.1"}' - [[ "true" == "${{ inputs.qt5 }}" && "true" == "${{ inputs.qt6 }}" ]] && echo ',' - [[ "true" == "${{ inputs.qt6 }}" ]] && echo '{ "name" : "qt6", "value" : "6.2.0"}' - echo '],' + echo '"qtversion" : [ { "name" : "qt6", "value" : "6.2.0"}],' echo '"coverage" : [' [[ "true" == "${{ inputs.coverage }}" ]] && echo '{ "value" : "ON", "extra-flags" : "-DRADIUM_ENABLE_GL_TESTING=ON" }' || echo '{ "value" : "OFF", "extra-flags" : "" }' echo "]" @@ -124,7 +112,9 @@ jobs: fail-fast: false matrix: ${{ fromJSON(needs.create-matrix.outputs.matrix) }} steps: - - uses: seanmiddleditch/gha-setup-ninja@master + - name: Install Ninja + shell: bash + run: ${{ runner.os == 'macOS' && 'brew install ninja' || runner.os == 'Windows' && 'choco install ninja' || 'sudo apt-get install ninja-build' }} - name: Add msbuild to PATH uses: seanmiddleditch/gha-setup-vsdevenv@master if: runner.os == 'Windows' @@ -172,6 +162,7 @@ jobs: echo "${{ env.ext-dir }}/bin" >> $GITHUB_PATH echo "${{ env.ext-dir }}/glbinding" >> $GITHUB_PATH echo "${{ env.ext-dir }}/globjects" >> $GITHUB_PATH + echo "${{ env.ext-dir }}/cpplocate" >> $GITHUB_PATH - name: Prepare directories run: | mkdir -p install/ @@ -183,12 +174,15 @@ jobs: uses: actions/checkout@master with: path: src/Radium-Engine + submodules: 'recursive' - name: pull updated repo (e.g. with new VERSION) if: ${{ github.event_name == 'push' }} - run: git -C src/Radium-Engine pull origin ${{ github.event.ref }} + run: | + git -C src/Radium-Engine pull origin ${{ github.event.ref }} + git -C src/Radium-Engine submodule update --init --recursive - name: Cache externals id: cache-external - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: external key: ${{ matrix.config.name }}-${{ matrix.build-type }}-${{ matrix.qtversion.name }}-external-v1-${{ hashFiles('src/Radium-Engine/external/**/CMakeLists.txt') }} @@ -259,11 +253,6 @@ jobs: if: ${{ inputs.coverage == 'true' }} run: | cd build/Radium-Engine - cmake --build . --config Debug --target lcov_init - cmake --build . --config Debug --target lcov_zerocounter - cmake --build . --config Debug --target check - cmake --build . --config Debug --target lcov_capture - # show report for debug - cmake --build . --config Debug --target lcov_list + cmake --build . --config Debug --target coverage # Uploading report to CodeCov - bash <(curl -s https://codecov.io/bash) -f total.info -R ../../src/Radium-Engine || echo "Codecov did not collect coverage reports" + bash <(curl -s https://codecov.io/bash) -f coverage.info -R ../../src/Radium-Engine || echo "Codecov did not collect coverage reports" diff --git a/.github/workflows/deploy-doc.yml b/.github/workflows/deploy-doc.yml index d80677c11aa..d422d51df6f 100644 --- a/.github/workflows/deploy-doc.yml +++ b/.github/workflows/deploy-doc.yml @@ -7,11 +7,17 @@ on: workflow_call: secrets: REPO_ACCESS_TOKEN: - required: true + required: false + inputs: + deploy-on-gh-pages: + required: false + type: string + default: "true" jobs: deploy-doc-index: - runs-on: ubuntu-20.04 + if: ${{ inputs.deploy-on-gh-pages == 'true' }} + runs-on: ubuntu-24.04 steps: - name: Checkout remote head uses: actions/checkout@master @@ -22,28 +28,30 @@ jobs: publish_dir: 'doc/index' keep_files: true - deploy-doc: - runs-on: ubuntu-20.04 + build-and-deploy-doc: + runs-on: ubuntu-24.04 steps: - name: Prepare directories run: | mkdir -p src/Radium-Engine mkdir -p build/Radium-Engine + mkdir doxygen - name: Checkout remote head uses: actions/checkout@master with: path: src/Radium-Engine submodules: recursive - name: pull updated repo (e.g. with new VERSION) + if: ${{ inputs.deploy-on-gh-pages == 'true' }} run: git -C src/Radium-Engine pull origin ${{ github.event.ref }} - name: Install packages run : | - sudo apt-get install graphviz - - name: Fetch recent doxygen (1.9.1) + sudo apt-get install graphviz plantuml + - name: Fetch recent doxygen run: | - sudo apt-get install clang-9 libclang-9-dev - wget https://sourceforge.net/projects/doxygen/files/rel-1.9.1/doxygen-1.9.1.linux.bin.tar.gz - tar -xvzf doxygen-1.9.1.linux.bin.tar.gz + wget https://sourceforge.net/projects/doxygen/files/rel-1.12.0/doxygen-1.12.0.linux.bin.tar.gz -O doxygen.tar.gz + tar -zxvf doxygen.tar.gz -C doxygen --wildcards "*/bin" + mv doxygen/*/bin doxygen/ - name: Extract ref for badges prefix if: always() shell: bash @@ -51,24 +59,34 @@ jobs: GITHUB_REF=${{ github.ref }} echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT id: extract-branch - - name: Configure Doc + - name: Configure and build doc run: | cd build/Radium-Engine - cmake ../../src/Radium-Engine/doc -DCMAKE_EXECUTE_PROCESS_COMMAND_ECHO=STDOUT -DDOXYGEN_EXECUTABLE=../../doxygen-1.9.1/bin/doxygen - - name: Build Doc - run: | + ls -lh ../../doxygen/bin/doxygen + ../../doxygen/bin/doxygen -v + cmake ../../src/Radium-Engine/doc -DCMAKE_EXECUTE_PROCESS_COMMAND_ECHO=STDOUT -DDOXYGEN_EXECUTABLE=../../doxygen/bin/doxygen export GITHUB_REF="${{ steps.extract-branch.outputs.branch }}" - cd build/Radium-Engine cmake --build . --target RadiumDoc + # upload doc as artifact if not deployed + - name: Archive doc + if: ${{ inputs.deploy-on-gh-pages == 'false' }} + uses: actions/upload-artifact@v4 + with: + name: doc + path: build/Radium-Engine/html/ + retention-days: 5 - name: Fix badges github ref + if: ${{ inputs.deploy-on-gh-pages == 'true' }} run: | export GITHUB_REF="${{ steps.extract-branch.outputs.branch }}" cd build/Radium-Engine sed -i "s/\$(GITHUB_REF)/${GITHUB_REF}/g" html/index.html - name: Git branch name + if: ${{ inputs.deploy-on-gh-pages == 'true' }} id: git-branch-name uses: EthanSK/git-branch-name-action@v1 - name: Deploy Doc + if: ${{ inputs.deploy-on-gh-pages == 'true' }} uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.REPO_ACCESS_TOKEN }} diff --git a/.github/workflows/manual-doc-artifact-build.yml b/.github/workflows/manual-doc-artifact-build.yml new file mode 100644 index 00000000000..9a0277cb51c --- /dev/null +++ b/.github/workflows/manual-doc-artifact-build.yml @@ -0,0 +1,14 @@ +name: Build doc artifact (trigger manually) + +on: + workflow_dispatch: + inputs: + branch: + description: 'The branch to build' + required: true + +jobs: + call-build-doc: + uses: ./.github/workflows/deploy-doc.yml + with: + deploy-on-gh-pages: "false" diff --git a/.github/workflows/pull-request-ci.yml b/.github/workflows/pull-request-ci.yml index 08326293bcf..76807cdb1a1 100644 --- a/.github/workflows/pull-request-ci.yml +++ b/.github/workflows/pull-request-ci.yml @@ -29,4 +29,3 @@ jobs: macos: "false" build-release: "false" coverage: "true" - qt6: "false" diff --git a/.github/workflows/push-master-ci.yml b/.github/workflows/push-master-ci.yml index b693b87c328..8b7247eb639 100644 --- a/.github/workflows/push-master-ci.yml +++ b/.github/workflows/push-master-ci.yml @@ -37,7 +37,6 @@ jobs: macos: "false" build-release: "false" coverage: "true" - qt6: "false" call-notify: needs: [increase-version-number] uses: ./.github/workflows/notify-radium-releases.yml diff --git a/.github/workflows/push-rc-ci.yml b/.github/workflows/push-rc-ci.yml index 56d1a0b1753..cfbd7d1c2c4 100644 --- a/.github/workflows/push-rc-ci.yml +++ b/.github/workflows/push-rc-ci.yml @@ -37,4 +37,3 @@ jobs: macos: "false" build-release: "false" coverage: "true" - qt6: "false" diff --git a/.gitmodules b/.gitmodules index 41142acc89f..29ea01a6fa6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "external/doxygen-awesome-css"] path = external/doxygen-awesome-css url = https://github.com/jothepro/doxygen-awesome-css.git +[submodule "cmake/cmake-message-helpers"] + path = cmake/cmake-message-helpers + url = https://github.com/dlyr/cmake-message-helpers.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9a8f77dabe2..090b0c2aff3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v5.0.0 hooks: - id: trailing-whitespace exclude: ^tests/.*/data/.*$ @@ -26,12 +26,12 @@ repos: # - id: cppcheck # args: [--enable=all] - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.33.0 + rev: v0.42.0 hooks: - id: markdownlint args: [-f] - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v15.0.6 + rev: v19.1.1 hooks: - id: clang-format types_or: [c++, c, cuda] diff --git a/CMakeLists.txt b/CMakeLists.txt index cd42714e5ec..645f59fab26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) # ------------------------------------------------------------------------------ # Policies and global parameters for CMake @@ -7,7 +7,8 @@ cmake_policy(SET CMP0092 NEW) # do not set /W3 for msvc set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) - +include(${CMAKE_SOURCE_DIR}/cmake/cmake-message-helpers/MessageHelpers.cmake) +message_prefix_push("Main") # Project setup, versioning stuff here, change when changing the version # ~~~ # Note: keep the project name lower case only for easy linux packaging support @@ -162,13 +163,8 @@ else() set(GIT_CHANGESET "") endif() -set(ENABLE_COVERAGE "") -mark_as_advanced(ENABLE_COVERAGE) if(RADIUM_ENABLE_COVERAGE) - include(CoverageFunc) - # sets ENABLE_COVERAGE to ON if ok - setup_coverage() - + set(RADIUM_ENABLE_TESTING "ON") include(CodeCoverage) append_coverage_compiler_flags() endif(RADIUM_ENABLE_COVERAGE) @@ -177,6 +173,7 @@ endif(RADIUM_ENABLE_COVERAGE) # Installation utilities include(RadiumSetupFunctions) +message_prefix_pop() # Documentation build add_subdirectory(doc) @@ -222,11 +219,39 @@ if(RADIUM_ENABLE_TESTING) add_subdirectory(tests) endif() -if(ENABLE_COVERAGE) - set(LCOV_REMOVES - "'/usr/*';'*examples*';'*external*';'*install*';'*/Catch2/*';'*_autogen/*';'*build*'" +if(RADIUM_ENABLE_COVERAGE) + append_coverage_compiler_flags() + setup_target_for_coverage_lcov( + NAME + coverage + EXECUTABLE + ${CMAKE_CTEST_COMMAND} + --output-on-failure + -C + ${CMAKE_BUILD_TYPE} + -j + $ENV{CMAKE_BUILD_PARALLEL_LEVEL} + BASE_DIRECTORY + "/" + DEPENDENCIES + RadiumLibs + unittests + integration + EXCLUDE + "/*external*/" + "/*/glbinding/*" + "/*/globjects/*" + "/*/OpenMesh/*" + "/*/assimp/*" + "/*/eigen3/*" + "/*/nlohmann/*" + "/*/stb/*" + "/usr/*" + "${CMAKE_SOURCE_DIR}/examples*" + "${CMAKE_SOURCE_DIR}/*/Catch2/*" + "${CMAKE_BINARY_DIR}/*_autogen/*" + "${CMAKE_BINARY_DIR}/*mocs*" ) - setup_coverage_targets(${ENABLE_COVERAGE} "${LCOV_REMOVES}") # Fastcov is not supported with gcov llvm: disabling for MacOS Source: # https://github.com/RPGillespie6/fastcov/issues/36 @@ -235,16 +260,28 @@ if(ENABLE_COVERAGE) NAME coverage_fastcov EXECUTABLE - ctest + ${CMAKE_CTEST_COMMAND} + --output-on-failure + -C + ${CMAKE_BUILD_TYPE} -j $ENV{CMAKE_BUILD_PARALLEL_LEVEL} DEPENDENCIES RadiumLibs unittests integration + BASE_DIRECTORY + "/" EXCLUDE "/usr/" "examples" + "glbinding" + "globjects" + "OpenMesh" + "assimp" + "eigen3" + "nlohmann" + "stb" "external" "install" "/Catch2/" @@ -261,7 +298,7 @@ install(FILES LICENSE README.md TYPE DATA) # ------------------------------------------------------------------------------- # Wrap up of settings printed on build -include(MessageFunc) + message(NOTICE "") message_title(" Final overview for ${PROJECT_NAME} ") message_info(" ") diff --git a/README.md b/README.md index 3f84f60e590..5247219e44d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Radium-Engine libraries -![banner](doc/images/radium-banner.png) +![banner](doc/images/radium-banner.webp) Radium is a research 3D Engine for rendering, animation and processing. It is developed and maintained by the [STORM research group](https://www.irit.fr/STORM/site/). diff --git a/VERSION b/VERSION index bc80560fad6..a7ccabdbf53 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.0 +1.5.20 diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake index 8eb847ee0c0..3db68423528 100644 --- a/cmake/CodeCoverage.cmake +++ b/cmake/CodeCoverage.cmake @@ -79,6 +79,14 @@ # 2021-05-10, Martin Stump # - Check if the generator is multi-config before warning about non-Debug builds # +# 2022-02-22, Marko Wehle +# - Change gcovr output from -o for --xml and --html output respectively. +# This will allow for Multiple Output Formats at the same time by making use of GCOVR_ADDITIONAL_ARGS, e.g. GCOVR_ADDITIONAL_ARGS "--txt". +# +# 2022-09-28, Sebastian Mueller +# - fix append_coverage_compiler_flags_to_target to correctly add flags +# - replace "-fprofile-arcs -ftest-coverage" with "--coverage" (equivalent) +# # USAGE: # # 1. Copy this file into your cmake modules path. @@ -87,8 +95,10 @@ # using a CMake option() to enable it just optionally): # include(CodeCoverage) # -# 3. Append necessary compiler flags: +# 3. Append necessary compiler flags for all supported source files: # append_coverage_compiler_flags() +# Or for specific target: +# append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME) # # 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og # @@ -141,29 +151,34 @@ if(NOT GCOV_PATH) message(FATAL_ERROR "gcov not found! Aborting...") endif() # NOT GCOV_PATH +# Check supported compiler (Clang, GNU and Flang) get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) -list(GET LANGUAGES 0 LANG) - -if("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") - if("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3) - message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") - endif() -elseif(NOT CMAKE_COMPILER_IS_GNUCXX) - if("${CMAKE_Fortran_COMPILER_ID}" MATCHES "[Ff]lang") - # Do nothing; exit conditional without error if true - elseif("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU") - # Do nothing; exit conditional without error if true - else() - message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") +foreach(LANG ${LANGUAGES}) + if("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") + if("${CMAKE_${LANG}_COMPILER_VERSION}" VERSION_LESS 3) + message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") + endif() + elseif(NOT "${CMAKE_${LANG}_COMPILER_ID}" MATCHES "GNU" AND NOT "${CMAKE_${LANG}_COMPILER_ID}" + MATCHES "(LLVM)?[Ff]lang" + ) + message(FATAL_ERROR "Compiler is not GNU or Flang! Aborting...") endif() -endif() +endforeach() + +set(COVERAGE_COMPILER_FLAGS "-g --coverage" CACHE INTERNAL "") -set(COVERAGE_COMPILER_FLAGS "-g -fprofile-arcs -ftest-coverage" CACHE INTERNAL "") if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") include(CheckCXXCompilerFlag) - check_cxx_compiler_flag(-fprofile-abs-path HAVE_fprofile_abs_path) - if(HAVE_fprofile_abs_path) - set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") + check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path) + if(HAVE_cxx_fprofile_abs_path) + set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") + endif() +endif() +if(CMAKE_C_COMPILER_ID MATCHES "(GNU|Clang)") + include(CheckCCompilerFlag) + check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path) + if(HAVE_c_fprofile_abs_path) + set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path") endif() endif() @@ -199,23 +214,16 @@ endif() # Defines a target for running and collection code coverage information Builds dependencies, runs # the given executable and outputs reports. NOTE! The executable should always have a ZERO as exit # code otherwise the coverage generation will not complete. -# ~~~ -# setup_target_for_coverage_lcov( -# NAME testrunner_coverage # New target name -# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES testrunner # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# NO_DEMANGLE # Don't demangle C++ symbols -# # even if c++filt is found -# ) -# ~~~ - +# +# setup_target_for_coverage_lcov( NAME testrunner_coverage # New target name +# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR DEPENDENCIES +# testrunner # Dependencies to build first BASE_DIRECTORY "../" # Base directory +# for report # (defaults to PROJECT_SOURCE_DIR) EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to +# exclude (can be relative # to BASE_DIRECTORY, with CMake 3.4+) NO_DEMANGLE # Don't demangle C++ +# symbols # even if c++filt is found ) function(setup_target_for_coverage_lcov) - set(options NO_DEMANGLE) + set(options NO_DEMANGLE SONARQUBE) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -239,7 +247,7 @@ function(setup_target_for_coverage_lcov) set(LCOV_EXCLUDES "") foreach(EXCLUDE ${Coverage_EXCLUDE} ${COVERAGE_EXCLUDES} ${COVERAGE_LCOV_EXCLUDES}) if(CMAKE_VERSION VERSION_GREATER 3.4) - # get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) + get_filename_component(EXCLUDE ${EXCLUDE} ABSOLUTE BASE_DIR ${BASEDIR}) endif() list(APPEND LCOV_EXCLUDES "${EXCLUDE}") endforeach() @@ -272,9 +280,10 @@ function(setup_target_for_coverage_lcov) -i -d ${CMAKE_BINARY_DIR} + -b + ${BASEDIR} -o ${Coverage_NAME}.base - # -b ${BASEDIR} ) # Run tests set(LCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) @@ -321,38 +330,54 @@ function(setup_target_for_coverage_lcov) set(LCOV_GEN_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} ${Coverage_NAME}.info ) - - message(STATUS "---- ${CODE_COVERAGE_VERBOSE}") + if(${Coverage_SONARQUBE}) + # Generate SonarQube output + set(GCOVR_XML_CMD + ${GCOVR_PATH} --sonarqube ${Coverage_NAME}_sonarqube.xml -r ${BASEDIR} + ${GCOVR_ADDITIONAL_ARGS} ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} + ) + set(GCOVR_XML_CMD_COMMAND COMMAND ${GCOVR_XML_CMD}) + set(GCOVR_XML_CMD_BYPRODUCTS ${Coverage_NAME}_sonarqube.xml) + set(GCOVR_XML_CMD_COMMENT + COMMENT "SonarQube code coverage info report saved in ${Coverage_NAME}_sonarqube.xml." + ) + endif() if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") message(STATUS "Command to clean up lcov: ") string(REPLACE ";" " " LCOV_CLEAN_CMD_SPACED "${LCOV_CLEAN_CMD}") - message(STATUS "${LCOV_CLEAN_CMD_SPACED}") + message("${LCOV_CLEAN_CMD_SPACED}") message(STATUS "Command to create baseline: ") string(REPLACE ";" " " LCOV_BASELINE_CMD_SPACED "${LCOV_BASELINE_CMD}") - message(STATUS "${LCOV_BASELINE_CMD_SPACED}") + message("${LCOV_BASELINE_CMD_SPACED}") message(STATUS "Command to run the tests: ") string(REPLACE ";" " " LCOV_EXEC_TESTS_CMD_SPACED "${LCOV_EXEC_TESTS_CMD}") - message(STATUS "${LCOV_EXEC_TESTS_CMD_SPACED}") + message("${LCOV_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to capture counters and generate report: ") string(REPLACE ";" " " LCOV_CAPTURE_CMD_SPACED "${LCOV_CAPTURE_CMD}") - message(STATUS "${LCOV_CAPTURE_CMD_SPACED}") + message("${LCOV_CAPTURE_CMD_SPACED}") message(STATUS "Command to add baseline counters: ") string(REPLACE ";" " " LCOV_BASELINE_COUNT_CMD_SPACED "${LCOV_BASELINE_COUNT_CMD}") - message(STATUS "${LCOV_BASELINE_COUNT_CMD_SPACED}") + message("${LCOV_BASELINE_COUNT_CMD_SPACED}") message(STATUS "Command to filter collected data: ") string(REPLACE ";" " " LCOV_FILTER_CMD_SPACED "${LCOV_FILTER_CMD}") - message(STATUS "${LCOV_FILTER_CMD_SPACED}") + message("${LCOV_FILTER_CMD_SPACED}") message(STATUS "Command to generate lcov HTML output: ") string(REPLACE ";" " " LCOV_GEN_HTML_CMD_SPACED "${LCOV_GEN_HTML_CMD}") - message(STATUS "${LCOV_GEN_HTML_CMD_SPACED}") + message("${LCOV_GEN_HTML_CMD_SPACED}") + + if(${Coverage_SONARQUBE}) + message(STATUS "Command to generate SonarQube XML output: ") + string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") + message("${GCOVR_XML_CMD_SPACED}") + endif() endif() # Setup target @@ -364,10 +389,10 @@ function(setup_target_for_coverage_lcov) COMMAND ${LCOV_CAPTURE_CMD} COMMAND ${LCOV_BASELINE_COUNT_CMD} COMMAND ${LCOV_FILTER_CMD} - COMMAND ${LCOV_GEN_HTML_CMD} + COMMAND ${LCOV_GEN_HTML_CMD} ${GCOVR_XML_CMD_COMMAND} # Set output files as GENERATED (will be removed on 'make clean') BYPRODUCTS ${Coverage_NAME}.base ${Coverage_NAME}.capture ${Coverage_NAME}.total - ${Coverage_NAME}.info ${Coverage_NAME}/index.html + ${Coverage_NAME}.info ${GCOVR_XML_CMD_BYPRODUCTS} ${Coverage_NAME}/index.html WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands @@ -379,6 +404,7 @@ function(setup_target_for_coverage_lcov) add_custom_command( TARGET ${Coverage_NAME} POST_BUILD COMMAND ; COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info." + ${GCOVR_XML_CMD_COMMENT} ) # Show info where to find the report @@ -393,19 +419,12 @@ endfunction() # setup_target_for_coverage_lcov # the given executable and outputs reports. NOTE! The executable should always have a ZERO as exit # code otherwise the coverage generation will not complete. # -# ~~~ -# setup_target_for_coverage_gcovr_xml( -# NAME ctest_coverage # New target name -# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES executable_target # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# ) -# ~~~ -# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the GCVOR -# command. +# setup_target_for_coverage_gcovr_xml( NAME ctest_coverage # New target name +# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR DEPENDENCIES +# executable_target # Dependencies to build first BASE_DIRECTORY "../" # +# Base directory for report # (defaults to PROJECT_SOURCE_DIR) EXCLUDE "src/dir1/*" "src/dir2/*" # +# Patterns to exclude (can be relative # to BASE_DIRECTORY, with CMake 3.4+) ) The user can set the +# variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the GCVOR command. function(setup_target_for_coverage_gcovr_xml) set(options NONE) @@ -445,15 +464,8 @@ function(setup_target_for_coverage_gcovr_xml) set(GCOVR_XML_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) # Running gcovr set(GCOVR_XML_CMD - ${GCOVR_PATH} - --xml - -r - ${BASEDIR} - ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} - --object-directory=${PROJECT_BINARY_DIR} - -o - ${Coverage_NAME}.xml + ${GCOVR_PATH} --xml ${Coverage_NAME}.xml -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} + ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} ) if(CODE_COVERAGE_VERBOSE) @@ -461,11 +473,11 @@ function(setup_target_for_coverage_gcovr_xml) message(STATUS "Command to run tests: ") string(REPLACE ";" " " GCOVR_XML_EXEC_TESTS_CMD_SPACED "${GCOVR_XML_EXEC_TESTS_CMD}") - message(STATUS "${GCOVR_XML_EXEC_TESTS_CMD_SPACED}") + message("${GCOVR_XML_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to generate gcovr XML coverage data: ") string(REPLACE ";" " " GCOVR_XML_CMD_SPACED "${GCOVR_XML_CMD}") - message(STATUS "${GCOVR_XML_CMD_SPACED}") + message("${GCOVR_XML_CMD_SPACED}") endif() add_custom_target( @@ -490,19 +502,12 @@ endfunction() # setup_target_for_coverage_gcovr_xml # the given executable and outputs reports. NOTE! The executable should always have a ZERO as exit # code otherwise the coverage generation will not complete. # -# ~~~ -# setup_target_for_coverage_gcovr_html( -# NAME ctest_coverage # New target name -# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES executable_target # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/*" "src/dir2/*" # Patterns to exclude (can be relative -# # to BASE_DIRECTORY, with CMake 3.4+) -# ) -# ~~~ -# The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the GCVOR -# command. +# setup_target_for_coverage_gcovr_html( NAME ctest_coverage # New target name +# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR DEPENDENCIES +# executable_target # Dependencies to build first BASE_DIRECTORY "../" # +# Base directory for report # (defaults to PROJECT_SOURCE_DIR) EXCLUDE "src/dir1/*" "src/dir2/*" # +# Patterns to exclude (can be relative # to BASE_DIRECTORY, with CMake 3.4+) ) The user can set the +# variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the GCVOR command. function(setup_target_for_coverage_gcovr_html) set(options NONE) @@ -548,14 +553,13 @@ function(setup_target_for_coverage_gcovr_html) set(GCOVR_HTML_CMD ${GCOVR_PATH} --html + ${Coverage_NAME}/index.html --html-details -r ${BASEDIR} ${GCOVR_ADDITIONAL_ARGS} ${GCOVR_EXCLUDE_ARGS} --object-directory=${PROJECT_BINARY_DIR} - -o - ${Coverage_NAME}/index.html ) if(CODE_COVERAGE_VERBOSE) @@ -563,15 +567,15 @@ function(setup_target_for_coverage_gcovr_html) message(STATUS "Command to run tests: ") string(REPLACE ";" " " GCOVR_HTML_EXEC_TESTS_CMD_SPACED "${GCOVR_HTML_EXEC_TESTS_CMD}") - message(STATUS "${GCOVR_HTML_EXEC_TESTS_CMD_SPACED}") + message("${GCOVR_HTML_EXEC_TESTS_CMD_SPACED}") message(STATUS "Command to create a folder: ") string(REPLACE ";" " " GCOVR_HTML_FOLDER_CMD_SPACED "${GCOVR_HTML_FOLDER_CMD}") - message(STATUS "${GCOVR_HTML_FOLDER_CMD_SPACED}") + message("${GCOVR_HTML_FOLDER_CMD_SPACED}") message(STATUS "Command to generate gcovr HTML coverage data: ") string(REPLACE ";" " " GCOVR_HTML_CMD_SPACED "${GCOVR_HTML_CMD}") - message(STATUS "${GCOVR_HTML_CMD_SPACED}") + message("${GCOVR_HTML_CMD_SPACED}") endif() add_custom_target( @@ -597,31 +601,29 @@ endfunction() # setup_target_for_coverage_gcovr_html # Defines a target for running and collection code coverage information Builds dependencies, runs # the given executable and outputs reports. NOTE! The executable should always have a ZERO as exit # code otherwise the coverage generation will not complete. -# ~~~ -# setup_target_for_coverage_fastcov( -# NAME testrunner_coverage # New target name -# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR -# DEPENDENCIES testrunner # Dependencies to build first -# BASE_DIRECTORY "../" # Base directory for report -# # (defaults to PROJECT_SOURCE_DIR) -# EXCLUDE "src/dir1/" "src/dir2/" # Patterns to exclude. -# NO_DEMANGLE # Don't demangle C++ symbols -# # even if c++filt is found -# SKIP_HTML # Don't create html report -# ) -# ~~~ +# +# setup_target_for_coverage_fastcov( NAME testrunner_coverage # New target name +# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR DEPENDENCIES +# testrunner # Dependencies to build first BASE_DIRECTORY "../" # Base directory +# for report # (defaults to PROJECT_SOURCE_DIR) EXCLUDE "src/dir1/" "src/dir2/" # Patterns to +# exclude. NO_DEMANGLE # Don't demangle C++ symbols # even if +# c++filt is found SKIP_HTML # Don't create html report POST_CMD +# perl -i -pe s!${PROJECT_SOURCE_DIR}/!!g ctest_coverage.json # E.g. for stripping source dir from +# file paths ) function(setup_target_for_coverage_fastcov) set(options NO_DEMANGLE SKIP_HTML) set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES FASTCOV_ARGS GENHTML_ARGS) + set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES FASTCOV_ARGS GENHTML_ARGS + POST_CMD + ) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT FASTCOV_PATH) message(FATAL_ERROR "fastcov not found! Aborting...") endif() - if(NOT GENHTML_PATH) + if(NOT Coverage_SKIP_HTML AND NOT GENHTML_PATH) message(FATAL_ERROR "genhtml not found! Aborting...") endif() @@ -653,15 +655,18 @@ function(setup_target_for_coverage_fastcov) --gcov ${GCOV_PATH} --search-directory - ${BASEDIR} + ${CMAKE_BINARY_DIR} --process-gcno - --lcov --output - ${Coverage_NAME}.info + ${Coverage_NAME}.json --exclude ${FASTCOV_EXCLUDES} ) + set(FASTCOV_CONVERT_CMD ${FASTCOV_PATH} -C ${Coverage_NAME}.json --lcov --output + ${Coverage_NAME}.info + ) + if(Coverage_SKIP_HTML) set(FASTCOV_HTML_CMD ";") else() @@ -670,6 +675,11 @@ function(setup_target_for_coverage_fastcov) ) endif() + set(FASTCOV_POST_CMD ";") + if(Coverage_POST_CMD) + set(FASTCOV_POST_CMD ${Coverage_POST_CMD}) + endif() + if(CODE_COVERAGE_VERBOSE) message(STATUS "Code coverage commands for target ${Coverage_NAME} (fastcov):") @@ -681,11 +691,20 @@ function(setup_target_for_coverage_fastcov) string(REPLACE ";" " " FASTCOV_CAPTURE_CMD_SPACED "${FASTCOV_CAPTURE_CMD}") message(" ${FASTCOV_CAPTURE_CMD_SPACED}") + message(" Converting fastcov .json to lcov .info:") + string(REPLACE ";" " " FASTCOV_CONVERT_CMD_SPACED "${FASTCOV_CONVERT_CMD}") + message(" ${FASTCOV_CONVERT_CMD_SPACED}") + if(NOT Coverage_SKIP_HTML) message(" Generating HTML report: ") string(REPLACE ";" " " FASTCOV_HTML_CMD_SPACED "${FASTCOV_HTML_CMD}") message(" ${FASTCOV_HTML_CMD_SPACED}") endif() + if(Coverage_POST_CMD) + message(" Running post command: ") + string(REPLACE ";" " " FASTCOV_POST_CMD_SPACED "${FASTCOV_POST_CMD}") + message(" ${FASTCOV_POST_CMD_SPACED}") + endif() endif() # Setup target @@ -693,12 +712,15 @@ function(setup_target_for_coverage_fastcov) ${Coverage_NAME} # Cleanup fastcov COMMAND ${FASTCOV_PATH} ${Coverage_FASTCOV_ARGS} --gcov ${GCOV_PATH} --search-directory - ${BASEDIR} --zerocounters + ${CMAKE_BINARY_DIR} --zerocounters COMMAND ${FASTCOV_EXEC_TESTS_CMD} COMMAND ${FASTCOV_CAPTURE_CMD} + COMMAND ${FASTCOV_CONVERT_CMD} COMMAND ${FASTCOV_HTML_CMD} + COMMAND ${FASTCOV_POST_CMD} # Set output files as GENERATED (will be removed on 'make clean') - BYPRODUCTS ${Coverage_NAME}.info ${Coverage_NAME}/index.html # report directory + BYPRODUCTS ${Coverage_NAME}.info ${Coverage_NAME}.json + ${Coverage_NAME}/index.html # report directory WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands @@ -706,7 +728,9 @@ function(setup_target_for_coverage_fastcov) "Resetting code coverage counters to zero. Processing code coverage counters and generating report." ) - set(INFO_MSG "fastcov code coverage info report saved in ${Coverage_NAME}.info.") + set(INFO_MSG + "fastcov code coverage info report saved in ${Coverage_NAME}.info and ${Coverage_NAME}.json." + ) if(NOT Coverage_SKIP_HTML) string( APPEND @@ -727,3 +751,14 @@ function(append_coverage_compiler_flags) set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endfunction() # append_coverage_compiler_flags + +# Setup coverage for specific library +function(append_coverage_compiler_flags_to_target name) + separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}") + target_compile_options(${name} PRIVATE ${_flag_list}) + if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" + ) + target_link_libraries(${name} PRIVATE gcov) + endif() +endfunction() diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake index 18b9b6e67f0..b3da66e8e7a 100644 --- a/cmake/CompilerOptions.cmake +++ b/cmake/CompilerOptions.cmake @@ -120,7 +120,6 @@ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHE -Wmissing-braces -Wreturn-type -Wswitch - -Wswitch-default -Wuninitialized -Wmissing-field-initializers $<$: diff --git a/cmake/CoverageFunc.cmake b/cmake/CoverageFunc.cmake deleted file mode 100644 index 28199a90538..00000000000 --- a/cmake/CoverageFunc.cmake +++ /dev/null @@ -1,177 +0,0 @@ -# setup coverage -macro(setup_coverage) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE STREQUAL "Debug") - message(STATUS "[Tests] Enable Coverage ¡Warning! slow down execution ¡Warning!") - set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -g -O0 -Wall -W -Wshadow -Wunused-variable -Wunused-parameter -Wunused-function -Wunused -Wno-system-headers -Wno-deprecated -Woverloaded-virtual -Wwrite-strings -fprofile-arcs -ftest-coverage" - ) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -Wall -W -fprofile-arcs -ftest-coverage") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") - find_program(LCOV_BIN lcov) - - # adapted from https://github.com/RWTH-HPC/CMake-codecov/blob/master/cmake/FindGcov.cmake - get_property(ENABLED_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) - foreach(LANG ${ENABLED_LANGUAGES}) - # Gcov evaluation is dependent on the used compiler. Check gcov support for each - # compiler that is used. If gcov binary was already found for this compiler, do not try - # to find it again. - if(NOT GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN) - get_filename_component(COMPILER_PATH "${CMAKE_${LANG}_COMPILER}" PATH) - - if("${CMAKE_${LANG}_COMPILER_ID}" STREQUAL "GNU") - # Some distributions like OSX (homebrew) ship gcov with the compiler version - # appended as gcov-x. To find this binary we'll build the suggested binary name - # with the compiler version. - string(REGEX MATCH "^[0-9]+" GCC_VERSION "${CMAKE_${LANG}_COMPILER_VERSION}") - - find_program(GCOV_BIN NAMES gcov-${GCC_VERSION} gcov HINTS ${COMPILER_PATH}) - - elseif("${CMAKE_${LANG}_COMPILER_ID}" MATCHES "^(Apple)?Clang$") - # Some distributions like Debian ship llvm-cov with the compiler version - # appended as llvm-cov-x.y. To find this binary we'll build the suggested binary - # name with the compiler version. - string(REGEX MATCH "^[0-9]+.[0-9]+" LLVM_VERSION - "${CMAKE_${LANG}_COMPILER_VERSION}" - ) - - # llvm-cov prior version 3.5 seems to be not working with coverage evaluation - # tools, but these versions are compatible with the gcc gcov tool. - if(LLVM_VERSION VERSION_GREATER 3.4) - find_program( - LLVM_COV_BIN NAMES "llvm-cov-${LLVM_VERSION}" "llvm-cov" - HINTS ${COMPILER_PATH} - ) - mark_as_advanced(LLVM_COV_BIN) - - if(LLVM_COV_BIN) - find_program( - LLVM_COV_WRAPPER "llvm-cov-wrapper" PATHS ${CMAKE_MODULE_PATH} - ) - if(LLVM_COV_WRAPPER) - set(GCOV_BIN "${LLVM_COV_WRAPPER}" CACHE FILEPATH "") - - # set additional parameters - set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV - "LLVM_COV_BIN=${LLVM_COV_BIN}" - CACHE STRING "Environment variables for llvm-cov-wrapper." - ) - mark_as_advanced(GCOV_${CMAKE_${LANG}_COMPILER_ID}_ENV) - endif() - endif() - endif() - - if(NOT GCOV_BIN) - # Fall back to gcov binary if llvm-cov was not found or is incompatible. - # This is the default on OSX, but may crash on recent Linux versions. - find_program(GCOV_BIN gcov HINTS ${COMPILER_PATH}) - endif() - endif() - - if(GCOV_BIN) - set(GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN "${GCOV_BIN}" - CACHE STRING "${LANG} gcov binary." - ) - - if(NOT CMAKE_REQUIRED_QUIET) - message( - "-- Found gcov evaluation for ${LANG}" - "${CMAKE_${LANG}_COMPILER_ID}: ${GCOV_BIN} ${GCOV_${CMAKE_${LANG}_COMPILER_ID}_BIN}" - ) - endif() - set(GCOV_BIN_FOR_LCOV ${GCOV_BIN} CACHE STRING "save gcov bin for lcov") - unset(GCOV_BIN CACHE) - endif() - endif() - endforeach() - - if(NOT LCOV_BIN AND NOT GCOV_BIN_FOR_LCOV) - message( - FATAL_ERROR - "lcov binary not found, while asking for coverage computation (RADIUM_ENABLE_COVERAGE=${RADIUM_ENABLE_COVERAGE}). Abort" - ) - endif() - set(RADIUM_ENABLE_TESTING "ON") - set(ENABLE_COVERAGE "ON") - else() - message( - FATAL_ERROR - "[Tests] Coverage requested (RADIUM_ENABLE_COVERAGE), but not available, only supported in DEBUG with GCC (i.e. GNU/Debug). Current configuration is ${CMAKE_CXX_COMPILER_ID}/${CMAKE_BUILD_TYPE}" - ) - endif() -endmacro() - -# might be needed, was needed ... -# https://stackoverflow.com/questions/37434946/how-do-i-iterate-over-all-cmake-targets-programmatically -function(get_all_targets var) - set(targets) - get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR}) - set(${var} ${targets} PARENT_SCOPE) -endfunction() - -macro(get_all_targets_recursive targets dir) - get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES) - foreach(subdir ${subdirectories}) - get_all_targets_recursive(${targets} ${subdir}) - endforeach() - - get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS) - - foreach(target ${current_targets}) - get_target_property(type ${target} TYPE) - if(${type} STREQUAL "EXECUTABLE" OR ${type} STREQUAL "SHARED_LIBRARY") - list(APPEND ${targets} ${target}) - endif() - endforeach() -endmacro() - -macro(setup_coverage_targets ENABLE_COVERAGE LCOV_REMOVES) - if(ENABLE_COVERAGE) - add_custom_target( - lcov_init - COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --initial --capture --directory - ${CMAKE_BINARY_DIR} --output-file ${CMAKE_BINARY_DIR}/init.info - COMMAND - ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --remove ${CMAKE_BINARY_DIR}/init.info - ${LCOV_REMOVES} --output-file ${CMAKE_BINARY_DIR}/init.info - BYPRODUCTS ${CMAKE_BINARY_DIR}/init.info - ) - add_custom_target( - lcov_zerocounter COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --zerocounter - --directory ${CMAKE_BINARY_DIR} - ) - add_custom_target( - lcov_capture - COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --capture --directory . - --output-file ${CMAKE_BINARY_DIR}/coverage.info - COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --remove coverage.info - ${LCOV_REMOVES} --output-file ${CMAKE_BINARY_DIR}/coverage.info - COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} -a ${CMAKE_BINARY_DIR}/init.info -a - ${CMAKE_BINARY_DIR}/coverage.info -o ${CMAKE_BINARY_DIR}/total.info - BYPRODUCTS ${CMAKE_BINARY_DIR}/total.info - ) - add_custom_target( - lcov_list COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --list - ${CMAKE_BINARY_DIR}/total.info - ) - add_custom_target( - coverage_lcov - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all --parallel - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target lcov_init --parallel - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target lcov_zerocounter - --parallel - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target check --parallel - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target lcov_capture --parallel - ) - add_custom_target( - lcov_remove COMMAND ${LCOV_BIN} --gcov-tool ${GCOV_BIN_FOR_LCOV} --remove coverage.info - ${LCOV_REMOVES} --output-file ${CMAKE_BINARY_DIR}/coverage.info - ) - - find_program(GENHTML_BIN genhtml) - if(GENHTML_BIN) - add_custom_target( - coverage_report COMMAND ${GENHTML_BIN} -o ${CMAKE_BINARY_DIR}/lcov total.info - ) - endif() - endif() -endmacro() diff --git a/cmake/ExternalInclude.cmake b/cmake/ExternalInclude.cmake index 7df2601dd39..712d83881f5 100644 --- a/cmake/ExternalInclude.cmake +++ b/cmake/ExternalInclude.cmake @@ -1,17 +1,4 @@ #set the compile definition for current directory (i.e. externals) -if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") - string(REGEX REPLACE "/W[0-4]" "/W4" EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - else() - set(EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") - endif() -else() - set(EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") -endif() - -# if we are in a radium process, use radium specific option, else use cmake option. -set(EXTERNAL_INSTALL_MESSAGE ${CMAKE_INSTALL_MESSAGE}) - set(RADIUM_EXTERNAL_CMAKE_OPTIONS -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} -DCMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED} @@ -21,10 +8,6 @@ set(RADIUM_EXTERNAL_CMAKE_OPTIONS -DCMAKE_INSTALL_MESSAGE=${EXTERNAL_INSTALL_MESSAGE} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_CXX_FLAGS=${EXTERNAL_CMAKE_CXX_FLAGS} - -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} - -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} - -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} @@ -32,6 +15,28 @@ set(RADIUM_EXTERNAL_CMAKE_OPTIONS -DCMAKE_MACOSX_RPATH=TRUE --no-warn-unused-cli ) +if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif() + set(RADIUM_EXTERNAL_CMAKE_OPTIONS ${RADIUM_EXTERNAL_CMAKE_OPTIONS} + -DCMAKE_CXX_FLAGS=${EXTERNAL_CMAKE_CXX_FLAGS} + ) +else() + set(EXTERNAL_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") + set(RADIUM_EXTERNAL_CMAKE_OPTIONS + ${RADIUM_EXTERNAL_CMAKE_OPTIONS} + -DCMAKE_CXX_FLAGS=${EXTERNAL_CMAKE_CXX_FLAGS} + -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} + -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} + -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO} + ) +endif() + +# if we are in a radium process, use radium specific option, else use cmake option. +set(EXTERNAL_INSTALL_MESSAGE ${CMAKE_INSTALL_MESSAGE}) # First message formating function, need other to have better consistency macro(status_message MODULE NAME VAR) diff --git a/cmake/FindFilesystem.cmake b/cmake/FindFilesystem.cmake index ce8aeaa2bb3..2fd8fc39dbf 100644 --- a/cmake/FindFilesystem.cmake +++ b/cmake/FindFilesystem.cmake @@ -101,7 +101,7 @@ if(TARGET std::filesystem) return() endif() -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) include(CMakePushCheckState) include(CheckIncludeFileCXX) diff --git a/cmake/MessageFunc.cmake b/cmake/MessageFunc.cmake deleted file mode 100644 index abea7f94628..00000000000 --- a/cmake/MessageFunc.cmake +++ /dev/null @@ -1,113 +0,0 @@ -# these functions are to print nice messages in some boxes ... - -# you can control the output width with the DISPLAY_WIDTH var which as a default value set to -# set(DISPLAY_WIDTH 80) - -# ~~~ -# For instance -# -# message_title(" Example ") -# message_info(" Some information") -# message_setting("DISPLAY_WIDTH") -# message_end() -# Outputs -# -# ┌────────────────────────────────┤│ Example │├──────────────────────────────────┐ -# │ Some information │ -# │ DISPLAY_WIDTH 80 │ -# └───────────────────────────────────────────────────────────────────────────────┘ -# -# Or outputs -# -# ┌──┤│ Example │├────┐ -# │ Some information │ -# │ DISPLAY_WIDTH ⏎│ -# │ 20 │ -# └───────────────────┘ -# -# Depending of the DISPLAY_WIDTH value -# ~~~ - -# set default value -if(NOT DEFINED DISPLAY_WIDTH) - set(DISPLAY_WIDTH 80) -endif() - -# message_format used internally -function(message_format TEXT PRE PRE_LEN POST POST_LEN FILL) - set(TEXT_LEN 0) - if(TEXT) - string(LENGTH ${TEXT} TEXT_LEN) - endif() - math(EXPR LEN "${DISPLAY_WIDTH} - ${TEXT_LEN} - ${PRE_LEN} - ${POST_LEN}") - set(FILL1 "") - if(LEN LESS 0) - math(EXPR SUBLEN "${DISPLAY_WIDTH} - ${PRE_LEN} - ${POST_LEN}-1") - string(SUBSTRING ${TEXT} 0 ${SUBLEN} STRING1) - math(EXPR PL2 "${POST_LEN}+1") - message_format(${STRING1} ${PRE} ${PRE_LEN} "⏎${POST}" ${PL2} ${FILL}) - string(SUBSTRING ${TEXT} ${SUBLEN} -1 STRING2) - message_format(${STRING2} ${PRE} ${PRE_LEN} ${POST} ${POST_LEN} ${FILL}) - else() - foreach(i RANGE ${LEN}) - set(FILL1 "${FILL1}${FILL}") - endforeach() - - message(NOTICE "${PRE}${TEXT}${FILL1}${POST}") - endif() -endfunction() - -function(message_info INFO) - set(PRE "│ ") - set(PRE_LEN 2) - set(POST "│") - set(POST_LEN 1) - message_format(${INFO} ${PRE} ${PRE_LEN} ${POST} ${POST_LEN} " ") -endfunction() - -function(message_setting OPTION) - set(PRE "│ ") - set(PRE_LEN 2) - set(POST "│") - set(POST_LEN 1) - - string(LENGTH ${OPTION} len) - math(EXPR len "30-${len}") - set(FILL "") - foreach(i RANGE ${len}) - set(FILL "${FILL} ") - endforeach() - - if(DEFINED ${OPTION}) - set(MSG "${OPTION}${FILL}${${OPTION}}") - else() - set(MSG "${OPTION}${FILL}[undef]") - endif() - message_format(${MSG} ${PRE} ${PRE_LEN} ${POST} ${POST_LEN} " ") -endfunction() - -function(message_title TITLE) - string(LENGTH ${TITLE} len) - math(EXPR len "${DISPLAY_WIDTH}-6-${len}") - math(EXPR len1 "${len}/2") - math(EXPR len1 "${len1}-1") - math(EXPR len2 "${len}-${len1}-1") - set(FILL1 "") - foreach(i RANGE ${len1}) - set(FILL1 "${FILL1}─") - endforeach() - set(FILL2 "") - - foreach(i RANGE ${len2}) - set(FILL2 "${FILL2}─") - endforeach() - message(NOTICE "┌${FILL1}┤│${TITLE}│├${FILL2}┐") -endfunction() - -function(message_end) - set(PRE "└") - set(PRE_LEN 1) - set(POST "┘") - set(POST_LEN 1) - message_format("" ${PRE} ${PRE_LEN} ${POST} ${POST_LEN} "─") -endfunction() diff --git a/cmake/QtFunctions.cmake b/cmake/QtFunctions.cmake index 661cf4f16c3..09d5aa7c17f 100644 --- a/cmake/QtFunctions.cmake +++ b/cmake/QtFunctions.cmake @@ -1,14 +1,13 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) -# Find Qt5 or Qt6 packages Parameters: COMPONENTS : optional parameter listing the -# Qt packages (e.g. Core, Widgets REQUIRED: optional parameter propagated to find_package +# Find Qt6 packages Parameters: COMPONENTS : optional parameter listing the Qt +# packages (e.g. Core, Widgets REQUIRED: optional parameter propagated to find_package # # Usage: find_qt_package(COMPONENTS Core Widgets OpenGL Xml REQUIRED) which is equivalent to: -# find_package(Qt6 COMPONENTS Core Widgets OpenGL Xml REQUIRED) if Qt6 is available, or: -# find_package(Qt5 COMPONENTS Core Widgets OpenGL Xml REQUIRED) otherwise. +# find_package(Qt6 COMPONENTS Core Widgets OpenGL Xml REQUIRED) # -# Qt5 and Qt6 can be retrieved using versionless targets introduced in Qt5.15: # https://doc.qt.io/qt-6/cmake-qt5-and-qt6-compatibility.html#versionless-targets + macro(find_qt_package) set(options REQUIRED) set(oneValueArgs "") @@ -26,16 +25,8 @@ macro(find_qt_package) set(QT_SEARCH_MODE QUIET) endif() - if(QT_DEFAULT_MAJOR_VERSION STREQUAL "6") - find_package(Qt6 COMPONENTS ${MY_OPTIONS_COMPONENTS} ${QT_SEARCH_MODE}) - elseif(QT_DEFAULT_MAJOR_VERSION STREQUAL "5") - find_package(Qt5 5.15 COMPONENTS ${MY_OPTIONS_COMPONENTS} ${QT_SEARCH_MODE}) - else() # QT_DEFAULT_MMAJOR_VERSION not set, first search 6, then 5. - find_package(Qt6 COMPONENTS ${MY_OPTIONS_COMPONENTS} QUIET) - if(NOT Qt6_FOUND) - find_package(Qt5 5.15 COMPONENTS ${MY_OPTIONS_COMPONENTS} ${QT_SEARCH_MODE}) - endif() - endif() + find_package(Qt6 COMPONENTS ${MY_OPTIONS_COMPONENTS} ${QT_SEARCH_MODE}) + endmacro() # see find_qt_package diff --git a/cmake/RadiumSetupFunctions.cmake b/cmake/RadiumSetupFunctions.cmake index d9e75ae7f41..9c4c861422e 100644 --- a/cmake/RadiumSetupFunctions.cmake +++ b/cmake/RadiumSetupFunctions.cmake @@ -6,7 +6,7 @@ # Minimum version: 3.16: install target from different directory see # https://github.com/STORM-IRIT/Radium-Engine/pull/550#issuecomment-637415860 -cmake_minimum_required(VERSION 3.16 FATAL_ERROR) +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) if(MSVC OR MSVC_IDE OR MINGW) include(${CMAKE_CURRENT_LIST_DIR}/Windeployqt.cmake) diff --git a/cmake/Sanitizers.cmake b/cmake/Sanitizers.cmake index 610d0eb0e94..68303d41721 100644 --- a/cmake/Sanitizers.cmake +++ b/cmake/Sanitizers.cmake @@ -1,4 +1,4 @@ -list(APPEND CMAKE_MESSAGE_INDENT "[Sanitizers] ") +message_prefix_push("Sanitizers") # ------------------------------------------------------------------------------ # Clang and gcc sanitizers if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") @@ -36,4 +36,4 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL endif() endif() -list(REMOVE_AT CMAKE_MESSAGE_INDENT -1) +message_prefix_pop() diff --git a/cmake/Windeployqt.cmake b/cmake/Windeployqt.cmake index d6ed37193c0..34df7c222e1 100644 --- a/cmake/Windeployqt.cmake +++ b/cmake/Windeployqt.cmake @@ -40,9 +40,6 @@ endif() function(windeployqt target directory) set(QT_OPTIONS "") - if(Qt5_FOUND) - set(QT_OPTIONS ${QT_OPTIONS} --no-angle) - endif() set(QT_BUILD_TYPE_OPTION --release) if(CMAKE_BUILD_TYPE MATCHES Debug) diff --git a/cmake/cmake-message-helpers b/cmake/cmake-message-helpers new file mode 160000 index 00000000000..4b695812e62 --- /dev/null +++ b/cmake/cmake-message-helpers @@ -0,0 +1 @@ +Subproject commit 4b695812e6263b7130baabf114b8737a2ea59f38 diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 7932340578f..18348fdebf8 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,60 +1,34 @@ -# This CMake file will add doc target for convenient documentation generation. -# -# Additional features are supported: -# * dot = for automatically generated UML diagrams (class, include, caller, call, collaboration) -# * PlantUML = for easy generation of custom diagrams +# inspiration https://github.com/kracejic/EmptyDoxygenCMake/blob/master/CMakeLists.txt -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) project(radium-doc) if(POLICY CMP0077) cmake_policy(SET CMP0077 NEW) endif() -# Helper functions -list(APPEND CMAKE_MESSAGE_INDENT "[Doc] ") -macro(path_linux_to_win MsysPath ResultingPath) - string(REGEX REPLACE "^/([a-zA-Z])/" "\\1:/" ${ResultingPath} "${MsysPath}") -endmacro() -macro(path_win_to_linux MsysPath ResultingPath) - string(REGEX REPLACE "^([a-zA-Z]):/" "/\\1/" ${ResultingPath} "${MsysPath}") -endmacro() +include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/cmake-message-helpers/MessageHelpers.cmake) +message_prefix_push("Doc") # enable if doxygen found -find_package(Doxygen 1.8.0) -message(STATUS "Can build doc? ${DOXYGEN_FOUND}") +find_package(Doxygen 1.8 OPTIONAL_COMPONENTS dot) + +message(NOTICE "") +message_title(" documentation ${PROJECT_NAME} ") +message_info("Can build doc? ${DOXYGEN_FOUND}") + if(DOXYGEN_FOUND) # Search for plantUML for creating UML diagrams from doxygen - find_program( - PLANT_UML_PATH NAMES plantuml.jar plantuml PATH_SUFFIXES PlantUML plantuml Plantuml - PATHS /usr/share /usr/local/share/ /usr/local/bin /opt/local/bin c/Program\ Files* + get_target_property(DOT_IMPORTED Doxygen::dot "IMPORTED") + message_setting("DOT_IMPORTED") + find_file(PLANT_UML_PATH NAMES plantuml.jar plantuml PATH_SUFFIXES PlantUML plantuml Plantuml + PATHS /usr/share /usr/local/share/ /usr/local/bin /opt/local/bin c/Program\ Files* ) - if(NOT PLANT_UML_PATH) - message( - WARNING - "Looking for PlantUML - not found, some UML diagrams will not be generated via doxygen." - ) - else() - message(STATUS " + PlantUML - for custom UML YES ") - endif() - - # Search for DOT for autogenerated UML diagrams from doxygen - find_program(DOT_PATH dot PATH_SUFFIXES graphviz2.38/bin graphviz/bin) - if(NOT DOT_PATH) - message( - WARNING - "Looking for DOT (Graphviz) - not found, some UML diagrams will not be generated via doxygen." - ) - else() - message(STATUS " + Graphviz/Dot - for generated graphs YES ") + message_setting("PLANT_UML_PATH") + if(PLANT_UML_PATH) + set(DOXYGEN_PLANTUML_JAR_PATH "${PLANT_UML_PATH}") endif() - path_win_to_linux(${CMAKE_CURRENT_SOURCE_DIR} CMAKE_CURRENT_SOURCE_DIR_LINUX) - path_win_to_linux(${PROJECT_SOURCE_DIR} PROJECT_SOURCE_DIR_LINUX) - path_win_to_linux(${DOT_PATH} DOT_PATH_LINUX) - path_win_to_linux(${PLANT_UML_PATH} PLANT_UML_PATH_LINUX) - path_win_to_linux(${CMAKE_CURRENT_BINARY_DIR} CMAKE_CURRENT_BINARY_DIR_LINUX) - # configure doxygen target set(RADIUM_DOC_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/) set(RADIUM_MAIN_DOC_FILE ${CMAKE_CURRENT_SOURCE_DIR}/main.md) @@ -84,7 +58,7 @@ if(DOXYGEN_FOUND) set(RADIUM_DOXYGEN_AWESOME_CSS "") endif() endif() - message(STATUS "Use Doxygen Awesome CSS? ${USE_AWESOME_CSS}") + message_setting("USE_AWESOME_CSS") # set RADIUM_PROJECT_NUMBER from VERSION file file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/../VERSION" INPUT_Radium_VERSION) @@ -99,35 +73,60 @@ if(DOXYGEN_FOUND) "${CMAKE_CURRENT_SOURCE_DIR}/LICENSES.md" ) - set(DOXYGEN_PROJECT_NAME "Radium Engine") - set(DOXYGEN_PROJECT_NUMBER "${RADIUM_PROJECT_NUMBER}") - set(DOXYGEN_PROJECT_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/images/radium-logo.png") - set(DOXYGEN_EXTENSION_MAPPING "dox=C++" "inl=C++") + set(DOXYGEN_ALIASES [[complexity="@par Complexity:^^"]]) set(DOXYGEN_BUILTIN_STL_SUPPORT "YES") - set(DOXYGEN_EXTRACT_ALL "NO") - set(DOXYGEN_EXTRACT_STATIC "YES") - set(DOXYGEN_SHOW_GROUPED_MEMB_INC "YES") - set(DOXYGEN_FORCE_LOCAL_INCLUDES "NO") - set(DOXYGEN_RECURSIVE "YES") - set(DOXYGEN_STRIP_FROM_INC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../src") + set(DOXYGEN_CALL_GRAPH "YES") + set(DOXYGEN_COLS_IN_ALPHA_INDEX "2") + set(DOXYGEN_DOCSET_BUNDLE_ID "com.storm-irit.RadiumEngine") + set(DOXYGEN_DOCSET_PUBLISHER_NAME "IRIT") + set(DOXYGEN_DOT_GRAPH_MAX_NODES "60") + set(DOXYGEN_DOT_IMAGE_FORMAT "svg") + set(DOXYGEN_EXAMPLE_RECURSIVE "YES") set(DOXYGEN_EXAMPLE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../tests" "${CMAKE_CURRENT_SOURCE_DIR}/../examples/" "${CMAKE_CURRENT_SOURCE_DIR}/../src" ) set(DOXYGEN_EXAMPLE_PATTERNS "*.cpp" "*.h" "*.cu") - set(DOXYGEN_EXAMPLE_RECURSIVE "YES") set(DOXYGEN_EXCLUDE_PATTERNS "*/src/Headless/CLI/*") - set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${RADIUM_MAIN_DOC_FILE}") - set(DOXYGEN_SOURCE_BROWSER "YES") - set(DOXYGEN_REFERENCES_LINK_SOURCE "NO") - set(DOXYGEN_COLS_IN_ALPHA_INDEX "2") - set(DOXYGEN_HTML_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/header.html") - set(DOXYGEN_HTML_COLORSTYLE_HUE "40") - set(DOXYGEN_HTML_COLORSTYLE_SAT "50") - set(DOXYGEN_HTML_COLORSTYLE_GAMMA "160") - set(DOXYGEN_HTML_TIMESTAMP "YES") + set(DOXYGEN_EXPAND_ONLY_PREDEF "YES") + set(DOXYGEN_EXTENSION_MAPPING "dox=C++" "inl=C++") + set(DOXYGEN_EXTRACT_ALL "NO") + set(DOXYGEN_EXTRACT_STATIC "YES") + set(DOXYGEN_EXT_LINKS_IN_WINDOW "YES") + set(DOXYGEN_HIDE_UNDOC_CLASSES "YES") + set(DOXYGEN_HIDE_UNDOC_RELATIONS "NO") + set(DOXYGEN_HTML_COLORSTYLE "LIGHT") + set(DOXYGEN_HTML_COPY_CLIPBOARD "NO") set(DOXYGEN_HTML_DYNAMIC_SECTIONS "YES") + set(DOXYGEN_HTML_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/header.html") + set(DOXYGEN_IMAGE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/images") + set(DOXYGEN_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../src") + set(DOXYGEN_INTERACTIVE_SVG "YES") + set(DOXYGEN_MACRO_EXPANSION "YES") + set(DOXYGEN_MATHJAX_EXTENSIONS "TeX/AMSsymbols" "TeX/AMSmath") + set(DOXYGEN_MATHJAX_RELPATH "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/") + set(DOXYGEN_PREDEFINED "PARSED_BY_DOXYGEN MULTIARCH= ") + set(DOXYGEN_PROJECT_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/images/radium-logo.webp") + set(DOXYGEN_PROJECT_NAME "Radium Engine") + set(DOXYGEN_PROJECT_NUMBER "${RADIUM_PROJECT_NUMBER}") + set(DOXYGEN_RECURSIVE "YES") + set(DOXYGEN_REFERENCES_LINK_SOURCE "NO") + set(DOXYGEN_SHOW_GROUPED_MEMB_INC "YES") + set(DOXYGEN_SOURCE_BROWSER "YES") + set(DOXYGEN_STRIP_FROM_INC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../src") + set(DOXYGEN_TEMPLATE_RELATIONS "YES") + set(DOXYGEN_TOC_INCLUDE_HEADINGS "2") + set(DOXYGEN_UML_LIMIT_NUM_FIELDS "50") + set(DOXYGEN_UML_LOOK "YES") + set(DOXYGEN_USE_MATHJAX "YES") + set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${RADIUM_MAIN_DOC_FILE}") + set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES) + set(DOXYGEN_WARN_IF_UNDOCUMENTED "NO") + if(USE_AWESOME_CSS) + set(DOXYGEN_GENERATE_TREEVIEW "YES") + set(DOXYGEN_DISABLE_INDEX "NO") + set(DOXYGEN_FULL_SIDEBAR "NO") set(DOXYGEN_HTML_EXTRA_STYLESHEET "${RADIUM_DOXYGEN_AWESOME_CSS}" "${RADIUM_DOXYGEN_AWESOME_CSS_ROOT}/doxygen-awesome-sidebar-only.css" @@ -140,43 +139,23 @@ if(DOXYGEN_FOUND) "${RADIUM_DOXYGEN_AWESOME_CSS_ROOT}/doxygen-awesome-paragraph-link.js" ) endif() - set(DOXYGEN_HIDE_UNDOC_CLASSES "YES") - - set(DOXYGEN_DOCSET_BUNDLE_ID "com.storm-irit.RadiumEngine") - set(DOXYGEN_DOCSET_PUBLISHER_NAME "IRIT") - set(DOXYGEN_GENERATE_TREEVIEW "YES") - set(DOXYGEN_EXT_LINKS_IN_WINDOW "YES") - set(DOXYGEN_USE_MATHJAX "YES") - set(DOXYGEN_MATHJAX_RELPATH "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/") - set(DOXYGEN_MATHJAX_EXTENSIONS "TeX/AMSsymbols" "TeX/AMSmath") - set(DOXYGEN_MACRO_EXPANSION "YES") - set(DOXYGEN_EXPAND_ONLY_PREDEF "YES") - set(DOXYGEN_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../src") - set(DOXYGEN_PREDEFINED "PARSED_BY_DOXYGEN MULTIARCH= ") - set(DOXYGEN_HIDE_UNDOC_RELATIONS "NO") - set(DOXYGEN_HAVE_DOT "YES") - set(DOXYGEN_UML_LOOK "YES") - set(DOXYGEN_UML_LIMIT_NUM_FIELDS "50") - set(DOXYGEN_TEMPLATE_RELATIONS "YES") - set(DOXYGEN_CALL_GRAPH "YES") - set(DOXYGEN_DOT_IMAGE_FORMAT "svg") - set(DOXYGEN_INTERACTIVE_SVG "YES") - set(DOXYGEN_TOC_INCLUDE_HEADINGS "2") - set(DOXYGEN_IMAGE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/images") - set(DOXYGEN_DOT_GRAPH_MAX_NODES "60") - set(DOXYGEN_ALIASES [[complexity="@par Complexity:^^"]]) - set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES) + # resolve std to cpp ref + # https://upload.cppreference.com/mwiki/images/f/f8/cppreference-doxygen-web.tag.xml + set(DOXYGEN_TAGFILES + "${CMAKE_CURRENT_SOURCE_DIR}/cppreference-doxygen-web.tag.xml=http://en.cppreference.com/w/" + ) doxygen_add_docs( RadiumDoc ${md_pages_order} ${md_files} ${CMAKE_CURRENT_SOURCE_DIR}/../src/ ${CURRENT_SRC_DIR} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generating API documentation with Doxygen" ) - # Where docs will be installed. if(RADIUM_INSTALL_DOC) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html TYPE DOC OPTIONAL) endif() endif() +message_end() +message(NOTICE "") -list(REMOVE_AT CMAKE_MESSAGE_INDENT -1) +message_prefix_pop() diff --git a/doc/LICENSES.md b/doc/LICENSES.md index 169b90d0ca1..bb5027b3477 100644 --- a/doc/LICENSES.md +++ b/doc/LICENSES.md @@ -13,7 +13,7 @@ Radium Engine © the Radium Contributors : * Hugo Rens (imgui and shader editor) * Valentin Roussellet (core engine, animation and skinning plugins, Windows port) * Thomas Subileau (spatial data structures) -* David Vanderhaeghe (core, engine, gui, rendering) +* David Vanderhaeghe (core, engine, gui, rendering, logo and graphics) * Florian Canezin (core, engine, gui, plugins, file loading) # Third-party libraries @@ -61,7 +61,3 @@ be obtained at [https://github.com/assimp/assimp/blob/master/LICENSE](https://gi STB image is a header-only library, released in the public domain. The source code is included in this repository or can be obtained at [https://github.com/nothings/stb](https://github.com/nothings/stb) - -## Additional material - -X-ray Icon, made by *Freepik* from www.flaticon.com is licensed under CC BY 3.0 diff --git a/doc/basics.md b/doc/basics.md index 202e8150078..524e49fc523 100644 --- a/doc/basics.md +++ b/doc/basics.md @@ -3,7 +3,65 @@ This part of the documentation describes how to compile Radium and use it in your own project. -TL;DR; command line version. +## Supported system and compilers + +The following platforms and tool chains have been tested and should work : + +* CMake 3.18+ +* *Windows* : IDEs: Visual Studio 2019, 2022 (2017 is not supported due to embedded cmake version), QtCreator. Command Line: cmake+ninja+MSVC(2017, 2019, 2022) . +* *Mac OSX* : gcc 10 or higher, Apple clang, llvm clang 11 or higher +* *Linux* : gcc 8 or higher, clang + +See also our Continuous Integration system at . + +## System wide dependencies + +Radium expects the following dependencies to be available during compilation. + +* [Engine] + * OpenGL 4.1+ / GLSL 410+ +* [Gui] + * Qt Core/Widgets/OpenGL 5.15 or 6.2+ +* [Headless] One, or both of + * EGL + * glfw 3.3 + +## External dependencies (included with radium) + +These dependencies are shipped with radium, fetching external git sources. + + +* [IO] + * assimp: https://github.com/assimp/assimp.git, [tags/v5.0.1], + * with options `-DASSIMP_BUILD_ASSIMP_TOOLS=False -DASSIMP_BUILD_SAMPLES=False -DASSIMP_BUILD_TESTS=False -DIGNORE_GIT_HASH=True -DASSIMP_NO_EXPORT=True` + * tinyply: https://github.com/ddiakopoulos/tinyply.git, [tags/2.3.2], + * with options `-DSHARED_LIB=TRUE` +* [Gui] + * PowerSlider: https://github.com/dlyr/PowerSlider.git, [origin/master], + * with options `-DBUILD_DESIGNER_PLUGIN=OFF -DBUILD_EXAMPLE_APP=OFF` +* [Engine] + * glm: https://github.com/g-truc/glm.git, [cc98465e3508535ba8c7f6208df934c156a018dc], + * with options `-DGLM_TEST_ENABLE=OFF -DBUILD_STATIC_LIBS=OFF -DCMAKE_INSTALL_PREFIX=` + * glbinding: https://github.com/cginternals/glbinding.git, [758d33b4d4f1815d46d91fcf4ca4914d837267fa], + * with options `-DOPTION_BUILD_TESTS=OFF -DOPTION_BUILD_DOCS=OFF -DOPTION_BUILD_TOOLS=OFF -DOPTION_BUILD_EXAMPLES=OFF -DOPTION_BUILD_OWN_KHR_HEADERS=ON -DCMAKE_INSTALL_PREFIX=` + * globjects: https://github.com/cginternals/globjects.git, [4363356ae2ef5c936ab078fba48d1ea507c295c4], + * with options `-DOPTION_BUILD_DOCS=OFF -DOPTION_BUILD_EXAMPLES=OFF -DOPTION_USE_EIGEN=ON -Dglbinding_DIR=${glbinding_DIR} -Dglm_DIR=${glm_DIR} -DEigen3_DIR=${Eigen3_DIR} -DCMAKE_INSTALL_PREFIX=` + * stb: https://github.com/nothings/stb.git, [1034f5e5c4809ea0a7f4387e0cd37c5184de3cdd], + * with options `None` + * tinyEXR: https://github.com/MathiasPaulin/tinyexr.git, [origin/radium], + * with options `-DBUILD_INSTALLABLE_LIB=ON` +* [Core] + * Eigen3: https://gitlab.com/libeigen/eigen.git, [tags/3.4.0], + * with options `-DEIGEN_TEST_CXX11=OFF -DBUILD_TESTING=OFF -DEIGEN_BUILD_DOC=OFF` + * OpenMesh: https://www.graphics.rwth-aachen.de:9000/OpenMesh/OpenMesh.git, [tags/OpenMesh-8.1], + * with options `-DBUILD_APPS=OFF` + * cpplocate: https://github.com/cginternals/cpplocate.git, [tags/v2.2.0], + * with options `-DOPTION_BUILD_TESTS=OFF -DOPTION_BUILD_DOCS=OFF -DCMAKE_INSTALL_PREFIX=` + * nlohmann_json: https://github.com/nlohmann/json.git, [tags/v3.10.5], + * with options `-DJSON_Install=ON -DJSON_BuildTests=OFF` + + +## TL;DR; command line version ```bash git clone --recurse-submodules https://github.com/STORM-IRIT/Radium-Engine.git @@ -30,7 +88,8 @@ default Radium-Engine install prefix is `Radium-Engine/Bundle-${CMAKE_CXX_COMPIL More details and other systems information (including visual studio setup) are in the following pages, to be read in order. -* \subpage dependenciesmanagement : Fetch and compile dependencies -* \subpage basicsCompileRadium : Compile and install Radium +* \subpage basicsCompileVs +* \subpage basicsCompileCommand * \subpage basicsRadiumSubmodule : Link to Radium using cmake package +* \subpage basicsCompileRadiumDetails * \subpage basicsTroubleshooting : Handle usual errors diff --git a/doc/basics/commandline.md b/doc/basics/commandline.md new file mode 100644 index 00000000000..36084a428f3 --- /dev/null +++ b/doc/basics/commandline.md @@ -0,0 +1,45 @@ +\page basicsCompileCommand Commandline Compilation Instructions (Linux, macos...) + +# Building and installing Radium dependencies once for all {#builddep} + +We provide a standalone cmake project (`Radium-Engine/external/CMakeLists.txt`) to compile and install the Radium dependencies at any location. + +## Configuration and compilation of the dependencies + +For command line, tested on Linux and mac OS, **for windows might need more configuration options**. + +External dependencies have to be installed outside Radium-Engine source tree. + +~~~{.bash} +# from wherever you want outside radium source tree +# in release +cmake -S Radium-Engine/external -B builds/radium-external-build-r -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=installs/radium-external-r +cmake --build builds/radium-external-build-r --config Release --parallel + +# in debug +cmake -S Radium-Engine/external -B builds/radium-external-build-d -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=installs/radium-external-d +cmake --build builds/radium-external-build-d --config Debug --parallel +~~~ + +If not given on the command line, the installation directory is set by default to `Radium-Engine/{CMAKE_CURRENT_BINARY_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}` for `CMAKE_BUILD_TYPE=Release`, and `Radium-Engine/{CMAKE_CURRENT_BINARY_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}-${CMAKE_BUILD_TYPE}` for any other `CMAKE_BUILD_TYPE`. + +## Command line instructions (linux, macos, windows) + +For command line, tested on Linux and mac OS, **for windows might need more configuration options**. + +Follow the usual sequence, assuming you have build dependencies as explained [here](\ref builddep): + +~~~{.bash} +cmake -S Radium-Engine -B builds/radium-build-r -DCMAKE_BUILD_TYPE=Release -C installs/radium-external-r/radium-options.cmake +cmake --build builds/radium-build-r --config Release --parallel -DQt6_DIR=path/to/qt6 +cmake --install builds/radium-build-r +~~~ + +### Qt configuration {#commandline_qt_configuration} + +If Qt is installed system wide (likely on linux), `-DQt6_DIR` is not needed. + +To ease maintenance accross Qt versions, you should also configure the path to Qt cmake package using `-DCMAKE_PREFIX_PATH=path/to/qt6`. + +\note Running `cmake --install` is recommended as it will copy all the radium related library in the same place, +generate the cmake packages and bundle applications with their dependencies (on macos and windows). diff --git a/doc/basics/compilation.md b/doc/basics/compilation.md deleted file mode 100644 index 858b5cb555f..00000000000 --- a/doc/basics/compilation.md +++ /dev/null @@ -1,304 +0,0 @@ -\page basicsCompileRadium Radium Compilation instructions -[TOC] - -# Supported compiler and platforms - -The following platforms and tool chains have been tested and should work : - -* *Windows* : IDEs: Visual Studio 2019, 2022 (2017 is not supported due to embedded cmake version), QtCreator. Command Line: cmake+ninja+MSVC(2017, 2019, 2022) . -* *Mac OSX* : gcc 10 or higher, Apple clang -* *Linux* : gcc 8 or higher, clang - -See also our Continuous Integration system at . - -Minimal requirements - -* OpenGL 4.1+ / GLSL 410+ -* CMake 3.16+ -* Qt5 (minimal version 5.15) or Qt6 (experimental) - -# Build instructions - -If not already done, follow instructions at \ref dependenciesmanagement. - -Radium follows a standard cmake structure, so any IDE supporting cmake should be able to configure and build it. - -Several targets allowing to build or install only a specific part of Radium-Engine are defined by the cmake configuration. -The standard targets `all` and `install` are also available as a shortcut to build all the configured components and to install the main components. - -\note We strongly recommend to have dedicated build and install directories for each build type (Release, Debug). -Remember that compiling Radium in Debug mode needs to have the dependencies compiled and installed in Debug mode -(due to a limitation in assimp). - -## Folder structure - -Radium-Engine relies on CMake build-chain on all supported platforms. -In most cases, building should be pretty straightforward, provided that cmake can locate the dependencies. - -### Installation directory - -By default, `${CMAKE_INSTALL_PREFIX}` is set as follow: - -* For release build : - -~~~{.cmake} - set(RADIUM_BUNDLE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}) -~~~ - -* For Debug or RelWithDebInfo build - -~~~{.cmake} - set(RADIUM_BUNDLE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}-${CMAKE_BUILD_TYPE}) -~~~ - -It has the following structure - -~~~{.txt} -Bundle-* - - bin/ include/ lib/ LICENSE README.md Resources/ -~~~ - -### Configure build options - -Radium offers the following build options: - -~~~{.bash} -// Enable coverage, gcc only. Experimental, need ENABLE_TESTING -RADIUM_ENABLE_COVERAGE:BOOL=OFF - -// Enable examples app build. To install examples, build explicitly the target Install_RadiumExamples. -RADIUM_ENABLE_EXAMPLES:BOOL=OFF - -// Enable precompiled headers. -RADIUM_ENABLE_PCH:BOOL=OFF - -// Enable testing. Tests are automatically built with target all, run with target check or test. -RADIUM_ENABLE_TESTING:BOOL=ON - -// Enable testing of OpenGL functionalities. Option only available if RADIUM_ENABLE_TESTING is ON. -RADIUM_ENABLE_GL_TESTING:BOOL=OFF - -// Include Radium::Core in CMake project. -RADIUM_GENERATE_LIB_CORE:BOOL=ON - -// Include Radium::Engine in CMake project. -RADIUM_GENERATE_LIB_ENGINE:BOOL=ON - -// Include Radium::Gui in CMake project. -RADIUM_GENERATE_LIB_GUI:BOOL=ON - -// Include Radium::Headless in CMake project. -RADIUM_GENERATE_LIB_HEADLESS:BOOL=ON - -// Include Radium::IO in CMake project. -RADIUM_GENERATE_LIB_IO:BOOL=ON - -// Include Radium::PluginBase in CMake project. -RADIUM_GENERATE_LIB_PLUGINBASE:BOOL=ON - -// Install documentation. If RadiumDoc is compiled, install documentation to bundle directory for install target. -RADIUM_INSTALL_DOC:BOOL=ON - -// Provide loaders based on Assimp library -RADIUM_IO_ASSIMP:BOOL=ON - -// Provide deprecated loaders (to be removed without notice) -RADIUM_IO_DEPRECATED:BOOL=ON - -// Provide loaders based on TinyPly library -RADIUM_IO_TINYPLY:BOOL=ON - -// Provide loader for volume pvm file format -RADIUM_IO_VOLUMES:BOOL=ON - -// Disable Radium Log messages -RADIUM_QUIET:BOOL=OFF - -// Update version file each time the project is compiled (update compilation time in version.cpp). -RADIUM_UPDATE_VERSION:BOOL=ON - -// Use double precision for Scalar. -RADIUM_USE_DOUBLE:BOOL=OFF -~~~ - -All radium related cmake options (with their current values) can be printed with `cmake -LAH | grep -B1 RADIUM` (on linux like system) - -\warning For computers with low RAM capacities (under 12G) we recommend to set the `CMAKE_BUILD_PARALLEL_LEVEL` environment variable to a reasonable value (i.e. 2) to prevent the computer from swapping. - -### Precompiled headers - -Radium build can take benefit of precompiled headers. To do so, set `RADIUM_ENABLE_PCH=ON` (OFF by default) at cmake configure time. -Compilation speedup depends on what files you are currently editing, and full compilation is roughly 20% less with precompiled header enabled. - -### Dependencies between libraries - -The options `RADIUM_GENERATE_LIB_XXXX` allows to enable/disable each Radium library. -The dependencies between libraries are set as follow: - -~~~{.cmake} -add_dependencies (${ra_engine_target} PUBLIC Radium::Core) -add_dependencies (${ra_io_target} PUBLIC Radium::Core) -add_dependencies (${ra_pluginbase_target} Radium::Core Radium::Engine) -add_dependencies (${ra_gui_target} PUBLIC Radium::Core Radium::Engine Radium::PluginBase Radium::IO) -~~~ - -\warning Consistency of `RADIUM_GENERATE_LIB_***` options is not checked wrt. the dependencies. - -* When enabled using `RADIUM_GENERATE_LIB_***`, each library has a compilation target: `Core`, `Engine`, ... - -## Command line instructions for building (on windows, mac and linux) - -Out-of source builds are mandatory, we recommend to follow the usual sequence, assuming you have build dependecies as explained [here](@ref builddep): - -~~~{.bash} -cmake -S Radium-Engine -B builds/radium-build-r -DCMAKE_BUILD_TYPE=Release -C installs/radium-external-r/radium-options.cmake -cmake --build builds/radium-build-r --config Release --parallel -DQt5_DIR=path/to/qt5 -cmake --install builds/radium-build-r - -~~~ - -If qt is installed system wide (likely on linux), `-DQt5_DIR` is not needed. - -\note Qt6 is also supported. To enable it, replace `-DQt5_DIR=path/to/qt5` by `-DQt6_DIR=path/to/qt6`. To ease maintenance accross Qt versions, you should also configure the path to Qt cmake package using `-DCMAKE_PREFIX_PATH=path/to/qtX` where `X` is the Qt version you want to use. - -If both Qt5 and Qt6 are installed system wide, Qt6 is the default, `-DQT_DEFAULT_MAJOR_VERSION=5` allow select Qt5. During client application cmake setup `find_package(Radium COMPONENTS ... Gui ...)` will check Qt version consistency. - -\note Running `cmake --install` is recommended as it will copy all the radium related library in the same place, -generate the cmake packages and bundle applications with their dependencies (on macos and windows). - -## Integration with Visual Studio (Microsoft Windows) - -### Supported versions of MSVC - -Radium requires MSVC 2019 or superior, as it relies on: - -* C++11/C++14/C++17 features such as `constexpr`, -* cmake built-in support -* Ninja built-in support - -Our Continuous Integration systems uses Microsoft Compiler 2017, in combination with cmake and ninja. -Using Visual Studio 2017 with cmake support is however not possible: VS is shipped with cmake: 3.12, while Radium requires cmake 3.13 at least. We recommend to use Visual Studio 2019 in that case. -Qt 5.15+ is distributed with binaries precompiled with MSVC 2019, but Qt binaries precompiled with MSVC2017 does not break the build. - -### Qt Dependency - -Use precompiled libraries for VS 2017 or 2019 - 64 bits (minimal version required: 5.14). -You will probably have to manually point cmake to the Qt folder. - -### Getting started with Visual Studio - -Thanks to the integrated support of CMake in Visual Studio, you don't need a VS solution to build your project: open the Radium folder (via *File* > *Open* > *Folder ...* or `devenv.exe `). -VS should run cmake, generate the target builds (Debug and Release by default). -Other build types can be added by editing `CMakeSettings.json`. - -Configure cmake option (see official doc [here](https://docs.microsoft.com/cpp/build/customize-cmake-settings)) -You have to provide path to Qt installation, glfw installation (for headless support) and external dependencies configuration. -In order to execute Radium demos from the buildtree (installing them takes time due to qt deployement procedure), -you also need to define environment variables that point to the various dlls used by Radium components that will be used on the per-target `launch.vs.json` configuration file. -Note that it is recommended to compile or install glfw as a static library, the example below assume that. - -For instance, with directory structure for externals as defined in \ref dependenciesmanagement, the configuration is - -~~~{.json} -{ - "environments": [ - { - "QtDir": "C:/Qt/6.3.0/msvc2019_64/" - "glfwDir" : "C:/path/to/glfwInstallation", - "ExternalInstallDir": "${projectDir}/../radium-externals/install" - } - ], - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}/out/build/${name}", - "installRoot": "${projectDir}/out/install/${name}", - "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=\"${env.QtDir};${env.glfwDir}/lib/cmake\" -C ${projectDir}/../radium-externals/install/${name}/radium-options.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "environments": [ - { - "environment": "RadiumDllsLocations", - "ExternalDllsDIR": "${env.ExternalInstallDir}/${name}/bin;${env.ExternalInstallDir}/${name}/glbinding;${env.ExternalInstallDir}/${name}/globjects", - "QtDllsDIR": "${env.QtDir}/bin", - "RadiumDlls": "${buildRoot}/src/Core;${buildRoot}/src/Engine;${buildRoot}/src/Gui;${buildRoot}/src/Headless;${buildRoot}/src/IO;${buildRoot}/src/PluginBase" - } - ] - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}/out/build/${name}", - "installRoot": "${projectDir}/out/install/${name}", - "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=\"${env.QtDir};${env.glfwDir}/lib/cmake\" -C ${projectDir}/../radium-externals/install/${name}/radium-options.cmake", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "environments": [ - { - "environment": "RadiumDllsLocations", - "ExternalDllsDIR": "${env.ExternalInstallDir}/${name}/bin;${env.ExternalInstallDir}/${name}/glbinding;${env.ExternalInstallDir}/${name}/globjects", - "QtDllsDIR": "${env.QtDir}/bin", - "RadiumDlls": "${buildRoot}/src/Core;${buildRoot}/src/Engine;${buildRoot}/src/Gui;${buildRoot}/src/Headless;${buildRoot}/src/IO;${buildRoot}/src/PluginBase" - } - ] - } - ] -} -~~~ - -\note It is strongly encouraged to use `/` separators in your path, instead of `\\`. See - -\note When compiling the dependencies you may hit the max path length fixed by Microsoft OS (260 characters). To fix this, you might need to change the path of your build dir to shorten it, or to change the limit on your system, see: - -### Compilation - -Right click on `CMakeList.txt > build > all`. - -### Execution of a demo app - -To execute a demo application, select in the `Startup Item` list the target you want to execute. -For instance, `DrawPrimitives.exe (examples/...)`. -Then, select in the menu `/Debug and Launch Settings for DrawPrimmitives` and modify the `launch.vs.json` file that is opened so that it contains the following. - -~~~{.json} -{ - "version": "0.2.1", - "defaults": {}, - "configurations": [ - { - "type": "default", - "project": "CMakeLists.txt", - "projectTarget": "DrawPrimitives.exe (examples\\DrawPrimitives\\DrawPrimitives.exe)", - "name": "DrawPrimitives.exe (examples\\DrawPrimitives\\DrawPrimitives.exe)", - "inheritEnvironments": [ "RadiumDllLocations" ], - "env": { - "PATH": "${env.QtDllsDIR};${env.ExternalDllsDIR};${env.RadiumDlls};${env.PATH}" - } - } - ] -} -~~~ - -For any target you want to execute, the same should be done, i.e. adding the following to the target configuration - -~~~{.json} - "inheritEnvironments": [ "RadiumDllLocations" ], - "env": { - "PATH": "${env.QtDllsDIR};${env.ExternalDllsDIR};${env.RadiumDlls};${env.PATH}" - } -~~~ - -If you plan to execute the 'unittest.exe' target, you should also add the following configuration for the working directory - -~~~{.json} - "currentDir": "${projectDir}/tests/unittest" -~~~ - -### installation - -To install, you need to run any installation target, e.g. `Engine.dll (install)` or to select the menu `/` diff --git a/doc/basics/dependencies.md b/doc/basics/dependencies.md deleted file mode 100644 index ab706eebad4..00000000000 --- a/doc/basics/dependencies.md +++ /dev/null @@ -1,167 +0,0 @@ -\page dependenciesmanagement Radium Dependencies Management -[TOC] - -Radium relies on several external libraries to load files or to represent some data: - -* [Core] Eigen, OpenMesh, nlohmann_json -* [Engine] glm, globjects, glbindings, tinyEXR -* [IO] Assimp -* [Gui] Qt Core, Qt Widgets and Qt OpenGL v5.5+ (5.14 at least, Qt6 support is experimental), PowerSlider -* [doc] Doxygen-awesome-css -* stb_image - -We developed a series of tools to fetch and compile these dependencies easily, except for -Qt, which needs to be installed and passed to cmake through the variables `CMAKE_PREFIX_PATH` or `Qt5_DIR` `Qt6_DIR` -(see documentation at ). - -# Dependencies management systems - -We offer two different systems to handle external dependencies (see details and how-to in the following sections): - - 1. **[recommended]** external build: the user compiles and installs once for all the dependencies using a dedicated - cmake project. Then, Radium cmake project is configured to link with installed dependencies. - 2. manual management: users can also provide their own version of the dependencies through cmake packages. - -\warning Dependencies need to be built with the same build type (ie. Release, Debug) than Radium. - -# Building and installing Radium dependencies once for all {#builddep} - -We provide a standalone cmake project (`Radium-Engine/external/CMakeLists.txt`) to compile and install the Radium dependencies at any location. - -## Configuration and compilation of the dependencies - -External dependencies have to be installed outside Radium-Engine source tree. - -~~~{.bash} -# from wherever you want outside radium source tree -# in release -cmake -S Radium-Engine/external -B builds/radium-external-build-r -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=installs/radium-external-r -cmake --build builds/radium-external-build-r --config Release --parallel - -# in debug -cmake -S Radium-Engine/external -B builds/radium-external-build-d -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=installs/radium-external-d -cmake --build builds/radium-external-build-d --config Debug --parallel -~~~ - -If not given on the command line, the installation directory is set by default to `Radium-Engine/{CMAKE_CURRENT_BINARY_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}` for `CMAKE_BUILD_TYPE=Release`, and `Radium-Engine/{CMAKE_CURRENT_BINARY_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}-${CMAKE_BUILD_TYPE}` for any other `CMAKE_BUILD_TYPE`. - -### Getting started with Visual Studio - -Open `external/CMakeLists.txt` and edit cmake settings or `CMakeSettings.json`. External build and install have to be outside Radium-Engine source directory. For instance - -~~~{.json} -{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}/../../radium-externals/build/${name}", - "installRoot": "${projectDir}/../../radium-externals/install/${name}", - "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:/Qt/6.3.0/msvc2019_64", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "Release", - "buildRoot": "${projectDir}/../../radium-externals/build/${name}", - "installRoot": "${projectDir}/../../radium-externals/install/${name}", - "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:/Qt/6.3.0/msvc2019_64", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] - } - ] -} -~~~ - -## Configuration of Radium - -To compile Radium-Engine, you have to indicate where cmake can find each dependency. - -For convenience, dependencies install procedure create a configuration file, you can use this configuration with the `-C` option of cmake. -The cmake config file `/path/to/installs/radium-external-r/radium-options.cmake` contains, depending on your dependency configuration: - -~~~{.cmake} -set(Eigen3_DIR "/path/to/external/install/share/eigen3/cmake/" CACHE PATH "My Eigen3 location") -set(OpenMesh_DIR "/path/to/external/install/share/OpenMesh/cmake/" CACHE PATH "My OpenMesh location") -set(cpplocate_DIR "/path/to/external/install/share/cpplocate/" CACHE PATH "My cpplocate location") -set(nlohmann_json_DIR "/path/to/external/install/lib/cmake/nlohmann_json/" CACHE PATH "My nlohmann_json location") -set(glm_DIR "/path/to/external/install/glm/lib/cmake/glm/" CACHE PATH "My glm location") -set(glbinding_DIR "/path/to/external/install/glbinding/" CACHE PATH "My glbinding location") -set(globjects_DIR "/path/to/external/install/globjects/" CACHE PATH "My globjects location") -set(stb_DIR "/path/to/external/install/include/stb/" CACHE PATH "My stb location") -set(stb_INCLUDE_DIR "/path/to/external/install/include/" CACHE PATH "My stb_INCLUDE location") -set(tinyEXR_DIR "/path/to/external/install/share/tinyEXR/cmake/" CACHE PATH "My tinyEXR location") -set(assimp_DIR "/path/to/external/install/lib/cmake/assimp-5.0/" CACHE PATH "My assimp location") -set(tinyply_DIR "/path/to/external/install/lib/cmake/tinyply/" CACHE PATH "My tinyply location") -set(PowerSlider_DIR "/path/to/external/install/lib/cmake/PowerSlider/" CACHE PATH "My PowerSlider location") -set(RADIUM_IO_ASSIMP ON CACHE BOOL "Radium uses assimp io") -set(RADIUM_IO_TINYPLY ON CACHE BOOL "Radium uses tinyply io") -~~~ - -When configuring Radium cmake project, don't forget to add this file by calling `cmake -C /path/to/installs/radium-external-r/radium-options.cmake ...` - -You can also provide these variables as cmake command line argument: - -~~~{.bash} -cmake \ --DEigen3_DIR /path/to/external/install/share/eigen3/cmake/ -... and so on ... -~~~ - -# User provided external dependencies - -You can use your own installation of a local dependency instead of letting cmake fetch and compile it. -To this end, just provide the corresponding '*_DIR' to cmake at configuration time as show before (with '-D' option, configuration file or toolchain file, please refer to cmake documentation). - -Currently supported (note that these paths must refer to the installation directory of the corresponding library): - - -* `assimp_DIR` -* `tinyply_DIR` -* `PowerSlider_DIR` -* `glm_DIR` -* `glbinding_DIR` -* `globjects_DIR` -* `stb_DIR` -* `tinyEXR_DIR` -* `Eigen3_DIR` -* `OpenMesh_DIR` -* `cpplocate_DIR` -* `nlohmann_json_DIR` - -Radium is compiled and tested with specific version of dependencies, as given in the external's folder CMakeLists.txt and state here for the record - -* assimp: https://github.com/assimp/assimp.git, [tags/v5.0.1], - * with options `-DASSIMP_BUILD_ASSIMP_TOOLS=False -DASSIMP_BUILD_SAMPLES=False -DASSIMP_BUILD_TESTS=False -DIGNORE_GIT_HASH=True -DASSIMP_NO_EXPORT=True` -* tinyply: https://github.com/ddiakopoulos/tinyply.git, [tags/2.3.2], - * with options `-DSHARED_LIB=TRUE` -* PowerSlider: https://github.com/dlyr/PowerSlider.git, [origin/master], - * with options `-DBUILD_DESIGNER_PLUGIN=OFF -DBUILD_EXAMPLE_APP=OFF` -* glm: https://github.com/g-truc/glm.git, [cc98465e3508535ba8c7f6208df934c156a018dc], - * with options `-DGLM_TEST_ENABLE=OFF -DBUILD_STATIC_LIBS=OFF -DCMAKE_INSTALL_PREFIX=` -* glbinding: https://github.com/cginternals/glbinding.git, [758d33b4d4f1815d46d91fcf4ca4914d837267fa], - * with options `-DOPTION_BUILD_TESTS=OFF -DOPTION_BUILD_DOCS=OFF -DOPTION_BUILD_TOOLS=OFF -DOPTION_BUILD_EXAMPLES=OFF -DOPTION_BUILD_OWN_KHR_HEADERS=ON -DCMAKE_INSTALL_PREFIX=` -* globjects: https://github.com/cginternals/globjects.git, [4363356ae2ef5c936ab078fba48d1ea507c295c4], - * with options `-DOPTION_BUILD_DOCS=OFF -DOPTION_BUILD_EXAMPLES=OFF -DOPTION_USE_EIGEN=ON -Dglbinding_DIR=${glbinding_DIR} -Dglm_DIR=${glm_DIR} -DEigen3_DIR=${Eigen3_DIR} -DCMAKE_INSTALL_PREFIX=` -* stb: https://github.com/nothings/stb.git, [1034f5e5c4809ea0a7f4387e0cd37c5184de3cdd], - * with options `None` -* tinyEXR: https://github.com/MathiasPaulin/tinyexr.git, [origin/radium], - * with options `-DBUILD_INSTALLABLE_LIB=ON` -* Eigen3: https://gitlab.com/libeigen/eigen.git, [tags/3.4.0], - * with options `-DEIGEN_TEST_CXX11=OFF -DBUILD_TESTING=OFF -DEIGEN_BUILD_DOC=OFF` -* OpenMesh: https://www.graphics.rwth-aachen.de:9000/OpenMesh/OpenMesh.git, [tags/OpenMesh-8.1], - * with options `-DBUILD_APPS=OFF` -* cpplocate: https://github.com/cginternals/cpplocate.git, [tags/v2.2.0], - * with options `-DOPTION_BUILD_TESTS=OFF -DOPTION_BUILD_DOCS=OFF` -* nlohmann_json: https://github.com/nlohmann/json.git, [tags/v3.10.5], - * with options `-DJSON_Install=ON -DJSON_BuildTests=OFF` - - - -\warning You have to take care of the consistency of the external dependencies, e.g. it's not possible to use your version of globjects without providing your version of eigen, otherwise you will have mixed version in Radium. diff --git a/doc/basics/details.md b/doc/basics/details.md new file mode 100644 index 00000000000..f27cab362f6 --- /dev/null +++ b/doc/basics/details.md @@ -0,0 +1,204 @@ +\page basicsCompileRadiumDetails Radium Compilation Details +[TOC] + +# Dependencies management systems + +We developed a series of tools to fetch and compile these dependencies easily, except for +Qt, which needs to be installed and passed to cmake through the variables `CMAKE_PREFIX_PATH` or `Qt6_DIR` +(see documentation at ). + +We offer two different systems to handle external dependencies (see details and how-to in the following sections): + + 1. **[recommended]** external build: the user compiles and installs once for all the dependencies using a dedicated + cmake project. Then, Radium cmake project is configured to link with installed dependencies, as described in compilation instructions. + 2. manual management: users can also provide their own version of the dependencies through cmake packages. + +\warning Dependencies need to be built with the same build type (ie. Release, Debug) than Radium. + +## Configuration of Radium + +To compile Radium-Engine, you have to indicate where cmake can find each dependency. + +For convenience, dependencies install procedure create a configuration file, to be used with the `-C` option of cmake. +The cmake config file `/path/to/installs/radium-external-r/radium-options.cmake` contains, depending on your dependency configuration: + +~~~{.cmake} +set(Eigen3_DIR "/path/to/external/install/share/eigen3/cmake/" CACHE PATH "My Eigen3 location") +set(OpenMesh_DIR "/path/to/external/install/share/OpenMesh/cmake/" CACHE PATH "My OpenMesh location") +set(cpplocate_DIR "/path/to/external/install/share/cpplocate/" CACHE PATH "My cpplocate location") +set(nlohmann_json_DIR "/path/to/external/install/lib/cmake/nlohmann_json/" CACHE PATH "My nlohmann_json location") +set(glm_DIR "/path/to/external/install/glm/lib/cmake/glm/" CACHE PATH "My glm location") +set(glbinding_DIR "/path/to/external/install/glbinding/" CACHE PATH "My glbinding location") +set(globjects_DIR "/path/to/external/install/globjects/" CACHE PATH "My globjects location") +set(stb_DIR "/path/to/external/install/include/stb/" CACHE PATH "My stb location") +set(stb_INCLUDE_DIR "/path/to/external/install/include/" CACHE PATH "My stb_INCLUDE location") +set(tinyEXR_DIR "/path/to/external/install/share/tinyEXR/cmake/" CACHE PATH "My tinyEXR location") +set(assimp_DIR "/path/to/external/install/lib/cmake/assimp-5.0/" CACHE PATH "My assimp location") +set(tinyply_DIR "/path/to/external/install/lib/cmake/tinyply/" CACHE PATH "My tinyply location") +set(PowerSlider_DIR "/path/to/external/install/lib/cmake/PowerSlider/" CACHE PATH "My PowerSlider location") +set(RADIUM_IO_ASSIMP ON CACHE BOOL "Radium uses assimp io") +set(RADIUM_IO_TINYPLY ON CACHE BOOL "Radium uses tinyply io") +~~~ + +When configuring Radium cmake project, don't forget to add this file by calling `cmake -C /path/to/installs/radium-external-r/radium-options.cmake ...` + +You can also provide these variables as cmake command line argument: + +~~~{.bash} +cmake \ +-DEigen3_DIR /path/to/external/install/share/eigen3/cmake/ +... and so on ... +~~~ + +## User provided external dependencies + +You can use your own installation of a local dependency instead of letting cmake fetch and compile it. +To this end, just provide the corresponding '*_DIR' to cmake at configuration time as show before (with '-D' option, configuration file or toolchain file, please refer to cmake documentation). + +Currently supported (note that these paths must refer to the installation directory of the corresponding library): + + +* `assimp_DIR` +* `tinyply_DIR` +* `PowerSlider_DIR` +* `glm_DIR` +* `glbinding_DIR` +* `globjects_DIR` +* `stb_DIR` +* `tinyEXR_DIR` +* `Eigen3_DIR` +* `OpenMesh_DIR` +* `cpplocate_DIR` +* `nlohmann_json_DIR` + + + +\warning You have to take care of the consistency of the external dependencies, e.g. it's not possible to use your version of globjects without providing your version of eigen, otherwise you will have mixed version in Radium. + +# Radium Build Details + +Radium follows a standard cmake structure, so any IDE supporting cmake should be able to configure and build it. +**Out-of source builds are mandatory**. + +Several targets allowing to build or install only a specific part of Radium-Engine are defined by the cmake configuration. +The standard targets `all` and `install` are also available as a shortcut to build all the configured components and to install the main components. + +\note We strongly recommend to have dedicated build and install directories for each build type (Release, Debug). +To compile Radium in Debug mode, the dependencies must be compiled and installed in Debug mode +(due to a limitation in assimp). + +## Folder structure + +Radium-Engine relies on CMake build-chain on all supported platforms. +In most cases, building should be pretty straightforward, provided that cmake can locate the dependencies. + +### Installation directory + +By default, `${CMAKE_INSTALL_PREFIX}` is set as follow: + +* For release build : + +~~~{.cmake} + set(RADIUM_BUNDLE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}) +~~~ + +* For Debug or RelWithDebInfo build + +~~~{.cmake} + set(RADIUM_BUNDLE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Bundle-${CMAKE_CXX_COMPILER_ID}-${CMAKE_BUILD_TYPE}) +~~~ + +It has the following structure + +~~~{.txt} +Bundle-* + - bin/ include/ lib/ LICENSE README.md Resources/ +~~~ + +## Configure build options + +Radium offers the following build options: + +~~~{.bash} +// Enable coverage, gcc only. Experimental, need ENABLE_TESTING +RADIUM_ENABLE_COVERAGE:BOOL=OFF + +// Enable examples app build. To install examples, build explicitly the target Install_RadiumExamples. +RADIUM_ENABLE_EXAMPLES:BOOL=OFF + +// Enable precompiled headers. +RADIUM_ENABLE_PCH:BOOL=OFF + +// Enable testing. Tests are automatically built with target all, run with target check or test. +RADIUM_ENABLE_TESTING:BOOL=ON + +// Enable testing of OpenGL functionalities. Option only available if RADIUM_ENABLE_TESTING is ON. +RADIUM_ENABLE_GL_TESTING:BOOL=OFF + +// Include Radium::Core in CMake project. +RADIUM_GENERATE_LIB_CORE:BOOL=ON + +// Include Radium::Engine in CMake project. +RADIUM_GENERATE_LIB_ENGINE:BOOL=ON + +// Include Radium::Gui in CMake project. +RADIUM_GENERATE_LIB_GUI:BOOL=ON + +// Include Radium::Headless in CMake project. +RADIUM_GENERATE_LIB_HEADLESS:BOOL=ON + +// Include Radium::IO in CMake project. +RADIUM_GENERATE_LIB_IO:BOOL=ON + +// Include Radium::PluginBase in CMake project. +RADIUM_GENERATE_LIB_PLUGINBASE:BOOL=ON + +// Install documentation. If RadiumDoc is compiled, install documentation to bundle directory for install target. +RADIUM_INSTALL_DOC:BOOL=ON + +// Provide loaders based on Assimp library +RADIUM_IO_ASSIMP:BOOL=ON + +// Provide deprecated loaders (to be removed without notice) +RADIUM_IO_DEPRECATED:BOOL=ON + +// Provide loaders based on TinyPly library +RADIUM_IO_TINYPLY:BOOL=ON + +// Provide loader for volume pvm file format +RADIUM_IO_VOLUMES:BOOL=ON + +// Disable Radium Log messages +RADIUM_QUIET:BOOL=OFF + +// Update version file each time the project is compiled (update compilation time in version.cpp). +RADIUM_UPDATE_VERSION:BOOL=ON + +// Use double precision for Scalar. +RADIUM_USE_DOUBLE:BOOL=OFF +~~~ + +All radium related cmake options (with their current values) can be printed with `cmake -LAH | grep -B1 RADIUM` (on linux like system) + +\warning For computers with low RAM capacities (under 12G) we recommend to set the `CMAKE_BUILD_PARALLEL_LEVEL` environment variable to a reasonable value (i.e. 2) to prevent the computer from swapping. + +### Precompiled headers + +Radium build can take benefit of precompiled headers. To do so, set `RADIUM_ENABLE_PCH=ON` (OFF by default) at cmake configure time. +Compilation speedup depends on what files you are currently editing, and full compilation is roughly 20% less with precompiled header enabled. + +### Dependencies between libraries + +The options `RADIUM_GENERATE_LIB_XXXX` allows to enable/disable each Radium library. +The dependencies between libraries are set as follow: + +~~~{.cmake} +add_dependencies (${ra_engine_target} PUBLIC Radium::Core) +add_dependencies (${ra_io_target} PUBLIC Radium::Core) +add_dependencies (${ra_pluginbase_target} Radium::Core Radium::Engine) +add_dependencies (${ra_gui_target} PUBLIC Radium::Core Radium::Engine Radium::PluginBase Radium::IO) +~~~ + +\warning Consistency of `RADIUM_GENERATE_LIB_***` options is not checked wrt. the dependencies. + +* When enabled using `RADIUM_GENERATE_LIB_***`, each library has a compilation target: `Core`, `Engine`, ... diff --git a/doc/basics/radium-as-submodule.md b/doc/basics/radium-as-submodule.md index a8ec5eb16ba..97df6a01e69 100644 --- a/doc/basics/radium-as-submodule.md +++ b/doc/basics/radium-as-submodule.md @@ -36,4 +36,4 @@ In your source code: ## Detailed instructions -See [CMake setup](@ref cmakeutilities) for detailed doc and Radium's cmake utilies function insights. +See [CMake setup](\ref cmakeutilities) for detailed doc and Radium's cmake utilies function insights. diff --git a/doc/basics/troubleshooting.md b/doc/basics/troubleshooting.md index bca6a8ea363..bfda08ad343 100644 --- a/doc/basics/troubleshooting.md +++ b/doc/basics/troubleshooting.md @@ -1,25 +1,5 @@ \page basicsTroubleshooting Troubleshooting - -# Qt cmake errors - -In case you run into an error like - -~~~{.bash} -By not providing "FindQt5Widgets.cmake" in CMAKE_MODULE_PATH this project -has asked CMake to find a package configuration file provided by -"Qt5Widgets", but CMake did not find one. -~~~ - -you need to set `CMAKE_PREFIX_PATH`, pointing to the Qt root dir of your commpiler. -For example on linux with gcc : - -~~~{.bash} -cmake -DCMAKE_PREFIX_PATH=/opt/Qt/5.x/gcc_64 -~~~ - -On windows, using cmake-gui you can use the "add entry" button, adding `CMAKE_PREFIX_PATH` -as a string to point to the Qt directory (for example in the default installation : -`C:/Qt/5.15/msvc2019_64` ) +[TOC] # Crash when starting main application on windows diff --git a/doc/basics/vs.md b/doc/basics/vs.md new file mode 100644 index 00000000000..f69469e57fd --- /dev/null +++ b/doc/basics/vs.md @@ -0,0 +1,155 @@ +\page basicsCompileVs Microsoft Visual Studio Compilation Instructions + +# Build external dependencies + +Open the external folder in VS using "Open a local folder" and edit cmake settings or `CMakeSettings.json`. External build and install have to be outside Radium-Engine source directory. For instance + +~~~{.json} +{ + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}/../../radium-externals/build/${name}", + "installRoot": "${projectDir}/../../radium-externals/install/${name}", + "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:/Qt/6.3.0/msvc2019_64", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "Release", + "buildRoot": "${projectDir}/../../radium-externals/build/${name}", + "installRoot": "${projectDir}/../../radium-externals/install/${name}", + "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=C:/Qt/6.3.0/msvc2019_64", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64_x64" ], + "variables": [] + } + ] +} +~~~ + +Build the project, this will install the external dependencies. + +# Build Radium + +Open the Radium folder (via "File > Open > Folder..." or `devenv.exe `). +VS will run cmake, generate the target builds (Debug and Release by default). +Other build types can be added by editing `CMakeSettings.json`. + +Configure cmake option (see official doc [here](https://docs.microsoft.com/cpp/build/customize-cmake-settings)) +You have to provide path to Qt installation, glfw installation (for headless support) and external dependencies configuration. +In order to execute Radium demos from the buildtree (installing them takes time due to qt deployement procedure), +you also need to define environment variables that point to the various dlls used by Radium components that will be used on the per-target `launch.vs.json` configuration file. +Note that it is recommended to compile or install glfw as a static library, the example below assume that. + +For instance, with directory structure for externals as defined above the configuration is + +~~~{.json} +{ + "environments": [ + { + "QtDir": "C:/Qt/6.3.0/msvc2019_64/", + "glfwDir" : "C:/path/to/glfwInstallation", + "ExternalInstallDir": "${projectDir}/../radium-externals/install/${name}/bin;${projectDir}/../radium-externals/install/${name}/cpplocate;${projectDir}/../radium-externals/install/${name}/globjects;${projectDir}/../radium-externals/install/${name}/glbinding", + } + ], + "configurations": [ + { + "name": "x64-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}/out/build/${name}", + "installRoot": "${projectDir}/out/install/${name}", + "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=\"${env.QtDir};${env.glfwDir}/lib/cmake\" -C ${projectDir}/../radium-externals/install/${name}/radium-options.cmake", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "environments": [ + { + "environment": "RadiumDllsLocations", + "ExternalDllsDIR": "${env.ExternalInstallDir}/${name}/bin;${env.ExternalInstallDir}/${name}/cpplocate;${env.ExternalInstallDir}/${name}/glbinding;${env.ExternalInstallDir}/${name}/globjects", + "QtDllsDIR": "${env.QtDir}/bin", + "RadiumDlls": "${buildRoot}/src/Core;${buildRoot}/src/Engine;${buildRoot}/src/Gui;${buildRoot}/src/Headless;${buildRoot}/src/IO;${buildRoot}/src/PluginBase" + } + ] + }, + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "Release", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${projectDir}/out/build/${name}", + "installRoot": "${projectDir}/out/install/${name}", + "cmakeCommandArgs": "-DCMAKE_PREFIX_PATH=\"${env.QtDir};${env.glfwDir}/lib/cmake\" -C ${projectDir}/../radium-externals/install/${name}/radium-options.cmake", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "environments": [ + { + "environment": "RadiumDllsLocations", + "ExternalDllsDIR": "${env.ExternalInstallDir}/${name}/bin;${env.ExternalInstallDir}/${name}/cpplocate;${env.ExternalInstallDir}/${name}/glbinding;${env.ExternalInstallDir}/${name}/globjects", + "QtDllsDIR": "${env.QtDir}/bin", + "RadiumDlls": "${buildRoot}/src/Core;${buildRoot}/src/Engine;${buildRoot}/src/Gui;${buildRoot}/src/Headless;${buildRoot}/src/IO;${buildRoot}/src/PluginBase" + } + ] + } + ] +} +~~~ + +\note It is strongly encouraged to use `/` separators in your path, instead of `\\`. See + +\note When compiling the dependencies you may hit the max path length fixed by Microsoft OS (260 characters). To fix this, you might need to change the path of your build dir to shorten it, or to change the limit on your system, see: + +## Compilation + +Right click on `CMakeList.txt > build > all`. + +## Execution of a demo app + +To execute a demo application from the buildtree, i.e. without installing Radium, select in the `Startup Item` list the target you want to execute. +For instance, `DrawPrimitives.exe (examples/...)`. +Then, select in the menu `/Debug and Launch Settings for DrawPrimmitives` and modify the `launch.vs.json` file that is opened so that it contains the following. + +~~~{.json} +{ + "version": "0.2.1", + "defaults": {}, + "configurations": [ + { + "type": "default", + "project": "CMakeLists.txt", + "projectTarget": "DrawPrimitives.exe (examples\\DrawPrimitives\\DrawPrimitives.exe)", + "name": "DrawPrimitives.exe (examples\\DrawPrimitives\\DrawPrimitives.exe)", + "inheritEnvironments": [ "RadiumDllsLocations" ], + "env": { + "PATH": "${env.QtDllsDIR};${env.ExternalDllsDIR};${env.RadiumDlls};${env.PATH}" + } + } + ] +} +~~~ + +For any target you want to execute, the same should be done, i.e. adding the following to the target configuration + +~~~{.json} + "inheritEnvironments": [ "RadiumDllsLocations" ], + "env": { + "PATH": "${env.QtDllsDIR};${env.ExternalDllsDIR};${env.RadiumDlls};${env.PATH}" + } +~~~ + +If you plan to execute the 'unittest.exe' target, you should also add the following configuration for the working directory + +~~~{.json} + "currentDir": "${projectDir}/tests/unittest" +~~~ + +## installation + +To install, you need to run any installation target, e.g. `Engine.dll (install)` or to select the menu `/` diff --git a/doc/concepts/componentMessenger.md b/doc/concepts/componentMessenger.md index e27dd755483..9a93ba04599 100644 --- a/doc/concepts/componentMessenger.md +++ b/doc/concepts/componentMessenger.md @@ -1,4 +1,4 @@ -\page componentMessenger [deprecated] Component Messenger +\page componentMessenger _deprecated_ Component Messenger \todo check and update [TOC] @@ -8,8 +8,7 @@ a data. # Read # -The **suscriber** must define and register some `ComponentMessenger::CallbackTypes::Setter` that will -be used by the `ComponentMessenger` to set the data to the +The **suscriber** must define and register some `Ra::Engine::Scene::ComponentMessenger::CallbackTypes::Setter` that will be used by the `ComponentMessenger` to set the data to the former. // definition of callback @@ -32,7 +31,7 @@ former. // registration ComponentMessenger::getInstance()->registerOutput( entity, this, "name", data_out ); -The **publisher** will define and register a `ComponentMessenger::CallbackTypes::Getter` that will be used +The **publisher** will define and register a `Ra::Engine::Scene::ComponentMessenger::CallbackTypes::Getter` that will be used by the `ComponentMessenger` to fetch data from the former. # Read'n'Write # diff --git a/doc/concepts/eventSystem.md b/doc/concepts/eventSystem.md index b01cd168ab1..d743417bfbe 100644 --- a/doc/concepts/eventSystem.md +++ b/doc/concepts/eventSystem.md @@ -1,4 +1,4 @@ -\page eventSystem [deprecated] Event System +\page eventSystem _deprecated_ Event System \todo check and update [TOC] diff --git a/doc/concepts/forwardrenderer.md b/doc/concepts/forwardrenderer.md index d526f901a35..0889fa21004 100644 --- a/doc/concepts/forwardrenderer.md +++ b/doc/concepts/forwardrenderer.md @@ -5,7 +5,7 @@ The main renderer of Radium, implemented in the class Ra::Engine::Rendering::For rendering loop. Even if the material association to a drawable object, realized by the so called Ra::Engine::Rendering::RenderTechnique is tightly coupled with the main rendering loop, Plugins might define new renderers and interact differently with shader and -materials properties (see chapter on [Materials](@ref develmaterials) ). +materials properties (see chapter on [Materials](\ref develmaterials) ). Here is a summary of the different passes of the Ra::Engine::Rendering::ForwardRenderer diff --git a/doc/cppreference-doxygen-web.tag.xml b/doc/cppreference-doxygen-web.tag.xml new file mode 100644 index 00000000000..ea8388b8b8e --- /dev/null +++ b/doc/cppreference-doxygen-web.tag.xml @@ -0,0 +1,35489 @@ + + + + std + + std::is_function + + T + atomic_fetch_and_explicit + cpp/atomic/atomic_fetch_sub + + (T... args) + + + T + atomic_fetch_xor_explicit + cpp/atomic/atomic_fetch_xor + + (T... args) + + + T + set_unexpected + cpp/error/set_unexpected + + (T... args) + + std::input_iterator_tag + std::logical_and + std::is_integral + std::money_get + + T + fputs + cpp/io/c/fputs + + (T... args) + + std::basic_ofstream + std::ratio_subtract + + T + modf + cpp/numeric/math/modf + + (T... args) + + std::size_t + + T + not2 + cpp/utility/functional/not2 + + (T... args) + + + T + strlen + cpp/string/byte/strlen + + (T... args) + + + T + exp2 + cpp/numeric/math/exp2 + + (T... args) + + std::ctype_byname + std::wcout + + T + setiosflags + cpp/io/manip/setiosflags + + (T... args) + + + T + adjacent_difference + cpp/algorithm/adjacent_difference + + (T... args) + + + T + cos + cpp/numeric/math/cos + + (T... args) + + + T + fwscanf + cpp/io/c/fwscanf + + (T... args) + + + T + atomic_init + cpp/atomic/atomic_init + + (T... args) + + std::fstream + std::valarray + std::ratio_greater_equal + + T + forward_as_tuple + cpp/utility/tuple/forward_as_tuple + + (T... args) + + std::remove_extent + std::ratio_greater + + T + abort + cpp/utility/program/abort + + (T... args) + + + T + wcsncmp + cpp/string/wide/wcsncmp + + (T... args) + + std::intptr_t + std::regex_iterator + + T + set_intersection + cpp/algorithm/set_intersection + + (T... args) + + std::lock_guard + std::wbuffer_convert + std::modulus + std::ratio_divide + + T + atomic_signal_fence + cpp/atomic/atomic_signal_fence + + (T... args) + + + T + llabs + cpp/numeric/math/abs + + (T... args) + + + T + make_move_iterator + cpp/iterator/make_move_iterator + + (T... args) + + std::ostreambuf_iterator + std::dynarray + std::is_nothrow_move_constructible + std::vector + + T + scanf + cpp/io/c/fscanf + + (T... args) + + std::match_results + std::back_insert_iterator + + T + nextafter + cpp/numeric/math/nextafter + + (T... args) + + std::iterator + std::int8_t + + T + stol + cpp/string/basic_string/stol + + (T... args) + + + T + strcspn + cpp/string/byte/strcspn + + (T... args) + + + T + ungetwc + cpp/io/c/ungetwc + + (T... args) + + + T + transform + cpp/algorithm/transform + + (T... args) + + std::student_t_distribution + std::mt19937_64 + std::runtime_error + + T + putc + cpp/io/c/fputc + + (T... args) + + + T + iswdigit + cpp/string/wide/iswdigit + + (T... args) + + std::ranlux24_base + + T + rint + cpp/numeric/math/rint + + (T... args) + + std::allocator_traits + + T + memset + cpp/string/byte/memset + + (T... args) + + + T + isgraph + cpp/string/byte/isgraph + + (T... args) + + std::codecvt + std::ratio_less_equal + + T + replace_copy_if + cpp/algorithm/replace_copy + + (T... args) + + + T + scalbn + cpp/numeric/math/scalbn + + (T... args) + + std::condition_variable_any + + T + partial_sort_copy + cpp/algorithm/partial_sort_copy + + (T... args) + + std::deca + std::extreme_value_distribution + std::cout + std::decay + std::is_trivially_move_assignable + std::adopt_lock_t + + T + make_exception_ptr + cpp/error/make_exception_ptr + + (T... args) + + std::wcerr + + T + frexp + cpp/numeric/math/frexp + + (T... args) + + std::lognormal_distribution + + T + isxdigit + cpp/string/byte/isxdigit + + (T... args) + + std::wclog + + T + atomic_exchange_explicit + cpp/atomic/atomic_exchange + + (T... args) + + + T + wprintf + cpp/io/c/fwprintf + + (T... args) + + std::char_traits + std::remove_reference + + T + fdim + cpp/numeric/math/fdim + + (T... args) + + std::num_get + + T + wctype + cpp/string/wide/wctype + + (T... args) + + std::is_pointer + + T + mbrtoc32 + cpp/string/multibyte/mbrtoc32 + + (T... args) + + + T + setw + cpp/io/manip/setw + + (T... args) + + + T + get_temporary_buffer + cpp/memory/get_temporary_buffer + + (T... args) + + + T + fmax + cpp/numeric/math/fmax + + (T... args) + + std::multiset + + T + atomic_thread_fence + cpp/atomic/atomic_thread_fence + + (T... args) + + + T + atomic_exchange + cpp/atomic/atomic_exchange + + (T... args) + + std::weak_ptr + std::bidirectional_iterator_tag + std::wstring_convert + + T + fgetwc + cpp/io/c/fgetwc + + (T... args) + + + T + swprintf + cpp/io/c/fwprintf + + (T... args) + + + T + prev_permutation + cpp/algorithm/prev_permutation + + (T... args) + + std::greater_equal + std::is_trivially_constructible + + T + max_element + cpp/algorithm/max_element + + (T... args) + + std::string + std::discrete_distribution + std::wostream + std::is_polymorphic + + T + set_symmetric_difference + cpp/algorithm/set_symmetric_difference + + (T... args) + + + T + wcscpy + cpp/string/wide/wcscpy + + (T... args) + + + T + const_pointer_cast + cpp/memory/shared_ptr/pointer_cast + + (T... args) + + + T + minmax_element + cpp/algorithm/minmax_element + + (T... args) + + + T + wcstok + cpp/string/wide/wcstok + + (T... args) + + + T + ref + cpp/utility/functional/ref + + (T... args) + + std::reverse_iterator + + T + feupdateenv + cpp/numeric/fenv/feupdateenv + + (T... args) + + std::bad_array_new_length + + T + endl + cpp/io/manip/endl + + (T... args) + + + T + end + cpp/iterator/end + + (T... args) + + std::condition_variable + + T + wmemmove + cpp/string/wide/wmemmove + + (T... args) + + + T + fmin + cpp/numeric/math/fmin + + (T... args) + + + T + uninitialized_fill_n + cpp/memory/uninitialized_fill_n + + (T... args) + + std::ranlux48 + + T + nouppercase + cpp/io/manip/uppercase + + (T... args) + + + T + noshowpos + cpp/io/manip/showpos + + (T... args) + + + T + ctime + cpp/chrono/c/ctime + + (T... args) + + + T + wmemset + cpp/string/wide/wmemset + + (T... args) + + std::unexpected_handler + + T + iswpunct + cpp/string/wide/iswpunct + + (T... args) + + std::piecewise_constant_distribution + std::codecvt_base + std::set + + T + pop_heap + cpp/algorithm/pop_heap + + (T... args) + + + T + sprintf + cpp/io/c/fprintf + + (T... args) + + + T + fixed + cpp/io/manip/fixed + + (T... args) + + + T + make_shared + cpp/memory/shared_ptr/make_shared + + (T... args) + + std::forward_iterator_tag + std::codecvt_byname + std::pointer_safety + std::uint_least64_t + std::placeholders + std::nothrow_t + std::is_nothrow_copy_assignable + std::is_same + + T + make_heap + cpp/algorithm/make_heap + + (T... args) + + + T + fmod + cpp/numeric/math/fmod + + (T... args) + + std::unique_lock + std::basic_ostringstream + + T + atol + cpp/string/byte/atoi + + (T... args) + + std::is_error_code_enum + std::time_put_byname + + T + uninitialized_copy + cpp/memory/uninitialized_copy + + (T... args) + + std::time_get + + T + dynamic_pointer_cast + cpp/memory/shared_ptr/pointer_cast + + (T... args) + + + T + set_union + cpp/algorithm/set_union + + (T... args) + + std::regex + std::cin + + T + hexfloat + cpp/io/manip/fixed + + (T... args) + + + T + vswprintf + cpp/io/c/vfwprintf + + (T... args) + + + T + asctime + cpp/chrono/c/asctime + + (T... args) + + std::unordered_map + + T + iswspace + cpp/string/wide/iswspace + + (T... args) + + std::initializer_list + + T + nan + cpp/numeric/math/nan + + (T... args) + + + T + sort + cpp/algorithm/sort + + (T... args) + + + T + quick_exit + cpp/utility/program/quick_exit + + (T... args) + + std::is_const + + T + log10 + cpp/numeric/math/log10 + + (T... args) + + std::basic_regex + + T + mbstowcs + cpp/string/multibyte/mbstowcs + + (T... args) + + + T + isspace + cpp/string/byte/isspace + + (T... args) + + std::poisson_distribution + std::bad_typeid + + T + strncat + cpp/string/byte/strncat + + (T... args) + + std::less_equal + + T + isinf + cpp/numeric/math/isinf + + (T... args) + + + T + atof + cpp/string/byte/atof + + (T... args) + + std::sig_atomic_t + + T + erf + cpp/numeric/math/erf + + (T... args) + + + T + is_sorted_until + cpp/algorithm/is_sorted_until + + (T... args) + + + T + cbrt + cpp/numeric/math/cbrt + + (T... args) + + + T + log1p + cpp/numeric/math/log1p + + (T... args) + + + T + return_temporary_buffer + cpp/memory/return_temporary_buffer + + (T... args) + + + T + mbsrtowcs + cpp/string/multibyte/mbsrtowcs + + (T... args) + + + T + feraiseexcept + cpp/numeric/fenv/feraiseexcept + + (T... args) + + + T + fseek + cpp/io/c/fseek + + (T... args) + + std::make_unsigned + std::basic_filebuf + + T + atomic_fetch_or_explicit + cpp/atomic/atomic_fetch_or + + (T... args) + + std::logical_or + + T + log + cpp/numeric/math/log + + (T... args) + + + T + putchar + cpp/io/c/putchar + + (T... args) + + + T + make_tuple + cpp/utility/tuple/make_tuple + + (T... args) + + + T + expm1 + cpp/numeric/math/expm1 + + (T... args) + + std::wstringbuf + + T + fma + cpp/numeric/math/fma + + (T... args) + + std::kilo + std::bernoulli_distribution + + T + remove_copy_if + cpp/algorithm/remove_copy + + (T... args) + + + T + showpoint + cpp/io/manip/showpoint + + (T... args) + + std::int16_t + + T + fscanf + cpp/io/c/fscanf + + (T... args) + + + T + stable_partition + cpp/algorithm/stable_partition + + (T... args) + + std::basic_ios + std::int32_t + + T + fill_n + cpp/algorithm/fill_n + + (T... args) + + std::is_rvalue_reference + + T + remove_copy + cpp/algorithm/remove_copy + + (T... args) + + + T + atomic_compare_exchange_strong_explicit + cpp/atomic/atomic_compare_exchange + + (T... args) + + std::integral_constant + std::wsmatch + + T + wctomb + cpp/string/multibyte/wctomb + + (T... args) + + + T + fgets + cpp/io/c/fgets + + (T... args) + + + T + remainder + cpp/numeric/math/remainder + + (T... args) + + std::cerr + std::codecvt_utf8 + + T + allocate_shared + cpp/memory/shared_ptr/allocate_shared + + (T... args) + + std::ratio_add + + T + unique + cpp/algorithm/unique + + (T... args) + + std::is_trivially_move_constructible + + T + includes + cpp/algorithm/includes + + (T... args) + + + T + iswalnum + cpp/string/wide/iswalnum + + (T... args) + + std::wcsub_match + + T + exit + cpp/utility/program/exit + + (T... args) + + + T + put_time + cpp/io/manip/put_time + + (T... args) + + + T + to_string + cpp/string/basic_string/to_string + + (T... args) + + + T + is_heap_until + cpp/algorithm/is_heap_until + + (T... args) + + std::is_member_pointer + + T + wcstold + cpp/string/wide/wcstof + + (T... args) + + std::wstreampos + std::uint_least16_t + + T + stold + cpp/string/basic_string/stof + + (T... args) + + + T + ftell + cpp/io/c/ftell + + (T... args) + + std::tuple + + T + copy_backward + cpp/algorithm/copy_backward + + (T... args) + + + T + wcstoll + cpp/string/wide/wcstol + + (T... args) + + + T + perror + cpp/io/c/perror + + (T... args) + + + T + vwscanf + cpp/io/c/vfwscanf + + (T... args) + + + T + stable_sort + cpp/algorithm/stable_sort + + (T... args) + + std::make_signed + + T + generic_category + cpp/error/generic_category + + (T... args) + + + T + abs(int) + cpp/numeric/math/abs + + (T... args) + + + T + fgetws + cpp/io/c/fgetws + + (T... args) + + std::logic_error + std::sregex_iterator + + T + showpos + cpp/io/manip/showpos + + (T... args) + + std::int_least64_t + + T + exp + cpp/numeric/math/exp + + (T... args) + + std::binary_negate + + T + fill + cpp/algorithm/fill + + (T... args) + + + T + isalpha + cpp/string/byte/isalpha + + (T... args) + + std::discard_block_engine + std::is_trivially_assignable + std::add_cv + + T + lgamma + cpp/numeric/math/lgamma + + (T... args) + + std::pico + std::iterator_traits + std::is_trivially_default_constructible + + T + feclearexcept + cpp/numeric/fenv/feclearexcept + + (T... args) + + + T + wcsncpy + cpp/string/wide/wcsncpy + + (T... args) + + + T + undeclare_reachable + cpp/memory/gc/undeclare_reachable + + (T... args) + + std::shared_ptr + + T + oct + cpp/io/manip/hex + + (T... args) + + std::bad_alloc + std::ostringstream + std::basic_fstream + std::stringbuf + std::exponential_distribution + std::uint32_t + + T + strspn + cpp/string/byte/strspn + + (T... args) + + std::wcregex_iterator + std::bad_function_call + + T + realloc + cpp/memory/c/realloc + + (T... args) + + + T + copy + cpp/algorithm/copy + + (T... args) + + + T + binary_search + cpp/algorithm/binary_search + + (T... args) + + + T + system_category + cpp/error/system_category + + (T... args) + + + T + mbrtowc + cpp/string/multibyte/mbrtowc + + (T... args) + + std::false_type + + T + strtof + cpp/string/byte/strtof + + (T... args) + + + T + mem_fn + cpp/utility/functional/mem_fn + + (T... args) + + std::wregex + + T + distance + cpp/iterator/distance + + (T... args) + + + T + lock + cpp/thread/lock + + (T... args) + + + T + strcmp + cpp/string/byte/strcmp + + (T... args) + + + T + tmpfile + cpp/io/c/tmpfile + + (T... args) + + + T + hypot + cpp/numeric/math/hypot + + (T... args) + + + T + getenv + cpp/utility/program/getenv + + (T... args) + + + T + strrchr + cpp/string/byte/strrchr + + (T... args) + + + T + count + cpp/algorithm/count + + (T... args) + + std::uint_least8_t + + T + tan + cpp/numeric/math/tan + + (T... args) + + + T + strftime + cpp/chrono/c/strftime + + (T... args) + + std::uniform_real_distribution + + T + stod + cpp/string/basic_string/stof + + (T... args) + + + T + towupper + cpp/string/wide/towupper + + (T... args) + + std::smatch + std::cregex_token_iterator + std::range_error + std::is_assignable + + T + atoll + cpp/string/byte/atoi + + (T... args) + + std::is_copy_assignable + std::invalid_argument + + T + atomic_store + cpp/atomic/atomic_store + + (T... args) + + std::is_unsigned + std::jmp_buf + std::is_class + std::geometric_distribution + + T + stoi + cpp/string/basic_string/stol + + (T... args) + + + T + rethrow_exception + cpp/error/rethrow_exception + + (T... args) + + std::uint_fast8_t + + T + sin + cpp/numeric/math/sin + + (T... args) + + + T + atomic_fetch_sub_explicit + cpp/atomic/atomic_fetch_sub + + (T... args) + + + T + unexpected + cpp/error/unexpected + + (T... args) + + + T + mbtowc + cpp/string/multibyte/mbtowc + + (T... args) + + std::mersenne_twister_engine + + T + get_time + cpp/io/manip/get_time + + (T... args) + + + T + partition + cpp/algorithm/partition + + (T... args) + + + T + next + cpp/iterator/next + + (T... args) + + std::is_arithmetic + std::negate + std::try_to_lock_t + std::wfilebuf + std::is_compound + std::iostream + std::is_object + + T + isfinite + cpp/numeric/math/isfinite + + (T... args) + + + T + boolalpha + cpp/io/manip/boolalpha + + (T... args) + + + T + fetestexcept + cpp/numeric/fenv/fetestexcept + + (T... args) + + + T + mbrlen + cpp/string/multibyte/mbrlen + + (T... args) + + std::recursive_mutex + std::is_copy_constructible + + T + iswgraph + cpp/string/wide/iswgraph + + (T... args) + + std::codecvt_utf8_utf16 + std::not_equal_to + std::is_destructible + std::int_fast32_t + + T + time + cpp/chrono/c/time + + (T... args) + + + T + atomic_compare_exchange_strong + cpp/atomic/atomic_compare_exchange + + (T... args) + + std::rank + + T + wcschr + cpp/string/wide/wcschr + + (T... args) + + + T + uppercase + cpp/io/manip/uppercase + + (T... args) + + std::milli + std::deci + + T + lower_bound + cpp/algorithm/lower_bound + + (T... args) + + std::add_lvalue_reference + std::is_bind_expression + std::ios_base + + T + copy_if + cpp/algorithm/copy + + (T... args) + + std::ratio_less + std::int64_t + std::nullptr_t + + T + isnan + cpp/numeric/math/isnan + + (T... args) + + + T + has_facet + cpp/locale/has_facet + + (T... args) + + + T + kill_dependency + cpp/atomic/kill_dependency + + (T... args) + + + T + uninitialized_copy_n + cpp/memory/uninitialized_copy_n + + (T... args) + + std::stack + + T + feholdexcept + cpp/numeric/fenv/feholdexcept + + (T... args) + + + T + div + cpp/numeric/math/div + + (T... args) + + + T + at_quick_exit + cpp/utility/program/at_quick_exit + + (T... args) + + std::uint_fast64_t + std::is_reference + std::ratio + std::shared_future + std::u16streampos + + T + wcspbrk + cpp/string/wide/wcspbrk + + (T... args) + + + T + search + cpp/algorithm/search + + (T... args) + + std::wistream + std::aligned_storage + + T + find_first_of + cpp/algorithm/find_first_of + + (T... args) + + + T + iota + cpp/algorithm/iota + + (T... args) + + std::wstreambuf + + T + declare_reachable + cpp/memory/gc/declare_reachable + + (T... args) + + + T + atomic_compare_exchange_weak + cpp/atomic/atomic_compare_exchange + + (T... args) + + std::binary_function + + T + strtod + cpp/string/byte/strtof + + (T... args) + + + T + accumulate + cpp/algorithm/accumulate + + (T... args) + + + T + wcsrchr + cpp/string/wide/wcsrchr + + (T... args) + + std::out_of_range + + T + min_element + cpp/algorithm/min_element + + (T... args) + + std::independent_bits_engine + + T + clearerr + cpp/io/c/clearerr + + (T... args) + + + T + random_shuffle + cpp/algorithm/random_shuffle + + (T... args) + + std::stringstream + std::tera + + T + iswalpha + cpp/string/wide/iswalpha + + (T... args) + + std::recursive_timed_mutex + std::nano + + T + atomic_fetch_and + cpp/atomic/atomic_fetch_sub + + (T... args) + + + T + wmemchr + cpp/string/wide/wmemchr + + (T... args) + + std::unordered_multimap + std::normal_distribution + + T + bsearch + cpp/algorithm/bsearch + + (T... args) + + + T + ilogb + cpp/numeric/math/ilogb + + (T... args) + + std::minstd_rand + std::is_signed + + T + unique_copy + cpp/algorithm/unique_copy + + (T... args) + + + T + _Exit + cpp/utility/program/_Exit + + (T... args) + + + T + move + cpp/utility/move + + (T... args) + + + T + find_end + cpp/algorithm/find_end + + (T... args) + + std::is_move_constructible + std::unique_ptr + + T + fesetexceptflag + cpp/numeric/fenv/feexceptflag + + (T... args) + + std::is_nothrow_copy_constructible + std::forward_list + std::errc + std::lconv + + T + nth_element + cpp/algorithm/nth_element + + (T... args) + + + T + gets + cpp/io/c/gets + + (T... args) + + + T + lexicographical_compare + cpp/algorithm/lexicographical_compare + + (T... args) + + + T + nearbyint + cpp/numeric/math/nearbyint + + (T... args) + + std::strstreambuf + std::locale + std::equal_to + + T + memcpy + cpp/string/byte/memcpy + + (T... args) + + + T + fwrite + cpp/io/c/fwrite + + (T... args) + + std::divides + std::collate_byname + + T + unitbuf + cpp/io/manip/unitbuf + + (T... args) + + + T + iswlower + cpp/string/wide/iswlower + + (T... args) + + + T + mblen + cpp/string/multibyte/mblen + + (T... args) + + + T + swscanf + cpp/io/c/fwscanf + + (T... args) + + + T + wcstoimax + cpp/string/wide/wcstoimax + + (T... args) + + std::domain_error + + T + fprintf + cpp/io/c/fprintf + + (T... args) + + + T + find_if + cpp/algorithm/find + + (T... args) + + std::is_empty + + T + strtoimax + cpp/string/byte/strtoimax + + (T... args) + + + T + isalnum + cpp/string/byte/isalnum + + (T... args) + + + T + atomic_fetch_add_explicit + cpp/atomic/atomic_fetch_add + + (T... args) + + std::is_nothrow_default_constructible + std::ratio_equal + + T + push_heap + cpp/algorithm/push_heap + + (T... args) + + + T + min + cpp/algorithm/min + + (T... args) + + + T + fwprintf + cpp/io/c/fwprintf + + (T... args) + + std::ostream + std::streamsize + + T + uncaught_exception + cpp/error/uncaught_exception + + (T... args) + + std::shared_lock + + T + strtoll + cpp/string/byte/strtol + + (T... args) + + std::uint8_t + + T + throw_with_nested + cpp/error/throw_with_nested + + (T... args) + + + T + shuffle + cpp/algorithm/random_shuffle + + (T... args) + + + T + isprint + cpp/string/byte/isprint + + (T... args) + + + T + get_new_handler + cpp/memory/new/get_new_handler + + (T... args) + + + T + call_once + cpp/thread/call_once + + (T... args) + + + T + trunc + cpp/numeric/math/trunc + + (T... args) + + + T + wcscspn + cpp/string/wide/wcscspn + + (T... args) + + std::enable_shared_from_this + std::ptrdiff_t + + T + mbrtoc16 + cpp/string/multibyte/mbrtoc16 + + (T... args) + + std::int_fast8_t + std::aligned_union + + T + lround + cpp/numeric/math/round + + (T... args) + + std::future + std::wcmatch + std::overflow_error + std::centi + + T + pow + cpp/numeric/math/pow + + (T... args) + + std::wssub_match + std::is_nothrow_move_assignable + std::pair + + T + tgamma + cpp/numeric/math/tgamma + + (T... args) + + + T + erfc + cpp/numeric/math/erfc + + (T... args) + + + T + llround + cpp/numeric/math/round + + (T... args) + + + T + abs(float) + cpp/numeric/math/fabs + + (T... args) + + + T + asinh + cpp/numeric/math/asinh + + (T... args) + + + T + feof + cpp/io/c/feof + + (T... args) + + std::wsregex_token_iterator + std::weibull_distribution + + T + noskipws + cpp/io/manip/skipws + + (T... args) + + std::less + std::multiplies + + T + find + cpp/algorithm/find + + (T... args) + + + T + atoi + cpp/string/byte/atoi + + (T... args) + + std::is_enum + + T + not1 + cpp/utility/functional/not1 + + (T... args) + + + T + vfscanf + cpp/io/c/vfscanf + + (T... args) + + std::unary_function + + T + stof + cpp/string/basic_string/stof + + (T... args) + + + T + regex_search + cpp/regex/regex_search + + (T... args) + + std::error_code + std::yocto + std::streampos + std::istream_iterator + + T + rotate_copy + cpp/algorithm/rotate_copy + + (T... args) + + + T + set_new_handler + cpp/memory/new/set_new_handler + + (T... args) + + + T + undeclare_no_pointers + cpp/memory/gc/undeclare_no_pointers + + (T... args) + + std::wifstream + + T + async + cpp/thread/async + + (T... args) + + + T + partition_point + cpp/algorithm/partition_point + + (T... args) + + std::moneypunct_byname + + T + vsscanf + cpp/io/c/vfscanf + + (T... args) + + std::terminate_handler + std::ctype_base + std::reference_wrapper + + T + fesetround + cpp/numeric/fenv/feround + + (T... args) + + + T + atomic_is_lock_free + cpp/atomic/atomic_is_lock_free + + (T... args) + + std::ranlux48_base + + T + tanh + cpp/numeric/math/tanh + + (T... args) + + std::bit_not + std::int_fast16_t + + T + ldiv + cpp/numeric/math/div + + (T... args) + + + T + setbase + cpp/io/manip/setbase + + (T... args) + + + T + remove + cpp/algorithm/remove + + (T... args) + + + T + strtol + cpp/string/byte/strtol + + (T... args) + + + T + strpbrk + cpp/string/byte/strpbrk + + (T... args) + + std::error_category + std::regex_traits + + T + signbit + cpp/numeric/math/signbit + + (T... args) + + + T + wcsncat + cpp/string/wide/wcsncat + + (T... args) + + + T + get_money + cpp/io/manip/get_money + + (T... args) + + std::regex_constants + + T + set_difference + cpp/algorithm/set_difference + + (T... args) + + std::negative_binomial_distribution + + T + cref + cpp/utility/functional/ref + + (T... args) + + std::is_union + + T + getline + cpp/string/basic_string/getline + + (T... args) + + std::mt19937 + std::enable_if + + T + to_wstring + cpp/string/basic_string/to_wstring + + (T... args) + + std::chi_squared_distribution + std::add_rvalue_reference + + T + system + cpp/utility/program/system + + (T... args) + + + T + static_pointer_cast + cpp/memory/shared_ptr/pointer_cast + + (T... args) + + std::basic_istream + std::ostream_iterator + + T + wcstoumax + cpp/string/wide/wcstoimax + + (T... args) + + + T + memmove + cpp/string/byte/memmove + + (T... args) + + + T + getwchar + cpp/io/c/getwchar + + (T... args) + + + T + scientific + cpp/io/manip/fixed + + (T... args) + + + T + wcsftime + cpp/chrono/c/wcsftime + + (T... args) + + + T + begin + cpp/iterator/begin + + (T... args) + + + T + ceil + cpp/numeric/math/ceil + + (T... args) + + + T + sinh + cpp/numeric/math/sinh + + (T... args) + + + T + is_permutation + cpp/algorithm/is_permutation + + (T... args) + + std::is_trivially_copy_assignable + + T + generate_n + cpp/algorithm/generate_n + + (T... args) + + + T + acosh + cpp/numeric/math/acosh + + (T... args) + + std::clog + std::is_scalar + + T + advance + cpp/iterator/advance + + (T... args) + + std::uses_allocator + std::piecewise_linear_distribution + std::hash + + T + flush + cpp/io/manip/flush + + (T... args) + + std::shuffle_order_engine + std::chrono + std::greater + std::csub_match + std::uintmax_t + + T + atomic_fetch_xor + cpp/atomic/atomic_fetch_xor + + (T... args) + + std::remove_pointer + std::numeric_limits + + T + ws + cpp/io/manip/ws + + (T... args) + + std::add_volatile + std::once_flag + std::is_literal_type + std::money_base + + T + signal + cpp/utility/program/signal + + (T... args) + + + T + noshowbase + cpp/io/manip/showbase + + (T... args) + + std::peta + std::is_placeholder + + T + generate + cpp/algorithm/generate + + (T... args) + + + T + ldexp + cpp/numeric/math/ldexp + + (T... args) + + std::add_const + std::basic_stringbuf + std::tm + std::is_abstract + std::deque + + T + vsnprintf + cpp/io/c/vfprintf + + (T... args) + + std::allocator + + T + remove_if + cpp/algorithm/remove + + (T... args) + + std::scoped_allocator_adaptor + std::ssub_match + + T + stoull + cpp/string/basic_string/stoul + + (T... args) + + std::messages_byname + + T + fegetexceptflag + cpp/numeric/fenv/feexceptflag + + (T... args) + + + T + find_if_not + cpp/algorithm/find + + (T... args) + + std::promise + + T + merge + cpp/algorithm/merge + + (T... args) + + + T + free + cpp/memory/c/free + + (T... args) + + + T + count_if + cpp/algorithm/count + + (T... args) + + + T + clock + cpp/chrono/c/clock + + (T... args) + + + T + mktime + cpp/chrono/c/mktime + + (T... args) + + std::add_pointer + std::uintptr_t + + T + inserter + cpp/iterator/inserter + + (T... args) + + + T + puts + cpp/io/c/puts + + (T... args) + + std::bit_and + + T + asin + cpp/numeric/math/asin + + (T... args) + + std::uniform_int_distribution + std::type_info + + T + iscntrl + cpp/string/byte/iscntrl + + (T... args) + + + T + difftime + cpp/chrono/c/difftime + + (T... args) + + + T + terminate + cpp/error/terminate + + (T... args) + + + T + memcmp + cpp/string/byte/memcmp + + (T... args) + + std::fisher_f_distribution + + T + uninitialized_fill + cpp/memory/uninitialized_fill + + (T... args) + + std::strstream + + T + hex + cpp/io/manip/hex + + (T... args) + + + T + tie + cpp/utility/tuple/tie + + (T... args) + + + T + back_inserter + cpp/iterator/back_inserter + + (T... args) + + + T + upper_bound + cpp/algorithm/upper_bound + + (T... args) + + std::time_get_byname + std::basic_streambuf + + T + adjacent_find + cpp/algorithm/adjacent_find + + (T... args) + + std::is_nothrow_constructible + + T + use_facet + cpp/locale/use_facet + + (T... args) + + std::queue + std::is_base_of + std::intmax_t + std::ranlux24 + + T + vfwprintf + cpp/io/c/vfwprintf + + (T... args) + + + T + atomic_fetch_add + cpp/atomic/atomic_fetch_add + + (T... args) + + std::remove_cv + + T + fsetpos + cpp/io/c/fsetpos + + (T... args) + + + T + malloc + cpp/memory/c/malloc + + (T... args) + + + T + localtime + cpp/chrono/c/localtime + + (T... args) + + std::is_trivially_destructible + std::wcin + + T + wcscmp + cpp/string/wide/wcscmp + + (T... args) + + + T + c32rtomb + cpp/string/multibyte/c32rtomb + + (T... args) + + + T + isupper + cpp/string/byte/isupper + + (T... args) + + std::atomic + std::basic_stringstream + + T + wcstod + cpp/string/wide/wcstof + + (T... args) + + + T + tolower + cpp/string/byte/tolower + + (T... args) + + std::is_void + + T + sort_heap + cpp/algorithm/sort_heap + + (T... args) + + std::plus + + T + isdigit + cpp/string/byte/isdigit + + (T... args) + + std::bitset + + T + wcslen + cpp/string/wide/wcslen + + (T... args) + + + T + wmemcmp + cpp/string/wide/wmemcmp + + (T... args) + + std::FILE + + T + move_if_noexcept + cpp/utility/move_if_noexcept + + (T... args) + + + T + declval + cpp/utility/declval + + (T... args) + + + T + fpclassify + cpp/numeric/math/fpclassify + + (T... args) + + + T + iswupper + cpp/string/wide/iswupper + + (T... args) + + std::thread + std::future_error + std::time_base + std::alignment_of + std::time_put + std::bit_or + + T + rand + cpp/numeric/random/rand + + (T... args) + + + T + atomic_compare_exchange_weak_explicit + cpp/atomic/atomic_compare_exchange + + (T... args) + + std::pointer_traits + + T + partial_sort + cpp/algorithm/partial_sort + + (T... args) + + std::basic_string + + T + llrint + cpp/numeric/math/rint + + (T... args) + + std::priority_queue + + T + fclose + cpp/io/c/fclose + + (T... args) + + + T + reverse + cpp/algorithm/reverse + + (T... args) + + std::exa + + T + partial_sum + cpp/algorithm/partial_sum + + (T... args) + + std::wostringstream + + T + showbase + cpp/io/manip/showbase + + (T... args) + + std::is_default_constructible + std::cregex_iterator + + T + vswscanf + cpp/io/c/vfwscanf + + (T... args) + + std::wstring + + T + atan + cpp/numeric/math/atan + + (T... args) + + + T + atanh + cpp/numeric/math/atanh + + (T... args) + + std::remove_all_extents + + T + iter_swap + cpp/algorithm/iter_swap + + (T... args) + + + T + scalbln + cpp/numeric/math/scalbn + + (T... args) + + std::istrstream + + T + reverse_copy + cpp/algorithm/reverse_copy + + (T... args) + + std::unary_negate + std::unordered_multiset + std::basic_ostream + std::wsregex_iterator + std::uint_fast16_t + std::is_nothrow_assignable + + T + forward + cpp/utility/forward + + (T... args) + + std::moneypunct + + T + getc + cpp/io/c/fgetc + + (T... args) + + std::type_index + + T + equal_range + cpp/algorithm/equal_range + + (T... args) + + + T + atomic_fetch_sub + cpp/atomic/atomic_fetch_sub + + (T... args) + + + T + is_partitioned + cpp/algorithm/is_partitioned + + (T... args) + + + T + next_permutation + cpp/algorithm/next_permutation + + (T... args) + + + T + isblank + cpp/string/byte/isblank + + (T... args) + + + T + noshowpoint + cpp/io/manip/showpoint + + (T... args) + + + T + atan2 + cpp/numeric/math/atan2 + + (T... args) + + + T + nanf + cpp/numeric/math/nan + + (T... args) + + + T + towctrans + cpp/string/wide/towctrans + + (T... args) + + std::is_standard_layout + std::timed_mutex + + T + right + cpp/io/manip/left + + (T... args) + + + T + fputwc + cpp/io/c/fputwc + + (T... args) + + + T + strtoul + cpp/string/byte/strtoul + + (T... args) + + + T + is_heap + cpp/algorithm/is_heap + + (T... args) + + std::bad_exception + + T + fflush + cpp/io/c/fflush + + (T... args) + + + T + strtoumax + cpp/string/byte/strtoimax + + (T... args) + + + T + nexttoward + cpp/numeric/math/nextafter + + (T... args) + + std::int_fast64_t + std::function + + T + nounitbuf + cpp/io/manip/unitbuf + + (T... args) + + std::bad_cast + std::error_condition + std::filebuf + std::int_least16_t + + T + ispunct + cpp/string/byte/ispunct + + (T... args) + + std::istreambuf_iterator + std::u16string + + T + noboolalpha + cpp/io/manip/boolalpha + + (T... args) + + + T + make_pair + cpp/utility/pair/make_pair + + (T... args) + + std::is_error_condition_enum + std::is_nothrow_destructible + std::wiostream + + T + iswctype + cpp/string/wide/iswctype + + (T... args) + + std::allocator_arg_t + + T + srand + cpp/numeric/random/srand + + (T... args) + + std::rel_ops + std::uint_least32_t + std::collate + + T + replace_copy + cpp/algorithm/replace_copy + + (T... args) + + + T + future_category + cpp/thread/future/future_category + + (T... args) + + std::remove_const + + T + resetiosflags + cpp/io/manip/resetiosflags + + (T... args) + + + T + vprintf + cpp/io/c/vfprintf + + (T... args) + + std::u32string + std::uint_fast32_t + + T + gmtime + cpp/chrono/c/gmtime + + (T... args) + + std::is_lvalue_reference + + T + align + cpp/memory/align + + (T... args) + + + T + tuple_cat + cpp/utility/tuple/tuple_cat + + (T... args) + + + T + ends + cpp/io/manip/ends + + (T... args) + + + T + set_terminate + cpp/error/set_terminate + + (T... args) + + + T + lrint + cpp/numeric/math/rint + + (T... args) + + std::complex + std::ofstream + std::insert_iterator + std::bad_array_length + + T + none_of + cpp/algorithm/all_any_none_of + + (T... args) + + std::this_thread + + T + wscanf + cpp/io/c/fwscanf + + (T... args) + + + T + fputc + cpp/io/c/fputc + + (T... args) + + + T + dec + cpp/io/manip/hex + + (T... args) + + + T + strcat + cpp/string/byte/strcat + + (T... args) + + std::is_trivially_copyable + std::basic_istringstream + std::basic_ifstream + std::list + + T + raise + cpp/utility/program/raise + + (T... args) + + std::minus + + T + wcsspn + cpp/string/wide/wcsspn + + (T... args) + + + T + fabs + cpp/numeric/math/fabs + + (T... args) + + + T + wmemcpy + cpp/string/wide/wmemcpy + + (T... args) + + + T + copy_n + cpp/algorithm/copy_n + + (T... args) + + std::map + std::linear_congruential_engine + + T + rethrow_if_nested + cpp/error/rethrow_if_nested + + (T... args) + + + T + setlocale + cpp/locale/setlocale + + (T... args) + + std::codecvt_utf16 + + T + addressof + cpp/memory/addressof + + (T... args) + + + T + calloc + cpp/memory/c/calloc + + (T... args) + + std::cmatch + + T + strerror + cpp/string/byte/strerror + + (T... args) + + std::defer_lock_t + + T + strcpy + cpp/string/byte/strcpy + + (T... args) + + std::exception + + T + wcstoull + cpp/string/wide/wcstoul + + (T... args) + + + T + c16rtomb + cpp/string/multibyte/c16rtomb + + (T... args) + + std::front_insert_iterator + + T + generate_canonical + cpp/numeric/random/generate_canonical + + (T... args) + + + T + vfprintf + cpp/io/c/vfprintf + + (T... args) + + + T + notify_all_at_thread_exit + cpp/thread/notify_all_at_thread_exit + + (T... args) + + + T + rotate + cpp/algorithm/rotate + + (T... args) + + + T + current_exception + cpp/error/current_exception + + (T... args) + + + T + strtok + cpp/string/byte/strtok + + (T... args) + + + T + wcscat + cpp/string/wide/wcscat + + (T... args) + + + T + strncpy + cpp/string/byte/strncpy + + (T... args) + + + T + towlower + cpp/string/wide/towlower + + (T... args) + + + T + floor + cpp/numeric/math/floor + + (T... args) + + std::zetta + + T + left + cpp/io/manip/left + + (T... args) + + + T + ferror + cpp/io/c/ferror + + (T... args) + + std::streambuf + + T + atomic_load_explicit + cpp/atomic/atomic_load + + (T... args) + + std::experimental + std::num_put + + T + swap + cpp/algorithm/swap + + (T... args) + + + T + acos + cpp/numeric/math/acos + + (T... args) + + std::owner_less + + T + wcscoll + cpp/string/wide/wcscoll + + (T... args) + + + T + sqrt + cpp/numeric/math/sqrt + + (T... args) + + std::extent + + T + mbsinit + cpp/string/multibyte/mbsinit + + (T... args) + + std::bad_optional_access + + T + qsort + cpp/algorithm/qsort + + (T... args) + + + T + stoll + cpp/string/basic_string/stol + + (T... args) + + + T + put_money + cpp/io/manip/put_money + + (T... args) + + + T + wcstoul + cpp/string/wide/wcstoul + + (T... args) + + + T + wcstol + cpp/string/wide/wcstol + + (T... args) + + + T + atexit + cpp/utility/program/atexit + + (T... args) + + + T + atomic_fetch_or + cpp/atomic/atomic_fetch_or + + (T... args) + + + T + rewind + cpp/io/c/rewind + + (T... args) + + + T + wcsxfrm + cpp/string/wide/wcsxfrm + + (T... args) + + std::yotta + std::wcregex_token_iterator + + T + round + cpp/numeric/math/round + + (T... args) + + std::uint64_t + std::messages + + T + vwprintf + cpp/io/c/vfwprintf + + (T... args) + + + T + all_of + cpp/algorithm/all_any_none_of + + (T... args) + + std::regex_token_iterator + + T + replace + cpp/algorithm/replace + + (T... args) + + std::move_iterator + + T + remquo + cpp/numeric/math/remquo + + (T... args) + + + T + setbuf + cpp/io/c/setbuf + + (T... args) + + std::messages_base + + T + strncmp + cpp/string/byte/strncmp + + (T... args) + + + T + localeconv + cpp/locale/localeconv + + (T... args) + + + T + wctrans + cpp/string/wide/wctrans + + (T... args) + + std::istringstream + std::giga + + T + any_of + cpp/algorithm/all_any_none_of + + (T... args) + + std::integer_sequence + + T + equal + cpp/algorithm/equal + + (T... args) + + + T + max + cpp/algorithm/max + + (T... args) + + + T + strxfrm + cpp/string/byte/strxfrm + + (T... args) + + std::has_virtual_destructor + std::max_align_t + std::remove_volatile + std::underlying_type + + T + iswxdigit + cpp/string/wide/iswxdigit + + (T... args) + + + T + labs + cpp/numeric/math/abs + + (T... args) + + std::hecto + + T + regex_match + cpp/regex/regex_match + + (T... args) + + std::is_member_object_pointer + std::exception_ptr + + T + fputws + cpp/io/c/fputws + + (T... args) + + + T + wcrtomb + cpp/string/multibyte/wcrtomb + + (T... args) + + + T + setprecision + cpp/io/manip/setprecision + + (T... args) + + + T + setvbuf + cpp/io/c/setvbuf + + (T... args) + + std::nested_exception + std::random_access_iterator_tag + + T + regex_replace + cpp/regex/regex_replace + + (T... args) + + std::ctype + + T + freopen + cpp/io/c/freopen + + (T... args) + + + T + logb + cpp/numeric/math/logb + + (T... args) + + std::time_t + + T + wctob + cpp/string/multibyte/wctob + + (T... args) + + std::knuth_b + + T + atomic_load + cpp/atomic/atomic_load + + (T... args) + + + T + search_n + cpp/algorithm/search_n + + (T... args) + + + T + toupper + cpp/string/byte/toupper + + (T... args) + + std::auto_ptr + + T + move_backward + cpp/algorithm/move_backward + + (T... args) + + + T + is_sorted + cpp/algorithm/is_sorted + + (T... args) + + std::minstd_rand0 + + T + strtoull + cpp/string/byte/strtoul + + (T... args) + + std::sregex_token_iterator + std::logical_not + std::fpos_t + + T + iswblank + cpp/string/wide/iswblank + + (T... args) + + std::istream + std::seed_seq + std::default_delete + std::femto + std::clock_t + std::true_type + + T + get_pointer_safety + cpp/memory/gc/get_pointer_safety + + (T... args) + + std::mbstate_t + + T + get_unexpected + cpp/error/get_unexpected + + (T... args) + + + T + sscanf + cpp/io/c/fscanf + + (T... args) + + std::ostrstream + std::gamma_distribution + std::bad_weak_ptr + std::output_iterator_tag + std::micro + std::is_trivial + + T + fesetenv + cpp/numeric/fenv/feenv + + (T... args) + + + T + atomic_store_explicit + cpp/atomic/atomic_store + + (T... args) + + + T + strtold + cpp/string/byte/strtof + + (T... args) + + + T + fread + cpp/io/c/fread + + (T... args) + + std::packaged_task + std::unordered_set + std::is_volatile + + T + memchr + cpp/string/byte/memchr + + (T... args) + + + T + btowc + cpp/string/multibyte/btowc + + (T... args) + + std::wfstream + + T + replace_if + cpp/algorithm/replace + + (T... args) + + std::multimap + + T + strcoll + cpp/string/byte/strcoll + + (T... args) + + + T + vsprintf + cpp/io/c/vfprintf + + (T... args) + + + T + mismatch + cpp/algorithm/mismatch + + (T... args) + + + T + getchar + cpp/io/c/getchar + + (T... args) + + std::atomic_flag + + T + islower + cpp/string/byte/islower + + (T... args) + + + T + tmpnam + cpp/io/c/tmpnam + + (T... args) + + std::numpunct_byname + + T + nanl + cpp/numeric/math/nan + + (T... args) + + std::binomial_distribution + + T + fopen + cpp/io/c/fopen + + (T... args) + + std::basic_iostream + std::wofstream + std::fpos + std::underflow_error + + T + for_each + cpp/algorithm/for_each + + (T... args) + + + T + fegetround + cpp/numeric/fenv/feround + + (T... args) + + + T + ungetc + cpp/io/c/ungetc + + (T... args) + + std::cauchy_distribution + std::is_trivially_copy_constructible + std::conditional + std::is_pod + + T + internal + cpp/io/manip/left + + (T... args) + + + T + vfwscanf + cpp/io/c/vfwscanf + + (T... args) + + std::int_least8_t + + T + fgetc + cpp/io/c/fgetc + + (T... args) + + std::streamoff + std::is_move_assignable + std::int_least32_t + + T + wcstof + cpp/string/wide/wcstof + + (T... args) + + std::wstringstream + std::subtract_with_carry_engine + std::regex_error + + T + bind + cpp/utility/functional/bind + + (T... args) + + + T + skipws + cpp/io/manip/skipws + + (T... args) + + std::is_constructible + std::piecewise_construct_t + + T + iswprint + cpp/string/wide/iswprint + + (T... args) + + + T + wcstombs + cpp/string/multibyte/wcstombs + + (T... args) + + + T + inplace_merge + cpp/algorithm/inplace_merge + + (T... args) + + + T + copysign + cpp/numeric/math/copysign + + (T... args) + + + T + putwchar + cpp/io/c/putwchar + + (T... args) + + std::mutex + + T + wcsstr + cpp/string/wide/wcsstr + + (T... args) + + + T + fegetenv + cpp/numeric/fenv/feenv + + (T... args) + + + T + longjmp + cpp/utility/program/longjmp + + (T... args) + + + T + iswcntrl + cpp/string/wide/iswcntrl + + (T... args) + + std::system_error + + T + declare_no_pointers + cpp/memory/gc/declare_no_pointers + + (T... args) + + + T + isnormal + cpp/numeric/math/isnormal + + (T... args) + + + T + swap_ranges + cpp/algorithm/swap_ranges + + (T... args) + + std::wistringstream + std::is_floating_point + + T + minmax + cpp/algorithm/minmax + + (T... args) + + + T + defaultfloat + cpp/io/manip/fixed + + (T... args) + + + T + rename + cpp/io/c/rename + + (T... args) + + + T + snprintf + cpp/io/c/fprintf + + (T... args) + + + T + try_lock + cpp/thread/try_lock + + (T... args) + + std::ratio_not_equal + std::ratio_multiply + std::result_of + std::is_fundamental + + T + stoul + cpp/string/basic_string/stoul + + (T... args) + + std::ifstream + std::u32streampos + + T + fgetpos + cpp/io/c/fgetpos + + (T... args) + + std::length_error + + T + partition_copy + cpp/algorithm/partition_copy + + (T... args) + + + T + vscanf + cpp/io/c/vfscanf + + (T... args) + + + T + front_inserter + cpp/iterator/front_inserter + + (T... args) + + std::sub_match + std::common_type + + T + get_terminate + cpp/error/get_terminate + + (T... args) + + + T + cosh + cpp/numeric/math/cosh + + (T... args) + + std::shared_timed_mutex + std::array + std::random_device + std::default_random_engine + std::raw_storage_iterator + std::is_convertible + + T + prev + cpp/iterator/prev + + (T... args) + + std::uint16_t + + T + strchr + cpp/string/byte/strchr + + (T... args) + + std::is_array + + T + strstr + cpp/string/byte/strstr + + (T... args) + + std::mega + + T + printf + cpp/io/c/fprintf + + (T... args) + + std::numpunct + std::money_put + std::new_handler + std::is_member_function_pointer + + T + setfill + cpp/io/manip/setfill + + (T... args) + + + T + inner_product + cpp/algorithm/inner_product + + (T... args) + + + + std::is_function + cpp/types/is_function + + + std::input_iterator_tag + cpp/iterator/iterator_tags + + + std::logical_and + cpp/utility/functional/logical_and + + T + operator() + cpp/utility/functional/logical_and + + (T... args) + + + + std::is_integral + cpp/types/is_integral + + + std::money_get + cpp/locale/money_get + + T + do_get + cpp/locale/money_get/get + + (T... args) + + std::money_get::char_type + std::money_get::pattern + + T + get + cpp/locale/money_get/get + + (T... args) + + + T + ~money_get + cpp/locale/money_get/~money_get + + (T... args) + + std::money_get::string_type + std::money_get::iter_type + + T + money_get + cpp/locale/money_get/money_get + + (T... args) + + + + std::money_get::char_type + cpp/locale/money_get + + + std::money_get::pattern + cpp/locale/money_base + + + std::money_get::string_type + cpp/locale/money_get + + + std::money_get::iter_type + cpp/locale/money_get + + + std::basic_ofstream + cpp/io/basic_ofstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + basic_ofstream + cpp/io/basic_ofstream/basic_ofstream + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::basic_ofstream::event_callback + + T + open + cpp/io/basic_ofstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ofstream/close + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_ofstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ofstream/is_open + + (T... args) + + + T + operator= + cpp/io/basic_ofstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::basic_ofstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_ofstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_ofstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_ofstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::ratio_subtract + cpp/numeric/ratio/ratio_subtract + + + std::size_t + cpp/types/size_t + + + std::ctype_byname + cpp/locale/ctype_byname + + T + ~ctype_byname + cpp/locale/ctype_byname + + (T... args) + + + T + ctype_byname + cpp/locale/ctype_byname + + (T... args) + + + T + do_toupper + cpp/locale/ctype/toupper + + (T... args) + + + T + toupper + cpp/locale/ctype/toupper + + (T... args) + + + T + do_scan_is + cpp/locale/ctype/scan_is + + (T... args) + + + T + do_tolower + cpp/locale/ctype/tolower + + (T... args) + + + T + do_narrow + cpp/locale/ctype/narrow + + (T... args) + + + T + widen + cpp/locale/ctype/widen + + (T... args) + + + T + is + cpp/locale/ctype/is + + (T... args) + + + T + scan_is + cpp/locale/ctype/scan_is + + (T... args) + + + T + tolower + cpp/locale/ctype/tolower + + (T... args) + + + T + do_is + cpp/locale/ctype/is + + (T... args) + + + T + narrow + cpp/locale/ctype/narrow + + (T... args) + + std::ctype_byname::mask + + T + do_widen + cpp/locale/ctype/widen + + (T... args) + + + + std::ctype_byname::mask + cpp/locale/ctype_base + + + std::wcout + cpp/io/basic_ostream + + + std::fstream + cpp/io/basic_fstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + open + cpp/io/basic_fstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + fstream + cpp/io/basic_fstream/basic_fstream + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::fstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::fstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + close + cpp/io/basic_fstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::fstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_fstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_fstream/operator= + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::fstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::fstream::event_callback + cpp/io/ios_base/event_callback + + + std::fstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::valarray + cpp/numeric/valarray + + + std::ratio_greater_equal + cpp/numeric/ratio/ratio_greater_equal + + + std::remove_extent + cpp/types/remove_extent + + + std::ratio_greater + cpp/numeric/ratio/ratio_greater + + + std::intptr_t + cpp/types/integer + + + std::regex_iterator + cpp/regex/regex_iterator + + T + operator!= + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + regex_iterator + cpp/regex/regex_iterator/regex_iterator + + (T... args) + + + T + operator++ + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + + std::lock_guard + cpp/thread/lock_guard + + T + ~lock_guard + cpp/thread/lock_guard/~lock_guard + + (T... args) + + + T + lock_guard + cpp/thread/lock_guard/lock_guard + + (T... args) + + + + std::wbuffer_convert + cpp/locale/wbuffer_convert + + T + state + cpp/locale/wbuffer_convert/state + + (T... args) + + + T + wbuffer_convert + cpp/locale/wbuffer_convert/wbuffer_convert + + (T... args) + + + T + rdbuf + cpp/locale/wbuffer_convert/rdbuf + + (T... args) + + + T + ~wbuffer_convert + cpp/locale/wbuffer_convert/~wbuffer_convert + + (T... args) + + + + std::modulus + cpp/utility/functional/modulus + + T + operator() + cpp/utility/functional/modulus + + (T... args) + + + + std::ratio_divide + cpp/numeric/ratio/ratio_divide + + + std::ostreambuf_iterator + cpp/iterator/ostreambuf_iterator + + + std::dynarray + cpp/container/dynarray + + T + rbegin + cpp/container/dynarray/rbegin + + (T... args) + + + T + crend + cpp/container/dynarray/rend + + (T... args) + + + T + begin + cpp/container/dynarray/begin + + (T... args) + + + T + data + cpp/container/dynarray/data + + (T... args) + + + T + at + cpp/container/dynarray/at + + (T... args) + + + T + back + cpp/container/dynarray/back + + (T... args) + + + T + end + cpp/container/dynarray/end + + (T... args) + + + T + fill + cpp/container/dynarray/fill + + (T... args) + + + T + empty + cpp/container/dynarray/empty + + (T... args) + + + T + size + cpp/container/dynarray/size + + (T... args) + + + T + cend + cpp/container/dynarray/end + + (T... args) + + + T + ~dynarray + cpp/container/dynarray/~dynarray + + (T... args) + + + T + max_size + cpp/container/dynarray/max_size + + (T... args) + + + T + rend + cpp/container/dynarray/rend + + (T... args) + + + T + front + cpp/container/dynarray/front + + (T... args) + + + T + dynarray + cpp/container/dynarray/dynarray + + (T... args) + + + T + operator[] + cpp/container/dynarray/operator_at + + (T... args) + + + T + crbegin + cpp/container/dynarray/rbegin + + (T... args) + + + T + cbegin + cpp/container/dynarray/begin + + (T... args) + + + + std::is_nothrow_move_constructible + cpp/types/is_move_constructible + + + std::vector + cpp/container/vector + + T + push_back + cpp/container/vector/push_back + + (T... args) + + + T + crbegin + cpp/container/vector/rbegin + + (T... args) + + + T + erase + cpp/container/vector/erase + + (T... args) + + + T + data + cpp/container/vector/data + + (T... args) + + + T + insert + cpp/container/vector/insert + + (T... args) + + + T + pop_back + cpp/container/vector/pop_back + + (T... args) + + + T + shrink_to_fit + cpp/container/vector/shrink_to_fit + + (T... args) + + + T + back + cpp/container/vector/back + + (T... args) + + + T + end + cpp/container/vector/end + + (T... args) + + + T + resize + cpp/container/vector/resize + + (T... args) + + + T + emplace_back + cpp/container/vector/emplace_back + + (T... args) + + + T + size + cpp/container/vector/size + + (T... args) + + + T + cbegin + cpp/container/vector/begin + + (T... args) + + + T + front + cpp/container/vector/front + + (T... args) + + + T + ~vector + cpp/container/vector/~vector + + (T... args) + + + T + rbegin + cpp/container/vector/rbegin + + (T... args) + + + T + crend + cpp/container/vector/rend + + (T... args) + + + T + assign + cpp/container/vector/assign + + (T... args) + + + T + operator= + cpp/container/vector/operator= + + (T... args) + + + T + vector + cpp/container/vector/vector + + (T... args) + + + T + reserve + cpp/container/vector/reserve + + (T... args) + + + T + capacity + cpp/container/vector/capacity + + (T... args) + + + T + empty + cpp/container/vector/empty + + (T... args) + + + T + cend + cpp/container/vector/end + + (T... args) + + + T + swap + cpp/container/vector/swap + + (T... args) + + + T + max_size + cpp/container/vector/max_size + + (T... args) + + + T + rend + cpp/container/vector/rend + + (T... args) + + + T + get_allocator + cpp/container/vector/get_allocator + + (T... args) + + + T + clear + cpp/container/vector/clear + + (T... args) + + + T + at + cpp/container/vector/at + + (T... args) + + + T + emplace + cpp/container/vector/emplace + + (T... args) + + + T + operator[] + cpp/container/vector/operator_at + + (T... args) + + + T + begin + cpp/container/vector/begin + + (T... args) + + + + std::match_results + cpp/regex/match_results + + T + cbegin + cpp/regex/match_results/begin + + (T... args) + + + T + format + cpp/regex/match_results/format + + (T... args) + + + T + ~match_results + cpp/regex/match_results/~match_results + + (T... args) + + + T + size + cpp/regex/match_results/size + + (T... args) + + + T + swap + cpp/regex/match_results/swap + + (T... args) + + + T + position + cpp/regex/match_results/position + + (T... args) + + + T + prefix + cpp/regex/match_results/prefix + + (T... args) + + + T + str + cpp/regex/match_results/str + + (T... args) + + + T + begin + cpp/regex/match_results/begin + + (T... args) + + + T + empty + cpp/regex/match_results/empty + + (T... args) + + + T + suffix + cpp/regex/match_results/suffix + + (T... args) + + + T + get_allocator + cpp/regex/match_results/get_allocator + + (T... args) + + + T + end + cpp/regex/match_results/end + + (T... args) + + + T + match_results + cpp/regex/match_results/match_results + + (T... args) + + + T + ready + cpp/regex/match_results/ready + + (T... args) + + + T + cend + cpp/regex/match_results/end + + (T... args) + + + T + operator[] + cpp/regex/match_results/operator_at + + (T... args) + + + T + length + cpp/regex/match_results/length + + (T... args) + + + T + max_size + cpp/regex/match_results/max_size + + (T... args) + + + + std::back_insert_iterator + cpp/iterator/back_insert_iterator + + + std::iterator + cpp/iterator/iterator + + + std::int8_t + cpp/types/integer + + + std::student_t_distribution + cpp/numeric/random/student_t_distribution + + T + n + cpp/numeric/random/student_t_distribution/n + + (T... args) + + + T + reset + cpp/numeric/random/student_t_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/student_t_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/student_t_distribution/operator() + + (T... args) + + + T + student_t_distribution + cpp/numeric/random/student_t_distribution/student_t_distribution + + (T... args) + + + T + param + cpp/numeric/random/student_t_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/student_t_distribution/min + + (T... args) + + + + std::mt19937_64 + cpp/numeric/random/mersenne_twister_engine + + T + discard + cpp/numeric/random/mersenne_twister_engine/discard + + (T... args) + + + T + mt19937_64 + cpp/numeric/random/mersenne_twister_engine/mersenne_twister_engine + + (T... args) + + + T + max + cpp/numeric/random/mersenne_twister_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/mersenne_twister_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/mersenne_twister_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/mersenne_twister_engine/min + + (T... args) + + + + std::runtime_error + cpp/error/runtime_error + + T + runtime_error + cpp/error/runtime_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ranlux24_base + cpp/numeric/random/subtract_with_carry_engine + + T + discard + cpp/numeric/random/subtract_with_carry_engine/discard + + (T... args) + + + T + ranlux24_base + cpp/numeric/random/subtract_with_carry_engine/subtract_with_carry_engine + + (T... args) + + + T + max + cpp/numeric/random/subtract_with_carry_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/subtract_with_carry_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/subtract_with_carry_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/subtract_with_carry_engine/min + + (T... args) + + + + std::allocator_traits + cpp/memory/allocator_traits + + T + destroy + cpp/memory/allocator_traits/destroy + + (T... args) + + + T + select_on_container_copy_construction + cpp/memory/allocator_traits/select_on_container_copy_construction + + (T... args) + + + T + max_size + cpp/memory/allocator_traits/max_size + + (T... args) + + + T + allocate + cpp/memory/allocator_traits/allocate + + (T... args) + + + T + deallocate + cpp/memory/allocator_traits/deallocate + + (T... args) + + + T + construct + cpp/memory/allocator_traits/construct + + (T... args) + + + + std::codecvt + cpp/locale/codecvt + std::codecvt::extern_type + + T + out + cpp/locale/codecvt/out + + (T... args) + + + T + do_length + cpp/locale/codecvt/length + + (T... args) + + + T + always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + do_encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + do_in + cpp/locale/codecvt/in + + (T... args) + + + T + unshift + cpp/locale/codecvt/unshift + + (T... args) + + std::codecvt::state_type + + T + max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + codecvt + cpp/locale/codecvt/codecvt + + (T... args) + + + T + do_unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + do_out + cpp/locale/codecvt/out + + (T... args) + + + T + do_max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + do_always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + in + cpp/locale/codecvt/in + + (T... args) + + std::codecvt::intern_type + + T + length + cpp/locale/codecvt/length + + (T... args) + + + T + ~codecvt + cpp/locale/codecvt/~codecvt + + (T... args) + + + + std::codecvt::extern_type + cpp/locale/codecvt + + + std::codecvt::state_type + cpp/locale/codecvt + + + std::codecvt::intern_type + cpp/locale/codecvt + + + std::ratio_less_equal + cpp/numeric/ratio/ratio_less_equal + + + std::condition_variable_any + cpp/thread/condition_variable_any + + T + condition_variable_any + cpp/thread/condition_variable_any/condition_variable_any + + (T... args) + + + T + notify_one + cpp/thread/condition_variable_any/notify_one + + (T... args) + + + T + wait_for + cpp/thread/condition_variable_any/wait_for + + (T... args) + + + T + native_handle + cpp/thread/condition_variable_any/native_handle + + (T... args) + + + T + notify_all + cpp/thread/condition_variable_any/notify_all + + (T... args) + + + T + ~condition_variable_any + cpp/thread/condition_variable_any/~condition_variable_any + + (T... args) + + + T + wait_until + cpp/thread/condition_variable_any/wait_until + + (T... args) + + + T + wait + cpp/thread/condition_variable_any/wait + + (T... args) + + + + std::deca + cpp/numeric/ratio/ratio + + + std::extreme_value_distribution + cpp/numeric/random/extreme_value_distribution + + T + max + cpp/numeric/random/extreme_value_distribution/max + + (T... args) + + + T + b + cpp/numeric/random/extreme_value_distribution/params + + (T... args) + + + T + a + cpp/numeric/random/extreme_value_distribution/params + + (T... args) + + + T + operator() + cpp/numeric/random/extreme_value_distribution/operator() + + (T... args) + + + T + extreme_value_distribution + cpp/numeric/random/extreme_value_distribution/extreme_value_distribution + + (T... args) + + + T + param + cpp/numeric/random/extreme_value_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/extreme_value_distribution/min + + (T... args) + + + T + reset + cpp/numeric/random/extreme_value_distribution/reset + + (T... args) + + + + std::cout + cpp/io/basic_ostream + + + std::decay + cpp/types/decay + + + std::is_trivially_move_assignable + cpp/types/is_move_assignable + + + std::adopt_lock_t + cpp/thread/lock_tag_t + + + std::wcerr + cpp/io/basic_ostream + + + std::lognormal_distribution + cpp/numeric/random/lognormal_distribution + + T + max + cpp/numeric/random/lognormal_distribution/max + + (T... args) + + + T + reset + cpp/numeric/random/lognormal_distribution/reset + + (T... args) + + + T + lognormal_distribution + cpp/numeric/random/lognormal_distribution/lognormal_distribution + + (T... args) + + + T + m + cpp/numeric/random/lognormal_distribution/params + + (T... args) + + + T + operator() + cpp/numeric/random/lognormal_distribution/operator() + + (T... args) + + + T + s + cpp/numeric/random/lognormal_distribution/params + + (T... args) + + + T + param + cpp/numeric/random/lognormal_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/lognormal_distribution/min + + (T... args) + + + + std::wclog + cpp/io/basic_ostream + + + std::char_traits + cpp/string/char_traits + + T + assign + cpp/string/char_traits/assign + + (T... args) + + + T + not_eof + cpp/string/char_traits/not_eof + + (T... args) + + + T + to_int_type + cpp/string/char_traits/to_int_type + + (T... args) + + + T + to_char_type + cpp/string/char_traits/to_char_type + + (T... args) + + + T + eq + cpp/string/char_traits/cmp + + (T... args) + + + T + copy + cpp/string/char_traits/copy + + (T... args) + + + T + length + cpp/string/char_traits/length + + (T... args) + + + T + lt + cpp/string/char_traits/cmp + + (T... args) + + + T + eof + cpp/string/char_traits/eof + + (T... args) + + + T + find + cpp/string/char_traits/find + + (T... args) + + + T + move + cpp/string/char_traits/move + + (T... args) + + + T + compare + cpp/string/char_traits/compare + + (T... args) + + + T + eq_int_type + cpp/string/char_traits/eq_int_type + + (T... args) + + + + std::remove_reference + cpp/types/remove_reference + + + std::num_get + cpp/locale/num_get + + T + do_get + cpp/locale/num_get/get + + (T... args) + + std::num_get::char_type + std::num_get::iter_type + + T + num_get + cpp/locale/num_get/num_get + + (T... args) + + + T + ~num_get + cpp/locale/num_get/~num_get + + (T... args) + + + T + get + cpp/locale/num_get/get + + (T... args) + + + + std::num_get::char_type + cpp/locale/num_get + + + std::num_get::iter_type + cpp/locale/num_get + + + std::is_pointer + cpp/types/is_pointer + + + std::multiset + cpp/container/multiset + + T + begin + cpp/container/multiset/begin + + (T... args) + + + T + erase + cpp/container/multiset/erase + + (T... args) + + + T + insert + cpp/container/multiset/insert + + (T... args) + + + T + swap + cpp/container/multiset/swap + + (T... args) + + + T + end + cpp/container/multiset/end + + (T... args) + + + T + emplace_hint + cpp/container/multiset/emplace_hint + + (T... args) + + + T + key_comp + cpp/container/multiset/key_comp + + (T... args) + + + T + cbegin + cpp/container/multiset/begin + + (T... args) + + + T + count + cpp/container/multiset/count + + (T... args) + + + T + find + cpp/container/multiset/find + + (T... args) + + + T + crbegin + cpp/container/multiset/rbegin + + (T... args) + + + T + multiset + cpp/container/multiset/multiset + + (T... args) + + + T + upper_bound + cpp/container/multiset/upper_bound + + (T... args) + + + T + rbegin + cpp/container/multiset/rbegin + + (T... args) + + + T + crend + cpp/container/multiset/rend + + (T... args) + + + T + size + cpp/container/multiset/size + + (T... args) + + + T + operator= + cpp/container/multiset/operator= + + (T... args) + + + T + ~multiset + cpp/container/multiset/~multiset + + (T... args) + + + T + value_comp + cpp/container/multiset/value_comp + + (T... args) + + + T + empty + cpp/container/multiset/empty + + (T... args) + + + T + lower_bound + cpp/container/multiset/lower_bound + + (T... args) + + + T + get_allocator + cpp/container/multiset/get_allocator + + (T... args) + + + T + max_size + cpp/container/multiset/max_size + + (T... args) + + + T + rend + cpp/container/multiset/rend + + (T... args) + + + T + cend + cpp/container/multiset/end + + (T... args) + + + T + clear + cpp/container/multiset/clear + + (T... args) + + + T + equal_range + cpp/container/multiset/equal_range + + (T... args) + + + T + emplace + cpp/container/multiset/emplace + + (T... args) + + + + std::weak_ptr + cpp/memory/weak_ptr + + T + operator= + cpp/memory/weak_ptr/operator= + + (T... args) + + + T + swap + cpp/memory/weak_ptr/swap + + (T... args) + + + T + weak_ptr + cpp/memory/weak_ptr/weak_ptr + + (T... args) + + + T + owner_before + cpp/memory/weak_ptr/owner_before + + (T... args) + + + T + ~weak_ptr + cpp/memory/weak_ptr/~weak_ptr + + (T... args) + + + T + use_count + cpp/memory/weak_ptr/use_count + + (T... args) + + + T + expired + cpp/memory/weak_ptr/expired + + (T... args) + + + T + lock + cpp/memory/weak_ptr/lock + + (T... args) + + + T + reset + cpp/memory/weak_ptr/reset + + (T... args) + + + + std::bidirectional_iterator_tag + cpp/iterator/iterator_tags + + + std::wstring_convert + cpp/locale/wstring_convert + + T + converted + cpp/locale/wstring_convert/converted + + (T... args) + + + T + to_bytes + cpp/locale/wstring_convert/to_bytes + + (T... args) + + + T + ~wstring_convert + cpp/locale/wstring_convert/~wstring_convert + + (T... args) + + + T + state + cpp/locale/wstring_convert/state + + (T... args) + + + T + wstring_convert + cpp/locale/wstring_convert/wstring_convert + + (T... args) + + + T + from_bytes + cpp/locale/wstring_convert/from_bytes + + (T... args) + + + + std::greater_equal + cpp/utility/functional/greater_equal + + T + operator() + cpp/utility/functional/greater_equal + + (T... args) + + + + std::is_trivially_constructible + cpp/types/is_constructible + + + std::string + cpp/string/basic_string + + T + push_back + cpp/string/basic_string/push_back + + (T... args) + + + T + shrink_to_fit + cpp/string/basic_string/shrink_to_fit + + (T... args) + + + T + rfind + cpp/string/basic_string/rfind + + (T... args) + + + T + begin + cpp/string/basic_string/begin + + (T... args) + + + T + erase + cpp/string/basic_string/erase + + (T... args) + + + T + append + cpp/string/basic_string/append + + (T... args) + + + T + data + cpp/string/basic_string/data + + (T... args) + + + T + insert + cpp/string/basic_string/insert + + (T... args) + + + T + assign + cpp/string/basic_string/assign + + (T... args) + + + T + find_first_not_of + cpp/string/basic_string/find_first_not_of + + (T... args) + + + T + back + cpp/string/basic_string/back + + (T... args) + + + T + end + cpp/string/basic_string/end + + (T... args) + + + T + resize + cpp/string/basic_string/resize + + (T... args) + + + T + copy + cpp/string/basic_string/copy + + (T... args) + + + T + find_last_of + cpp/string/basic_string/find_last_of + + (T... args) + + + T + pop_back + cpp/string/basic_string/pop_back + + (T... args) + + + T + replace + cpp/string/basic_string/replace + + (T... args) + + + T + front + cpp/string/basic_string/front + + (T... args) + + + T + substr + cpp/string/basic_string/substr + + (T... args) + + + T + find + cpp/string/basic_string/find + + (T... args) + + + T + compare + cpp/string/basic_string/compare + + (T... args) + + + T + crbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + cbegin + cpp/string/basic_string/begin + + (T... args) + + + T + find_first_of + cpp/string/basic_string/find_first_of + + (T... args) + + + T + rbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + crend + cpp/string/basic_string/rend + + (T... args) + + + T + size + cpp/string/basic_string/size + + (T... args) + + + T + operator= + cpp/string/basic_string/operator= + + (T... args) + + + T + find_last_not_of + cpp/string/basic_string/find_last_not_of + + (T... args) + + + T + reserve + cpp/string/basic_string/reserve + + (T... args) + + + T + capacity + cpp/string/basic_string/capacity + + (T... args) + + + T + c_str + cpp/string/basic_string/c_str + + (T... args) + + + T + empty + cpp/string/basic_string/empty + + (T... args) + + + T + cend + cpp/string/basic_string/end + + (T... args) + + + T + string + cpp/string/basic_string/basic_string + + (T... args) + + + T + max_size + cpp/string/basic_string/max_size + + (T... args) + + + T + rend + cpp/string/basic_string/rend + + (T... args) + + + T + get_allocator + cpp/string/basic_string/get_allocator + + (T... args) + + + T + clear + cpp/string/basic_string/clear + + (T... args) + + + T + at + cpp/string/basic_string/at + + (T... args) + + + T + swap + cpp/string/basic_string/swap + + (T... args) + + + T + operator[] + cpp/string/basic_string/operator_at + + (T... args) + + + T + length + cpp/string/basic_string/size + + (T... args) + + + + std::discrete_distribution + cpp/numeric/random/discrete_distribution + + T + probabilities + cpp/numeric/random/discrete_distribution/probabilities + + (T... args) + + + T + reset + cpp/numeric/random/discrete_distribution/reset + + (T... args) + + + T + operator() + cpp/numeric/random/discrete_distribution/operator() + + (T... args) + + + T + discrete_distribution + cpp/numeric/random/discrete_distribution/discrete_distribution + + (T... args) + + + T + max + cpp/numeric/random/discrete_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/discrete_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/discrete_distribution/min + + (T... args) + + + + std::wostream + cpp/io/basic_ostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + std::wostream::event_callback + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + ~wostream + cpp/io/basic_ostream/~basic_ostream + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + wostream + cpp/io/basic_ostream/basic_ostream + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + std::wostream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wostream::event_callback + cpp/io/ios_base/event_callback + + + std::wostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::is_polymorphic + cpp/types/is_polymorphic + + + std::reverse_iterator + cpp/iterator/reverse_iterator + + + std::bad_array_new_length + cpp/memory/new/bad_array_new_length + + T + bad_array_new_length + cpp/memory/new/bad_array_new_length/bad_array_new_length + + (T... args) + + + T + what + cpp/memory/new/bad_alloc + + (T... args) + + + + std::condition_variable + cpp/thread/condition_variable + + T + wait + cpp/thread/condition_variable/wait + + (T... args) + + + T + notify_one + cpp/thread/condition_variable/notify_one + + (T... args) + + + T + wait_for + cpp/thread/condition_variable/wait_for + + (T... args) + + + T + notify_all + cpp/thread/condition_variable/notify_all + + (T... args) + + + T + native_handle + cpp/thread/condition_variable/native_handle + + (T... args) + + + T + wait_until + cpp/thread/condition_variable/wait_until + + (T... args) + + + T + condition_variable + cpp/thread/condition_variable/condition_variable + + (T... args) + + + T + ~condition_variable + cpp/thread/condition_variable/~condition_variable + + (T... args) + + + + std::ranlux48 + cpp/numeric/random/discard_block_engine + + T + discard + cpp/numeric/random/discard_block_engine/discard + + (T... args) + + + T + operator() + cpp/numeric/random/discard_block_engine/operator() + + (T... args) + + + T + ranlux48 + cpp/numeric/random/discard_block_engine/discard_block_engine + + (T... args) + + + T + base + cpp/numeric/random/discard_block_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/discard_block_engine/seed + + (T... args) + + + T + max + cpp/numeric/random/discard_block_engine/max + + (T... args) + + + T + min + cpp/numeric/random/discard_block_engine/min + + (T... args) + + + + std::unexpected_handler + cpp/error/unexpected_handler + + + std::piecewise_constant_distribution + cpp/numeric/random/piecewise_constant_distribution + + T + densities + cpp/numeric/random/piecewise_constant_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/piecewise_constant_distribution/max + + (T... args) + + + T + intervals + cpp/numeric/random/piecewise_constant_distribution/params + + (T... args) + + + T + reset + cpp/numeric/random/piecewise_constant_distribution/reset + + (T... args) + + + T + piecewise_constant_distribution + cpp/numeric/random/piecewise_constant_distribution/piecewise_constant_distribution + + (T... args) + + + T + operator() + cpp/numeric/random/piecewise_constant_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/piecewise_constant_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/piecewise_constant_distribution/min + + (T... args) + + + + std::codecvt_base + cpp/locale/codecvt_base + + + std::set + cpp/container/set + + T + begin + cpp/container/set/begin + + (T... args) + + + T + erase + cpp/container/set/erase + + (T... args) + + + T + insert + cpp/container/set/insert + + (T... args) + + + T + ~set + cpp/container/set/~set + + (T... args) + + + T + rbegin + cpp/container/set/rbegin + + (T... args) + + + T + end + cpp/container/set/end + + (T... args) + + + T + emplace_hint + cpp/container/set/emplace_hint + + (T... args) + + + T + key_comp + cpp/container/set/key_comp + + (T... args) + + + T + count + cpp/container/set/count + + (T... args) + + + T + find + cpp/container/set/find + + (T... args) + + + T + crbegin + cpp/container/set/rbegin + + (T... args) + + + T + cbegin + cpp/container/set/begin + + (T... args) + + + T + upper_bound + cpp/container/set/upper_bound + + (T... args) + + + T + swap + cpp/container/set/swap + + (T... args) + + + T + crend + cpp/container/set/rend + + (T... args) + + + T + size + cpp/container/set/size + + (T... args) + + + T + set + cpp/container/set/set + + (T... args) + + + T + operator= + cpp/container/set/operator= + + (T... args) + + + T + value_comp + cpp/container/set/value_comp + + (T... args) + + + T + empty + cpp/container/set/empty + + (T... args) + + + T + lower_bound + cpp/container/set/lower_bound + + (T... args) + + + T + get_allocator + cpp/container/set/get_allocator + + (T... args) + + + T + max_size + cpp/container/set/max_size + + (T... args) + + + T + rend + cpp/container/set/rend + + (T... args) + + + T + cend + cpp/container/set/end + + (T... args) + + + T + clear + cpp/container/set/clear + + (T... args) + + + T + equal_range + cpp/container/set/equal_range + + (T... args) + + + T + emplace + cpp/container/set/emplace + + (T... args) + + + + std::forward_iterator_tag + cpp/iterator/iterator_tags + + + std::codecvt_byname + cpp/locale/codecvt_byname + std::codecvt_byname::extern_type + + T + out + cpp/locale/codecvt/out + + (T... args) + + + T + do_length + cpp/locale/codecvt/length + + (T... args) + + + T + do_unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + do_encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + do_in + cpp/locale/codecvt/in + + (T... args) + + + T + unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + max_length + cpp/locale/codecvt/max_length + + (T... args) + + std::codecvt_byname::state_type + + T + encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + do_out + cpp/locale/codecvt/out + + (T... args) + + + T + codecvt_byname + cpp/locale/codecvt_byname + + (T... args) + + + T + do_max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + do_always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + in + cpp/locale/codecvt/in + + (T... args) + + std::codecvt_byname::intern_type + + T + length + cpp/locale/codecvt/length + + (T... args) + + + T + ~codecvt_byname + cpp/locale/codecvt_byname + + (T... args) + + + + std::codecvt_byname::extern_type + cpp/locale/codecvt + + + std::codecvt_byname::state_type + cpp/locale/codecvt + + + std::codecvt_byname::intern_type + cpp/locale/codecvt + + + std::pointer_safety + cpp/memory/gc/pointer_safety + + + std::uint_least64_t + cpp/types/integer + + + std::placeholders + cpp/utility/functional/placeholders + + + std::nothrow_t + cpp/memory/new/nothrow_t + + + std::is_nothrow_copy_assignable + cpp/types/is_copy_assignable + + + std::is_same + cpp/types/is_same + + + std::unique_lock + cpp/thread/unique_lock + + T + mutex + cpp/thread/unique_lock/mutex + + (T... args) + + + T + swap + cpp/thread/unique_lock/swap + + (T... args) + + + T + owns_lock + cpp/thread/unique_lock/owns_lock + + (T... args) + + + T + try_lock_for + cpp/thread/unique_lock/try_lock_for + + (T... args) + + + T + release + cpp/thread/unique_lock/release + + (T... args) + + + T + lock + cpp/thread/unique_lock/lock + + (T... args) + + + T + operator bool + cpp/thread/unique_lock/operator_bool + + (T... args) + + + T + ~unique_lock + cpp/thread/unique_lock/~unique_lock + + (T... args) + + + T + unlock + cpp/thread/unique_lock/unlock + + (T... args) + + + T + operator= + cpp/thread/unique_lock/operator= + + (T... args) + + + T + try_lock_until + cpp/thread/unique_lock/try_lock_until + + (T... args) + + + T + try_lock + cpp/thread/unique_lock/try_lock + + (T... args) + + + T + unique_lock + cpp/thread/unique_lock/unique_lock + + (T... args) + + + + std::basic_ostringstream + cpp/io/basic_ostringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_ostringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::basic_ostringstream::event_callback + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_ostringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + operator= + cpp/io/basic_ostringstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + basic_ostringstream + cpp/io/basic_ostringstream/basic_ostringstream + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::basic_ostringstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_ostringstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_ostringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_ostringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::is_error_code_enum + cpp/error/error_code/is_error_code_enum + + + std::time_put_byname + cpp/locale/time_put_byname + + T + time_put_byname + cpp/locale/time_put_byname + + (T... args) + + std::time_put_byname::char_type + + T + do_put + cpp/locale/time_put/put + + (T... args) + + + T + put + cpp/locale/time_put/put + + (T... args) + + + T + ~time_put_byname + cpp/locale/time_put_byname + + (T... args) + + std::time_put_byname::iter_type + + + std::time_put_byname::char_type + cpp/locale/time_put + + + std::time_put_byname::iter_type + cpp/locale/time_put + + + std::time_get + cpp/locale/time_get + + T + do_date_order + cpp/locale/time_get/date_order + + (T... args) + + + T + do_get + cpp/locale/time_get/get + + (T... args) + + + T + do_get_monthname + cpp/locale/time_get/get_monthname + + (T... args) + + + T + get_weekday + cpp/locale/time_get/get_weekday + + (T... args) + + + T + do_get_time + cpp/locale/time_get/get_time + + (T... args) + + + T + ~time_get + cpp/locale/time_get/~time_get + + (T... args) + + + T + do_get_year + cpp/locale/time_get/get_year + + (T... args) + + std::time_get::iter_type + + T + get_monthname + cpp/locale/time_get/get_monthname + + (T... args) + + + T + get_time + cpp/locale/time_get/get_time + + (T... args) + + + T + time_get + cpp/locale/time_get/time_get + + (T... args) + + + T + do_get_date + cpp/locale/time_get/get_date + + (T... args) + + + T + get_date + cpp/locale/time_get/get_date + + (T... args) + + std::time_get::char_type + + T + date_order + cpp/locale/time_get/date_order + + (T... args) + + + T + get_year + cpp/locale/time_get/get_year + + (T... args) + + + T + get + cpp/locale/time_get/get + + (T... args) + + + T + do_get_weekday + cpp/locale/time_get/get_weekday + + (T... args) + + + + std::time_get::iter_type + cpp/locale/time_get + + + std::time_get::char_type + cpp/locale/time_get + + + std::regex + cpp/regex/basic_regex + + T + operator= + cpp/regex/basic_regex/operator= + + (T... args) + + + T + swap + cpp/regex/basic_regex/swap + + (T... args) + + + T + imbue + cpp/regex/basic_regex/imbue + + (T... args) + + + T + assign + cpp/regex/basic_regex/assign + + (T... args) + + + T + regex + cpp/regex/basic_regex/basic_regex + + (T... args) + + + T + mark_count + cpp/regex/basic_regex/mark_count + + (T... args) + + + T + getloc + cpp/regex/basic_regex/getloc + + (T... args) + + + T + flags + cpp/regex/basic_regex/flags + + (T... args) + + + T + ~regex + cpp/regex/basic_regex/~basic_regex + + (T... args) + + + + std::cin + cpp/io/basic_istream + + + std::unordered_map + cpp/container/unordered_map + + T + max_bucket_count + cpp/container/unordered_map/max_bucket_count + + (T... args) + + + T + cbegin + cpp/container/unordered_map/begin + + (T... args) + + + T + erase + cpp/container/unordered_map/erase + + (T... args) + + + T + insert + cpp/container/unordered_map/insert + + (T... args) + + + T + bucket_count + cpp/container/unordered_map/bucket_count + + (T... args) + + + T + max_load_factor + cpp/container/unordered_map/max_load_factor + + (T... args) + + + T + end + cpp/container/unordered_map/end + + (T... args) + + + T + emplace_hint + cpp/container/unordered_map/emplace_hint + + (T... args) + + + T + end(int) + cpp/container/unordered_map/end2 + + (T... args) + + + T + load_factor + cpp/container/unordered_map/load_factor + + (T... args) + + + T + get_allocator + cpp/container/unordered_map/get_allocator + + (T... args) + + + T + key_eq + cpp/container/unordered_map/key_eq + + (T... args) + + + T + ~unordered_map + cpp/container/unordered_map/~unordered_map + + (T... args) + + + T + hash_function + cpp/container/unordered_map/hash_function + + (T... args) + + + T + find + cpp/container/unordered_map/find + + (T... args) + + + T + at + cpp/container/unordered_map/at + + (T... args) + + + T + cbegin(int) + cpp/container/unordered_map/begin2 + + (T... args) + + + T + swap + cpp/container/unordered_map/swap + + (T... args) + + + T + begin(int) + cpp/container/unordered_map/begin2 + + (T... args) + + + T + unordered_map + cpp/container/unordered_map/unordered_map + + (T... args) + + + T + size + cpp/container/unordered_map/size + + (T... args) + + + T + operator= + cpp/container/unordered_map/operator= + + (T... args) + + + T + cend(int) + cpp/container/unordered_map/end2 + + (T... args) + + + T + reserve + cpp/container/unordered_map/reserve + + (T... args) + + + T + rehash + cpp/container/unordered_map/rehash + + (T... args) + + + T + bucket + cpp/container/unordered_map/bucket + + (T... args) + + + T + empty + cpp/container/unordered_map/empty + + (T... args) + + + T + cend + cpp/container/unordered_map/end + + (T... args) + + + T + max_size + cpp/container/unordered_map/max_size + + (T... args) + + + T + count + cpp/container/unordered_map/count + + (T... args) + + + T + clear + cpp/container/unordered_map/clear + + (T... args) + + + T + equal_range + cpp/container/unordered_map/equal_range + + (T... args) + + + T + emplace + cpp/container/unordered_map/emplace + + (T... args) + + + T + operator[] + cpp/container/unordered_map/operator_at + + (T... args) + + + T + begin + cpp/container/unordered_map/begin + + (T... args) + + + T + bucket_size + cpp/container/unordered_map/bucket_size + + (T... args) + + + + std::initializer_list + cpp/utility/initializer_list + + T + end + cpp/utility/initializer_list/end + + (T... args) + + + T + size + cpp/utility/initializer_list/size + + (T... args) + + + T + initializer_list + cpp/utility/initializer_list/initializer_list + + (T... args) + + + T + begin + cpp/utility/initializer_list/begin + + (T... args) + + + + std::is_const + cpp/types/is_const + + + std::basic_regex + cpp/regex/basic_regex + + T + basic_regex + cpp/regex/basic_regex/basic_regex + + (T... args) + + + T + operator= + cpp/regex/basic_regex/operator= + + (T... args) + + + T + swap + cpp/regex/basic_regex/swap + + (T... args) + + + T + assign + cpp/regex/basic_regex/assign + + (T... args) + + + T + ~basic_regex + cpp/regex/basic_regex/~basic_regex + + (T... args) + + + T + getloc + cpp/regex/basic_regex/getloc + + (T... args) + + + T + mark_count + cpp/regex/basic_regex/mark_count + + (T... args) + + + T + imbue + cpp/regex/basic_regex/imbue + + (T... args) + + + T + flags + cpp/regex/basic_regex/flags + + (T... args) + + + + std::poisson_distribution + cpp/numeric/random/poisson_distribution + + T + poisson_distribution + cpp/numeric/random/poisson_distribution/poisson_distribution + + (T... args) + + + T + mean + cpp/numeric/random/poisson_distribution/mean + + (T... args) + + + T + max + cpp/numeric/random/poisson_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/poisson_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/poisson_distribution/min + + (T... args) + + + T + reset + cpp/numeric/random/poisson_distribution/reset + + (T... args) + + + + std::bad_typeid + cpp/types/bad_typeid + + T + bad_typeid + cpp/types/bad_typeid/bad_typeid + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::less_equal + cpp/utility/functional/less_equal + + T + operator() + cpp/utility/functional/less_equal + + (T... args) + + + + std::sig_atomic_t + cpp/utility/program/sig_atomic_t + + + std::make_unsigned + cpp/types/make_unsigned + + + std::basic_filebuf + cpp/io/basic_filebuf + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + basic_filebuf + cpp/io/basic_filebuf/basic_filebuf + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + is_open + cpp/io/basic_filebuf/is_open + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + ~basic_filebuf + cpp/io/basic_filebuf/~basic_filebuf + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + close + cpp/io/basic_filebuf/close + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + open + cpp/io/basic_filebuf/open + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + operator= + cpp/io/basic_filebuf/operator= + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + + std::logical_or + cpp/utility/functional/logical_or + + T + operator() + cpp/utility/functional/logical_or + + (T... args) + + + + std::wstringbuf + cpp/io/basic_stringbuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + str + cpp/io/basic_stringbuf/str + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + operator= + cpp/io/basic_stringbuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + wstringbuf + cpp/io/basic_stringbuf/basic_stringbuf + + (T... args) + + + + std::kilo + cpp/numeric/ratio/ratio + + + std::bernoulli_distribution + cpp/numeric/random/bernoulli_distribution + + T + bernoulli_distribution + cpp/numeric/random/bernoulli_distribution/bernoulli_distribution + + (T... args) + + + T + p + cpp/numeric/random/bernoulli_distribution/p + + (T... args) + + + T + reset + cpp/numeric/random/bernoulli_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/bernoulli_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/bernoulli_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/bernoulli_distribution/min + + (T... args) + + + + std::int16_t + cpp/types/integer + + + std::basic_ios + cpp/io/basic_ios + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + imbue + cpp/io/ios_base/imbue + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + std::basic_ios::failure + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + basic_ios + cpp/io/basic_ios/basic_ios + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + ~basic_ios + cpp/io/basic_ios/~basic_ios + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + std::basic_ios::event_callback + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_ios::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_ios::event_callback + cpp/io/ios_base/event_callback + + + std::int32_t + cpp/types/integer + + + std::is_rvalue_reference + cpp/types/is_rvalue_reference + + + std::integral_constant + cpp/types/integral_constant + + + std::wsmatch + cpp/regex/match_results + + T + cbegin + cpp/regex/match_results/begin + + (T... args) + + + T + format + cpp/regex/match_results/format + + (T... args) + + + T + wsmatch + cpp/regex/match_results/match_results + + (T... args) + + + T + size + cpp/regex/match_results/size + + (T... args) + + + T + swap + cpp/regex/match_results/swap + + (T... args) + + + T + position + cpp/regex/match_results/position + + (T... args) + + + T + prefix + cpp/regex/match_results/prefix + + (T... args) + + + T + str + cpp/regex/match_results/str + + (T... args) + + + T + ~wsmatch + cpp/regex/match_results/~match_results + + (T... args) + + + T + empty + cpp/regex/match_results/empty + + (T... args) + + + T + suffix + cpp/regex/match_results/suffix + + (T... args) + + + T + get_allocator + cpp/regex/match_results/get_allocator + + (T... args) + + + T + end + cpp/regex/match_results/end + + (T... args) + + + T + max_size + cpp/regex/match_results/max_size + + (T... args) + + + T + ready + cpp/regex/match_results/ready + + (T... args) + + + T + cend + cpp/regex/match_results/end + + (T... args) + + + T + operator[] + cpp/regex/match_results/operator_at + + (T... args) + + + T + length + cpp/regex/match_results/length + + (T... args) + + + T + begin + cpp/regex/match_results/begin + + (T... args) + + + + std::cerr + cpp/io/basic_ostream + + + std::codecvt_utf8 + cpp/locale/codecvt_utf8 + std::codecvt_utf8::extern_type + + T + out + cpp/locale/codecvt/out + + (T... args) + + + T + do_length + cpp/locale/codecvt/length + + (T... args) + + + T + do_unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + do_encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + do_in + cpp/locale/codecvt/in + + (T... args) + + + T + unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + max_length + cpp/locale/codecvt/max_length + + (T... args) + + std::codecvt_utf8::state_type + + T + encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + do_out + cpp/locale/codecvt/out + + (T... args) + + + T + do_max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + do_always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + in + cpp/locale/codecvt/in + + (T... args) + + std::codecvt_utf8::intern_type + + T + length + cpp/locale/codecvt/length + + (T... args) + + + + std::codecvt_utf8::extern_type + cpp/locale/codecvt + + + std::codecvt_utf8::state_type + cpp/locale/codecvt + + + std::codecvt_utf8::intern_type + cpp/locale/codecvt + + + std::ratio_add + cpp/numeric/ratio/ratio_add + + + std::is_trivially_move_constructible + cpp/types/is_move_constructible + + + std::wcsub_match + cpp/regex/sub_match + + T + operator string_type + cpp/regex/sub_match/str + + (T... args) + + + T + wcsub_match + cpp/regex/sub_match/sub_match + + (T... args) + + + T + str + cpp/regex/sub_match/str + + (T... args) + + + T + length + cpp/regex/sub_match/length + + (T... args) + + + T + compare + cpp/regex/sub_match/compare + + (T... args) + + + + std::is_member_pointer + cpp/types/is_member_pointer + + + std::wstreampos + cpp/io/fpos + + T + state + cpp/io/fpos/state + + (T... args) + + + + std::uint_least16_t + cpp/types/integer + + + std::tuple + cpp/utility/tuple + + T + operator= + cpp/utility/tuple/operator= + + (T... args) + + + T + swap + cpp/utility/tuple/swap + + (T... args) + + + T + tuple + cpp/utility/tuple/tuple + + (T... args) + + + + std::make_signed + cpp/types/make_signed + + + std::logic_error + cpp/error/logic_error + + T + logic_error + cpp/error/logic_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::sregex_iterator + cpp/regex/regex_iterator + + T + operator!= + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + T + sregex_iterator + cpp/regex/regex_iterator/regex_iterator + + (T... args) + + + T + operator* + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + + std::int_least64_t + cpp/types/integer + + + std::binary_negate + cpp/utility/functional/binary_negate + + T + operator() + cpp/utility/functional/binary_negate + + (T... args) + + + T + binary_negate + cpp/utility/functional/binary_negate + + (T... args) + + + + std::discard_block_engine + cpp/numeric/random/discard_block_engine + + T + discard + cpp/numeric/random/discard_block_engine/discard + + (T... args) + + + T + max + cpp/numeric/random/discard_block_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/discard_block_engine/operator() + + (T... args) + + + T + base + cpp/numeric/random/discard_block_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/discard_block_engine/seed + + (T... args) + + + T + discard_block_engine + cpp/numeric/random/discard_block_engine/discard_block_engine + + (T... args) + + + T + min + cpp/numeric/random/discard_block_engine/min + + (T... args) + + + + std::is_trivially_assignable + cpp/types/is_assignable + + + std::add_cv + cpp/types/add_cv + + + std::pico + cpp/numeric/ratio/ratio + + + std::iterator_traits + cpp/iterator/iterator_traits + + + std::is_trivially_default_constructible + cpp/types/is_default_constructible + + + std::shared_ptr + cpp/memory/shared_ptr + + T + shared_ptr + cpp/memory/shared_ptr/shared_ptr + + (T... args) + + + T + ~shared_ptr + cpp/memory/shared_ptr/~shared_ptr + + (T... args) + + + T + swap + cpp/memory/shared_ptr/swap + + (T... args) + + + T + owner_before + cpp/memory/shared_ptr/owner_before + + (T... args) + + + T + reset + cpp/memory/shared_ptr/reset + + (T... args) + + + T + operator-> + cpp/memory/shared_ptr/operator* + + (T... args) + + + T + operator= + cpp/memory/shared_ptr/operator= + + (T... args) + + + T + unique + cpp/memory/shared_ptr/unique + + (T... args) + + + T + operator* + cpp/memory/shared_ptr/operator* + + (T... args) + + + T + operator bool + cpp/memory/shared_ptr/operator_bool + + (T... args) + + + T + get + cpp/memory/shared_ptr/get + + (T... args) + + + + std::bad_alloc + cpp/memory/new/bad_alloc + + T + operator= + cpp/memory/new/bad_alloc + + (T... args) + + + T + bad_alloc + cpp/memory/new/bad_alloc + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ostringstream + cpp/io/basic_ostringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_ostringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::ostringstream::event_callback + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + ostringstream + cpp/io/basic_ostringstream/basic_ostringstream + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::ostringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + operator= + cpp/io/basic_ostringstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::ostringstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::ostringstream::event_callback + cpp/io/ios_base/event_callback + + + std::ostringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ostringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::basic_fstream + cpp/io/basic_fstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + basic_fstream + cpp/io/basic_fstream/basic_fstream + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + open + cpp/io/basic_fstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::basic_fstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::basic_fstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + close + cpp/io/basic_fstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_fstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_fstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_fstream/operator= + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_fstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::basic_fstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_fstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::stringbuf + cpp/io/basic_stringbuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + stringbuf + cpp/io/basic_stringbuf/basic_stringbuf + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + str + cpp/io/basic_stringbuf/str + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + operator= + cpp/io/basic_stringbuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + + std::exponential_distribution + cpp/numeric/random/exponential_distribution + + T + exponential_distribution + cpp/numeric/random/exponential_distribution/exponential_distribution + + (T... args) + + + T + min + cpp/numeric/random/exponential_distribution/min + + (T... args) + + + T + max + cpp/numeric/random/exponential_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/exponential_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/exponential_distribution/param + + (T... args) + + + T + reset + cpp/numeric/random/exponential_distribution/reset + + (T... args) + + + T + lambda + cpp/numeric/random/exponential_distribution/lambda + + (T... args) + + + + std::uint32_t + cpp/types/integer + + + std::wcregex_iterator + cpp/regex/regex_iterator + + T + operator!= + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + wcregex_iterator + cpp/regex/regex_iterator/regex_iterator + + (T... args) + + + T + operator++(int) + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + + std::bad_function_call + cpp/utility/functional/bad_function_call + + T + bad_function_call + cpp/utility/functional/bad_function_call + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::false_type + cpp/types/integral_constant + + + std::wregex + cpp/regex/basic_regex + + T + wregex + cpp/regex/basic_regex/basic_regex + + (T... args) + + + T + swap + cpp/regex/basic_regex/swap + + (T... args) + + + T + imbue + cpp/regex/basic_regex/imbue + + (T... args) + + + T + assign + cpp/regex/basic_regex/assign + + (T... args) + + + T + ~wregex + cpp/regex/basic_regex/~basic_regex + + (T... args) + + + T + operator= + cpp/regex/basic_regex/operator= + + (T... args) + + + T + mark_count + cpp/regex/basic_regex/mark_count + + (T... args) + + + T + getloc + cpp/regex/basic_regex/getloc + + (T... args) + + + T + flags + cpp/regex/basic_regex/flags + + (T... args) + + + + std::uint_least8_t + cpp/types/integer + + + std::uniform_real_distribution + cpp/numeric/random/uniform_real_distribution + + T + uniform_real_distribution + cpp/numeric/random/uniform_real_distribution/uniform_real_distribution + + (T... args) + + + T + reset + cpp/numeric/random/uniform_real_distribution/reset + + (T... args) + + + T + a + cpp/numeric/random/uniform_real_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/uniform_real_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/uniform_real_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/uniform_real_distribution/min + + (T... args) + + + T + b + cpp/numeric/random/uniform_real_distribution/params + + (T... args) + + + + std::smatch + cpp/regex/match_results + + T + smatch + cpp/regex/match_results/match_results + + (T... args) + + + T + cbegin + cpp/regex/match_results/begin + + (T... args) + + + T + format + cpp/regex/match_results/format + + (T... args) + + + T + size + cpp/regex/match_results/size + + (T... args) + + + T + swap + cpp/regex/match_results/swap + + (T... args) + + + T + position + cpp/regex/match_results/position + + (T... args) + + + T + ~smatch + cpp/regex/match_results/~match_results + + (T... args) + + + T + prefix + cpp/regex/match_results/prefix + + (T... args) + + + T + str + cpp/regex/match_results/str + + (T... args) + + + T + empty + cpp/regex/match_results/empty + + (T... args) + + + T + suffix + cpp/regex/match_results/suffix + + (T... args) + + + T + get_allocator + cpp/regex/match_results/get_allocator + + (T... args) + + + T + end + cpp/regex/match_results/end + + (T... args) + + + T + max_size + cpp/regex/match_results/max_size + + (T... args) + + + T + ready + cpp/regex/match_results/ready + + (T... args) + + + T + cend + cpp/regex/match_results/end + + (T... args) + + + T + operator[] + cpp/regex/match_results/operator_at + + (T... args) + + + T + length + cpp/regex/match_results/length + + (T... args) + + + T + begin + cpp/regex/match_results/begin + + (T... args) + + + + std::cregex_token_iterator + cpp/regex/regex_token_iterator + + T + operator!= + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_token_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + cregex_token_iterator + cpp/regex/regex_token_iterator/regex_token_iterator + + (T... args) + + + T + operator++ + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + + std::range_error + cpp/error/range_error + + T + range_error + cpp/error/range_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_assignable + cpp/types/is_assignable + + + std::is_copy_assignable + cpp/types/is_copy_assignable + + + std::invalid_argument + cpp/error/invalid_argument + + T + invalid_argument + cpp/error/invalid_argument + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_unsigned + cpp/types/is_unsigned + + + std::jmp_buf + cpp/utility/program/jmp_buf + + + std::is_class + cpp/types/is_class + + + std::geometric_distribution + cpp/numeric/random/geometric_distribution + + T + p + cpp/numeric/random/geometric_distribution/p + + (T... args) + + + T + reset + cpp/numeric/random/geometric_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/geometric_distribution/max + + (T... args) + + + T + geometric_distribution + cpp/numeric/random/geometric_distribution/geometric_distribution + + (T... args) + + + T + param + cpp/numeric/random/geometric_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/geometric_distribution/min + + (T... args) + + + + std::uint_fast8_t + cpp/types/integer + + + std::mersenne_twister_engine + cpp/numeric/random/mersenne_twister_engine + + T + discard + cpp/numeric/random/mersenne_twister_engine/discard + + (T... args) + + + T + max + cpp/numeric/random/mersenne_twister_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/mersenne_twister_engine/operator() + + (T... args) + + + T + mersenne_twister_engine + cpp/numeric/random/mersenne_twister_engine/mersenne_twister_engine + + (T... args) + + + T + seed + cpp/numeric/random/mersenne_twister_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/mersenne_twister_engine/min + + (T... args) + + + + std::is_arithmetic + cpp/types/is_arithmetic + + + std::negate + cpp/utility/functional/negate + + T + operator() + cpp/utility/functional/negate + + (T... args) + + + + std::try_to_lock_t + cpp/thread/lock_tag_t + + + std::wfilebuf + cpp/io/basic_filebuf + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + is_open + cpp/io/basic_filebuf/is_open + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + ~wfilebuf + cpp/io/basic_filebuf/~basic_filebuf + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + wfilebuf + cpp/io/basic_filebuf/basic_filebuf + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + close + cpp/io/basic_filebuf/close + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + open + cpp/io/basic_filebuf/open + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + operator= + cpp/io/basic_filebuf/operator= + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + + std::is_compound + cpp/types/is_compound + + + std::iostream + cpp/io/basic_iostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + ~iostream + cpp/io/basic_iostream/~basic_iostream + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::iostream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::iostream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::iostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + iostream + cpp/io/basic_iostream/basic_iostream + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::iostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::iostream::event_callback + cpp/io/ios_base/event_callback + + + std::iostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_object + cpp/types/is_object + + + std::recursive_mutex + cpp/thread/recursive_mutex + + T + unlock + cpp/thread/recursive_mutex/unlock + + (T... args) + + + T + native_handle + cpp/thread/recursive_mutex/native_handle + + (T... args) + + + T + recursive_mutex + cpp/thread/recursive_mutex/recursive_mutex + + (T... args) + + + T + lock + cpp/thread/recursive_mutex/lock + + (T... args) + + + T + try_lock + cpp/thread/recursive_mutex/try_lock + + (T... args) + + + + std::is_copy_constructible + cpp/types/is_copy_constructible + + + std::codecvt_utf8_utf16 + cpp/locale/codecvt_utf8_utf16 + std::codecvt_utf8_utf16::extern_type + + T + out + cpp/locale/codecvt/out + + (T... args) + + + T + do_length + cpp/locale/codecvt/length + + (T... args) + + + T + do_unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + do_encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + do_in + cpp/locale/codecvt/in + + (T... args) + + + T + unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + max_length + cpp/locale/codecvt/max_length + + (T... args) + + std::codecvt_utf8_utf16::state_type + + T + encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + do_out + cpp/locale/codecvt/out + + (T... args) + + + T + do_max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + do_always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + in + cpp/locale/codecvt/in + + (T... args) + + std::codecvt_utf8_utf16::intern_type + + T + length + cpp/locale/codecvt/length + + (T... args) + + + + std::codecvt_utf8_utf16::extern_type + cpp/locale/codecvt + + + std::codecvt_utf8_utf16::state_type + cpp/locale/codecvt + + + std::codecvt_utf8_utf16::intern_type + cpp/locale/codecvt + + + std::not_equal_to + cpp/utility/functional/not_equal_to + + T + operator() + cpp/utility/functional/not_equal_to + + (T... args) + + + + std::is_destructible + cpp/types/is_destructible + + + std::int_fast32_t + cpp/types/integer + + + std::rank + cpp/types/rank + + + std::milli + cpp/numeric/ratio/ratio + + + std::deci + cpp/numeric/ratio/ratio + + + std::add_lvalue_reference + cpp/types/add_reference + + + std::is_bind_expression + cpp/utility/functional/is_bind_expression + + + std::ios_base + cpp/io/ios_base + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + std::ios_base::event_callback + std::ios_base::failure + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + imbue + cpp/io/ios_base/imbue + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + ios_base + cpp/io/ios_base/ios_base + + (T... args) + + + T + ~ios_base + cpp/io/ios_base/~ios_base + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + + std::ios_base::event_callback + cpp/io/ios_base/event_callback + + + std::ios_base::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ratio_less + cpp/numeric/ratio/ratio_less + + + std::int64_t + cpp/types/integer + + + std::nullptr_t + cpp/types/nullptr_t + + + std::stack + cpp/container/stack + + T + operator= + cpp/container/stack/operator= + + (T... args) + + + T + swap + cpp/container/stack/swap + + (T... args) + + + T + size + cpp/container/stack/size + + (T... args) + + + T + empty + cpp/container/stack/empty + + (T... args) + + + T + pop + cpp/container/stack/pop + + (T... args) + + + T + emplace + cpp/container/stack/emplace + + (T... args) + + + T + ~stack + cpp/container/stack/~stack + + (T... args) + + + T + top + cpp/container/stack/top + + (T... args) + + + T + stack + cpp/container/stack/stack + + (T... args) + + + T + push + cpp/container/stack/push + + (T... args) + + + + std::uint_fast64_t + cpp/types/integer + + + std::is_reference + cpp/types/is_reference + + + std::ratio + cpp/numeric/ratio/ratio + + + std::shared_future + cpp/thread/shared_future + + T + ~shared_future + cpp/thread/shared_future/~shared_future + + (T... args) + + + T + operator= + cpp/thread/shared_future/operator= + + (T... args) + + + T + wait + cpp/thread/shared_future/wait + + (T... args) + + + T + wait_until + cpp/thread/shared_future/wait_until + + (T... args) + + + T + wait_for + cpp/thread/shared_future/wait_for + + (T... args) + + + T + shared_future + cpp/thread/shared_future/shared_future + + (T... args) + + + T + valid + cpp/thread/shared_future/valid + + (T... args) + + + T + get + cpp/thread/shared_future/get + + (T... args) + + + + std::u16streampos + cpp/io/fpos + + T + state + cpp/io/fpos/state + + (T... args) + + + + std::wistream + cpp/io/basic_istream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::wistream::event_callback + + T + wistream + cpp/io/basic_istream/basic_istream + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ~wistream + cpp/io/basic_istream/~basic_istream + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wistream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + std::wistream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wistream::event_callback + cpp/io/ios_base/event_callback + + + std::wistream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wistream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::aligned_storage + cpp/types/aligned_storage + + + std::wstreambuf + cpp/io/basic_streambuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + wstreambuf + cpp/io/basic_streambuf/basic_streambuf + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + ~wstreambuf + cpp/io/basic_streambuf/~basic_streambuf + + (T... args) + + + T + operator= + cpp/io/basic_streambuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + + std::binary_function + cpp/utility/functional/binary_function + + + std::out_of_range + cpp/error/out_of_range + + T + out_of_range + cpp/error/out_of_range + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::independent_bits_engine + cpp/numeric/random/independent_bits_engine + + T + discard + cpp/numeric/random/independent_bits_engine/discard + + (T... args) + + + T + max + cpp/numeric/random/independent_bits_engine/max + + (T... args) + + + T + independent_bits_engine + cpp/numeric/random/independent_bits_engine/independent_bits_engine + + (T... args) + + + T + operator() + cpp/numeric/random/independent_bits_engine/operator() + + (T... args) + + + T + base + cpp/numeric/random/independent_bits_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/independent_bits_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/independent_bits_engine/min + + (T... args) + + + + std::stringstream + cpp/io/basic_stringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_stringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + stringstream + cpp/io/basic_stringstream/basic_stringstream + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::stringstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::stringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::stringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_stringstream/operator= + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::stringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::stringstream::event_callback + cpp/io/ios_base/event_callback + + + std::stringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::tera + cpp/numeric/ratio/ratio + + + std::recursive_timed_mutex + cpp/thread/recursive_timed_mutex + + T + unlock + cpp/thread/recursive_timed_mutex/unlock + + (T... args) + + + T + native_handle + cpp/thread/recursive_timed_mutex/native_handle + + (T... args) + + + T + try_lock_until + cpp/thread/recursive_timed_mutex/try_lock_until + + (T... args) + + + T + try_lock_for + cpp/thread/recursive_timed_mutex/try_lock_for + + (T... args) + + + T + recursive_timed_mutex + cpp/thread/recursive_timed_mutex/recursive_timed_mutex + + (T... args) + + + T + lock + cpp/thread/recursive_timed_mutex/lock + + (T... args) + + + T + try_lock + cpp/thread/recursive_timed_mutex/try_lock + + (T... args) + + + + std::nano + cpp/numeric/ratio/ratio + + + std::unordered_multimap + cpp/container/unordered_multimap + + T + ~unordered_multimap + cpp/container/unordered_multimap/~unordered_multimap + + (T... args) + + + T + max_bucket_count + cpp/container/unordered_multimap/max_bucket_count + + (T... args) + + + T + bucket_count + cpp/container/unordered_multimap/bucket_count + + (T... args) + + + T + cbegin + cpp/container/unordered_multimap/begin + + (T... args) + + + T + erase + cpp/container/unordered_multimap/erase + + (T... args) + + + T + insert + cpp/container/unordered_multimap/insert + + (T... args) + + + T + unordered_multimap + cpp/container/unordered_multimap/unordered_multimap + + (T... args) + + + T + max_load_factor + cpp/container/unordered_multimap/max_load_factor + + (T... args) + + + T + end + cpp/container/unordered_multimap/end + + (T... args) + + + T + emplace_hint + cpp/container/unordered_multimap/emplace_hint + + (T... args) + + + T + end(int) + cpp/container/unordered_multimap/end2 + + (T... args) + + + T + key_eq + cpp/container/unordered_multimap/key_eq + + (T... args) + + + T + hash_function + cpp/container/unordered_multimap/hash_function + + (T... args) + + + T + find + cpp/container/unordered_multimap/find + + (T... args) + + + T + begin + cpp/container/unordered_multimap/begin + + (T... args) + + + T + cbegin(int) + cpp/container/unordered_multimap/begin2 + + (T... args) + + + T + swap + cpp/container/unordered_multimap/swap + + (T... args) + + + T + begin(int) + cpp/container/unordered_multimap/begin2 + + (T... args) + + + T + load_factor + cpp/container/unordered_multimap/load_factor + + (T... args) + + + T + size + cpp/container/unordered_multimap/size + + (T... args) + + + T + operator= + cpp/container/unordered_multimap/operator= + + (T... args) + + + T + cend + cpp/container/unordered_multimap/end + + (T... args) + + + T + reserve + cpp/container/unordered_multimap/reserve + + (T... args) + + + T + rehash + cpp/container/unordered_multimap/rehash + + (T... args) + + + T + bucket + cpp/container/unordered_multimap/bucket + + (T... args) + + + T + empty + cpp/container/unordered_multimap/empty + + (T... args) + + + T + get_allocator + cpp/container/unordered_multimap/get_allocator + + (T... args) + + + T + max_size + cpp/container/unordered_multimap/max_size + + (T... args) + + + T + cend(int) + cpp/container/unordered_multimap/end2 + + (T... args) + + + T + count + cpp/container/unordered_multimap/count + + (T... args) + + + T + clear + cpp/container/unordered_multimap/clear + + (T... args) + + + T + equal_range + cpp/container/unordered_multimap/equal_range + + (T... args) + + + T + emplace + cpp/container/unordered_multimap/emplace + + (T... args) + + + T + bucket_size + cpp/container/unordered_multimap/bucket_size + + (T... args) + + + + std::normal_distribution + cpp/numeric/random/normal_distribution + + T + min + cpp/numeric/random/normal_distribution/min + + (T... args) + + + T + stddev + cpp/numeric/random/normal_distribution/params + + (T... args) + + + T + reset + cpp/numeric/random/normal_distribution/reset + + (T... args) + + + T + mean + cpp/numeric/random/normal_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/normal_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/normal_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/normal_distribution/param + + (T... args) + + + T + normal_distribution + cpp/numeric/random/normal_distribution/normal_distribution + + (T... args) + + + + std::minstd_rand + cpp/numeric/random/linear_congruential_engine + + T + discard + cpp/numeric/random/linear_congruential_engine/discard + + (T... args) + + + T + minstd_rand + cpp/numeric/random/linear_congruential_engine/linear_congruential_engine + + (T... args) + + + T + max + cpp/numeric/random/linear_congruential_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/linear_congruential_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/linear_congruential_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/linear_congruential_engine/min + + (T... args) + + + + std::is_signed + cpp/types/is_signed + + + std::is_move_constructible + cpp/types/is_move_constructible + + + std::unique_ptr + cpp/memory/unique_ptr + + T + unique_ptr + cpp/memory/unique_ptr/unique_ptr + + (T... args) + + + T + operator= + cpp/memory/unique_ptr/operator= + + (T... args) + + + T + swap + cpp/memory/unique_ptr/swap + + (T... args) + + + T + operator* + cpp/memory/unique_ptr/operator* + + (T... args) + + + T + ~unique_ptr + cpp/memory/unique_ptr/~unique_ptr + + (T... args) + + + T + operator-> + cpp/memory/unique_ptr/operator* + + (T... args) + + + T + release + cpp/memory/unique_ptr/release + + (T... args) + + + T + get_deleter + cpp/memory/unique_ptr/get_deleter + + (T... args) + + + T + operator bool + cpp/memory/unique_ptr/operator_bool + + (T... args) + + + T + get + cpp/memory/unique_ptr/get + + (T... args) + + + T + reset + cpp/memory/unique_ptr/reset + + (T... args) + + + + std::is_nothrow_copy_constructible + cpp/types/is_copy_constructible + + + std::forward_list + cpp/container/forward_list + + T + pop_front + cpp/container/forward_list/pop_front + + (T... args) + + + T + unique + cpp/container/forward_list/unique + + (T... args) + + + T + sort + cpp/container/forward_list/sort + + (T... args) + + + T + cbegin + cpp/container/forward_list/begin + + (T... args) + + + T + splice_after + cpp/container/forward_list/splice_after + + (T... args) + + + T + reverse + cpp/container/forward_list/reverse + + (T... args) + + + T + remove_if + cpp/container/forward_list/remove + + (T... args) + + + T + end + cpp/container/forward_list/end + + (T... args) + + + T + remove + cpp/container/forward_list/remove + + (T... args) + + + T + push_front + cpp/container/forward_list/push_front + + (T... args) + + + T + emplace_after + cpp/container/forward_list/emplace_after + + (T... args) + + + T + get_allocator + cpp/container/forward_list/get_allocator + + (T... args) + + + T + front + cpp/container/forward_list/front + + (T... args) + + + T + begin + cpp/container/forward_list/begin + + (T... args) + + + T + resize + cpp/container/forward_list/resize + + (T... args) + + + T + emplace_front + cpp/container/forward_list/emplace_front + + (T... args) + + + T + swap + cpp/container/forward_list/swap + + (T... args) + + + T + erase_after + cpp/container/forward_list/erase_after + + (T... args) + + + T + assign + cpp/container/forward_list/assign + + (T... args) + + + T + forward_list + cpp/container/forward_list/forward_list + + (T... args) + + + T + ~forward_list + cpp/container/forward_list/~forward_list + + (T... args) + + + T + before_begin + cpp/container/forward_list/before_begin + + (T... args) + + + T + cbefore_begin + cpp/container/forward_list/before_begin + + (T... args) + + + T + merge + cpp/container/forward_list/merge + + (T... args) + + + T + operator= + cpp/container/forward_list/operator= + + (T... args) + + + T + insert_after + cpp/container/forward_list/insert_after + + (T... args) + + + T + empty + cpp/container/forward_list/empty + + (T... args) + + + T + max_size + cpp/container/forward_list/max_size + + (T... args) + + + T + cend + cpp/container/forward_list/end + + (T... args) + + + T + clear + cpp/container/forward_list/clear + + (T... args) + + + + std::errc + cpp/error/errc + + + std::lconv + cpp/locale/lconv + + + std::strstreambuf + cpp/io/strstreambuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + str + cpp/io/strstreambuf/str + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pcount + cpp/io/strstreambuf/pcount + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + ~strstreambuf + cpp/io/strstreambuf/~strstreambuf + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + freeze + cpp/io/strstreambuf/freeze + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + strstreambuf + cpp/io/strstreambuf/strstreambuf + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + + std::locale + cpp/locale/locale + + T + name + cpp/locale/locale/name + + (T... args) + + + T + combine + cpp/locale/locale/combine + + (T... args) + + + T + operator() + cpp/locale/locale/operator() + + (T... args) + + + T + classic + cpp/locale/locale/classic + + (T... args) + + + T + global + cpp/locale/locale/global + + (T... args) + + + T + operator!= + cpp/locale/locale/operator_cmp + + (T... args) + + + T + operator= + cpp/locale/locale/operator= + + (T... args) + + std::locale::facet + + T + operator== + cpp/locale/locale/operator_cmp + + (T... args) + + + T + locale + cpp/locale/locale/locale + + (T... args) + + std::locale::id + + T + ~locale + cpp/locale/locale/~locale + + (T... args) + + + + std::locale::facet + cpp/locale/locale/facet + + T + facet + cpp/locale/locale/facet/facet + + (T... args) + + + + std::locale::id + cpp/locale/locale/id + + T + id + cpp/locale/locale/id/id + + (T... args) + + + + std::equal_to + cpp/utility/functional/equal_to + + T + operator() + cpp/utility/functional/equal_to + + (T... args) + + + + std::divides + cpp/utility/functional/divides + + T + operator() + cpp/utility/functional/divides + + (T... args) + + + + std::collate_byname + cpp/locale/collate_byname + + T + hash + cpp/locale/collate/hash + + (T... args) + + + T + do_hash + cpp/locale/collate/hash + + (T... args) + + std::collate_byname::char_type + + T + do_transform + cpp/locale/collate/transform + + (T... args) + + + T + transform + cpp/locale/collate/transform + + (T... args) + + + T + do_compare + cpp/locale/collate/compare + + (T... args) + + + T + ~collate_byname + cpp/locale/collate_byname + + (T... args) + + std::collate_byname::string_type + + T + collate_byname + cpp/locale/collate_byname + + (T... args) + + + T + compare + cpp/locale/collate/compare + + (T... args) + + + + std::collate_byname::char_type + cpp/locale/collate + + + std::collate_byname::string_type + cpp/locale/collate + + + std::domain_error + cpp/error/domain_error + + T + domain_error + cpp/error/domain_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_empty + cpp/types/is_empty + + + std::is_nothrow_default_constructible + cpp/types/is_default_constructible + + + std::ratio_equal + cpp/numeric/ratio/ratio_equal + + + std::ostream + cpp/io/basic_ostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::ostream::event_callback + + T + ostream + cpp/io/basic_ostream/basic_ostream + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + ~ostream + cpp/io/basic_ostream/~basic_ostream + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::ostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + std::ostream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::ostream::event_callback + cpp/io/ios_base/event_callback + + + std::ostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::streamsize + cpp/io/streamsize + + + std::shared_lock + cpp/thread/shared_lock + + T + mutex + cpp/thread/shared_lock/mutex + + (T... args) + + + T + swap + cpp/thread/shared_lock/swap + + (T... args) + + + T + shared_lock + cpp/thread/shared_lock/shared_lock + + (T... args) + + + T + try_lock_for + cpp/thread/shared_lock/try_lock_for + + (T... args) + + + T + release + cpp/thread/shared_lock/release + + (T... args) + + + T + lock + cpp/thread/shared_lock/lock + + (T... args) + + + T + operator bool + cpp/thread/shared_lock/operator_bool + + (T... args) + + + T + unlock + cpp/thread/shared_lock/unlock + + (T... args) + + + T + operator= + cpp/thread/shared_lock/operator= + + (T... args) + + + T + ~shared_lock + cpp/thread/shared_lock/~shared_lock + + (T... args) + + + T + try_lock_until + cpp/thread/shared_lock/try_lock_until + + (T... args) + + + T + try_lock + cpp/thread/shared_lock/try_lock + + (T... args) + + + T + owns_lock + cpp/thread/shared_lock/owns_lock + + (T... args) + + + + std::uint8_t + cpp/types/integer + + + std::enable_shared_from_this + cpp/memory/enable_shared_from_this + + T + enable_shared_from_this + cpp/memory/enable_shared_from_this/enable_shared_from_this + + (T... args) + + + T + operator= + cpp/memory/enable_shared_from_this/operator= + + (T... args) + + + T + shared_from_this + cpp/memory/enable_shared_from_this/shared_from_this + + (T... args) + + + T + ~enable_shared_from_this + cpp/memory/enable_shared_from_this/~enable_shared_from_this + + (T... args) + + + + std::ptrdiff_t + cpp/types/ptrdiff_t + + + std::int_fast8_t + cpp/types/integer + + + std::aligned_union + cpp/types/aligned_union + + + std::future + cpp/thread/future + + T + operator= + cpp/thread/future/operator= + + (T... args) + + + T + wait + cpp/thread/future/wait + + (T... args) + + + T + wait_until + cpp/thread/future/wait_until + + (T... args) + + + T + wait_for + cpp/thread/future/wait_for + + (T... args) + + + T + ~future + cpp/thread/future/~future + + (T... args) + + + T + share + cpp/thread/future/share + + (T... args) + + + T + future + cpp/thread/future/future + + (T... args) + + + T + valid + cpp/thread/future/valid + + (T... args) + + + T + get + cpp/thread/future/get + + (T... args) + + + + std::wcmatch + cpp/regex/match_results + + T + wcmatch + cpp/regex/match_results/match_results + + (T... args) + + + T + cbegin + cpp/regex/match_results/begin + + (T... args) + + + T + format + cpp/regex/match_results/format + + (T... args) + + + T + size + cpp/regex/match_results/size + + (T... args) + + + T + swap + cpp/regex/match_results/swap + + (T... args) + + + T + position + cpp/regex/match_results/position + + (T... args) + + + T + prefix + cpp/regex/match_results/prefix + + (T... args) + + + T + str + cpp/regex/match_results/str + + (T... args) + + + T + empty + cpp/regex/match_results/empty + + (T... args) + + + T + suffix + cpp/regex/match_results/suffix + + (T... args) + + + T + get_allocator + cpp/regex/match_results/get_allocator + + (T... args) + + + T + end + cpp/regex/match_results/end + + (T... args) + + + T + max_size + cpp/regex/match_results/max_size + + (T... args) + + + T + ~wcmatch + cpp/regex/match_results/~match_results + + (T... args) + + + T + ready + cpp/regex/match_results/ready + + (T... args) + + + T + cend + cpp/regex/match_results/end + + (T... args) + + + T + operator[] + cpp/regex/match_results/operator_at + + (T... args) + + + T + length + cpp/regex/match_results/length + + (T... args) + + + T + begin + cpp/regex/match_results/begin + + (T... args) + + + + std::overflow_error + cpp/error/overflow_error + + T + overflow_error + cpp/error/overflow_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::centi + cpp/numeric/ratio/ratio + + + std::wssub_match + cpp/regex/sub_match + + T + operator string_type + cpp/regex/sub_match/str + + (T... args) + + + T + str + cpp/regex/sub_match/str + + (T... args) + + + T + wssub_match + cpp/regex/sub_match/sub_match + + (T... args) + + + T + length + cpp/regex/sub_match/length + + (T... args) + + + T + compare + cpp/regex/sub_match/compare + + (T... args) + + + + std::is_nothrow_move_assignable + cpp/types/is_move_assignable + + + std::pair + cpp/utility/pair + + T + pair + cpp/utility/pair/pair + + (T... args) + + + T + swap + cpp/utility/pair/swap + + (T... args) + + + T + operator= + cpp/utility/pair/operator= + + (T... args) + + + + std::wsregex_token_iterator + cpp/regex/regex_token_iterator + + T + operator!= + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_token_iterator/operator= + + (T... args) + + + T + wsregex_token_iterator + cpp/regex/regex_token_iterator/regex_token_iterator + + (T... args) + + + T + operator-> + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + operator== + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator* + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + + std::weibull_distribution + cpp/numeric/random/weibull_distribution + + T + reset + cpp/numeric/random/weibull_distribution/reset + + (T... args) + + + T + a + cpp/numeric/random/weibull_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/weibull_distribution/max + + (T... args) + + + T + weibull_distribution + cpp/numeric/random/weibull_distribution/weibull_distribution + + (T... args) + + + T + operator() + cpp/numeric/random/weibull_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/weibull_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/weibull_distribution/min + + (T... args) + + + T + b + cpp/numeric/random/weibull_distribution/params + + (T... args) + + + + std::less + cpp/utility/functional/less + + T + operator() + cpp/utility/functional/less + + (T... args) + + + + std::multiplies + cpp/utility/functional/multiplies + + T + operator() + cpp/utility/functional/multiplies + + (T... args) + + + + std::is_enum + cpp/types/is_enum + + + std::unary_function + cpp/utility/functional/unary_function + + + std::error_code + cpp/error/error_code + + T + value + cpp/error/error_code/value + + (T... args) + + + T + operator bool + cpp/error/error_code/operator_bool + + (T... args) + + + T + assign + cpp/error/error_code/assign + + (T... args) + + + T + operator= + cpp/error/error_code/operator= + + (T... args) + + + T + error_code + cpp/error/error_code/error_code + + (T... args) + + + T + clear + cpp/error/error_code/clear + + (T... args) + + + T + default_error_condition + cpp/error/error_code/default_error_condition + + (T... args) + + + T + message + cpp/error/error_code/message + + (T... args) + + + T + category + cpp/error/error_code/category + + (T... args) + + + + std::yocto + cpp/numeric/ratio/ratio + + + std::streampos + cpp/io/fpos + + T + state + cpp/io/fpos/state + + (T... args) + + + + std::istream_iterator + cpp/iterator/istream_iterator + + + std::wifstream + cpp/io/basic_ifstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + open + cpp/io/basic_ifstream/open + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + operator= + cpp/io/basic_ifstream/operator= + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::wifstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ifstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::wifstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ifstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + wifstream + cpp/io/basic_ifstream/basic_ifstream + + (T... args) + + std::wifstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wifstream::event_callback + cpp/io/ios_base/event_callback + + + std::wifstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wifstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::moneypunct_byname + cpp/locale/moneypunct_byname + + T + do_curr_symbol + cpp/locale/moneypunct/curr_symbol + + (T... args) + + + T + do_decimal_point + cpp/locale/moneypunct/decimal_point + + (T... args) + + + T + thousands_sep + cpp/locale/moneypunct/thousands_sep + + (T... args) + + + T + moneypunct_byname + cpp/locale/moneypunct_byname + + (T... args) + + + T + curr_symbol + cpp/locale/moneypunct/curr_symbol + + (T... args) + + + T + do_thousands_sep + cpp/locale/moneypunct/thousands_sep + + (T... args) + + + T + positive_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + frac_digits + cpp/locale/moneypunct/frac_digits + + (T... args) + + + T + do_negative_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + pos_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + do_pos_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + neg_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + negative_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + grouping + cpp/locale/moneypunct/grouping + + (T... args) + + + T + do_frac_digits + cpp/locale/moneypunct/frac_digits + + (T... args) + + + T + decimal_point + cpp/locale/moneypunct/decimal_point + + (T... args) + + + T + do_neg_format + cpp/locale/moneypunct/pos_format + + (T... args) + + std::moneypunct_byname::string_type + std::moneypunct_byname::pattern + + T + do_positive_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + std::moneypunct_byname::char_type + + T + ~moneypunct_byname + cpp/locale/moneypunct_byname + + (T... args) + + + T + do_grouping + cpp/locale/moneypunct/grouping + + (T... args) + + + + std::moneypunct_byname::string_type + cpp/locale/moneypunct + + + std::moneypunct_byname::pattern + cpp/locale/money_base + + + std::moneypunct_byname::char_type + cpp/locale/moneypunct + + + std::terminate_handler + cpp/error/terminate_handler + + + std::ctype_base + cpp/locale/ctype_base + std::ctype_base::mask + + + std::ctype_base::mask + cpp/locale/ctype_base + + + std::reference_wrapper + cpp/utility/functional/reference_wrapper + + T + operator= + cpp/utility/functional/reference_wrapper/operator= + + (T... args) + + + T + operator() + cpp/utility/functional/reference_wrapper/operator() + + (T... args) + + + T + get + cpp/utility/functional/reference_wrapper/get + + (T... args) + + + T + reference_wrapper + cpp/utility/functional/reference_wrapper/reference_wrapper + + (T... args) + + + T + operator T& + cpp/utility/functional/reference_wrapper/get + + (T... args) + + + + std::ranlux48_base + cpp/numeric/random/subtract_with_carry_engine + + T + discard + cpp/numeric/random/subtract_with_carry_engine/discard + + (T... args) + + + T + ranlux48_base + cpp/numeric/random/subtract_with_carry_engine/subtract_with_carry_engine + + (T... args) + + + T + max + cpp/numeric/random/subtract_with_carry_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/subtract_with_carry_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/subtract_with_carry_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/subtract_with_carry_engine/min + + (T... args) + + + + std::bit_not + cpp/utility/functional/bit_not + + T + operator() + cpp/utility/functional/bit_not + + (T... args) + + + + std::int_fast16_t + cpp/types/integer + + + std::error_category + cpp/error/error_category + + T + name + cpp/error/error_category/name + + (T... args) + + + T + operator!= + cpp/error/error_category/operator_cmp + + (T... args) + + + T + operator< + cpp/error/error_category/operator_cmp + + (T... args) + + + T + error_category + cpp/error/error_category/error_category + + (T... args) + + + T + equivalent + cpp/error/error_category/equivalent + + (T... args) + + + T + operator== + cpp/error/error_category/operator_cmp + + (T... args) + + + T + ~error_category + cpp/error/error_category/~error_category + + (T... args) + + + T + default_error_condition + cpp/error/error_category/default_error_condition + + (T... args) + + + T + message + cpp/error/error_category/message + + (T... args) + + + + std::regex_traits + cpp/regex/regex_traits + + T + value + cpp/regex/regex_traits/value + + (T... args) + + + T + lookup_collatename + cpp/regex/regex_traits/lookup_collatename + + (T... args) + + + T + isctype + cpp/regex/regex_traits/isctype + + (T... args) + + + T + getloc + cpp/regex/regex_traits/getloc + + (T... args) + + + T + regex_traits + cpp/regex/regex_traits/regex_traits + + (T... args) + + + T + transform_primary + cpp/regex/regex_traits/transform_primary + + (T... args) + + + T + translate + cpp/regex/regex_traits/translate + + (T... args) + + + T + imbue + cpp/regex/regex_traits/imbue + + (T... args) + + + T + lookup_classname + cpp/regex/regex_traits/lookup_classname + + (T... args) + + + T + transform + cpp/regex/regex_traits/transform + + (T... args) + + + T + length + cpp/regex/regex_traits/length + + (T... args) + + + T + translate_nocase + cpp/regex/regex_traits/translate_nocase + + (T... args) + + + + std::regex_constants + + + + std::negative_binomial_distribution + cpp/numeric/random/negative_binomial_distribution + + T + p + cpp/numeric/random/negative_binomial_distribution/params + + (T... args) + + + T + negative_binomial_distribution + cpp/numeric/random/negative_binomial_distribution/negative_binomial_distribution + + (T... args) + + + T + min + cpp/numeric/random/negative_binomial_distribution/min + + (T... args) + + + T + max + cpp/numeric/random/negative_binomial_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/negative_binomial_distribution/param + + (T... args) + + + T + reset + cpp/numeric/random/negative_binomial_distribution/reset + + (T... args) + + + T + k + cpp/numeric/random/negative_binomial_distribution/params + + (T... args) + + + + std::is_union + cpp/types/is_union + + + std::mt19937 + cpp/numeric/random/mersenne_twister_engine + + T + seed + cpp/numeric/random/mersenne_twister_engine/seed + + (T... args) + + + T + discard + cpp/numeric/random/mersenne_twister_engine/discard + + (T... args) + + + T + operator() + cpp/numeric/random/mersenne_twister_engine/operator() + + (T... args) + + + T + mt19937 + cpp/numeric/random/mersenne_twister_engine/mersenne_twister_engine + + (T... args) + + + T + max + cpp/numeric/random/mersenne_twister_engine/max + + (T... args) + + + T + min + cpp/numeric/random/mersenne_twister_engine/min + + (T... args) + + + + std::enable_if + cpp/types/enable_if + + + std::chi_squared_distribution + cpp/numeric/random/chi_squared_distribution + + T + n + cpp/numeric/random/chi_squared_distribution/n + + (T... args) + + + T + reset + cpp/numeric/random/chi_squared_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/chi_squared_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/chi_squared_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/chi_squared_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/chi_squared_distribution/min + + (T... args) + + + T + chi_squared_distribution + cpp/numeric/random/chi_squared_distribution/chi_squared_distribution + + (T... args) + + + + std::add_rvalue_reference + cpp/types/add_reference + + + std::basic_istream + cpp/io/basic_istream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::basic_istream::event_callback + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + basic_istream + cpp/io/basic_istream/basic_istream + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + ~basic_istream + cpp/io/basic_istream/~basic_istream + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_istream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + std::basic_istream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_istream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_istream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_istream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::ostream_iterator + cpp/iterator/ostream_iterator + + + std::is_trivially_copy_assignable + cpp/types/is_copy_assignable + + + std::clog + cpp/io/basic_ostream + + + std::is_scalar + cpp/types/is_scalar + + + std::uses_allocator + cpp/memory/uses_allocator + + + std::piecewise_linear_distribution + cpp/numeric/random/piecewise_linear_distribution + + T + piecewise_linear_distribution + cpp/numeric/random/piecewise_linear_distribution/piecewise_linear_distribution + + (T... args) + + + T + densities + cpp/numeric/random/piecewise_linear_distribution/params + + (T... args) + + + T + intervals + cpp/numeric/random/piecewise_linear_distribution/params + + (T... args) + + + T + reset + cpp/numeric/random/piecewise_linear_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/piecewise_linear_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/piecewise_linear_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/piecewise_linear_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/piecewise_linear_distribution/min + + (T... args) + + + + std::hash + cpp/utility/hash + + T + hash + cpp/utility/hash/hash + + (T... args) + + + T + operator() + cpp/utility/hash/operator() + + (T... args) + + + + std::shuffle_order_engine + cpp/numeric/random/shuffle_order_engine + + T + discard + cpp/numeric/random/shuffle_order_engine/discard + + (T... args) + + + T + shuffle_order_engine + cpp/numeric/random/shuffle_order_engine/shuffle_order_engine + + (T... args) + + + T + max + cpp/numeric/random/shuffle_order_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/shuffle_order_engine/operator() + + (T... args) + + + T + base + cpp/numeric/random/shuffle_order_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/shuffle_order_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/shuffle_order_engine/min + + (T... args) + + + + std::chrono + + std::chrono::minutes + + T + time_point_cast + cpp/chrono/time_point/time_point_cast + + (T... args) + + std::chrono::seconds + std::chrono::treat_as_floating_point + std::chrono::duration + std::chrono::milliseconds + std::chrono::steady_clock + std::chrono::system_clock + std::chrono::hours + std::chrono::time_point + std::chrono::high_resolution_clock + std::chrono::duration_values + std::chrono::microseconds + std::chrono::nanoseconds + + T + duration_cast + cpp/chrono/duration/duration_cast + + (T... args) + + + + std::chrono::minutes + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + minutes + cpp/chrono/duration/duration + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::seconds + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + seconds + cpp/chrono/duration/duration + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::treat_as_floating_point + cpp/chrono/treat_as_floating_point + + + std::chrono::duration + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + duration + cpp/chrono/duration/duration + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::milliseconds + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + milliseconds + cpp/chrono/duration/duration + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::steady_clock + cpp/chrono/steady_clock + + T + now + cpp/chrono/steady_clock/now + + (T... args) + + + + std::chrono::system_clock + cpp/chrono/system_clock + + T + now + cpp/chrono/system_clock/now + + (T... args) + + + T + to_time_t + cpp/chrono/system_clock/to_time_t + + (T... args) + + + T + from_time_t + cpp/chrono/system_clock/from_time_t + + (T... args) + + + + std::chrono::hours + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + hours + cpp/chrono/duration/duration + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::time_point + cpp/chrono/time_point + + T + time_since_epoch + cpp/chrono/time_point/time_since_epoch + + (T... args) + + + T + min + cpp/chrono/time_point/min + + (T... args) + + + T + operator- + cpp/chrono/time_point/operator_arith + + (T... args) + + + T + max + cpp/chrono/time_point/max + + (T... args) + + + T + operator+ + cpp/chrono/time_point/operator_arith + + (T... args) + + + T + time_point + cpp/chrono/time_point/time_point + + (T... args) + + + + std::chrono::high_resolution_clock + cpp/chrono/high_resolution_clock + + T + now + cpp/chrono/high_resolution_clock/now + + (T... args) + + + + std::chrono::duration_values + cpp/chrono/duration_values + + T + max + cpp/chrono/duration_values/max + + (T... args) + + + T + zero + cpp/chrono/duration_values/zero + + (T... args) + + + T + min + cpp/chrono/duration_values/min + + (T... args) + + + + std::chrono::microseconds + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + microseconds + cpp/chrono/duration/duration + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::chrono::nanoseconds + cpp/chrono/duration + + T + operator--(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + min + cpp/chrono/duration/min + + (T... args) + + + T + zero + cpp/chrono/duration/zero + + (T... args) + + + T + operator-- + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator+= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator- + cpp/chrono/duration/operator_arith + + (T... args) + + + T + operator/= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator++ + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator++(int) + cpp/chrono/duration/operator_arith2 + + (T... args) + + + T + operator= + cpp/chrono/duration/operator= + + (T... args) + + + T + operator*= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + operator+ + cpp/chrono/duration/operator_arith + + (T... args) + + + T + count + cpp/chrono/duration/count + + (T... args) + + + T + operator%= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + T + max + cpp/chrono/duration/max + + (T... args) + + + T + nanoseconds + cpp/chrono/duration/duration + + (T... args) + + + T + operator-= + cpp/chrono/duration/operator_arith3 + + (T... args) + + + + std::greater + cpp/utility/functional/greater + + T + operator() + cpp/utility/functional/greater + + (T... args) + + + + std::csub_match + cpp/regex/sub_match + + T + csub_match + cpp/regex/sub_match/sub_match + + (T... args) + + + T + operator string_type + cpp/regex/sub_match/str + + (T... args) + + + T + str + cpp/regex/sub_match/str + + (T... args) + + + T + length + cpp/regex/sub_match/length + + (T... args) + + + T + compare + cpp/regex/sub_match/compare + + (T... args) + + + + std::uintmax_t + cpp/types/integer + + + std::remove_pointer + cpp/types/remove_pointer + + + std::numeric_limits + cpp/types/numeric_limits + + T + lowest + cpp/types/numeric_limits/lowest + + (T... args) + + + T + infinity + cpp/types/numeric_limits/infinity + + (T... args) + + + T + signaling_NaN + cpp/types/numeric_limits/signaling_NaN + + (T... args) + + + T + quiet_NaN + cpp/types/numeric_limits/quiet_NaN + + (T... args) + + + T + denorm_min + cpp/types/numeric_limits/denorm_min + + (T... args) + + + T + max + cpp/types/numeric_limits/max + + (T... args) + + + T + round_error + cpp/types/numeric_limits/round_error + + (T... args) + + + T + min + cpp/types/numeric_limits/min + + (T... args) + + + T + epsilon + cpp/types/numeric_limits/epsilon + + (T... args) + + + + std::add_volatile + cpp/types/add_cv + + + std::once_flag + cpp/thread/once_flag + + T + once_flag + cpp/thread/once_flag + + (T... args) + + + + std::is_literal_type + cpp/types/is_literal_type + + + std::money_base + cpp/locale/money_base + std::money_base::pattern + + + std::money_base::pattern + cpp/locale/money_base + + + std::peta + cpp/numeric/ratio/ratio + + + std::is_placeholder + cpp/utility/functional/is_placeholder + + + std::add_const + cpp/types/add_cv + + + std::basic_stringbuf + cpp/io/basic_stringbuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + str + cpp/io/basic_stringbuf/str + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + basic_stringbuf + cpp/io/basic_stringbuf/basic_stringbuf + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + operator= + cpp/io/basic_stringbuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + + std::tm + cpp/chrono/c/tm + + + std::is_abstract + cpp/types/is_abstract + + + std::deque + cpp/container/deque + + T + pop_front + cpp/container/deque/pop_front + + (T... args) + + + T + push_back + cpp/container/deque/push_back + + (T... args) + + + T + shrink_to_fit + cpp/container/deque/shrink_to_fit + + (T... args) + + + T + crbegin + cpp/container/deque/rbegin + + (T... args) + + + T + erase + cpp/container/deque/erase + + (T... args) + + + T + insert + cpp/container/deque/insert + + (T... args) + + + T + ~deque + cpp/container/deque/~deque + + (T... args) + + + T + back + cpp/container/deque/back + + (T... args) + + + T + end + cpp/container/deque/end + + (T... args) + + + T + push_front + cpp/container/deque/push_front + + (T... args) + + + T + emplace_back + cpp/container/deque/emplace_back + + (T... args) + + + T + pop_back + cpp/container/deque/pop_back + + (T... args) + + + T + cbegin + cpp/container/deque/begin + + (T... args) + + + T + front + cpp/container/deque/front + + (T... args) + + + T + deque + cpp/container/deque/deque + + (T... args) + + + T + size + cpp/container/deque/size + + (T... args) + + + T + resize + cpp/container/deque/resize + + (T... args) + + + T + emplace_front + cpp/container/deque/emplace_front + + (T... args) + + + T + rbegin + cpp/container/deque/rbegin + + (T... args) + + + T + crend + cpp/container/deque/rend + + (T... args) + + + T + assign + cpp/container/deque/assign + + (T... args) + + + T + operator= + cpp/container/deque/operator= + + (T... args) + + + T + empty + cpp/container/deque/empty + + (T... args) + + + T + cend + cpp/container/deque/end + + (T... args) + + + T + swap + cpp/container/deque/swap + + (T... args) + + + T + max_size + cpp/container/deque/max_size + + (T... args) + + + T + rend + cpp/container/deque/rend + + (T... args) + + + T + get_allocator + cpp/container/deque/get_allocator + + (T... args) + + + T + clear + cpp/container/deque/clear + + (T... args) + + + T + at + cpp/container/deque/at + + (T... args) + + + T + emplace + cpp/container/deque/emplace + + (T... args) + + + T + operator[] + cpp/container/deque/operator_at + + (T... args) + + + T + begin + cpp/container/deque/begin + + (T... args) + + + + std::allocator + cpp/memory/allocator + + T + allocator + cpp/memory/allocator/allocator + + (T... args) + + + T + allocate + cpp/memory/allocator/allocate + + (T... args) + + + T + destroy + cpp/memory/allocator/destroy + + (T... args) + + + T + ~allocator + cpp/memory/allocator/~allocator + + (T... args) + + + T + max_size + cpp/memory/allocator/max_size + + (T... args) + + + T + address + cpp/memory/allocator/address + + (T... args) + + + T + deallocate + cpp/memory/allocator/deallocate + + (T... args) + + + T + construct + cpp/memory/allocator/construct + + (T... args) + + + + std::scoped_allocator_adaptor + cpp/memory/scoped_allocator_adaptor + + T + deallocate + cpp/memory/scoped_allocator_adaptor/deallocate + + (T... args) + + + T + scoped_allocator_adaptor + cpp/memory/scoped_allocator_adaptor/scoped_allocator_adaptor + + (T... args) + + + T + destroy + cpp/memory/scoped_allocator_adaptor/destroy + + (T... args) + + + T + construct + cpp/memory/scoped_allocator_adaptor/construct + + (T... args) + + + T + max_size + cpp/memory/scoped_allocator_adaptor/max_size + + (T... args) + + + T + inner_allocator + cpp/memory/scoped_allocator_adaptor/inner_allocator + + (T... args) + + + T + select_on_container_copy_construction + cpp/memory/scoped_allocator_adaptor/select_on_container_copy_construction + + (T... args) + + + T + allocate + cpp/memory/scoped_allocator_adaptor/allocate + + (T... args) + + + T + outer_allocator + cpp/memory/scoped_allocator_adaptor/outer_allocator + + (T... args) + + + T + ~scoped_allocator_adaptor + cpp/memory/scoped_allocator_adaptor/~scoped_allocator_adaptor + + (T... args) + + + + std::ssub_match + cpp/regex/sub_match + + T + operator string_type + cpp/regex/sub_match/str + + (T... args) + + + T + ssub_match + cpp/regex/sub_match/sub_match + + (T... args) + + + T + str + cpp/regex/sub_match/str + + (T... args) + + + T + length + cpp/regex/sub_match/length + + (T... args) + + + T + compare + cpp/regex/sub_match/compare + + (T... args) + + + + std::messages_byname + cpp/locale/messages_byname + + T + do_get + cpp/locale/messages/get + + (T... args) + + std::messages_byname::char_type + std::messages_byname::catalog + + T + ~messages_byname + cpp/locale/messages_byname + + (T... args) + + + T + messages_byname + cpp/locale/messages_byname + + (T... args) + + + T + do_open + cpp/locale/messages/open + + (T... args) + + + T + do_close + cpp/locale/messages/close + + (T... args) + + + T + open + cpp/locale/messages/open + + (T... args) + + std::messages_byname::string_type + + T + get + cpp/locale/messages/get + + (T... args) + + + T + close + cpp/locale/messages/close + + (T... args) + + + + std::messages_byname::char_type + cpp/locale/messages + + + std::messages_byname::catalog + cpp/locale/messages_base + + + std::messages_byname::string_type + cpp/locale/messages + + + std::promise + cpp/thread/promise + + T + set_exception + cpp/thread/promise/set_exception + + (T... args) + + + T + operator= + cpp/thread/promise/operator= + + (T... args) + + + T + swap + cpp/thread/promise/swap + + (T... args) + + + T + set_exception_at_thread_exit + cpp/thread/promise/set_exception_at_thread_exit + + (T... args) + + + T + set_value + cpp/thread/promise/set_value + + (T... args) + + + T + get_future + cpp/thread/promise/get_future + + (T... args) + + + T + promise + cpp/thread/promise/promise + + (T... args) + + + T + ~promise + cpp/thread/promise/~promise + + (T... args) + + + T + set_value_at_thread_exit + cpp/thread/promise/set_value_at_thread_exit + + (T... args) + + + + std::add_pointer + cpp/types/add_pointer + + + std::uintptr_t + cpp/types/integer + + + std::bit_and + cpp/utility/functional/bit_and + + T + operator() + cpp/utility/functional/bit_and + + (T... args) + + + + std::uniform_int_distribution + cpp/numeric/random/uniform_int_distribution + + T + min + cpp/numeric/random/uniform_int_distribution/min + + (T... args) + + + T + b + cpp/numeric/random/uniform_int_distribution/params + + (T... args) + + + T + a + cpp/numeric/random/uniform_int_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/uniform_int_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/uniform_int_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/uniform_int_distribution/param + + (T... args) + + + T + reset + cpp/numeric/random/uniform_int_distribution/reset + + (T... args) + + + T + uniform_int_distribution + cpp/numeric/random/uniform_int_distribution/uniform_int_distribution + + (T... args) + + + + std::type_info + cpp/types/type_info + + T + operator!= + cpp/types/type_info/operator_cmp + + (T... args) + + + T + before + cpp/types/type_info/before + + (T... args) + + + T + name + cpp/types/type_info/name + + (T... args) + + + T + operator== + cpp/types/type_info/operator_cmp + + (T... args) + + + T + hash_code + cpp/types/type_info/hash_code + + (T... args) + + + + std::fisher_f_distribution + cpp/numeric/random/fisher_f_distribution + + T + fisher_f_distribution + cpp/numeric/random/fisher_f_distribution/fisher_f_distribution + + (T... args) + + + T + n + cpp/numeric/random/fisher_f_distribution/params + + (T... args) + + + T + reset + cpp/numeric/random/fisher_f_distribution/reset + + (T... args) + + + T + m + cpp/numeric/random/fisher_f_distribution/params + + (T... args) + + + T + operator() + cpp/numeric/random/fisher_f_distribution/operator() + + (T... args) + + + T + max + cpp/numeric/random/fisher_f_distribution/max + + (T... args) + + + T + param + cpp/numeric/random/fisher_f_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/fisher_f_distribution/min + + (T... args) + + + + std::strstream + cpp/io/strstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/strstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + pcount + cpp/io/strstream/pcount + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::strstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::strstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::strstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + strstream + cpp/io/strstream/strstream + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + freeze + cpp/io/strstream/freeze + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + ~strstream + cpp/io/strstream/~strstream + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::strstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::strstream::event_callback + cpp/io/ios_base/event_callback + + + std::strstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::time_get_byname + cpp/locale/time_get_byname + + T + do_get + cpp/locale/time_get/get + + (T... args) + + + T + do_get_monthname + cpp/locale/time_get/get_monthname + + (T... args) + + + T + get_weekday + cpp/locale/time_get/get_weekday + + (T... args) + + + T + do_get_time + cpp/locale/time_get/get_time + + (T... args) + + + T + time_get_byname + cpp/locale/time_get_byname + + (T... args) + + + T + do_get_year + cpp/locale/time_get/get_year + + (T... args) + + std::time_get_byname::iter_type + + T + get_monthname + cpp/locale/time_get/get_monthname + + (T... args) + + + T + ~time_get_byname + cpp/locale/time_get_byname + + (T... args) + + + T + get_time + cpp/locale/time_get/get_time + + (T... args) + + std::time_get_byname::char_type + + T + do_get_date + cpp/locale/time_get/get_date + + (T... args) + + + T + get_date + cpp/locale/time_get/get_date + + (T... args) + + + T + do_date_order + cpp/locale/time_get/date_order + + (T... args) + + + T + get_year + cpp/locale/time_get/get_year + + (T... args) + + + T + date_order + cpp/locale/time_get/date_order + + (T... args) + + + T + get + cpp/locale/time_get/get + + (T... args) + + + T + do_get_weekday + cpp/locale/time_get/get_weekday + + (T... args) + + + + std::time_get_byname::iter_type + cpp/locale/time_get + + + std::time_get_byname::char_type + cpp/locale/time_get + + + std::basic_streambuf + cpp/io/basic_streambuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + basic_streambuf + cpp/io/basic_streambuf/basic_streambuf + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + operator= + cpp/io/basic_streambuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + ~basic_streambuf + cpp/io/basic_streambuf/~basic_streambuf + + (T... args) + + + + std::is_nothrow_constructible + cpp/types/is_constructible + + + std::queue + cpp/container/queue + + T + operator= + cpp/container/queue/operator= + + (T... args) + + + T + swap + cpp/container/queue/swap + + (T... args) + + + T + emplace + cpp/container/queue/emplace + + (T... args) + + + T + empty + cpp/container/queue/empty + + (T... args) + + + T + ~queue + cpp/container/queue/~queue + + (T... args) + + + T + pop + cpp/container/queue/pop + + (T... args) + + + T + front + cpp/container/queue/front + + (T... args) + + + T + push + cpp/container/queue/push + + (T... args) + + + T + queue + cpp/container/queue/queue + + (T... args) + + + T + back + cpp/container/queue/back + + (T... args) + + + T + size + cpp/container/queue/size + + (T... args) + + + + std::is_base_of + cpp/types/is_base_of + + + std::intmax_t + cpp/types/integer + + + std::ranlux24 + cpp/numeric/random/discard_block_engine + + T + discard + cpp/numeric/random/discard_block_engine/discard + + (T... args) + + + T + ranlux24 + cpp/numeric/random/discard_block_engine/discard_block_engine + + (T... args) + + + T + max + cpp/numeric/random/discard_block_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/discard_block_engine/operator() + + (T... args) + + + T + base + cpp/numeric/random/discard_block_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/discard_block_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/discard_block_engine/min + + (T... args) + + + + std::remove_cv + cpp/types/remove_cv + + + std::is_trivially_destructible + cpp/types/is_destructible + + + std::wcin + cpp/io/basic_istream + + + std::atomic + cpp/atomic/atomic + + T + store + cpp/atomic/atomic/store + + (T... args) + + + T + compare_exchange_strong + cpp/atomic/atomic/compare_exchange + + (T... args) + + + T + load + cpp/atomic/atomic/load + + (T... args) + + + T + operator--(int) + cpp/atomic/atomic/operator_arith + + (T... args) + + + T + operator+= + cpp/atomic/atomic/operator_arith2 + + (T... args) + + + T + fetch_or + cpp/atomic/atomic/fetch_or + + (T... args) + + + T + fetch_xor + cpp/atomic/atomic/fetch_xor + + (T... args) + + + T + operator^= + cpp/atomic/atomic/operator_arith2 + + (T... args) + + + T + operator|= + cpp/atomic/atomic/operator_arith2 + + (T... args) + + + T + compare_exchange_weak + cpp/atomic/atomic/compare_exchange + + (T... args) + + + T + operator-= + cpp/atomic/atomic/operator_arith2 + + (T... args) + + + T + fetch_add + cpp/atomic/atomic/fetch_add + + (T... args) + + + T + operator&= + cpp/atomic/atomic/operator_arith2 + + (T... args) + + + T + operator-- + cpp/atomic/atomic/operator_arith + + (T... args) + + + T + atomic + cpp/atomic/atomic/atomic + + (T... args) + + + T + fetch_and + cpp/atomic/atomic/fetch_and + + (T... args) + + + T + exchange + cpp/atomic/atomic/exchange + + (T... args) + + + T + operator T + cpp/atomic/atomic/operator_T + + (T... args) + + + T + operator++(int) + cpp/atomic/atomic/operator_arith + + (T... args) + + + T + operator= + cpp/atomic/atomic/operator= + + (T... args) + + + T + operator++ + cpp/atomic/atomic/operator_arith + + (T... args) + + + T + fetch_sub + cpp/atomic/atomic/fetch_sub + + (T... args) + + + T + is_lock_free + cpp/atomic/atomic/is_lock_free + + (T... args) + + + + std::basic_stringstream + cpp/io/basic_stringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_stringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + basic_stringstream + cpp/io/basic_stringstream/basic_stringstream + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::basic_stringstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::basic_stringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_stringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_stringstream/operator= + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_stringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::basic_stringstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_stringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_void + cpp/types/is_void + + + std::plus + cpp/utility/functional/plus + + T + operator() + cpp/utility/functional/plus + + (T... args) + + + + std::bitset + cpp/utility/bitset + + T + none + cpp/utility/bitset/all_any_none + + (T... args) + + + T + operator<< + cpp/utility/bitset/operator_ltltgtgt + + (T... args) + + + T + operator>> + cpp/utility/bitset/operator_ltltgtgt + + (T... args) + + std::bitset::reference + + T + reset + cpp/utility/bitset/reset + + (T... args) + + + T + count + cpp/utility/bitset/count + + (T... args) + + + T + operator<<= + cpp/utility/bitset/operator_ltltgtgt + + (T... args) + + + T + operator|= + cpp/utility/bitset/operator_logic + + (T... args) + + + T + operator&= + cpp/utility/bitset/operator_logic + + (T... args) + + + T + bitset + cpp/utility/bitset/bitset + + (T... args) + + + T + size + cpp/utility/bitset/size + + (T... args) + + + T + set + cpp/utility/bitset/set + + (T... args) + + + T + all + cpp/utility/bitset/all_any_none + + (T... args) + + + T + to_string + cpp/utility/bitset/to_string + + (T... args) + + + T + operator!= + cpp/utility/bitset/operator_cmp + + (T... args) + + + T + any + cpp/utility/bitset/all_any_none + + (T... args) + + + T + test + cpp/utility/bitset/test + + (T... args) + + + T + operator== + cpp/utility/bitset/operator_cmp + + (T... args) + + + T + operator>>= + cpp/utility/bitset/operator_ltltgtgt + + (T... args) + + + T + to_ulong + cpp/utility/bitset/to_ulong + + (T... args) + + + T + operator^= + cpp/utility/bitset/operator_logic + + (T... args) + + + T + operator~ + cpp/utility/bitset/operator_logic + + (T... args) + + + T + to_ullong + cpp/utility/bitset/to_ullong + + (T... args) + + + T + operator[] + cpp/utility/bitset/operator_at + + (T... args) + + + T + flip + cpp/utility/bitset/flip + + (T... args) + + + + std::bitset::reference + cpp/utility/bitset/reference + + + std::FILE + cpp/io/c + + + std::thread + cpp/thread/thread + + T + joinable + cpp/thread/thread/joinable + + (T... args) + + + T + operator= + cpp/thread/thread/operator= + + (T... args) + + + T + native_handle + cpp/thread/thread/native_handle + + (T... args) + + + T + ~thread + cpp/thread/thread/~thread + + (T... args) + + + T + swap + cpp/thread/thread/swap + + (T... args) + + + T + hardware_concurrency + cpp/thread/thread/hardware_concurrency + + (T... args) + + std::thread::id + + T + thread + cpp/thread/thread/thread + + (T... args) + + + T + join + cpp/thread/thread/join + + (T... args) + + + T + detach + cpp/thread/thread/detach + + (T... args) + + + T + get_id + cpp/thread/thread/get_id + + (T... args) + + + + std::thread::id + cpp/thread/thread/id + + T + operator!= + cpp/thread/thread/id/operator_cmp + + (T... args) + + + T + operator>= + cpp/thread/thread/id/operator_cmp + + (T... args) + + + T + operator<= + cpp/thread/thread/id/operator_cmp + + (T... args) + + + T + operator< + cpp/thread/thread/id/operator_cmp + + (T... args) + + + T + operator== + cpp/thread/thread/id/operator_cmp + + (T... args) + + + T + operator<< + cpp/thread/thread/id/operator_ltlt + + (T... args) + + + T + id + cpp/thread/thread/id/id + + (T... args) + + + T + operator> + cpp/thread/thread/id/operator_cmp + + (T... args) + + + + std::future_error + cpp/thread/future_error + + T + code + cpp/thread/future_error/code + + (T... args) + + + T + future_error + cpp/thread/future_error/future_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::time_base + cpp/locale/time_base + + + std::alignment_of + cpp/types/alignment_of + + + std::time_put + cpp/locale/time_put + std::time_put::char_type + std::time_put::iter_type + + T + do_put + cpp/locale/time_put/put + + (T... args) + + + T + ~time_put + cpp/locale/time_put/~time_put + + (T... args) + + + T + put + cpp/locale/time_put/put + + (T... args) + + + T + time_put + cpp/locale/time_put/time_put + + (T... args) + + + + std::time_put::char_type + cpp/locale/time_put + + + std::time_put::iter_type + cpp/locale/time_put + + + std::bit_or + cpp/utility/functional/bit_or + + T + operator() + cpp/utility/functional/bit_or + + (T... args) + + + + std::pointer_traits + cpp/memory/pointer_traits + + T + pointer_to + cpp/memory/pointer_traits/pointer_to + + (T... args) + + + + std::basic_string + cpp/string/basic_string + + T + push_back + cpp/string/basic_string/push_back + + (T... args) + + + T + shrink_to_fit + cpp/string/basic_string/shrink_to_fit + + (T... args) + + + T + rfind + cpp/string/basic_string/rfind + + (T... args) + + + T + begin + cpp/string/basic_string/begin + + (T... args) + + + T + erase + cpp/string/basic_string/erase + + (T... args) + + + T + append + cpp/string/basic_string/append + + (T... args) + + + T + data + cpp/string/basic_string/data + + (T... args) + + + T + insert + cpp/string/basic_string/insert + + (T... args) + + + T + assign + cpp/string/basic_string/assign + + (T... args) + + + T + find_first_not_of + cpp/string/basic_string/find_first_not_of + + (T... args) + + + T + back + cpp/string/basic_string/back + + (T... args) + + + T + end + cpp/string/basic_string/end + + (T... args) + + + T + resize + cpp/string/basic_string/resize + + (T... args) + + + T + copy + cpp/string/basic_string/copy + + (T... args) + + + T + find_last_of + cpp/string/basic_string/find_last_of + + (T... args) + + + T + pop_back + cpp/string/basic_string/pop_back + + (T... args) + + + T + cbegin + cpp/string/basic_string/begin + + (T... args) + + + T + replace + cpp/string/basic_string/replace + + (T... args) + + + T + front + cpp/string/basic_string/front + + (T... args) + + + T + find + cpp/string/basic_string/find + + (T... args) + + + T + compare + cpp/string/basic_string/compare + + (T... args) + + + T + crbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + at + cpp/string/basic_string/at + + (T... args) + + + T + find_first_of + cpp/string/basic_string/find_first_of + + (T... args) + + + T + rbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + crend + cpp/string/basic_string/rend + + (T... args) + + + T + size + cpp/string/basic_string/size + + (T... args) + + + T + operator= + cpp/string/basic_string/operator= + + (T... args) + + + T + find_last_not_of + cpp/string/basic_string/find_last_not_of + + (T... args) + + + T + reserve + cpp/string/basic_string/reserve + + (T... args) + + + T + capacity + cpp/string/basic_string/capacity + + (T... args) + + + T + c_str + cpp/string/basic_string/c_str + + (T... args) + + + T + empty + cpp/string/basic_string/empty + + (T... args) + + + T + cend + cpp/string/basic_string/end + + (T... args) + + + T + substr + cpp/string/basic_string/substr + + (T... args) + + + T + max_size + cpp/string/basic_string/max_size + + (T... args) + + + T + rend + cpp/string/basic_string/rend + + (T... args) + + + T + get_allocator + cpp/string/basic_string/get_allocator + + (T... args) + + + T + clear + cpp/string/basic_string/clear + + (T... args) + + + T + swap + cpp/string/basic_string/swap + + (T... args) + + + T + operator[] + cpp/string/basic_string/operator_at + + (T... args) + + + T + length + cpp/string/basic_string/size + + (T... args) + + + T + basic_string + cpp/string/basic_string/basic_string + + (T... args) + + + + std::priority_queue + cpp/container/priority_queue + + T + empty + cpp/container/priority_queue/empty + + (T... args) + + + T + swap + cpp/container/priority_queue/swap + + (T... args) + + + T + priority_queue + cpp/container/priority_queue/priority_queue + + (T... args) + + + T + size + cpp/container/priority_queue/size + + (T... args) + + + T + operator= + cpp/container/priority_queue/operator= + + (T... args) + + + T + pop + cpp/container/priority_queue/pop + + (T... args) + + + T + emplace + cpp/container/priority_queue/emplace + + (T... args) + + + T + push + cpp/container/priority_queue/push + + (T... args) + + + T + top + cpp/container/priority_queue/top + + (T... args) + + + T + ~priority_queue + cpp/container/priority_queue/~priority_queue + + (T... args) + + + + std::exa + cpp/numeric/ratio/ratio + + + std::wostringstream + cpp/io/basic_ostringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_ostringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::wostringstream::event_callback + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + wostringstream + cpp/io/basic_ostringstream/basic_ostringstream + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wostringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + operator= + cpp/io/basic_ostringstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::wostringstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wostringstream::event_callback + cpp/io/ios_base/event_callback + + + std::wostringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wostringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::is_default_constructible + cpp/types/is_default_constructible + + + std::cregex_iterator + cpp/regex/regex_iterator + + T + operator!= + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_iterator/operator= + + (T... args) + + + T + cregex_iterator + cpp/regex/regex_iterator/regex_iterator + + (T... args) + + + T + operator-> + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + T + operator== + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator* + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + + std::wstring + cpp/string/basic_string + + T + push_back + cpp/string/basic_string/push_back + + (T... args) + + + T + shrink_to_fit + cpp/string/basic_string/shrink_to_fit + + (T... args) + + + T + rfind + cpp/string/basic_string/rfind + + (T... args) + + + T + begin + cpp/string/basic_string/begin + + (T... args) + + + T + erase + cpp/string/basic_string/erase + + (T... args) + + + T + append + cpp/string/basic_string/append + + (T... args) + + + T + data + cpp/string/basic_string/data + + (T... args) + + + T + insert + cpp/string/basic_string/insert + + (T... args) + + + T + assign + cpp/string/basic_string/assign + + (T... args) + + + T + find_first_not_of + cpp/string/basic_string/find_first_not_of + + (T... args) + + + T + back + cpp/string/basic_string/back + + (T... args) + + + T + end + cpp/string/basic_string/end + + (T... args) + + + T + resize + cpp/string/basic_string/resize + + (T... args) + + + T + copy + cpp/string/basic_string/copy + + (T... args) + + + T + find_last_of + cpp/string/basic_string/find_last_of + + (T... args) + + + T + pop_back + cpp/string/basic_string/pop_back + + (T... args) + + + T + replace + cpp/string/basic_string/replace + + (T... args) + + + T + wstring + cpp/string/basic_string/basic_string + + (T... args) + + + T + front + cpp/string/basic_string/front + + (T... args) + + + T + find + cpp/string/basic_string/find + + (T... args) + + + T + compare + cpp/string/basic_string/compare + + (T... args) + + + T + crbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + cbegin + cpp/string/basic_string/begin + + (T... args) + + + T + find_first_of + cpp/string/basic_string/find_first_of + + (T... args) + + + T + rbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + crend + cpp/string/basic_string/rend + + (T... args) + + + T + size + cpp/string/basic_string/size + + (T... args) + + + T + operator= + cpp/string/basic_string/operator= + + (T... args) + + + T + find_last_not_of + cpp/string/basic_string/find_last_not_of + + (T... args) + + + T + reserve + cpp/string/basic_string/reserve + + (T... args) + + + T + capacity + cpp/string/basic_string/capacity + + (T... args) + + + T + c_str + cpp/string/basic_string/c_str + + (T... args) + + + T + empty + cpp/string/basic_string/empty + + (T... args) + + + T + cend + cpp/string/basic_string/end + + (T... args) + + + T + substr + cpp/string/basic_string/substr + + (T... args) + + + T + max_size + cpp/string/basic_string/max_size + + (T... args) + + + T + rend + cpp/string/basic_string/rend + + (T... args) + + + T + get_allocator + cpp/string/basic_string/get_allocator + + (T... args) + + + T + clear + cpp/string/basic_string/clear + + (T... args) + + + T + at + cpp/string/basic_string/at + + (T... args) + + + T + swap + cpp/string/basic_string/swap + + (T... args) + + + T + operator[] + cpp/string/basic_string/operator_at + + (T... args) + + + T + length + cpp/string/basic_string/size + + (T... args) + + + + std::remove_all_extents + cpp/types/remove_all_extents + + + std::istrstream + cpp/io/istrstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + ~istrstream + cpp/io/istrstream/~istrstream + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/istrstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::istrstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::istrstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + istrstream + cpp/io/istrstream/istrstream + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + std::istrstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::istrstream::event_callback + cpp/io/ios_base/event_callback + + + std::istrstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::istrstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::unary_negate + cpp/utility/functional/unary_negate + + T + operator() + cpp/utility/functional/unary_negate + + (T... args) + + + T + unary_negate + cpp/utility/functional/unary_negate + + (T... args) + + + + std::unordered_multiset + cpp/container/unordered_multiset + + T + max_bucket_count + cpp/container/unordered_multiset/max_bucket_count + + (T... args) + + + T + cbegin + cpp/container/unordered_multiset/begin + + (T... args) + + + T + erase + cpp/container/unordered_multiset/erase + + (T... args) + + + T + insert + cpp/container/unordered_multiset/insert + + (T... args) + + + T + bucket_count + cpp/container/unordered_multiset/bucket_count + + (T... args) + + + T + max_load_factor + cpp/container/unordered_multiset/max_load_factor + + (T... args) + + + T + end + cpp/container/unordered_multiset/end + + (T... args) + + + T + emplace_hint + cpp/container/unordered_multiset/emplace_hint + + (T... args) + + + T + unordered_multiset + cpp/container/unordered_multiset/unordered_multiset + + (T... args) + + + T + end(int) + cpp/container/unordered_multiset/end2 + + (T... args) + + + T + key_eq + cpp/container/unordered_multiset/key_eq + + (T... args) + + + T + hash_function + cpp/container/unordered_multiset/hash_function + + (T... args) + + + T + equal_range + cpp/container/unordered_multiset/equal_range + + (T... args) + + + T + begin + cpp/container/unordered_multiset/begin + + (T... args) + + + T + cbegin(int) + cpp/container/unordered_multiset/begin2 + + (T... args) + + + T + swap + cpp/container/unordered_multiset/swap + + (T... args) + + + T + ~unordered_multiset + cpp/container/unordered_multiset/~unordered_multiset + + (T... args) + + + T + load_factor + cpp/container/unordered_multiset/load_factor + + (T... args) + + + T + size + cpp/container/unordered_multiset/size + + (T... args) + + + T + operator= + cpp/container/unordered_multiset/operator= + + (T... args) + + + T + cend + cpp/container/unordered_multiset/end + + (T... args) + + + T + reserve + cpp/container/unordered_multiset/reserve + + (T... args) + + + T + rehash + cpp/container/unordered_multiset/rehash + + (T... args) + + + T + bucket + cpp/container/unordered_multiset/bucket + + (T... args) + + + T + find + cpp/container/unordered_multiset/find + + (T... args) + + + T + empty + cpp/container/unordered_multiset/empty + + (T... args) + + + T + get_allocator + cpp/container/unordered_multiset/get_allocator + + (T... args) + + + T + max_size + cpp/container/unordered_multiset/max_size + + (T... args) + + + T + cend(int) + cpp/container/unordered_multiset/end2 + + (T... args) + + + T + count + cpp/container/unordered_multiset/count + + (T... args) + + + T + clear + cpp/container/unordered_multiset/clear + + (T... args) + + + T + begin(int) + cpp/container/unordered_multiset/begin2 + + (T... args) + + + T + emplace + cpp/container/unordered_multiset/emplace + + (T... args) + + + T + bucket_size + cpp/container/unordered_multiset/bucket_size + + (T... args) + + + + std::basic_ostream + cpp/io/basic_ostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::basic_ostream::event_callback + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_ostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + basic_ostream + cpp/io/basic_ostream/basic_ostream + + (T... args) + + + T + ~basic_ostream + cpp/io/basic_ostream/~basic_ostream + + (T... args) + + std::basic_ostream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_ostream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_ostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_ostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::wsregex_iterator + cpp/regex/regex_iterator + + T + wsregex_iterator + cpp/regex/regex_iterator/regex_iterator + + (T... args) + + + T + operator= + cpp/regex/regex_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_iterator/operator* + + (T... args) + + + T + operator!= + cpp/regex/regex_iterator/operator_cmp + + (T... args) + + + T + operator++(int) + cpp/regex/regex_iterator/operator_arith + + (T... args) + + + + std::uint_fast16_t + cpp/types/integer + + + std::is_nothrow_assignable + cpp/types/is_assignable + + + std::moneypunct + cpp/locale/moneypunct + + T + do_curr_symbol + cpp/locale/moneypunct/curr_symbol + + (T... args) + + + T + do_decimal_point + cpp/locale/moneypunct/decimal_point + + (T... args) + + + T + thousands_sep + cpp/locale/moneypunct/thousands_sep + + (T... args) + + + T + do_pos_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + curr_symbol + cpp/locale/moneypunct/curr_symbol + + (T... args) + + + T + positive_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + frac_digits + cpp/locale/moneypunct/frac_digits + + (T... args) + + + T + do_negative_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + ~moneypunct + cpp/locale/moneypunct/~moneypunct + + (T... args) + + + T + pos_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + do_thousands_sep + cpp/locale/moneypunct/thousands_sep + + (T... args) + + + T + neg_format + cpp/locale/moneypunct/pos_format + + (T... args) + + + T + negative_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + + T + grouping + cpp/locale/moneypunct/grouping + + (T... args) + + + T + do_frac_digits + cpp/locale/moneypunct/frac_digits + + (T... args) + + + T + decimal_point + cpp/locale/moneypunct/decimal_point + + (T... args) + + + T + do_neg_format + cpp/locale/moneypunct/pos_format + + (T... args) + + std::moneypunct::string_type + std::moneypunct::pattern + + T + do_positive_sign + cpp/locale/moneypunct/positive_sign + + (T... args) + + std::moneypunct::char_type + + T + moneypunct + cpp/locale/moneypunct/moneypunct + + (T... args) + + + T + do_grouping + cpp/locale/moneypunct/grouping + + (T... args) + + + + std::moneypunct::string_type + cpp/locale/moneypunct + + + std::moneypunct::pattern + cpp/locale/money_base + + + std::moneypunct::char_type + cpp/locale/moneypunct + + + std::type_index + cpp/types/type_index + + T + operator!= + cpp/types/type_index/operator_cmp + + (T... args) + + + T + hash_code + cpp/types/type_index/hash_code + + (T... args) + + + T + operator<= + cpp/types/type_index/operator_cmp + + (T... args) + + + T + operator< + cpp/types/type_index/operator_cmp + + (T... args) + + + T + operator== + cpp/types/type_index/operator_cmp + + (T... args) + + + T + operator>= + cpp/types/type_index/operator_cmp + + (T... args) + + + T + type_index + cpp/types/type_index/type_index + + (T... args) + + + T + name + cpp/types/type_index/name + + (T... args) + + + T + operator> + cpp/types/type_index/operator_cmp + + (T... args) + + + + std::is_standard_layout + cpp/types/is_standard_layout + + + std::timed_mutex + cpp/thread/timed_mutex + + T + unlock + cpp/thread/timed_mutex/unlock + + (T... args) + + + T + native_handle + cpp/thread/timed_mutex/native_handle + + (T... args) + + + T + try_lock_until + cpp/thread/timed_mutex/try_lock_until + + (T... args) + + + T + try_lock_for + cpp/thread/timed_mutex/try_lock_for + + (T... args) + + + T + lock + cpp/thread/timed_mutex/lock + + (T... args) + + + T + try_lock + cpp/thread/timed_mutex/try_lock + + (T... args) + + + T + timed_mutex + cpp/thread/timed_mutex/timed_mutex + + (T... args) + + + + std::bad_exception + cpp/error/bad_exception + + + std::int_fast64_t + cpp/types/integer + + + std::function + cpp/utility/functional/function + + T + operator= + cpp/utility/functional/function/operator= + + (T... args) + + + T + swap + cpp/utility/functional/function/swap + + (T... args) + + + T + assign + cpp/utility/functional/function/assign + + (T... args) + + + T + target + cpp/utility/functional/function/target + + (T... args) + + + T + operator() + cpp/utility/functional/function/operator() + + (T... args) + + + T + target_type + cpp/utility/functional/function/target_type + + (T... args) + + + T + function + cpp/utility/functional/function/function + + (T... args) + + + T + operator bool + cpp/utility/functional/function/operator_bool + + (T... args) + + + T + ~function + cpp/utility/functional/function/~function + + (T... args) + + + + std::bad_cast + cpp/types/bad_cast + + T + bad_cast + cpp/types/bad_cast/bad_cast + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::error_condition + cpp/error/error_condition + + T + error_condition + cpp/error/error_condition/error_condition + + (T... args) + + + T + operator= + cpp/error/error_condition/operator= + + (T... args) + + + T + operator bool + cpp/error/error_condition/operator_bool + + (T... args) + + + T + assign + cpp/error/error_condition/assign + + (T... args) + + + T + value + cpp/error/error_condition/value + + (T... args) + + + T + clear + cpp/error/error_condition/clear + + (T... args) + + + T + message + cpp/error/error_condition/message + + (T... args) + + + T + category + cpp/error/error_condition/category + + (T... args) + + + + std::filebuf + cpp/io/basic_filebuf + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + is_open + cpp/io/basic_filebuf/is_open + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + filebuf + cpp/io/basic_filebuf/basic_filebuf + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + close + cpp/io/basic_filebuf/close + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + open + cpp/io/basic_filebuf/open + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + ~filebuf + cpp/io/basic_filebuf/~basic_filebuf + + (T... args) + + + T + operator= + cpp/io/basic_filebuf/operator= + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + + std::int_least16_t + cpp/types/integer + + + std::istreambuf_iterator + cpp/iterator/istreambuf_iterator + + + std::u16string + cpp/string/basic_string + + T + push_back + cpp/string/basic_string/push_back + + (T... args) + + + T + shrink_to_fit + cpp/string/basic_string/shrink_to_fit + + (T... args) + + + T + rfind + cpp/string/basic_string/rfind + + (T... args) + + + T + begin + cpp/string/basic_string/begin + + (T... args) + + + T + erase + cpp/string/basic_string/erase + + (T... args) + + + T + append + cpp/string/basic_string/append + + (T... args) + + + T + data + cpp/string/basic_string/data + + (T... args) + + + T + insert + cpp/string/basic_string/insert + + (T... args) + + + T + assign + cpp/string/basic_string/assign + + (T... args) + + + T + find_first_not_of + cpp/string/basic_string/find_first_not_of + + (T... args) + + + T + back + cpp/string/basic_string/back + + (T... args) + + + T + end + cpp/string/basic_string/end + + (T... args) + + + T + resize + cpp/string/basic_string/resize + + (T... args) + + + T + copy + cpp/string/basic_string/copy + + (T... args) + + + T + find_last_of + cpp/string/basic_string/find_last_of + + (T... args) + + + T + pop_back + cpp/string/basic_string/pop_back + + (T... args) + + + T + replace + cpp/string/basic_string/replace + + (T... args) + + + T + front + cpp/string/basic_string/front + + (T... args) + + + T + substr + cpp/string/basic_string/substr + + (T... args) + + + T + find + cpp/string/basic_string/find + + (T... args) + + + T + compare + cpp/string/basic_string/compare + + (T... args) + + + T + crbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + cbegin + cpp/string/basic_string/begin + + (T... args) + + + T + find_first_of + cpp/string/basic_string/find_first_of + + (T... args) + + + T + rbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + crend + cpp/string/basic_string/rend + + (T... args) + + + T + size + cpp/string/basic_string/size + + (T... args) + + + T + operator= + cpp/string/basic_string/operator= + + (T... args) + + + T + find_last_not_of + cpp/string/basic_string/find_last_not_of + + (T... args) + + + T + reserve + cpp/string/basic_string/reserve + + (T... args) + + + T + capacity + cpp/string/basic_string/capacity + + (T... args) + + + T + c_str + cpp/string/basic_string/c_str + + (T... args) + + + T + empty + cpp/string/basic_string/empty + + (T... args) + + + T + cend + cpp/string/basic_string/end + + (T... args) + + + T + u16string + cpp/string/basic_string/basic_string + + (T... args) + + + T + max_size + cpp/string/basic_string/max_size + + (T... args) + + + T + rend + cpp/string/basic_string/rend + + (T... args) + + + T + get_allocator + cpp/string/basic_string/get_allocator + + (T... args) + + + T + clear + cpp/string/basic_string/clear + + (T... args) + + + T + at + cpp/string/basic_string/at + + (T... args) + + + T + swap + cpp/string/basic_string/swap + + (T... args) + + + T + operator[] + cpp/string/basic_string/operator_at + + (T... args) + + + T + length + cpp/string/basic_string/size + + (T... args) + + + + std::is_error_condition_enum + cpp/error/error_condition/is_error_condition_enum + + + std::is_nothrow_destructible + cpp/types/is_destructible + + + std::wiostream + cpp/io/basic_iostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::wiostream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::wiostream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + wiostream + cpp/io/basic_iostream/basic_iostream + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wiostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + ~wiostream + cpp/io/basic_iostream/~basic_iostream + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wiostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::wiostream::event_callback + cpp/io/ios_base/event_callback + + + std::wiostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::allocator_arg_t + cpp/memory/allocator_arg_t + + + std::rel_ops + + + T + operator!= + cpp/utility/rel_ops/operator_cmp + + (T... args) + + + T + operator>= + cpp/utility/rel_ops/operator_cmp + + (T... args) + + + T + operator<= + cpp/utility/rel_ops/operator_cmp + + (T... args) + + + T + operator> + cpp/utility/rel_ops/operator_cmp + + (T... args) + + + + std::uint_least32_t + cpp/types/integer + + + std::collate + cpp/locale/collate + + T + hash + cpp/locale/collate/hash + + (T... args) + + + T + do_hash + cpp/locale/collate/hash + + (T... args) + + + T + collate + cpp/locale/collate/collate + + (T... args) + + std::collate::char_type + + T + ~collate + cpp/locale/collate/~collate + + (T... args) + + + T + do_transform + cpp/locale/collate/transform + + (T... args) + + + T + transform + cpp/locale/collate/transform + + (T... args) + + + T + do_compare + cpp/locale/collate/compare + + (T... args) + + std::collate::string_type + + T + compare + cpp/locale/collate/compare + + (T... args) + + + + std::collate::char_type + cpp/locale/collate + + + std::collate::string_type + cpp/locale/collate + + + std::remove_const + cpp/types/remove_cv + + + std::u32string + cpp/string/basic_string + + T + push_back + cpp/string/basic_string/push_back + + (T... args) + + + T + shrink_to_fit + cpp/string/basic_string/shrink_to_fit + + (T... args) + + + T + rfind + cpp/string/basic_string/rfind + + (T... args) + + + T + begin + cpp/string/basic_string/begin + + (T... args) + + + T + erase + cpp/string/basic_string/erase + + (T... args) + + + T + append + cpp/string/basic_string/append + + (T... args) + + + T + data + cpp/string/basic_string/data + + (T... args) + + + T + insert + cpp/string/basic_string/insert + + (T... args) + + + T + u32string + cpp/string/basic_string/basic_string + + (T... args) + + + T + find_first_not_of + cpp/string/basic_string/find_first_not_of + + (T... args) + + + T + back + cpp/string/basic_string/back + + (T... args) + + + T + end + cpp/string/basic_string/end + + (T... args) + + + T + resize + cpp/string/basic_string/resize + + (T... args) + + + T + copy + cpp/string/basic_string/copy + + (T... args) + + + T + find_last_of + cpp/string/basic_string/find_last_of + + (T... args) + + + T + pop_back + cpp/string/basic_string/pop_back + + (T... args) + + + T + cbegin + cpp/string/basic_string/begin + + (T... args) + + + T + replace + cpp/string/basic_string/replace + + (T... args) + + + T + front + cpp/string/basic_string/front + + (T... args) + + + T + find + cpp/string/basic_string/find + + (T... args) + + + T + compare + cpp/string/basic_string/compare + + (T... args) + + + T + crbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + size + cpp/string/basic_string/size + + (T... args) + + + T + find_first_of + cpp/string/basic_string/find_first_of + + (T... args) + + + T + rbegin + cpp/string/basic_string/rbegin + + (T... args) + + + T + crend + cpp/string/basic_string/rend + + (T... args) + + + T + assign + cpp/string/basic_string/assign + + (T... args) + + + T + operator= + cpp/string/basic_string/operator= + + (T... args) + + + T + find_last_not_of + cpp/string/basic_string/find_last_not_of + + (T... args) + + + T + reserve + cpp/string/basic_string/reserve + + (T... args) + + + T + capacity + cpp/string/basic_string/capacity + + (T... args) + + + T + c_str + cpp/string/basic_string/c_str + + (T... args) + + + T + empty + cpp/string/basic_string/empty + + (T... args) + + + T + cend + cpp/string/basic_string/end + + (T... args) + + + T + substr + cpp/string/basic_string/substr + + (T... args) + + + T + max_size + cpp/string/basic_string/max_size + + (T... args) + + + T + rend + cpp/string/basic_string/rend + + (T... args) + + + T + get_allocator + cpp/string/basic_string/get_allocator + + (T... args) + + + T + clear + cpp/string/basic_string/clear + + (T... args) + + + T + at + cpp/string/basic_string/at + + (T... args) + + + T + swap + cpp/string/basic_string/swap + + (T... args) + + + T + operator[] + cpp/string/basic_string/operator_at + + (T... args) + + + T + length + cpp/string/basic_string/size + + (T... args) + + + + std::uint_fast32_t + cpp/types/integer + + + std::is_lvalue_reference + cpp/types/is_lvalue_reference + + + std::complex + cpp/numeric/complex + + T + operator= + cpp/numeric/complex/operator= + + (T... args) + + + T + complex + cpp/numeric/complex/complex + + (T... args) + + + T + operator-= + cpp/numeric/complex/operator_arith + + (T... args) + + + T + imag + cpp/numeric/complex/imag + + (T... args) + + + T + operator+= + cpp/numeric/complex/operator_arith + + (T... args) + + + T + operator/= + cpp/numeric/complex/operator_arith + + (T... args) + + + T + operator*= + cpp/numeric/complex/operator_arith + + (T... args) + + + T + real + cpp/numeric/complex/real + + (T... args) + + + + std::ofstream + cpp/io/basic_ofstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::ofstream::event_callback + + T + open + cpp/io/basic_ofstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ofstream/close + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::ofstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ofstream/is_open + + (T... args) + + + T + operator= + cpp/io/basic_ofstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::ofstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + ofstream + cpp/io/basic_ofstream/basic_ofstream + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::ofstream::event_callback + cpp/io/ios_base/event_callback + + + std::ofstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ofstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::insert_iterator + cpp/iterator/insert_iterator + + + std::bad_array_length + cpp/memory/new/bad_array_length + + T + bad_array_length + cpp/memory/new/bad_array_length + + (T... args) + + + T + what + cpp/memory/new/bad_alloc + + (T... args) + + + + std::this_thread + + + T + yield + cpp/thread/yield + + (T... args) + + + T + sleep_for + cpp/thread/sleep_for + + (T... args) + + + T + sleep_until + cpp/thread/sleep_until + + (T... args) + + + T + get_id + cpp/thread/get_id + + (T... args) + + + + std::is_trivially_copyable + cpp/types/is_trivially_copyable + + + std::basic_istringstream + cpp/io/basic_istringstream + + T + basic_istringstream + cpp/io/basic_istringstream/basic_istringstream + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_istringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::basic_istringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::basic_istringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_istringstream/operator= + + (T... args) + + std::basic_istringstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_istringstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_istringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_istringstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::basic_ifstream + cpp/io/basic_ifstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + basic_ifstream + cpp/io/basic_ifstream/basic_ifstream + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + open + cpp/io/basic_ifstream/open + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::basic_ifstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ifstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::basic_ifstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ifstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_ifstream/operator= + + (T... args) + + std::basic_ifstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_ifstream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_ifstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::basic_ifstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::list + cpp/container/list + + T + pop_front + cpp/container/list/pop_front + + (T... args) + + + T + push_back + cpp/container/list/push_back + + (T... args) + + + T + splice + cpp/container/list/splice + + (T... args) + + + T + crbegin + cpp/container/list/rbegin + + (T... args) + + + T + erase + cpp/container/list/erase + + (T... args) + + + T + emplace_front + cpp/container/list/emplace_front + + (T... args) + + + T + insert + cpp/container/list/insert + + (T... args) + + + T + reverse + cpp/container/list/reverse + + (T... args) + + + T + back + cpp/container/list/back + + (T... args) + + + T + end + cpp/container/list/end + + (T... args) + + + T + remove + cpp/container/list/remove + + (T... args) + + + T + list + cpp/container/list/list + + (T... args) + + + T + emplace_back + cpp/container/list/emplace_back + + (T... args) + + + T + pop_back + cpp/container/list/pop_back + + (T... args) + + + T + cbegin + cpp/container/list/begin + + (T... args) + + + T + front + cpp/container/list/front + + (T... args) + + + T + unique + cpp/container/list/unique + + (T... args) + + + T + size + cpp/container/list/size + + (T... args) + + + T + resize + cpp/container/list/resize + + (T... args) + + + T + push_front + cpp/container/list/push_front + + (T... args) + + + T + rbegin + cpp/container/list/rbegin + + (T... args) + + + T + crend + cpp/container/list/rend + + (T... args) + + + T + assign + cpp/container/list/assign + + (T... args) + + + T + operator= + cpp/container/list/operator= + + (T... args) + + + T + sort + cpp/container/list/sort + + (T... args) + + + T + ~list + cpp/container/list/~list + + (T... args) + + + T + merge + cpp/container/list/merge + + (T... args) + + + T + empty + cpp/container/list/empty + + (T... args) + + + T + remove_if + cpp/container/list/remove + + (T... args) + + + T + cend + cpp/container/list/end + + (T... args) + + + T + swap + cpp/container/list/swap + + (T... args) + + + T + max_size + cpp/container/list/max_size + + (T... args) + + + T + rend + cpp/container/list/rend + + (T... args) + + + T + get_allocator + cpp/container/list/get_allocator + + (T... args) + + + T + clear + cpp/container/list/clear + + (T... args) + + + T + emplace + cpp/container/list/emplace + + (T... args) + + + T + begin + cpp/container/list/begin + + (T... args) + + + + std::minus + cpp/utility/functional/minus + + T + operator() + cpp/utility/functional/minus + + (T... args) + + + + std::map + cpp/container/map + + T + begin + cpp/container/map/begin + + (T... args) + + + T + erase + cpp/container/map/erase + + (T... args) + + + T + insert + cpp/container/map/insert + + (T... args) + + + T + swap + cpp/container/map/swap + + (T... args) + + + T + end + cpp/container/map/end + + (T... args) + + + T + emplace_hint + cpp/container/map/emplace_hint + + (T... args) + + + T + key_comp + cpp/container/map/key_comp + + (T... args) + + std::map::value_compare + + T + cbegin + cpp/container/map/begin + + (T... args) + + + T + count + cpp/container/map/count + + (T... args) + + + T + find + cpp/container/map/find + + (T... args) + + + T + map + cpp/container/map/map + + (T... args) + + + T + crbegin + cpp/container/map/rbegin + + (T... args) + + + T + at + cpp/container/map/at + + (T... args) + + + T + upper_bound + cpp/container/map/upper_bound + + (T... args) + + + T + rbegin + cpp/container/map/rbegin + + (T... args) + + + T + crend + cpp/container/map/rend + + (T... args) + + + T + size + cpp/container/map/size + + (T... args) + + + T + operator= + cpp/container/map/operator= + + (T... args) + + + T + ~map + cpp/container/map/~map + + (T... args) + + + T + value_comp + cpp/container/map/value_comp + + (T... args) + + + T + empty + cpp/container/map/empty + + (T... args) + + + T + lower_bound + cpp/container/map/lower_bound + + (T... args) + + + T + cend + cpp/container/map/end + + (T... args) + + + T + max_size + cpp/container/map/max_size + + (T... args) + + + T + rend + cpp/container/map/rend + + (T... args) + + + T + get_allocator + cpp/container/map/get_allocator + + (T... args) + + + T + clear + cpp/container/map/clear + + (T... args) + + + T + equal_range + cpp/container/map/equal_range + + (T... args) + + + T + emplace + cpp/container/map/emplace + + (T... args) + + + T + operator[] + cpp/container/map/operator_at + + (T... args) + + + + std::map::value_compare + cpp/container/map/value_compare + + + std::linear_congruential_engine + cpp/numeric/random/linear_congruential_engine + + T + discard + cpp/numeric/random/linear_congruential_engine/discard + + (T... args) + + + T + linear_congruential_engine + cpp/numeric/random/linear_congruential_engine/linear_congruential_engine + + (T... args) + + + T + max + cpp/numeric/random/linear_congruential_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/linear_congruential_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/linear_congruential_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/linear_congruential_engine/min + + (T... args) + + + + std::codecvt_utf16 + cpp/locale/codecvt_utf16 + std::codecvt_utf16::extern_type + + T + out + cpp/locale/codecvt/out + + (T... args) + + + T + do_length + cpp/locale/codecvt/length + + (T... args) + + + T + do_unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + do_encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + do_in + cpp/locale/codecvt/in + + (T... args) + + + T + unshift + cpp/locale/codecvt/unshift + + (T... args) + + + T + max_length + cpp/locale/codecvt/max_length + + (T... args) + + std::codecvt_utf16::state_type + + T + encoding + cpp/locale/codecvt/encoding + + (T... args) + + + T + always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + do_out + cpp/locale/codecvt/out + + (T... args) + + + T + do_max_length + cpp/locale/codecvt/max_length + + (T... args) + + + T + do_always_noconv + cpp/locale/codecvt/always_noconv + + (T... args) + + + T + in + cpp/locale/codecvt/in + + (T... args) + + std::codecvt_utf16::intern_type + + T + length + cpp/locale/codecvt/length + + (T... args) + + + + std::codecvt_utf16::extern_type + cpp/locale/codecvt + + + std::codecvt_utf16::state_type + cpp/locale/codecvt + + + std::codecvt_utf16::intern_type + cpp/locale/codecvt + + + std::cmatch + cpp/regex/match_results + + T + cbegin + cpp/regex/match_results/begin + + (T... args) + + + T + format + cpp/regex/match_results/format + + (T... args) + + + T + size + cpp/regex/match_results/size + + (T... args) + + + T + swap + cpp/regex/match_results/swap + + (T... args) + + + T + position + cpp/regex/match_results/position + + (T... args) + + + T + ~cmatch + cpp/regex/match_results/~match_results + + (T... args) + + + T + prefix + cpp/regex/match_results/prefix + + (T... args) + + + T + str + cpp/regex/match_results/str + + (T... args) + + + T + empty + cpp/regex/match_results/empty + + (T... args) + + + T + suffix + cpp/regex/match_results/suffix + + (T... args) + + + T + get_allocator + cpp/regex/match_results/get_allocator + + (T... args) + + + T + end + cpp/regex/match_results/end + + (T... args) + + + T + max_size + cpp/regex/match_results/max_size + + (T... args) + + + T + cmatch + cpp/regex/match_results/match_results + + (T... args) + + + T + ready + cpp/regex/match_results/ready + + (T... args) + + + T + cend + cpp/regex/match_results/end + + (T... args) + + + T + operator[] + cpp/regex/match_results/operator_at + + (T... args) + + + T + length + cpp/regex/match_results/length + + (T... args) + + + T + begin + cpp/regex/match_results/begin + + (T... args) + + + + std::defer_lock_t + cpp/thread/lock_tag_t + + + std::exception + cpp/error/exception + + T + what + cpp/error/exception/what + + (T... args) + + + T + ~exception + cpp/error/exception/~exception + + (T... args) + + + T + operator= + cpp/error/exception/operator= + + (T... args) + + + T + exception + cpp/error/exception/exception + + (T... args) + + + + std::front_insert_iterator + cpp/iterator/front_insert_iterator + + + std::zetta + cpp/numeric/ratio/ratio + + + std::streambuf + cpp/io/basic_streambuf + + T + pptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + epptr + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + eback + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + setp + cpp/io/basic_streambuf/setp + + (T... args) + + + T + sputbackc + cpp/io/basic_streambuf/sputbackc + + (T... args) + + + T + getloc + cpp/io/basic_streambuf/getloc + + (T... args) + + + T + seekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + imbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + sungetc + cpp/io/basic_streambuf/sungetc + + (T... args) + + + T + sync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + xsputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + pbase + cpp/io/basic_streambuf/pptr + + (T... args) + + + T + sgetc + cpp/io/basic_streambuf/sgetc + + (T... args) + + + T + pubimbue + cpp/io/basic_streambuf/pubimbue + + (T... args) + + + T + showmanyc + cpp/io/basic_streambuf/showmanyc + + (T... args) + + + T + snextc + cpp/io/basic_streambuf/snextc + + (T... args) + + + T + egptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + seekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + T + underflow + cpp/io/basic_streambuf/underflow + + (T... args) + + + T + setbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + gbump + cpp/io/basic_streambuf/gbump + + (T... args) + + + T + in_avail + cpp/io/basic_streambuf/in_avail + + (T... args) + + + T + swap + cpp/io/basic_streambuf/swap + + (T... args) + + + T + pbackfail + cpp/io/basic_streambuf/pbackfail + + (T... args) + + + T + sputc + cpp/io/basic_streambuf/sputc + + (T... args) + + + T + xsgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + uflow + cpp/io/basic_streambuf/uflow + + (T... args) + + + T + overflow + cpp/io/basic_streambuf/overflow + + (T... args) + + + T + sputn + cpp/io/basic_streambuf/sputn + + (T... args) + + + T + sgetn + cpp/io/basic_streambuf/sgetn + + (T... args) + + + T + sbumpc + cpp/io/basic_streambuf/sbumpc + + (T... args) + + + T + ~streambuf + cpp/io/basic_streambuf/~basic_streambuf + + (T... args) + + + T + operator= + cpp/io/basic_streambuf/operator= + + (T... args) + + + T + pbump + cpp/io/basic_streambuf/pbump + + (T... args) + + + T + pubsetbuf + cpp/io/basic_streambuf/pubsetbuf + + (T... args) + + + T + pubsync + cpp/io/basic_streambuf/pubsync + + (T... args) + + + T + pubseekoff + cpp/io/basic_streambuf/pubseekoff + + (T... args) + + + T + setg + cpp/io/basic_streambuf/setg + + (T... args) + + + T + streambuf + cpp/io/basic_streambuf/basic_streambuf + + (T... args) + + + T + gptr + cpp/io/basic_streambuf/gptr + + (T... args) + + + T + pubseekpos + cpp/io/basic_streambuf/pubseekpos + + (T... args) + + + + std::experimental + + + T + make_optional + cpp/experimental/optional/make_optional + + (T... args) + + std::experimental::optional + + + std::experimental::optional + cpp/experimental/optional + + T + operator= + cpp/experimental/optional/operator= + + (T... args) + + + T + operator bool + cpp/experimental/optional/operator_bool + + (T... args) + + + T + optional + cpp/experimental/optional/optional + + (T... args) + + + T + ~optional + cpp/experimental/optional/~optional + + (T... args) + + + T + operator-> + cpp/experimental/optional/operator* + + (T... args) + + + T + value + cpp/experimental/optional/value + + (T... args) + + + T + value_or + cpp/experimental/optional/value_or + + (T... args) + + + T + operator* + cpp/experimental/optional/operator* + + (T... args) + + + T + emplace + cpp/experimental/optional/emplace + + (T... args) + + + T + swap + cpp/experimental/optional/swap + + (T... args) + + + + std::num_put + cpp/locale/num_put + + T + num_put + cpp/locale/num_put/num_put + + (T... args) + + std::num_put::char_type + + T + ~num_put + cpp/locale/num_put/~num_put + + (T... args) + + + T + do_put + cpp/locale/num_put/put + + (T... args) + + + T + put + cpp/locale/num_put/put + + (T... args) + + std::num_put::iter_type + + + std::num_put::char_type + cpp/locale/num_put + + + std::num_put::iter_type + cpp/locale/num_put + + + std::owner_less + cpp/memory/owner_less + + T + operator() + cpp/memory/owner_less + + (T... args) + + + + std::extent + cpp/types/extent + + + std::bad_optional_access + cpp/utility/bad_optional_access + + T + bad_optional_access + cpp/utility/bad_optional_access + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::yotta + cpp/numeric/ratio/ratio + + + std::wcregex_token_iterator + cpp/regex/regex_token_iterator + + T + operator!= + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_token_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + wcregex_token_iterator + cpp/regex/regex_token_iterator/regex_token_iterator + + (T... args) + + + + std::uint64_t + cpp/types/integer + + + std::messages + cpp/locale/messages + + T + do_get + cpp/locale/messages/get + + (T... args) + + + T + do_close + cpp/locale/messages/close + + (T... args) + + std::messages::char_type + + T + get + cpp/locale/messages/get + + (T... args) + + + T + ~messages + cpp/locale/messages/~messages + + (T... args) + + + T + do_open + cpp/locale/messages/open + + (T... args) + + + T + messages + cpp/locale/messages/messages + + (T... args) + + + T + open + cpp/locale/messages/open + + (T... args) + + std::messages::string_type + std::messages::catalog + + T + close + cpp/locale/messages/close + + (T... args) + + + + std::messages::char_type + cpp/locale/messages + + + std::messages::string_type + cpp/locale/messages + + + std::messages::catalog + cpp/locale/messages_base + + + std::regex_token_iterator + cpp/regex/regex_token_iterator + + T + regex_token_iterator + cpp/regex/regex_token_iterator/regex_token_iterator + + (T... args) + + + T + operator= + cpp/regex/regex_token_iterator/operator= + + (T... args) + + + T + operator== + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator!= + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator++(int) + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + + std::move_iterator + cpp/iterator/move_iterator + + + std::messages_base + cpp/locale/messages_base + std::messages_base::catalog + + + std::messages_base::catalog + cpp/locale/messages_base + + + std::istringstream + cpp/io/basic_istringstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_istringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + istringstream + cpp/io/basic_istringstream/basic_istringstream + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::istringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::istringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_istringstream/operator= + + (T... args) + + std::istringstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::istringstream::event_callback + cpp/io/ios_base/event_callback + + + std::istringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::istringstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::giga + cpp/numeric/ratio/ratio + + + std::integer_sequence + cpp/utility/integer_sequence + + + std::has_virtual_destructor + cpp/types/has_virtual_destructor + + + std::max_align_t + cpp/types/max_align_t + + + std::remove_volatile + cpp/types/remove_cv + + + std::underlying_type + cpp/types/underlying_type + + + std::hecto + cpp/numeric/ratio/ratio + + + std::is_member_object_pointer + cpp/types/is_member_object_pointer + + + std::exception_ptr + cpp/error/exception_ptr + + + std::nested_exception + cpp/error/nested_exception + + T + operator= + cpp/error/nested_exception/operator= + + (T... args) + + + T + ~nested_exception + cpp/error/nested_exception/~nested_exception + + (T... args) + + + T + rethrow_nested + cpp/error/nested_exception/rethrow_nested + + (T... args) + + + T + nested_exception + cpp/error/nested_exception/nested_exception + + (T... args) + + + T + nested_ptr + cpp/error/nested_exception/nested_ptr + + (T... args) + + + + std::random_access_iterator_tag + cpp/iterator/iterator_tags + + + std::ctype + cpp/locale/ctype + + T + do_toupper + cpp/locale/ctype/toupper + + (T... args) + + + T + toupper + cpp/locale/ctype/toupper + + (T... args) + + + T + scan_is + cpp/locale/ctype/scan_is + + (T... args) + + + T + narrow + cpp/locale/ctype/narrow + + (T... args) + + + T + ~ctype + cpp/locale/ctype/~ctype + + (T... args) + + + T + do_narrow + cpp/locale/ctype/narrow + + (T... args) + + + T + widen + cpp/locale/ctype/widen + + (T... args) + + + T + is + cpp/locale/ctype/is + + (T... args) + + + T + do_scan_is + cpp/locale/ctype/scan_is + + (T... args) + + + T + tolower + cpp/locale/ctype/tolower + + (T... args) + + + T + do_is + cpp/locale/ctype/is + + (T... args) + + + T + do_tolower + cpp/locale/ctype/tolower + + (T... args) + + std::ctype::mask + + T + do_widen + cpp/locale/ctype/widen + + (T... args) + + + T + ctype + cpp/locale/ctype/ctype + + (T... args) + + + + std::ctype::mask + cpp/locale/ctype_base + + + std::time_t + cpp/chrono/c/time_t + + + std::knuth_b + cpp/numeric/random/shuffle_order_engine + + T + discard + cpp/numeric/random/shuffle_order_engine/discard + + (T... args) + + + T + max + cpp/numeric/random/shuffle_order_engine/max + + (T... args) + + + T + knuth_b + cpp/numeric/random/shuffle_order_engine/shuffle_order_engine + + (T... args) + + + T + operator() + cpp/numeric/random/shuffle_order_engine/operator() + + (T... args) + + + T + base + cpp/numeric/random/shuffle_order_engine/base + + (T... args) + + + T + seed + cpp/numeric/random/shuffle_order_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/shuffle_order_engine/min + + (T... args) + + + + std::auto_ptr + cpp/memory/auto_ptr + + T + release + cpp/memory/auto_ptr/release + + (T... args) + + + T + operator* + cpp/memory/auto_ptr/operator* + + (T... args) + + + T + operator auto_ptr<Y> + cpp/memory/auto_ptr/operator_auto_ptr + + (T... args) + + + T + reset + cpp/memory/auto_ptr/reset + + (T... args) + + + T + operator-> + cpp/memory/auto_ptr/operator* + + (T... args) + + + T + operator= + cpp/memory/auto_ptr/operator= + + (T... args) + + + T + auto_ptr + cpp/memory/auto_ptr/auto_ptr + + (T... args) + + + T + ~auto_ptr + cpp/memory/auto_ptr/~auto_ptr + + (T... args) + + + T + get + cpp/memory/auto_ptr/get + + (T... args) + + + + std::minstd_rand0 + cpp/numeric/random/linear_congruential_engine + + T + discard + cpp/numeric/random/linear_congruential_engine/discard + + (T... args) + + + T + max + cpp/numeric/random/linear_congruential_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/linear_congruential_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/linear_congruential_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/linear_congruential_engine/min + + (T... args) + + + T + minstd_rand0 + cpp/numeric/random/linear_congruential_engine/linear_congruential_engine + + (T... args) + + + + std::sregex_token_iterator + cpp/regex/regex_token_iterator + + T + operator!= + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator= + cpp/regex/regex_token_iterator/operator= + + (T... args) + + + T + sregex_token_iterator + cpp/regex/regex_token_iterator/regex_token_iterator + + (T... args) + + + T + operator== + cpp/regex/regex_token_iterator/operator_cmp + + (T... args) + + + T + operator-> + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++ + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + T + operator* + cpp/regex/regex_token_iterator/operator* + + (T... args) + + + T + operator++(int) + cpp/regex/regex_token_iterator/operator_arith + + (T... args) + + + + std::logical_not + cpp/utility/functional/logical_not + + T + operator() + cpp/utility/functional/logical_not + + (T... args) + + + + std::fpos_t + cpp/io/c + + + std::istream + cpp/io/basic_istream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + ~istream + cpp/io/basic_istream/~basic_istream + + (T... args) + + + T + istream + cpp/io/basic_istream/basic_istream + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::istream::event_callback + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::istream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + std::istream::sentry + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::istream::event_callback + cpp/io/ios_base/event_callback + + + std::istream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::istream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::seed_seq + cpp/numeric/random/seed_seq + + T + generate + cpp/numeric/random/seed_seq/generate + + (T... args) + + + T + param + cpp/numeric/random/seed_seq/param + + (T... args) + + + T + size + cpp/numeric/random/seed_seq/size + + (T... args) + + + T + seed_seq + cpp/numeric/random/seed_seq/seed_seq + + (T... args) + + + + std::default_delete + cpp/memory/default_delete + + T + default_delete + cpp/memory/default_delete + + (T... args) + + + T + operator() + cpp/memory/default_delete + + (T... args) + + + + std::femto + cpp/numeric/ratio/ratio + + + std::clock_t + cpp/chrono/c/clock_t + + + std::true_type + cpp/types/integral_constant + + + std::mbstate_t + cpp/string/multibyte/mbstate_t + + + std::ostrstream + cpp/io/ostrstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/ostrstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::ostrstream::event_callback + + T + pcount + cpp/io/ostrstream/pcount + + (T... args) + + + T + ostrstream + cpp/io/ostrstream/ostrstream + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::ostrstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + freeze + cpp/io/ostrstream/freeze + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + ~ostrstream + cpp/io/ostrstream/~ostrstream + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::ostrstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::ostrstream::event_callback + cpp/io/ios_base/event_callback + + + std::ostrstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ostrstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::gamma_distribution + cpp/numeric/random/gamma_distribution + + T + gamma_distribution + cpp/numeric/random/gamma_distribution/gamma_distribution + + (T... args) + + + T + max + cpp/numeric/random/gamma_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/gamma_distribution/operator() + + (T... args) + + + T + reset + cpp/numeric/random/gamma_distribution/reset + + (T... args) + + + T + alpha + cpp/numeric/random/gamma_distribution/params + + (T... args) + + + T + beta + cpp/numeric/random/gamma_distribution/params + + (T... args) + + + T + param + cpp/numeric/random/gamma_distribution/param + + (T... args) + + + T + min + cpp/numeric/random/gamma_distribution/min + + (T... args) + + + + std::bad_weak_ptr + cpp/memory/bad_weak_ptr + + T + bad_weak_ptr + cpp/memory/bad_weak_ptr/bad_weak_ptr + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::output_iterator_tag + cpp/iterator/iterator_tags + + + std::micro + cpp/numeric/ratio/ratio + + + std::is_trivial + cpp/types/is_trivial + + + std::packaged_task + cpp/thread/packaged_task + + T + operator= + cpp/thread/packaged_task/operator= + + (T... args) + + + T + swap + cpp/thread/packaged_task/swap + + (T... args) + + + T + reset + cpp/thread/packaged_task/reset + + (T... args) + + + T + packaged_task + cpp/thread/packaged_task/packaged_task + + (T... args) + + + T + make_ready_at_thread_exit + cpp/thread/packaged_task/make_ready_at_thread_exit + + (T... args) + + + T + operator() + cpp/thread/packaged_task/operator() + + (T... args) + + + T + get_future + cpp/thread/packaged_task/get_future + + (T... args) + + + T + valid + cpp/thread/packaged_task/valid + + (T... args) + + + T + ~packaged_task + cpp/thread/packaged_task/~packaged_task + + (T... args) + + + + std::unordered_set + cpp/container/unordered_set + + T + max_bucket_count + cpp/container/unordered_set/max_bucket_count + + (T... args) + + + T + cbegin + cpp/container/unordered_set/begin + + (T... args) + + + T + erase + cpp/container/unordered_set/erase + + (T... args) + + + T + insert + cpp/container/unordered_set/insert + + (T... args) + + + T + bucket_count + cpp/container/unordered_set/bucket_count + + (T... args) + + + T + max_load_factor + cpp/container/unordered_set/max_load_factor + + (T... args) + + + T + end + cpp/container/unordered_set/end + + (T... args) + + + T + emplace_hint + cpp/container/unordered_set/emplace_hint + + (T... args) + + + T + end(int) + cpp/container/unordered_set/end2 + + (T... args) + + + T + ~unordered_set + cpp/container/unordered_set/~unordered_set + + (T... args) + + + T + key_eq + cpp/container/unordered_set/key_eq + + (T... args) + + + T + hash_function + cpp/container/unordered_set/hash_function + + (T... args) + + + T + find + cpp/container/unordered_set/find + + (T... args) + + + T + clear + cpp/container/unordered_set/clear + + (T... args) + + + T + begin + cpp/container/unordered_set/begin + + (T... args) + + + T + cbegin(int) + cpp/container/unordered_set/begin2 + + (T... args) + + + T + swap + cpp/container/unordered_set/swap + + (T... args) + + + T + begin(int) + cpp/container/unordered_set/begin2 + + (T... args) + + + T + load_factor + cpp/container/unordered_set/load_factor + + (T... args) + + + T + size + cpp/container/unordered_set/size + + (T... args) + + + T + operator= + cpp/container/unordered_set/operator= + + (T... args) + + + T + cend + cpp/container/unordered_set/end + + (T... args) + + + T + reserve + cpp/container/unordered_set/reserve + + (T... args) + + + T + rehash + cpp/container/unordered_set/rehash + + (T... args) + + + T + bucket + cpp/container/unordered_set/bucket + + (T... args) + + + T + empty + cpp/container/unordered_set/empty + + (T... args) + + + T + get_allocator + cpp/container/unordered_set/get_allocator + + (T... args) + + + T + max_size + cpp/container/unordered_set/max_size + + (T... args) + + + T + cend(int) + cpp/container/unordered_set/end2 + + (T... args) + + + T + count + cpp/container/unordered_set/count + + (T... args) + + + T + unordered_set + cpp/container/unordered_set/unordered_set + + (T... args) + + + T + equal_range + cpp/container/unordered_set/equal_range + + (T... args) + + + T + emplace + cpp/container/unordered_set/emplace + + (T... args) + + + T + bucket_size + cpp/container/unordered_set/bucket_size + + (T... args) + + + + std::is_volatile + cpp/types/is_volatile + + + std::wfstream + cpp/io/basic_fstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + open + cpp/io/basic_fstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::wfstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + wfstream + cpp/io/basic_fstream/basic_fstream + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::wfstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + close + cpp/io/basic_fstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wfstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_fstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_fstream/operator= + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wfstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::wfstream::event_callback + cpp/io/ios_base/event_callback + + + std::wfstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::multimap + cpp/container/multimap + + T + multimap + cpp/container/multimap/multimap + + (T... args) + + + T + begin + cpp/container/multimap/begin + + (T... args) + + + T + erase + cpp/container/multimap/erase + + (T... args) + + + T + insert + cpp/container/multimap/insert + + (T... args) + + + T + swap + cpp/container/multimap/swap + + (T... args) + + + T + end + cpp/container/multimap/end + + (T... args) + + + T + ~multimap + cpp/container/multimap/~multimap + + (T... args) + + + T + emplace_hint + cpp/container/multimap/emplace_hint + + (T... args) + + + T + key_comp + cpp/container/multimap/key_comp + + (T... args) + + std::multimap::value_compare + + T + cbegin + cpp/container/multimap/begin + + (T... args) + + + T + count + cpp/container/multimap/count + + (T... args) + + + T + find + cpp/container/multimap/find + + (T... args) + + + T + crbegin + cpp/container/multimap/rbegin + + (T... args) + + + T + upper_bound + cpp/container/multimap/upper_bound + + (T... args) + + + T + rbegin + cpp/container/multimap/rbegin + + (T... args) + + + T + crend + cpp/container/multimap/rend + + (T... args) + + + T + size + cpp/container/multimap/size + + (T... args) + + + T + operator= + cpp/container/multimap/operator= + + (T... args) + + + T + value_comp + cpp/container/multimap/value_comp + + (T... args) + + + T + empty + cpp/container/multimap/empty + + (T... args) + + + T + lower_bound + cpp/container/multimap/lower_bound + + (T... args) + + + T + cend + cpp/container/multimap/end + + (T... args) + + + T + max_size + cpp/container/multimap/max_size + + (T... args) + + + T + rend + cpp/container/multimap/rend + + (T... args) + + + T + get_allocator + cpp/container/multimap/get_allocator + + (T... args) + + + T + clear + cpp/container/multimap/clear + + (T... args) + + + T + equal_range + cpp/container/multimap/equal_range + + (T... args) + + + T + emplace + cpp/container/multimap/emplace + + (T... args) + + + + std::multimap::value_compare + cpp/container/multimap/value_compare + + + std::atomic_flag + cpp/atomic/atomic_flag + + T + operator= + cpp/atomic/atomic_flag/operator= + + (T... args) + + + T + clear + cpp/atomic/atomic_flag/clear + + (T... args) + + + T + atomic_flag + cpp/atomic/atomic_flag/atomic_flag + + (T... args) + + + T + test_and_set + cpp/atomic/atomic_flag/test_and_set + + (T... args) + + + + std::numpunct_byname + cpp/locale/numpunct_byname + + T + grouping + cpp/locale/numpunct/grouping + + (T... args) + + + T + do_decimal_point + cpp/locale/numpunct/decimal_point + + (T... args) + + + T + thousands_sep + cpp/locale/numpunct/thousands_sep + + (T... args) + + + T + falsename + cpp/locale/numpunct/truefalsename + + (T... args) + + + T + do_falsename + cpp/locale/numpunct/truefalsename + + (T... args) + + std::numpunct_byname::string_type + + T + numpunct_byname + cpp/locale/numpunct_byname + + (T... args) + + + T + truename + cpp/locale/numpunct/truefalsename + + (T... args) + + std::numpunct_byname::char_type + + T + do_truename + cpp/locale/numpunct/truefalsename + + (T... args) + + + T + do_grouping + cpp/locale/numpunct/grouping + + (T... args) + + + T + decimal_point + cpp/locale/numpunct/decimal_point + + (T... args) + + + T + do_thousands_sep + cpp/locale/numpunct/thousands_sep + + (T... args) + + + T + ~numpunct_byname + cpp/locale/numpunct_byname + + (T... args) + + + + std::numpunct_byname::string_type + cpp/locale/numpunct + + + std::numpunct_byname::char_type + cpp/locale/numpunct + + + std::binomial_distribution + cpp/numeric/random/binomial_distribution + + T + t + cpp/numeric/random/binomial_distribution/params + + (T... args) + + + T + binomial_distribution + cpp/numeric/random/binomial_distribution/binomial_distribution + + (T... args) + + + T + reset + cpp/numeric/random/binomial_distribution/reset + + (T... args) + + + T + max + cpp/numeric/random/binomial_distribution/max + + (T... args) + + + T + p + cpp/numeric/random/binomial_distribution/params + + (T... args) + + + T + min + cpp/numeric/random/binomial_distribution/min + + (T... args) + + + T + param + cpp/numeric/random/binomial_distribution/param + + (T... args) + + + + std::basic_iostream + cpp/io/basic_iostream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + ~basic_iostream + cpp/io/basic_iostream/~basic_iostream + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::basic_iostream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::basic_iostream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + basic_iostream + cpp/io/basic_iostream/basic_iostream + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::basic_iostream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::basic_iostream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::basic_iostream::event_callback + cpp/io/ios_base/event_callback + + + std::basic_iostream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wofstream + cpp/io/basic_ofstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + std::wofstream::event_callback + + T + open + cpp/io/basic_ofstream/open + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + wofstream + cpp/io/basic_ofstream/basic_ofstream + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ofstream/close + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wofstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ofstream/is_open + + (T... args) + + + T + operator= + cpp/io/basic_ofstream/operator= + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + std::wofstream::sentry + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wofstream::event_callback + cpp/io/ios_base/event_callback + + + std::wofstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wofstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_ostream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_ostream/sentry + + (T... args) + + + + std::fpos + cpp/io/fpos + + T + state + cpp/io/fpos/state + + (T... args) + + + + std::underflow_error + cpp/error/underflow_error + + T + underflow_error + cpp/error/underflow_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::cauchy_distribution + cpp/numeric/random/cauchy_distribution + + T + min + cpp/numeric/random/cauchy_distribution/min + + (T... args) + + + T + reset + cpp/numeric/random/cauchy_distribution/reset + + (T... args) + + + T + a + cpp/numeric/random/cauchy_distribution/params + + (T... args) + + + T + max + cpp/numeric/random/cauchy_distribution/max + + (T... args) + + + T + operator() + cpp/numeric/random/cauchy_distribution/operator() + + (T... args) + + + T + param + cpp/numeric/random/cauchy_distribution/param + + (T... args) + + + T + cauchy_distribution + cpp/numeric/random/cauchy_distribution/cauchy_distribution + + (T... args) + + + T + b + cpp/numeric/random/cauchy_distribution/params + + (T... args) + + + + std::is_trivially_copy_constructible + cpp/types/is_copy_constructible + + + std::conditional + cpp/types/conditional + + + std::is_pod + cpp/types/is_pod + + + std::int_least8_t + cpp/types/integer + + + std::streamoff + cpp/io/streamoff + + + std::is_move_assignable + cpp/types/is_move_assignable + + + std::int_least32_t + cpp/types/integer + + + std::wstringstream + cpp/io/basic_stringstream + + T + seekp + cpp/io/basic_ostream/seekp + + (T... args) + + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_stringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + tellp + cpp/io/basic_ostream/tellp + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + std::wstringstream::sentry + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + operator<< + cpp/io/basic_ostream/operator_ltlt + + (T... args) + + std::wstringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + write + cpp/io/basic_ostream/write + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + std::wstringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + flush + cpp/io/basic_ostream/flush + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_stringstream/operator= + + (T... args) + + + T + wstringstream + cpp/io/basic_stringstream/basic_stringstream + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + put + cpp/io/basic_ostream/put + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wstringstream::sentry + cpp/io/basic_ostream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::wstringstream::event_callback + cpp/io/ios_base/event_callback + + + std::wstringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::subtract_with_carry_engine + cpp/numeric/random/subtract_with_carry_engine + + T + discard + cpp/numeric/random/subtract_with_carry_engine/discard + + (T... args) + + + T + subtract_with_carry_engine + cpp/numeric/random/subtract_with_carry_engine/subtract_with_carry_engine + + (T... args) + + + T + max + cpp/numeric/random/subtract_with_carry_engine/max + + (T... args) + + + T + operator() + cpp/numeric/random/subtract_with_carry_engine/operator() + + (T... args) + + + T + seed + cpp/numeric/random/subtract_with_carry_engine/seed + + (T... args) + + + T + min + cpp/numeric/random/subtract_with_carry_engine/min + + (T... args) + + + + std::regex_error + cpp/regex/regex_error + + T + code + cpp/regex/regex_error/code + + (T... args) + + + T + regex_error + cpp/regex/regex_error/regex_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::is_constructible + cpp/types/is_constructible + + + std::piecewise_construct_t + cpp/utility/piecewise_construct_t + + + std::mutex + cpp/thread/mutex + + T + mutex + cpp/thread/mutex/mutex + + (T... args) + + + T + unlock + cpp/thread/mutex/unlock + + (T... args) + + + T + lock + cpp/thread/mutex/lock + + (T... args) + + + T + try_lock + cpp/thread/mutex/try_lock + + (T... args) + + + T + native_handle + cpp/thread/mutex/native_handle + + (T... args) + + + + std::system_error + cpp/error/system_error + + T + code + cpp/error/system_error/code + + (T... args) + + + T + system_error + cpp/error/system_error/system_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wistringstream + cpp/io/basic_istringstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + str + cpp/io/basic_istringstream/str + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + wistringstream + cpp/io/basic_istringstream/basic_istringstream + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::wistringstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::wistringstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_istringstream/operator= + + (T... args) + + std::wistringstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::wistringstream::event_callback + cpp/io/ios_base/event_callback + + + std::wistringstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::wistringstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::is_floating_point + cpp/types/is_floating_point + + + std::ratio_not_equal + cpp/numeric/ratio/ratio_not_equal + + + std::ratio_multiply + cpp/numeric/ratio/ratio_multiply + + + std::result_of + cpp/types/result_of + + + std::is_fundamental + cpp/types/is_fundamental + + + std::ifstream + cpp/io/basic_ifstream + + T + setstate + cpp/io/basic_ios/setstate + + (T... args) + + + T + getloc + cpp/io/ios_base/getloc + + (T... args) + + + T + precision + cpp/io/ios_base/precision + + (T... args) + + + T + flags + cpp/io/ios_base/flags + + (T... args) + + + T + widen + cpp/io/basic_ios/widen + + (T... args) + + + T + readsome + cpp/io/basic_istream/readsome + + (T... args) + + + T + fill + cpp/io/basic_ios/fill + + (T... args) + + + T + setf + cpp/io/ios_base/setf + + (T... args) + + + T + tie + cpp/io/basic_ios/tie + + (T... args) + + + T + open + cpp/io/basic_ifstream/open + + (T... args) + + + T + operator bool + cpp/io/basic_ios/operator_bool + + (T... args) + + + T + copyfmt + cpp/io/basic_ios/copyfmt + + (T... args) + + + T + sync_with_stdio + cpp/io/ios_base/sync_with_stdio + + (T... args) + + + T + gcount + cpp/io/basic_istream/gcount + + (T... args) + + + T + get + cpp/io/basic_istream/get + + (T... args) + + + T + xalloc + cpp/io/ios_base/xalloc + + (T... args) + + + T + read + cpp/io/basic_istream/read + + (T... args) + + + T + getline + cpp/io/basic_istream/getline + + (T... args) + + + T + exceptions + cpp/io/basic_ios/exceptions + + (T... args) + + + T + iword + cpp/io/ios_base/iword + + (T... args) + + + T + unget + cpp/io/basic_istream/unget + + (T... args) + + std::ifstream::event_callback + + T + narrow + cpp/io/basic_ios/narrow + + (T... args) + + + T + ifstream + cpp/io/basic_ifstream/basic_ifstream + + (T... args) + + + T + good + cpp/io/basic_ios/good + + (T... args) + + + T + operator! + cpp/io/basic_ios/operator! + + (T... args) + + + T + close + cpp/io/basic_ifstream/close + + (T... args) + + + T + sync + cpp/io/basic_istream/sync + + (T... args) + + + T + putback + cpp/io/basic_istream/putback + + (T... args) + + + T + ignore + cpp/io/basic_istream/ignore + + (T... args) + + + T + unsetf + cpp/io/ios_base/unsetf + + (T... args) + + + T + width + cpp/io/ios_base/width + + (T... args) + + + T + rdstate + cpp/io/basic_ios/rdstate + + (T... args) + + + T + seekg + cpp/io/basic_istream/seekg + + (T... args) + + std::ifstream::failure + + T + move + cpp/io/basic_ios/move + + (T... args) + + + T + eof + cpp/io/basic_ios/eof + + (T... args) + + + T + register_callback + cpp/io/ios_base/register_callback + + (T... args) + + + T + pword + cpp/io/ios_base/pword + + (T... args) + + + T + swap + cpp/io/basic_ios/swap + + (T... args) + + + T + tellg + cpp/io/basic_istream/tellg + + (T... args) + + + T + operator>> + cpp/io/basic_istream/operator_gtgt + + (T... args) + + + T + set_rdbuf + cpp/io/basic_ios/set_rdbuf + + (T... args) + + + T + fail + cpp/io/basic_ios/fail + + (T... args) + + + T + is_open + cpp/io/basic_ifstream/is_open + + (T... args) + + + T + peek + cpp/io/basic_istream/peek + + (T... args) + + + T + operator= + cpp/io/basic_ifstream/operator= + + (T... args) + + std::ifstream::sentry + + T + rdbuf + cpp/io/basic_ios/rdbuf + + (T... args) + + + T + imbue + cpp/io/basic_ios/imbue + + (T... args) + + + T + bad + cpp/io/basic_ios/bad + + (T... args) + + + T + clear + cpp/io/basic_ios/clear + + (T... args) + + + T + init + cpp/io/basic_ios/init + + (T... args) + + + + std::ifstream::event_callback + cpp/io/ios_base/event_callback + + + std::ifstream::failure + cpp/io/ios_base/failure + + T + failure + cpp/io/ios_base/failure + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::ifstream::sentry + cpp/io/basic_istream/sentry + + T + ~sentry + cpp/io/basic_istream/sentry + + (T... args) + + + T + operator bool + cpp/io/basic_istream/sentry + + (T... args) + + + T + sentry + cpp/io/basic_istream/sentry + + (T... args) + + + + std::u32streampos + cpp/io/fpos + + T + state + cpp/io/fpos/state + + (T... args) + + + + std::length_error + cpp/error/length_error + + T + length_error + cpp/error/length_error + + (T... args) + + + T + what + cpp/error/exception/what + + (T... args) + + + + std::sub_match + cpp/regex/sub_match + + T + operator string_type + cpp/regex/sub_match/str + + (T... args) + + + T + sub_match + cpp/regex/sub_match/sub_match + + (T... args) + + + T + str + cpp/regex/sub_match/str + + (T... args) + + + T + length + cpp/regex/sub_match/length + + (T... args) + + + T + compare + cpp/regex/sub_match/compare + + (T... args) + + + + std::common_type + cpp/types/common_type + + + std::shared_timed_mutex + cpp/thread/shared_timed_mutex + + T + unlock + cpp/thread/shared_timed_mutex/unlock + + (T... args) + + + T + unlock_shared + cpp/thread/shared_timed_mutex/unlock_shared + + (T... args) + + + T + try_lock_until + cpp/thread/shared_timed_mutex/try_lock_until + + (T... args) + + + T + try_lock_for + cpp/thread/shared_timed_mutex/try_lock_for + + (T... args) + + + T + try_lock_shared_until + cpp/thread/shared_timed_mutex/try_lock_shared_until + + (T... args) + + + T + shared_timed_mutex + cpp/thread/shared_timed_mutex/shared_timed_mutex + + (T... args) + + + T + lock_shared + cpp/thread/shared_timed_mutex/lock_shared + + (T... args) + + + T + lock + cpp/thread/shared_timed_mutex/lock + + (T... args) + + + T + try_lock + cpp/thread/shared_timed_mutex/try_lock + + (T... args) + + + T + try_lock_shared + cpp/thread/shared_timed_mutex/try_lock_shared + + (T... args) + + + T + try_lock_shared_for + cpp/thread/shared_timed_mutex/try_lock_shared_for + + (T... args) + + + + std::array + cpp/container/array + + T + max_size + cpp/container/array/max_size + + (T... args) + + + T + rbegin + cpp/container/array/rbegin + + (T... args) + + + T + crend + cpp/container/array/rend + + (T... args) + + + T + crbegin + cpp/container/array/rbegin + + (T... args) + + + T + swap + cpp/container/array/swap + + (T... args) + + + T + data + cpp/container/array/data + + (T... args) + + + T + back + cpp/container/array/back + + (T... args) + + + T + end + cpp/container/array/end + + (T... args) + + + T + fill + cpp/container/array/fill + + (T... args) + + + T + empty + cpp/container/array/empty + + (T... args) + + + T + cend + cpp/container/array/end + + (T... args) + + + T + size + cpp/container/array/size + + (T... args) + + + T + cbegin + cpp/container/array/begin + + (T... args) + + + T + rend + cpp/container/array/rend + + (T... args) + + + T + front + cpp/container/array/front + + (T... args) + + + T + at + cpp/container/array/at + + (T... args) + + + T + operator[] + cpp/container/array/operator_at + + (T... args) + + + T + begin + cpp/container/array/begin + + (T... args) + + + + std::random_device + cpp/numeric/random/random_device + + T + operator() + cpp/numeric/random/random_device/operator() + + (T... args) + + + T + random_device + cpp/numeric/random/random_device/random_device + + (T... args) + + + T + entropy + cpp/numeric/random/random_device/entropy + + (T... args) + + + T + min + cpp/numeric/random/random_device/min + + (T... args) + + + T + max + cpp/numeric/random/random_device/max + + (T... args) + + + + std::default_random_engine + cpp/numeric/random + + + std::raw_storage_iterator + cpp/memory/raw_storage_iterator + + T + operator= + cpp/memory/raw_storage_iterator/operator= + + (T... args) + + + T + raw_storage_iterator + cpp/memory/raw_storage_iterator/raw_storage_iterator + + (T... args) + + + T + operator* + cpp/memory/raw_storage_iterator/operator* + + (T... args) + + + T + operator++ + cpp/memory/raw_storage_iterator/operator_arith + + (T... args) + + + + std::is_convertible + cpp/types/is_convertible + + + std::uint16_t + cpp/types/integer + + + std::is_array + cpp/types/is_array + + + std::mega + cpp/numeric/ratio/ratio + + + std::numpunct + cpp/locale/numpunct + + T + grouping + cpp/locale/numpunct/grouping + + (T... args) + + + T + do_decimal_point + cpp/locale/numpunct/decimal_point + + (T... args) + + + T + thousands_sep + cpp/locale/numpunct/thousands_sep + + (T... args) + + + T + numpunct + cpp/locale/numpunct/numpunct + + (T... args) + + + T + do_falsename + cpp/locale/numpunct/truefalsename + + (T... args) + + std::numpunct::string_type + + T + do_grouping + cpp/locale/numpunct/grouping + + (T... args) + + + T + truename + cpp/locale/numpunct/truefalsename + + (T... args) + + std::numpunct::char_type + + T + falsename + cpp/locale/numpunct/truefalsename + + (T... args) + + + T + do_truename + cpp/locale/numpunct/truefalsename + + (T... args) + + + T + ~numpunct + cpp/locale/numpunct/~numpunct + + (T... args) + + + T + decimal_point + cpp/locale/numpunct/decimal_point + + (T... args) + + + T + do_thousands_sep + cpp/locale/numpunct/thousands_sep + + (T... args) + + + + std::numpunct::string_type + cpp/locale/numpunct + + + std::numpunct::char_type + cpp/locale/numpunct + + + std::money_put + cpp/locale/money_put + std::money_put::char_type + std::money_put::pattern + + T + do_put + cpp/locale/money_put/put + + (T... args) + + + T + money_put + cpp/locale/money_put/money_put + + (T... args) + + + T + ~money_put + cpp/locale/money_put/~money_put + + (T... args) + + + T + put + cpp/locale/money_put/put + + (T... args) + + std::money_put::string_type + std::money_put::iter_type + + + std::money_put::char_type + cpp/locale/money_put + + + std::money_put::pattern + cpp/locale/money_base + + + std::money_put::string_type + cpp/locale/money_put + + + std::money_put::iter_type + cpp/locale/money_put + + + std::new_handler + cpp/memory/new/new_handler + + + std::is_member_function_pointer + cpp/types/is_member_function_pointer + + + va_list + cpp/utility/variadic/va_list + + diff --git a/doc/developer.md b/doc/developer.md index 60166ecbb31..15ee433913e 100644 --- a/doc/developer.md +++ b/doc/developer.md @@ -32,6 +32,7 @@ Radium offers several cmake functions to configure and build your extension. \page engine Engine - \subpage develrendering +- \subpage develTextures - \subpage develmaterials - \subpage develLights - \subpage develpicking diff --git a/doc/developer/animation.md b/doc/developer/animation.md index c1529b82b48..0b49d4166ff 100644 --- a/doc/developer/animation.md +++ b/doc/developer/animation.md @@ -74,7 +74,7 @@ handles local transformations to deform the mesh vertices. #### Skeleton-Based Character Animation in Radium The Radium Engine provides a system specific to the skeleton-based animation of a -character, the `Ra::Engine::Scene::SkeletonBasedAnimationSystem. +character, the `Ra::Engine::Scene::SkeletonBasedAnimationSystem`. This system is responsible for transmitting calls to/from animation-related processes to 2 specific`Ra::Engine::Scene::Component`: diff --git a/doc/developer/cmakeutilities.md b/doc/developer/cmakeutilities.md index 0cb170c3b57..2180be78192 100644 --- a/doc/developer/cmakeutilities.md +++ b/doc/developer/cmakeutilities.md @@ -69,6 +69,7 @@ The Radium components are : - IO_HAS_TINYPLY : Identify if Radium::IO was compiled with tinyply support, - IO_HAS_VOLUMES : Identify if Radium::IO was compiled with pvm volume loader support. You might use these properties to define compilation macro in your code + - ~~~{.cmake} get_target_property(USE_ASSIMP Radium::IO IO_HAS_ASSIMP) @@ -117,10 +118,8 @@ This function takes the following parameters: *Parameter name* | *Parameter description* --------------------------------------------|-------------------- ` applicationName` | The name of the *executable* target to configure and install -`` | If this option is given, the plugins installed into the Radium bundle at -the installation time will be copied into the application bundle. -` ResourceDir1 ResourceDir2 ...` | Optional list of directories to be considered as application resources -and installed into the application bundle. +`` | If this option is given, the plugins installed into the Radium bundle at the installation time will be copied into the application bundle. +` ResourceDir1 ResourceDir2 ...` | Optional list of directories to be considered as application resources and installed into the application bundle. When installed into a directory ``, the application bundle has the following structure on linux, windows or on MacOsX (if the executable is not configured as a `MACOSX_BUNDLE`): @@ -364,7 +363,7 @@ install_target_resources( ) ~~~ -### configure_radium_package {#configurePackage} +### configure_radium_package {#configure_radium_package} ~~~{.cmake} configure_radium_package( @@ -580,8 +579,8 @@ Note that these are only guidelines and that you can always write your cmake scr # ------------------------------------------------------- # Recommended preamble for cmake configuration # ------------------------------------------------------- -# Radium package requires cmake minimum version 3.13 -cmake_minimum_required(3.13) +# Radium package requires cmake minimum version 3.18 +cmake_minimum_required(3.18) # It is recommended to disable in-source build set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) @@ -716,7 +715,7 @@ When configuring a library, a cmake package configuration file should be written Meanwhile, when several libraries must be used as components in a single package (e.g. the Radium internal libraries are all gathered into the single Radium package), a more general configuration module has to be defined. For this, instead of defining a configuration package for each configured library, the parameter `PACKAGE_CONFIG` of the function [`configure_radium_library`](#configure_radium_library) should be omitted -and the function [`configure_radium_package`](#configurePackage) should be used. +and the function [`configure_radium_package`](#configure_radium_package) should be used. Standard usage of this function requires to have some libraries configured like the following: @@ -802,15 +801,15 @@ endif() # component if (_FOUND) - # manage component dependencies (e.g. must be requested and depends also on Qt5) + # manage component dependencies (e.g. must be requested and depends also on Qt) if (NOT _FOUND) set(_FOUND False) set(_FOUND False) set(_NOT_FOUND_MESSAGE "Component requires the component ") # Note that you can also explicitely configure first lib instead of raising an error else() - if (NOT Qt5_FOUND) - find_dependency(Qt5 COMPONENTS Core Widgets REQUIRED) + if (NOT Qt6_FOUND) + find_qt_dependency(COMPONENTS Core Widgets REQUIRED) endif() include("${CMAKE_CURRENT_LIST_DIR}/Targets.cmake" ) endif() @@ -854,4 +853,4 @@ where `` corresponds to the parameter `PREFIX` used when instal ## Configuring an application plugin -See [How to write your own plugin](@ref develplugin). +See [How to write your own plugin](\ref develplugin). diff --git a/doc/developer/conventions.md b/doc/developer/conventions.md index d8881d19769..474df01aeae 100644 --- a/doc/developer/conventions.md +++ b/doc/developer/conventions.md @@ -6,9 +6,8 @@ Mainly inspired by real 1m13.289s -- `time make coverage_fastcov` -> real 0m11.717s +- `time cmake --build . --target coverage` -> 2:08.60 total +- `time cmake --build . --target coverage_fastcov` -> 48.178 total diff --git a/doc/developer/material.md b/doc/developer/material.md index 215960e914d..4e3cce2ecd1 100644 --- a/doc/developer/material.md +++ b/doc/developer/material.md @@ -52,7 +52,7 @@ must be associated with a Ra::Engine::Rendering::RenderTechnique that links to t To do that, the following steps must be done : \todo update snippets that are not available anymore. -1. Create the Ra::Engine::Data::Mesh (see the [documentation about Meshes](@ref develmeshes)) +1. Create the Ra::Engine::Data::Mesh (see the [documentation about Meshes](\ref develmeshes)) 2. Create the Ra::Engine::Data::Material @@ -62,8 +62,8 @@ to the material 4. Create the Ra::Engine::Rendering::RenderObject and add it to the Ra::Engine::Scene::Component Note that this way of using the _Radium Material Library_ is very related to the default Radium rendering capabilities -exposed by the [Radium forward renderer](@ref forwardRenderer). -See the [Render technique management](./rendertechnique) documentation to learn how to create your own +exposed by the [Radium forward renderer](\ref forwardRenderer). +See the [Render technique management](#render-technique) documentation to learn how to create your own Ra::Engine::Rendering::RenderTechnique, potentially without associated material. If one wants to render objects without BSDF computation but with a specific color computation for the fragment, @@ -123,13 +123,34 @@ public: } ~~~ -See the [Render technique management](./rendertechnique) for documentation on how to build such an helper function. +See the [Render technique management](#render-technique) for documentation on how to build such an helper function. + +## Textures {#material-textures} + +The MaterialTextureSet template ease a material's texture management. +First define an enum with the managed texture semantic you want to have, by convention declare this enum in Ra::Engine::Data::TextureSemantics, named as your Material class. e.g. for BlinnPhongMaterial: + +\snippet Engine/Data/BlinnPhongMaterial.hpp TextureSemantics + +Then to set a texture according to the semantic: + +\snippet TexturedQuadDynamic/main.cpp Add texture to material + +\see + +- @ref develTextures +- Ra::Engine::Data::MaterialTextureSet +- Ra::Engine::Data::TextureManager +- Ra::Engine::Data::Texture +- Ra::Engine::Data::TextureParameters +- Ra::Engine::Data::SamplerParameters +- Ra::Engine::Data::ImageParameters ### Making a material editable {#editable-interface} -Material which implement the Ra::Engine::Data::ParameterSetEditionInterface might be modified at runtime. +Material which implement the Ra::Engine::Data::ParameterSetEditingInterface might be modified at runtime. -This interface exposes the method Ra::Engine::Data::ParameterSetEditionInterface::getParametersMetadata +This interface exposes the method Ra::Engine::Data::ParameterSetEditingInterface::getParametersMetadata which return a json-formatted parameter set informations containing type, constraints and documentation on each editable parameter. @@ -152,7 +173,7 @@ The "editable" property specifies whether the boolean is editable, for instance #### Enums -When a parameter is referenced as an enum, the edition gui will present a combobox with the string representation of +When a parameter is referenced as an enum, the editing gui will present a combobox with the string representation of the enumaration values. Enumeration strings, could be defined in two ways. Either by associating a RenderParameter::EnumConverter with the material's parameter set or by defining the strings @@ -266,7 +287,7 @@ In order to keep the appearance computation agnostic on the way vertex attribs a propose an abstract interface. But, and this is particular to these attributes, one can access to the attributes himself, on the vertex, or to the attributes interpolated by the rasterizer, on the fragment. Accessing the Attribute directly on the vertex (i.e. on a vertex shader) does not necessitate an interface as -each shader must define its attributes and as the [Mesh API](./mesh.md) allows to communicate between C++ and GLSL. +each shader must define its attributes and as the [Mesh API](\ref develmeshes) allows to communicate between C++ and GLSL. Note that the attributes accessed through the Vertex attrib interface **must** be defined in world space. Even if not necessarily efficient (some transformations might be computed twice), this will ensure more simple @@ -496,7 +517,7 @@ auto theConfig = Ra::Engine::Data::ShaderConfigurationFactory::getConfiguration( "ConfigName" ); ~~~ -### Registering a RenderTechnique +### Registering a RenderTechnique {#render-technique} A Ra::Engine::Rendering::RenderTechnique describes which Ra::Engine::Data::ShaderConfiguration a renderer will use for each of its rendering passes. Such a render technique could encompass a Ra::Engine::Data::Material but its meaning is larger than just @@ -583,8 +604,8 @@ public: void updateGL() override { // Method called before drawing each frame in Rendering::updateRenderObjectsInternal. // The name of the parameter corresponds to the shader's uniform name. - m_renderParameters.addParameter( "aColorUniform", m_colorParameter ); - m_renderParameters.addParameter( "aScalarUniform", m_scalarParameter ); + m_renderParameters.setVariable( "aColorUniform", m_colorParameter ); + m_renderParameters.setVariable( "aScalarUniform", m_scalarParameter ); } void setOrComputeTheParameterValues() { @@ -631,7 +652,7 @@ renderTechnique.setConfiguration( myConfig, DefaultRenderingPasses::LIGHTING_OPA // 5. Create and associate the parameter provider with the RenderTechnique auto parameterProvider = std::make_shared(); parameterProvider->setOrComputeTheParameterValues(); -renderTechnique.setParametersProvider(parameterProvider); +renderTechnique.setVariablesProvider(parameterProvider); // 6. Associate the render technique with a geometry in a Ra::Engine::Rendering::RenderObject std::shared_ptr mesh( new Ra::Engine::Data::Mesh( "my mesh" ) ); @@ -646,7 +667,9 @@ addRenderObject( renderObject ); Then the draw call of ``renderObject`` uses the ``myConfig`` as shader configuration. Before rendering, the method ``updateGL`` on the ``parameterProvider`` instance is called so that the shader's uniforms values are updated according the one stored in ``parameterProvider``. -# \todo TO UPDATE +# TO UPDATE + +\todo TO UPDATE Shader programs are managed through their `ShaderConfiguration`, which contains the _shader objects_ (vertex, fragment, ... shader) and the _shader properties_ (not used for now though). diff --git a/doc/developer/oldmanual.md b/doc/developer/oldmanual.md index 1bd4e91d330..5df202fe9eb 100644 --- a/doc/developer/oldmanual.md +++ b/doc/developer/oldmanual.md @@ -1,4 +1,4 @@ -\page develoldmanual [deprecated] Radium Engine programmer manual +\page develoldmanual _deprecated_ Radium Engine programmer manual \todo pick relevant part, update and move to corresponding page [TOC] @@ -116,7 +116,7 @@ Render objects are stored together by the _render object manager_ for efficiency The Render Objects are drawn by the _Renderer_ which may live in a separated thread. Each frame it grabs all the drawable (which should be double-buffered in case we are mid-VBO update) and calls `draw()` on them. -(TODO : a nice class schema). +\todo a nice class schema ## ItemEntry : Handles to engine objects diff --git a/doc/developer/plugin.md b/doc/developer/plugin.md index 77e38bf26db..75177b20498 100644 --- a/doc/developer/plugin.md +++ b/doc/developer/plugin.md @@ -17,7 +17,7 @@ To compile and use a plugin, the Radium libraries must be configured, compiled a Example CMakeLists.txt setup to compile a Radium plugin: ```cmake - cmake_minimum_required(VERSION 3.6) + cmake_minimum_required(VERSION 3.18) #------------------------------------------------------------------------------ # Policies and global parameters for CMake if (POLICY CMP0077) @@ -32,9 +32,7 @@ Example CMakeLists.txt setup to compile a Radium plugin: # Use installed Radium environment find_package(Radium REQUIRED Core Engine PluginBase) - # Find and configure Qt environment using versionless targets (Radium requires Qt >= 5.15) - # https://doc.qt.io/qt-6/cmake-qt5-and-qt6-compatibility.html - # find_qt_package is provided by Radium +# Find and configure Qt environment using find_qt_package is provided by Radium find_qt_package(COMPONENTS Core REQUIRED) set(Qt_LIBRARIES Qt::Core) set(CMAKE_AUTOMOC ON) diff --git a/doc/developer/rendering.md b/doc/developer/rendering.md index 488730e6de3..24594667a79 100644 --- a/doc/developer/rendering.md +++ b/doc/developer/rendering.md @@ -109,7 +109,7 @@ Help wanted for this section. # Radium Engine default rendering information -See [Material management](@ref develmaterials) documentation for a complete description of the +See [Material management](\ref develmaterials) documentation for a complete description of the interactions geometry, material and shader._ # Potential extensions for the renderer diff --git a/doc/developer/textures.md b/doc/developer/textures.md new file mode 100644 index 00000000000..821e1052e6a --- /dev/null +++ b/doc/developer/textures.md @@ -0,0 +1,21 @@ +\page develTextures Textures management +[TOC] + +Texture data and management class. +First setup Ra::Engine::Data::TextureParameters. +Optionnaly load image with TextureManager::loadTextureImage +Create a Texture directly, or use TextureManager and get access to Texture by TextureManager::getTexture + +Loading Texture to the gpu is done asynchronously, when needed, a texture register gpu task to the engine, to load or delete texture. +If you have an active GL context, and want immediate gpu texture upload or delete, call Texture::initializeNow() +or Texture::destroyNow() + +\see + +- @ref material-textures in Material +- Ra::Engine::Data::MaterialTextureSet +- Ra::Engine::Data::TextureManager +- Ra::Engine::Data::Texture +- Ra::Engine::Data::TextureParameters +- Ra::Engine::Data::SamplerParameters +- Ra::Engine::Data::ImageParameters diff --git a/doc/header.html b/doc/header.html index 63fefbb6398..f31369f23fc 100644 --- a/doc/header.html +++ b/doc/header.html @@ -1,36 +1,40 @@ - - + - + $projectname: $title $title + + + + -$treeview -$search -$mathjax - -$extrastylesheet - - - + + + +$treeview +$search +$mathjax + +$extrastylesheet +
diff --git a/doc/images/radium-banner.png b/doc/images/radium-banner.png deleted file mode 100644 index 9ef2919f3d5..00000000000 Binary files a/doc/images/radium-banner.png and /dev/null differ diff --git a/doc/images/radium-banner.webp b/doc/images/radium-banner.webp new file mode 100644 index 00000000000..14e5b947616 Binary files /dev/null and b/doc/images/radium-banner.webp differ diff --git a/doc/images/radium-logo.png b/doc/images/radium-logo.png deleted file mode 100644 index 57b88c4166c..00000000000 Binary files a/doc/images/radium-logo.png and /dev/null differ diff --git a/doc/images/radium-logo.webp b/doc/images/radium-logo.webp new file mode 100644 index 00000000000..29e089cef3e Binary files /dev/null and b/doc/images/radium-logo.webp differ diff --git a/doc/main.md b/doc/main.md index dadbeb12272..d6470542667 100644 --- a/doc/main.md +++ b/doc/main.md @@ -1,12 +1,22 @@ \mainpage -![banner](images/radium-banner.png) +![banner](images/radium-banner.webp) Radium is a research 3D Engine for rendering, animation and processing. Developed and maintained by the [STORM research group](https://www.irit.fr/STORM/site/). The source code is hosted on github: -# Badges +### Overview + +See [this presentation](https://docs.google.com/presentation/d/12W2KXY7ctJXFIelmgNEn7obiBv_E4bmcMl3mXeJPVgc/edit?usp=sharing) for an overview of the project. + +The documentation is structured as follow: + +- \ref basicsmanual : how to compile Radium and use it in your own project. +- \ref develmanual : general topics (e.g. coding conventions) and description of the concepts found in the API of Radium. +- \ref conceptsmanual : high level concepts used in Radium Engine + +### Badges [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/374bd173d03946a9b54c3c6bbd8cd589)](https://app.codacy.com/gh/STORM-IRIT/Radium-Engine?utm_source=github.com&utm_medium=referral&utm_content=STORM-IRIT/Radium-Engine&utm_campaign=Badge_Grade_Settings) @@ -26,13 +36,3 @@ The source code is hosted on github: ( "Shaded Material" ); - blinnPhongMaterial->m_perVertexColor = true; - blinnPhongMaterial->m_ks = Color::White(); - blinnPhongMaterial->m_ns = 100_ra; + auto blinnPhongMaterial = make_shared( "Shaded Material" ); + blinnPhongMaterial->setColoredByVertexAttrib( true ); + blinnPhongMaterial->setSpecularColor( Color::White() ); + blinnPhongMaterial->setSpecularExponent( 100_ra ); auto blinnPhongTexturedMaterial = make_shared( "Shaded Textured Material" ); - blinnPhongTexturedMaterial->m_perVertexColor = true; - blinnPhongTexturedMaterial->m_ks = Color::White(); - blinnPhongTexturedMaterial->m_ns = 100_ra; + blinnPhongTexturedMaterial->setColoredByVertexAttrib( true ); + blinnPhongTexturedMaterial->setSpecularColor( Color::White() ); + blinnPhongTexturedMaterial->setSpecularExponent( 100_ra ); Ra::Engine::Data::TextureParameters textureParameters; - textureParameters.name = *rp + "/Examples/DrawPrimitives/Assets/grid.png"; - textureParameters.wrapS = GL_REPEAT; - textureParameters.wrapT = GL_REPEAT; - textureParameters.minFilter = GL_LINEAR_MIPMAP_LINEAR; + textureParameters.name = "grid"; + textureParameters.image = + TextureManager::loadTextureImage( *rp + "/Examples/DrawPrimitives/Assets/grid.png", true ); + textureParameters.sampler.wrapS = GL_REPEAT; + textureParameters.sampler.wrapT = GL_REPEAT; + textureParameters.sampler.minFilter = GL_LINEAR_MIPMAP_LINEAR; blinnPhongTexturedMaterial->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_DIFFUSE, textureParameters ); - auto plainMaterial = make_shared( "Plain Material" ); - plainMaterial->m_perVertexColor = true; + auto plainMaterial = make_shared( "Plain Material" ); + plainMaterial->setColoredByVertexAttrib( true ); - auto lambertianMaterial = make_shared( "Lambertian Material" ); - lambertianMaterial->m_perVertexColor = true; + auto lambertianMaterial = make_shared( "Lambertian Material" ); + lambertianMaterial->setColoredByVertexAttrib( true ); //// setup //// Scalar colorBoost = 1_ra; /// since simple primitive are ambient only, boost their color @@ -725,8 +727,8 @@ void AllPrimitivesComponent::initialize() { roMaterial.reset( mat ); } else { - auto mat = new Data::BlinnPhongMaterial( "_DefaultBPMaterial" ); - mat->m_renderAsSplat = mesh->getNumFaces() == 0; + auto mat = new Data::BlinnPhongMaterial( "_DefaultBPMaterial" ); + mat->setRenderAsSplat( mesh->getNumFaces() == 0 ); roMaterial.reset( mat ); } diff --git a/examples/DrawPrimitives/CMakeLists.txt b/examples/DrawPrimitives/CMakeLists.txt index 25f02eebe72..238e5d1724a 100644 --- a/examples/DrawPrimitives/CMakeLists.txt +++ b/examples/DrawPrimitives/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/DrawPrimitives/minimalapp.cpp b/examples/DrawPrimitives/minimalapp.cpp index 0d804bc4b07..e21fd75481f 100644 --- a/examples/DrawPrimitives/minimalapp.cpp +++ b/examples/DrawPrimitives/minimalapp.cpp @@ -130,12 +130,17 @@ void MinimalApp::frame() { // to check the time from last frame. const Scalar dt = 1.f / Scalar( m_targetFps ); + m_viewer->processPicking(); + // Collect and run tasks m_engine->getTasks( m_taskQueue.get(), dt ); m_taskQueue->startTasks(); m_taskQueue->waitForTasks(); m_taskQueue->flushTaskQueue(); + m_viewer->makeCurrent(); + m_engine->runGpuTasks(); + m_viewer->doneCurrent(); // Starts the renderer m_viewer->startRendering( dt ); diff --git a/examples/DrawPrimitives/minimalapp.hpp b/examples/DrawPrimitives/minimalapp.hpp index 0e6578322d1..cf6cc1ec9b1 100644 --- a/examples/DrawPrimitives/minimalapp.hpp +++ b/examples/DrawPrimitives/minimalapp.hpp @@ -15,7 +15,7 @@ class MinimalApp : public QApplication public: /** IMPORTANT : the argc parameter must be a reference for calling the QApplication constructor - @see http://doc.qt.io/qt-5/qapplication.html#QApplication + \see http://doc.qt.io/qt-5/qapplication.html#QApplication */ MinimalApp( int& argc, char** argv ); ~MinimalApp(); diff --git a/examples/EntityAnimation/CMakeLists.txt b/examples/EntityAnimation/CMakeLists.txt index 9dba4f84d62..af638426925 100644 --- a/examples/EntityAnimation/CMakeLists.txt +++ b/examples/EntityAnimation/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(EntityAnimation VERSION 1.0.0) diff --git a/examples/EnvMap/CMakeLists.txt b/examples/EnvMap/CMakeLists.txt index 8084accdeaf..4586b914006 100644 --- a/examples/EnvMap/CMakeLists.txt +++ b/examples/EnvMap/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.16) if(APPLE) cmake_policy(SET CMP0042 NEW) endif(APPLE) diff --git a/examples/HeadlessExample/CMakeLists.txt b/examples/HeadlessExample/CMakeLists.txt index 96c0574df39..356c7e85361 100644 --- a/examples/HeadlessExample/CMakeLists.txt +++ b/examples/HeadlessExample/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(HeadlessExample VERSION 1.0.2) diff --git a/examples/HeadlessExample/main.cpp b/examples/HeadlessExample/main.cpp index 1175a72ccb1..3cad9330653 100644 --- a/examples/HeadlessExample/main.cpp +++ b/examples/HeadlessExample/main.cpp @@ -39,9 +39,9 @@ int main( int argc, const char* argv[] ) { //! [Configuring the viewer : initialize OpenGL and the Engine] //! [Verifying the OpenGL version available to the engine] - if ( glVersion != viewer.m_engine->getOpenGLVersion() ) { + if ( glVersion != viewer.getEngine()->getOpenGLVersion() ) { std::cout << "OpenGL version mismatch : requested " << glVersion.toString() - << " -- available " << viewer.m_engine->getOpenGLVersion().toString() + << " -- available " << viewer.getEngine()->getOpenGLVersion().toString() << std::endl; } //! [Verifying the OpenGL version available to the engine] diff --git a/examples/HelloRadium/CMakeLists.txt b/examples/HelloRadium/CMakeLists.txt index ae29dacfde7..18773dac437 100644 --- a/examples/HelloRadium/CMakeLists.txt +++ b/examples/HelloRadium/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(HelloRadium VERSION 1.0.0) diff --git a/examples/KeyEvent/CMakeLists.txt b/examples/KeyEvent/CMakeLists.txt index b1c4321fc07..6c93d6bd409 100644 --- a/examples/KeyEvent/CMakeLists.txt +++ b/examples/KeyEvent/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/MaterialEdition/CMakeLists.txt b/examples/MaterialEditing/CMakeLists.txt similarity index 96% rename from examples/MaterialEdition/CMakeLists.txt rename to examples/MaterialEditing/CMakeLists.txt index 9b86df39e4c..f90e25f39aa 100644 --- a/examples/MaterialEdition/CMakeLists.txt +++ b/examples/MaterialEditing/CMakeLists.txt @@ -1,7 +1,7 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) -project(MaterialEdition VERSION 0.0.1) +project(MaterialEditing VERSION 0.0.1) # ------------------------------------------------------------------------------ # set wanted application defaults for cmake settings diff --git a/examples/MaterialEdition/main.cpp b/examples/MaterialEditing/main.cpp similarity index 100% rename from examples/MaterialEdition/main.cpp rename to examples/MaterialEditing/main.cpp diff --git a/examples/ParameterEdition/CMakeLists.txt b/examples/ParameterEditing/CMakeLists.txt similarity index 96% rename from examples/ParameterEdition/CMakeLists.txt rename to examples/ParameterEditing/CMakeLists.txt index 92464aa1a34..3b0766db20e 100644 --- a/examples/ParameterEdition/CMakeLists.txt +++ b/examples/ParameterEditing/CMakeLists.txt @@ -1,7 +1,7 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) -project(ParameterEdition VERSION 1.0.0) +project(ParameterEditing VERSION 1.0.0) # ------------------------------------------------------------------------------ # set wanted application defaults for cmake settings diff --git a/examples/ParameterEdition/main.cpp b/examples/ParameterEditing/main.cpp similarity index 78% rename from examples/ParameterEdition/main.cpp rename to examples/ParameterEditing/main.cpp index 1e33ed72fbb..a04f222fb8f 100644 --- a/examples/ParameterEdition/main.cpp +++ b/examples/ParameterEditing/main.cpp @@ -1,5 +1,7 @@ // Include Radium base application and its simple Gui +#include +#include #include #include #include @@ -17,7 +19,7 @@ using namespace Ra::Gui; using namespace Ra::Core; // Visitor to print all or some of the parameters stored in a RenderParameter object. -// This visitor is very similar to the one used to build the edition ui (RenderParameterUiBuilder +// This visitor is very similar to the one used to build the editing ui (RenderParameterUiBuilder // in ParameterSetEditor.cpp) and could be used with a predicate function accepting variable wrt // their name struct ParameterPrinter { @@ -173,15 +175,15 @@ int main( int argc, char* argv[] ) { QApplication a( argc, argv ); //! [Creating the application] - //! [Creating the edition dialog] + //! [Creating the editing dialog] QDialog dialog( nullptr ); - dialog.setWindowTitle( "ParameterSet edition example" ); + dialog.setWindowTitle( "ParameterSet editing example" ); auto layout = new QVBoxLayout( dialog.window() ); - ParameterSetEditor editor( "Demonstration parameter set", dialog.window() ); + VariableSetEditor editor( "Demonstration parameter set", dialog.window() ); - editor.showUnspecified( true ); + editor.setShowUnspecified( true ); layout->addWidget( &editor ); - //! [Creating the edition dialog] + //! [Creating the editing dialog] //! [Management of string<->value conversion for enumeration parameters] auto vnc = new Ra::Core::Utils::EnumConverter( { { Values::VALUE_0, "VALUE_0" }, @@ -192,53 +194,54 @@ int main( int argc, char* argv[] ) { //! [filling the parameter set to edit ] RenderParameters parameters; - parameters.addEnumConverter( "enum", valuesEnumConverter ); - parameters.addParameter( "bool", false ); - parameters.addParameter( "enum", Values::VALUE_1 ); - parameters.addParameter( "int", int( 0 ) ); - parameters.addParameter( "int_constrained", int( 0 ) ); - parameters.addParameter( "uint", (unsigned int)( 10 ) ); - parameters.addParameter( "uint_constrained", (unsigned int)( 5 ) ); - parameters.addParameter( "Scalar", 0_ra ); - parameters.addParameter( "Scalar_constrained", 0.5_ra ); - parameters.addParameter( "Scalar_half_constrained", 0_ra ); - parameters.addParameter( "Scalar_multiconstrained", 0.5_ra ); - parameters.addParameter( "Color", Ra::Core::Utils::Color::Magenta() ); - parameters.addParameter( "Vec2", Ra::Core::Vector2 { 1_ra, 0_ra } ); - parameters.addParameter( "Vec3", Ra::Core::Vector3 { 1_ra, 1_ra, 1_ra } ); - parameters.addParameter( + using namespace Ra::Core::VariableSetEnumManagement; + addEnumConverter( parameters, "enum", valuesEnumConverter ); + parameters.setVariable( "bool", false ); + parameters.setVariable( "enum", Values::VALUE_1 ); + parameters.setVariable( "int", int( 0 ) ); + parameters.setVariable( "int_constrained", int( 0 ) ); + parameters.setVariable( "uint", (unsigned int)( 10 ) ); + parameters.setVariable( "uint_constrained", (unsigned int)( 5 ) ); + parameters.setVariable( "Scalar", 0_ra ); + parameters.setVariable( "Scalar_constrained", 0.5_ra ); + parameters.setVariable( "Scalar_half_constrained", 0_ra ); + parameters.setVariable( "Scalar_multiconstrained", 0.5_ra ); + parameters.setVariable( "Color", Ra::Core::Utils::Color::Magenta() ); + parameters.setVariable( "Vec2", Ra::Core::Vector2 { 1_ra, 0_ra } ); + parameters.setVariable( "Vec3", Ra::Core::Vector3 { 1_ra, 1_ra, 1_ra } ); + parameters.setVariable( "Matrix3", Ra::Core::Matrix3 { { 0_ra, 0_ra, 0_ra }, { 1_ra, 1_ra, 1_ra }, { 2_ra, 2_ra, 2_ra } } ); - parameters.addParameter( "std::vector", std::vector { 0, 1, 2 } ); + parameters.setVariable( "std::vector", std::vector { 0, 1, 2 } ); RenderParameters embedded; - embedded.addParameter( "embedded.int value", 1 ); - embedded.addParameter( "embedded.scalar value", 1_ra ); - parameters.addParameter( "embedded", embedded ); + embedded.setVariable( "embedded.int value", 1 ); + embedded.setVariable( "embedded.scalar value", 1_ra ); + parameters.setVariable( "embedded", embedded ); //! [filling the parameter set to edit ] - //! [Printing several parameters before edition ] - std::cout << "\nPrinting all parameters before edition :\n"; + //! [Printing several parameters before editing ] + std::cout << "\nPrinting all parameters before editing :\n"; parameters.visit( ParameterPrinter {} ); - //! [Printing several parameters before edition ] + //! [Printing several parameters before editing ] //! [Filling the editor with the parameter set ] - editor.setupFromParameters( parameters, parameterSet_metadata ); + editor.setupUi( parameters, parameterSet_metadata ); auto printParameter = [¶meters]( const std::string& p ) { std::cout << "Parameter " << p << " was modified. New value is "; parameters.visit( ParameterPrinter {}, [p]( const std::string& name ) { return p == name; } ); std::cout << "\n"; }; - QObject::connect( &editor, &ParameterSetEditor::parameterModified, printParameter ); + QObject::connect( &editor, &VariableSetEditor::parameterModified, printParameter ); dialog.show(); //! [Filling the editor with the parameter set ] a.exec(); - //! [Printing several parameters after edition ] + //! [Printing several parameters after editing ] std::cout << "\nPrinting all parameters before quit : "; parameters.visit( ParameterPrinter {} ); - //! [Printing several parameters after edition ] + //! [Printing several parameters after editing ] } diff --git a/examples/Picking/CMakeLists.txt b/examples/Picking/CMakeLists.txt index 31b2c76419e..4df933596d4 100644 --- a/examples/Picking/CMakeLists.txt +++ b/examples/Picking/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/PluginsWithLib/CMakeLists.txt b/examples/PluginsWithLib/CMakeLists.txt index ad38779e04b..03126a13815 100644 --- a/examples/PluginsWithLib/CMakeLists.txt +++ b/examples/PluginsWithLib/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # ------------------------------------------------------------------------------ # Policies and global parameters for CMake if(POLICY CMP0077) diff --git a/examples/PluginsWithLib/Downstream/CMakeLists.txt b/examples/PluginsWithLib/Downstream/CMakeLists.txt index 7dcccbc889f..39b2c88d17f 100644 --- a/examples/PluginsWithLib/Downstream/CMakeLists.txt +++ b/examples/PluginsWithLib/Downstream/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # ------------------------------------------------------------------------------ # Policies and global parameters for CMake if(POLICY CMP0077) diff --git a/examples/PluginsWithLib/Downstream/README.md b/examples/PluginsWithLib/Downstream/README.md index f52b1fa3562..43c4e90bdea 100644 --- a/examples/PluginsWithLib/Downstream/README.md +++ b/examples/PluginsWithLib/Downstream/README.md @@ -6,7 +6,7 @@ This example illustrates how to use a library shipped from another plugin (shoul `cmake -DRadium_DIR=/pathToInstalledRadium/lib/cmake/Radium/ -DExampleLibraryUpstream_DIR=/pathToInstalledUpstreamLibrary ..` -If Qt package is not found, add the option `-DQt5_DIR=/pathToInstalledQt5/lib/cmake/Qt5` to the cmake command. +If Qt6 package is not found, add the option `-DQt6_DIR=/pathToInstalledQt6/lib/cmake/Qt6` to the cmake command. ## Compile diff --git a/examples/PluginsWithLib/Upstream/CMakeLists.txt b/examples/PluginsWithLib/Upstream/CMakeLists.txt index 2a561e7cb81..7588bdaebd7 100644 --- a/examples/PluginsWithLib/Upstream/CMakeLists.txt +++ b/examples/PluginsWithLib/Upstream/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # ------------------------------------------------------------------------------ # Standard "Radium" cmake preamble Policies and global parameters for CMake if(POLICY CMP0077) diff --git a/examples/PluginsWithLib/Upstream/Library/CMakeLists.txt b/examples/PluginsWithLib/Upstream/Library/CMakeLists.txt index 0ba3f2f1236..b12b0fd5a05 100644 --- a/examples/PluginsWithLib/Upstream/Library/CMakeLists.txt +++ b/examples/PluginsWithLib/Upstream/Library/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # ------------------------------------------------------------------------------ # Policies and global parameters for CMake if(POLICY CMP0077) diff --git a/examples/PluginsWithLib/Upstream/Plugin/CMakeLists.txt b/examples/PluginsWithLib/Upstream/Plugin/CMakeLists.txt index a3d67636eab..d52e562906a 100644 --- a/examples/PluginsWithLib/Upstream/Plugin/CMakeLists.txt +++ b/examples/PluginsWithLib/Upstream/Plugin/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) # ------------------------------------------------------------------------------ # Policies and global parameters for CMake if(POLICY CMP0077) diff --git a/examples/PluginsWithLib/Upstream/README.md b/examples/PluginsWithLib/Upstream/README.md index 39dc2cf19fc..3584cf2cd18 100644 --- a/examples/PluginsWithLib/Upstream/README.md +++ b/examples/PluginsWithLib/Upstream/README.md @@ -10,7 +10,7 @@ cd build cmake -DRadium_DIR=/pathToInstalledRadium/lib/cmake/Radium/ ..` ``` -If Qt5 package is not found, add the option `-DQt5_DIR=/pathToInstalledQt5/lib/cmake/Qt5` to the cmake command. +If Qt6 package is not found, add the option `-DQt6_DIR=/pathToInstalledQt6/lib/cmake/Qt6` to the cmake command. ## Compile diff --git a/examples/RawShaderMaterial/CMakeLists.txt b/examples/RawShaderMaterial/CMakeLists.txt index b0cb5772328..04cb72e90d8 100644 --- a/examples/RawShaderMaterial/CMakeLists.txt +++ b/examples/RawShaderMaterial/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/RawShaderMaterial/main.cpp b/examples/RawShaderMaterial/main.cpp index f6be9e9401a..3bb42665a64 100644 --- a/examples/RawShaderMaterial/main.cpp +++ b/examples/RawShaderMaterial/main.cpp @@ -12,7 +12,7 @@ // include the custom material definition #include -// include the Viewer to demonstrate dynamic edition of materials +// include the Viewer to demonstrate dynamic editing of materials #include // Qt @@ -71,8 +71,8 @@ class MyParameterProvider : public Ra::Engine::Data::ShaderParameterProvider // Method called before drawing each frame in Renderer::updateRenderObjectsInternal. // The name of the parameter corresponds to the shader's uniform name. auto& renderParameters = getParameters(); - renderParameters.addParameter( "aColorUniform", m_colorParameter ); - renderParameters.addParameter( "aScalarUniform", m_scalarParameter ); + renderParameters.setVariable( "aColorUniform", m_colorParameter ); + renderParameters.setVariable( "aScalarUniform", m_scalarParameter ); } void setOrComputeTheParameterValues() { // client side computation of the parameters, e.g. @@ -87,8 +87,8 @@ class MyParameterProvider : public Ra::Engine::Data::ShaderParameterProvider /** * Generate a quad with a ShaderMaterial attached - * @param app - * @return The renderObject associated to the created component. + * \param app + * \return The renderObject associated to the created component. */ std::shared_ptr initQuad( Ra::Gui::BaseApplication& app ) { //! [Creating the quad] @@ -112,7 +112,7 @@ std::shared_ptr initQuad( Ra::Gui::BaseAppl auto system = app.m_engine->getSystem( "GeometrySystem" ); system->addComponent( e, c ); - //![get the renderobject for further edition] + //![get the renderobject for further editing] auto ro = Ra::Engine::RadiumEngine::getInstance()->getRenderObjectManager()->getRenderObject( c->m_renderObjects[0] ); diff --git a/examples/SimpleAnimation/CMakeLists.txt b/examples/SimpleAnimation/CMakeLists.txt index 216fa4859fd..da6e66ea0ce 100644 --- a/examples/SimpleAnimation/CMakeLists.txt +++ b/examples/SimpleAnimation/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/SimpleAnimation/main.cpp b/examples/SimpleAnimation/main.cpp index a8e019e8e2d..19b8b8a74de 100644 --- a/examples/SimpleAnimation/main.cpp +++ b/examples/SimpleAnimation/main.cpp @@ -32,7 +32,7 @@ * animated Blinn-Phong material to the geometry and update both the transformation and the * diffuse color at each time step. * - * @note This is only for demo purpose. A more simpler approach could be : + * \note This is only for demo purpose. A more simpler approach could be : * - Create and add a geometry component to the Engine geometry system (like in HelloRadium) * - Get the renderobject associated with this component and create an animation component * that associates the RenderObject with an animation controller @@ -77,8 +77,7 @@ class KeyFramedGeometryComponent : public Ra::Engine::Scene::TriangleMeshCompone m_colorController.m_updater = [colors, material]( const Scalar& t ) { auto C = colors->at( t, Ra::Core::Animation::linearInterpolate ); - material->m_kd = C; - material->needUpdate(); + material->setDiffuseColor( C ); }; //! [Attach the color KeyFrames to a controller] //! [Creating the color KeyFrames] diff --git a/examples/SimpleSimulation/CMakeLists.txt b/examples/SimpleSimulation/CMakeLists.txt index c2ce04046bd..ad65421a47a 100644 --- a/examples/SimpleSimulation/CMakeLists.txt +++ b/examples/SimpleSimulation/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/examples/SimpleSkinning/CMakeLists.txt b/examples/SimpleSkinning/CMakeLists.txt index 263894d95af..89e38e8a84d 100644 --- a/examples/SimpleSkinning/CMakeLists.txt +++ b/examples/SimpleSkinning/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(SimpleSkinning VERSION 1.0.0) diff --git a/examples/TexturedQuad/CMakeLists.txt b/examples/TexturedQuad/CMakeLists.txt index f8ec9a1342f..747ad134257 100644 --- a/examples/TexturedQuad/CMakeLists.txt +++ b/examples/TexturedQuad/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(TexturedQuad VERSION 1.0.0) diff --git a/examples/TexturedQuad/main.cpp b/examples/TexturedQuad/main.cpp index 7cc38dabe7a..c64e87c7910 100644 --- a/examples/TexturedQuad/main.cpp +++ b/examples/TexturedQuad/main.cpp @@ -1,4 +1,7 @@ // Include Radium base application and its simple Gui +#include +#include +#include #include #include @@ -11,20 +14,17 @@ #include int main( int argc, char* argv[] ) { - //! [Creating the application] Ra::Gui::BaseApplication app( argc, argv ); app.initialize( Ra::Gui::SimpleWindowFactory {} ); - //! [Creating the application] - //! [Creating a quad geometry with texture coordinates] auto quad = Ra::Core::Geometry::makeZNormalQuad( { 1_ra, 1_ra }, {}, true ); - //! [Creating a quad geometry with texture coordinates] //! [Creating a texture] constexpr int width = 192; constexpr int height = 512; constexpr int size = width * height; - unsigned char data[size]; + std::shared_ptr data( new unsigned char[size] ); + // fill with some function for ( int i = 0; i < width; ++i ) { for ( int j = 0; j < height; j++ ) { @@ -33,32 +33,30 @@ int main( int argc, char* argv[] ) { std::cos( j * i * M_PI / 96.0 ) ) ); } } - auto& textureParameters = - app.m_engine->getTextureManager()->addTexture( "myTexture", width, height, data ); + // these values will be used when engine initialize texture GL representation. - textureParameters.format = gl::GLenum::GL_RED; - textureParameters.internalFormat = gl::GLenum::GL_R8; + Ra::Engine::Data::TextureParameters textureParameters { "myTexture", {}, {} }; + textureParameters.image.format = gl::GLenum::GL_RED; + textureParameters.image.internalFormat = gl::GLenum::GL_R8; + textureParameters.image.width = width; + textureParameters.image.height = height; + textureParameters.image.texels = data; + + auto textureHandle = app.m_engine->getTextureManager()->addTexture( textureParameters ); //! [Creating a texture] //! [Create an entity and component to draw or data] auto e = app.m_engine->getEntityManager()->createEntity( "Textured quad" ); - Ra::Core::Asset::BlinnPhongMaterialData matData( "myMaterialData" ); - // remove glossy highlight - matData.m_specular = Ra::Core::Utils::Color::Black(); - matData.m_hasSpecular = true; - - matData.m_hasTexDiffuse = true; - // this name has to be the same as texManager added texture name - matData.m_texDiffuse = "myTexture"; + auto material = std::make_shared( "myMaterialData" ); + material->addTexture( Ra::Engine::Data::TextureSemantics::LambertianMaterial::TEX_COLOR, + textureHandle ); - // the entity get's this new component ownership. a bit wired since hidden in ctor. - new Ra::Engine::Scene::TriangleMeshComponent( "Quad Mesh", e, std::move( quad ), &matData ); + // the entity get's this new component ownership. A bit wired since hidden in ctor. + new Ra::Engine::Scene::TriangleMeshComponent( "Quad Mesh", e, std::move( quad ), material ); //! [Create an entity and component to draw or data] - //! [Tell the window that something is to be displayed] app.m_mainWindow->prepareDisplay(); - //! [Tell the window that something is to be displayed] return app.exec(); } diff --git a/examples/TexturedQuadDynamic/CMakeLists.txt b/examples/TexturedQuadDynamic/CMakeLists.txt index 0b9603593bd..5a9b0943a4a 100644 --- a/examples/TexturedQuadDynamic/CMakeLists.txt +++ b/examples/TexturedQuadDynamic/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0042 NEW) project(TexturedQuadDynamic VERSION 1.0.0) diff --git a/examples/TexturedQuadDynamic/main.cpp b/examples/TexturedQuadDynamic/main.cpp index 4ddc602f6cd..f16e3f24772 100644 --- a/examples/TexturedQuadDynamic/main.cpp +++ b/examples/TexturedQuadDynamic/main.cpp @@ -16,20 +16,16 @@ #include int main( int argc, char* argv[] ) { - //! [Creating the application] Ra::Gui::BaseApplication app( argc, argv ); app.initialize( Ra::Gui::SimpleWindowFactory {} ); - //! [Creating the application] - //! [Creating a quad geometry with texture coordinates] auto quad = Ra::Core::Geometry::makeZNormalQuad( { 1_ra, 1_ra }, {}, true ); - //! [Creating a quad geometry with texture coordinates] - //! [Creating a texture] constexpr int width = 192; constexpr int height = 512; constexpr int size = width * height; - unsigned char data[size]; + // make shared do not support array before c++ 20, + auto data = std::shared_ptr( new unsigned char[size]() ); // fill with some function for ( int i = 0; i < width; ++i ) { for ( int j = 0; j < height; j++ ) { @@ -38,38 +34,37 @@ int main( int argc, char* argv[] ) { std::cos( j * i * M_PI / 96.0 ) ) ); } } - auto& textureParameters = - app.m_engine->getTextureManager()->addTexture( "myTexture", width, height, data ); - // these values will be used when engine initialize texture GL representation. - textureParameters.format = gl::GLenum::GL_RED; - textureParameters.internalFormat = gl::GLenum::GL_R8; - //! [Creating a texture] - //! [Create an entity and component to draw or data] + Ra::Engine::Data::TextureParameters textureParameters { "myTexture", {}, {} }; + textureParameters.image.format = gl::GLenum::GL_RED; + textureParameters.image.internalFormat = gl::GLenum::GL_R8; + textureParameters.image.width = width; + textureParameters.image.height = height; + textureParameters.image.texels = data; + textureParameters.sampler.minFilter = gl::GLenum::GL_LINEAR_MIPMAP_LINEAR; + auto e = app.m_engine->getEntityManager()->createEntity( "Textured quad" ); - Ra::Core::Asset::BlinnPhongMaterialData matData( "myMaterialData" ); - // remove glossy highlight - matData.m_specular = Ra::Core::Utils::Color::Black(); - matData.m_hasSpecular = true; + //! [Add texture to material] + auto textureManager = app.m_engine->getTextureManager(); + auto textureHandle = textureManager->addTexture( textureParameters ); + auto texture = textureManager->getTexture( textureHandle ); + auto material = std::make_shared( "myMaterialData" ); + material->addTexture( Ra::Engine::Data::TextureSemantics::BlinnPhongMaterial::TEX_DIFFUSE, + textureHandle ); + //! [Add texture to material] - matData.m_hasTexDiffuse = true; - // this name has to be the same as texManager added texture name - matData.m_texDiffuse = "myTexture"; + // remove glossy highlight + material->setSpecularColor( Ra::Core::Utils::Color::Black() ); // the entity get's this new component ownership. a bit wired since hidden in ctor. - new Ra::Engine::Scene::TriangleMeshComponent( "Quad Mesh", e, std::move( quad ), &matData ); + new Ra::Engine::Scene::TriangleMeshComponent( "Quad Mesh", e, std::move( quad ), material ); //! [Create an entity and component to draw or data] //! [Tell the window that something is to be displayed] app.m_mainWindow->prepareDisplay(); //! [Tell the window that something is to be displayed] - auto viewer = app.m_mainWindow->getViewer(); - viewer->makeCurrent(); - auto texture = app.m_engine->getTextureManager()->getOrLoadTexture( textureParameters ); - viewer->doneCurrent(); - constexpr int nSec = 4; // terminate the app after nSec second (approximatively). Camera can be moved using mouse moves. auto thread = std::thread( [=, &app, &texture]() { @@ -80,7 +75,8 @@ int main( int argc, char* argv[] ) { const auto& endChrono = startChrono + ( iSec + 1 ) * std::chrono::milliseconds( 1000 ); while ( std::chrono::high_resolution_clock::now() < endChrono ) { - unsigned char newData[size]; + auto newData = std::shared_ptr( new unsigned char[size]() ); + for ( int i = 0; i < width; ++i ) { for ( int j = 0; j < height; j++ ) { newData[( i * height + j )] = @@ -103,13 +99,13 @@ int main( int argc, char* argv[] ) { auto thread2 = std::thread( [=, &texture, &exitSignal]() { auto future = exitSignal.get_future(); while ( future.wait_for( std::chrono::milliseconds( 1 ) ) == std::future_status::timeout ) { - unsigned char newData[size]; + auto newData = std::shared_ptr( new unsigned char[size]() ); for ( int i = 0; i < width; ++i ) { for ( int j = 0; j < height; j++ ) { newData[( i * height + j )] = ( i * 255 ) / width; } - texture->updateData( newData ); } + texture->updateData( newData ); std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); } } ); diff --git a/examples/Volume/CMakeLists.txt b/examples/Volume/CMakeLists.txt index 792c553d715..820a99fa69a 100644 --- a/examples/Volume/CMakeLists.txt +++ b/examples/Volume/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) cmake_policy(SET CMP0071 NEW) cmake_policy(SET CMP0042 NEW) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 6606f03d184..a09f9af4099 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) set(RADIUM_DEPENDENCIES_PROJECT_NAME radium_externals) project(${RADIUM_DEPENDENCIES_PROJECT_NAME}) diff --git a/external/Core/CMakeLists.txt b/external/Core/CMakeLists.txt index 3b71cecaaa4..06fd9589787 100644 --- a/external/Core/CMakeLists.txt +++ b/external/Core/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.18) project(radiumcore-external VERSION 1.0.0) @@ -70,15 +70,15 @@ if(NOT DEFINED cpplocate_DIR OR NOT cpplocate_DIR) GIT_TAG tags/v2.2.0 GIT_SHALLOW TRUE GIT_PROGRESS TRUE - PATCH_COMMAND git reset --hard && git apply -v --ignore-whitespace - "${CMAKE_CURRENT_LIST_DIR}/patches/cpplocate.patch" - INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" + INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cpplocate" CMAKE_ARGS ${RADIUM_EXTERNAL_CMAKE_OPTIONS} -DOPTION_BUILD_TESTS=OFF - -DOPTION_BUILD_DOCS=OFF -DCMAKE_MESSAGE_INDENT=${indent_string}\; + -DOPTION_BUILD_DOCS=OFF -DCMAKE_INSTALL_PREFIX= + "-DCMAKE_MESSAGE_INDENT=${indent_string}\;" ) add_dependencies(CoreExternals cpplocate) - set_external_dir(cpplocate "share/cpplocate/") + set_external_dir(cpplocate "cpplocate/") else() + add_custom_target(cpplocate) status_message("" "cpplocate" ${cpplocate_DIR}) endif() diff --git a/external/Core/patches/cpplocate.patch b/external/Core/patches/cpplocate.patch deleted file mode 100644 index 2ad15da849f..00000000000 --- a/external/Core/patches/cpplocate.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- cpplocate/CMakeLists.txt 2020-06-26 14:40:30.000000000 +0200 -+++ cpplocate/CMakeLists.txt.Radium 2020-06-26 14:44:55.000000000 +0200 -@@ -123,8 +123,6 @@ - endif() - - # Installation paths --if(UNIX AND SYSTEM_DIR_INSTALL) -- # Install into the system (/usr/bin or /usr/local/bin) - set(INSTALL_ROOT "share/${project}") # /usr/[local]/share/ - set(INSTALL_CMAKE "share/${project}/cmake") # /usr/[local]/share//cmake - set(INSTALL_EXAMPLES "share/${project}") # /usr/[local]/share/ -@@ -136,22 +134,7 @@ - set(INSTALL_DOC "share/doc/${project}") # /usr/[local]/share/doc/ - set(INSTALL_SHORTCUTS "share/applications") # /usr/[local]/share/applications - set(INSTALL_ICONS "share/pixmaps") # /usr/[local]/share/pixmaps -- set(INSTALL_INIT "/etc/init") # /etc/init (upstart init scripts) --else() -- # Install into local directory -- set(INSTALL_ROOT ".") # ./ -- set(INSTALL_CMAKE "cmake") # ./cmake -- set(INSTALL_EXAMPLES ".") # ./ -- set(INSTALL_DATA ".") # ./ -- set(INSTALL_BIN ".") # ./ -- set(INSTALL_SHARED "lib") # ./lib -- set(INSTALL_LIB "lib") # ./lib -- set(INSTALL_INCLUDE "include") # ./include -- set(INSTALL_DOC "doc") # ./doc -- set(INSTALL_SHORTCUTS "misc") # ./misc -- set(INSTALL_ICONS "misc") # ./misc -- set(INSTALL_INIT "misc") # ./misc --endif() -+ set(INSTALL_INIT "etc/init") # /etc/init (upstart init scripts) - - # Set runtime path - set(CMAKE_SKIP_BUILD_RPATH FALSE) # Add absolute path to all dependencies for BUILD diff --git a/external/Engine/CMakeLists.txt b/external/Engine/CMakeLists.txt index 2b086659734..9cfdc185c8b 100644 --- a/external/Engine/CMakeLists.txt +++ b/external/Engine/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.18) project(radiumengine-external VERSION 1.0.0) diff --git a/external/Gui/CMakeLists.txt b/external/Gui/CMakeLists.txt index 5156484ed95..3fd8908d3d7 100644 --- a/external/Gui/CMakeLists.txt +++ b/external/Gui/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.18) project(radiumgui-external VERSION 1.0.0) @@ -28,20 +28,14 @@ add_custom_target(GuiExternals ALL) # ------------------------------------------------------------------------------ -# propagate the Qt version used to compile externals if none of Qt6_DIR or Qt5_DIR is defined, -# assume the CMAKE_PREFIX_PATH allow to find the desired Qt package +# Force the use of Qt6, assume dependencies uses either Qt6_DIR or QT_DEFAULT_MAJOR_VERSION set(Qt_CONFIGURATION "") if(DEFINED Qt6_DIR) set(Qt_CONFIGURATION "-DQt6_DIR=${Qt6_DIR}") -elseif(DEFINED Qt5_DIR) - set(Qt_CONFIGURATION "-DQt5_DIR=${Qt5_DIR}") endif() -if(DEFINED QT_DEFAULT_MAJOR_VERSION) - set(Qt_CONFIGURATION - "${Qt_CONFIGURATION} -DQT_DEFAULT_MAJOR_VERSION=${QT_DEFAULT_MAJOR_VERSION}" - ) -endif() +set(QT_DEFAULT_MAJOUR_VERSION 6) +set(Qt_CONFIGURATION "${Qt_CONFIGURATION};-DQT_DEFAULT_MAJOR_VERSION=${QT_DEFAULT_MAJOR_VERSION}") # configure RPATH as expected to be used under Radium list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) @@ -71,7 +65,7 @@ if(NOT DEFINED PowerSlider_DIR) INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" CMAKE_ARGS ${RADIUM_EXTERNAL_CMAKE_OPTIONS} ${Qt_CONFIGURATION} -DBUILD_DESIGNER_PLUGIN=OFF ${RPATH_CONFIG} -DBUILD_EXAMPLE_APP=OFF - -DCMAKE_MESSAGE_INDENT=${indent_string}\; + "-DCMAKE_MESSAGE_INDENT=${indent_string}\;" ) set_external_dir(PowerSlider "lib/cmake/PowerSlider/") diff --git a/external/IO/CMakeLists.txt b/external/IO/CMakeLists.txt index 2e0ffd86591..09a42edd037 100644 --- a/external/IO/CMakeLists.txt +++ b/external/IO/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.18) project(radiumio-external VERSION 1.0.0) diff --git a/external/doxygen-awesome-css b/external/doxygen-awesome-css index 4cd62308d82..568f56cde6a 160000 --- a/external/doxygen-awesome-css +++ b/external/doxygen-awesome-css @@ -1 +1 @@ -Subproject commit 4cd62308d825fe0396d2f66ffbab45d0e247724c +Subproject commit 568f56cde6ac78b6dfcc14acd380b2e745c301ea diff --git a/scripts/list_dep.py b/scripts/list_dep.py index a416cb854e1..263e731e273 100755 --- a/scripts/list_dep.py +++ b/scripts/list_dep.py @@ -15,6 +15,7 @@ option = re.compile(r'[^\)](-D\S*)') optionfilter = re.compile(r'indent') +modules={} dep = {} debug = False @@ -59,11 +60,20 @@ match3 = regex.search(cmake_add_text, match3.end(1)) start = match0.end(1) match0 = full.search(filetext, start) + if len(dep) >0 : modules[filename.parts[0]] = dep + dep={} -for key in dep: - print(f" * `{key}_DIR`") +for module in {'Core', 'Engine', 'IO', 'Gui', 'Headless'}: + if module in modules: + dep = modules[module] + for key in dep: + print(f"* `{key}_DIR`") print("\n\nRadium is compiled and tested with specific version of dependencies, as given in the external's folder CMakeLists.txt and state here for the record\n\n") -for key in dep: - print(f" * {key}: {dep[key]['git']}, [{dep[key]['tag']}],\n * with options `{dep[key]['option'] if 'option' in dep[key] else None }`") +for module in {'Core', 'Engine', 'IO', 'Gui', 'Headless'}: + if module in modules: + dep = modules[module] + print(f"* [{module}]") + for key in dep: + print(f" * {key}: {dep[key]['git']}, [{dep[key]['tag']}],\n * with options `{dep[key]['option'] if 'option' in dep[key] else None }`") diff --git a/src/Core/Animation/HandleArray.hpp b/src/Core/Animation/HandleArray.hpp index edc439d708e..dffab5b5c19 100644 --- a/src/Core/Animation/HandleArray.hpp +++ b/src/Core/Animation/HandleArray.hpp @@ -33,7 +33,7 @@ class RA_CORE_API HandleArray virtual ~HandleArray(); /** - * @return the number of transformations + * \return the number of transformations */ inline virtual uint size() const { return m_pose.size(); } @@ -43,19 +43,19 @@ class RA_CORE_API HandleArray virtual void clear(); /** - * @return the current pose in the \p MODE space. + * \return the current pose in the \p MODE space. */ virtual const Pose& getPose( const SpaceType MODE ) const; /** * Set the current pose. - * @param pose the new pose - * @param MODE the space the psoe lives in + * \param pose the new pose + * \param MODE the space the psoe lives in */ virtual void setPose( const Pose& pose, const SpaceType MODE ); /** - * @return the \p i-th transformation in \p MODE space. + * \return the \p i-th transformation in \p MODE space. */ virtual const Transform& getTransform( const uint i, const SpaceType MODE ) const; @@ -65,7 +65,7 @@ class RA_CORE_API HandleArray virtual void setTransform( const uint i, const Transform& T, const SpaceType MODE ); /** - * @return the Handle's name + * \return the Handle's name */ inline Label getName() const { return m_name; } @@ -75,7 +75,7 @@ class RA_CORE_API HandleArray inline void setName( const Label& name ) { m_name = name; } /** - * @return the name of the \p i-th transform. + * \return the name of the \p i-th transform. */ inline Label getLabel( const uint i ) const; diff --git a/src/Core/Animation/KeyFramedValue.hpp b/src/Core/Animation/KeyFramedValue.hpp index be0202d7d2a..3abcd97ebf0 100644 --- a/src/Core/Animation/KeyFramedValue.hpp +++ b/src/Core/Animation/KeyFramedValue.hpp @@ -25,7 +25,7 @@ class RA_CORE_API KeyFramedValueBase virtual ~KeyFramedValueBase() {} /** - * @returns the number of keyframes. + * \returns the number of keyframes. */ virtual inline size_t size() const = 0; @@ -95,12 +95,12 @@ class KeyFramedValue : public KeyFramedValueBase /// \{ /** - * @returns the number of keyframes. + * \returns the number of keyframes. */ inline size_t size() const override { return m_keyframes.size(); } /** - * @returns the collection of keyframes. + * \returns the collection of keyframes. */ const KeyFrames& getKeyFrames() const { return m_keyframes; } @@ -213,7 +213,7 @@ class KeyFramedValue : public KeyFramedValueBase /// \{ /** - * @returns true if *this and \p keyframe have the exact same keyframes, + * \returns true if *this and \p keyframe have the exact same keyframes, * false otherwise. */ inline bool operator==( const KeyFramedValue& keyframe ) const { @@ -221,7 +221,7 @@ class KeyFramedValue : public KeyFramedValueBase } /** - * @returns true if *this and \p keyframe do not have the exact same keyframes, + * \returns true if *this and \p keyframe do not have the exact same keyframes, * false otherwise. */ inline bool operator!=( const KeyFramedValue& keyframe ) const { diff --git a/src/Core/Animation/Skeleton.cpp b/src/Core/Animation/Skeleton.cpp index c4b81ff3159..99d48372604 100644 --- a/src/Core/Animation/Skeleton.cpp +++ b/src/Core/Animation/Skeleton.cpp @@ -95,6 +95,9 @@ void Skeleton::setTransform( const uint i, const Transform& T, const SpaceType M // update bone transform and also children's transform setLocalTransform( i, m_pose[i] * m_modelSpace[i].inverse() * modelT ); } break; + default: + // nothing can be done, error + break; } } diff --git a/src/Core/Animation/Skeleton.hpp b/src/Core/Animation/Skeleton.hpp index e6e1e9a7f37..7be575b2ca0 100644 --- a/src/Core/Animation/Skeleton.hpp +++ b/src/Core/Animation/Skeleton.hpp @@ -17,18 +17,18 @@ namespace Animation { * the former being the parent of the latter in the hierarchy. * For animation purposes, a bone transform refers to the proximal joint's tranform. * - * During the edition of the transformation of a skeleton bone, the transformations + * During the editing of the transformation of a skeleton bone, the transformations * of all the bones are updated accroding to the Manipulation scheme * (cf Ra::Core:Animation::Skeleton::Manipulation). */ class RA_CORE_API Skeleton : public HandleArray { public: - /// Edition scheme for the manipulation of the skeleton. + /// Editing scheme for the manipulation of the skeleton. /// \todo also implement Inverse Kynematics. enum Manipulation { - FORWARD = 0, ///< Standard edition scheme: rotation and / or translation of one bone. - PSEUDO_IK ///< Advanced edition scheme: translation of a bone means parent's rotation. + FORWARD = 0, ///< Standard editing scheme: rotation and / or translation of one bone. + PSEUDO_IK ///< Advanced editing scheme: translation of a bone means parent's rotation. }; Skeleton(); @@ -51,19 +51,19 @@ class RA_CORE_API Skeleton : public HandleArray /** * Add a new root transform to the skeleton. - * @param T the joint transform associated to the new bone - * @param label the name for the new joint - * @return the index of the new joint + * \param T the joint transform associated to the new bone + * \param label the name for the new joint + * \return the index of the new joint */ uint addRoot( const Transform& T = Transform::Identity(), const Label label = "" ); /** * Add a new joint transform to the skeleton. - * @param parent the index of the joint's parent in the hierarchy - * @param T the joint transform associated to the new bone - * @param MODE SpaceType of T (either SpaceType::LOCAL or SpaceType::MODEL) - * @param label the name for the new joint - * @return the index of the new joint + * \param parent the index of the joint's parent in the hierarchy + * \param T the joint transform associated to the new bone + * \param MODE SpaceType of T (either SpaceType::LOCAL or SpaceType::MODEL) + * \param label the name for the new joint + * \return the index of the new joint */ uint addBone( const uint parent, const Transform& T = Transform::Identity(), @@ -72,9 +72,9 @@ class RA_CORE_API Skeleton : public HandleArray /** * Get the i-th bone endpoints in Model space. - * @param i the bone index - * @param[out] startOut the bone's start point - * @param[out] endOut the bone's end point + * \param i the bone index + * \param[out] startOut the bone's start point + * \param[out] endOut the bone's end point * * \note If the i-th bone is a leaf, then \p startOut == \p endOut. */ diff --git a/src/Core/Asset/Camera.cpp b/src/Core/Asset/Camera.cpp index 4ffdb413c5a..ad621b953c8 100644 --- a/src/Core/Asset/Camera.cpp +++ b/src/Core/Asset/Camera.cpp @@ -40,7 +40,7 @@ void Camera::setDirection( const Core::Vector3& direction ) { // Special case if two directions are exactly opposites we constrain. // to rotate around the up vector. - if ( c.isApprox( Core::Vector3::Zero() ) && d < 0.0 ) { + if ( Math::areApproxEqual( c.squaredNorm(), 0_ra ) && d < 0_ra ) { T.rotate( Core::AngleAxis( Core::Math::Pi, getUpVector() ) ); } else { T.rotate( Core::Quaternion::FromTwoVectors( d0, d1 ) ); } diff --git a/src/Core/Asset/Camera.hpp b/src/Core/Asset/Camera.hpp index 6fb6b8cfcce..00fb2aca7ae 100644 --- a/src/Core/Asset/Camera.hpp +++ b/src/Core/Asset/Camera.hpp @@ -15,8 +15,6 @@ namespace Asset { class RA_CORE_API Camera { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /// Define the projection type. enum class ProjType { ORTHOGRAPHIC, PERSPECTIVE }; @@ -108,8 +106,10 @@ class RA_CORE_API Camera /// Set the Field Of View to 'fov' in the x (horizontal) direction. /// If you have an vertical field of view, you can convert it to horizontal as - /// Scalar fovx = 2_ra*std::atan( radiumCam->getAspect() * std::tan( cam.yfov / 2_ra ) ); - // if ( fovxDiv2 < 0_ra ) { fovxDiv2 = Ra::Core::Math::PiDiv2; } + /// \code{.cpp} + /// Scalar fovx = 2_ra * std::atan( radiumCam->getAspect() * std::tan( cam.yfov / 2_ra ) ); + /// if ( fovxDiv2 < 0_ra ) { fovxDiv2 = Ra::Core::Math::PiDiv2; } + /// \endcode /// \note Meaningless for orthogonal projection. /// \warning Trigger a rebuild of the projection matrix. inline void setFOV( Scalar fov ); @@ -222,15 +222,15 @@ class RA_CORE_API Camera Scalar m_zFar { 1000_ra }; ///< Z Far plane distance /// \name Perspective projection parameters - ///@{ + ///\{ Scalar m_fov { Core::Math::PiDiv4 }; ///< Horizontal Field Of View - ///@} + ///\} /// \name Orthographic projection parameters - ///@{ + ///\{ Scalar m_xmag { 1_ra }; Scalar m_ymag { 1_ra }; - ///@} + ///\} }; inline Core::Transform Camera::getFrame() const { diff --git a/src/Core/Asset/GeometryData.hpp b/src/Core/Asset/GeometryData.hpp index 59ccb880a41..24551949d88 100644 --- a/src/Core/Asset/GeometryData.hpp +++ b/src/Core/Asset/GeometryData.hpp @@ -31,8 +31,6 @@ class RA_CORE_API GeometryData : public AssetData using ColorArray = Vector4Array; public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** * The type of geometry. */ diff --git a/src/Core/Asset/HandleData.hpp b/src/Core/Asset/HandleData.hpp index 9995f3974e8..0cabcdfba18 100644 --- a/src/Core/Asset/HandleData.hpp +++ b/src/Core/Asset/HandleData.hpp @@ -19,7 +19,6 @@ namespace Asset { * A HandleComponentData stores the data of an animation Handle linked to an object. */ struct RA_CORE_API HandleComponentData { - EIGEN_MAKE_ALIGNED_OPERATOR_NEW HandleComponentData(); @@ -42,8 +41,6 @@ struct RA_CORE_API HandleComponentData { class RA_CORE_API HandleData : public AssetData { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** * The type of Handle system. */ diff --git a/src/Core/Asset/LightData.hpp b/src/Core/Asset/LightData.hpp index f6659196ea3..236974436e3 100644 --- a/src/Core/Asset/LightData.hpp +++ b/src/Core/Asset/LightData.hpp @@ -26,8 +26,6 @@ class RA_CORE_API LightData : public AssetData { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** Supported light type * */ @@ -63,7 +61,7 @@ class RA_CORE_API LightData : public AssetData * Copy constructor. * As a Light a a union like object, no default copy constructor could be generated. This will * take care of copying the good members of the union. - * @param data + * \param data */ LightData( const LightData& data ); @@ -79,13 +77,13 @@ class RA_CORE_API LightData : public AssetData /** * Acces to the local frame of the light. - * @return the local frame + * \return the local frame */ inline const Eigen::Matrix& getFrame() const; /** * Set the local frame of the light. - * @param frame the local frame + * \param frame the local frame */ inline void setFrame( const Eigen::Matrix& frame ); diff --git a/src/Core/Asset/MaterialData.hpp b/src/Core/Asset/MaterialData.hpp index fce815bf100..052427e19ca 100644 --- a/src/Core/Asset/MaterialData.hpp +++ b/src/Core/Asset/MaterialData.hpp @@ -9,7 +9,7 @@ namespace Ra { namespace Core { namespace Asset { -/** @brief represent material data loaded by a file loader. +/** \brief represent material data loaded by a file loader. * Material data must be identified by a unique name. * Radium Engine reserves the following names * "AbstractMaterial" --> unknown material, might serve for error management diff --git a/src/Core/CMakeLists.txt b/src/Core/CMakeLists.txt index 7a874fee7bc..093a764811f 100644 --- a/src/Core/CMakeLists.txt +++ b/src/Core/CMakeLists.txt @@ -1,9 +1,10 @@ set(ra_core_target Core) +message_prefix_push("${ra_core_target}") + project(${ra_core_target} LANGUAGES CXX VERSION ${Radium_VERSION}) option(RADIUM_QUIET "Disable Radium Log messages" OFF) -list(APPEND CMAKE_MESSAGE_INDENT "[${ra_core_target}] ") set(RA_VERSION_CPP "${CMAKE_CURRENT_BINARY_DIR}/Version.cpp") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Utils/Version.cpp.in" "${RA_VERSION_CPP}") @@ -76,3 +77,5 @@ set(RADIUM_COMPONENTS ${RADIUM_COMPONENTS} ${ra_core_target} PARENT_SCOPE) if(RADIUM_ENABLE_PCH) target_precompile_headers(${ra_core_target} PRIVATE pch.hpp) endif() + +message_prefix_pop() diff --git a/src/Core/Containers/Grid.hpp b/src/Core/Containers/Grid.hpp index e9bb79eb756..53b66a12616 100644 --- a/src/Core/Containers/Grid.hpp +++ b/src/Core/Containers/Grid.hpp @@ -164,16 +164,17 @@ class Grid }; public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - // // Constructors // /// Construct a grid of a given size and fill it with the given value. - Grid( const IdxVector& size = IdxVector::Zero(), const T& val = T() ); + Grid( const IdxVector& size = IdxVector::Zero(), const T& val = T() ) : + m_size( size ), m_data( size.prod(), val ) {} + /// Construct a grid of a given size with values in ()-major format - Grid( const IdxVector& size, const T* values ); + Grid( const IdxVector& size, const T* values ) : + m_size( size ), m_data( size.prod(), values ) {} /// Copy constructor and assignment operator. Grid( const Grid& other ) = default; @@ -265,18 +266,6 @@ inline uint idxVectorToLinear( const typename Grid::IdxVector& vecIdx, } } // namespace -// -// Constructors -// - -template -Grid::Grid( const typename Grid::IdxVector& size, const T& val ) : - m_size( size ), m_data( size.prod(), val ) {} - -template -Grid::Grid( const typename Grid::IdxVector& size, const T* values ) : - m_size( size ), m_data( size.prod(), values ) {} -// // Vector size and data management. // diff --git a/src/Core/Containers/Tex.hpp b/src/Core/Containers/Tex.hpp index 7d363d9f893..c1e09f30cc3 100644 --- a/src/Core/Containers/Tex.hpp +++ b/src/Core/Containers/Tex.hpp @@ -17,7 +17,6 @@ class Tex : public Grid { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW using IdxVector = typename Grid::IdxVector; using Vector = Eigen::Matrix; using AabbND = Eigen::AlignedBox; diff --git a/src/Core/Containers/VariableSet.hpp b/src/Core/Containers/VariableSet.hpp index 885470a8301..118d45cd99e 100644 --- a/src/Core/Containers/VariableSet.hpp +++ b/src/Core/Containers/VariableSet.hpp @@ -165,7 +165,9 @@ class RA_CORE_API VariableSet /// \pre The element \b name must exists with type \b T. If not verified (assert in debug mode) /// std::bad_any_cast exception could be thrown by the underlying management of type erasure template - auto getVariable( const std::string& name ) const -> T&; + auto getVariable( const std::string& name ) const -> const T&; + template + auto getVariable( const std::string& name ) -> T&; /// \brief get the handle on the variable with the given name /// \tparam T the type of the variable @@ -173,7 +175,7 @@ class RA_CORE_API VariableSet /// \return an handle which can be de-referenced to obtain a std::pair /// representing the name and the value of the variable. template - auto getVariableHandle( const std::string& name ) const -> VariableHandle; + auto getVariableHandle( const std::string& name ) const -> const VariableHandle; /// \brief Test the validity of a handle /// \tparam H Type of the handle. Expected to be VariableHandle for some variable type T @@ -186,7 +188,7 @@ class RA_CORE_API VariableSet /// \return a pair with the variable handle and a bool : true if the variable value was reset, /// false if the variable value was set. template - auto insertOrAssignVariable( const std::string& name, const T& value ) + auto setVariable( const std::string& name, const T& value ) -> std::pair, bool>; /// \brief Remove a variable, i.e. a name->value association @@ -613,13 +615,17 @@ auto VariableSet::insertVariable( const std::string& name, const T& value ) } template -auto VariableSet::getVariable( const std::string& name ) const -> T& { - assert( existsVariable( name ) ); +auto VariableSet::getVariable( const std::string& name ) -> T& { + return const_cast( const_cast( this )->getVariable( name ) ); +} + +template +auto VariableSet::getVariable( const std::string& name ) const -> const T& { return getVariableHandle( name )->second; } template -auto VariableSet::getVariableHandle( const std::string& name ) const -> VariableHandle { +auto VariableSet::getVariableHandle( const std::string& name ) const -> const VariableHandle { assert( existsVariableType() ); return getVariableStorage().find( name ); } @@ -631,12 +637,13 @@ bool VariableSet::isHandleValid( const H& handle ) const { } template -auto VariableSet::insertOrAssignVariable( const std::string& name, const T& value ) +auto VariableSet::setVariable( const std::string& name, const T& value ) -> std::pair, bool> { auto typeAccess = existsVariableType(); // If it is the first parameter of the given type, first register the type if ( !typeAccess ) { typeAccess = addVariableType(); } // insert the parameter. + return ( *typeAccess )->insert_or_assign( name, value ); } @@ -662,6 +669,7 @@ bool VariableSet::deleteVariable( H& handle ) { template auto VariableSet::existsVariable( const std::string& name ) const -> Utils::optional> { + if ( auto typeAccess = existsVariableType(); typeAccess ) { auto itr = ( *typeAccess )->find( name ); if ( itr != ( *typeAccess )->cend() ) { return itr; } @@ -719,11 +727,11 @@ auto VariableSet::addVariableType() -> Utils::optional*> { // used to visit the variableSet with a dynamic visitor m_vtable->m_visitFunctions.emplace_back( []( const VariableSet& c, const DynamicVisitorBase& v ) - -> std::pair> { + -> std::pair> { auto id = getVariableVisitTypeIndex(); if ( v.accept( id ) ) { - auto& storage = c.getVariableStorage(); - auto coll = std::ref( storage ); + auto& visitedStorage = c.getVariableStorage(); + auto coll = std::ref( visitedStorage ); return { true, [coll]( DynamicVisitorBase& visitor, std::any&& userParam ) { for ( auto&& t : coll.get() ) { visitor( { std::ref( t ) }, @@ -775,6 +783,8 @@ size_t VariableSet::numberOf() const { return 0; } +/* --------------- Visitors */ + template void VariableSet::visitDynamic( DynamicVisitorBase& visitor, P&& params ) const { for ( const auto& [type, index] : m_typeIndexToVtableIndex ) { @@ -799,7 +809,7 @@ void VariableSet::visitImplHelper( F& visitor ) const { "Static visitors must provide a function with profile " "void( const std::string& name, [const ]T[&] value) for each " "declared visitable type T" ); - if ( auto variables = existsVariableType(); variables ) { + if ( auto variables = existsVariableType() ) { for ( auto& element : *( variables.value() ) ) { visitor( element.first, element.second ); } diff --git a/src/Core/Containers/VariableSetEnumManagement.cpp b/src/Core/Containers/VariableSetEnumManagement.cpp new file mode 100644 index 00000000000..3434d7b0547 --- /dev/null +++ b/src/Core/Containers/VariableSetEnumManagement.cpp @@ -0,0 +1,24 @@ +#include + +namespace Ra { +namespace Core { +namespace VariableSetEnumManagement { + +void setEnumVariable( VariableSet& vs, const std::string& name, const std::string& value ) { + auto converterFunc = vs.existsVariable< + std::function>( name ); + if ( converterFunc ) { ( *converterFunc )->second( vs, name, value ); } + else { + LOG( Core::Utils::logWARNING ) << "VariableSet: try to set enum value from string without " + "converter, ignored. Variable name: [" + << name << "], value: [" << value << "]"; + } +} + +void setEnumVariable( VariableSet& vs, const std::string& name, const char* value ) { + setEnumVariable( vs, name, std::string( value ) ); +} + +} // namespace VariableSetEnumManagement +} // namespace Core +} // namespace Ra diff --git a/src/Core/Containers/VariableSetEnumManagement.hpp b/src/Core/Containers/VariableSetEnumManagement.hpp new file mode 100644 index 00000000000..6cfc49978da --- /dev/null +++ b/src/Core/Containers/VariableSetEnumManagement.hpp @@ -0,0 +1,135 @@ +#pragma once + +#include +#include + +#include + +/// hepler function to manage enum as underlying types in VariableSet +namespace Ra { +namespace Core { +namespace VariableSetEnumManagement { + +/** + * \brief Associate a converter for enumerated type to the given variable name + * \tparam EnumBaseType The enum base type to manage (\see Ra::Core::Utils::EnumConverter) + * \param name + * \param converter + */ +template +void addEnumConverter( VariableSet& vs, + const std::string& name, + std::shared_ptr> converter ); + +/** + * \brief Search for a converter associated with an enumeration variable + * \tparam EnumBaseType The enum base type to manage (\see Ra::Core::Utils::EnumConverter) + * \param name the name of the parameter + * \return an optional containing the converter or false if no converter is found. + */ +template +Core::Utils::optional>> +getEnumConverter( const VariableSet& vs, const std::string& name ); + +/** + * \brief Return the string associated to the actual value of an enumeration variable + * \tparam Enum The enum type (\see Ra::Core::Utils::EnumConverter) + * \param name The name of the enum variable + * \param value The value to convert + * \return + */ +template {}, bool>::type = true> +std::string getEnumString( const VariableSet& vs, const std::string& name, Enum value ); + +/** + * \brief (overload) Return the string associated to the actual value of a n enumeration + * variable, from a value with underlying_type. \tparam EnumBaseType The underlying enum + * type (\see Ra::Core::Utils::EnumConverter) \param name The name of the enum variable \param + * value The value to convert \return + */ +template +std::string +getEnumString( const VariableSet& vs, + const std::string& name, + EnumBaseType value, + typename std::enable_if {}, bool>::type = true ); + +/** + * \brief set the value of the given enumeration variable, according to a string representation + * of an enum. \note If there is no EnumConverter associated with the variable name, the string + * is registered in the RenderParameter set. \param name Name of the variable \param value value + * of the variable + */ +void RA_CORE_API setEnumVariable( VariableSet& vs, + const std::string& name, + const std::string& value ); + +void RA_CORE_API setEnumVariable( VariableSet& vs, const std::string& name, const char* value ); + +template +void setEnumVariable( VariableSet& vs, const std::string& name, T value ) { + auto v = static_cast::type>( value ); + vs.setVariable( name, v ); +} + +template +auto getEnumVariable( const VariableSet& vs, const std::string& name ) -> const T& { + static_assert( std::is_enum::value ); + return reinterpret_cast( + vs.getVariable::type>( name ) ); +} + +template +auto getEnumVariable( VariableSet& vs, const std::string& name ) -> T& { + return const_cast( getEnumVariable( const_cast( vs ), name ) ); +} + +template +void addEnumConverter( VariableSet& vs, + const std::string& name, + std::shared_ptr> converter ) { + + // typed converter + auto converterHandle = vs.setVariable( name, converter ); + + // string string converter/setter for setEnumVariable + std::function + convertingFunction = [converter_ = converterHandle.first]( Core::VariableSet& vs_, + const std::string& name_, + const std::string& value_ ) { + vs_.setVariable( name_, converter_->second->getEnumerator( value_ ) ); + }; + vs.setVariable( name, convertingFunction ); +} + +template +Core::Utils::optional>> +getEnumConverter( const VariableSet& vs, const std::string& name ) { + auto storedConverter = + vs.existsVariable>>( name ); + if ( storedConverter ) { return ( *storedConverter )->second; } + return {}; +} + +template +std::string getEnumString( const VariableSet& vs, + const std::string& name, + EnumBaseType value, + typename std::enable_if {}, bool>::type ) { + auto storedConverter = + vs.existsVariable>>( name ); + if ( storedConverter ) { return ( *storedConverter )->second->getEnumerator( value ); } + LOG( Ra::Core::Utils::logWARNING ) << name + " is not a registered Enum with underlying type " + + Ra::Core::Utils::demangleType() + "."; + return ""; +} + +template {}, bool>::type> +std::string getEnumString( const VariableSet& vs, const std::string& name, Enum value ) { + using EnumBaseType = typename std::underlying_type_t; + return getEnumString( vs, name, EnumBaseType( value ) ); +} + +} // namespace VariableSetEnumManagement +} // namespace Core +} // namespace Ra diff --git a/src/Core/Containers/VectorArray.hpp b/src/Core/Containers/VectorArray.hpp index 42da94d31b7..9b6f93c87c7 100644 --- a/src/Core/Containers/VectorArray.hpp +++ b/src/Core/Containers/VectorArray.hpp @@ -26,7 +26,7 @@ struct VectorArrayTypeHelper : public VectorArrayTypeHelperInternal< std::is_base_of, V>::value> {}; /** - * @brief This class implements ContainerIntrospectionInterface for AlignedStdVector. + * \brief This class implements ContainerIntrospectionInterface for AlignedStdVector. * * It provides Eigen::Map functionality if the underlying component allows it (i.e. fixed size). */ @@ -51,20 +51,20 @@ class VectorArray : public AlignedStdVector, public Utils::ContainerIntrospec /** Inheriting constructors from std::vector */ using AlignedStdVector::AlignedStdVector; - /** @name Container Introsection implementation */ - /// @{ + /** \name Container Introsection implementation */ + /// \{ size_t getSize() const override { return this->size(); } size_t getNumberOfComponents() const override { return std::max( 0, NumberOfComponents ); } size_t getBufferSize() const override { return getSize() * sizeof( V ); } int getStride() const override { return sizeof( V ); } const void* dataPtr() const override { return this->data(); } - /// @} + /// \} - /** @name Eigen::Map getter + /** \name Eigen::Map getter * Map data to an Eigen::Matrix, only defined when NumberOfComponents > 0 (e.g. for arithmetic * types and fixed size eigen vectors). */ - /// @{ + /// \{ /** Returns the array as an Eigen Matrix Map. */ template std::enable_if_t<( N > 0 ), MatrixMap> getMap() { @@ -82,7 +82,7 @@ class VectorArray : public AlignedStdVector, public Utils::ContainerIntrospec TypeHelper::NumberOfComponents, Eigen::Index( this->size() ) ); } - /// @} + /// \} }; template diff --git a/src/Core/Geometry/MeshPrimitives.cpp b/src/Core/Geometry/MeshPrimitives.cpp index 04dbe9eb249..7abe1940016 100644 --- a/src/Core/Geometry/MeshPrimitives.cpp +++ b/src/Core/Geometry/MeshPrimitives.cpp @@ -277,7 +277,7 @@ makeGeodesicSphere( Scalar radius, uint numSubdiv, const Utils::optional triVertices = { - vertices[tri[0]], vertices[tri[1]], vertices[tri[2]] }; + { vertices[tri[0]], vertices[tri[1]], vertices[tri[2]] } }; std::array middles; for ( uint v = 0; v < 3; ++v ) { diff --git a/src/Core/Geometry/OpenMesh.hpp b/src/Core/Geometry/OpenMesh.hpp index b76d9d2555c..1899069e9db 100644 --- a/src/Core/Geometry/OpenMesh.hpp +++ b/src/Core/Geometry/OpenMesh.hpp @@ -1,3 +1,4 @@ + #pragma once #include diff --git a/src/Core/Geometry/RayCast.cpp b/src/Core/Geometry/RayCast.cpp index 263205df7fc..38a393188c4 100644 --- a/src/Core/Geometry/RayCast.cpp +++ b/src/Core/Geometry/RayCast.cpp @@ -266,7 +266,7 @@ bool RayCastCylinder( const Ray& r, return true; } } // End if (distance between ray and cyl axis < radius) - } // End of else (ray not parallel to the cylinder. + } // End of else (ray not parallel to the cylinder. return false; } diff --git a/src/Core/Geometry/Spline.hpp b/src/Core/Geometry/Spline.hpp index ee31500b6c1..80529fa169c 100644 --- a/src/Core/Geometry/Spline.hpp +++ b/src/Core/Geometry/Spline.hpp @@ -11,13 +11,13 @@ namespace Ra { namespace Core { namespace Geometry { /** - * @class Spline + * \class Spline * - * @brief Handling spline curves of arbitrary dimensions - * @note This class use the efficient blossom algorithm to compute a position on + * \brief Handling spline curves of arbitrary dimensions + * \note This class use the efficient blossom algorithm to compute a position on * the curve. - * @tparam D : dimension of the curve. - * @tparam K :order of the curve (min 2) + * \tparam D : dimension of the curve. + * \tparam K :order of the curve (min 2) */ template class Spline @@ -32,7 +32,7 @@ class Spline public: /// Type of the nodal vector - /// @param type : nodal vector type (uniform, open_uniform) + /// \param type : nodal vector type (uniform, open_uniform) /// This will define the behavior of the spline with its control points /// as well as its speed according to its parameter. explicit inline Spline( Type type = OPEN_UNIFORM ); @@ -47,7 +47,7 @@ class Spline inline void setType( Type type ); /// Evaluate position of the spline - /// @param u : curve parameter ranging from [0; 1] + /// \param u : curve parameter ranging from [0; 1] inline Vector f( Scalar u ) const; /// Evaluate speed of the spline @@ -55,7 +55,7 @@ class Spline private: // ------------------------------------------------------------------------- - /// @name Class tools + /// \name Class tools // ------------------------------------------------------------------------- inline void assertSplines() const; @@ -71,14 +71,14 @@ class Spline inline void setNodeToOpenUniform(); /// Evaluate the equation of a splines using the blossom algorithm - /// @param u : the curve parameter which range from the values + /// \param u : the curve parameter which range from the values /// [node[k-1]; node[point.size()]] - /// @param point : the control points which size must be at least equal to + /// \param point : the control points which size must be at least equal to /// the order of the spline (point.size() >= k) - /// @param k : the spline order (degree == k-1) - /// @param node : the nodal vector which defines the speed of the spline + /// \param k : the spline order (degree == k-1) + /// \param node : the nodal vector which defines the speed of the spline /// parameter u. The nodal vector size must be equal to (k + point.size()) - /// @param off : offset to apply to the nodal vector 'node' before reading + /// \param off : offset to apply to the nodal vector 'node' before reading /// from it. this is useful to compute derivatives. static inline Vector eval( Scalar u, const Core::VectorArray& points, @@ -92,7 +92,7 @@ class Spline uint k ); // ------------------------------------------------------------------------- - /// @name attributes + /// \name attributes // ------------------------------------------------------------------------- Core::VectorArray m_points; ///< Control points diff --git a/src/Core/Geometry/TopologicalMesh.hpp b/src/Core/Geometry/TopologicalMesh.hpp index 4fe37635716..33a6209548e 100644 --- a/src/Core/Geometry/TopologicalMesh.hpp +++ b/src/Core/Geometry/TopologicalMesh.hpp @@ -63,7 +63,6 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT @@ -172,10 +171,10 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT version above + /// \todo when MultiIndexView will be operational, remove the IndexedGeometry version above template inline void copyAttribToWedgeData( const Ra::Core::Geometry::MultiIndexedGeometry& mesh, unsigned int vindex, const std::vector>& attrHandleVec, VectorArray* to ); - /// @todo when MultiIndexView will be operational, remove the IndexedGeometry version above + /// \todo when MultiIndexView will be operational, remove the IndexedGeometry version above inline void copyMeshToWedgeData( const Ra::Core::Geometry::MultiIndexedGeometry& mesh, unsigned int vindex, const std::vector>& wprop_float, diff --git a/src/Core/Geometry/TriangleMesh.hpp b/src/Core/Geometry/TriangleMesh.hpp index 24b1a4a4e01..add984e4d7c 100644 --- a/src/Core/Geometry/TriangleMesh.hpp +++ b/src/Core/Geometry/TriangleMesh.hpp @@ -25,8 +25,6 @@ namespace Geometry { class RA_CORE_API AttribArrayGeometry : public AbstractGeometry { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - using Point = Vector3; using Normal = Vector3; @@ -92,8 +90,8 @@ class RA_CORE_API AttribArrayGeometry : public AbstractGeometry template inline bool isValid( const Utils::AttribHandle& h ) const; - /// @name Wrappers to Utils::AttribManager. - /// @{ + /// \name Wrappers to Utils::AttribManager. + /// \{ /// \see Utils::AttribManager::getAttrib template @@ -120,13 +118,13 @@ class RA_CORE_API AttribArrayGeometry : public AbstractGeometry inline Utils::AttribBase* getAttribBase( const std::string& name ); /// \see Utils::AttribManager::getAttribBase inline const Utils::AttribBase* getAttribBase( const std::string& name ) const; - ///@} + ///\} /// Check if an attribute exists with the given name. /// \see AttribManager::contains for more info. inline bool hasAttrib( const std::string& name ) const; - ///@{ + ///\{ /// Add attribute with the given name. /// \see AttribManager::addAttrib() for more info. /// \param name: attrib name, uniquely identify the attrib @@ -149,7 +147,7 @@ class RA_CORE_API AttribArrayGeometry : public AbstractGeometry template inline Utils::AttribHandle addAttrib( const std::string& name, const typename Utils::Attrib::Container&& data ); - ///@} + ///\} /// Remove attribute by handle. /// \see AttribManager::removeAttrib() for more info. diff --git a/src/Core/Geometry/Volume.hpp b/src/Core/Geometry/Volume.hpp index 8ac3d2bb03a..9053e44717e 100644 --- a/src/Core/Geometry/Volume.hpp +++ b/src/Core/Geometry/Volume.hpp @@ -66,7 +66,7 @@ class RA_CORE_API AbstractVolume : public AbstractGeometry virtual Utils::optional getValue( Eigen::Ref p ) const = 0; /// \name Status queries - ///@{ + ///\{ /// Return true if the volume is parametric bool isParametric() const; /// Return true if the volume is discrete. Can be cast as AbstractDiscreteVolume @@ -75,7 +75,7 @@ class RA_CORE_API AbstractVolume : public AbstractGeometry bool isDense() const; /// Return true if the volume is sparse (implies #isDiscrete to be true) bool isSparse() const; - ///@} + ///\} /// Print info to the Debug output. Need to be extended by child classes void displayInfo() const; diff --git a/src/Core/Geometry/deprecated/TopologicalMesh.cpp b/src/Core/Geometry/deprecated/TopologicalMesh.cpp index 897612d415f..40be29bcbaf 100644 --- a/src/Core/Geometry/deprecated/TopologicalMesh.cpp +++ b/src/Core/Geometry/deprecated/TopologicalMesh.cpp @@ -90,8 +90,6 @@ TriangleMesh TopologicalMesh::toTriangleMesh() { HandleAndValueVector _vec3; HandleAndValueVector _vec4; - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - bool operator==( const VertexDataInternal& lhs ) const { return _vertex == lhs._vertex && _normal == lhs._normal && _float == lhs._float && _vec2 == lhs._vec2 && _vec3 == lhs._vec3 && _vec4 == lhs._vec4; diff --git a/src/Core/Geometry/deprecated/TopologicalMesh.hpp b/src/Core/Geometry/deprecated/TopologicalMesh.hpp index 22df3964b5c..3a9c14fd850 100644 --- a/src/Core/Geometry/deprecated/TopologicalMesh.hpp +++ b/src/Core/Geometry/deprecated/TopologicalMesh.hpp @@ -62,8 +62,6 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT>& getFloatPropsHandles() const; [[deprecated]] inline const std::vector>& @@ -165,13 +163,13 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT>& getVector4PropsHandles() const; - ///@} + ///\} /** * \name Dealing with normals * Utils to deal with normals when modifying the mesh topology. */ - ///@{ + ///\{ /** * Create a new property for normals on faces of \a mesh. @@ -207,13 +205,13 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT fProp ); - ///@} + ///\} /** * \name Dealing with custom properties * Utils to deal with custom properties of any type when modifying the mesh topology. */ - ///@{ + ///\{ /** * Create a new property for each \a input properties of \a mesh on faces. @@ -267,12 +265,12 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT>& hProps, const std::vector>& fProps ); - ///@} + ///\} /** * \name Deal with all attributes* Utils to deal with the normal and custom properties when modifying the mesh topology.*/ - ///@{ + ///\{ /** * Create a new property for each property of \a mesh on faces. @@ -334,12 +332,12 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT>& vec2Props, std::vector>& vec3Props, std::vector>& vec4Props ); - ///@} + ///\} /** * \name Topological operations */ - ///@{ + ///\{ /** * Apply a 2-4 edge split. * \param eh The handle to the edge to split. @@ -355,7 +353,7 @@ class RA_CORE_API TopologicalMesh : public OpenMesh::PolyMesh_ArrayKernelT diff --git a/src/Core/Math/DualQuaternion.hpp b/src/Core/Math/DualQuaternion.hpp index 27ce3f6e0ab..4b143596e8b 100644 --- a/src/Core/Math/DualQuaternion.hpp +++ b/src/Core/Math/DualQuaternion.hpp @@ -19,8 +19,6 @@ class DualQuaternion { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /// Construct an uninitialized dual quaternion. inline DualQuaternion() {} diff --git a/src/Core/Math/LinearAlgebra.hpp b/src/Core/Math/LinearAlgebra.hpp index 853212b3004..c2aa553a146 100644 --- a/src/Core/Math/LinearAlgebra.hpp +++ b/src/Core/Math/LinearAlgebra.hpp @@ -82,7 +82,7 @@ inline Scalar angle( const Vector_& v1, const Vector_& v2 ); template inline Vector_ slerp( const Vector_& v1, const Vector_& v2, Scalar t ); -/// @return the projection of point on the plane define by plane and planeNormal +/// \return the projection of point on the plane define by plane and planeNormal inline Vector3 projectOnPlane( const Vector3& planePos, const Vector3& planeNormal, const Vector3& point ); @@ -374,6 +374,33 @@ bool checkInvalidNumbers( Eigen::Ref matrix, const bool FAIL_ON_A return !invalid; } +/// \brief Returns True if two arrays are element-wise equal within a tolerance. + +/// The tolerance values are positive, typically very small numbers. The relative difference (\b +/// rtol * abs(\b b)) and the absolute difference \b atol are added together to compare against the +/// absolute difference between \b a and \b b. +/// +/// Parameters: +/// +/// \param a,b Input Matrix to compare +/// \param rtol The relative tolerance parameter (see Notes). +/// \param atol The absolute tolerance parameter (see Notes). +/// \see +/// https://stackoverflow.com/questions/15051367/how-to-compare-vectors-approximately-in-eigen, +/// https://numpy.org/doc/stable/reference/generated/numpy.allclose.html +template +bool allClose( const Eigen::DenseBase& a, + const Eigen::DenseBase& b, + const typename DerivedA::RealScalar& rtol = + Eigen::NumTraits::dummy_precision(), + const typename DerivedA::RealScalar& atol = + Eigen::NumTraits::epsilon() ) { + + return ( ( a.derived() - b.derived() ).array().abs() <= + ( atol + rtol * a.derived().array().abs().max( b.derived().array().abs() ) ) ) + .all(); +} + } // namespace Math } // namespace Core } // namespace Ra diff --git a/src/Core/Resources/Resources.hpp b/src/Core/Resources/Resources.hpp index 30346474f9a..346372907d1 100644 --- a/src/Core/Resources/Resources.hpp +++ b/src/Core/Resources/Resources.hpp @@ -25,7 +25,7 @@ using namespace Ra::Core::Utils; /** \name Resources path functions * All paths are made absolute using https://en.cppreference.com/w/cpp/filesystem/canonical */ -///@{ +///\{ /// \brief Get the path of Radium internal resources. /// /// Radium resources are located in the Resources directory, searched from Radium lib location. @@ -54,12 +54,12 @@ RA_CORE_API optional getBasePath(); RA_CORE_API optional getResourcesPath( void* symbol = nullptr, const std::string& pattern = "Resources" ); -///@} +///\} /** \name Data path functions * These functions manage a stack of paths so that applications, libraries or plugins could manage * paths to store their generated data in a state stack-based approach. */ -///@{ +///\{ /// \brief Get the current data path. /// /// If an application's data path was not pushed before the call of this function, the default @@ -79,7 +79,7 @@ RA_CORE_API void pushDataPath( std::string datapath ); /// for getDataPath(). /// \return the popped data path. RA_CORE_API std::string popDataPath(); -///@} +///\} } // namespace Resources } // namespace Core diff --git a/src/Core/Tasks/TaskQueue.cpp b/src/Core/Tasks/TaskQueue.cpp index 3c16b30249b..b238509d9b6 100644 --- a/src/Core/Tasks/TaskQueue.cpp +++ b/src/Core/Tasks/TaskQueue.cpp @@ -12,6 +12,7 @@ namespace Ra { namespace Core { TaskQueue::TaskQueue( uint numThreads ) : m_processingTasks( 0 ), m_shuttingDown( false ) { + wlock lock( m_mutex ); m_workerThreads.reserve( numThreads ); for ( uint i = 0; i < numThreads; ++i ) { m_workerThreads.emplace_back( &TaskQueue::runThread, this, i ); @@ -19,16 +20,18 @@ TaskQueue::TaskQueue( uint numThreads ) : m_processingTasks( 0 ), m_shuttingDown } TaskQueue::~TaskQueue() { + { + wlock lock( m_mutex ); + m_shuttingDown = true; + } flushTaskQueue(); - m_shuttingDown = true; - m_threadNotifier.notify_all(); for ( auto& t : m_workerThreads ) { t.join(); } } TaskQueue::TaskId TaskQueue::registerTask( std::unique_ptr task ) { - std::lock_guard lock( m_taskMutex ); + wlock lock( m_mutex ); TimerData tdata; // init tdata with task name before moving ownership tdata.taskName = task->getName(); @@ -51,7 +54,7 @@ void TaskQueue::removeTask( TaskId taskId ) { << m_tasks.size(); return; } - std::lock_guard lock( m_taskMutex ); + wlock lock( m_mutex ); // set task as dummy noop m_tasks[taskId] = std::make_unique( []() {}, m_timerData[taskId].taskName ); @@ -62,6 +65,7 @@ void TaskQueue::removeTask( TaskId taskId ) { } TaskQueue::TaskId TaskQueue::getTaskId( const std::string& taskName ) const { + rlock lock( m_mutex ); auto itr = std::find_if( m_tasks.begin(), m_tasks.end(), [taskName]( const auto& task ) { return task->getName() == taskName; } ); @@ -71,7 +75,7 @@ TaskQueue::TaskId TaskQueue::getTaskId( const std::string& taskName ) const { } void TaskQueue::addDependency( TaskQueue::TaskId predecessor, TaskQueue::TaskId successor ) { - std::lock_guard lock( m_taskMutex ); + wlock lock( m_mutex ); CORE_ASSERT( predecessor.isValid() && ( predecessor < m_tasks.size() ), "Invalid predecessor task" ); @@ -112,12 +116,12 @@ bool TaskQueue::addDependency( TaskQueue::TaskId predecessor, const std::string& void TaskQueue::addPendingDependency( const std::string& predecessors, TaskQueue::TaskId successor ) { - std::lock_guard lock( m_taskMutex ); + wlock lock( m_mutex ); m_pendingDepsSucc.emplace_back( predecessors, successor ); } void TaskQueue::addPendingDependency( TaskId predecessor, const std::string& successors ) { - std::lock_guard lock( m_taskMutex ); + wlock lock( m_mutex ); m_pendingDepsPre.emplace_back( predecessor, successors ); } @@ -134,9 +138,11 @@ void TaskQueue::resolveDependencies() { "Pending dependency unresolved : (" << pre.first << ") -> " << m_tasks[pre.second]->getName() ); } - std::lock_guard lock( m_taskMutex ); - m_pendingDepsPre.clear(); - m_pendingDepsSucc.clear(); + { + wlock lock( m_mutex ); + m_pendingDepsPre.clear(); + m_pendingDepsSucc.clear(); + } } // queueTask is always called with m_taskQueueMutex locked @@ -152,7 +158,7 @@ void TaskQueue::detectCycles() { // Do a depth-first search of the nodes. std::vector visited( m_tasks.size(), false ); std::stack pending; - + rlock lock( m_mutex ); for ( uint id = 0; id < m_tasks.size(); ++id ) { if ( m_dependencies[id].size() == 0 ) { pending.push( TaskId( id ) ); } } @@ -178,12 +184,14 @@ void TaskQueue::detectCycles() { void TaskQueue::startTasks() { using namespace Ra::Core::Utils; - if ( m_workerThreads.empty() ) { - LOG( logERROR ) << "TaskQueue as 0 threads, could not start tasks in parallel. Either " - "create a task queue with more threads, or use runTasksInThisThread"; - return; + { + rlock lock( m_mutex ); + if ( m_workerThreads.empty() ) { + LOG( logERROR ) << "TaskQueue as 0 threads, could not start tasks in parallel. Either " + "create a task queue with more threads, or use runTasksInThisThread"; + return; + } } - // Add pending dependencies. resolveDependencies(); @@ -191,61 +199,67 @@ void TaskQueue::startTasks() { detectCycles(); // Enqueue all tasks with no dependencies. - for ( uint t = 0; t < m_tasks.size(); ++t ) { - // only queue non null m_tasks - if ( m_tasks[t] && m_remainingDependencies[t] == 0 ) { queueTask( TaskId { t } ); } - } + { + wlock lock( m_mutex ); + for ( uint t = 0; t < m_tasks.size(); ++t ) { + // only queue non null m_tasks + if ( m_tasks[t] && m_remainingDependencies[t] == 0 ) { queueTask( TaskId { t } ); } + } + } // Wake up all threads. m_threadNotifier.notify_all(); } void TaskQueue::runTasksInThisThread() { + // this method should not be called between startTasks/waitForTasks, we do not lock anything + // here. - // lock task queue so no other worker can start working while this thread do the job. - std::lock_guard lock( m_taskQueueMutex ); + // use local task queue, preventing workers to pickup jobs. + std::deque taskQueue; // Add pending dependencies. resolveDependencies(); // Do a debug check detectCycles(); - - // Enqueue all tasks with no dependencies. - for ( uint t = 0; t < m_tasks.size(); ++t ) { - // only queue non null m_tasks - if ( m_tasks[t] && m_remainingDependencies[t] == 0 ) { queueTask( TaskId { t } ); } + { + // Enqueue all tasks with no dependencies. + for ( uint t = 0; t < m_tasks.size(); ++t ) { + // only queue non null m_tasks + if ( m_tasks[t] && m_remainingDependencies[t] == 0 ) { + taskQueue.push_front( TaskId { t } ); + } + } } - while ( !m_taskQueue.empty() ) { - TaskId task { m_taskQueue.back() }; - m_taskQueue.pop_back(); + { + while ( !taskQueue.empty() ) { + TaskId task; + { + task = taskQueue.back(); + taskQueue.pop_back(); + } + // Run task + m_timerData[task].start = Utils::Clock::now(); + m_timerData[task].threadId = 0; + m_tasks[task]->process(); + m_timerData[task].end = Utils::Clock::now(); - // Run task - m_timerData[task].start = Utils::Clock::now(); - m_timerData[task].threadId = 0; - m_tasks[task]->process(); - m_timerData[task].end = Utils::Clock::now(); - - for ( auto t : m_dependencies[task] ) { - uint& nDepends = m_remainingDependencies[t]; - CORE_ASSERT( nDepends > 0, "Inconsistency in dependencies" ); - --nDepends; - if ( nDepends == 0 ) { queueTask( t ); } + for ( auto t : m_dependencies[task] ) { + uint& nDepends = m_remainingDependencies[t]; + CORE_ASSERT( nDepends > 0, "Inconsistency in dependencies" ); + --nDepends; + if ( nDepends == 0 ) { taskQueue.push_front( TaskId { t } ); } + } } } flushTaskQueue(); } void TaskQueue::waitForTasks() { - bool isFinished = false; - while ( !isFinished ) { - // TODO : use a notifier for task queue empty. - { - std::lock_guard lock( m_taskQueueMutex ); - isFinished = ( m_taskQueue.empty() && m_processingTasks == 0 ); - } - if ( !isFinished ) { std::this_thread::yield(); } - } + rlock lock( m_mutex ); + m_waitForTasksNotifier.wait( + lock, [this]() { return ( m_taskQueue.empty() && m_processingTasks == 0 ); } ); } const std::vector& TaskQueue::getTimerData() { @@ -253,7 +267,8 @@ const std::vector& TaskQueue::getTimerData() { } void TaskQueue::flushTaskQueue() { - std::lock_guard lock( m_taskMutex ); + m_threadNotifier.notify_all(); + wlock lock( m_mutex ); CORE_ASSERT( m_processingTasks == 0, "You have tasks still in process" ); CORE_ASSERT( m_taskQueue.empty(), " You have unprocessed tasks " ); @@ -270,8 +285,7 @@ void TaskQueue::runThread( uint id ) { // Acquire mutex. { - std::unique_lock lock( m_taskQueueMutex ); - + wlock lock( m_mutex ); // Wait for a new task m_threadNotifier.wait( lock, [this]() { return m_shuttingDown || !m_taskQueue.empty(); } ); @@ -288,15 +302,22 @@ void TaskQueue::runThread( uint id ) { // Release mutex. // Run task - m_timerData[task].start = Utils::Clock::now(); - m_timerData[task].threadId = id; - m_tasks[task]->process(); - m_timerData[task].end = Utils::Clock::now(); - + { + { + rlock lock( m_mutex ); + m_timerData[task].start = Utils::Clock::now(); + m_timerData[task].threadId = id; + } + m_tasks[task]->process(); + { + rlock lock( m_mutex ); + m_timerData[task].end = Utils::Clock::now(); + } + } // Critical section : mark task as finished and en-queue dependencies. uint newTasks = 0; { - std::unique_lock lock( m_taskQueueMutex ); + wlock lock( m_mutex ); for ( auto t : m_dependencies[task] ) { uint& nDepends = m_remainingDependencies[t]; CORE_ASSERT( nDepends > 0, "Inconsistency in dependencies" ); @@ -305,12 +326,12 @@ void TaskQueue::runThread( uint id ) { queueTask( t ); ++newTasks; } - // TODO :Easy optimization : grab one of the new task and process it immediately. } --m_processingTasks; + if ( m_processingTasks == 0 ) { m_waitForTasksNotifier.notify_one(); } } - // If we added new tasks, we wake up one thread to execute it. - if ( newTasks > 0 ) { m_threadNotifier.notify_one(); } + // If we added new tasks, we wake up threads to execute thems. + if ( newTasks > 0 ) { m_threadNotifier.notify_all(); } } // End of while(true) } diff --git a/src/Core/Tasks/TaskQueue.hpp b/src/Core/Tasks/TaskQueue.hpp index e2b59752035..35ca114a0e2 100644 --- a/src/Core/Tasks/TaskQueue.hpp +++ b/src/Core/Tasks/TaskQueue.hpp @@ -4,10 +4,12 @@ #include #include // Ra::Core::TimePoint +#include #include #include #include #include +#include #include #include #include @@ -20,13 +22,27 @@ class Task; namespace Ra { namespace Core { -/** This class allows tasks to be registered and then executed in parallel on separate threads. - * it maintains an internal pool of threads. When instructed, it dispatches the tasks to the +/** \brief This class allows tasks to be registered and then executed in parallel on separate + * threads. + * + * It maintains an internal pool of threads. When instructed, it dispatches the tasks to the * pooled threads. * Task are allowed to have dependencies. A task will be executed only when all its dependencies * are satisfied, i.e. all dependant tasks are finished. * Note that most functions are not thread safe and must not be called when the task queue is * running. + * Typical usage: +\code + TaskQueue taskQueue( 4 ); + auto task = std::make_unique( ... ); + auto tid = taskQueue.registerTask( std::move( task ) ); + // [...] + taskQueue.addDependency( tid, ... ); + // [...] + taskQueue.startTasks(); + taskQueue.waitForTasks(); + taskQueue.flushTaskQueue(); +\endcode */ class RA_CORE_API TaskQueue { @@ -84,7 +100,7 @@ class RA_CORE_API TaskQueue // Task queue operations // - /// Launches the execution of all the threads in the task queue. + /// Launches the execution of all the tasks in the task queue. /// No more tasks should be added at this point. void startTasks(); @@ -92,6 +108,8 @@ class RA_CORE_API TaskQueue /// Return when all tasks are done. Usefull for instance for opengl related tasks that must run /// in the context thread. /// Once tasks are all processed, this method call flushTasksQueue. + /// \warning use either this method, either a startTasks/waitForTasks. calling + /// runTasksInThisThead between startTasks/waitForTasks calls may produce unexpected results. void runTasksInThisThread(); /// Blocks until all tasks and dependencies are finished. @@ -122,8 +140,18 @@ class RA_CORE_API TaskQueue void resolveDependencies(); private: + /// write lock, only one at a time + using wlock = std::unique_lock; + /// read lock, multiple lock allowed + using rlock = std::shared_lock; + /// Threads working on tasks. std::vector m_workerThreads; + + // + // mutex protected variables. + // + /// Storage for the tasks (task will be deleted after flushQueue()). std::vector> m_tasks; /// For each task, stores which tasks depend on it. @@ -136,10 +164,6 @@ class RA_CORE_API TaskQueue /// Stores the timings of each frame after execution. std::vector m_timerData; - // - // mutex protected variables. - // - /// Number of tasks each task is waiting on. std::vector m_remainingDependencies; /// Queue holding the pending tasks. @@ -148,14 +172,13 @@ class RA_CORE_API TaskQueue uint m_processingTasks; /// Flag to signal threads to quit. - bool m_shuttingDown; + std::atomic_bool m_shuttingDown; /// Variable on which threads wait for new tasks. - std::condition_variable m_threadNotifier; - /// Global mutex over thread-sensitive variables. - std::mutex m_taskQueueMutex; - /// Mutex for task registration (m_tasks, m_dependencies, m_timerData ...), if tasks are - /// registered from multiple threads - std::mutex m_taskMutex; + std::condition_variable_any m_threadNotifier; + std::condition_variable_any m_waitForTasksNotifier; + + /// mutex for protected variable + mutable std::shared_mutex m_mutex; }; } // namespace Core diff --git a/src/Core/Types.hpp b/src/Core/Types.hpp index aa93d01380e..0099e2a5b5a 100644 --- a/src/Core/Types.hpp +++ b/src/Core/Types.hpp @@ -9,12 +9,15 @@ #include #include +/// Radium Namespaces prefix namespace Ra { + +/// This namespace contains everything "low level", related to data, datastuctures, and computation. namespace Core { -/// @name +/// \name /// Common vector types -/// @{ +/// \{ using VectorN = Eigen::Matrix; using VectorNf = Eigen::VectorXf; using VectorNd = Eigen::VectorXd; @@ -41,19 +44,19 @@ using Vector1ui = Eigen::Matrix; using Vector2ui = Eigen::Matrix; using Vector3ui = Eigen::Matrix; using Vector4ui = Eigen::Matrix; -/// @} +/// \} -/// @name +/// \name /// Ray types -/// @{ +/// \{ using Ray = Eigen::ParametrizedLine; using Rayf = Eigen::ParametrizedLine; using Rayd = Eigen::ParametrizedLine; -/// @} +/// \} -/// @name +/// \name /// Common matrix types -/// @{ +/// \{ using MatrixN = Eigen::Matrix; using Matrix4 = Eigen::Matrix; using Matrix3 = Eigen::Matrix; @@ -76,11 +79,11 @@ using Diagonal = Eigen::SparseMatrix; // Not optimized for Diagonal matrices, but the operations between // Sparse and Diagonal are not defined using Sparse = Eigen::SparseMatrix; -/// @} +/// \} -/// @name +/// \name /// Transforms and rotations -/// @{ +/// \{ using Quaternion = Eigen::Quaternion; using Quaternionf = Eigen::Quaternionf; using Quaterniond = Eigen::Quaterniond; @@ -100,7 +103,7 @@ using AngleAxisd = Eigen::AngleAxisd; using Translation = Eigen::Translation; using Translationf = Eigen::Translation3f; using Translationd = Eigen::Translation3d; -/// @} +/// \} } // namespace Core } // namespace Ra diff --git a/src/Core/Utils/Attribs.hpp b/src/Core/Utils/Attribs.hpp index f6df9f23973..17e0f1c28b3 100644 --- a/src/Core/Utils/Attribs.hpp +++ b/src/Core/Utils/Attribs.hpp @@ -104,20 +104,20 @@ class Attrib : public AttribBase /// lock the content, when done call unlock() inline Container& getDataWithLock(); - /// @{ + /// \{ /// ContainerIntrosectionInterface implementation size_t getSize() const override; size_t getNumberOfComponents() const override; int getStride() const override; size_t getBufferSize() const override; const void* dataPtr() const override; - /// @} + /// \} - ///@{ + ///\{ /// setAttribData, attrib mustn't be locked (it's asserted). void setData( const Container& data ); void setData( Container&& data ); - ///@} + ///\} /// Read-only acccess to the attribute content. inline const Container& data() const; @@ -280,12 +280,11 @@ class RA_CORE_API AttribManager : public Observable * \brief Unlock the handle data * \tparam T * \param h - * \return */ template void unlock( const AttribHandle& h ); - ///@{ + ///\{ /// Get attribute by handle. /// \complexity \f$ O(1) \f$ /// \warning There is no check on the handle validity. Attrib is statically cast to T without @@ -299,9 +298,9 @@ class RA_CORE_API AttribManager : public Observable inline Attrib* getAttribPtr( const AttribHandle& h ); template inline const Attrib* getAttribPtr( const AttribHandle& h ) const; - ///@} + ///\} - ///@{ + ///\{ /// Get attribute by name. /// First search name to index correpondance \complexity \f$ O(getNumAttribs()) \f$ /// \warning There is no check on the name validity. Attrib is statically cast to T without @@ -310,9 +309,9 @@ class RA_CORE_API AttribManager : public Observable inline Attrib& getAttrib( const std::string& name ); template inline const Attrib& getAttrib( const std::string& name ) const; - ///@} + ///\} - ///@{ + ///\{ /// Return a AttribBase ptr to the attrib identified by name. /// to give access to AttribBase method, regardless of the type of element /// stored in the attrib. @@ -320,9 +319,9 @@ class RA_CORE_API AttribManager : public Observable inline const AttribBase* getAttribBase( const std::string& name ) const; inline AttribBase* getAttribBase( const Index& idx ); inline const AttribBase* getAttribBase( const Index& idx ) const; - ///@} + ///\} - ///@{ + ///\{ /// Set the data of the attrib h. /// \warning \p h has to be a valid attrib handle, this is not checked. template @@ -332,7 +331,7 @@ class RA_CORE_API AttribManager : public Observable /// \see #setAttrib template inline void setAttrib( const AttribHandle& h, typename AttribHandle::Container&& data ); - ///@} + ///\} /// Add attribute by name. /// notify(name) is called to trigger the observers @@ -354,7 +353,7 @@ class RA_CORE_API AttribManager : public Observable /// \warning There is no check on the attribute type nor data. bool hasSameAttribs( const AttribManager& other ); - ///@{ + ///\{ /// Perform \p fun on each attribute. // This is needed by the user to avoid caring about removed attributes (nullptr) // \todo reimplement as range for @@ -364,7 +363,7 @@ class RA_CORE_API AttribManager : public Observable // \todo keep non const version private template void for_each_attrib( const F& func ); - ///@} + ///\} /// Return the number of attributes inline int getNumAttribs() const; @@ -454,7 +453,7 @@ void AttribBase::setName( const std::string& name ) { m_name = name; } -bool inline AttribBase::operator==( const AttribBase& rhs ) { +bool inline AttribBase::operator==( const AttribBase & rhs ) { return m_name == rhs.getName(); } diff --git a/src/Core/Utils/Chronometer.hpp b/src/Core/Utils/Chronometer.hpp index 230253d5d26..61a2a254b8d 100644 --- a/src/Core/Utils/Chronometer.hpp +++ b/src/Core/Utils/Chronometer.hpp @@ -7,7 +7,7 @@ namespace Core { namespace Utils { /**! - * @brief The Chrono class represents a chronometer for timing generic functions + * \brief The Chrono class represents a chronometer for timing generic functions * in an easy way. * * Example: diff --git a/src/Core/Utils/EnumConverter.hpp b/src/Core/Utils/EnumConverter.hpp index fab7e58d9d6..568f10dd108 100644 --- a/src/Core/Utils/EnumConverter.hpp +++ b/src/Core/Utils/EnumConverter.hpp @@ -1,10 +1,12 @@ #pragma once -#include -#include +#include #include +#include +#include + namespace Ra { namespace Core { namespace Utils { @@ -17,9 +19,14 @@ namespace Utils { * of the enumeration to manage. * */ + template class EnumConverter { + /// \todo think of manage both EnumType and EnumUnderlyingType + /// Eg using EnumUnderlyingType = std::underling_type_t; + /// getEnumeratorUnderlying ->EnumUnderlyingType + /// getEnumerator -> Enum public: explicit EnumConverter( std::initializer_list> pairs ); diff --git a/src/Core/Utils/Index.hpp b/src/Core/Utils/Index.hpp index d47ba4d31aa..df3c0ef5984 100644 --- a/src/Core/Utils/Index.hpp +++ b/src/Core/Utils/Index.hpp @@ -32,6 +32,8 @@ class RA_CORE_API Index /// INVALID constexpr bool isInvalid() const; constexpr void setInvalid(); + + /// \brief return an invalid Index static constexpr Index Invalid(); static constexpr Index Max(); diff --git a/src/Core/Utils/Singleton.hpp b/src/Core/Utils/Singleton.hpp index ff06d411e90..f137092e364 100644 --- a/src/Core/Utils/Singleton.hpp +++ b/src/Core/Utils/Singleton.hpp @@ -23,7 +23,9 @@ TYPE( const TYPE& ) = delete; \ void operator=( const TYPE& ) = delete; \ struct Deleter { \ - void operator()( TYPE* p ) const { delete p; } \ + void operator()( TYPE* p ) const { \ + delete p; \ + } \ }; \ static std::unique_ptr s_instance; \ \ @@ -33,8 +35,12 @@ s_instance = std::unique_ptr( new TYPE( args... ), Deleter() ); \ return getInstance(); \ } \ - inline static TYPE* getInstance() { return s_instance.get(); } \ - inline static void destroyInstance() { s_instance.reset( nullptr ); } + inline static TYPE* getInstance() { \ + return s_instance.get(); \ + } \ + inline static void destroyInstance() { \ + s_instance.reset( nullptr ); \ + } /// Add this macro in the singleton cpp, followed by a semicolon. // Limitations : TYPE cannot be a nested type diff --git a/src/Core/Utils/TypesUtils.cpp b/src/Core/Utils/TypesUtils.cpp new file mode 100644 index 00000000000..51701cd44f1 --- /dev/null +++ b/src/Core/Utils/TypesUtils.cpp @@ -0,0 +1,48 @@ +#include + +#include + +#include + +namespace Ra { +namespace Core { +namespace Utils { +namespace TypeInternal { + +RA_CORE_API auto makeTypeReadable( const std::string& fullType ) -> std::string { + static std::map knownTypes { + { "std::", "" }, + { "__cxx11::", "" }, + { ", std::allocator", "" }, + { ", std::allocator", "" }, + { ", std::allocator", "" }, + { ", std::allocator", "" }, + { "Ra::Core::VectorArray", "RaVector" }, + { "Ra::Core::Utils::ColorBase", "Color" }, + { "Ra::Core::Utils::ColorBase", "Color" }, + { "Eigen::Matrix", "Vector2" }, + { "Eigen::Matrix", "Vector2d" }, + { "Eigen::Matrix", "Vector2i" }, + { "Eigen::Matrix", "Vector2ui" }, + { "Eigen::Matrix", "Vector3" }, + { "Eigen::Matrix", "Vector3d" }, + { "Eigen::Matrix", "Vector3i" }, + { "Eigen::Matrix", "Vector3ui" }, + { "Eigen::Matrix", "Vector4" }, + { "Eigen::Matrix", "Vector4d" }, + { "Eigen::Matrix", "Vector4i" }, + { "Eigen::Matrix", "Vector4ui" }, + // Windows (visual studio 2022) specific name fix + { " __ptr64", "" } }; + + auto processedType = fullType; + for ( const auto& [key, value] : knownTypes ) { + Ra::Core::Utils::replaceAllInString( processedType, key, value ); + } + return processedType; +} + +} // namespace TypeInternal +} // namespace Utils +} // namespace Core +} // namespace Ra diff --git a/src/Core/Utils/TypesUtils.hpp b/src/Core/Utils/TypesUtils.hpp index ac3d962d9e3..d65f2020cc6 100644 --- a/src/Core/Utils/TypesUtils.hpp +++ b/src/Core/Utils/TypesUtils.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #ifndef _WIN32 # include @@ -10,8 +11,7 @@ #endif #include - -#include +#include namespace Ra { namespace Core { @@ -19,11 +19,81 @@ namespace Utils { /// Return the human readable version of the type name T template -const char* demangleType() noexcept; +std::string demangleType() noexcept; /// Return the human readable version of the given object's type template -const char* demangleType( const T& ) noexcept; +std::string demangleType( const T& ) noexcept; + +/// Return the human readable version of the given type name +std::string demangleType( const std::type_index& typeIndex ) noexcept; + +/// \brief Return the human readable version of the type name T with simplified radium type names +template +auto simplifiedDemangledType() noexcept -> std::string; + +/// \brief Return the human readable version of the type name T with simplified radium type names +template +auto simplifiedDemangledType( const T& ) noexcept -> std::string; + +/// \brief Return the human readable version of the type name whose index is known, with simplified +/// radium type names +/// \param typeName The typeIndex whose simplified named is requested +/// \return The Radium-simplified type name +// RA_CORE_API auto simplifiedDemangledType( const std::type_index& typeName ) noexcept -> +// std::string; + +// ----------------------------------------------------------------- +// ---------------------- inline methods --------------------------- + +namespace TypeInternal { +RA_CORE_API auto makeTypeReadable( const std::string& ) -> std::string; +} + +template +auto simplifiedDemangledType() noexcept -> std::string { + static auto demangled_name = []() { + std::string demangledType = + TypeInternal::makeTypeReadable( Ra::Core::Utils::demangleType() ); + return demangledType; + }(); + return demangled_name; +} + +template +auto simplifiedDemangledType( const T& ) noexcept -> std::string { + return simplifiedDemangledType(); +} + +inline auto simplifiedDemangledType( const std::type_index& typeName ) noexcept -> std::string { + return TypeInternal::makeTypeReadable( Ra::Core::Utils::demangleType( typeName ) ); +} + +// Check if a type is a container with access to its element type and number +// adapted from https://stackoverflow.com/questions/13830158/check-if-a-variable-type-is-iterable +namespace detail { + +using std::begin; +using std::end; + +template +auto is_container_impl( int ) + -> decltype( begin( std::declval() ) != + end( std::declval() ), // begin/end and operator != + void(), // Handle evil operator , + std::declval().empty(), + std::declval().size(), + ++std::declval() ) )&>(), // operator ++ + void( *begin( std::declval() ) ), // operator* + std::true_type {} ); + +template +std::false_type is_container_impl( ... ); + +} // namespace detail + +template +using is_container = decltype( detail::is_container_impl( 0 ) ); // TypeList taken and adapted from // https://github.com/AcademySoftwareFoundation/openvdb/blob/master/openvdb/openvdb/TypeList.h @@ -35,26 +105,26 @@ struct TypeList; namespace TypeListInternal { -/// \brief Append any number of types to a @c TypeList -/// \details Defines a new @c TypeList with the provided types appended -/// \tparam ListT The @c TypeList to append to +/// \brief Append any number of types to a \c TypeList +/// \details Defines a new \c TypeList with the provided types appended +/// \tparam ListT The \c TypeList to append to /// \tparam Ts Types to append template struct TSAppendImpl; -/// \brief Partial specialization for a @c TypeList with a list of zero or more +/// \brief Partial specialization for a \c TypeList with a list of zero or more /// types to append -/// \tparam Ts Current types within the @c TypeList +/// \tparam Ts Current types within the \c TypeList /// \tparam OtherTs Other types to append template struct TSAppendImpl, OtherTs...> { using type = TypeList; }; -/// \brief Partial specialization for a @c TypeList with another @c TypeList. +/// \brief Partial specialization for a \c TypeList with another \c TypeList. /// Appends the other TypeList's members. -/// \tparam Ts Types within the first @c TypeList -/// \tparam OtherTs Types within the second @c TypeList +/// \tparam Ts Types within the first \c TypeList +/// \tparam OtherTs Types within the second \c TypeList template struct TSAppendImpl, TypeList> { using type = TypeList; @@ -89,55 +159,49 @@ struct TypeList { }; #ifdef _WIN32 -// On windows (since MSVC 2019), typeid( T ).name() returns the demangled name -template -const char* demangleType() noexcept { - static auto demangled_name = []() { - std::string retval { typeid( T ).name() }; - removeAllInString( retval, "class " ); - removeAllInString( retval, "struct " ); - replaceAllInString( retval, ",", ", " ); - replaceAllInString( retval, "> >", ">>" ); - return retval; - }(); - - return demangled_name.data(); +// On windows (since MSVC 2019), typeid( T ).name() (and then typeIndex.name() returns the demangled +// name +inline std::string demangleType( const std::type_index& typeIndex ) noexcept { + std::string retval = typeIndex.name(); + removeAllInString( retval, "class " ); + removeAllInString( retval, "struct " ); + removeAllInString( retval, "__cdecl" ); + replaceAllInString( retval, "& __ptr64", "&" ); + replaceAllInString( retval, ",", ", " ); + replaceAllInString( retval, " >", ">" ); + replaceAllInString( retval, "__int64", "long" ); + replaceAllInString( retval, "const &", "const&" ); + return retval; } #else +// On Linux/macos, use the C++ ABI demangler +inline std::string demangleType( const std::type_index& typeIndex ) noexcept { + int error = 0; + std::string retval; + char* name = abi::__cxa_demangle( typeIndex.name(), 0, 0, &error ); + if ( error == 0 ) { retval = name; } + else { + // error : -1 --> memory allocation failed + // error : -2 --> not a valid mangled name + // error : other --> __cxa_demangle + retval = std::string( "Type demangler error : " ) + std::to_string( error ); + } + std::free( name ); + removeAllInString( retval, "__1::" ); // or "::__1" ? + replaceAllInString( retval, " >", ">" ); + return retval; +} +#endif template -const char* demangleType() noexcept { +std::string demangleType() noexcept { // once per one type - static auto demangled_name = []() { - int error = 0; - std::string retval; - char* name = abi::__cxa_demangle( typeid( T ).name(), 0, 0, &error ); - - switch ( error ) { - case 0: - retval = name; - break; - case -1: - retval = "memory allocation failed"; - break; - case -2: - retval = "not a valid mangled name"; - break; - default: - retval = "__cxa_demangle failed"; - break; - } - std::free( name ); - removeAllInString( retval, "__1::" ); // or "::__1" ? - replaceAllInString( retval, "> >", ">>" ); - return retval; - }(); - - return demangled_name.data(); + static auto demangled_name = demangleType( std::type_index( typeid( T ) ) ); + return demangled_name; } -#endif + // calling with instances template -const char* demangleType( const T& ) noexcept { +std::string demangleType( const T& ) noexcept { return demangleType(); } diff --git a/src/Core/filelist.cmake b/src/Core/filelist.cmake index 7aabbe1b640..d49c9e41f46 100644 --- a/src/Core/filelist.cmake +++ b/src/Core/filelist.cmake @@ -25,6 +25,7 @@ set(core_sources Asset/MaterialData.cpp Containers/AdjacencyList.cpp Containers/VariableSet.cpp + Containers/VariableSetEnumManagement.cpp Geometry/CatmullClarkSubdivider.cpp Geometry/IndexedGeometry.cpp Geometry/LoopSubdivider.cpp @@ -42,6 +43,7 @@ set(core_sources Utils/Color.cpp Utils/StackTrace.cpp Utils/StringUtils.cpp + Utils/TypesUtils.cpp ) set(core_headers @@ -82,6 +84,7 @@ set(core_headers Containers/MakeShared.hpp Containers/Tex.hpp Containers/VariableSet.hpp + Containers/VariableSetEnumManagement.hpp Containers/VectorArray.hpp CoreMacros.hpp Geometry/AbstractGeometry.hpp diff --git a/src/Engine/CMakeLists.txt b/src/Engine/CMakeLists.txt index 3838baf388a..2eaff1e5600 100644 --- a/src/Engine/CMakeLists.txt +++ b/src/Engine/CMakeLists.txt @@ -1,5 +1,6 @@ set(ra_engine_target Engine) -list(APPEND CMAKE_MESSAGE_INDENT "[${ra_engine_target}] ") + +message_prefix_push("${ra_engine_target}") project(${ra_engine_target} LANGUAGES CXX VERSION ${Radium_VERSION}) @@ -67,3 +68,5 @@ target_compile_options(${ra_engine_target} PRIVATE PUBLIC ${DEFAULT_COMPILE_OPTI if(RADIUM_ENABLE_PCH) target_precompile_headers(${ra_engine_target} PRIVATE pch.hpp) endif() + +message_prefix_pop() diff --git a/src/Engine/Data/BlinnPhongMaterial.cpp b/src/Engine/Data/BlinnPhongMaterial.cpp index c430379064f..0d1f9cb76ab 100644 --- a/src/Engine/Data/BlinnPhongMaterial.cpp +++ b/src/Engine/Data/BlinnPhongMaterial.cpp @@ -19,65 +19,47 @@ nlohmann::json BlinnPhongMaterial::s_parametersMetadata = {}; BlinnPhongMaterial::BlinnPhongMaterial( const std::string& instanceName ) : Material( instanceName, materialName, Material::MaterialAspect::MAT_OPAQUE ) {} -BlinnPhongMaterial::~BlinnPhongMaterial() { - m_textures.clear(); -} - void BlinnPhongMaterial::updateRenderingParameters() { // update the rendering parameters auto& renderParameters = getParameters(); - renderParameters.addParameter( "material.kd", m_kd ); - renderParameters.addParameter( "material.hasPerVertexKd", m_perVertexColor ); - renderParameters.addParameter( "material.renderAsSplat", m_renderAsSplat ); - renderParameters.addParameter( "material.ks", m_ks ); - renderParameters.addParameter( "material.ns", m_ns ); - renderParameters.addParameter( "material.alpha", std::min( m_alpha, m_kd[3] ) ); + renderParameters.setVariable( "material.kd", m_kd ); + renderParameters.setVariable( "material.hasPerVertexKd", m_perVertexColor ); + renderParameters.setVariable( "material.renderAsSplat", m_renderAsSplat ); + renderParameters.setVariable( "material.ks", m_ks ); + renderParameters.setVariable( "material.ns", m_ns ); + renderParameters.setVariable( "material.alpha", std::min( m_alpha, m_kd[3] ) ); Texture* tex = getTexture( BlinnPhongMaterial::TextureSemantic::TEX_DIFFUSE ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.kd", tex ); } - renderParameters.addParameter( "material.tex.hasKd", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.kd", tex ); } + renderParameters.setVariable( "material.tex.hasKd", tex != nullptr ); tex = getTexture( BlinnPhongMaterial::TextureSemantic::TEX_SPECULAR ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.ks", tex ); } - renderParameters.addParameter( "material.tex.hasKs", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.ks", tex ); } + renderParameters.setVariable( "material.tex.hasKs", tex != nullptr ); tex = getTexture( BlinnPhongMaterial::TextureSemantic::TEX_NORMAL ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.normal", tex ); } - renderParameters.addParameter( "material.tex.hasNormal", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.normal", tex ); } + renderParameters.setVariable( "material.tex.hasNormal", tex != nullptr ); tex = getTexture( BlinnPhongMaterial::TextureSemantic::TEX_SHININESS ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.ns", tex ); } - renderParameters.addParameter( "material.tex.hasNs", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.ns", tex ); } + renderParameters.setVariable( "material.tex.hasNs", tex != nullptr ); tex = getTexture( BlinnPhongMaterial::TextureSemantic::TEX_ALPHA ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.alpha", tex ); } - renderParameters.addParameter( "material.tex.hasAlpha", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.alpha", tex ); } + renderParameters.setVariable( "material.tex.hasAlpha", tex != nullptr ); } void BlinnPhongMaterial::updateGL() { - if ( !m_isDirty ) { return; } - - // Load textures - auto texManager = RadiumEngine::getInstance()->getTextureManager(); - for ( const auto& tex : m_pendingTextures ) { - // ask to convert color textures from sRGB to Linear RGB - bool tolinear = ( tex.first == TextureSemantic::TEX_DIFFUSE || - tex.first == TextureSemantic::TEX_SPECULAR ); - auto texture = texManager->getOrLoadTexture( tex.second, tolinear ); - m_textures[tex.first] = texture; - // do not call addTexture since it invalidate m_pendingTextures itr - // addTexture( tex.first, texture ); - } - - m_pendingTextures.clear(); - m_isDirty = false; + if ( !isDirty() ) { return; } updateRenderingParameters(); + setClean(); } void BlinnPhongMaterial::updateFromParameters() { auto& renderParameters = getParameters(); - m_kd = renderParameters.getParameter( "material.kd" ); - m_perVertexColor = renderParameters.getParameter( "material.hasPerVertexKd" ); - m_renderAsSplat = renderParameters.getParameter( "material.renderAsSplat" ); - m_ks = renderParameters.getParameter( "material.ks" ); - m_ns = renderParameters.getParameter( "material.ns" ); - m_alpha = renderParameters.getParameter( "material.alpha" ); + m_kd = renderParameters.getVariable( "material.kd" ); + m_perVertexColor = renderParameters.getVariable( "material.hasPerVertexKd" ); + m_renderAsSplat = renderParameters.getVariable( "material.renderAsSplat" ); + m_ks = renderParameters.getVariable( "material.ks" ); + m_ns = renderParameters.getVariable( "material.ns" ); + m_alpha = renderParameters.getVariable( "material.alpha" ); } bool BlinnPhongMaterial::isTransparent() const { @@ -158,23 +140,39 @@ BlinnPhongMaterialConverter::operator()( const Ra::Core::Asset::MaterialData* to if ( source->hasSpecular() ) result->m_ks = source->m_specular; if ( source->hasShininess() ) result->m_ns = source->m_shininess; if ( source->hasOpacity() ) result->m_alpha = source->m_opacity; - if ( source->hasDiffuseTexture() ) - result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_DIFFUSE, - source->m_texDiffuse ); - if ( source->hasSpecularTexture() ) - result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_SPECULAR, - source->m_texSpecular ); - if ( source->hasShininessTexture() ) - result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_SHININESS, - source->m_texShininess ); - if ( source->hasOpacityTexture() ) - result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_ALPHA, source->m_texOpacity ); - if ( source->hasNormalTexture() ) - result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_NORMAL, source->m_texNormal ); + TextureParameters data; + data.sampler.wrapS = GL_REPEAT; + data.sampler.wrapT = GL_REPEAT; + data.sampler.minFilter = GL_LINEAR_MIPMAP_LINEAR; + auto texManager = RadiumEngine::getInstance()->getTextureManager(); + if ( source->hasDiffuseTexture() ) { + data.name = "diffuse"; + data.image = texManager->loadTextureImage( source->m_texDiffuse, true ); + result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_DIFFUSE, data ); + } + if ( source->hasSpecularTexture() ) { + data.name = "specular"; + data.image = texManager->loadTextureImage( source->m_texSpecular, true ); + result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_SPECULAR, data ); + } + if ( source->hasShininessTexture() ) { + data.name = "shininess"; + data.image = texManager->loadTextureImage( source->m_texShininess, false ); + result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_SHININESS, data ); + } + if ( source->hasOpacityTexture() ) { + data.name = "opacity"; + data.image = texManager->loadTextureImage( source->m_texOpacity, false ); + result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_ALPHA, data ); + } + if ( source->hasNormalTexture() ) { + data.name = "normal"; + data.image = texManager->loadTextureImage( source->m_texNormal, false ); + result->addTexture( BlinnPhongMaterial::TextureSemantic::TEX_NORMAL, data ); + } return result; } - } // namespace Data } // namespace Engine } // namespace Ra diff --git a/src/Engine/Data/BlinnPhongMaterial.hpp b/src/Engine/Data/BlinnPhongMaterial.hpp index 50980bc1f23..6251dd26596 100644 --- a/src/Engine/Data/BlinnPhongMaterial.hpp +++ b/src/Engine/Data/BlinnPhongMaterial.hpp @@ -2,13 +2,12 @@ #include -#include -#include - #include #include #include +#include + namespace Ra { namespace Core { namespace Asset { @@ -21,51 +20,39 @@ namespace Engine { namespace Data { class ShaderProgram; -/** - * Implementation of the Blinn-Phong Material BSDF. - * @todo due to "Material.glsl" interface modification, must test this version with all plugins, +//! [TextureSemantics] +namespace TextureSemantics { +/// \brief BlinnPhongMaterial's textures. +enum class BlinnPhongMaterial { TEX_DIFFUSE, TEX_SPECULAR, TEX_NORMAL, TEX_SHININESS, TEX_ALPHA }; +} // namespace TextureSemantics +//! [TextureSemantics] + +/** \brief Implementation of the Blinn-Phong Material BSDF. + * + * \todo due to "Material.glsl" interface modification, must test this version with all plugins, * apps, ... that uses Radium Renderer */ -class RA_ENGINE_API BlinnPhongMaterial final : public Material, public ParameterSetEditingInterface + +class RA_ENGINE_API BlinnPhongMaterial final + : public Material, + public ParameterSetEditingInterface, + public MaterialTextureSet { friend class BlinnPhongMaterialConverter; public: - /// Semantic of the texture : define which BSDF parameter is controled by the texture - enum class TextureSemantic { TEX_DIFFUSE, TEX_SPECULAR, TEX_NORMAL, TEX_SHININESS, TEX_ALPHA }; + using TextureSemantic = TextureSemantics::BlinnPhongMaterial; - public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** - * Construct a named Blinn-Phongmaterial - * @param instanceName The name of this instance of the material + /** \brief Construct a named BlinnPhongMaterial. + * + * \param instanceName The name of this instance of the material */ explicit BlinnPhongMaterial( const std::string& instanceName ); - /** - * Destructor. - * @note The material does not have ownership on its texture. This destructor do not delete the - * associated textures. - */ - ~BlinnPhongMaterial() override; void updateGL() override; void updateFromParameters() override; bool isTransparent() const override; - /** - * Add an already existing texture to control the specified BSDF parameter. - * @param semantic The texture semantic - * @param texture The texture to use - */ - inline void addTexture( const TextureSemantic& semantic, Texture* texture ); - - /** - * Get the texture associated to the given semantic. - * @param semantic - * @return - */ - inline Texture* getTexture( const TextureSemantic& semantic ) const; - /** * Register the material in the material library. * After registration, the material could be instantiated by any Radium system, renderer, @@ -79,49 +66,34 @@ class RA_ENGINE_API BlinnPhongMaterial final : public Material, public Parameter */ static void unregisterMaterial(); - /** - * Get a json containing metadata about the parameters of the material. - * @return the metadata in json format - */ - inline nlohmann::json getParametersMetadata() const override; + inline nlohmann::json getParametersMetadata() const override { return s_parametersMetadata; } inline void setColoredByVertexAttrib( bool state ) override; - inline bool isColoredByVertexAttrib() const override; + inline bool isColoredByVertexAttrib() const override { return m_perVertexColor; } - public: + inline void setDiffuseColor( Core::Utils::Color c ); + inline void setSpecularColor( Core::Utils::Color c ); + inline void setSpecularExponent( Scalar n ); + inline void setRenderAsSplat( bool state ); + + inline const Core::Utils::Color& getDiffuseColor() { return m_kd; } + inline const Core::Utils::Color& getSpecularColor() { return m_ks; } + inline Scalar getSpecularExponent() { return m_ns; } + inline bool isRenderAsSplat() { return m_renderAsSplat; } + inline void setAlpha( Scalar a ); + inline Scalar getAlpha() { return m_alpha; } + + private: Core::Utils::Color m_kd { 0.7, 0.7, 0.7, 1.0 }; Core::Utils::Color m_ks { 0.3, 0.3, 0.3, 1.0 }; Scalar m_ns { 64.0 }; Scalar m_alpha { 1.0 }; bool m_perVertexColor { false }; bool m_renderAsSplat { false }; - - /** - * Add an new texture, from a TextureData, to control the specified BSDF parameter. - * @param semantic The texture semantic - * @param texture The texture to use (file) - * @return the corresponding TextureData struct - */ - inline TextureParameters& addTexture( const TextureSemantic& semantic, - const TextureParameters& texture ); - - private: - std::map m_textures; - std::map m_pendingTextures; static nlohmann::json s_parametersMetadata; - /** - * Add an new texture, from a given file, to control the specified BSDF parameter. - * @param semantic The texture semantic - * @param texture The texture to use (file) - * @return the corresponding TextureData struct - */ - inline TextureParameters& addTexture( const TextureSemantic& semantic, - const std::string& texture ); - - /** - * Update the rendering parameters for the Material + /** \brief Update the rendering parameters for the Material */ void updateRenderingParameters(); }; @@ -138,59 +110,38 @@ class RA_ENGINE_API BlinnPhongMaterialConverter final Material* operator()( const Ra::Core::Asset::MaterialData* toconvert ); }; -// Add a texture as material parameter from an already existing Radium Texture -inline void BlinnPhongMaterial::addTexture( const TextureSemantic& semantic, Texture* texture ) { - m_textures[semantic] = texture; - // remove pendingTexture with same semantic, since the latter would - // overwrite the former when updateGL will be called. - m_pendingTextures.erase( semantic ); +inline void BlinnPhongMaterial::setColoredByVertexAttrib( bool state ) { + if ( state != m_perVertexColor ) { + m_perVertexColor = state; + needUpdate(); + } } -// Add a texture as material parameter with texture parameter set by default for this material -inline TextureParameters& BlinnPhongMaterial::addTexture( const TextureSemantic& semantic, - const std::string& texture ) { - CORE_ASSERT( !texture.empty(), "Invalid texture name" ); - - TextureParameters data; - data.name = texture; - data.wrapS = GL_REPEAT; - data.wrapT = GL_REPEAT; - if ( semantic != TextureSemantic::TEX_NORMAL ) { data.minFilter = GL_LINEAR_MIPMAP_LINEAR; } - return addTexture( semantic, data ); +inline void BlinnPhongMaterial::setSpecularExponent( Scalar n ) { + m_ns = n; + needUpdate(); } -// Add a texture as material parameter with texture parameter set by the caller -// The textures will be finalized (i.e loaded from a file if needed and transformed to OpenGL -// texture) only when needed by the updateGL method. -inline TextureParameters& BlinnPhongMaterial::addTexture( const TextureSemantic& semantic, - const TextureParameters& texture ) { - m_pendingTextures[semantic] = texture; - m_isDirty = true; - - return m_pendingTextures[semantic]; +inline void BlinnPhongMaterial::setSpecularColor( Core::Utils::Color c ) { + m_ks = std::move( c ); + needUpdate(); } -inline Texture* BlinnPhongMaterial::getTexture( const TextureSemantic& semantic ) const { - Texture* tex = nullptr; - - auto it = m_textures.find( semantic ); - if ( it != m_textures.end() ) { tex = it->second; } - - return tex; -} - -inline nlohmann::json BlinnPhongMaterial::getParametersMetadata() const { - return s_parametersMetadata; +inline void BlinnPhongMaterial::setDiffuseColor( Core::Utils::Color c ) { + m_kd = std::move( c ); + needUpdate(); } -inline void BlinnPhongMaterial::setColoredByVertexAttrib( bool state ) { - bool oldState = m_perVertexColor; - m_perVertexColor = state; - if ( oldState != m_perVertexColor ) { needUpdate(); } +inline void BlinnPhongMaterial::setRenderAsSplat( bool state ) { + if ( state != m_renderAsSplat ) { + m_renderAsSplat = state; + needUpdate(); + } } -inline bool BlinnPhongMaterial::isColoredByVertexAttrib() const { - return m_perVertexColor; +inline void BlinnPhongMaterial::setAlpha( Scalar a ) { + m_alpha = a; + needUpdate(); } } // namespace Data diff --git a/src/Engine/Data/DrawPrimitives.cpp b/src/Engine/Data/DrawPrimitives.cpp index 6c1f06ee5be..6d1ec29c72a 100644 --- a/src/Engine/Data/DrawPrimitives.cpp +++ b/src/Engine/Data/DrawPrimitives.cpp @@ -37,9 +37,9 @@ Rendering::RenderObject* Primitive( Scene::Component* component, Rendering::RenderTechnique rt; auto builder = Rendering::EngineRenderTechniques::getDefaultTechnique( "Plain" ); builder.second( rt, false ); - auto roMaterial = Core::make_shared( "Default material" ); - roMaterial->m_perVertexColor = mesh->getAttribArrayGeometry().hasAttrib( - Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::MeshAttrib::VERTEX_COLOR ) ); + auto roMaterial = Core::make_shared( "Default material" ); + roMaterial->setColoredByVertexAttrib( mesh->getAttribArrayGeometry().hasAttrib( + Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::MeshAttrib::VERTEX_COLOR ) ) ); rt.setParametersProvider( roMaterial ); auto ro = Rendering::RenderObject::createRenderObject( diff --git a/src/Engine/Data/DrawPrimitives.hpp b/src/Engine/Data/DrawPrimitives.hpp index 065549be6d8..90866409d27 100644 --- a/src/Engine/Data/DrawPrimitives.hpp +++ b/src/Engine/Data/DrawPrimitives.hpp @@ -27,19 +27,19 @@ class LineMesh; /// A set of convenient functions to instantiate simple displays such as points, lines, etc. /// note that objects will be drawn in their entity's local frame. -/// For "instant" debug drawing, @see DebugDisplay. +/// For "instant" debug drawing, \see DebugDisplay. namespace DrawPrimitives { using MeshPtr = std::shared_ptr; using LineMeshPtr = std::shared_ptr; using AttribArrayDisplayablePtr = std::shared_ptr; -///@{ +///\{ /// Renturn a render object to display the given geometry RA_ENGINE_API Rendering::RenderObject* Primitive( Scene::Component* comp, const MeshPtr& mesh ); RA_ENGINE_API Rendering::RenderObject* Primitive( Scene::Component* comp, const LineMeshPtr& mesh ); RA_ENGINE_API Rendering::RenderObject* Primitive( Scene::Component* comp, const AttribArrayDisplayablePtr& mesh ); -///@} +///\} /// Displays given point shown as the crossing of 3 lines of length 'scale' RA_ENGINE_API LineMeshPtr Point( const Core::Vector3& point, @@ -78,7 +78,7 @@ RA_ENGINE_API MeshPtr QuadStrip( const Core::Vector3& a, /// Displays circle computed with given center and radius, /// in plane normal to given vector in wireframe -/// @note normal must be a normalized vector. +/// \note normal must be a normalized vector. RA_ENGINE_API LineMeshPtr Circle( const Core::Vector3& center, const Core::Vector3& normal, Scalar radius, @@ -87,7 +87,7 @@ RA_ENGINE_API LineMeshPtr Circle( const Core::Vector3& center, /// Displays arc of a circle computed with given center, radius and angle /// in plane normal to given vector in wireframe -/// @note normal must be a normalized vector. +/// \note normal must be a normalized vector. RA_ENGINE_API LineMeshPtr CircleArc( const Core::Vector3& center, const Core::Vector3& normal, Scalar radius, @@ -115,7 +115,7 @@ RA_ENGINE_API MeshPtr Capsule( const Core::Vector3& p1, /// Displays disk (filled circle) computed with given center and radius, /// in plane normal to given vector in wireframe -/// @note normal must be a normalized vector. +/// \note normal must be a normalized vector. RA_ENGINE_API MeshPtr Disk( const Core::Vector3& center, const Core::Vector3& normal, Scalar radius, diff --git a/src/Engine/Data/EnvironmentTexture.cpp b/src/Engine/Data/EnvironmentTexture.cpp index 3fda194fe83..a386660dd66 100644 --- a/src/Engine/Data/EnvironmentTexture.cpp +++ b/src/Engine/Data/EnvironmentTexture.cpp @@ -145,7 +145,7 @@ using namespace Ra::Core; // ------------------------------------------------------------------- EnvironmentTexture::EnvironmentTexture( const std::string& mapName, bool isSkybox ) : m_name( mapName ), - m_skyData { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, + m_skyData { { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr } }, m_isSkyBox( isSkybox ) { m_type = ( mapName.find( ';' ) != mapName.npos ) ? EnvironmentTexture::EnvMapType::ENVMAP_CUBE : EnvironmentTexture::EnvMapType::ENVMAP_PFM; @@ -172,20 +172,27 @@ void EnvironmentTexture::initializeTexture() { } computeSHMatrices(); // make the envmap cube texture + + // proper convert shared ptr float[] to void + std::array, 6> cubeMap = { + { m_skyData[0], m_skyData[1], m_skyData[2], m_skyData[3], m_skyData[4], m_skyData[5] } }; Ra::Engine::Data::TextureParameters params { m_name, - GL_TEXTURE_CUBE_MAP, - m_width, - m_height, - 1, - GL_RGBA, - GL_RGBA, - GL_FLOAT, - GL_CLAMP_TO_EDGE, - GL_CLAMP_TO_EDGE, - GL_CLAMP_TO_EDGE, - GL_LINEAR_MIPMAP_LINEAR, - GL_LINEAR, - (void**)( m_skyData ) }; + { + GL_CLAMP_TO_EDGE, + GL_CLAMP_TO_EDGE, + GL_CLAMP_TO_EDGE, + GL_LINEAR_MIPMAP_LINEAR, + GL_LINEAR, + }, + { GL_TEXTURE_CUBE_MAP, + m_width, + m_height, + 1, + GL_RGBA, + GL_RGBA, + GL_FLOAT, + false, + std::move( cubeMap ) } }; m_skyTexture = std::make_unique( params ); if ( m_isSkyBox ) { @@ -203,7 +210,7 @@ void EnvironmentTexture::setupTexturesFromPfm() { m_height = img->height / 4; for ( int imgIdx = 0; imgIdx < 6; ++imgIdx ) { - m_skyData[imgIdx] = new float[m_width * m_height * 4]; + m_skyData[imgIdx] = std::shared_ptr( new float[m_width * m_height * 4] ); } #pragma omp parallel for @@ -293,7 +300,7 @@ void EnvironmentTexture::setupTexturesFromPfm() { } for ( int imgIdx = 0; imgIdx < 6; ++imgIdx ) { - flip_horizontally( m_skyData[imgIdx], m_width, m_height, 4 ); + flip_horizontally( m_skyData[imgIdx].get(), m_width, m_height, 4 ); } delete[] img->pixels; @@ -351,7 +358,7 @@ void EnvironmentTexture::setupTexturesFromCube() { } m_width = w; m_height = h; - m_skyData[imgIdx] = new float[m_width * m_height * 4]; + m_skyData[imgIdx] = std::shared_ptr( new float[m_width * m_height * 4] ); for ( int l = 0; l < int( m_height ); ++l ) { for ( int c = 0; c < int( m_width ); ++c ) { @@ -395,8 +402,8 @@ void EnvironmentTexture::setupTexturesFromSphericalEquiRectangular() { } textureSize >>= 1; // Bases to use to convert sphericalequirectangular images to cube faces - // These bases allow to convert (u, v) cordinates of each faces to (x, y, z) in the frame of the - // equirectangular map. : (x, y, z) = u*A[0] + v*A[1] + A[2] + // These bases allow to convert (u, v) cordinates of each faces to (x, y, z) in the frame of + // the equirectangular map. : (x, y, z) = u*A[0] + v*A[1] + A[2] Vector3 bases[6][3] = { { { -1, 0, 0 }, { 0, 1, 0 }, { 0, 0, -1 } }, { { 1, 0, 0 }, { 0, -1, 0 }, { 0, 0, -1 } }, { { 0, 0, 1 }, { 1, 0, 0 }, { 0, 1, 0 } }, @@ -411,7 +418,7 @@ void EnvironmentTexture::setupTexturesFromSphericalEquiRectangular() { for ( int imgIdx = 0; imgIdx < 6; ++imgIdx ) { // Alllocate the images - m_skyData[imgIdx] = new float[textureSize * textureSize * 4]; + m_skyData[imgIdx] = std::shared_ptr( new float[textureSize * textureSize * 4] ); } Scalar duv = 2_ra / textureSize; @@ -428,24 +435,23 @@ void EnvironmentTexture::setupTexturesFromSphericalEquiRectangular() { Vector2 st { w * sphericalPhi( d ) / ( 2 * M_PI ), h * sphericalTheta( d ) / M_PI }; // TODO : use st to access and filter the original envmap // for now, no filtering is done. (eq to GL_NEAREST) - int s = int( st.x() ); - int t = int( st.y() ); - int cu = int( ( u / 2 + 0.5 ) * textureSize ); - int cv = int( ( v / 2 + 0.5 ) * textureSize ); - - m_skyData[imgIdx][4 * ( cv * textureSize + cu ) + 0] = - latlonPix[4 * ( t * w + s ) + 0]; - m_skyData[imgIdx][4 * ( cv * textureSize + cu ) + 1] = - latlonPix[4 * ( t * w + s ) + 1]; - m_skyData[imgIdx][4 * ( cv * textureSize + cu ) + 2] = - latlonPix[4 * ( t * w + s ) + 2]; - m_skyData[imgIdx][4 * ( cv * textureSize + cu ) + 3] = 1; + int s = std::clamp( int( st.x() ), 0, w - 1 ); + int t = std::clamp( int( st.y() ), 0, h - 1 ); + int cu = std::clamp( int( ( u / 2 + 0.5 ) * textureSize ), 0, textureSize - 1 ); + int cv = std::clamp( int( ( v / 2 + 0.5 ) * textureSize ), 0, textureSize - 1 ); + int skyIndex = 4 * ( cv * textureSize + cu ); + int latlonIndex = 4 * ( t * w + s ); + + m_skyData[imgIdx][skyIndex + 0] = latlonPix[latlonIndex + 0]; + m_skyData[imgIdx][skyIndex + 1] = latlonPix[latlonIndex + 1]; + m_skyData[imgIdx][skyIndex + 2] = latlonPix[latlonIndex + 2]; + m_skyData[imgIdx][skyIndex + 3] = 1; } } } for ( int imgIdx = 0; imgIdx < 6; ++imgIdx ) { - flip_horizontally( m_skyData[imgIdx], textureSize, textureSize, 4 ); + flip_horizontally( m_skyData[imgIdx].get(), textureSize, textureSize, 4 ); } free( latlonPix ); @@ -458,7 +464,7 @@ void EnvironmentTexture::computeSHMatrices() { m_shcoefs[i][j] = 0.f; } } - /// @todo replace this integration to use a sphere sampler ... + /// \todo replace this integration to use a sphere sampler ... /// Must evaluate the elementary solid angle for each sample constexpr Scalar dtheta = 0.005_ra; constexpr Scalar dphi = 0.005_ra; @@ -568,7 +574,8 @@ Ra::Engine::Data::Texture* EnvironmentTexture::getSHImage() { if ( m_shtexture != nullptr ) { return m_shtexture.get(); } size_t ambientWidth = 1024; - auto thepixels = new unsigned char[4 * ambientWidth * ambientWidth]; + std::shared_ptr thepixels( + new unsigned char[4 * ambientWidth * ambientWidth] ); #pragma omp parallel for for ( int i = 0; i < int( ambientWidth ); i++ ) { for ( int j = 0; j < int( ambientWidth ); j++ ) { @@ -617,20 +624,18 @@ Ra::Engine::Data::Texture* EnvironmentTexture::getSHImage() { thepixels[4 * ( j * ambientWidth + i ) + 3] = 255; } } - Ra::Engine::Data::TextureParameters params { "shImage", - GL_TEXTURE_2D, - ambientWidth, - ambientWidth, - 1, - GL_RGBA, - GL_RGBA, - GL_UNSIGNED_BYTE, - GL_CLAMP_TO_EDGE, - GL_CLAMP_TO_EDGE, - GL_CLAMP_TO_EDGE, - GL_LINEAR, - GL_LINEAR, - thepixels }; + Ra::Engine::Data::TextureParameters params { + "shImage", + { GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR }, + { GL_TEXTURE_2D, + ambientWidth, + ambientWidth, + 1, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + false, + thepixels } }; m_shtexture = std::make_unique( params ); return m_shtexture.get(); } @@ -638,7 +643,7 @@ Ra::Engine::Data::Texture* EnvironmentTexture::getSHImage() { void EnvironmentTexture::saveShProjection( const std::string& filename ) { auto tex = getSHImage(); auto flnm = std::string( "../" ) + filename; - stbi_write_png( flnm.c_str(), tex->width(), tex->height(), 4, tex->texels(), 0 ); + stbi_write_png( flnm.c_str(), tex->getWidth(), tex->getHeight(), 4, tex->getTexels(), 0 ); } const Ra::Core::Matrix4& EnvironmentTexture::getShMatrix( int channel ) { @@ -681,10 +686,9 @@ void EnvironmentTexture::updateGL() { m_isSkyBox = false; } m_displayMesh->updateGL(); - m_skyTexture->initializeGL(); + m_skyTexture->initializeNow(); glEnable( GL_TEXTURE_CUBE_MAP_SEAMLESS ); m_glReady = true; - // saveShProjection( "SHImage.png" ); } } diff --git a/src/Engine/Data/EnvironmentTexture.hpp b/src/Engine/Data/EnvironmentTexture.hpp index 9f71f1a242c..3a679760c5c 100644 --- a/src/Engine/Data/EnvironmentTexture.hpp +++ b/src/Engine/Data/EnvironmentTexture.hpp @@ -33,7 +33,7 @@ class RA_ENGINE_API EnvironmentTexture * Constructors and destructor follow the 'rule of five' * https://en.cppreference.com/w/cpp/language/rule_of_three */ - /** @{ */ + /** \{ */ /** * \brief Construct an envmap from a file. @@ -69,7 +69,7 @@ class RA_ENGINE_API EnvironmentTexture EnvironmentTexture& operator=( EnvironmentTexture&& ) = default; /// destructor ~EnvironmentTexture() = default; - /**@}*/ + /**\}*/ /** * \brief Get the name used to construct the environment texture @@ -174,7 +174,7 @@ class RA_ENGINE_API EnvironmentTexture EnvMapType m_type; // The raw pixel values of the envmap - float* m_skyData[6]; + std::array, 6> m_skyData; size_t m_width { 0 }; size_t m_height { 0 }; float m_shcoefs[9][3]; diff --git a/src/Engine/Data/LambertianMaterial.cpp b/src/Engine/Data/LambertianMaterial.cpp index 3714801da0d..0226acd12e6 100644 --- a/src/Engine/Data/LambertianMaterial.cpp +++ b/src/Engine/Data/LambertianMaterial.cpp @@ -18,8 +18,6 @@ nlohmann::json LambertianMaterial::s_parametersMetadata = {}; LambertianMaterial::LambertianMaterial( const std::string& instanceName ) : SimpleMaterial( instanceName, materialName, Material::MaterialAspect::MAT_OPAQUE ) {} -LambertianMaterial::~LambertianMaterial() {} - void LambertianMaterial::registerMaterial() { // Get the Radium Resource location on the filesystem auto resourcesRootDir { RadiumEngine::getInstance()->getResourcesDir() }; @@ -63,8 +61,8 @@ void LambertianMaterial::unregisterMaterial() { void LambertianMaterial::updateFromParameters() { auto& renderParameters = getParameters(); - m_color = renderParameters.getParameter( "material.color" ); - m_perVertexColor = renderParameters.getParameter( "material.perVertexColor" ); + setColor( renderParameters.getVariable( "material.color" ) ); + setColoredByVertexAttrib( renderParameters.getVariable( "material.perVertexColor" ) ); } nlohmann::json LambertianMaterial::getParametersMetadata() const { diff --git a/src/Engine/Data/LambertianMaterial.hpp b/src/Engine/Data/LambertianMaterial.hpp index 220cf2e3ab2..aa30c69377f 100644 --- a/src/Engine/Data/LambertianMaterial.hpp +++ b/src/Engine/Data/LambertianMaterial.hpp @@ -5,8 +5,15 @@ namespace Ra { namespace Engine { namespace Data { -/** - * Implementation of the Lambertian Material BSDF. + +namespace TextureSemantics { +/** \brief LambertianMaterial's textures are the same than SimpleMaterial ones, just alias. + */ +using LambertianMaterial = SimpleMaterial; +} // namespace TextureSemantics + +/** \brief Implementation of the Lambertian Material BSDF. + * * This material implements a lambertian diffuse BSDF. * This material could not be loaded from a file and must be defined and associated to * renderobjects programatically. @@ -19,39 +26,29 @@ namespace Data { class RA_ENGINE_API LambertianMaterial final : public SimpleMaterial { public: - /** - * Construct a named Lambertian material - * @param instanceName The name of the material + /** \brief Construct a named Lambertian material. + * + * \param instanceName The name of the material */ explicit LambertianMaterial( const std::string& instanceName ); - /** - * Destructor. - * @note The material does not have ownership on its texture nor its shaders. - * This destructor do not delete the associated textures and the corresponding shaders. - */ - ~LambertianMaterial() override; + ~LambertianMaterial() override = default; - /** - * Register the material in the material library. + /** \brief Register the material in the material library. + * * After registration, the material could be instantiated by any Radium system, renderer, * plugin, ... */ static void registerMaterial(); - /** - * Remove the material from the material library. + /** \brief Remove the material from the material library. + * * After removal, the material is no more available, ... */ static void unregisterMaterial(); void updateFromParameters() override; - /** - * Get a json containing metadata about the parameters of the material. - * - * @return the metadata in json format - */ nlohmann::json getParametersMetadata() const override; private: diff --git a/src/Engine/Data/Material.cpp b/src/Engine/Data/Material.cpp index 6eedb91bf19..7883231f34c 100644 --- a/src/Engine/Data/Material.cpp +++ b/src/Engine/Data/Material.cpp @@ -11,14 +11,6 @@ Material::Material( const std::string& instanceName, m_aspect { aspect }, m_materialName { materialName } {} -bool Material::isTransparent() const { - return m_aspect == MaterialAspect::MAT_TRANSPARENT; -} - -std::list Material::getPropertyList() const { - return ShaderParameterProvider::getPropertyList(); -} - } // namespace Data } // namespace Engine } // namespace Ra diff --git a/src/Engine/Data/Material.hpp b/src/Engine/Data/Material.hpp index bc6b64bc262..a7d0f190030 100644 --- a/src/Engine/Data/Material.hpp +++ b/src/Engine/Data/Material.hpp @@ -5,26 +5,26 @@ #include #include -// This include brings only the macro EIGEN_MAKE_ALIGNED_OPERATOR_NEW in the file scope. -// Need to be separated to reduce compilation time -#include - +#include #include +#include +#include +#include namespace Ra { namespace Engine { namespace Data { -/** - * Base class for materials/ + +/** \brief Base class for materials. + * * Do not assume a given Material representation but only make the difference between opaque and * transparent materials. - * */ class RA_ENGINE_API Material : public Data::ShaderParameterProvider { public: - /** - * Identifies the type of the material. + /** \brief Identifies the type of the material. + * * MAT_OPAQUE and MAT_TRANSPARENT implements the GLSL "surfacic" BSDF interface * MAT_DENSITY implements the GLSL "volumetric" interface */ @@ -34,58 +34,39 @@ class RA_ENGINE_API Material : public Data::ShaderParameterProvider MAT_DENSITY /// <- The material implements the VOLUME interface }; - public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - - protected: /** - * Creates a named material with the given aspect - * @param instanceName - * @param materialName - * @param aspect + * \note The material does not have ownership on its texture nor its shaders. + * This destructor do not delete the associated textures and the corresponding shaders. */ - explicit Material( const std::string& instanceName, - const std::string& materialName, - MaterialAspect aspect = MaterialAspect::MAT_OPAQUE ); - - /** Change the Material Name - * @note This method should be used carefully as the name is a key for render technique factory - */ - inline void setMaterialName( std::string newName ) { m_materialName = std::move( newName ); } - - public: virtual ~Material() = default; - /** - * @return the name of the material instance + /** \return the name of the material instance */ inline const std::string& getInstanceName() const { return m_instanceName; } - /** - * @return the name of the material, can be used a UUID - * @note the material name is expected to be used to define the ShaderConfiguration name + /** \return the name of the material, can be used a UUID + * \note the material name is expected to be used to define the ShaderConfiguration name */ inline const std::string& getMaterialName() const { return m_materialName; } /** set the aspect (MAT_OPAQUE or MAT_TRANSPARENT) of the material. - * @param aspect + * \param aspect */ inline void setMaterialAspect( const MaterialAspect& aspect ) { m_aspect = aspect; } - /** Get the aspect (MAT_OPAQUE or MAT_TRANSPARENT) of the material. + /** \brief Get the aspect (MAT_OPAQUE or MAT_TRANSPARENT) of the material. * - * @return the current aspect of the Material + * \return the current aspect of the Material */ inline const MaterialAspect& getMaterialAspect() const { return m_aspect; } - /** Test if material is transperent. - * @return true if the material is transparent + /** \return true if the material is transparent. */ - virtual bool isTransparent() const; + virtual bool isTransparent() const { return m_aspect == MaterialAspect::MAT_TRANSPARENT; } - /** - * Get the list of properties the material migh use in a shader. - * each property will be added to the shader used for rendering this material under the form + /** * \brief Get the list of properties the material migh use in a shader. + * + * Each property will be added to the shader used for rendering this material under the form * "#define theProperty". Shaders that support the given property could then fully render the * material. Others migh render the meterial eroneously. * @@ -94,28 +75,55 @@ class RA_ENGINE_API Material : public Data::ShaderParameterProvider * \todo : Validate this proposal * \todo : make the property list modifiable as well */ - std::list getPropertyList() const override; + std::list getPropertyList() const override { + return ShaderParameterProvider::getPropertyList(); + } - /** - * \brief Makes the Material take its base color from the VERTEX_COLOR attribute of the rendered - * geometry \param state activate (true) or deactivate (false) VERTEX_COLOR attribute usage + /** \brief Makes the Material take its base color from the VERTEX_COLOR attribute of the + * rendered geometry. + * + * \param state activate (true) or deactivate (false) VERTEX_COLOR attribute usage * * Any material that support per-vertex color parameterization should implement this method * accordingly */ - virtual void setColoredByVertexAttrib( bool /* state */ ) {}; + virtual void setColoredByVertexAttrib( [[maybe_unused]] bool state ) {}; - /** - * \brief Indicates if the material takes the VERTEX_COLOR attribute into account. + /** \brief Indicates if the material takes the VERTEX_COLOR attribute into account. */ virtual bool isColoredByVertexAttrib() const { return false; } - /** Mark the Material as needing update before the next OpenGL call - * + /** \brief Mark the Material as needing update before the next OpenGL call. */ - inline void needUpdate() { m_isDirty = true; } + inline void needUpdate() { setDirty(); } protected: + /** \brief Creates a named material with the given aspect. + * + * \param instanceName + * \param materialName + * \param aspect + */ + explicit Material( const std::string& instanceName, + const std::string& materialName, + MaterialAspect aspect = MaterialAspect::MAT_OPAQUE ); + + /** \brief Change the material name. + * + * \note This method should be used carefully as the name is a key for render technique factory + */ + inline void setMaterialName( std::string newName ) { m_materialName = std::move( newName ); } + + /// Return dirty state + bool isDirty() { return m_isDirty; } + + /// Set dirty state to true + void setDirty() { m_isDirty = true; } + + /// Set dirty state to false + void setClean() { m_isDirty = false; } + + private: /// Material instance name std::string m_instanceName {}; /// Material aspect @@ -123,8 +131,6 @@ class RA_ENGINE_API Material : public Data::ShaderParameterProvider /// Dirty mark : true if the openGL state of the material need to be updated before next draw /// call bool m_isDirty { true }; - - private: /// Unique material name that can be used to identify the material class std::string m_materialName; }; diff --git a/src/Engine/Data/MaterialConverters.hpp b/src/Engine/Data/MaterialConverters.hpp index dcff906d014..5bac97aca23 100644 --- a/src/Engine/Data/MaterialConverters.hpp +++ b/src/Engine/Data/MaterialConverters.hpp @@ -35,7 +35,7 @@ namespace Data { * - a function with bind parameters .... * The function is in charge of converting a concrete Ra::Core::Asset::MaterialData* to a concrete * Ra::Engine::Material* according to the type of material described by the string ... - @see documentation on materials for instructions on how to extend the material system + \see documentation on materials for instructions on how to extend the material system */ namespace EngineMaterialConverters { @@ -54,20 +54,20 @@ using RadiumMaterialPtr = Ra::Engine::Data::Material*; using ConverterFunction = std::function; /** register a new material converter - * @return true if converter added, false else (e.g, a converter with the same name exists) + * \return true if converter added, false else (e.g, a converter with the same name exists) */ RA_ENGINE_API bool registerMaterialConverter( const std::string& name, ConverterFunction converter ); /** remove a material converter - * @return true if converter removed, false else (e.g, a converter with the same name does't + * \return true if converter removed, false else (e.g, a converter with the same name does't * exists) */ RA_ENGINE_API bool removeMaterialConverter( const std::string& name ); /** - * @param name name of the material to convert - * @return a pair containing the search result and, if true, the functor to call to convert the + * \param name name of the material to convert + * \return a pair containing the search result and, if true, the functor to call to convert the * material */ RA_ENGINE_API std::pair getMaterialConverter( const std::string& name ); diff --git a/src/Engine/Data/MaterialTextureSet.hpp b/src/Engine/Data/MaterialTextureSet.hpp new file mode 100644 index 00000000000..cc1f5004f6f --- /dev/null +++ b/src/Engine/Data/MaterialTextureSet.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +namespace Ra { +namespace Engine { +namespace Data { + +/** \brief Base class to manage a set of textures indexed by semantic (enum). + */ +template +class MaterialTextureSet +{ + public: + virtual ~MaterialTextureSet() = default; + + void addTexture( const TextureSemantic& semantic, + const TextureManager::TextureHandle& texture ) { + m_textures[semantic] = texture; + } + + /** \brief Add texture to TextureManager fisrt, then to the texture set. + */ + void addTexture( const TextureSemantic& semantic, const TextureParameters& texture ) { + auto texManager = RadiumEngine::getInstance()->getTextureManager(); + addTexture( semantic, texManager->addTexture( texture ) ); + } + + /** \brief Texture getter from semantic. + * + * \return raw (non owning) ptr to the texture, `nullptr` if the texture is not found. + */ + Texture* getTexture( const TextureSemantic& semantic ) const { + Texture* tex = nullptr; + auto texManager = RadiumEngine::getInstance()->getTextureManager(); + auto it = m_textures.find( semantic ); + if ( it != m_textures.end() ) { tex = texManager->getTexture( it->second ); } + return tex; + } + + private: + std::map m_textures; +}; +} // namespace Data +} // namespace Engine +} // namespace Ra diff --git a/src/Engine/Data/Mesh.hpp b/src/Engine/Data/Mesh.hpp index 5f97b7ddc70..2e4e631d656 100644 --- a/src/Engine/Data/Mesh.hpp +++ b/src/Engine/Data/Mesh.hpp @@ -53,7 +53,7 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable public: /// Render mode enum used when render()/ /// values taken from OpenGL specification - /// @see https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h + /// \see https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h enum MeshRenderMode : uint { RM_POINTS = 0x0000, RM_LINES = 0x0001, // decimal value: 1 @@ -87,9 +87,9 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable /// Get the render mode. inline MeshRenderMode getRenderMode() const; - /// @name + /// \name /// Mark attrib data as dirty, forcing an update of the OpenGL buffer. - ///@{ + ///\{ /// Use g_attribName to find the corresponding name and call setDirty(const std::string& name). /// \param type: the data to set to MeshAttrib @@ -101,18 +101,18 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable /// If index is greater than then number of buffer, this function as no effect. /// \param index: the data buffer index to set to dirty. void setDirty( unsigned int index ); - ///@} + ///\} /// This function is called at the start of the rendering. /// It will update the necessary openGL buffers. void updateGL() override = 0; - /// @name + /// \name /// Core::Geometry getters. - ///@{ + ///\{ virtual const Core::Geometry::AttribArrayGeometry& getAttribArrayGeometry() const = 0; virtual Core::Geometry::AttribArrayGeometry& getAttribArrayGeometry() = 0; - ///@} + ///\} /// \brief Get opengl's vbo handle (uint) corresponding to attrib \b name. /// @@ -237,9 +237,9 @@ class CoreGeometryDisplayable : public AttribArrayDisplayable // no need to detach observer in dtor since CoreGeometry is owned by this, and CoreGeometry dtor // will detachAll observers. - /// @name + /// \name /// Core::Geometry getters - ///@{ + ///\{ inline const Core::Geometry::AbstractGeometry& getAbstractGeometry() const override; inline Core::Geometry::AbstractGeometry& getAbstractGeometry() override; @@ -248,7 +248,7 @@ class CoreGeometryDisplayable : public AttribArrayDisplayable inline const CoreGeometry& getCoreGeometry() const; inline CoreGeometry& getCoreGeometry(); - ///@} + ///\} /// Helper function that calls Ra::Core::CoreGeometry::addAttrib() template @@ -373,22 +373,19 @@ class MultiIndexedGeometry : public CoreGeometryDisplayable using LayerKeyType = std::pair; using EntryType = std::pair; - struct RA_CORE_API KeyHash { - std::size_t operator()( const LayerKeyType& k ) const { - // Mix semantic collection into a single identifier string - std::ostringstream stream; - std::copy( - k.first.begin(), k.first.end(), std::ostream_iterator( stream, "" ) ); - std::string result = stream.str(); - std::sort( result.begin(), result.end() ); - - // Combine with layer name hash - return std::hash {}( result ) ^ - ( std::hash {}( k.second ) << 1 ); - } - }; - std::unordered_map m_indices; -}; + struct RA_CORE_API KeyHash { std::size_t operator()( const LayerKeyType& k ) const { + // Mix semantic collection into a single identifier string + std::ostringstream stream; + std::copy( k.first.begin(), k.first.end(), std::ostream_iterator( stream, "" ) ); + std::string result = stream.str(); + std::sort( result.begin(), result.end() ); + + // Combine with layer name hash + return std::hash {}( result ) ^ ( std::hash {}( k.second ) << 1 ); +} +}; // namespace Data +std::unordered_map m_indices; +}; // namespace Engine /// LineMesh, own a Core::Geometry::LineMesh class RA_ENGINE_API LineMesh : public IndexedGeometry @@ -587,8 +584,8 @@ template void IndexedAttribArrayDisplayable::updateGL() { if ( m_isDirty ) { // Check that our dirty bits are consistent. - ON_ASSERT( bool dirtyTest = false; for ( const auto& d - : m_dataDirty ) { dirtyTest = dirtyTest || d; } ); + ON_ASSERT( bool dirtyTest = false; + for ( const auto& d : m_dataDirty ) { dirtyTest = dirtyTest || d; } ); CORE_ASSERT( dirtyTest == m_isDirty, "Dirty flags inconsistency" ); if ( !m_indices ) { @@ -841,8 +838,8 @@ template void CoreGeometryDisplayable::updateGL() { if ( m_isDirty ) { // Check that our dirty bits are consistent. - ON_ASSERT( bool dirtyTest = false; for ( auto d - : m_dataDirty ) { dirtyTest = dirtyTest || d; } ); + ON_ASSERT( bool dirtyTest = false; + for ( auto d : m_dataDirty ) { dirtyTest = dirtyTest || d; } ); CORE_ASSERT( dirtyTest == m_isDirty, "Dirty flags inconsistency" ); CORE_ASSERT( !( m_mesh.vertices().empty() ), "No vertex." ); @@ -1133,6 +1130,6 @@ inline void GeneralMesh::triangulate() { } } -} // namespace Data +} // namespace Ra } // namespace Engine } // namespace Ra diff --git a/src/Engine/Data/PlainMaterial.cpp b/src/Engine/Data/PlainMaterial.cpp index 993af771e12..2684469894d 100644 --- a/src/Engine/Data/PlainMaterial.cpp +++ b/src/Engine/Data/PlainMaterial.cpp @@ -19,8 +19,6 @@ nlohmann::json PlainMaterial::s_parametersMetadata = {}; PlainMaterial::PlainMaterial( const std::string& instanceName ) : SimpleMaterial( instanceName, materialName, Material::MaterialAspect::MAT_OPAQUE ) {} -PlainMaterial::~PlainMaterial() = default; - void PlainMaterial::registerMaterial() { // Get the Radium Resource location on the filesystem auto resourcesRootDir { RadiumEngine::getInstance()->getResourcesDir() }; @@ -63,8 +61,8 @@ void PlainMaterial::unregisterMaterial() { void PlainMaterial::updateFromParameters() { auto& renderParameters = getParameters(); - m_color = renderParameters.getParameter( "material.color" ); - m_perVertexColor = renderParameters.getParameter( "material.perVertexColor" ); + setColor( renderParameters.getVariable( "material.color" ) ); + setColoredByVertexAttrib( renderParameters.getVariable( "material.perVertexColor" ) ); } nlohmann::json PlainMaterial::getParametersMetadata() const { diff --git a/src/Engine/Data/PlainMaterial.hpp b/src/Engine/Data/PlainMaterial.hpp index 91ec2252644..70f300da906 100644 --- a/src/Engine/Data/PlainMaterial.hpp +++ b/src/Engine/Data/PlainMaterial.hpp @@ -21,16 +21,16 @@ class RA_ENGINE_API PlainMaterial final : public SimpleMaterial public: /** * Construct a named Plain material - * @param name The name of the material + * \param name The name of the material */ explicit PlainMaterial( const std::string& instanceName ); /** * Destructor. - * @note The material does not have ownership on its texture nor its shaders. + * \note The material does not have ownership on its texture nor its shaders. * This destructor do not delete the associated textures and the corresponding shaders. */ - ~PlainMaterial() override; + ~PlainMaterial() override = default; /** * Register the material in the material library. @@ -47,11 +47,6 @@ class RA_ENGINE_API PlainMaterial final : public SimpleMaterial void updateFromParameters() override; - /** - * Get a json containing metadata about the parameters of the material. - * - * @return the metadata in json format - */ nlohmann::json getParametersMetadata() const override; private: diff --git a/src/Engine/Data/RawShaderMaterial.hpp b/src/Engine/Data/RawShaderMaterial.hpp index 7d797e80e9c..885faeb9c25 100644 --- a/src/Engine/Data/RawShaderMaterial.hpp +++ b/src/Engine/Data/RawShaderMaterial.hpp @@ -27,10 +27,10 @@ class RA_ENGINE_API RawShaderMaterialData : public MaterialData public: /** * Construct a shaderMaterialData from shader source and parameter provider - * @param instanceName The name of the material instance - * @param shaders The shaders to use for each pipeline stage (only one source per stage is + * \param instanceName The name of the material instance + * \param shaders The shaders to use for each pipeline stage (only one source per stage is * allowed) - * @param paramProvider The parameter provider for the resulting program + * \param paramProvider The parameter provider for the resulting program */ RawShaderMaterialData( const std::string& instanceName, @@ -75,19 +75,16 @@ class RA_ENGINE_API RawShaderMaterial : public Material public: /** * Construct a named material from raw shaders - * @param instanceName The name of the material instance - * @param shaders The shaders to use for each pipeline stage (only one source per stage is + * \param instanceName The name of the material instance + * \param shaders The shaders to use for each pipeline stage (only one source per stage is * allowed) - * @param paramProvider The parameter provider for the resulting program + * \param paramProvider The parameter provider for the resulting program */ explicit RawShaderMaterial( const std::string& instanceName, const std::vector>& shaders, std::shared_ptr paramProvider ); - /** - * Destructor. - */ ~RawShaderMaterial() override; /** @@ -97,13 +94,13 @@ class RA_ENGINE_API RawShaderMaterial : public Material /** * Override of the `getParameters()` method from Material - * @return + * \return */ inline Data::RenderParameters& getParameters() override; /** * Override of the `const getParameters() const` method from Material - * @return + * \return */ inline const Data::RenderParameters& getParameters() const override; @@ -114,11 +111,11 @@ class RA_ENGINE_API RawShaderMaterial : public Material /** * Update the shaders of the material. - * @note the given shaders array is considered as a remplacement of the current shader array. - * @param instanceName The name of the material instance - * @param shaders The shaders to use for each pipeline stage (only one source per stage is + * \note the given shaders array is considered as a remplacement of the current shader array. + * \param instanceName The name of the material instance + * \param shaders The shaders to use for each pipeline stage (only one source per stage is * allowed) - * @param paramProvider The parameter provider for the resulting program. If not given, the old + * \param paramProvider The parameter provider for the resulting program. If not given, the old * provider will be kept. */ void updateShaders( const std::vector>& shaders, @@ -145,8 +142,7 @@ class RA_ENGINE_API RawShaderMaterial : public Material private: /** - * Compute the unique key that identify this material in shaders and technique factories - * @return + * \return the unique key that identify this material in shaders and technique factories */ std::string computeKey(); diff --git a/src/Engine/Data/RenderParameters.cpp b/src/Engine/Data/RenderParameters.cpp index 9228617f727..9a9f29d60a2 100644 --- a/src/Engine/Data/RenderParameters.cpp +++ b/src/Engine/Data/RenderParameters.cpp @@ -1,3 +1,4 @@ +#include "Core/Containers/VariableSet.hpp" #include #include @@ -8,37 +9,6 @@ namespace Ra { namespace Engine { namespace Data { -RenderParameters::StaticParameterBinder RenderParameters::s_binder; - -void RenderParameters::bind( const Data::ShaderProgram* shader ) const { - m_parameterSets.visit( s_binder, shader ); -} - -void RenderParameters::addParameter( const std::string& name, const std::string& value ) { - auto converterFunc = m_parameterSets.existsVariable< - std::function>( name ); - if ( converterFunc ) { ( *converterFunc )->second( m_parameterSets, name, value ); } - else { - LOG( Core::Utils::logWARNING ) - << "RenderParameters, try to set enum value from string without converter. Adding " - "non-bindable TParameter " - << name << " " << value; - m_parameterSets.insertOrAssignVariable( name, value ); - } -} - -void RenderParameters::addParameter( const std::string& name, const char* value ) { - addParameter( name, std::string( value ) ); -} - -void RenderParameters::mergeKeepParameters( const RenderParameters& params ) { - m_parameterSets.mergeKeepVariables( params.getStorage() ); -} - -void RenderParameters::mergeReplaceParameters( const RenderParameters& params ) { - m_parameterSets.mergeReplaceVariables( params.getStorage() ); -} - void ParameterSetEditingInterface::loadMetaData( const std::string& basename, nlohmann::json& destination ) { auto resourcesRootDir { RadiumEngine::getInstance()->getResourcesDir() }; diff --git a/src/Engine/Data/RenderParameters.hpp b/src/Engine/Data/RenderParameters.hpp index e55a5b2a943..c4d362831db 100644 --- a/src/Engine/Data/RenderParameters.hpp +++ b/src/Engine/Data/RenderParameters.hpp @@ -23,16 +23,15 @@ namespace Data { class Texture; /** - * Management of shader parameters with automatic binding of a named parameter to the corresponding - * glsl uniform. + * \brief Management of shader parameters with automatic binding of a named parameter to the + * corresponding glsl uniform. + * * \note Automatic binding is only available for supported type described in BindableTypes. * \note Enums are stored according to their underlying_type. Enum management is automatic except * when requesting for the associated uniformBindableSet. To access bindable set containing a given - * enum with type Enum, use `getParameterSet::type>` - * + * enum with type Enum, use `getAllVariable::type>` */ -class RA_ENGINE_API RenderParameters final +class RA_ENGINE_API RenderParameters final : public Core::VariableSet { public: /** @@ -40,9 +39,6 @@ class RA_ENGINE_API RenderParameters final */ using TextureInfo = std::pair; - /// \brief Aliases for bindable parameter types - /// \{ - /// List of bindable types, to be used with static visitors using BindableTypes = Core::Utils::TypeList, std::reference_wrapper>; - /** Set of typed parameters - * For a given shader Program, all the parameters are stored by type, using Core::VariableSet as - * container. + /** \brief Adding a texture parameter. * - * \tparam T The type of parameters in the set. - */ - template - using UniformBindableSet = Core::VariableSet::VariableContainer; - - /** Handle to a bindable parameters. - * A handle is an iterator on a pair such that the value is of type T - * - * \tparam T The type of parameter in the set. - */ - template - using UniformVariable = Core::VariableSet::VariableHandle; - /// \} - - /** - * \brief Associate a converter for enumerated type to the given parameter name - * \tparam EnumBaseType The enum base type to manage (\see Ra::Core::Utils::EnumConverter) - * \param name - * \param converter - */ - template - void addEnumConverter( const std::string& name, - std::shared_ptr> converter ); - - /** - * \brief Search for a converter associated with an enumeration parameter - * \tparam EnumBaseType The enum base type to manage (\see Ra::Core::Utils::EnumConverter) - * \param name the name of the parameter - * \return an optional containing the converter or false if no converter is found. - */ - template - Core::Utils::optional>> - getEnumConverter( const std::string& name ); - - /** - * \brief Return the string associated to the actual value of a parameter - * \tparam Enum The enum type (\see Ra::Core::Utils::EnumConverter) - * \param name The name of the enum variable - * \param value The value to convert - * \return - */ - template {}, bool>::type = true> - std::string getEnumString( const std::string& name, Enum value ); - - /** - * \brief (overload) Return the string associated to the actual value of a parameter, from a - * value with underlying_type. - * \tparam EnumBaseType The underlying enum type (\see Ra::Core::Utils::EnumConverter) - * \param name The name of the enum variable - * \param value The value to convert - * \return - */ - template - std::string - getEnumString( const std::string& name, - EnumBaseType value, - typename std::enable_if {}, bool>::type = true ); - - /** - * Overloaded operators to set shader parameters - * \{ - */ - - /** - * \brief Add a parameter by value - * \tparam T The type of parameter to add. Must be a non class type for this overload to be - * chosen. \param name Name of the parameter. \param value Value of the parameter. - */ - template - void addParameter( const std::string& name, - T value, - typename std::enable_if {}, bool>::type = true ); - - /** - * \brief Add a parameter by const ref - * \tparam T The type of parameter to add. Must be a class type for this overload to be chosen. - * \param name Name of the parameter. - * \param value Value of the parameter. - */ - template {}, bool>::type = true> - void addParameter( const std::string& name, const T& value ); - - /** - * \brief Adding a texture parameter. * \tparam T The type of parameter to add. Must be derived from Texture for this overload. * \param name Name of the parameter * \param tex Texture to add in the parameterSet @@ -160,136 +70,41 @@ class RA_ENGINE_API RenderParameters final */ template ::value, bool>::type = true> - void addParameter( const std::string& name, T* tex, int texUnit = -1 ); - - /** - * \brief set the value of the given parameter, according to a string representation of an enum. - * \note If there is no EnumConverter associated with the parameter name, the string is - * registered in the RenderParameter set. - * \param name Name of the parameter - * \param value value of the parameter - */ - void addParameter( const std::string& name, const std::string& value ); - void addParameter( const std::string& name, const char* value ); - - /** - * \brief add a render parameter variable - * \param name - * \param value - */ - void addParameter( const std::string& name, RenderParameters& value ); - - void addParameter( const std::string& name, const RenderParameters& value ); - - /**\}*/ - - /** - * \brief Remove the given parameter from the parameterSet - * \tparam T Type of the parameter to remove - * \param name Name of the parameter to remove - * \return true if the parameter was found and removed. false else. - */ - template - bool removeParameter( const std::string& name ); + void setTexture( const std::string& name, T* tex, int texUnit = -1 ) { + setVariable( name, TextureInfo { tex, texUnit } ); + } - /** - * Merges a RenderParameters \a params with this - * \param params the render parameter to merge with the current. - * Existing parameter value are kept from this - * \see mergeReplaceParameters - */ - void mergeKeepParameters( const RenderParameters& params ); + using VariableSet::setVariable; - /** - * Merges a RenderParameters \a params with this - * \param params the render parameter to merge with the current. - * Existing parameter values are replaced by params's one. - * \see mergeKeepParameters - */ - void mergeReplaceParameters( const RenderParameters& params ); + /// overload create ref wrapper for RenderParameters variable + void setVariable( const std::string& name, RenderParameters& rp ) { + VariableSet::setVariable( name, std::ref( rp ) ); + } + void setVariable( const std::string& name, const RenderParameters& rp ) { + VariableSet::setVariable( name, std::cref( rp ) ); + } - /** Bind the parameter uniform on the shader program + /** \brief Bind the parameter uniform on the shader program. + * * \note, this will only bind the supported parameter types. * \param shader The shader to bind to. */ - void bind( const Data::ShaderProgram* shader ) const; - - /** - * \brief Get a typed parameter set - * \tparam T the type of the parameter set to get - * \return The corresponding set parameter - */ - /// \{ - template - const UniformBindableSet& getParameterSet() const; - template - UniformBindableSet& getParameterSet(); - /// \} - - /** - * \brief Test if parameters of type T are stored - * \tparam T - * \return an optional, empty if the ParameterSet does not exists or whose value is - * a **non owning** pointer to the ParameterSet collection if it exists. This **non owning** - * pointer remains valid as long as the RenderParameter exists and contains the given type. - */ - template - Core::Utils::optional*> hasParameterSet() const; - - /** - * Check if a typed parameter exists - * \tparam T the type of the parameter to get - * \param name The name of the parameter to get - * \return true if the parameter exists - */ - template - Core::Utils::optional> containsParameter( const std::string& name ) const; - - /** - * \brief Get a typed parameter - * \tparam T the type of the parameter to get - * \param name The name of the parameter to get - * \return The corresponding parameter - * \throw std::out_of_range if the container does not have an parameter with the specified name - */ - /// \{ - template - const T& getParameter( const std::string& name ) const; - template - T& getParameter( const std::string& name ); - /// \} - - /** Visit the parameter using any kind of visitor - */ - template - void visit( V&& visitor ) const; - - template - void visit( V&& visitor, T& userParams ) const; - - template - void visit( V&& visitor, T&& userParams ) const; + void bind( const Data::ShaderProgram* shader ) const { + visit( StaticParameterBinder {}, shader ); + } - /// \brief Get access to the parameter storage - /// \return the Core::VariableSet storing the parameters - /// \{ - const Core::VariableSet& getStorage() const { return m_parameterSets; } - Core::VariableSet& getStorage() { return m_parameterSets; } - /// \} private: - /** - * \brief Static visitor to bind the stored parameters. + /** \brief Static visitor to bind the stored parameters. * \note Binds only statically supported types. To bind unsupported types, use a custom * dynamic visitor and the RenderParameter::visit method. */ class StaticParameterBinder { public: - /// Type supported by the binder + /// Type supported by the binder, as expected by VariableSet using types = BindableTypes; - /** - * \brief Binds a color parameter as this requires special access to the parameter value. + /** \brief Binds a color parameter as this requires special access to the parameter value. */ void operator()( const std::string& name, const Ra::Core::Utils::Color& p, @@ -297,8 +112,7 @@ class RA_ENGINE_API RenderParameters final shader->setUniform( name.c_str(), Ra::Core::Utils::Color::VectorType( p ) ); } - /** - * \brief Binds a Texture parameter as this requires special access to the parameter value. + /** \brief Binds a Texture parameter as this requires special access to the parameter value. */ void operator()( const std::string& name, const RenderParameters::TextureInfo& p, @@ -308,8 +122,8 @@ class RA_ENGINE_API RenderParameters final else { shader->setUniform( name.c_str(), tex, texUnit ); } } - /** - * \brief Binds a embedded const RenderParameter. + /** \brief Binds a embedded const RenderParameter. + * * This allows to build hierarchies of RenderParameters. */ template @@ -319,36 +133,24 @@ class RA_ENGINE_API RenderParameters final p.get().bind( shader ); } - /** - * \brief Bind any type of parameter that do not requires special access + /** \brief Bind any type of parameter that do not requires special access */ template void operator()( const std::string& name, const T& p, const Data::ShaderProgram* shader ) { shader->setUniform( name.c_str(), p ); } }; - - /** \brief Functor to bind parameters - * There will be only one StaticParameterBinder used by all RenderParameters - */ - static StaticParameterBinder s_binder; - - /** - * Storage of the parameters - */ - Core::VariableSet m_parameterSets; }; -/** - * Interface to define metadata (constraints, description, ...) for the edition of parameter set +/** \brief Interface to define metadata (constraints, description, ...) for the editing of parameter + * set */ class RA_ENGINE_API ParameterSetEditingInterface { public: virtual ~ParameterSetEditingInterface() = default; - /** - * \brief Get a json containing metadata about the parameters. + /** \brief Get a json containing metadata about the parameters. * * \return the metadata in json format */ @@ -358,9 +160,9 @@ class RA_ENGINE_API ParameterSetEditingInterface static void loadMetaData( const std::string& basename, nlohmann::json& destination ); }; -/** - * Shader program parameter provider. - * a ShaderParameterProvider is an object that is associated to a render technique to provide the +/** \brief Shader program parameter provider. + * + * A ShaderParameterProvider is an object that is associated to a render technique to provide the * uniform parameter set for the program. When an RenderObject is drawn using a given * rendertechnique, the ShaderParameterProvider associated to the renderTechnique is responsible to * set all the uniforms needed by the rendertechnique. @@ -371,22 +173,22 @@ class RA_ENGINE_API ShaderParameterProvider virtual ~ShaderParameterProvider() = default; virtual RenderParameters& getParameters() { return m_renderParameters; } virtual const RenderParameters& getParameters() const { return m_renderParameters; } - /** - * \brief Update the OpenGL states used by the ShaderParameterProvider. + + /** \brief Update the OpenGL states used by the ShaderParameterProvider. + * * These state could be the ones from an associated material (textures, precomputed tables or * whatever data associated to the material) or some parameters that are * specific to the provider semantic. */ virtual void updateGL() = 0; - /** - * \brief Update the attributes of the ShaderParameterProvider to their actual values stored in + /** \brief Update the attributes of the ShaderParameterProvider to their actual values stored in * the renderParameters. */ virtual void updateFromParameters() {}; - /** - * \brief Get the list of properties the provider might use in a shader. + /** \brief Get the list of properties the provider might use in a shader. + * * Each property will be added to the shader used for rendering under the form * "#define theProperty" when the provider is associated with the render technique. * @@ -398,155 +200,9 @@ class RA_ENGINE_API ShaderParameterProvider private: /// The parameters to set for a shader - /// replace this by coreVariables RenderParameters m_renderParameters; }; -/* --------------- enum parameter management --------------- */ - -template -void RenderParameters::addEnumConverter( - const std::string& name, - std::shared_ptr> converter ) { - auto converterHandle = m_parameterSets.insertOrAssignVariable( name, converter ); - std::function - convertingFunction = [converter = converterHandle.first]( Core::VariableSet& vs, - const std::string& nm, - const std::string& vl ) { - vs.insertOrAssignVariable( nm, converter->second->getEnumerator( vl ) ); - }; - m_parameterSets.insertOrAssignVariable( name, convertingFunction ); -} - -template -Core::Utils::optional>> -RenderParameters::getEnumConverter( const std::string& name ) { - auto storedConverter = - m_parameterSets.existsVariable>>( - name ); - if ( storedConverter ) { return ( *storedConverter )->second; } - return {}; -} - -template -std::string RenderParameters::getEnumString( - const std::string& name, - EnumBaseType value, - typename std::enable_if {}, bool>::type ) { - auto storedConverter = - m_parameterSets.existsVariable>>( - name ); - if ( storedConverter ) { return ( *storedConverter )->second->getEnumerator( value ); } - LOG( Ra::Core::Utils::logWARNING ) << name + " is not a registered Enum with underlying type " + - Ra::Core::Utils::demangleType() + "."; - return ""; -} - -template {}, bool>::type> -std::string RenderParameters::getEnumString( const std::string& name, Enum value ) { - using EnumBaseType = typename std::underlying_type_t; - return getEnumString( name, EnumBaseType( value ) ); -} - -/* --------------- enum parameter management --------------- */ - -template -inline void -RenderParameters::addParameter( const std::string& name, - T value, - typename std::enable_if {}, bool>::type ) { - if constexpr ( std::is_enum::value ) { - auto v = static_cast::type>( value ); - m_parameterSets.insertOrAssignVariable( name, v ); - } - else { m_parameterSets.insertOrAssignVariable( name, value ); } -} - -template {}, bool>::type> -inline void RenderParameters::addParameter( const std::string& name, const T& value ) { - m_parameterSets.insertOrAssignVariable( name, value ); -} - -template ::value, bool>::type> -inline void RenderParameters::addParameter( const std::string& name, T* tex, int texUnit ) { - addParameter( name, TextureInfo { tex, texUnit } ); -} - -inline void RenderParameters::addParameter( const std::string& name, RenderParameters& value ) { - m_parameterSets.insertOrAssignVariable( name, std::ref( value ) ); -} - -inline void RenderParameters::addParameter( const std::string& name, - const RenderParameters& value ) { - m_parameterSets.insertOrAssignVariable( name, std::cref( value ) ); -} - -template -bool RenderParameters::removeParameter( const std::string& name ) { - return m_parameterSets.deleteVariable( name ); -} - -template -inline const RenderParameters::UniformBindableSet& RenderParameters::getParameterSet() const { - return m_parameterSets.getAllVariables(); -} - -template -inline RenderParameters::UniformBindableSet& RenderParameters::getParameterSet() { - return m_parameterSets.getAllVariables(); -} - -template -inline Core::Utils::optional*> -RenderParameters::hasParameterSet() const { - if constexpr ( std::is_enum::value ) { - // Do not return - // m_parameterSets.existsVariableType< typename std::underlying_type< T >::type >(); - // to prevent misuse of this function. The user should infer this with another logic. - return {}; - } - else { return m_parameterSets.existsVariableType(); } -} - -template -inline Core::Utils::optional> -RenderParameters::containsParameter( const std::string& name ) const { - if constexpr ( std::is_enum::value ) { - return m_parameterSets.existsVariable::type>( name ); - } - else { return m_parameterSets.existsVariable( name ); } -} - -template -inline const T& RenderParameters::getParameter( const std::string& name ) const { - if constexpr ( std::is_enum::value ) { - // need to cast to take into account the way enums are managed in the RenderParameters - return reinterpret_cast( - m_parameterSets.getVariable::type>( name ) ); - } - else { return m_parameterSets.getVariable( name ); } -} - -template -inline T& RenderParameters::getParameter( const std::string& name ) { - return const_cast( const_cast( this )->getParameter( name ) ); -} - -template -inline void RenderParameters::visit( V&& visitor ) const { - m_parameterSets.visit( visitor ); -} - -template -inline void RenderParameters::visit( V&& visitor, T& userParams ) const { - m_parameterSets.visit( visitor, std::forward( userParams ) ); -} - -template -inline void RenderParameters::visit( V&& visitor, T&& userParams ) const { - m_parameterSets.visit( visitor, std::forward( userParams ) ); -} - } // namespace Data } // namespace Engine } // namespace Ra diff --git a/src/Engine/Data/ShaderConfigFactory.hpp b/src/Engine/Data/ShaderConfigFactory.hpp index 8afb62052a6..5d5007fa693 100644 --- a/src/Engine/Data/ShaderConfigFactory.hpp +++ b/src/Engine/Data/ShaderConfigFactory.hpp @@ -16,22 +16,22 @@ namespace Data { namespace ShaderConfigurationFactory { /** * Add a configuration to the factory - * @note In case of name collision, the configuration is not added to the factory - * @param config + * \note In case of name collision, the configuration is not added to the factory + * \param config */ RA_ENGINE_API void addConfiguration( const Data::ShaderConfiguration& config ); /** * Remove a configuration from the factory - * @param config - * @return true if the configuration was found and removed, else false + * \param config + * \return true if the configuration was found and removed, else false */ RA_ENGINE_API bool removeConfiguration( const std::string& configName ); /** * Get a configuration from the factory - * @param name The configuration to get - * @return The configuration if it exists, std::nullopt otherwise + * \param name The configuration to get + * \return The configuration if it exists, std::nullopt otherwise */ RA_ENGINE_API Core::Utils::optional getConfiguration( const std::string& name ); diff --git a/src/Engine/Data/ShaderConfiguration.hpp b/src/Engine/Data/ShaderConfiguration.hpp index 5de13c94223..f47c6355ce2 100644 --- a/src/Engine/Data/ShaderConfiguration.hpp +++ b/src/Engine/Data/ShaderConfiguration.hpp @@ -52,7 +52,7 @@ enum ShaderType : uint { * shader->bind(); * ... * - * @todo : make configuration and program (in the OpenGL sense) be packed. A shader + * \todo : make configuration and program (in the OpenGL sense) be packed. A shader * configuration might contains a ShaderProgram after compiling. This will remove the need for * ShaderConfigurationFactory as ShaderManager will offer the same services. Actually, there is * redundancy between ShaderConfigurationFactory and ShaderProgramManager @@ -81,8 +81,8 @@ class RA_ENGINE_API ShaderConfiguration final /** Add a shader, from a file, given its type * - * @param type the Type of the shader - * @param name the file to load + * \param type the Type of the shader + * \param name the file to load */ void addShader( ShaderType type, const std::string& name ); @@ -90,8 +90,8 @@ class RA_ENGINE_API ShaderConfiguration final * When a shader is added from a glsl source string, when reloading programs, * only the parts coming from files are reloaded. * - * @param type - * @param source the source code of the shader + * \param type + * \param source the source code of the shader */ void addShaderSource( ShaderType type, const std::string& source ); diff --git a/src/Engine/Data/ShaderProgram.hpp b/src/Engine/Data/ShaderProgram.hpp index f52e29cd537..0b7cf937a9e 100644 --- a/src/Engine/Data/ShaderProgram.hpp +++ b/src/Engine/Data/ShaderProgram.hpp @@ -28,7 +28,7 @@ class Texture; /** * Abstraction of OpenGL Shader Program - * @see globjects::Program and https://www.khronos.org/opengl/wiki/Shader + * \see globjects::Program and https://www.khronos.org/opengl/wiki/Shader * */ class RA_ENGINE_API ShaderProgram final @@ -52,10 +52,15 @@ class RA_ENGINE_API ShaderProgram final void setUniform( const char* name, const T& value ) const; void setUniform( const char* name, Texture* tex, int texUnit ) const; + template + void setUniform( gl::GLint location, const T& value ) const { + m_program->setUniform( location, value ); + } + //! use automatic texture unit computation //! if you want to send a particular texture unit, use setUniform. //! It binds tex on an "arbitrary" tex unit. - //! @warning, call a std::map::find (in O(log(active tex unit in the shader))) + //! \warning, call a std::map::find (in O(log(active tex unit in the shader))) void setUniformTexture( const char* name, Texture* tex ) const; globjects::Program* getProgramObject() const; diff --git a/src/Engine/Data/ShaderProgramManager.hpp b/src/Engine/Data/ShaderProgramManager.hpp index df140eb0b3b..b064ad4f440 100644 --- a/src/Engine/Data/ShaderProgramManager.hpp +++ b/src/Engine/Data/ShaderProgramManager.hpp @@ -29,7 +29,7 @@ class ShaderConfiguration; * configuration, there is only one ShaderProgram instance in the system. * * This manager is a singleton. At the creation of the singleton, one can give parameters that will - * define the default shader programm example : Engine::ShaderProgramManager::createInstance( + * define the default shader program example : Engine::ShaderProgramManager::createInstance( * "Shaders/Default.vert.glsl", "Shaders/Default.frag.glsl" ); * */ @@ -49,25 +49,25 @@ class RA_ENGINE_API ShaderProgramManager final * The shader sources corresponding to the configuration will be compiled, linked and verified. * * - * @param config the configuration of the programm to add to the collection - * @return the created shader program. In case of compile/link/verify error, return false - * @note ownership on the returned pointer is keep by the manager. - * @warning this method is *not* reentrant + * \param config the configuration of the program to add to the collection + * \return the created shader program. In case of compile/link/verify error, return false + * \note ownership on the returned pointer is keep by the manager. + * \warning this method is *not* reentrant */ Core::Utils::optional addShaderProgram( const Data::ShaderConfiguration& config ); /** - * Get the shader programm corresponding to the given id - * @param id Name of the programm to retrieve - * @return the shader programm retrieved, nullptr if the program was not in the collection + * Get the shader program corresponding to the given id + * \param id Name of the program to retrieve + * \return the shader program retrieved, nullptr if the program was not in the collection */ const Data::ShaderProgram* getShaderProgram( const std::string& id ); /** - * Get the shader programm corresponding to the given configuration - * @param config Name of the programm to retrieve - * @return the shader programm retrieved, or nullptr when no shader programm corresponding to + * Get the shader program corresponding to the given configuration + * \param config Name of the program to retrieve + * \return the shader program retrieved, or nullptr when no shader program corresponding to * the configuration is found. */ const Data::ShaderProgram* getShaderProgram( const Data::ShaderConfiguration& config ); @@ -79,8 +79,8 @@ class RA_ENGINE_API ShaderProgramManager final void reloadAllShaderPrograms(); /** * Programs that did not compiled are temporarilly stored and could be reloaded and compiled - * when one call this method. If the reloaded programm is ok, it is removed from the set of not - * compiled program and added to the programm collection. + * when one call this method. If the reloaded program is ok, it is removed from the set of not + * compiled program and added to the program collection. */ void reloadNotCompiledShaderPrograms(); @@ -88,9 +88,9 @@ class RA_ENGINE_API ShaderProgramManager final * Allows to define named string so that the inclusion mechanism of OpenGL could be efficient. * A name string associates the name that will be used by a \#define directive in a glsl source * file with a file that contains the included glsl source code. - * @param includepath - * @param realfile - * @return false if the string already exists. Print an error message + * \param includepath + * \param realfile + * \return false if the string already exists. Print an error message */ bool addNamedString( const std::string& includepath, const std::string& realfile ); diff --git a/src/Engine/Data/SimpleMaterial.cpp b/src/Engine/Data/SimpleMaterial.cpp index be031fcda5a..70cf18b2d5f 100644 --- a/src/Engine/Data/SimpleMaterial.cpp +++ b/src/Engine/Data/SimpleMaterial.cpp @@ -12,37 +12,24 @@ SimpleMaterial::SimpleMaterial( const std::string& instanceName, MaterialAspect aspect ) : Material( instanceName, materialName, aspect ) {} -SimpleMaterial::~SimpleMaterial() { - m_textures.clear(); -} - void SimpleMaterial::updateRenderingParameters() { auto& renderParameters = getParameters(); // update the rendering paramaters - renderParameters.addParameter( "material.color", m_color ); - renderParameters.addParameter( "material.perVertexColor", m_perVertexColor ); + renderParameters.setVariable( "material.color", m_color ); + renderParameters.setVariable( "material.perVertexColor", m_perVertexColor ); Texture* tex = getTexture( SimpleMaterial::TextureSemantic::TEX_COLOR ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.color", tex ); } - renderParameters.addParameter( "material.tex.hasColor", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.color", tex ); } + renderParameters.setVariable( "material.tex.hasColor", tex != nullptr ); tex = getTexture( SimpleMaterial::TextureSemantic::TEX_MASK ); - if ( tex != nullptr ) { renderParameters.addParameter( "material.tex.mask", tex ); } - renderParameters.addParameter( "material.tex.hasMask", tex != nullptr ); + if ( tex != nullptr ) { renderParameters.setTexture( "material.tex.mask", tex ); } + renderParameters.setVariable( "material.tex.hasMask", tex != nullptr ); } void SimpleMaterial::updateGL() { - if ( !m_isDirty ) { return; } - // Load textures - Data::TextureManager* texManager = RadiumEngine::getInstance()->getTextureManager(); - for ( const auto& tex : m_pendingTextures ) { - // ask to convert color textures from sRGB to Linear RGB - bool tolinear = ( tex.first == TextureSemantic::TEX_COLOR ); - auto texture = texManager->getOrLoadTexture( tex.second, tolinear ); - m_textures[tex.first] = texture; - } - // as all the pending textures where initialized, clear the pending textures list - m_pendingTextures.clear(); - m_isDirty = false; + if ( !isDirty() ) { return; } + updateRenderingParameters(); + setClean(); } void SimpleMaterial::loadMetaData( nlohmann::json& destination ) { diff --git a/src/Engine/Data/SimpleMaterial.hpp b/src/Engine/Data/SimpleMaterial.hpp index 02a273d386a..c644d500577 100644 --- a/src/Engine/Data/SimpleMaterial.hpp +++ b/src/Engine/Data/SimpleMaterial.hpp @@ -2,137 +2,77 @@ #include -#include -#include - #include #include #include +#include + namespace Ra { namespace Engine { namespace Data { -/** - * Base implementation for simple, monocolored, materials. + +/** \brief Namespace to define materials' texture semantics. + * + * The semantic of the texture defines which BSDF parameter is controled by the texture + * Convention: add you're material's MyMaterial Enum inside TextureSemantics namespace. + */ +namespace TextureSemantics { +///\brief SimpleMaterial's textures. +enum class SimpleMaterial { TEX_COLOR, TEX_MASK }; +} // namespace TextureSemantics + +/** \brief Base implementation for simple, monocolored, materials. + * * This material could not be used as is. Only derived class could be used by a renderer. */ -class RA_ENGINE_API SimpleMaterial : public Material, public ParameterSetEditingInterface +class RA_ENGINE_API SimpleMaterial : public Material, + public ParameterSetEditingInterface, + public MaterialTextureSet { public: - /// Semantic of the texture : define which BSDF parameter is controled by the texture - enum class TextureSemantic { TEX_COLOR, TEX_MASK }; - - /** - * Construct a named material - * @param name The name of the material + using TextureSemantic = TextureSemantics::SimpleMaterial; + /** \brief Construct a named material + * \param name The name of the material */ explicit SimpleMaterial( const std::string& instanceName, const std::string& materialName, MaterialAspect aspect = MaterialAspect::MAT_OPAQUE ); - /** - * Destructor. - * @note The material does not have ownership on its texture. - * This destructor do not delete the associated textures. - */ - ~SimpleMaterial() override; - - /** - * Update the openGL state of the material. + /** \brief Update the openGL state of the material. + * * This state only consists on associated textures. */ void updateGL() override final; - /** - * Add an new texture, from a TextureParameters, to control the specified BSDF parameter. - * The textures will be finalized (i.e loaded from a file if needed and transformed to OpenGL - * texture) only when needed by the updateGL method. - * @param semantic The texture semantic - * @param texture The texture to use (Descriptor of the texture by its parameters) - * @return the corresponding TextureData struct - */ - inline TextureParameters& addTexture( const TextureSemantic& semantic, - const TextureParameters& texture ); - - /** - * Add an already existing texture to control the specified BSDF parameter. - * @param semantic The texture semantic - * @param texture The texture to use - */ - inline void addTexture( const TextureSemantic& semantic, Texture* texture ); + inline void setColoredByVertexAttrib( bool state ) override; - /** - * Get the texture associated to the given semantic. - * @param semantic - * @return - */ - inline Texture* getTexture( const TextureSemantic& semantic ) const; + inline bool isColoredByVertexAttrib() const override { return m_perVertexColor; } - inline void setColoredByVertexAttrib( bool state ) override; + inline void setColor( Core::Utils::Color c ) { + m_color = std::move( c ); + needUpdate(); + } - inline bool isColoredByVertexAttrib() const override; + protected: + /// Load the material parameter description + static void loadMetaData( nlohmann::json& destination ); - public: + private: + /** \brief Update the rendering parameters for the Material + */ + void updateRenderingParameters(); /// The base color of the material Core::Utils::Color m_color { 0.9, 0.9, 0.9, 1.0 }; /// Indicates if the material will takes its base color from vertices' attributes. - /// \todo make this private ? bool m_perVertexColor { false }; - - private: - /** - * Update the rendering parameters for the Material - */ - void updateRenderingParameters(); - - /** - * The openGL initialized textures. - */ - std::map m_textures; - /** - * The textures that are associated with the material but ar not yet loaded nor initialized. - */ - std::map m_pendingTextures; - - protected: - /// Load the material parameter description - static void loadMetaData( nlohmann::json& destination ); }; -// Add a texture as material parameter from an already existing Radium Texture -inline void SimpleMaterial::addTexture( const TextureSemantic& semantic, Texture* texture ) { - m_textures[semantic] = texture; - // remove pendingTexture with same semantic, since the latter would - // overwrite the former when updateGL will be called. - m_pendingTextures.erase( semantic ); -} - -// Add a texture as material parameter with texture parameter set by the caller -inline TextureParameters& SimpleMaterial::addTexture( const TextureSemantic& semantic, - const TextureParameters& texture ) { - m_pendingTextures[semantic] = texture; - m_isDirty = true; - - return m_pendingTextures[semantic]; -} - -inline Texture* SimpleMaterial::getTexture( const TextureSemantic& semantic ) const { - Texture* tex = nullptr; - - auto it = m_textures.find( semantic ); - if ( it != m_textures.end() ) { tex = it->second; } - - return tex; -} - inline void SimpleMaterial::setColoredByVertexAttrib( bool state ) { - bool oldState = m_perVertexColor; - m_perVertexColor = state; - if ( oldState != m_perVertexColor ) { needUpdate(); } -} - -inline bool SimpleMaterial::isColoredByVertexAttrib() const { - return m_perVertexColor; + if ( state != m_perVertexColor ) { + m_perVertexColor = state; + needUpdate(); + } } } // namespace Data diff --git a/src/Engine/Data/Texture.cpp b/src/Engine/Data/Texture.cpp index 67e803006f3..ad7d76a45d5 100644 --- a/src/Engine/Data/Texture.cpp +++ b/src/Engine/Data/Texture.cpp @@ -1,9 +1,11 @@ + #include #include #include #include #include +#include #include #include @@ -14,41 +16,141 @@ namespace Data { using namespace Core::Utils; // log Texture::Texture( const TextureParameters& texParameters ) : - m_textureParameters { texParameters }, - m_texture { nullptr }, - m_isMipMapped { false }, - m_isLinear { false } {} + m_textureParameters { texParameters }, m_texture { nullptr }, m_isMipMapped { false } {} + +class DeleteTextureTask : public Core::Task +{ + public: + explicit DeleteTextureTask( std::unique_ptr texture ) : + m_texture( std::move( texture ) ) {} + + /// Return the name of the task. + std::string getName() const override { return "DeleteTextureTask"; }; + + /// Do the task job. Will be called from the task queue threads. + virtual void process() override { + m_texture->detach(); + m_texture.reset(); + }; + + private: + std::unique_ptr m_texture; +}; Texture::~Texture() { - if ( m_updateDataTaskId.isValid() ) { - RadiumEngine::getInstance()->removeGpuTask( m_updateDataTaskId ); + if ( m_updateImageTaskId.isValid() ) { + RadiumEngine::getInstance()->removeGpuTask( m_updateImageTaskId ); } -} -void Texture::initializeGL( bool linearize ) { - if ( ( m_textureParameters.target != GL_TEXTURE_1D ) && - ( m_textureParameters.target != GL_TEXTURE_2D ) && - ( m_textureParameters.target != GL_TEXTURE_RECTANGLE ) && - ( m_textureParameters.target != GL_TEXTURE_3D ) && - ( m_textureParameters.target != GL_TEXTURE_CUBE_MAP ) ) { - LOG( logERROR ) << "Texture of type " << m_textureParameters.target - << " must be generated explicitly!"; - return; + if ( m_updateSamplerTaskId.isValid() ) { + RadiumEngine::getInstance()->removeGpuTask( m_updateSamplerTaskId ); } + + // register delayed destroy gpu texture task + destroy(); +} + +void Texture::initialize() { + if ( !isSupportedTarget() ) return; // Transform texels if needed - if ( linearize ) { + + computeIsMipMappedFlag(); + + // Update the sampler parameters + registerUpdateSamplerParametersTask(); + + // upload texture to the GPU + registerUpdateImageDataTask(); +} + +void Texture::initializeNow() { + if ( !isSupportedTarget() ) return; + computeIsMipMappedFlag(); + + createTexture(); + sendSamplerParametersToGpu(); + sendImageDataToGpu(); +} + +void Texture::destroy() { + if ( m_texture ) { + // if engine is still available + if ( auto engine = RadiumEngine::getInstance() ) { + auto task = std::make_unique( std::move( m_texture ) ); + engine->addGpuTask( std::move( task ) ); + } + // else gpu representation will not be cleaned by the application. + m_texture.reset(); + } +} + +void Texture::destroyNow() { + m_texture->detach(); + m_texture.reset(); +} + +void Texture::updateData( std::shared_ptr newData ) { + // register gpu task to update opengl representation before next rendering + std::lock_guard lock( m_updateMutex ); + m_textureParameters.image.texels = newData; + registerUpdateImageDataTask(); +} + +void Texture::resize( size_t w, size_t h, size_t d, std::shared_ptr pix ) { + m_textureParameters.image.width = w; + m_textureParameters.image.height = h; + m_textureParameters.image.depth = d; + m_textureParameters.image.texels = pix; + if ( createTexture() ) { + computeIsMipMappedFlag(); + sendSamplerParametersToGpu(); + sendImageDataToGpu(); + } + else { sendImageDataToGpu(); } +} + +void Texture::setParameters( const TextureParameters& textureParameters ) { + setSamplerParameters( textureParameters.sampler ); + setImageParameters( textureParameters.image ); +} + +void Texture::setImageParameters( const ImageParameters& imageParameters ) { + std::lock_guard lock( m_updateMutex ); + m_textureParameters.image = imageParameters; + registerUpdateImageDataTask(); +} + +void Texture::setSamplerParameters( const SamplerParameters& samplerParameters ) { + std::lock_guard lock( m_updateMutex ); + m_textureParameters.sampler = samplerParameters; + registerUpdateSamplerParametersTask(); +} + +void Texture::bind( int unit ) { + if ( unit >= 0 ) { m_texture->bindActive( uint( unit ) ); } + else { m_texture->bind(); } +} + +void Texture::bindImageTexture( int unit, + GLint level, + GLboolean layered, + GLint layer, + GLenum access ) { + m_texture->bindImageTexture( + uint( unit ), level, layered, layer, access, m_textureParameters.image.internalFormat ); +} + +void Texture::linearize( ImageParameters& image ) { + if ( !image.isLinear ) { + // Only RGB and RGBA texture contains color information + // (others are not really colors and must be managed explicitly by the user) uint numComp = 0; bool hasAlpha = false; - switch ( m_textureParameters.format ) { - // RED and RG texture store a gray scale color. Verify if we need to convert + switch ( image.format ) { + // RED texture store a gray scale color. Verify if we need to convert case GL_RED: numComp = 1; break; - case GL_RG: - // corresponds to deprecated GL_LUMINANCE_ALPHA - numComp = 2; - hasAlpha = true; - break; case GL_RGB: numComp = 3; break; @@ -57,278 +159,222 @@ void Texture::initializeGL( bool linearize ) { hasAlpha = true; break; default: - LOG( logERROR ) << "Textures with format " << m_textureParameters.format - << " can't be linearized." << m_textureParameters.name; + LOG( logERROR ) << "Textures with format " << image.format << " can't be linearized.\n"; return; } - if ( m_textureParameters.target == GL_TEXTURE_CUBE_MAP ) { - linearizeCubeMap( numComp, hasAlpha ); - } + if ( image.type == GL_TEXTURE_CUBE_MAP ) { linearizeCubeMap( image, numComp, hasAlpha ); } else { - // This will only do do the RGB space conversion - sRGBToLinearRGB( - reinterpret_cast( m_textureParameters.texels ), numComp, hasAlpha ); + srgbToLinearRgb( reinterpret_cast( std::get<0>( image.texels ).get() ), + image.width, + image.height, + image.depth, + numComp, + hasAlpha ); } + image.isLinear = true; } - // Generate OpenGL texture +} + +bool Texture::isSupportedTarget() { + if ( ( m_textureParameters.image.target != GL_TEXTURE_1D ) && + ( m_textureParameters.image.target != GL_TEXTURE_2D ) && + ( m_textureParameters.image.target != GL_TEXTURE_RECTANGLE ) && + ( m_textureParameters.image.target != GL_TEXTURE_3D ) && + ( m_textureParameters.image.target != GL_TEXTURE_CUBE_MAP ) ) { + LOG( logERROR ) << "Texture of type " << m_textureParameters.image.target + << " must be generated explicitly!"; + return false; + } + return true; +} + +void Texture::computeIsMipMappedFlag() { + m_isMipMapped = !( m_textureParameters.sampler.minFilter == GL_NEAREST || + m_textureParameters.sampler.minFilter == GL_LINEAR ); +} + +bool Texture::createTexture() { if ( m_texture == nullptr ) { - m_texture = globjects::Texture::create( m_textureParameters.target ); + m_texture = globjects::Texture::create( m_textureParameters.image.target ); GL_CHECK_ERROR; + return true; } - // Update the sampler parameters - m_isMipMapped = !( m_textureParameters.minFilter == GL_NEAREST || - m_textureParameters.minFilter == GL_LINEAR ); - updateParameters(); - // upload texture to the GPU - updateGL(); - // Generate mip-map if needed. - if ( m_isMipMapped ) { m_texture->generateMipmap(); } + return false; } -void Texture::bind( int unit ) { - if ( unit >= 0 ) { m_texture->bindActive( uint( unit ) ); } - else { m_texture->bind(); } +void Texture::registerUpdateImageDataTask() { + // register gpu task to update opengl representation before next rendering + if ( m_updateImageTaskId.isInvalid() ) { + auto taskFunc = [this]() { + std::lock_guard taskLock( m_updateMutex ); + // Generate OpenGL texture + this->createTexture(); + this->sendImageDataToGpu(); + m_updateImageTaskId = Core::TaskQueue::TaskId::Invalid(); + }; + auto task = std::make_unique( taskFunc, getName() ); + m_updateImageTaskId = RadiumEngine::getInstance()->addGpuTask( std::move( task ) ); + } } -void Texture::bindImageTexture( int unit, - GLint level, - GLboolean layered, - GLint layer, - GLenum access ) { - m_texture->bindImageTexture( - uint( unit ), level, layered, layer, access, m_textureParameters.internalFormat ); +void Texture::registerUpdateSamplerParametersTask() { + if ( m_updateSamplerTaskId.isInvalid() ) { + auto taskFunc = [this]() { + std::lock_guard taskLock( m_updateMutex ); + // Generate OpenGL texture + this->createTexture(); + this->sendSamplerParametersToGpu(); + m_updateSamplerTaskId = Core::TaskQueue::TaskId::Invalid(); + }; + auto task = std::make_unique( taskFunc, getName() ); + m_updateSamplerTaskId = RadiumEngine::getInstance()->addGpuTask( std::move( task ) ); + } } -void Texture::updateGL() { +void Texture::sendImageDataToGpu() { CORE_ASSERT( m_texture != nullptr, "Cannot update non initialized texture" ); switch ( m_texture->target() ) { case GL_TEXTURE_1D: { m_texture->image1D( 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), + m_textureParameters.image.internalFormat, + GLsizei( m_textureParameters.image.width ), 0, - m_textureParameters.format, - m_textureParameters.type, - m_textureParameters.texels ); + m_textureParameters.image.format, + m_textureParameters.image.type, + getTexels() ); GL_CHECK_ERROR } break; case GL_TEXTURE_2D: case GL_TEXTURE_RECTANGLE: { m_texture->image2D( 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), + m_textureParameters.image.internalFormat, + GLsizei( m_textureParameters.image.width ), + GLsizei( m_textureParameters.image.height ), 0, - m_textureParameters.format, - m_textureParameters.type, - m_textureParameters.texels ); + m_textureParameters.image.format, + m_textureParameters.image.type, + getTexels() ); GL_CHECK_ERROR } break; case GL_TEXTURE_3D: { m_texture->image3D( 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - GLsizei( m_textureParameters.depth ), + m_textureParameters.image.internalFormat, + GLsizei( m_textureParameters.image.width ), + GLsizei( m_textureParameters.image.height ), + GLsizei( m_textureParameters.image.depth ), 0, - m_textureParameters.format, - m_textureParameters.type, - m_textureParameters.texels ); + m_textureParameters.image.format, + m_textureParameters.image.type, + getTexels() ); GL_CHECK_ERROR } break; case GL_TEXTURE_CUBE_MAP: { // Load the 6 faces of the cube-map - static const void* nullTexels[6] { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; - auto texels = m_textureParameters.texels != nullptr - ? (const void**)m_textureParameters.texels - : nullTexels; - - m_texture->bind(); - // track globjects updates that will hopefully support direct loading of - // cube-maps https://github.com/cginternals/globjects/issues/368 - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_POSITIVE_X, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[0] ); - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[1] ); - - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[2] ); - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[3] ); - - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[4] ); - gl::glTexImage2D( gl::GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, - 0, - m_textureParameters.internalFormat, - GLsizei( m_textureParameters.width ), - GLsizei( m_textureParameters.height ), - 0, - m_textureParameters.format, - m_textureParameters.type, - texels[5] ); - - m_texture->unbind(); + auto cubeMap = m_textureParameters.image.getCubeMap(); + + std::array data; + std::transform( std::begin( cubeMap ), + std::end( cubeMap ), + std::begin( data ), + []( const std::shared_ptr& val ) { return val.get(); } ); + + m_texture->cubeMapImage( 0, + m_textureParameters.image.internalFormat, + GLsizei( m_textureParameters.image.width ), + GLsizei( m_textureParameters.image.height ), + 0, + m_textureParameters.image.format, + m_textureParameters.image.type, + data ); + GL_CHECK_ERROR } break; default: { CORE_ASSERT( 0, "Unsupported texture type ?" ); } break; } + // Generate mip-map if needed. + if ( m_isMipMapped ) { m_texture->generateMipmap(); } + GL_CHECK_ERROR; } -void Texture::updateData( void* newData ) { - // register gpu task to update opengl representation before next rendering - std::lock_guard lock( m_updateMutex ); - - m_textureParameters.texels = newData; +void Texture::readFromGpu( int level ) { + CORE_ASSERT( m_texture != nullptr, "Cannot get non initialized texture" ); + CORE_ASSERT( m_textureParameters.image.isTexelOfType(), + "Can only get image typf" ); + CORE_ASSERT( m_textureParameters.image.getTexels() != nullptr, "Can only get image type" ); + CORE_ASSERT( GL_TEXTURE_CUBE_MAP != m_texture->target(), "Cannot get cube map" ); - if ( m_updateDataTaskId.isInvalid() ) { - auto taskFunc = [this]() { - std::lock_guard taskLock( m_updateMutex ); - this->updateGL(); - m_updateDataTaskId = Core::TaskQueue::TaskId::Invalid(); - }; - auto task = std::make_unique( taskFunc, getName() ); - m_updateDataTaskId = RadiumEngine::getInstance()->addGpuTask( std::move( task ) ); - } + m_texture->getImage( level, + m_textureParameters.image.format, + m_textureParameters.image.type, + m_textureParameters.image.getImage().get() ); } // let the compiler warn about case fallthrough -void Texture::updateParameters() { +void Texture::sendSamplerParametersToGpu() { switch ( m_texture->target() ) { case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_3D: - m_texture->setParameter( GL_TEXTURE_WRAP_R, m_textureParameters.wrapP ); + m_texture->setParameter( GL_TEXTURE_WRAP_R, m_textureParameters.sampler.wrapR ); GL_CHECK_ERROR; [[fallthrough]]; case GL_TEXTURE_2D: case GL_TEXTURE_RECTANGLE: - m_texture->setParameter( GL_TEXTURE_WRAP_T, m_textureParameters.wrapT ); + m_texture->setParameter( GL_TEXTURE_WRAP_T, m_textureParameters.sampler.wrapT ); GL_CHECK_ERROR; [[fallthrough]]; case GL_TEXTURE_1D: - m_texture->setParameter( GL_TEXTURE_WRAP_S, m_textureParameters.wrapS ); + m_texture->setParameter( GL_TEXTURE_WRAP_S, m_textureParameters.sampler.wrapS ); GL_CHECK_ERROR; break; default: break; } - m_texture->setParameter( GL_TEXTURE_MIN_FILTER, m_textureParameters.minFilter ); + m_texture->setParameter( GL_TEXTURE_MIN_FILTER, m_textureParameters.sampler.minFilter ); GL_CHECK_ERROR; - m_texture->setParameter( GL_TEXTURE_MAG_FILTER, m_textureParameters.magFilter ); + m_texture->setParameter( GL_TEXTURE_MAG_FILTER, m_textureParameters.sampler.magFilter ); GL_CHECK_ERROR; } -void Texture::linearize() { - if ( m_texture != nullptr ) { - LOG( logERROR ) << "Only non OpenGL initialized texture can be linearized."; - return; - } - // Only RGB and RGBA texture contains color information - // (others are not really colors and must be managed explicitly by the user) - uint numComp = 0; - bool hasAlpha = false; - switch ( m_textureParameters.format ) { - // RED texture store a gray scale color. Verify if we need to convert - case GL_RED: - numComp = 1; - break; - case GL_RGB: - numComp = 3; - break; - case GL_RGBA: - numComp = 4; - hasAlpha = true; - break; - default: - LOG( logERROR ) << "Textures with format " << m_textureParameters.format - << " can't be linearized." << m_textureParameters.name; - return; - } - sRGBToLinearRGB( reinterpret_cast( m_textureParameters.texels ), numComp, hasAlpha ); -} - -void Texture::sRGBToLinearRGB( uint8_t* texels, uint numComponent, bool hasAlphaChannel ) { - std::lock_guard lock( m_updateMutex ); - if ( !m_isLinear ) { - m_isLinear = true; - // auto linearize = [gamma](float in)-> float { - auto linearize = []( uint8_t in ) -> uint8_t { - // Constants are described at https://en.wikipedia.org/wiki/SRGB - float c = float( in ) / 255; - if ( c < 0.04045 ) { c = c / 12.92f; } - else { c = std::pow( ( ( c + 0.055f ) / ( 1.055f ) ), 2.4f ); } - return uint8_t( c * 255 ); - }; - uint numValues = hasAlphaChannel ? numComponent - 1 : numComponent; +/// \todo template by texels type +void Texture::srgbToLinearRgb( uint8_t* texels, + uint width, + uint height, + uint depth, + uint numComponent, + bool hasAlphaChannel ) { + // auto linearize = [gamma](float in)-> float { + auto linearize = []( uint8_t in ) -> uint8_t { + // Constants are described at https://en.wikipedia.org/wiki/SRGB + float c = float( in ) / 255; + if ( c < 0.04045 ) { c = c / 12.92f; } + else { c = std::pow( ( ( c + 0.055f ) / ( 1.055f ) ), 2.4f ); } + return uint8_t( c * 255 ); + }; + uint numValues = hasAlphaChannel ? numComponent - 1 : numComponent; #pragma omp parallel for - for ( int i = 0; i < int( m_textureParameters.width * m_textureParameters.height * - m_textureParameters.depth ); - ++i ) { - // Convert each R or RGB value while keeping alpha unchanged - for ( uint p = i * numComponent; p < i * numComponent + numValues; ++p ) { - texels[p] = linearize( texels[p] ); - } + for ( int i = 0; i < int( width * height * depth ); ++i ) { + // Convert each R or RGB value while keeping alpha unchanged + for ( uint p = i * numComponent; p < i * numComponent + numValues; ++p ) { + texels[p] = linearize( texels[p] ); } } } -void Texture::resize( size_t w, size_t h, size_t d, void* pix ) { - m_textureParameters.width = w; - m_textureParameters.height = h; - m_textureParameters.depth = d; - m_textureParameters.texels = pix; - if ( m_texture == nullptr ) { initializeGL( false ); } - else { updateGL(); } - if ( m_isMipMapped ) { m_texture->generateMipmap(); } -} - -void Texture::linearizeCubeMap( uint numComponent, bool hasAlphaChannel ) { - if ( m_textureParameters.type == gl::GLenum::GL_UNSIGNED_BYTE ) { +void Texture::linearizeCubeMap( ImageParameters& image, uint numComponent, bool hasAlphaChannel ) { + if ( image.type == gl::GLenum::GL_UNSIGNED_BYTE ) { /// Only unsigned byte texture could be linearized. Considering other formats where /// already linear + const auto cubeMap = image.getCubeMap(); for ( int i = 0; i < 6; ++i ) { - sRGBToLinearRGB( - reinterpret_cast( ( (void**)m_textureParameters.texels )[i] ), - numComponent, - hasAlphaChannel ); + srgbToLinearRgb( reinterpret_cast( cubeMap[i].get() ), + image.width, + image.height, + image.depth, + numComponent, + hasAlphaChannel ); } } } diff --git a/src/Engine/Data/Texture.hpp b/src/Engine/Data/Texture.hpp index bea364fa7bc..831e61c2783 100644 --- a/src/Engine/Data/Texture.hpp +++ b/src/Engine/Data/Texture.hpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace globjects { class Texture; @@ -16,257 +17,323 @@ class Texture; namespace Ra { namespace Engine { namespace Data { -/** - * Describes the content and parameters of a texture. - * This structures encapsulates all the states used for creating an OpenGL texture. - * These parameters describe the image data of the texture : - * - target, width, height, depth, format, internalFormat, type and texels for describing image - * data - * - wrapS, wrapT, wrapP, minFilter and magFilter for describing the sampler of the texture. - * - * When one wants to create a texture, the first thing to do is to create and fill a Texture - * parameter structure that will describe the Texture. - * - * The Texture creation could be done either using the TextureManager or directly on the client - * class/function. - * - * When a texture is created, no OpenGL initialisation is realized. The user must first call - * initializeGL before being able to use this texture in an OpenGL operation. - * - * MipMap representation of the texture is automatically generated as soon as the minFilter - * parameter is something else than GL_LINEAR or GL_NEAREST - * - * @note No coherence checking will be done on the content of this structure. User must ensure - * coherent data and parameters before creating the OpenGL texture with Texture::initializeGL - */ -struct TextureParameters { - /// Name of the texture - std::string name {}; - /// OpenGL target - GLenum target { GL_TEXTURE_2D }; - /// width of the texture (s dimension) - size_t width { 1 }; - /// height of the texture (t dimension) - size_t height { 1 }; - /// width of the texture (p dimension) - size_t depth { 1 }; - /// Format of the external data - GLenum format { GL_RGB }; - /// OpenGL internal format (WARNING, for Integer textures, must be GL_XXX_INTEGER) - GLenum internalFormat { GL_RGB }; - /// Type of the components in external data - GLenum type { GL_UNSIGNED_BYTE }; + +/// GPU Sampler configuration +struct SamplerParameters { /// OpenGL wrap mode in the s direction GLenum wrapS { GL_CLAMP_TO_EDGE }; /// OpenGL wrap mode in the t direction GLenum wrapT { GL_CLAMP_TO_EDGE }; - /// OpenGL wrap mode in the p direction - GLenum wrapP { GL_CLAMP_TO_EDGE }; + /// OpenGL wrap mode in the r direction + GLenum wrapR { GL_CLAMP_TO_EDGE }; /// OpenGL minification filter ( GL_LINEAR or GL_NEAREST or GL_XXX_MIPMAP_YYY ) GLenum minFilter { GL_LINEAR }; /// OpenGL magnification filter ( GL_LINEAR or GL_NEAREST ) GLenum magFilter { GL_LINEAR }; - /// External data (ownership is left to caller, not stored after OpenGL texture creation). - /// Note that, for cube-map texture, this is considered as a "void*[6]" array containing the 6 - /// faces of the cube corresponding to the targets.
- /// texels[0] <-- GL_TEXTURE_CUBE_MAP_POSITIVE_X
- /// texels[1] <-- GL_TEXTURE_CUBE_MAP_NEGATIVE_X
- /// texels[2] <-- GL_TEXTURE_CUBE_MAP_POSITIVE_Y
- /// texels[3] <-- GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
- /// texels[4] <-- GL_TEXTURE_CUBE_MAP_POSITIVE_Z
- /// texels[5] <-- GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
- /// @todo memory allocated for this pointer might be lost at texture deletion as ownership is - /// unclear. - void* texels { nullptr }; }; -/** Represent a Texture of the engine +/// ImageParameters stores the infomation needed to upload a image to the GPU as a texture. +/// The actual data is stored as a std::variant, so this image parameter can store either a single +/// image or a cube map as an array of 6 images. The stored shared_ptr is void, and must correspond +/// to the format described by the other ImageParameters data member. +/// Its perfectly fine to have nullptr texels to represent GPU only texture. +struct ImageParameters { + /// Types for texels variant + using ImageType = std::shared_ptr; + using CubeMapType = std::array, 6>; + + /// check which type is held by texels + template + bool isTexelOfType() const { + return std::holds_alternative( texels ); + } + + ImageType getImage() const { + CORE_ASSERT( isTexelOfType(), "texture variant is not ImageType" ); + return std::get( texels ); + } + void setImage( ImageType image ) { texels = image; } + + /// get texels raw pointer + /// throws std::bad_variant_access if !isTexelOfType() + /// see std::get + const void* getTexels() const { return getImage().get(); } + + /// get cube map array of shared ptr + /// throws std::bad_variant_access if !isTexelOfType() + /// see std::get + const CubeMapType getCubeMap() const { + CORE_ASSERT( isTexelOfType(), "texture variant is not CubeMapType" ); + return std::get( texels ); + } + void setCubeMap( CubeMapType cubeMap ) { texels = cubeMap; } + + GLenum target { GL_TEXTURE_2D }; //< OpenGL target + size_t width { 1 }; //< width of the texture (s dimension) + size_t height { 1 }; //< height of the texture (t dimension) + size_t depth { 1 }; //< depth of the texture (r dimension) + GLenum format { GL_RGB }; //< Format of the external data + /// OpenGL internal format (WARNING, for Integer textures, must be GL_XXX_INTEGER) + GLenum internalFormat { GL_RGB }; + GLenum type { GL_UNSIGNED_BYTE }; //< Type of the components in external data + /// set to true when linearize texture rgb component. If true, linearize has no effect. + bool isLinear { false }; + std::variant texels { nullptr }; //< texels OR cubeMap, shared ownership +}; + +/** \brief Describes the sampler and image of a texture. + * + * These parameters describe the image data of the texture : + * - ImageParameters: target, width, height, depth, format, internalFormat, type and texels for + * describing image data + * - SampleParameters: wrapS, wrapT, wrapP, minFilter and magFilter for describing the sampler of + * the texture. + * + * MipMap representation of the texture is automatically generated as soon as the minFilter + * parameter is something else than GL_LINEAR or GL_NEAREST. + * \todo allow to use another mipmap building function than glGenerateMipmap + * + * \note No coherence checking will be done on the content of this structure. User must ensure + * coherent data and parameters. + */ +struct TextureParameters { + std::string name {}; + SamplerParameters sampler {}; + ImageParameters image {}; +}; + +/** \brief Represent a Texture of the engine. + * + * When one wants to create a texture, the first thing to do is to create and fill a + * TextureParameters to describe the Texture. + * + * The Texture creation could be done either using the TextureManager or directly on the client + * class/function. + * + * When a texture is created, no GPU initialisation is realized. The user must first call + * either initialize() to register delayed initialisation by RadiumEngine using + * RadiumEngine::runGpuTasks() or intializeNow() to peform GPU initialization directly, with an + * active bound context. * See TextureManager for information about how unique texture are defined. */ class RA_ENGINE_API Texture final { public: - /** Textures are not copyable, delete copy constructor. + /** \brief Textures are not copyable, delete copy constructor. */ Texture( const Texture& ) = delete; - /** Textures are not copyable, delete operator =. + /** \brief Textures are not copyable, delete operator =. */ void operator=( const Texture& ) = delete; - /** - * Texture constructor. No OpenGL initialization is done there. + /** \brief Texture constructor. No GPU initialization is done there. * - * @param texParameters Name of the texture + * \param texParameters Name of the texture */ explicit Texture( const TextureParameters& texParameters ); - /** - * Texture destructor. Both internal data and OpenGL stuff are deleted. + /** \brief Texture destructor. Both internal data and GPU representation are deleted. */ ~Texture(); - /** @brief Generate the OpenGL representation of the texture according to the stored - * TextureData. + /** \brief Generate the OpenGL representation of the texture according to the stored + * TextureData (delayed). * - * Need active OpenGL context. - * - * This method use the available m_textureParameters to generate and configure OpenGL - * texture. - * - * Before uploading texels to the GPU, this method will apply RGB space conversion if needed. + * This method use the stored TextureParameters to generate and configure OpenGL + * texture. It creates gpu tasks the engine will run during next draw call, so it can be called + * without active opengl context. + */ + void initialize(); + + /** \brief Generate the GPU representation of the texture right now. Need an active + * OpenGL context. * - * @param linearize (default false) : convert the texture from sRGB to Linear RGB color space - * before OpenGL initialisation - * @note This will become soon the only way to generate an Radium Engine OpenGL texture. + * see initialze() which is the same method, but delay gpu stuff to engine gpu tasks. */ - void initializeGL( bool linearize = false ); + void initializeNow(); - /** + /** \brief destroy the GPU texture representation. * - * Need active OpenGL context. + * It creates gpu tasks the engine will run during next draw call, so it can be called + * without active opengl context. + */ + void destroy(); + + /** \brief Generate the GPU representation of the texture right now. Need an active + * OpenGL context. * - * @brief Bind the texture to enable its use in a shader. - * @param unit Index of the texture to be bound. If -1 only calls glBindTexture. + * see destroy() which is the same method, but delay gpu stuff to engine gpu tasks. */ - void bind( int unit = -1 ); + void destroyNow(); + + /** \return Name of the texture. */ + inline std::string getName() const { return m_textureParameters.name; } + /** Sets the name of the texture. */ + inline void setName( const std::string& name ) { m_textureParameters.name = name; } + + /** \return the pixel format of the texture */ + GLenum getFormat() const { return m_textureParameters.image.format; } + + /** \return the width of the texture */ + size_t getWidth() const { return m_textureParameters.image.width; } + + /** \return the height of the texture */ + size_t getHeight() const { return m_textureParameters.image.height; } - /** - * \brief Bind the texture to an image unit for the purpose of reading and writing it from - * shaders. + /** \return the depth of the texture */ + size_t getDepth() const { return m_textureParameters.image.depth; } + + /** \return raw pointer to texels (or nullptr if cubeMap or no cpu side representation). */ + const void* getTexels() { return m_textureParameters.image.getTexels(); } + + /** \brief Get ptr to the managed globjects::Texture. * - * Need active OpenGL context. + * Please unsure do keep data consistent between Texture's TextureParameters and the + * globjects::Texture and prefer using Textue methods to change texture representation if + * avaiable. + * \return ptr to globjects::Texture associated with the Texture. + */ + globjects::Texture* getGpuTexture() const { return m_texture.get(); } + + /** \brief get read access to texture parameters */ + const TextureParameters& getParameters() const { return m_textureParameters; } + /** \brief read/write access to texture parameters */ + TextureParameters& getParameters() { return m_textureParameters; } + + /** \brief Update the cpu representation of data contained by the texture. * - * @note, only available since openGL 4.2, not available on MacOs - * uses m_parameters.internalFormat as format. - * see - * https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTexture.xhtml - * for documentation + * \a newData must contain the same number (of the same type) of elements than old data (not + checked). + * Element count can be obtained with getWidth() * getHeight() + * Element type can be obtained with getFormat() + * \param newData user image pointer to wrap */ - void bindImageTexture( int unit, GLint level, GLboolean layered, GLint layer, GLenum access ); + void updateData( std::shared_ptr newData ); - /** - * @return Name of the texture. + /** \brief Resize the texture. Need active OpenGL context. + * + * This allocate GPU memory to store the new resized texture and, if texels are not nullptr, + * upload the new content. + * \note If texels are not nullptr, user must ensure the texels array is correctly + * dimensioned. + * \param w width of the texture + * \param h height of the texture + * \param d depth of the texture + * \param pix the new texels array corresponding the the new texture dimension */ - inline std::string getName() const { return m_textureParameters.name; } + void resize( size_t w = 1, size_t h = 1, size_t d = 1, std::shared_ptr pix = nullptr ); - /** - * Update the cpu representation of data contained by the texture - * @param newData user image pointer to wrap, - * must contain the same number of elements than old data (no test perform). - * Texture use here existing pixel memory owned by the calling application. - * The texture does not own the pixel storage and will not free/delete that memory, - * even when the texture is destroyed. + /** \brief set TextureParameters. + * + * Call setImageParameters() and setSamplerParameters() to + * register update GPU sample task. No check is peformed to see if data need to be updated, + * gpu update is triggered inconditionnally. */ - void updateData( void* newData ); + void setParameters( const TextureParameters& textureParameters ); + /** \brief set TextureParameters.image */ + void setImageParameters( const ImageParameters& imageParameters ); + /** \brief set TerctureParameters.samples */ + void setSamplerParameters( const SamplerParameters& samplerParameters ); - /** - * Update the parameters contained by the texture. + /** \brief Bind the texture to GPU texture \a unit to enable its use in a shader. Need + * active OpenGL context. * - * Need active OpenGL context. + * \param unit Index of the texture to be bound. If -1 (default) only calls glBindTexture. + */ + void bind( int unit = -1 ); + + /** \brief Bind the texture to an image unit for the purpose of reading and writing it from + * shaders. Need active OpenGL context. * - * User first modify the public attributes corresponding to the parameter he wants to change - * the value (e.g wrap* or *Filter) and call this function to update the OpenGL texture - * state ... + * \note, only available since openGL 4.2, not available on MacOs + * uses m_parameters.internalFormat as format. + * see + * https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBindImageTexture.xhtml + * for documentation */ - void updateParameters(); + void bindImageTexture( int unit, GLint level, GLboolean layered, GLint layer, GLenum access ); - /** - * Convert a color texture from sRGB to Linear RGB spaces. + /** \brief Convert a color texture from sRGB to Linear RGB spaces. + * * This will transform the internal representation of the texture to GL_SCALAR (GL_FLOAT). * Only GL_RGB[8, 16, 16F, 32F] and GL_RGBA[8, 16, 16F, 32F] are managed. * Full transformation as described at https://en.wikipedia.org/wiki/SRGB */ - void linearize(); + static void linearize( ImageParameters& image ); - /** - * @return the pixel format of the texture - */ - GLenum format() const { return m_textureParameters.format; } - /** - * @return the width of the texture - */ - size_t width() const { return m_textureParameters.width; } - /** - * @return the height of the texture + /** \brief Regiter gpu task to RadiumEngine. Will call sendImageDataToGpu during next + * RadiumEngine::runGpuTasks() call. */ - size_t height() const { return m_textureParameters.height; } - /** - * @return the depth of the texture - */ - size_t depth() const { return m_textureParameters.depth; } + void registerUpdateImageDataTask(); - void* texels() { return m_textureParameters.texels; } - /** - * @return the globjects::Texture associated with the texture + /** \brief Regiter gpu task to RadiumEngine. Will call sendSamplerParametersToGpu during + * next RadiumEngine::runGpuTasks() call. */ - globjects::Texture* texture() const { return m_texture.get(); } + void registerUpdateSamplerParametersTask(); - /** Resize the texture. - * - * Need active OpenGL context. - * - * This allocate GPU memory to store the new resized texture and, if texels are not nullptr, - * upload the new content. - * @note : If texels are not nullptr, user must ensure the texels array is correctly - * dimensioned. - * @param w width of the texture - * @param h height of the texture - * @param d depth of the texture - * @param pix the new texels array corresponding the the new texture dimension - */ - void resize( size_t w = 1, size_t h = 1, size_t d = 1, void* pix = nullptr ); + /** \brief Send image data to the GPU and generate mipmap if needed */ + void sendImageDataToGpu(); + void readFromGpu( int level = 0 ); - /// get read access to texture parameters - const TextureParameters& getParameters() const { return m_textureParameters; } + /** \brief Send sampler parameters to the GPU */ + void sendSamplerParametersToGpu(); - /** get read/write access to texture parameters, need to update - * representation afterward, @see setParameters() + private: + /** \brief Check if the texture target is supported. + * + * Current implementation supports GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE, + * GL_TEXTURE_3D and GL_TEXTURE_CUBE_MAP. + * \return true if the target is supported by Texture implementation. */ - TextureParameters& getParameters() { return m_textureParameters; } + bool isSupportedTarget(); - /** set TextureParameters. - * If texels is changed, need to call initializeGL() to update GPU representation - * if only wrap or filter parameters are change, updateParameters() is - * sufficient to update the GPU representation. - */ - void setParameters( const TextureParameters& textureParameters ) { - std::lock_guard lock( m_updateMutex ); - m_textureParameters = textureParameters; - } + /** \brief set m_isMipMapped according to sampler.minFilter */ + void computeIsMipMappedFlag(); - private: - void updateGL(); + /** \brief Allocate gup texture representation (m_texture) if not already allocated + * (nullptr). + * + * \return true if allocation is performed. + */ + bool createTexture(); - /** - * Convert a color texture from sRGB to Linear RGB spaces. + /** \brief Convert a color texture from sRGB to Linear RGB spaces. + * * The content of the array of texels. * designated by the texel pointer is modified by side effect. * Full transformation as described at https://en.wikipedia.org/wiki/SRGB - * @param texels the array of texels to linearize - * @param numComponent number of color channels. - * @param bool hasAlphaChannel indicate if the last channel is an alpha channel. - * @param gamma the gama value to use (sRGB is 2.4) - * @note only 8 bit (GL_UNSIGNED_BYTE data format) textures are managed by this operator. + * \param texels the array of texels to linearize + * \param numComponent number of color channels. + * \param bool hasAlphaChannel indicate if the last channel is an alpha channel. + * \param gamma the gama value to use (sRGB is 2.4) + * \note only 8 bit (GL_UNSIGNED_BYTE data format) textures are managed by this operator. */ - void sRGBToLinearRGB( uint8_t* texels, uint numComponent, bool hasAlphaChannel ); + static void srgbToLinearRgb( uint8_t* texels, + uint width, + uint height, + uint depth, + uint numComponent, + bool hasAlphaChannel ); + + /** \brief Linearize a cube map by calling sRGBToLinearRGB fore each face */ + static void linearizeCubeMap( ImageParameters& image, uint numComponent, bool hasAlphaChannel ); - /// linearize a cube map by calling sRGBToLinearRGB fore each face - void linearizeCubeMap( uint numComponent, bool hasAlphaChannel ); + TextureParameters m_textureParameters; /**< Texture parameters */ + std::unique_ptr m_texture; /**< Link to glObject texture */ + bool m_isMipMapped { false }; /**< Is the texture mip-mapped ? */ - /** Texture parameters + /** \brief This task is valid when a gpu image update task is registered (e.g. after a call + * to initialize, setParameters, setImageParameters or setData). */ - TextureParameters m_textureParameters; - - /// Link to glObject texture - std::unique_ptr m_texture; - /// Is the texture mip-mapped ? - bool m_isMipMapped { false }; - /// Is the texture in LinearRGB ? - bool m_isLinear { false }; - /// is valid when a gpu update task is registered (e.g. after a call to setData) - Core::TaskQueue::TaskId m_updateDataTaskId; - /// mutex to protect non gpu setters, in a thread safe way. + Core::TaskQueue::TaskId m_updateImageTaskId; + + /** \brief This task is valid when a gpu sampler task is registered. + * e.g. after a call to initialize, setParamaters or setSamplerParamters). + */ + Core::TaskQueue::TaskId m_updateSamplerTaskId; + + /** mutex to protect non gpu setters, in a thread safe way. */ std::mutex m_updateMutex; }; } // namespace Data diff --git a/src/Engine/Data/TextureManager.cpp b/src/Engine/Data/TextureManager.cpp index 03855e3a263..0d7444b6016 100644 --- a/src/Engine/Data/TextureManager.cpp +++ b/src/Engine/Data/TextureManager.cpp @@ -3,8 +3,11 @@ #include +#include #include +#include + namespace Ra { namespace Engine { namespace Data { @@ -13,146 +16,93 @@ using namespace Core::Utils; // log TextureManager::TextureManager() = default; -TextureManager::~TextureManager() { - for ( auto& tex : m_textures ) { - delete tex.second; - } - m_textures.clear(); - m_pendingTextures.clear(); - m_pendingData.clear(); -} - -TextureParameters& -TextureManager::addTexture( const std::string& name, uint width, uint height, void* data ) { - TextureParameters texData; - texData.name = name; - texData.width = width; - texData.height = height; - texData.texels = data; +TextureManager::~TextureManager() = default; - m_pendingTextures[name] = texData; +TextureManager::TextureHandle TextureManager::addTexture( const TextureParameters& parameters ) { - return m_pendingTextures[name]; + auto texture = std::make_unique( parameters ); + TextureHandle handle; + // find first free slot in m_textures, e.g. where the stored unique_ptr is nullptr + auto it = std::find_if( + m_textures.begin(), m_textures.end(), []( const auto& texture_ ) { return !texture_; } ); + if ( it != m_textures.end() ) { + it->swap( texture ); + handle.setValue( std::distance( m_textures.begin(), it ) ); + } + else { + // if no free slot, push back a new texture + m_textures.push_back( std::move( texture ) ); + handle.setValue( m_textures.size() - 1 ); + } + m_textures[handle.getValue()]->initialize(); + return handle; } -void TextureManager::loadTextureImage( TextureParameters& texParameters ) { +ImageParameters TextureManager::loadTextureImage( const std::string& filename, bool linearize ) { stbi_set_flip_vertically_on_load( true ); int n; - unsigned char* data = stbi_load( texParameters.name.c_str(), - (int*)( &( texParameters.width ) ), - (int*)( &( texParameters.height ) ), - &n, - 0 ); - + ImageParameters image; + int width; + int height; + unsigned char* data = stbi_load( filename.c_str(), &width, &height, &n, 0 ); + image.width = width; + image.height = height; if ( !data ) { - LOG( logERROR ) << "Something went wrong when loading image \"" << texParameters.name - << "\"."; - texParameters.width = texParameters.height = 0; - return; + LOG( logERROR ) << "Something went wrong when loading image \"" << filename << "\"."; + image.width = image.height = 0; + return image; } switch ( n ) { case 1: { - texParameters.format = GL_RED; - texParameters.internalFormat = GL_R8; + image.format = GL_RED; + image.internalFormat = GL_R8; } break; case 2: { // suppose it is GL_LUMINANCE_ALPHA - texParameters.format = GL_RG; - texParameters.internalFormat = GL_RG8; + image.format = GL_RG; + image.internalFormat = GL_RG8; } break; case 3: { - texParameters.format = GL_RGB; - texParameters.internalFormat = GL_RGB8; + image.format = GL_RGB; + image.internalFormat = GL_RGB8; } break; case 4: { - texParameters.format = GL_RGBA; - texParameters.internalFormat = GL_RGBA8; + image.format = GL_RGBA; + image.internalFormat = GL_RGBA8; } break; default: { - texParameters.format = GL_RGBA; - texParameters.internalFormat = GL_RGBA8; + image.format = GL_RGBA; + image.internalFormat = GL_RGBA8; } break; } CORE_ASSERT( data, "Data is null" ); - texParameters.texels = data; - texParameters.type = GL_UNSIGNED_BYTE; -} - -Texture* TextureManager::loadTexture( const TextureParameters& texParameters, bool linearize ) { - TextureParameters texParams = texParameters; - // TODO : allow to keep texels in texture parameters with automatic lifetime management. - bool mustFreeTexels = false; - if ( texParams.texels == nullptr ) { - loadTextureImage( texParams ); - mustFreeTexels = true; - } - auto ret = new Texture( texParams ); - ret->initializeGL( linearize ); - - if ( mustFreeTexels ) { - stbi_image_free( ret->getParameters().texels ); - ret->getParameters().texels = nullptr; - } - return ret; -} - -Texture* TextureManager::getOrLoadTexture( const TextureParameters& texParameters, - bool linearize ) { - { - // Is texture in the manager ? - auto it = m_textures.find( texParameters.name ); - if ( it != m_textures.end() ) { return it->second; } - } - { - // Is texture pending but registered in the manager - auto it = m_pendingTextures.find( texParameters.name ); - if ( it != m_pendingTextures.end() ) { - auto pendingParams = it->second; - auto ret = loadTexture( pendingParams, linearize ); - m_textures[pendingParams.name] = ret; - m_pendingTextures.erase( it ); - return ret; - } - } - // Texture is not in the manager, add it - auto ret = loadTexture( texParameters, linearize ); - - m_textures[texParameters.name] = ret; - return ret; + // make a shared ptr, with deleter from stb + image.texels = std::shared_ptr( data, stbi_image_free ); + image.type = GL_UNSIGNED_BYTE; + if ( linearize ) Texture::linearize( image ); + return image; } -void TextureManager::deleteTexture( const std::string& filename ) { - auto it = m_textures.find( filename ); - - if ( it != m_textures.end() ) { - delete it->second; - m_textures.erase( it ); - } +Texture* TextureManager::getTexture( const TextureHandle& handle ) { + return handle.isValid() ? m_textures[handle.getValue()].get() : nullptr; } -void TextureManager::deleteTexture( Texture* texture ) { - deleteTexture( texture->getName() ); -} +TextureManager::TextureHandle TextureManager::getTextureHandle( const std::string& name ) { + auto it = std::find_if( m_textures.begin(), m_textures.end(), [name]( const auto& texture ) { + return texture->getName() == name; + } ); -void TextureManager::updateTextureContent( const std::string& texture, void* content ) { - CORE_ASSERT( m_textures.find( texture ) != m_textures.end(), - "Trying to update non existing texture" ); - m_pendingData[texture] = content; + return it != m_textures.end() ? TextureHandle { std::distance( m_textures.begin(), it ) } + : TextureHandle::Invalid(); } -void TextureManager::updatePendingTextures() { - if ( m_pendingData.empty() ) { return; } - - for ( auto& data : m_pendingData ) { - LOG( logINFO ) << "TextureManager::updateTextures \"" << data.first << "\"."; - m_textures[data.first]->updateData( data.second ); - } - m_pendingData.clear(); +void TextureManager::deleteTexture( const TextureHandle& handle ) { + if ( handle.isValid() ) m_textures[handle.getValue()].reset( nullptr ); } } // namespace Data diff --git a/src/Engine/Data/TextureManager.hpp b/src/Engine/Data/TextureManager.hpp index 570a0cfb1d4..e5ee396390c 100644 --- a/src/Engine/Data/TextureManager.hpp +++ b/src/Engine/Data/TextureManager.hpp @@ -10,108 +10,69 @@ namespace Ra { namespace Engine { namespace Data { -/** - * Manage Texture loading and registration. - * @todo (for Radium-V2) Allow to share the same image data between different instances of a - * texture. Instances could be differentiated by the sampler parameter and the mip-map availability. +/** \brief Manage Texture loading and registration. + * + * TextureManager allows to store texture globally such that different object can share textures + * based on their handle or name. + * Name uniqueness is not guaranteed by the manager, take care in case of search texture by name. */ class RA_ENGINE_API TextureManager final { private: - using TexturePair = std::pair; - public: - /** Add a texture giving its name, dimension and content. - * Useful for defining procedural textures - * - * @param name name of the texture - * @param width width of the texture - * @param height height of the texture - * @param data pointer to the texture content - * - * @return a texture descriptor that could be further specialized (filtering parameters ..) - * before the texture is inserted into Radium OpenGL system by getOrLoadTexture - */ - TextureParameters& addTexture( const std::string& name, uint width, uint height, void* data ); + using TextureHandle = Ra::Core::Utils::Index; - /** - * Get or load a named texture. - * If image data are not presents in texParameters.texels (this field is nullptr), this method - * will assume that the texParameters.name field contains the fully qualified filename to be - * loaded to initialize texParameters.texels - * - * If image data are presents in texParameters.texels (this field is not nullptr), the name - * could be of any form as no loading will occur. - * - * - * This method creates, initialize OpenGL part of the texture and add the created texture to the - * Texture cache of the engine. - * @note For the moment, the texture cache is indexed by the name of the texture only. + /** \brief Add a texture given its TextureParameters * - * @param texParameters : The description of the texture to create - * @param linearize : true if the texture data (texParameters.texels) must be converted from - * sRGB to LinearRGB - * @return The texture as inserted into the Radium available openGL system + * \return a TextureHandle that uniquely identify the texture in the manager. */ - Texture* getOrLoadTexture( const TextureParameters& texParameters, bool linearize = false ); + TextureHandle addTexture( const TextureParameters& p ); - /** - * Helper function, load the texture without adding it to the manager. - * @see getOrLoadTexture() for parameters description. + /** \brief Get raw texture ptr from handle. + * + * The texture is still managed by the manager. Do not delete the return ptr. */ - Texture* loadTexture( const TextureParameters& texParameters, bool linearize = false ); + Texture* getTexture( const TextureHandle& handle ); - /** - * Delete a named texture from the manager - * @param filename - */ - void deleteTexture( const std::string& filename ); - /** - * Delete a texture from the manager - * @param texture + /** \brief Get a texture handle from textue name. + * + * It search for the first texture in the set of managed texture that have this name. + * \return An handle to the texture or InvalidIndex if no texture with this name is found */ - void deleteTexture( Texture* texture ); + TextureHandle getTextureHandle( const std::string& name ); - /** - * Lazy update the texture content from the raw pointer content. - * The real update will be done when calling updatePendingTextures - * @note User must ensure that the data pointed by content are of the good type wrt the texture. - * @param texture - * @param content - */ - void updateTextureContent( const std::string& texture, void* content ); + /** \brief Convinience function to obtain Texture ptr from name. */ + Texture* getTexture( const std::string& name ) { + return getTexture( getTextureHandle( name ) ); + } - /** - * Update all textures that are pending after a call to updateTextureContent. - * - * The cooperation of updateTextureContent and updatePendingTextures allow applications to - * manage efficiently the on line texture generation by separating the content definition - * (updateTextureContent) from the OpenGL state modification (updatePendingTextures). + /** \brief Remove a managed texture identified by handle. * - * @todo find a better name and description for this method that do not act on - * _pending textures_, i.e. textures that do not have a valid OpenGl state. + * Texture dtor will register the delete texture gpu task. */ - void updatePendingTextures(); + void deleteTexture( const TextureHandle& handle ); - /** Load a texture as described by texParameters. - * @note : only loads 2D image file for now. - * @param texParameters parameters describing the texture to load. This parameter will be - * updated (width, height, ...) according to the loaded file properties. + /** \brief Load \a filename and fill ImageParameters according to \a filename content. + * + * \note only loads 2D image file for now. + * \param filename fully qualified image filename. See stbi_load_image for supported file + * format. + * \return ImageParameters corresponding to filename content, image.parameters.texels contains + * actual image data. In case of loading error, texels is nullptr, width = height = 0. */ - void loadTextureImage( TextureParameters& texParameters ); + static ImageParameters loadTextureImage( const std::string& filename, bool linearize = false ); public: TextureManager(); ~TextureManager(); + TextureManager( TextureManager const& ) = delete; + TextureManager( TextureManager&& ) = delete; + TextureManager& operator=( TextureManager const& ) = delete; + TextureManager& operator=( TextureManager&& ) = delete; private: - /// Textures that have a usable and up to date OpenGL state - std::map m_textures; - /// Textures that do not have a usable OpenGL state - std::map m_pendingTextures; - /// Textures whose OpenGl stat is not up to date - std::map m_pendingData; + std::vector> m_textures; }; } // namespace Data diff --git a/src/Engine/Data/VolumeObject.cpp b/src/Engine/Data/VolumeObject.cpp index 724b27657d1..87ce9d40a4c 100644 --- a/src/Engine/Data/VolumeObject.cpp +++ b/src/Engine/Data/VolumeObject.cpp @@ -11,7 +11,7 @@ namespace Ra { namespace Engine { namespace Data { VolumeObject::VolumeObject( const std::string& name ) : - Displayable( name ), m_tex( {} ), m_mesh( name + "_internal" ) {} + Displayable( name ), m_mesh( name + "_internal" ) {} VolumeObject::~VolumeObject() {} @@ -52,20 +52,26 @@ void VolumeObject::loadGeometry( Core::Geometry::AbstractVolume* volume, const C m_volume = std::unique_ptr( volume ); auto dim = grid->size(); - TextureParameters texparam { getName(), - GL_TEXTURE_3D, - size_t( dim( 0 ) ), - size_t( dim( 1 ) ), - size_t( dim( 2 ) ), - GL_RED, - GL_R32F, - GL_SCALAR, - GL_CLAMP_TO_BORDER, - GL_CLAMP_TO_BORDER, - GL_CLAMP_TO_BORDER, - GL_LINEAR, - GL_LINEAR, - grid->data().data() }; + + /// \todo clean tmp hack + // tmp hack create a shared ptr and copy to it. + std::shared_ptr data( new float[grid->data().size()] ); + auto itr = data.get(); + for ( const auto& v : grid->data() ) { + *( itr++ ) = v; + } + TextureParameters texparam { + getName(), + { GL_CLAMP_TO_BORDER, GL_CLAMP_TO_BORDER, GL_CLAMP_TO_BORDER, GL_LINEAR, GL_LINEAR }, + { GL_TEXTURE_3D, + size_t( dim( 0 ) ), + size_t( dim( 1 ) ), + size_t( dim( 2 ) ), + GL_RED, + GL_R32F, + GL_SCALAR, + false, + data } }; m_tex.setParameters( texparam ); m_isDirty = true; @@ -80,7 +86,7 @@ void VolumeObject::updateGL() { if ( m_isDirty ) { m_mesh.updateGL(); GL_CHECK_ERROR; - m_tex.initializeGL(); + m_tex.initialize(); GL_CHECK_ERROR; m_isDirty = false; } diff --git a/src/Engine/Data/VolumeObject.hpp b/src/Engine/Data/VolumeObject.hpp index 529188ed236..04716d8f4fa 100644 --- a/src/Engine/Data/VolumeObject.hpp +++ b/src/Engine/Data/VolumeObject.hpp @@ -16,7 +16,7 @@ namespace Data { /** * A class representing an openGL volume * - * @todo Right now, a volumeObject define both the geometry (a parallelepiped) and the material (a + * \todo Right now, a volumeObject define both the geometry (a parallelepiped) and the material (a * density grid) This should be modified to handle density grids deleimited by a general geometry. */ class RA_ENGINE_API VolumeObject : public Displayable @@ -69,7 +69,7 @@ class RA_ENGINE_API VolumeObject : public Displayable private: std::unique_ptr m_volume; - Texture m_tex; + Texture m_tex { {} }; /// Mesh used to display the bounding box of the grid for the ray marching Mesh m_mesh; diff --git a/src/Engine/Data/VolumetricMaterial.cpp b/src/Engine/Data/VolumetricMaterial.cpp index 59038ed78ab..6a172c6ed60 100644 --- a/src/Engine/Data/VolumetricMaterial.cpp +++ b/src/Engine/Data/VolumetricMaterial.cpp @@ -23,36 +23,36 @@ VolumetricMaterial::VolumetricMaterial( const std::string& name ) : VolumetricMaterial::~VolumetricMaterial() {} void VolumetricMaterial::updateGL() { - if ( !m_isDirty ) { return; } + if ( !isDirty() ) { return; } - m_isDirty = false; updateRenderingParameters(); + setClean(); } void VolumetricMaterial::updateFromParameters() { auto& renderParameters = getParameters(); - m_sigma_a = renderParameters.getParameter( "material.sigma_a" ); - m_sigma_s = renderParameters.getParameter( "material.sigma_s" ); - m_g = renderParameters.getParameter( "material.g" ); - m_scale = renderParameters.getParameter( "material.scale" ); - m_stepsize = renderParameters.getParameter( "material.stepsize" ); + m_sigma_a = renderParameters.getVariable( "material.sigma_a" ); + m_sigma_s = renderParameters.getVariable( "material.sigma_s" ); + m_g = renderParameters.getVariable( "material.g" ); + m_scale = renderParameters.getVariable( "material.scale" ); + m_stepsize = renderParameters.getVariable( "material.stepsize" ); } void VolumetricMaterial::updateRenderingParameters() { auto& renderParameters = getParameters(); - renderParameters.addParameter( "material.sigma_a", m_sigma_a ); - renderParameters.addParameter( "material.sigma_s", m_sigma_s ); - renderParameters.addParameter( "material.g", m_g ); - renderParameters.addParameter( "material.scale", m_scale ); + renderParameters.setVariable( "material.sigma_a", m_sigma_a ); + renderParameters.setVariable( "material.sigma_s", m_sigma_s ); + renderParameters.setVariable( "material.g", m_g ); + renderParameters.setVariable( "material.scale", m_scale ); if ( m_stepsize < 0 ) { - auto dim = std::sqrt( Scalar( m_texture->width() * m_texture->width() + - m_texture->height() * m_texture->height() + - m_texture->depth() * m_texture->depth() ) ); - renderParameters.addParameter( "material.stepsize", 1._ra / dim ); + auto dim = std::sqrt( Scalar( m_texture->getWidth() * m_texture->getWidth() + + m_texture->getHeight() * m_texture->getHeight() + + m_texture->getDepth() * m_texture->getDepth() ) ); + renderParameters.setVariable( "material.stepsize", 1._ra / dim ); } - else { renderParameters.addParameter( "material.stepsize", m_stepsize ); } - renderParameters.addParameter( "material.density", m_texture ); - renderParameters.addParameter( "material.modelToDensity", m_modelToMedium.matrix() ); + else { renderParameters.setVariable( "material.stepsize", m_stepsize ); } + renderParameters.setTexture( "material.density", m_texture ); + renderParameters.setVariable( "material.modelToDensity", m_modelToMedium.matrix() ); } bool VolumetricMaterial::isTransparent() const { diff --git a/src/Engine/Data/VolumetricMaterial.hpp b/src/Engine/Data/VolumetricMaterial.hpp index 9488e9f0712..cec1ed35760 100644 --- a/src/Engine/Data/VolumetricMaterial.hpp +++ b/src/Engine/Data/VolumetricMaterial.hpp @@ -18,22 +18,21 @@ class ShaderProgram; * Implementation of a simple Volumetric Material. * Based on a 3D texture defining the density distribution in the volume, perform ray-marching * and absorption based rendering of the volume.. - * @todo This material does not implement the MaterialGLSL interface. Shader compositing is not + * \todo This material does not implement the MaterialGLSL interface. Shader compositing is not * allowed. */ class RA_ENGINE_API VolumetricMaterial final : public Material, public ParameterSetEditingInterface { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW /** * Construct a named VolumetricMaterial - * @param name The name of the material + * \param name The name of the material */ explicit VolumetricMaterial( const std::string& name ); /** * Destructor. - * @note The material does not have ownership on its texture. This destructor do not delete the + * \note The material does not have ownership on its texture. This destructor do not delete the * associated textures. */ ~VolumetricMaterial() override; @@ -44,15 +43,15 @@ class RA_ENGINE_API VolumetricMaterial final : public Material, public Parameter /** * Add an already existing texture to control the specified BSDF parameter. - * @param semantic The texture semantic - * @param texture The texture to use + * \param semantic The texture semantic + * \param texture The texture to use */ inline void setTexture( Texture* texture ); /** * Get the texture associated to the given semantic. - * @param semantic - * @return the corresponding texture + * \param semantic + * \return the corresponding texture */ inline Texture* getTexture() const; @@ -72,7 +71,7 @@ class RA_ENGINE_API VolumetricMaterial final : public Material, public Parameter /** * Get a json containing metadata about the parameters of the material. * - * @return the metadata in json format + * \return the metadata in json format */ inline nlohmann::json getParametersMetadata() const override; @@ -94,6 +93,7 @@ class RA_ENGINE_API VolumetricMaterial final : public Material, public Parameter private: // The density matrix + /// \todo get rid of the raw ptr. Texture* m_texture; /** diff --git a/src/Engine/RadiumEngine.cpp b/src/Engine/RadiumEngine.cpp index be78eb36167..1d64dcfea55 100644 --- a/src/Engine/RadiumEngine.cpp +++ b/src/Engine/RadiumEngine.cpp @@ -105,7 +105,7 @@ void RadiumEngine::registerDefaultPrograms() { m_resourcesRootDir + "Shaders/Materials/VertexAttribInterface.frag.glsl" ); // Engine support some built-in materials. Register here - /// @todo find a way to integrate "Line" material into Radium Material System + /// \todo find a way to integrate "Line" material into Radium Material System Data::ShaderConfiguration lConfig( "Lines" ); lConfig.addShader( Data::ShaderType_VERTEX, m_resourcesRootDir + "Shaders/Lines/Lines.vert.glsl" ); diff --git a/src/Engine/RadiumEngine.hpp b/src/Engine/RadiumEngine.hpp index e75648563d3..b6b1a423640 100644 --- a/src/Engine/RadiumEngine.hpp +++ b/src/Engine/RadiumEngine.hpp @@ -23,7 +23,10 @@ class FileData; } // namespace Asset } // namespace Core +/// This namespace contains engine and ECS related stuff namespace Engine { + +/// Scene and how to communicate namespace Scene { class System; class Entity; @@ -32,19 +35,21 @@ class EntityManager; class SignalManager; } // namespace Scene +/// (GPU) Data representation, along with manager namespace Data { class ShaderProgramManager; class Displayable; class TextureManager; } // namespace Data +/// Rendering engines. namespace Rendering { class RenderObjectManager; } /** * Engine main class : Manage all the systems and managers that are used by the engine module. - * @see Documentation on Engine Object Model + * \see Documentation on Engine Object Model */ class RA_ENGINE_API RadiumEngine { @@ -62,7 +67,7 @@ class RA_ENGINE_API RadiumEngine * Shader set : reusable shaders, materials and named strings * Texture set : reusable textures * - * @note When calling this function, caller must ensures that a valid openGL context is bound. + * \note When calling this function, caller must ensures that a valid openGL context is bound. * All initialisations will be done in the bound openGl context. */ void initializeGL(); @@ -82,9 +87,9 @@ class RA_ENGINE_API RadiumEngine /** * Builds the set of task that must be executed for the current frame. * - * @see Documentation on Engine Object Model the what are tasks and what they can do - * @param taskQueue the task queue that will be executed for the current frame - * @param dt the time elapsed since the last frame in seconds. + * \see Documentation on Engine Object Model the what are tasks and what they can do + * \param taskQueue the task queue that will be executed for the current frame + * \param dt the time elapsed since the last frame in seconds. */ void getTasks( Core::TaskQueue* taskQueue, Scalar dt ); @@ -93,16 +98,16 @@ class RA_ENGINE_API RadiumEngine * priority are ranked randomly. * Default priority is 1 for all systems; * - * @param name - * @param system - * @param priority Value used to rank the systems + * \param name + * \param system + * \param priority Value used to rank the systems */ bool registerSystem( const std::string& name, Scene::System* system, int priority = 1 ); /** * Get the named system - * @param system - * @return + * \param system + * \return */ Scene::System* getSystem( const std::string& system ) const; @@ -110,9 +115,9 @@ class RA_ENGINE_API RadiumEngine * component names. * When no RenderObject name is given, returns the mesh associated * to the first render object. - * @note : mark as deprecated as it must be either removed or reimplemented - * @warning will be deprecated - * @deprecated Will be removed from this class in the next release. A Mesh manager, that could + * \note : mark as deprecated as it must be either removed or reimplemented + * \warning will be deprecated + * \deprecated Will be removed from this class in the next release. A Mesh manager, that could * serve mesh by name will be implemented. */ Data::Displayable* getMesh( const std::string& entityName, @@ -124,9 +129,9 @@ class RA_ENGINE_API RadiumEngine * If no loader is able to process the input fileformat (determined on the file extension), * return false. If a loader is found, creates the root entity of the loaded scene and gives the * content of the file to all systems to add components and to this root entity. - * @note Calling this method set the engine in the "loading state". - * @param file - * @return true if file is loaded, false else. + * \note Calling this method set the engine in the "loading state". + * \param file + * \return true if file is loaded, false else. */ bool loadFile( const std::string& file ); @@ -134,16 +139,16 @@ class RA_ENGINE_API RadiumEngine * Access to the content of the loaded file. * Access to the content is only available at loading time. As soon as the loaded file is * released, its content is no more available outside the Entity/Component architecture. - * @pre The Engine must be in "loading state". - * @return + * \pre The Engine must be in "loading state". + * \return */ const Core::Asset::FileData& getFileData() const; /** * Release the content of the loaded file. * After calling this, the getFileData method must not be called for this file - * @param filename the name of the file to release. If empty, releases the last loaded file. - * @note Calling this method set the engine out of the "loading state". + * \param filename the name of the file to release. If empty, releases the last loaded file. + * \note Calling this method set the engine out of the "loading state". */ void releaseFile(); @@ -154,47 +159,47 @@ class RA_ENGINE_API RadiumEngine /// Manager getters /** * Get the RenderObject manager attached to the engine. - * @note, the engine keep ownership on the pointer returned - * @return the object manager + * \note, the engine keep ownership on the pointer returned + * \return the object manager */ Rendering::RenderObjectManager* getRenderObjectManager() const; /** * Get the entity manager attached to the engine. - * @note, the engine keep ownership on the pointer returned - * @return the entity manager + * \note, the engine keep ownership on the pointer returned + * \return the entity manager */ Scene::EntityManager* getEntityManager() const; /** * Get the signal manager attached to the engine. - * @note, the engine keep ownership on the pointer returned - * @return the signal manager + * \note, the engine keep ownership on the pointer returned + * \return the signal manager */ Scene::SignalManager* getSignalManager() const; /** * Get the texture manager attached to the engine. - * @note, the engine keep ownership on the pointer returned - * @return the texture manager + * \note, the engine keep ownership on the pointer returned + * \return the texture manager */ Data::TextureManager* getTextureManager() const; /** * Get the shader program manager attached to the engine. - * @note, the engine keep ownership on the pointer returned - * @return the shader program manager + * \note, the engine keep ownership on the pointer returned + * \return the shader program manager */ Data::ShaderProgramManager* getShaderProgramManager() const; /** * Register a new file loader to the engine. - * @param fileLoader + * \param fileLoader */ void registerFileLoader( std::shared_ptr fileLoader ); /** * Get the active file loaders from the engine - * @return + * \return */ const std::vector>& getFileLoaders() const; @@ -393,7 +398,7 @@ class RA_ENGINE_API RadiumEngine std::array m_viewport; }; - /// Stack of saved fbo and viewport values @see pushFboAndViewport popFboAndViewport + /// Stack of saved fbo and viewport values \see pushFboAndViewport popFboAndViewport std::stack m_fboAndViewportStack; struct TimeData { diff --git a/src/Engine/Rendering/DebugRender.hpp b/src/Engine/Rendering/DebugRender.hpp index 0c4f90634f0..44ab906d3bc 100644 --- a/src/Engine/Rendering/DebugRender.hpp +++ b/src/Engine/Rendering/DebugRender.hpp @@ -21,7 +21,7 @@ class ShaderProgram; namespace Rendering { /** This allow to draw debug objects. - * @todo : port this to a more Radium-style code + * \todo : port this to a more Radium-style code */ class RA_ENGINE_API DebugRender final { diff --git a/src/Engine/Rendering/ForwardRenderer.cpp b/src/Engine/Rendering/ForwardRenderer.cpp index 3facaf7cec2..f0328f8dd99 100644 --- a/src/Engine/Rendering/ForwardRenderer.cpp +++ b/src/Engine/Rendering/ForwardRenderer.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -96,57 +97,35 @@ void ForwardRenderer::initBuffers() { // Forward renderer internal textures texture Data::TextureParameters texparams; - texparams.width = m_width; - texparams.height = m_height; - texparams.target = GL_TEXTURE_2D; + texparams.image.width = m_width; + texparams.image.height = m_height; + texparams.image.target = GL_TEXTURE_2D; // Depth texture - texparams.minFilter = GL_NEAREST; - texparams.magFilter = GL_NEAREST; - texparams.internalFormat = GL_DEPTH_COMPONENT24; - texparams.format = GL_DEPTH_COMPONENT; - texparams.type = GL_UNSIGNED_INT; - texparams.name = "Depth (fw renderer)"; + texparams.sampler.minFilter = GL_NEAREST; + texparams.sampler.magFilter = GL_NEAREST; + texparams.image.internalFormat = GL_DEPTH_COMPONENT24; + texparams.image.format = GL_DEPTH_COMPONENT; + texparams.image.type = GL_UNSIGNED_INT; + texparams.name = m_textureNames[0]; m_textures[RendererTextures_Depth] = std::make_unique( texparams ); - // Color texture - texparams.internalFormat = GL_RGBA32F; - texparams.format = GL_RGBA; - texparams.type = GL_SCALAR; - texparams.minFilter = GL_LINEAR; - texparams.magFilter = GL_LINEAR; - - texparams.name = "HDR"; - m_textures[RendererTextures_HDR] = std::make_unique( texparams ); - - texparams.name = "Normal"; - m_textures[RendererTextures_Normal] = std::make_unique( texparams ); - - texparams.name = "Diffuse"; - m_textures[RendererTextures_Diffuse] = std::make_unique( texparams ); - - texparams.name = "Specular"; - m_textures[RendererTextures_Specular] = std::make_unique( texparams ); - - texparams.name = "OIT Accum"; - m_textures[RendererTextures_OITAccum] = std::make_unique( texparams ); + m_secondaryTextures[m_textureNames[RendererTextures_Depth]] = + m_textures[RendererTextures_Depth].get(); - texparams.name = "OIT Revealage"; - m_textures[RendererTextures_OITRevealage] = std::make_unique( texparams ); - - texparams.name = "Volume"; - m_textures[RendererTextures_Volume] = std::make_unique( texparams ); - - m_secondaryTextures["Depth (fw)"] = m_textures[RendererTextures_Depth].get(); - m_secondaryTextures["HDR Texture"] = m_textures[RendererTextures_HDR].get(); - m_secondaryTextures["Normal Texture"] = m_textures[RendererTextures_Normal].get(); - m_secondaryTextures["Diffuse Texture"] = m_textures[RendererTextures_Diffuse].get(); - m_secondaryTextures["Specular Texture"] = m_textures[RendererTextures_Specular].get(); - m_secondaryTextures["OIT Accum"] = m_textures[RendererTextures_OITAccum].get(); - m_secondaryTextures["OIT Revealage"] = m_textures[RendererTextures_OITRevealage].get(); - - // Volume texture is not exposed ... - m_secondaryTextures["Volume"] = m_textures[RendererTextures_Volume].get(); + // Color texture + texparams.image.internalFormat = GL_RGBA32F; + texparams.image.format = GL_RGBA; + texparams.image.type = GL_SCALAR; + texparams.sampler.minFilter = GL_LINEAR; + texparams.sampler.magFilter = GL_LINEAR; + + // init textures other than depth (which is the first in the array, index 0) + for ( int i = RendererTextures_Depth + 1; i < RendererTexture_Count; ++i ) { + texparams.name = m_textureNames[i]; + m_textures[i] = std::make_unique( texparams ); + m_secondaryTextures[m_textureNames[i]] = m_textures[i].get(); + } } void ForwardRenderer::updateStepInternal( const Data::ViewingParameters& renderData ) { @@ -400,15 +379,15 @@ void ForwardRenderer::renderInternal( const Data::ViewingParameters& renderData GL_ASSERT( glDisable( GL_BLEND ) ); Data::RenderParameters composeParams; - composeParams.addParameter( "imageColor", m_textures[RendererTextures_HDR].get() ); - composeParams.addParameter( "imageDepth", m_textures[RendererTextures_Depth].get() ); + composeParams.setTexture( "imageColor", m_textures[RendererTextures_HDR].get() ); + composeParams.setTexture( "imageDepth", m_textures[RendererTextures_Depth].get() ); Data::RenderParameters passParams; - passParams.addParameter( "compose_data", composeParams ); + passParams.setVariable( "compose_data", composeParams ); for ( size_t i = 0; i < m_lightmanagers[0]->count(); ++i ) { const auto l = m_lightmanagers[0]->getLight( i ); - passParams.addParameter( "light_source", l->getRenderParameters() ); + passParams.setVariable( "light_source", l->getRenderParameters() ); for ( const auto& ro : m_volumetricRenderObjects ) { ro->render( @@ -529,9 +508,10 @@ void ForwardRenderer::debugInternal( const Data::ViewingParameters& renderData ) GL_ASSERT( glDepthMask( GL_TRUE ) ); GL_ASSERT( glClear( GL_DEPTH_BUFFER_BIT ) ); Data::RenderParameters xrayLightParams; - xrayLightParams.addParameter( "light.color", Ra::Core::Utils::Color::Grey( 5.0 ) ); - xrayLightParams.addParameter( "light.type", Scene::Light::LightType::DIRECTIONAL ); - xrayLightParams.addParameter( "light.directional.direction", Core::Vector3( 0, -1, 0 ) ); + using namespace Core::VariableSetEnumManagement; + xrayLightParams.setVariable( "light.color", Ra::Core::Utils::Color::Grey( 5.0 ) ); + setEnumVariable( xrayLightParams, "light.type", Scene::Light::LightType::DIRECTIONAL ); + xrayLightParams.setVariable( "light.directional.direction", Core::Vector3( 0, -1, 0 ) ); for ( const auto& ro : m_xrayRenderObjects ) { if ( ro->isVisible() ) { ro->render( xrayLightParams, renderData ); } } @@ -610,49 +590,49 @@ void ForwardRenderer::postProcessInternal( const Data::ViewingParameters& render void ForwardRenderer::resizeInternal() { m_pingPongSize = std::pow( uint( 2 ), uint( std::log2( std::min( m_width, m_height ) ) ) ); - m_textures[RendererTextures_Depth]->resize( m_width, m_height ); - m_textures[RendererTextures_HDR]->resize( m_width, m_height ); - m_textures[RendererTextures_Normal]->resize( m_width, m_height ); - m_textures[RendererTextures_Diffuse]->resize( m_width, m_height ); - m_textures[RendererTextures_Specular]->resize( m_width, m_height ); - m_textures[RendererTextures_OITAccum]->resize( m_width, m_height ); - m_textures[RendererTextures_OITRevealage]->resize( m_width, m_height ); - m_textures[RendererTextures_Volume]->resize( m_width, m_height ); + for ( auto& tex : m_textures ) { + tex->resize( m_width, m_height ); + } m_fbo->bind(); - m_fbo->attachTexture( GL_DEPTH_ATTACHMENT, m_textures[RendererTextures_Depth]->texture() ); - m_fbo->attachTexture( GL_COLOR_ATTACHMENT0, m_textures[RendererTextures_HDR]->texture() ); - m_fbo->attachTexture( GL_COLOR_ATTACHMENT1, m_textures[RendererTextures_Normal]->texture() ); - m_fbo->attachTexture( GL_COLOR_ATTACHMENT2, m_textures[RendererTextures_Diffuse]->texture() ); - m_fbo->attachTexture( GL_COLOR_ATTACHMENT3, m_textures[RendererTextures_Specular]->texture() ); + m_fbo->attachTexture( GL_DEPTH_ATTACHMENT, + m_textures[RendererTextures_Depth]->getGpuTexture() ); + m_fbo->attachTexture( GL_COLOR_ATTACHMENT0, m_textures[RendererTextures_HDR]->getGpuTexture() ); + m_fbo->attachTexture( GL_COLOR_ATTACHMENT1, + m_textures[RendererTextures_Normal]->getGpuTexture() ); + m_fbo->attachTexture( GL_COLOR_ATTACHMENT2, + m_textures[RendererTextures_Diffuse]->getGpuTexture() ); + m_fbo->attachTexture( GL_COLOR_ATTACHMENT3, + m_textures[RendererTextures_Specular]->getGpuTexture() ); if ( m_fbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "FBO Error (ForwardRenderer::m_fbo): " << m_fbo->checkStatus(); } m_volumeFbo->bind(); m_volumeFbo->attachTexture( GL_DEPTH_ATTACHMENT, - m_textures[RendererTextures_Depth]->texture() ); + m_textures[RendererTextures_Depth]->getGpuTexture() ); m_volumeFbo->attachTexture( GL_COLOR_ATTACHMENT0, - m_textures[RendererTextures_Volume]->texture() ); + m_textures[RendererTextures_Volume]->getGpuTexture() ); if ( m_volumeFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "FBO Error (ForwardRenderer::m_volumeFbo) : " << m_volumeFbo->checkStatus(); } m_oitFbo->bind(); - m_oitFbo->attachTexture( GL_DEPTH_ATTACHMENT, m_textures[RendererTextures_Depth]->texture() ); + m_oitFbo->attachTexture( GL_DEPTH_ATTACHMENT, + m_textures[RendererTextures_Depth]->getGpuTexture() ); m_oitFbo->attachTexture( GL_COLOR_ATTACHMENT0, - m_textures[RendererTextures_OITAccum]->texture() ); + m_textures[RendererTextures_OITAccum]->getGpuTexture() ); m_oitFbo->attachTexture( GL_COLOR_ATTACHMENT1, - m_textures[RendererTextures_OITRevealage]->texture() ); + m_textures[RendererTextures_OITRevealage]->getGpuTexture() ); if ( m_oitFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "FBO Error (ForwardRenderer::m_oitFbo) : " << m_oitFbo->checkStatus(); } m_postprocessFbo->bind(); m_postprocessFbo->attachTexture( GL_DEPTH_ATTACHMENT, - m_textures[RendererTextures_Depth]->texture() ); - m_postprocessFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->texture() ); + m_textures[RendererTextures_Depth]->getGpuTexture() ); + m_postprocessFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->getGpuTexture() ); if ( m_postprocessFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "FBO Error (ForwardRenderer::m_postprocessFbo) : " << m_postprocessFbo->checkStatus(); @@ -663,8 +643,8 @@ void ForwardRenderer::resizeInternal() { // render eveything else than the scene. Create several FBO with ther own configuration // (uncomment Renderer::m_depthTexture->texture() to see the difference.) m_uiXrayFbo->bind(); - m_uiXrayFbo->attachTexture( GL_DEPTH_ATTACHMENT, Renderer::m_depthTexture->texture() ); - m_uiXrayFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->texture() ); + m_uiXrayFbo->attachTexture( GL_DEPTH_ATTACHMENT, Renderer::m_depthTexture->getGpuTexture() ); + m_uiXrayFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->getGpuTexture() ); if ( m_uiXrayFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "FBO Error (ForwardRenderer::m_uiXrayFbo) : " << m_uiXrayFbo->checkStatus(); @@ -690,8 +670,8 @@ class PointCloudParameterProvider : public Data::ShaderParameterProvider void updateGL() override { m_displayMaterial->updateGL(); auto& renderParameters = getParameters(); - renderParameters.mergeReplaceParameters( m_displayMaterial->getParameters() ); - renderParameters.addParameter( "pointCloudSplatRadius", m_component->getSplatSize() ); + renderParameters.mergeReplaceVariables( m_displayMaterial->getParameters() ); + renderParameters.setVariable( "pointCloudSplatRadius", m_component->getSplatSize() ); } private: @@ -708,8 +688,8 @@ bool ForwardRenderer::buildRenderTechnique( RenderObject* ro ) const { if ( !material ) { LOG( logWARNING ) << "ForwardRenderer : no material found when building RenderTechnique" << " - adding red Lambertian material"; - auto defMat = new Data::LambertianMaterial( "ForwardRenderer::Default material" ); - defMat->m_color = Ra::Core::Utils::Color::Red(); + auto defMat = new Data::LambertianMaterial( "ForwardRenderer::Default material" ); + defMat->setColor( Ra::Core::Utils::Color::Red() ); material.reset( defMat ); } auto builder = EngineRenderTechniques::getDefaultTechnique( material->getMaterialName() ); diff --git a/src/Engine/Rendering/ForwardRenderer.hpp b/src/Engine/Rendering/ForwardRenderer.hpp index 9b0c2d13bed..03ce90b1e99 100644 --- a/src/Engine/Rendering/ForwardRenderer.hpp +++ b/src/Engine/Rendering/ForwardRenderer.hpp @@ -18,7 +18,7 @@ namespace Rendering { * for opaque and transperent objects. Once renderer, the final is composited with Ui, debug and * X-ray objects renderings on demand. * - * @see rendering.md for description of the renderer + * \see rendering.md for description of the renderer */ class RA_ENGINE_API ForwardRenderer : public Renderer { @@ -53,7 +53,7 @@ class RA_ENGINE_API ForwardRenderer : public Renderer virtual void renderBackground( const Data::ViewingParameters& ) {} enum RendererTextures { - RendererTextures_Depth = 0, + RendererTextures_Depth = 0, // need to be the first, since used for other textures init RendererTextures_HDR, RendererTextures_Normal, RendererTextures_Diffuse, @@ -63,6 +63,14 @@ class RA_ENGINE_API ForwardRenderer : public Renderer RendererTextures_Volume, RendererTexture_Count }; + std::array m_textureNames { { "Depth (fw)", + "HDR", + "Normal", + "Diffuse", + "Specular", + "OIT Accum", + "OIT Revealage", + "Volume" } }; // Default renderer logic here, no need to be accessed by overriding renderers. std::unique_ptr m_fbo; diff --git a/src/Engine/Rendering/RenderObject.hpp b/src/Engine/Rendering/RenderObject.hpp index 0aaca9583cd..5f161c5642f 100644 --- a/src/Engine/Rendering/RenderObject.hpp +++ b/src/Engine/Rendering/RenderObject.hpp @@ -36,15 +36,13 @@ namespace Rendering { class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** * Construct a renderObject * - * @param name the name of the renderObject - * @param comp The component that holds the RenderObject - * @param type The type (ui, debug, geometry) of the render object - * @param lifetime A -1 (or any other negative value) lifetime is considered infinite, + * \param name the name of the renderObject + * \param comp The component that holds the RenderObject + * \param type The type (ui, debug, geometry) of the render object + * \param lifetime A -1 (or any other negative value) lifetime is considered infinite, * 0 is an "invalid value" (would mean the render object has to die immediatly), * hence it's considered as infinite, * any other positive value will be taken into account. @@ -74,13 +72,13 @@ class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject * * // createRenderObject can finally be called. * RenderObject* ro = createRenderObject(name, component, type, config, material); - * @param name - * @param comp - * @param type - * @param mesh - * @param techniqueConfig - * @param material - * @return + * \param name + * \param comp + * \param type + * \param mesh + * \param techniqueConfig + * \param material + * \return */ static RenderObject* createRenderObject( const std::string& name, @@ -95,7 +93,7 @@ class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject void updateGL(); /// Getters and setters. - ///@{ + ///\{ const std::string& getName() const; const Scene::Component* getComponent() const; Scene::Component* getComponent(); @@ -149,7 +147,7 @@ class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject void setLocalTransform( const Core::Matrix4& transform ); const Core::Transform& getLocalTransform() const; const Core::Matrix4& getLocalTransformAsMatrix() const; - ///@} + ///\} /// Basically just decreases lifetime counter. /// If it goes to zero, then render object notifies the manager that it needs to be deleted. @@ -165,9 +163,9 @@ class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject /** * Render the object with the given rendering environment defined by the lighting parameters, * the viewing parameters and the shader - * @param lightParams lighting parameters for this rendering - * @param viewParams viewing parameters for this rendering - * @param shader shader to use for this rendering + * \param lightParams lighting parameters for this rendering + * \param viewParams viewing parameters for this rendering + * \param shader shader to use for this rendering */ void render( const Data::RenderParameters& lightParams, const Data::ViewingParameters& viewParams, @@ -177,9 +175,9 @@ class RA_ENGINE_API RenderObject final : public Core::Utils::IndexedObject /** * Render the object for the given rendering environment defined by the lighting parameters, the * viewing parameters and the RenderTechnique pass name - * @param lightParams lighting parameters for this rendering - * @param viewParams viewing parameters for this rendering - * @param passname RenderTechnique pass name + * \param lightParams lighting parameters for this rendering + * \param viewParams viewing parameters for this rendering + * \param passname RenderTechnique pass name */ void render( const Data::RenderParameters& lightParams, const Data::ViewingParameters& viewParams, diff --git a/src/Engine/Rendering/RenderObjectManager.hpp b/src/Engine/Rendering/RenderObjectManager.hpp index ba58dd9bb66..bb3e067fa5f 100644 --- a/src/Engine/Rendering/RenderObjectManager.hpp +++ b/src/Engine/Rendering/RenderObjectManager.hpp @@ -36,40 +36,40 @@ class RA_ENGINE_API RenderObjectManager final std::shared_ptr getRenderObject( const Core::Utils::Index& index ); /** - * @brief Get all render objects. + * \brief Get all render objects. */ const Core::Utils::IndexMap>& getRenderObjects() const; /** * Get all render objects of the given type, the vector is assumed to be empty whan called - * @param objectsOut - * @param type + * \param objectsOut + * \param type */ void getRenderObjectsByType( std::vector>& objectsOut, const Rendering::RenderObjectType& type ) const; /** Returns true if the index points to a valid render object. * - * @param index - * @return + * \param index + * \return */ bool exists( const Core::Utils::Index& index ) const; /** * Removed the render object at the given index - * @param idx + * \param idx */ void renderObjectExpired( const Ra::Core::Utils::Index& idx ); /** Return the total number of faces drawn * - * @return + * \return */ size_t getNumFaces() const; /** Return the total number of vertices drawn * - * @return + * \return */ size_t getNumVertices() const; diff --git a/src/Engine/Rendering/RenderTechnique.cpp b/src/Engine/Rendering/RenderTechnique.cpp index 035641a57bd..35d69a0406d 100644 --- a/src/Engine/Rendering/RenderTechnique.cpp +++ b/src/Engine/Rendering/RenderTechnique.cpp @@ -137,7 +137,7 @@ namespace EngineRenderTechniques { static std::map EngineTechniqueRegistry; /** register a new default builder for a technique - * @return true if builder added, false else (e.g, a builder with the same name exists) + * \return true if builder added, false else (e.g, a builder with the same name exists) */ bool registerDefaultTechnique( const std::string& name, DefaultTechniqueBuilder builder ) { auto result = EngineTechniqueRegistry.insert( { name, builder } ); @@ -145,7 +145,7 @@ bool registerDefaultTechnique( const std::string& name, DefaultTechniqueBuilder } /** remove a default builder - * @return true if builder removed, false else (e.g, a builder with the same name does't exists) + * \return true if builder removed, false else (e.g, a builder with the same name does't exists) */ bool removeDefaultTechnique( const std::string& name ) { std::size_t removed = EngineTechniqueRegistry.erase( name ); @@ -153,8 +153,8 @@ bool removeDefaultTechnique( const std::string& name ) { } /** - * @param name name of the technique to construct - * @return a pair containing the search result and, if true, the functor to call to build the + * \param name name of the technique to construct + * \return a pair containing the search result and, if true, the functor to call to build the * technique. */ std::pair getDefaultTechnique( const std::string& name ) { diff --git a/src/Engine/Rendering/RenderTechnique.hpp b/src/Engine/Rendering/RenderTechnique.hpp index 06e41897f61..b9721eddde8 100644 --- a/src/Engine/Rendering/RenderTechnique.hpp +++ b/src/Engine/Rendering/RenderTechnique.hpp @@ -43,13 +43,13 @@ enum DefaultRenderingPasses : int { /** * The transparency pass of Radium default renderer. * This pass render, with lighting, the transparent fragments using LIT-OIT algorithm - * @see Ra::Engine::ForwardRenderer documentation + * \see Ra::Engine::ForwardRenderer documentation */ LIGHTING_TRANSPARENT, /** * The volumetric pass of Radium default renderer. * This pass render, with lighting, an object with volumetric material (density matrix) - * @see Ra::Engine::ForwardRenderer documentation + * \see Ra::Engine::ForwardRenderer documentation */ LIGHTING_VOLUMETRIC @@ -57,7 +57,7 @@ enum DefaultRenderingPasses : int { /** * Set of shaders to be used by the renderer to render objects with associated data. - * @see Render technique and materials section in the Material management in the Radium Engine + * \see Render technique and materials section in the Material management in the Radium Engine * documentation */ class RA_ENGINE_API RenderTechnique final @@ -72,56 +72,56 @@ class RA_ENGINE_API RenderTechnique final /** * Set the shader configuration for the given pass. * m_numActivePass is updated to be the max of all indices that are set this way. - * @param newConfig The pass shader configuration - * @param pass The index of the pass to set + * \param newConfig The pass shader configuration + * \param pass The index of the pass to set */ void setConfiguration( const Data::ShaderConfiguration& newConfig, Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ); /** * Test if the given pass was configured - * @param pass The index of the pass - * @return true if the pass was configured + * \param pass The index of the pass + * \return true if the pass was configured */ inline bool hasConfiguration( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ) const; /** * Mark the given configured. - * @param pass The index of the pass + * \param pass The index of the pass */ inline void setConfiguration( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ); /** * Mark the given not configured. - * @param pass The index of the pass + * \param pass The index of the pass */ inline void clearConfiguration( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ); /** * Get the configuration of the given pass - * @param pass The index of the pass - * @return The pass shader configuration + * \param pass The index of the pass + * \return The pass shader configuration */ inline const Data::ShaderConfiguration& getConfiguration( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ) const; /** * Get the Data::ShaderProgram associated with the pass - * @param pass The index of the pass - * @return The pass shader program if the pass is configured, nullptr otherwise. + * \param pass The index of the pass + * \return The pass shader program if the pass is configured, nullptr otherwise. */ const Data::ShaderProgram* getShader( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ) const; /** * Set the shader parameter provider for the given pass. - * @note all passes must be configured first using RenderTechnique::setConfiguration() before + * \note all passes must be configured first using RenderTechnique::setConfiguration() before * setting the parameter provider for each pass. - * @param provider The rendering parameter provider - * @param pass The index of the pass to set. If this -1, all active passes will share the same + * \param provider The rendering parameter provider + * \param pass The index of the pass to set. If this -1, all active passes will share the same * provider. */ void setParametersProvider( std::shared_ptr provider, @@ -129,8 +129,8 @@ class RA_ENGINE_API RenderTechnique final /** * Get the Data::ShaderProgram parameters associated with the pass - * @param pass The index of the pass - * @return The pass Data::ShaderParameterProvider if the pass is configured, nullptr otherwise. + * \param pass The index of the pass + * \return The pass Data::ShaderParameterProvider if the pass is configured, nullptr otherwise. */ const Data::ShaderParameterProvider* getParametersProvider( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ) const; @@ -142,27 +142,27 @@ class RA_ENGINE_API RenderTechnique final /** * Test if the given pass is dirty (openGL state not updated) - * @param pass The index of the pass - * @return Tru if pass must be updated. + * \param pass The index of the pass + * \return Tru if pass must be updated. */ inline bool isDirty( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ) const; /** * Set the given pass dirty (openGL state not updated) - * @param pass The index of the pass + * \param pass The index of the pass */ inline void setDirty( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ); /** * Clear the dirty bit for the given pass (openGL state updated) - * @param pass The index of the pass + * \param pass The index of the pass */ inline void clearDirty( Core::Utils::Index pass = DefaultRenderingPasses::LIGHTING_OPAQUE ); /** - * Add properties (several #define in the shader) for the given pass - * @param props the properties list, only strings without the #define - * @param pass the pass. If left by default, all active passes will get the properties + * Add properties (several \#define in the shader) for the given pass + * \param props the properties list, only strings without the \#define + * \param pass the pass. If left by default, all active passes will get the properties */ void addPassProperties( const std::list& props, Core::Utils::Index pass = Core::Utils::Index {} ); @@ -171,7 +171,7 @@ class RA_ENGINE_API RenderTechnique final * pass 1 --> Z_PREPASS * pass 0 --> LIGHTING_OPAQUE * pass 2 --> LIGHTING_TRANSPARENT - * @return the default technique + * \return the default technique */ static RenderTechnique createDefaultRenderTechnique(); @@ -216,19 +216,19 @@ namespace EngineRenderTechniques { using DefaultTechniqueBuilder = std::function; /** register a new default builder for a material class - * @return true if builder added, false else (e.g, a builder with the same name already exists) + * \return true if builder added, false else (e.g, a builder with the same name already exists) */ RA_ENGINE_API bool registerDefaultTechnique( const std::string& name, DefaultTechniqueBuilder builder ); /** remove a default builder - * @return true if builder removed, false else (e.g, a builder with the same name does't exists) + * \return true if builder removed, false else (e.g, a builder with the same name does't exists) */ RA_ENGINE_API bool removeDefaultTechnique( const std::string& name ); /** - * @param name name of the technique to construct - * @return a pair containing the search result and, if true, the functor to call to build the + * \param name name of the technique to construct + * \return a pair containing the search result and, if true, the functor to call to build the * technique. */ RA_ENGINE_API std::pair @@ -239,8 +239,8 @@ RA_ENGINE_API bool cleanup(); /** * Test if the given pass is dirty (openGL state not updated) - * @param pass The index of the pass - * @return Tru if pass must be updated. + * \param pass The index of the pass + * \return Tru if pass must be updated. */ inline bool RenderTechnique::isDirty( Core::Utils::Index pass ) const { return m_dirtyBits & ( 1 << pass ); @@ -248,7 +248,7 @@ inline bool RenderTechnique::isDirty( Core::Utils::Index pass ) const { /** * Set the given pass dirty (openGL state updated) - * @param pass The index of the pass + * \param pass The index of the pass */ inline void RenderTechnique::setDirty( Core::Utils::Index pass ) { m_dirtyBits |= ( 1 << pass ); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 2e815c8252b..4e7d43545c0 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -145,31 +145,31 @@ void Renderer::initialize( uint width, uint height ) { } Data::TextureParameters texparams; - texparams.width = m_width; - texparams.height = m_height; - texparams.target = GL_TEXTURE_2D; - texparams.minFilter = GL_NEAREST; - texparams.magFilter = GL_NEAREST; - - texparams.name = "Depth"; - texparams.internalFormat = GL_DEPTH_COMPONENT24; - texparams.format = GL_DEPTH_COMPONENT; - texparams.type = GL_UNSIGNED_INT; - m_depthTexture = std::make_unique( texparams ); - - m_pickingFbo = std::make_unique(); - texparams.name = "Picking"; - texparams.internalFormat = GL_RGBA32I; - texparams.format = GL_RGBA_INTEGER; - texparams.type = GL_INT; - m_pickingTexture = std::make_unique( texparams ); + texparams.image.width = m_width; + texparams.image.height = m_height; + texparams.image.target = GL_TEXTURE_2D; + texparams.sampler.minFilter = GL_NEAREST; + texparams.sampler.magFilter = GL_NEAREST; + + texparams.name = "Depth"; + texparams.image.internalFormat = GL_DEPTH_COMPONENT24; + texparams.image.format = GL_DEPTH_COMPONENT; + texparams.image.type = GL_UNSIGNED_INT; + m_depthTexture = std::make_unique( texparams ); + + m_pickingFbo = std::make_unique(); + texparams.name = "Picking"; + texparams.image.internalFormat = GL_RGBA32I; + texparams.image.format = GL_RGBA_INTEGER; + texparams.image.type = GL_INT; + m_pickingTexture = std::make_unique( texparams ); // Final texture - texparams.name = "Final image"; - texparams.internalFormat = GL_RGBA32F; - texparams.format = GL_RGBA; - texparams.type = GL_SCALAR; - m_fancyTexture = std::make_unique( texparams ); + texparams.name = "Final image"; + texparams.image.internalFormat = GL_RGBA32F; + texparams.image.format = GL_RGBA; + texparams.image.type = GL_SCALAR; + m_fancyTexture = std::make_unique( texparams ); m_displayedTexture = m_fancyTexture.get(); m_secondaryTextures["Picking Texture"] = m_pickingTexture.get(); @@ -623,9 +623,9 @@ void Renderer::drawScreenInternal() { { GL_ASSERT( glDepthFunc( GL_ALWAYS ) ); - auto shader = ( m_displayedTexture->getParameters().type == GL_INT || - m_displayedTexture->getParameters().type == GL_UNSIGNED_INT ) - ? ( m_displayedTexture->getParameters().format == GL_DEPTH_COMPONENT + auto shader = ( m_displayedTexture->getParameters().image.type == GL_INT || + m_displayedTexture->getParameters().image.type == GL_UNSIGNED_INT ) + ? ( m_displayedTexture->getParameters().image.format == GL_DEPTH_COMPONENT ? m_shaderProgramManager->getShaderProgram( "DisplayDepthBuffer" ) : m_shaderProgramManager->getShaderProgram( "DrawScreenI" ) ) : m_shaderProgramManager->getShaderProgram( "DrawScreen" ); @@ -680,8 +680,8 @@ void Renderer::resize( uint w, uint h ) { m_fancyTexture->resize( m_width, m_height ); m_pickingFbo->bind(); - m_pickingFbo->attachTexture( GL_DEPTH_ATTACHMENT, m_depthTexture->texture() ); - m_pickingFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_pickingTexture->texture() ); + m_pickingFbo->attachTexture( GL_DEPTH_ATTACHMENT, m_depthTexture->getGpuTexture() ); + m_pickingFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_pickingTexture->getGpuTexture() ); if ( m_pickingFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) { LOG( logERROR ) << "File " << __FILE__ << "(" << __LINE__ << ") Picking FBO Error " << m_pickingFbo->checkStatus(); @@ -719,17 +719,18 @@ std::unique_ptr Renderer::grabFrame( size_t& w, size_t& h ) const { tex->bind(); // Get a buffer to store the pixels of the OpenGL texture (in float format) - auto pixels = std::unique_ptr( new float[tex->width() * tex->height() * 4] ); + auto pixels = std::unique_ptr( new float[tex->getWidth() * tex->getHeight() * 4] ); // Grab the texture data GL_ASSERT( glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_SCALAR, pixels.get() ) ); // Now we must convert the floats to RGB while flipping the image updisde down. - auto writtenPixels = std::unique_ptr( new uchar[tex->width() * tex->height() * 4] ); - for ( uint j = 0; j < tex->height(); ++j ) { - for ( uint i = 0; i < tex->width(); ++i ) { - auto in = 4 * ( j * tex->width() + i ); // Index in the texture buffer - auto ou = 4 * ( ( tex->height() - 1 - j ) * tex->width() + + auto writtenPixels = + std::unique_ptr( new uchar[tex->getWidth() * tex->getHeight() * 4] ); + for ( uint j = 0; j < tex->getHeight(); ++j ) { + for ( uint i = 0; i < tex->getWidth(); ++i ) { + auto in = 4 * ( j * tex->getWidth() + i ); // Index in the texture buffer + auto ou = 4 * ( ( tex->getHeight() - 1 - j ) * tex->getWidth() + i ); // Index in the final image (note the j flipping). writtenPixels[ou + 0] = @@ -742,8 +743,8 @@ std::unique_ptr Renderer::grabFrame( size_t& w, size_t& h ) const { (uchar)std::clamp( float( pixels[in + 3] * 255.f ), float( 0 ), float( 255 ) ); } } - w = tex->width(); - h = tex->height(); + w = tex->getWidth(); + h = tex->getHeight(); return writtenPixels; } diff --git a/src/Engine/Rendering/Renderer.hpp b/src/Engine/Rendering/Renderer.hpp index 888a01a5e4c..9d6b6fb6657 100644 --- a/src/Engine/Rendering/Renderer.hpp +++ b/src/Engine/Rendering/Renderer.hpp @@ -39,7 +39,7 @@ class RenderObjectManager; /** * Abstract renderer for the engine. - * @see Radium Engine default rendering informations + * \see Radium Engine default rendering informations */ class RA_ENGINE_API Renderer { @@ -188,7 +188,7 @@ class RA_ENGINE_API Renderer /** * set the fill/wireframe rendering mode - * @param enabled true if rendering mode must be wireframe, false for fill render mode + * \param enabled true if rendering mode must be wireframe, false for fill render mode */ inline void enableWireframe( bool enabled ); @@ -199,30 +199,30 @@ class RA_ENGINE_API Renderer /** * Set the debug rendering mode - * @param enabled true if rendering mode must include debug objects, false else + * \param enabled true if rendering mode must include debug objects, false else */ inline void enableDebugDraw( bool enabled ); /** * set the post-process mode - * @param enabled true if post processing must bve applied before display. + * \param enabled true if post processing must bve applied before display. */ inline void enablePostProcess( bool enabled ); /** - * @brief Tell the renderer it needs to render. + * \brief Tell the renderer it needs to render. * This method does the following steps : *
    - *
  1. call @see updateRenderObjectsInternal method
  2. - *
  3. call @see renderInternal method
  4. - *
  5. call @see postProcessInternal method
  6. + *
  7. call \see updateRenderObjectsInternal method
  8. + *
  9. call \see renderInternal method
  10. + *
  11. call \see postProcessInternal method
  12. *
  13. render the final texture in the right framebuffer*
  14. *
* - * @param renderData The basic data needed for the rendering : + * \param renderData The basic data needed for the rendering : * Time elapsed since last frame, camera view matrix, camera projection matrix. * - * @note * What "render in the right buffer" means, is that, for example, + * \note * What "render in the right buffer" means, is that, for example, * when using QOpenGLWidget, Qt binds its own framebuffer before calling * updateGL() method. * So, render() takes that into account by saving an eventual bound @@ -232,24 +232,24 @@ class RA_ENGINE_API Renderer void render( const Data::ViewingParameters& renderData ); /** - * @brief Initialize renderer + * \brief Initialize renderer */ void initialize( uint width, uint height ); /** - * @brief Resize the viewport and all the screen textures, fbos. + * \brief Resize the viewport and all the screen textures, fbos. * This function must be overrided as soon as some FBO or screensized * texture is used (since the default implementation just resizes its * own fbos / textures) * - * @param width The new viewport width - * @param height The new viewport height + * \param width The new viewport width + * \param height The new viewport height */ void resize( uint width, uint height ); /** * Add a new picking query for the next rendering - * @param query + * \param query */ inline void addPickingRequest( const PickingQuery& query ); @@ -257,7 +257,7 @@ class RA_ENGINE_API Renderer * Get the vector of picking results. * Results in the returned vector correspond to queries in the return vector by the function * getPickingQueries(). - * @return Queries results + * \return Queries results */ inline const std::vector& getPickingResults() const; @@ -265,7 +265,7 @@ class RA_ENGINE_API Renderer * Get the vector of picking queries. * Queries in the returned vector correspond to results in the return vector by the function * getPickingResults(). - * @return Queries results + * \return Queries results */ inline const std::vector& getPickingQueries() const; @@ -285,7 +285,7 @@ class RA_ENGINE_API Renderer /** Add a light to the renderer. * may be overridden to filter the light or to specialize the way ligths are added to the * renderer ... - * @param light + * \param light */ virtual void addLight( const Scene::Light* light ); @@ -300,44 +300,44 @@ class RA_ENGINE_API Renderer // "windowed" mode (that would show the debugged texture in // its own viewport, without hiding the final texture.) /** - * @brief Change the texture that is displayed on screen. + * \brief Change the texture that is displayed on screen. * Set m_displayedIsDepth to true if depth linearization is wanted * - * @param texName The texture to display. + * \param texName The texture to display. */ virtual void displayTexture( const std::string& texName ); /** - * @brief Return the names of renderer available textures - * @return A vector of strings, containing the name of the different textures + * \brief Return the names of renderer available textures + * \return A vector of strings, containing the name of the different textures */ virtual std::vector getAvailableTextures() const; /** - * @brief Get the name of the renderer, e.g to be displayed in the UI - * @return + * \brief Get the name of the renderer, e.g to be displayed in the UI + * \return */ virtual std::string getRendererName() const = 0; /** * Define, for the given render object, the render technique cooresponding to the renderer. - * @param ro the render object to modofy - * @return True if the renderTechnique was defined. + * \param ro the render object to modofy + * \return True if the renderTechnique was defined. */ virtual bool buildRenderTechnique( RenderObject* ro ) const = 0; /** * Loops over all available renderobjects and, build the associated render technique using * buildRenderTechnique(RenderObject *ro) - * @return the number of render objects initialized + * \return the number of render objects initialized */ int buildAllRenderTechniques() const; /** * get the content of the current frame - * @param w width of the region to grab - * @param h heigth oif the region to grab - * @return the pixel array + * \param w width of the region to grab + * \param h heigth oif the region to grab + * \return the pixel array */ virtual std::unique_ptr grabFrame( size_t& w, size_t& h ) const; @@ -353,7 +353,7 @@ class RA_ENGINE_API Renderer protected: /** - * @brief initializeInternal + * \brief initializeInternal * Initialize the renderer dependant resources. */ virtual void initializeInternal() = 0; @@ -365,36 +365,36 @@ class RA_ENGINE_API Renderer /** * Update the renderer dependent resources for the next frame - * @param renderData + * \param renderData */ virtual void updateStepInternal( const Data::ViewingParameters& renderData ) = 0; /** - * @brief All the scene rendering magics basically happens here. + * \brief All the scene rendering magics basically happens here. * - * @param renderData The basic data needed for the rendering : + * \param renderData The basic data needed for the rendering : * Time elapsed since last frame, camera view matrix, camera projection matrix. */ virtual void renderInternal( const Data::ViewingParameters& renderData ) = 0; /** - * @brief Do all post processing stuff. If you override this method, - * be careful to fill @see m_fancyTexture since it is the texture that - * will be displayed at the very end of the @see render method. + * \brief Do all post processing stuff. If you override this method, + * be careful to fill \see m_fancyTexture since it is the texture that + * will be displayed at the very end of the \see render method. * - * @param renderData The basic data needed for the rendering : + * \param renderData The basic data needed for the rendering : * Time elapsed since last frame, camera view matrix, camera projection matrix. */ virtual void postProcessInternal( const Data::ViewingParameters& renderData ) = 0; /** - * @brief Add the debug layer with useful informations + * \brief Add the debug layer with useful informations */ virtual void debugInternal( const Data::ViewingParameters& renderData ) = 0; // is viewingParameters useful ? /** - * @brief Draw the UI data + * \brief Draw the UI data */ virtual void uiInternal( const Data::ViewingParameters& renderData ) = 0; // idem ? @@ -444,9 +444,9 @@ class RA_ENGINE_API Renderer // It would make more sense if we are able to show the // debugged texture in its own viewport. /** - * @brief The texture that will be displayed on screen. If no call to - * @see debugTexture has been done, this is just a pointer to - * @see m_fancyTexture. + * \brief The texture that will be displayed on screen. If no call to + * \see debugTexture has been done, this is just a pointer to + * \see m_fancyTexture. */ Data::Texture* m_displayedTexture { nullptr }; diff --git a/src/Engine/Scene/CameraComponent.cpp b/src/Engine/Scene/CameraComponent.cpp index bd3ac41d74e..eada0a8e68f 100644 --- a/src/Engine/Scene/CameraComponent.cpp +++ b/src/Engine/Scene/CameraComponent.cpp @@ -58,10 +58,10 @@ void CameraComponent::initialize() { m->loadGeometry( std::move( triMesh ) ); // Create the RO - auto mat = Core::make_shared( m_name + "_Material" ); - mat->m_color = { 1_ra, .5_ra, 0_ra, 1_ra }; - mat->m_perVertexColor = false; - m_RO = Rendering::RenderObject::createRenderObject( m_name + "_RO", + auto mat = Core::make_shared( m_name + "_Material" ); + mat->setColor( { 1_ra, .5_ra, 0_ra, 1_ra } ); + mat->setColoredByVertexAttrib( false ); + m_RO = Rendering::RenderObject::createRenderObject( m_name + "_RO", this, Rendering::RenderObjectType::Geometry, m, diff --git a/src/Engine/Scene/CameraComponent.hpp b/src/Engine/Scene/CameraComponent.hpp index 30167920dd3..57b456f7b65 100644 --- a/src/Engine/Scene/CameraComponent.hpp +++ b/src/Engine/Scene/CameraComponent.hpp @@ -18,8 +18,6 @@ class Entity; class RA_ENGINE_API CameraComponent : public Scene::Component { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - CameraComponent( Entity* entity, const std::string& name, Scalar height = 1, Scalar width = 1 ); ~CameraComponent() override; diff --git a/src/Engine/Scene/CameraManager.hpp b/src/Engine/Scene/CameraManager.hpp index 55f1581ce39..385d96f756e 100644 --- a/src/Engine/Scene/CameraManager.hpp +++ b/src/Engine/Scene/CameraManager.hpp @@ -66,7 +66,7 @@ class RA_ENGINE_API CameraManager : public System // /** - * @brief Number of managed Cameras. + * \brief Number of managed Cameras. */ virtual size_t count() const; diff --git a/src/Engine/Scene/Component.hpp b/src/Engine/Scene/Component.hpp index 73b1ecc35aa..e11f458b34c 100644 --- a/src/Engine/Scene/Component.hpp +++ b/src/Engine/Scene/Component.hpp @@ -23,7 +23,7 @@ class System; class Entity; /** - * @brief A component is an element that can be updated by a system. + * \brief A component is an element that can be updated by a system. * It is also linked to some other components in an entity. * Each component share a transform through their entity. */ @@ -37,15 +37,15 @@ class RA_ENGINE_API Component virtual ~Component(); /** - * @brief Pure virtual method to be overridden by any component. + * \brief Pure virtual method to be overridden by any component. * When this method is called you are guaranteed that all other startup systems * have been loaded. */ virtual void initialize() = 0; /** - * @brief Set entity the component is part of. + * \brief Set entity the component is part of. * This method is called by the entity. - * @param entity The entity the component is part of. + * \param entity The entity the component is part of. */ virtual void setEntity( Entity* entity ) { m_entity = entity; } diff --git a/src/Engine/Scene/ComponentMessenger.cpp b/src/Engine/Scene/ComponentMessenger.cpp index 2b46d148afa..48f7f811846 100644 --- a/src/Engine/Scene/ComponentMessenger.cpp +++ b/src/Engine/Scene/ComponentMessenger.cpp @@ -10,7 +10,7 @@ RA_SINGLETON_IMPLEMENTATION( ComponentMessenger ); void ComponentMessenger::unregisterAll( const Entity* entity, Component* comp ) { for ( auto& entityList : std::array, 3> { - m_entitySetLists, m_entityGetLists, m_entityRwLists } ) { + { m_entitySetLists, m_entityGetLists, m_entityRwLists } } ) { auto listItr = entityList.get().find( entity ); if ( listItr != entityList.get().end() ) { diff --git a/src/Engine/Scene/DefaultCameraManager.hpp b/src/Engine/Scene/DefaultCameraManager.hpp index 85dddc57324..2ad7867a953 100644 --- a/src/Engine/Scene/DefaultCameraManager.hpp +++ b/src/Engine/Scene/DefaultCameraManager.hpp @@ -31,7 +31,7 @@ class RA_ENGINE_API DefaultCameraStorage : public CameraStorage }; /** - * @brief DefaultCameraManager. A simple Camera Manager with a list of Cameras. + * \brief DefaultCameraManager. A simple Camera Manager with a list of Cameras. */ class RA_ENGINE_API DefaultCameraManager : public CameraManager { diff --git a/src/Engine/Scene/DefaultLightManager.hpp b/src/Engine/Scene/DefaultLightManager.hpp index 9206e022e38..c930f3f01a2 100644 --- a/src/Engine/Scene/DefaultLightManager.hpp +++ b/src/Engine/Scene/DefaultLightManager.hpp @@ -31,7 +31,7 @@ class RA_ENGINE_API DefaultLightStorage : public LightStorage }; /** - * @brief DefaultLightManager. A simple Light Manager with a list of lights. + * \brief DefaultLightManager. A simple Light Manager with a list of lights. */ class RA_ENGINE_API DefaultLightManager : public LightManager { diff --git a/src/Engine/Scene/DirLight.cpp b/src/Engine/Scene/DirLight.cpp index 635f5d6a97c..ae5aac80ff9 100644 --- a/src/Engine/Scene/DirLight.cpp +++ b/src/Engine/Scene/DirLight.cpp @@ -7,7 +7,7 @@ namespace Engine { namespace Scene { DirectionalLight::DirectionalLight( Entity* entity, const std::string& name ) : Light( entity, Light::DIRECTIONAL, name ) { - getRenderParameters().addParameter( "light.directional.direction", m_direction ); + getRenderParameters().setVariable( "light.directional.direction", m_direction ); } std::string DirectionalLight::getShaderInclude() const { diff --git a/src/Engine/Scene/DirLight.hpp b/src/Engine/Scene/DirLight.hpp index 5f0bbb42551..b75e19292b2 100644 --- a/src/Engine/Scene/DirLight.hpp +++ b/src/Engine/Scene/DirLight.hpp @@ -15,8 +15,6 @@ class Entity; class RA_ENGINE_API DirectionalLight final : public Ra::Engine::Scene::Light { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - explicit DirectionalLight( Entity* entity, const std::string& name = "dirlight" ); ~DirectionalLight() override = default; @@ -34,7 +32,7 @@ class RA_ENGINE_API DirectionalLight final : public Ra::Engine::Scene::Light inline void DirectionalLight::setDirection( const Eigen::Matrix& dir ) { m_direction = dir.normalized(); - getRenderParameters().addParameter( "light.directional.direction", m_direction ); + getRenderParameters().setVariable( "light.directional.direction", m_direction ); } inline const Eigen::Matrix& DirectionalLight::getDirection() const { diff --git a/src/Engine/Scene/Entity.hpp b/src/Engine/Scene/Entity.hpp index 90d8392da8c..cc66aff404e 100644 --- a/src/Engine/Scene/Entity.hpp +++ b/src/Engine/Scene/Entity.hpp @@ -22,7 +22,6 @@ class System; class RA_ENGINE_API Entity : public Core::Utils::IndexedObject { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW explicit Entity( const std::string& name = "" ); // Entities are not copyable. diff --git a/src/Engine/Scene/EntityManager.hpp b/src/Engine/Scene/EntityManager.hpp index 73a7aae25e7..a1514f6f288 100644 --- a/src/Engine/Scene/EntityManager.hpp +++ b/src/Engine/Scene/EntityManager.hpp @@ -30,58 +30,58 @@ class RA_ENGINE_API EntityManager virtual ~EntityManager(); /** - * @brief Create (if does not exist) an entity given its name - * @param name The name of the entity to get or create. If + * \brief Create (if does not exist) an entity given its name + * \param name The name of the entity to get or create. If * empty, the entity will be created with a generic name "Entity_xx" - * @return The entity. + * \return The entity. */ Entity* createEntity( const std::string& name = "" ); /** - * @brief Check wether an entity with a given name exists or not. - * @param name The name of the entity to find - * @return true if the entity exists, false otherwise + * \brief Check wether an entity with a given name exists or not. + * \param name The name of the entity to find + * \return true if the entity exists, false otherwise */ bool entityExists( const std::string& name ) const; /** - * @brief Remove an entity given its index. Also deletes the pointer. - * @param idx Index if the entity to remove. + * \brief Remove an entity given its index. Also deletes the pointer. + * \param idx Index if the entity to remove. */ void removeEntity( Core::Utils::Index idx ); /** - * @brief Remove a given entity. Also deletes the pointer. - * @param entity The entity to remove. + * \brief Remove a given entity. Also deletes the pointer. + * \param entity The entity to remove. */ void removeEntity( Entity* entity ); /** - * @brief Get an entity given its index. - * @param idx Index of the component to retrieve. - * @return The entity if found in the map, nullptr otherwise. + * \brief Get an entity given its index. + * \param idx Index of the component to retrieve. + * \return The entity if found in the map, nullptr otherwise. */ Entity* getEntity( Core::Utils::Index idx ) const; /** - * @brief Get all entities from the manager. + * \brief Get all entities from the manager. * This might be usefull to be able to display and navigate through them * in a GUI for example. - * @return A list containing all entities from the manager. + * \return A list containing all entities from the manager. */ std::vector getEntities() const; void swapBuffers(); /** - * @brief Get an entity given its name. - * @param name Name of the entity to retrieve. - * @return The entity if found in the map, nullptr otherwise. + * \brief Get an entity given its name. + * \param name Name of the entity to retrieve. + * \return The entity if found in the map, nullptr otherwise. */ Entity* getEntity( const std::string& name ) const; /** - * @brief Removes all entities. + * \brief Removes all entities. */ void deleteEntities(); diff --git a/src/Engine/Scene/GeometryComponent.cpp b/src/Engine/Scene/GeometryComponent.cpp index c9056fed4dd..84df63dc1f9 100644 --- a/src/Engine/Scene/GeometryComponent.cpp +++ b/src/Engine/Scene/GeometryComponent.cpp @@ -93,10 +93,10 @@ void PointCloudComponent::finalizeROFromGeometry( const Core::Asset::MaterialDat roMaterial.reset( mat ); } else { - auto mat = new Data::BlinnPhongMaterial( m_contentName + "_DefaultBPMaterial" ); - mat->m_renderAsSplat = m_displayMesh->getNumFaces() == 0; - mat->m_perVertexColor = m_displayMesh->getCoreGeometry().hasAttrib( - Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ) ); + auto mat = new Data::BlinnPhongMaterial( m_contentName + "_DefaultBPMaterial" ); + mat->setRenderAsSplat( m_displayMesh->getNumFaces() == 0 ); + mat->setColoredByVertexAttrib( m_displayMesh->getCoreGeometry().hasAttrib( + Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ) ) ); roMaterial.reset( mat ); } // initialize with a default rendertechique that draws nothing diff --git a/src/Engine/Scene/GeometryComponent.hpp b/src/Engine/Scene/GeometryComponent.hpp index 16fa5104e15..0e689a96e37 100644 --- a/src/Engine/Scene/GeometryComponent.hpp +++ b/src/Engine/Scene/GeometryComponent.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -81,7 +82,10 @@ class SurfaceMeshComponent : public GeometryComponent Entity* entity, CoreMeshType&& mesh, Core::Asset::MaterialData* mat = nullptr ); - + inline SurfaceMeshComponent( const std::string& name, + Entity* entity, + CoreMeshType&& mesh, + std::shared_ptr mat ); ~SurfaceMeshComponent() override = default; /// Returns the current display geometry. @@ -95,7 +99,10 @@ class SurfaceMeshComponent : public GeometryComponent private: inline void generateMesh( const Ra::Core::Asset::GeometryData* data ); - inline void finalizeROFromGeometry( const Core::Asset::MaterialData* data, + inline std::shared_ptr + convertMatdataToMaterial( const Core::Asset::MaterialData* data ); + + inline void finalizeROFromGeometry( std::shared_ptr roMaterial, Core::Transform transform ); // Give access to the mesh and (if deformable) to update it @@ -222,7 +229,7 @@ SurfaceMeshComponent::SurfaceMeshComponent( const std::string& nam Entity* entity, std::shared_ptr data ) : GeometryComponent( name, entity ), m_displayMesh( data ) { - finalizeROFromGeometry( nullptr, Core::Transform::Identity() ); + finalizeROFromGeometry( convertMatdataToMaterial( nullptr ), Core::Transform::Identity() ); } template @@ -233,9 +240,20 @@ SurfaceMeshComponent::SurfaceMeshComponent( const std::string& nam GeometryComponent( name, entity ), m_displayMesh( new RenderMeshType( name, std::move( mesh ) ) ) { setContentName( name ); - finalizeROFromGeometry( mat, Core::Transform::Identity() ); + finalizeROFromGeometry( convertMatdataToMaterial( mat ), Core::Transform::Identity() ); } +template +SurfaceMeshComponent::SurfaceMeshComponent( + const std::string& name, + Entity* entity, + CoreMeshType&& mesh, + std::shared_ptr mat ) : + GeometryComponent( name, entity ), + m_displayMesh( new RenderMeshType( name, std::move( mesh ) ) ) { + setContentName( name ); + finalizeROFromGeometry( mat, Core::Transform::Identity() ); +} template void SurfaceMeshComponent::generateMesh( const Ra::Core::Asset::GeometryData* data ) { m_contentName = data->getName(); @@ -244,14 +262,14 @@ void SurfaceMeshComponent::generateMesh( const Ra::Core::Asset::Ge m_displayMesh->loadGeometry( std::move( mesh ) ); - finalizeROFromGeometry( data->hasMaterial() ? &( data->getMaterial() ) : nullptr, - data->getFrame() ); + finalizeROFromGeometry( + convertMatdataToMaterial( data->hasMaterial() ? &( data->getMaterial() ) : nullptr ), + data->getFrame() ); } template -void SurfaceMeshComponent::finalizeROFromGeometry( - const Core::Asset::MaterialData* data, - Core::Transform transform ) { +std::shared_ptr SurfaceMeshComponent::convertMatdataToMaterial( + const Core::Asset::MaterialData* data ) { // The technique for rendering this component std::shared_ptr roMaterial; // First extract the material from asset or create a default one @@ -261,12 +279,20 @@ void SurfaceMeshComponent::finalizeROFromGeometry( roMaterial.reset( mat ); } else { - auto mat = new Data::BlinnPhongMaterial( m_contentName + "_DefaultBPMaterial" ); - mat->m_renderAsSplat = m_displayMesh->getNumFaces() == 0; - mat->m_perVertexColor = m_displayMesh->getCoreGeometry().hasAttrib( - Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ) ); + auto mat = new Data::BlinnPhongMaterial( m_contentName + "_DefaultBPMaterial" ); + mat->setRenderAsSplat( m_displayMesh->getNumFaces() == 0 ); + mat->setColoredByVertexAttrib( m_displayMesh->getCoreGeometry().hasAttrib( + Ra::Core::Geometry::getAttribName( Ra::Core::Geometry::VERTEX_COLOR ) ) ); roMaterial.reset( mat ); } + return roMaterial; +} + +template +void SurfaceMeshComponent::finalizeROFromGeometry( + std::shared_ptr roMaterial, + Core::Transform transform ) { + // initialize with a default rendertechique that draws nothing std::string roName( m_name + "_" + m_contentName + "_RO" ); auto ro = Rendering::RenderObject::createRenderObject( roName, @@ -283,6 +309,7 @@ void SurfaceMeshComponent::finalizeROFromGeometry( #ifndef CHECK_MESH_NOT_NULL # define CHECK_MESH_NOT_NULL \ + \ CORE_ASSERT( m_displayMesh != nullptr, \ "DisplayMesh should exist while component is alive" ); # define CHECK_MESH_NOT_NULL_UNDEF diff --git a/src/Engine/Scene/Light.cpp b/src/Engine/Scene/Light.cpp index fb96865b5dd..767615625bd 100644 --- a/src/Engine/Scene/Light.cpp +++ b/src/Engine/Scene/Light.cpp @@ -1,5 +1,6 @@ #include +#include #include #include @@ -8,12 +9,12 @@ namespace Engine { namespace Scene { Light::Light( Scene::Entity* entity, const LightType& type, const std::string& name ) : Component( name, entity ), m_type( type ) { - m_params.addParameter( "light.type", m_type ); - m_params.addParameter( "light.color", m_color ); + Core::VariableSetEnumManagement::setEnumVariable( m_params, "light.type", m_type ); + m_params.setVariable( "light.color", m_color ); } void Light::getRenderParameters( Data::RenderParameters& params ) const { - params.mergeReplaceParameters( m_params ); + params.mergeReplaceVariables( m_params ); } void Light::initialize() { diff --git a/src/Engine/Scene/Light.hpp b/src/Engine/Scene/Light.hpp index e12d9a91841..a3b1f06545f 100644 --- a/src/Engine/Scene/Light.hpp +++ b/src/Engine/Scene/Light.hpp @@ -21,14 +21,14 @@ class RA_ENGINE_API Light : public Component { public: /** supported light type. - * @note POLYGONAL is not really supported. - * @todo : replace this enum by something extensible as we plan to add new light type by plugins + * \note POLYGONAL is not really supported. + * \todo : replace this enum by something extensible as we plan to add new light type by plugins */ enum LightType : int { DIRECTIONAL = 0, POINT, SPOT, POLYGONAL }; /** * Define the attenuation of the light source - * @todo for the moment, the attenuation is non physically coherent. make attenuation be + * \todo for the moment, the attenuation is non physically coherent. make attenuation be * quadratic by default */ struct Attenuation { @@ -39,52 +39,50 @@ class RA_ENGINE_API Light : public Component }; public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - /** * Create a new light. The new light is a component attached to the given entity - * @param entity - * @param type - * @param name + * \param entity + * \param type + * \param name */ Light( Entity* entity, const LightType& type, const std::string& name = "light" ); ~Light() override = default; /** * - * @return the color of the light + * \return the color of the light */ inline const Core::Utils::Color& getColor() const { return m_color; } /** * Set the color of the light - * @param color + * \param color */ inline void setColor( const Core::Utils::Color& color ); /** * set the direction of lighting - * @todo put this only on directional and spot light sources - * @param dir + * \todo put this only on directional and spot light sources + * \param dir */ virtual void setDirection( const Eigen::Matrix& /*dir*/ ) {} /** * Set the position of the light source - * @todo put this only on point and spot light sources - * @param pos + * \todo put this only on point and spot light sources + * \param pos */ virtual void setPosition( const Eigen::Matrix& /*pos*/ ) {} // ... /** * - * @return the type (an enum Light::LightType member) of the light source + * \return the type (an enum Light::LightType member) of the light source */ inline const LightType& getType() const { return m_type; } /** * \brief Extract the set of parameters that must be given to a shader for rendering and * lighting with this light. - * @param params parameters to be filled (using merge-replace) with the one of the light + * \param params parameters to be filled (using merge-replace) with the one of the light */ void getRenderParameters( Data::RenderParameters& params ) const; @@ -103,7 +101,7 @@ class RA_ENGINE_API Light : public Component * Abstract method that define the glsl code that manage this light type * For the moment, this is not use (except by experimental plugins) but will be part of the * shader composition process of radium v2 - * @return + * \return */ virtual std::string getShaderInclude() const; @@ -123,7 +121,7 @@ class RA_ENGINE_API Light : public Component inline void Light::setColor( const Core::Utils::Color& color ) { m_color = color; - m_params.addParameter( "light.color", m_color ); + m_params.setVariable( "light.color", m_color ); } } // namespace Scene diff --git a/src/Engine/Scene/LightManager.hpp b/src/Engine/Scene/LightManager.hpp index e329f494430..a01b88a62bf 100644 --- a/src/Engine/Scene/LightManager.hpp +++ b/src/Engine/Scene/LightManager.hpp @@ -34,7 +34,7 @@ class RA_ENGINE_API LightManager : public System /** Add a light to the manager ... * Consider the component is already registered. The light manager will not take ownership of * the added light, it will just push the light on the storage ... - * @param li The (already registered) light to add. + * \param li The (already registered) light to add. */ virtual void addLight( const Scene::Light* li ) = 0; @@ -43,7 +43,7 @@ class RA_ENGINE_API LightManager : public System // /** - * @brief Number of lights. + * \brief Number of lights. * This is still a work in progress. The idea is to make it possible for a * LightManager to tell it has only one Light, for example if it wants to send * a lot of sources at once in a single RenderParams, let's say a texture. diff --git a/src/Engine/Scene/PointLight.cpp b/src/Engine/Scene/PointLight.cpp index ae40364b722..2583d81d3ed 100644 --- a/src/Engine/Scene/PointLight.cpp +++ b/src/Engine/Scene/PointLight.cpp @@ -7,12 +7,11 @@ namespace Engine { namespace Scene { PointLight::PointLight( Entity* entity, const std::string& name ) : Light( entity, Light::POINT, name ) { - getRenderParameters().addParameter( "light.point.position", m_position ); - getRenderParameters().addParameter( "light.point.attenuation.constant", - m_attenuation.constant ); - getRenderParameters().addParameter( "light.point.attenuation.linear", m_attenuation.linear ); - getRenderParameters().addParameter( "light.point.attenuation.quadratic", - m_attenuation.quadratic ); + getRenderParameters().setVariable( "light.point.position", m_position ); + getRenderParameters().setVariable( "light.point.attenuation.constant", m_attenuation.constant ); + getRenderParameters().setVariable( "light.point.attenuation.linear", m_attenuation.linear ); + getRenderParameters().setVariable( "light.point.attenuation.quadratic", + m_attenuation.quadratic ); } std::string PointLight::getShaderInclude() const { diff --git a/src/Engine/Scene/PointLight.hpp b/src/Engine/Scene/PointLight.hpp index 21addeedce3..312d8c3a33c 100644 --- a/src/Engine/Scene/PointLight.hpp +++ b/src/Engine/Scene/PointLight.hpp @@ -14,8 +14,6 @@ class Entity; class RA_ENGINE_API PointLight final : public Ra::Engine::Scene::Light { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - explicit PointLight( Entity* entity, const std::string& name = "pointlight" ); ~PointLight() override = default; @@ -39,7 +37,7 @@ class RA_ENGINE_API PointLight final : public Ra::Engine::Scene::Light inline void PointLight::setPosition( const Eigen::Matrix& pos ) { m_position = pos; - getRenderParameters().addParameter( "light.point.position", m_position ); + getRenderParameters().setVariable( "light.point.position", m_position ); } inline const Eigen::Matrix& PointLight::getPosition() const { @@ -48,11 +46,10 @@ inline const Eigen::Matrix& PointLight::getPosition() const { inline void PointLight::setAttenuation( const PointLight::Attenuation& attenuation ) { m_attenuation = attenuation; - getRenderParameters().addParameter( "light.point.attenuation.constant", - m_attenuation.constant ); - getRenderParameters().addParameter( "light.point.attenuation.linear", m_attenuation.linear ); - getRenderParameters().addParameter( "light.point.attenuation.quadratic", - m_attenuation.quadratic ); + getRenderParameters().setVariable( "light.point.attenuation.constant", m_attenuation.constant ); + getRenderParameters().setVariable( "light.point.attenuation.linear", m_attenuation.linear ); + getRenderParameters().setVariable( "light.point.attenuation.quadratic", + m_attenuation.quadratic ); } inline void PointLight::setAttenuation( Scalar constant, Scalar linear, Scalar quadratic ) { diff --git a/src/Engine/Scene/SignalManager.hpp b/src/Engine/Scene/SignalManager.hpp index 46ece2dd582..9d977ad7082 100644 --- a/src/Engine/Scene/SignalManager.hpp +++ b/src/Engine/Scene/SignalManager.hpp @@ -57,7 +57,7 @@ class RA_ENGINE_API SignalManager using FrameObservable = Ra::Core::Utils::Observable<>; /// Access to the observable members - ///@{ + ///\{ ItemObservable& getEntityCreatedNotifier(); ItemObservable& getEntityDestroyedNotifier(); ItemObservable& getComponentCreatedNotifier(); @@ -65,7 +65,7 @@ class RA_ENGINE_API SignalManager ItemObservable& getRenderObjectCreatedNotifier(); ItemObservable& getRenderObjectDestroyedNotifier(); FrameObservable& getEndFrameNotifier(); - ///@} + ///\} private: /// lock to prevent race conditions on observables @@ -75,19 +75,19 @@ class RA_ENGINE_API SignalManager bool m_isOn { true }; /// Item observables - ///@{ + ///\{ ItemObservable m_entityCreatedCallbacks; ItemObservable m_entityDestroyedCallbacks; ItemObservable m_componentAddedCallbacks; ItemObservable m_componentRemovedCallbacks; ItemObservable m_roAddedCallbacks; ItemObservable m_roRemovedCallbacks; - ///@} + ///\} /// Frame observable - ///@{ + ///\{ FrameObservable m_frameEndCallbacks; - ///@} + ///\} /// Helper function to notify observers template diff --git a/src/Engine/Scene/SkeletonBasedAnimationSystem.cpp b/src/Engine/Scene/SkeletonBasedAnimationSystem.cpp index 8337d42c4c6..f9ce7f0a807 100644 --- a/src/Engine/Scene/SkeletonBasedAnimationSystem.cpp +++ b/src/Engine/Scene/SkeletonBasedAnimationSystem.cpp @@ -27,12 +27,10 @@ SkeletonBasedAnimationSystem::SkeletonBasedAnimationSystem() : System(), m_xrayO auto* engine = RadiumEngine::getInstance(); auto* texMngr = engine->getTextureManager(); // Register an entry into the texture manager - auto& heatmapData = texMngr->addTexture( "Engine:Skinning:weights", 1, 128, nullptr ); // load the texture image without OpenGL initialization - heatmapData.name = *resourceDir + "/Textures/heatmap.png"; - texMngr->loadTextureImage( heatmapData ); - // Set the registered name again for further access to the texture - heatmapData.name = "Engine:Skinning:weights"; + auto image = texMngr->loadTextureImage( *resourceDir + "/Textures/heatmap.png" ); + Data::TextureParameters heatMapTexturePamameters = { "Engine:Skinning:weights", {}, image }; + m_heatMapTextureHandle = texMngr->addTexture( heatMapTexturePamameters ); } } diff --git a/src/Engine/Scene/SkeletonBasedAnimationSystem.hpp b/src/Engine/Scene/SkeletonBasedAnimationSystem.hpp index 9f01f15ab5f..ae7ce372f7d 100644 --- a/src/Engine/Scene/SkeletonBasedAnimationSystem.hpp +++ b/src/Engine/Scene/SkeletonBasedAnimationSystem.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Engine/Data/TextureManager.hpp" #include #include @@ -54,6 +55,8 @@ class RA_ENGINE_API SkeletonBasedAnimationSystem : public System /// The current animation time. Scalar m_time { 0_ra }; + + Data::TextureManager::TextureHandle m_heatMapTextureHandle; }; } // namespace Scene diff --git a/src/Engine/Scene/SkeletonComponent.cpp b/src/Engine/Scene/SkeletonComponent.cpp index b47ed0e888d..6d22ed9dbf3 100644 --- a/src/Engine/Scene/SkeletonComponent.cpp +++ b/src/Engine/Scene/SkeletonComponent.cpp @@ -299,8 +299,8 @@ void SkeletonComponent::setupSkeletonDisplay() { s_boneMesh = std::make_shared( "Bone Mesh" ); s_boneMesh->loadGeometry( makeBoneShape() ); s_boneMaterial.reset( new Data::BlinnPhongMaterial( "Bone Material" ) ); - s_boneMaterial->m_kd = Color::Grey( 0.4_ra ); - s_boneMaterial->m_ks = Color::Black(); + s_boneMaterial->setDiffuseColor( Color::Grey( 0.4_ra ) ); + s_boneMaterial->setSpecularColor( Color::Black() ); s_boneRenderTechnique.reset( new Rendering::RenderTechnique ); s_boneRenderTechnique->setConfiguration( *Data::ShaderConfigurationFactory::getConfiguration( "BlinnPhong" ) ); diff --git a/src/Engine/Scene/SkinningComponent.cpp b/src/Engine/Scene/SkinningComponent.cpp index 4646cc3eee4..bfe90e56e12 100644 --- a/src/Engine/Scene/SkinningComponent.cpp +++ b/src/Engine/Scene/SkinningComponent.cpp @@ -184,9 +184,9 @@ void SkinningComponent::initialize() { } // prepare weights material - auto mat = new Data::BlinnPhongMaterial( "SkinningWeights_Mat" ); - mat->m_kd = Color::Skin(); - mat->m_ks = Color::White(); + auto mat = new Data::BlinnPhongMaterial( "SkinningWeights_Mat" ); + mat->setDiffuseColor( Color::Skin() ); + mat->setSpecularColor( Color::White() ); // assign texture Data::TextureParameters texParam; diff --git a/src/Engine/Scene/SpotLight.cpp b/src/Engine/Scene/SpotLight.cpp index 5eef0273a55..515ebc60333 100644 --- a/src/Engine/Scene/SpotLight.cpp +++ b/src/Engine/Scene/SpotLight.cpp @@ -6,14 +6,14 @@ namespace Engine { namespace Scene { SpotLight::SpotLight( Entity* entity, const std::string& name ) : Light( entity, Light::SPOT, name ) { - getRenderParameters().addParameter( "light.spot.position", m_position ); - getRenderParameters().addParameter( "light.spot.direction", m_direction ); - getRenderParameters().addParameter( "light.spot.innerAngle", m_innerAngle ); - getRenderParameters().addParameter( "light.spot.outerAngle", m_outerAngle ); - getRenderParameters().addParameter( "light.spot.attenuation.constant", m_attenuation.constant ); - getRenderParameters().addParameter( "light.spot.attenuation.linear", m_attenuation.linear ); - getRenderParameters().addParameter( "light.spot.attenuation.quadratic", - m_attenuation.quadratic ); + getRenderParameters().setVariable( "light.spot.position", m_position ); + getRenderParameters().setVariable( "light.spot.direction", m_direction ); + getRenderParameters().setVariable( "light.spot.innerAngle", m_innerAngle ); + getRenderParameters().setVariable( "light.spot.outerAngle", m_outerAngle ); + getRenderParameters().setVariable( "light.spot.attenuation.constant", m_attenuation.constant ); + getRenderParameters().setVariable( "light.spot.attenuation.linear", m_attenuation.linear ); + getRenderParameters().setVariable( "light.spot.attenuation.quadratic", + m_attenuation.quadratic ); } std::string SpotLight::getShaderInclude() const { diff --git a/src/Engine/Scene/SpotLight.hpp b/src/Engine/Scene/SpotLight.hpp index 73ea293bf95..82e9b32e94c 100644 --- a/src/Engine/Scene/SpotLight.hpp +++ b/src/Engine/Scene/SpotLight.hpp @@ -16,8 +16,6 @@ class RA_ENGINE_API SpotLight final : public Ra::Engine::Scene::Light { public: - EIGEN_MAKE_ALIGNED_OPERATOR_NEW - explicit SpotLight( Entity* entity, const std::string& name = "spotlight" ); ~SpotLight() override = default; @@ -56,7 +54,7 @@ class RA_ENGINE_API SpotLight final : public Ra::Engine::Scene::Light inline void SpotLight::setPosition( const Eigen::Matrix& position ) { m_position = position; - getRenderParameters().addParameter( "light.spot.position", m_position ); + getRenderParameters().setVariable( "light.spot.position", m_position ); } inline const Eigen::Matrix& Scene::SpotLight::getPosition() const { @@ -65,7 +63,7 @@ inline const Eigen::Matrix& Scene::SpotLight::getPosition() const inline void SpotLight::setDirection( const Eigen::Matrix& direction ) { m_direction = direction.normalized(); - getRenderParameters().addParameter( "light.spot.direction", m_direction ); + getRenderParameters().setVariable( "light.spot.direction", m_direction ); } inline const Eigen::Matrix& SpotLight::getDirection() const { @@ -74,12 +72,12 @@ inline const Eigen::Matrix& SpotLight::getDirection() const { inline void SpotLight::setInnerAngleInRadians( Scalar angle ) { m_innerAngle = angle; - getRenderParameters().addParameter( "light.spot.innerAngle", m_innerAngle ); + getRenderParameters().setVariable( "light.spot.innerAngle", m_innerAngle ); } inline void SpotLight::setOuterAngleInRadians( Scalar angle ) { m_outerAngle = angle; - getRenderParameters().addParameter( "light.spot.outerAngle", m_outerAngle ); + getRenderParameters().setVariable( "light.spot.outerAngle", m_outerAngle ); } inline void SpotLight::setInnerAngleInDegrees( Scalar angle ) { @@ -100,10 +98,10 @@ inline Scalar SpotLight::getOuterAngle() const { inline void SpotLight::setAttenuation( const Attenuation& attenuation ) { m_attenuation = attenuation; - getRenderParameters().addParameter( "light.spot.attenuation.constant", m_attenuation.constant ); - getRenderParameters().addParameter( "light.spot.attenuation.linear", m_attenuation.linear ); - getRenderParameters().addParameter( "light.spot.attenuation.quadratic", - m_attenuation.quadratic ); + getRenderParameters().setVariable( "light.spot.attenuation.constant", m_attenuation.constant ); + getRenderParameters().setVariable( "light.spot.attenuation.linear", m_attenuation.linear ); + getRenderParameters().setVariable( "light.spot.attenuation.quadratic", + m_attenuation.quadratic ); } inline void SpotLight::setAttenuation( Scalar constant, Scalar linear, Scalar quadratic ) { diff --git a/src/Engine/Scene/System.hpp b/src/Engine/Scene/System.hpp index 7feb0a5eb03..ba5a919dd08 100644 --- a/src/Engine/Scene/System.hpp +++ b/src/Engine/Scene/System.hpp @@ -39,7 +39,7 @@ class RA_ENGINE_API System * Factory method for component creation from file data. * From a given file and the corresponding entity, the system will create the * corresponding components, add them to the entity, and register the component. - * @note : Issue #325 - As this method register components and might also manage each component + * \note : Issue #325 - As this method register components and might also manage each component * outside the m_components vectors (e.g in a buffer on the GPU) the methods, the * registerComponent and unregister*Component must be virtual method that could be overriden. */ @@ -49,26 +49,26 @@ class RA_ENGINE_API System } /** - * @brief Pure virtual method to be overridden by any system. + * \brief Pure virtual method to be overridden by any system. * Must register in taskQueue the operations that must be done ate each frame * - * @param taskQueue The queue to fill - * @param frameInfo Information about the current frame (@see FrameInfo) + * \param taskQueue The queue to fill + * \param frameInfo Information about the current frame (\see FrameInfo) */ virtual void generateTasks( Core::TaskQueue* taskQueue, const Engine::FrameInfo& frameInfo ) = 0; /** Returns the components stored for the given entity. * - * @param entity - * @return the vector of the entity's components + * \param entity + * \return the vector of the entity's components */ std::vector getEntityComponents( const Entity* entity ); /** Register an already configured component to the system. - * @param entity The entity owning the component - * @param component The component to add to the system - * @note the component is added to the system without any compatibility check. + * \param entity The entity owning the component + * \param component The component to add to the system + * \note the component is added to the system without any compatibility check. */ void addComponent( Entity* entity, Component* component ) { registerComponent( entity, component ); @@ -77,24 +77,24 @@ class RA_ENGINE_API System protected: /** * Registers a component belonging to an entity, making it active within the system. - * @note If a system overrides this function, it must call the inherited method. - * @param entity - * @param component + * \note If a system overrides this function, it must call the inherited method. + * \param entity + * \param component */ virtual void registerComponent( const Entity* entity, Component* component ); /** * Unregisters a component. The system will not update it. - * @note If a system overrides this function, it must call the inherited method. - * @param entity - * @param component + * \note If a system overrides this function, it must call the inherited method. + * \param entity + * \param component */ virtual void unregisterComponent( const Entity* entity, Component* component ); /** * Removes all components belonging to a given entity. - * @note If a system overrides this function, it must call the inherited method. - * @param entity + * \note If a system overrides this function, it must call the inherited method. + * \param entity */ virtual void unregisterAllComponents( const Entity* entity ); diff --git a/src/Engine/Scene/SystemDisplay.hpp b/src/Engine/Scene/SystemDisplay.hpp index d0e86e8321a..cd96c6612d6 100644 --- a/src/Engine/Scene/SystemDisplay.hpp +++ b/src/Engine/Scene/SystemDisplay.hpp @@ -2,6 +2,7 @@ #include +/// \file SystemDisplay.hpp /// This file's main purpose is to declare a set of macros to allow drawing /// primitives from everywhere in the code, for debug purposes. /// These macros can be completely disabled by #defining the following constant : @@ -24,7 +25,7 @@ namespace Scene { #ifndef RA_DISABLE_DEBUG_DISPLAY -/// Component for debug drawing. @see SystemEntity. +/// Component for debug drawing. \see SystemEntity. class RA_ENGINE_API DebugComponent : public Component { public: @@ -38,7 +39,7 @@ class RA_ENGINE_API DebugComponent : public Component #endif -/// Component for UI drawing. @see SystemEntity. +/// Component for UI drawing. \see SystemEntity. class RA_ENGINE_API UiComponent : public Component { public: diff --git a/src/Engine/filelist.cmake b/src/Engine/filelist.cmake index 274f82178ba..b48fd897049 100644 --- a/src/Engine/filelist.cmake +++ b/src/Engine/filelist.cmake @@ -64,6 +64,7 @@ set(engine_headers Data/LambertianMaterial.hpp Data/Material.hpp Data/MaterialConverters.hpp + Data/MaterialTextureSet.hpp Data/Mesh.hpp Data/PlainMaterial.hpp Data/RawShaderMaterial.hpp diff --git a/src/Gui/BaseApplication.hpp b/src/Gui/BaseApplication.hpp index bcfde3ae14c..8f42bd512a8 100644 --- a/src/Gui/BaseApplication.hpp +++ b/src/Gui/BaseApplication.hpp @@ -84,7 +84,7 @@ class RA_GUI_API BaseApplication : public QApplication * \param factory : a functor that instanciate the mainWindow * \param glVersion : glbinding::Version of the requested OpenGL Version. * If no version is given, the default recommended version for Radium (4.1) will be requested. - * @note The initialize method call virtual methods on the object being initialized to + * \note The initialize method call virtual methods on the object being initialized to * configure the engine and application services. * When redefining those methods, it is recommended to call the inherited one to have * consistent initialization wrt the BaseApplication ancestor. @@ -128,6 +128,7 @@ class RA_GUI_API BaseApplication : public QApplication bool isRunning() const { return !m_isAboutToQuit; } const Engine::RadiumEngine* getEngine() const { return m_engine; } + Viewer* getViewer() { return m_viewer; } uint getFrameCount() const { return m_frameCounter; } diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index c348f148ee9..30fecf9ec1c 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1,5 +1,6 @@ set(ra_gui_target Gui) -list(APPEND CMAKE_MESSAGE_INDENT "[${ra_gui_target}] ") + +message_prefix_push("${ra_gui_target}") project(${ra_gui_target} LANGUAGES CXX VERSION ${Radium_VERSION}) @@ -17,6 +18,7 @@ find_package(PowerSlider REQUIRED) # Qt set(Qt_LIBRARIES Qt::Core Qt::Widgets Qt::OpenGL Qt::Xml) +set(CMAKE_AUTOMOC_PATH_PREFIX ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) @@ -75,3 +77,5 @@ install_target_resources( if(RADIUM_ENABLE_PCH) target_precompile_headers(${ra_gui_target} PRIVATE pch.hpp) endif() + +message_prefix_pop() diff --git a/src/Gui/ParameterSetEditor/MaterialParameterEditor.cpp b/src/Gui/ParameterSetEditor/MaterialParameterEditor.cpp index bb8cfaea825..e8b323bce69 100644 --- a/src/Gui/ParameterSetEditor/MaterialParameterEditor.cpp +++ b/src/Gui/ParameterSetEditor/MaterialParameterEditor.cpp @@ -48,7 +48,7 @@ MaterialParameterEditor::MaterialParameterEditor( QWidget* parent ) : QWidget( p verticalLayout->addWidget( matParamsGroup ); m_matParamsLayout = new QVBoxLayout( matParamsGroup ); - m_parametersControlPanel = new ParameterSetEditor( "Material Parameters", this ); + m_parametersControlPanel = new VariableSetEditor( "Material Parameters", this ); m_matParamsLayout->addWidget( m_parametersControlPanel ); verticalLayout->addStretch(); @@ -76,20 +76,20 @@ void MaterialParameterEditor::setupFromMaterial( // clear the old control panel m_matParamsLayout->removeWidget( m_parametersControlPanel ); delete m_parametersControlPanel; - m_parametersControlPanel = new ParameterSetEditor( "Material Parameters", this ); - m_parametersControlPanel->showUnspecified( m_showUnspecified ); + m_parametersControlPanel = new VariableSetEditor( "Material Parameters", this ); + m_parametersControlPanel->setShowUnspecified( m_showUnspecified ); m_matParamsLayout->addWidget( m_parametersControlPanel ); - m_parametersControlPanel->setupFromParameters( params, metadata ); + m_parametersControlPanel->setupUi( params, metadata ); connect( m_parametersControlPanel, - &ParameterSetEditor::parameterModified, + &VariableSetEditor::parameterModified, [this]( const std::string& nm ) { emit materialParametersModified( nm ); } ); m_matInfoGroup->setVisible( true ); } void MaterialParameterEditor::showUnspecified( bool enable ) { m_showUnspecified = enable; - m_parametersControlPanel->showUnspecified( m_showUnspecified ); + m_parametersControlPanel->setShowUnspecified( m_showUnspecified ); } } // namespace Ra::Gui diff --git a/src/Gui/ParameterSetEditor/MaterialParameterEditor.hpp b/src/Gui/ParameterSetEditor/MaterialParameterEditor.hpp index 41145435d88..ae321592fa3 100644 --- a/src/Gui/ParameterSetEditor/MaterialParameterEditor.hpp +++ b/src/Gui/ParameterSetEditor/MaterialParameterEditor.hpp @@ -22,7 +22,7 @@ class RenderParameters; namespace Gui { /** - * \brief Simple Widget for Material/RenderParameter edition + * \brief Simple Widget for Material/RenderParameter editing * A material editor will show information about the selected material and expose a control panel * containing all of its editable parameters to allow the user to edit them. */ @@ -32,14 +32,14 @@ class RA_GUI_API MaterialParameterEditor : public QWidget public: /** Constructors and destructor */ - /** @{ */ + /** \{ */ explicit MaterialParameterEditor( QWidget* parent = nullptr ); MaterialParameterEditor( const MaterialParameterEditor& ) = delete; MaterialParameterEditor& operator=( const MaterialParameterEditor& ) = delete; MaterialParameterEditor( MaterialParameterEditor&& ) = delete; MaterialParameterEditor&& operator=( MaterialParameterEditor&& ) = delete; ~MaterialParameterEditor() override = default; - /** @} */ + /** \} */ /** * \brief Update the different UI element with the given renderParameter, using the given @@ -85,7 +85,7 @@ class RA_GUI_API MaterialParameterEditor : public QWidget /// The layout containing the control panel QVBoxLayout* m_matParamsLayout; /// The control panel re-generated whenever setupFromMaterial is called - ParameterSetEditor* m_parametersControlPanel; + VariableSetEditor* m_parametersControlPanel; /// wether to show the unspecified materials bool m_showUnspecified = false; diff --git a/src/Gui/ParameterSetEditor/ParameterSetEditor.cpp b/src/Gui/ParameterSetEditor/ParameterSetEditor.cpp index 4e3dcf10442..b22f2204bfa 100644 --- a/src/Gui/ParameterSetEditor/ParameterSetEditor.cpp +++ b/src/Gui/ParameterSetEditor/ParameterSetEditor.cpp @@ -1,15 +1,15 @@ #include -#include - -// include the Material Definition +#include #include +#include #include #include #include #include +#include using json = nlohmann::json; @@ -23,10 +23,10 @@ class RenderParameterUiBuilder public: using types = Engine::Data::RenderParameters::BindableTypes; - RenderParameterUiBuilder( ParameterSetEditor* pse, const json& constraints ) : + RenderParameterUiBuilder( VariableSetEditor* pse, const json& constraints ) : m_pse { pse }, m_constraints { constraints } {} - void operator()( const std::string& name, bool& p, Data::RenderParameters&& /* params */ ) { + void operator()( const std::string& name, bool& p, Core::VariableSet&& /* params */ ) { auto onBoolParameterChanged = [pse = this->m_pse, &p, nm = name]( bool val ) { p = val; emit pse->parameterModified( nm ); @@ -39,19 +39,20 @@ class RenderParameterUiBuilder m_pse->addOption( nm, onBoolParameterChanged, p, description ); } } - else if ( m_pse->m_showUnspecified ) { + else if ( m_pse->showUnspecified() ) { m_pse->addOption( name, onBoolParameterChanged, p ); } } template ::value, bool> = true> - void operator()( const std::string& name, TParam& p, Data::RenderParameters&& params ) { - if ( params.getEnumConverter( name ) ) { - m_pse->addEnumParameterWidget( name, p, params, m_constraints ); + void operator()( const std::string& name, TParam& p, Core::VariableSet&& params ) { + using namespace Ra::Core::VariableSetEnumManagement; + if ( getEnumConverter( params, name ) ) { + m_pse->addEnumWidget( name, p, params, m_constraints ); } else { // case number - m_pse->addNumberParameterWidget( name, p, params, m_constraints ); + m_pse->addNumberWidget( name, p, params, m_constraints ); } } @@ -60,16 +61,15 @@ class RenderParameterUiBuilder std::enable_if_t::value, bool> = true> void operator()( const std::string& name, std::vector& p, - Data::RenderParameters&& params ) { - m_pse->addVectorParameterWidget( name, p, params, m_constraints ); + Core::VariableSet&& params ) { + m_pse->addVectorWidget( name, p, params, m_constraints ); } - void operator()( const std::string& name, - Ra::Core::Utils::Color& p, - Data::RenderParameters&& params ) { + void + operator()( const std::string& name, Ra::Core::Utils::Color& p, Core::VariableSet&& params ) { auto onColorParameterChanged = [pse = this->m_pse, ¶ms, nm = name]( const Ra::Core::Utils::Color& val ) { - params.addParameter( nm, val ); + params.setVariable( nm, val ); emit pse->parameterModified( nm ); }; if ( m_constraints.contains( name ) ) { @@ -78,56 +78,65 @@ class RenderParameterUiBuilder std::string nm = m.contains( "name" ) ? std::string { m["name"] } : name; m_pse->addColorInput( nm, onColorParameterChanged, p, m["maxItems"] == 4, description ); } - else if ( m_pse->m_showUnspecified ) { + else if ( m_pse->showUnspecified() ) { m_pse->addColorInput( name, onColorParameterChanged, p ); } } template