diff --git a/.travis.yml b/.travis.yml index 95a736eb..0c81d263 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ #################################################################################### language: cpp +dist: trusty sudo: false env: @@ -38,19 +39,20 @@ env: matrix: include: - # check code formatting + + # check code formatting - os: linux compiler: gcc - env: NAME="check code formatting" COMPILER=g++-4.8 ARCH=x86_64 CHECK_FORMATTING=true UNIT_TESTS=false - + env: NAME="check code formatting" CHECK_FORMATTING=true + # valgrind memory check - os: linux compiler: gcc addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'linux-libc-dev:i386', 'libc6-dbg:i386', 'valgrind'] - env: NAME="valgrind" COMPILER=g++-4.8 ARCH=x86 CONF=Debug VALGRIND=true UNIT_TESTS=true + packages: ['g++-4.9', 'valgrind', 'ninja-build'] + env: NAME="valgrind" COMPILER=g++-4.9 ARCH=x64 CONF=Debug VALGRIND=true UNIT_TESTS=true # check code coverage x86 => result https://coveralls.io/github/rttrorg/rttr - os: linux @@ -100,99 +102,124 @@ matrix: addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'linux-libc-dev:i386'] - env: COMPILER=g++-4.8 ARCH=x86 CONF=Release UNIT_TESTS=true + packages: ['g++-4.9-multilib', 'linux-libc-dev:i386', 'ninja-build'] + env: NAME="g++-4.9 x86" COMPILER=g++-4.9 ARCH=x86 CONF=Release UNIT_TESTS=true - os: linux compiler: gcc addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib'] - env: COMPILER=g++-4.8 ARCH=x86_64 CONF=Release UNIT_TESTS=true + packages: ['g++-4.9', 'ninja-build'] + env: NAME="g++-4.9 x64" COMPILER=g++-4.9 ARCH=x86_64 CONF=Release UNIT_TESTS=true - os: linux compiler: gcc addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-7'] - env: COMPILER=g++-7 ARCH=x86_64 CONF=Release UNIT_TESTS=true + packages: ['g++-4.9', 'libboost-all-dev'] + env: NAME="g++-4.9 x64 - Build benchmarks & examples" COMPILER=g++-4.9 ARCH=x86_64 CONF=Release UNIT_TESTS=false BUILD_EXAMPLES=true BUILD_BENCHMARKS=true - os: linux compiler: gcc addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'libboost-all-dev'] - env: COMPILER=g++-4.8 ARCH=x86_64 CONF=Release UNIT_TESTS=false BUILD_EXAMPLES=true BUILD_BENCHMARKS=true - + packages: ['g++-5', 'ninja-build'] + env: NAME="g++-5" COMPILER=g++-5 ARCH=x86_64 CONF=Release UNIT_TESTS=true + - os: linux - compiler: clang + compiler: gcc addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'libboost-all-dev'] - env: LLVM_VERSION=3.8.0 ARCH=x86_64 CONF=Release UNIT_TESTS=false BUILD_EXAMPLES=true BUILD_BENCHMARKS=true - + packages: ['g++-6', 'ninja-build'] + env: NAME="g++-6" COMPILER=g++-6 ARCH=x86_64 CONF=Release UNIT_TESTS=true + + - os: linux + compiler: gcc + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['g++-7', 'libboost-all-dev', 'ninja-build'] + env: NAME="g++-7" COMPILER=g++-7 ARCH=x86_64 CONF=Release UNIT_TESTS=true BUILD_BENCHMARKS=true + # Linux / CLang - # this config fails at the moment because of disabled APT on llvm - os: linux compiler: clang addons: apt: sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7'] - packages: ['clang-3.7'] + packages: ['libstdc++-5-dev', 'clang-3.7', 'ninja-build'] env: COMPILER=clang++-3.7 ARCH=x86_64 CONF=Release UNIT_TESTS=true - # end not workint clang config - + - os: linux compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'linux-libc-dev:i386'] - env: LLVM_VERSION=3.7.1 ARCH=x86 CONF=Release UNIT_TESTS=true - + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-4.0'] + packages: ['libstdc++-6-dev', 'clang-4.0', 'libboost-all-dev', 'ninja-build'] + env: NAME="clang++-4.0 - build benchmarks & examples" COMPILER=clang++-4.0 ARCH=x86_64 CONF=Release UNIT_TESTS=false BUILD_EXAMPLES=true BUILD_BENCHMARKS=true + - os: linux compiler: clang addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib'] - env: LLVM_VERSION=3.7.1 ARCH=x86_64 CONF=Release UNIT_TESTS=true + packages: ['libstdc++-5-dev', 'clang-3.8', 'ninja-build'] + env: COMPILER=clang++-3.8 ARCH=x86_64 CONF=Release UNIT_TESTS=true - os: linux compiler: clang addons: apt: sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib', 'linux-libc-dev:i386'] - env: LLVM_VERSION=3.8.0 ARCH=x86 CONF=Release UNIT_TESTS=true - + packages: ['libstdc++-6-dev', 'clang-3.9', 'ninja-build'] + env: COMPILER=clang++-3.9 ARCH=x86_64 CONF=Release UNIT_TESTS=true + - os: linux compiler: clang addons: apt: - sources: ['ubuntu-toolchain-r-test'] - packages: ['g++-4.8-multilib'] - env: LLVM_VERSION=3.8.0 ARCH=x86_64 CONF=Release UNIT_TESTS=true - + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-4.0'] + packages: ['libstdc++-6-dev', 'clang-4.0', 'ninja-build'] + env: COMPILER=clang++-4.0 ARCH=x86_64 CONF=Release UNIT_TESTS=true + + - os: linux + compiler: clang + addons: + apt: + sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-5.0'] + packages: ['libstdc++-7-dev', 'clang-5.0',] + env: COMPILER=clang++-5.0 ARCH=x86_64 CONF=Release UNIT_TESTS=true + # OSX/Clang - os: osx - osx_image: xcode7.3 + osx_image: xcode9.2 compiler: clang - env: COMPILER=clang++ ARCH=x86 CONF=Release UNIT_TESTS=true + env: COMPILER=clang++ ARCH=x86 CONF=Release UNIT_TESTS=true BUILD_BENCHMARKS=true - os: osx - osx_image: xcode7.3 + osx_image: xcode9.2 compiler: clang - env: COMPILER=clang++ ARCH=x86_64 CONF=Release UNIT_TESTS=true + env: COMPILER=clang++ ARCH=x86_64 CONF=Release UNIT_TESTS=true - allow_failures: - - env: COMPILER=clang++-3.7 ARCH=x86_64 CONF=Release UNIT_TESTS=true - - env: COMPILER=g++-7 ARCH=x86_64 CONF=Release UNIT_TESTS=true + - os: osx + osx_image: xcode9 + compiler: clang + env: COMPILER=clang++ ARCH=x86_64 CONF=Release UNIT_TESTS=true + - os: osx + osx_image: xcode8.3 + compiler: clang + env: COMPILER=clang++ ARCH=x86 CONF=Release UNIT_TESTS=true + + - os: osx + osx_image: xcode8.3 + compiler: clang + env: COMPILER=clang++ ARCH=x86_64 CONF=Release UNIT_TESTS=true + before_install: - export CIT_ROOT=`pwd` - cd $CIT_ROOT @@ -212,11 +239,11 @@ install: ####################################################################################### - | if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then - CMAKE_URL="http://www.cmake.org/files/v3.5/cmake-3.5.2-Linux-x86_64.tar.gz" + CMAKE_URL="http://www.cmake.org/files/v3.10/cmake-3.10.2-Linux-x86_64.tar.gz" mkdir cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake export PATH=${DEPS_DIR}/cmake/bin:${PATH} else - brew upgrade cmake || brew install cmake || brew link --overwrite cmake + brew upgrade cmake || brew install cmake ninja || brew link --overwrite cmake fi - cmake --version ####################################################################################### @@ -235,69 +262,25 @@ install: if [[ "${CHECK_FORMATTING}" == "true" ]]; then sudo apt-get install vera++ -y fi - - ####################################################################################### - # Install Clang - ####################################################################################### - - | - if [[ "${LLVM_VERSION}" != "" ]]; then - CLANG_URL="http://llvm.org/releases/${LLVM_VERSION}/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-14.04.tar.xz" - mkdir clang && travis_retry wget --quiet -O - ${CLANG_URL} | tar --strip-components=1 -xJ -C clang - export PATH=${DEPS_DIR}/clang/bin:${PATH} - ls ${DEPS_DIR}/clang/bin - export CXX=${DEPS_DIR}/clang/bin/clang++ - export CC=${DEPS_DIR}/clang/bin/clang - fi - - ####################################################################################### - # Install libc++ and libc++abi (on Linux only; Xcode uses libc++ by default) - ####################################################################################### - - | - if [[ "${LLVM_VERSION}" != "" && "${STDLIB}" != "libstdc++" ]]; then - if [[ "${LLVM_VERSION}" != "trunk" ]]; then - LLVM_URL="http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz" - LIBCXX_URL="http://llvm.org/releases/${LLVM_VERSION}/libcxx-${LLVM_VERSION}.src.tar.xz" - LIBCXXABI_URL="http://llvm.org/releases/${LLVM_VERSION}/libcxxabi-${LLVM_VERSION}.src.tar.xz" - TAR_FLAGS="-xJ" - else - LLVM_URL="https://github.com/llvm-mirror/llvm/archive/master.tar.gz" - LIBCXX_URL="https://github.com/llvm-mirror/libcxx/archive/master.tar.gz" - LIBCXXABI_URL="https://github.com/llvm-mirror/libcxxabi/archive/master.tar.gz" - TAR_FLAGS="-xz" - fi - mkdir -p llvm llvm/build llvm/projects/libcxx llvm/projects/libcxxabi - travis_retry wget --quiet -O - ${LLVM_URL} | tar --strip-components=1 ${TAR_FLAGS} -C llvm - travis_retry wget --quiet -O - ${LIBCXX_URL} | tar --strip-components=1 ${TAR_FLAGS} -C llvm/projects/libcxx - travis_retry wget --quiet -O - ${LIBCXXABI_URL} | tar --strip-components=1 ${TAR_FLAGS} -C llvm/projects/libcxxabi - # clang-3.8.0 does not compile libc++.so.1.0 as 32 bit binary, the flag is for unknown reason not forwarded - # this will fix it - export CXX="${DEPS_DIR}/clang/bin/clang++ $CMAKE_ARCH_FLAGS" - (cd llvm/build && cmake .. -DCMAKE_INSTALL_PREFIX=${DEPS_DIR}/llvm/install -DCMAKE_CXX_FLAGS="$CMAKE_ARCH_FLAGS") - (cd llvm/build/projects/libcxx && make install -j2) - (cd llvm/build/projects/libcxxabi && make install -j2) - export CXXFLAGS="-isystem ${DEPS_DIR}/llvm/install/include/c++/v1" - export LDFLAGS="-L ${DEPS_DIR}/llvm/install/lib -l c++ -l c++abi" - export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${DEPS_DIR}/llvm/install/lib" - fi before_script: - cd ${TRAVIS_BUILD_DIR} - mkdir build - - if [[ "${LLVM_VERSION}" != "" ]]; then export CMAKE_ADDITIONAL_FLAGS=-stdlib=libc++; fi - > eval "ARCH_FLAGS=\${ARCH_FLAGS_${ARCH}}" ; (cd build && cmake -DCMAKE_CXX_COMPILER=${COMPILER} - -DCMAKE_C_COMPILER=${CC} -DCMAKE_BUILD_TYPE=${CONF} -DCMAKE_CXX_FLAGS="$ARCH_FLAGS $CMAKE_ADDITIONAL_FLAGS $GCOV_FLAGS" - -DCMAKE_C_FLAGS="$ARCH_FLAGS" -DBUILD_WEBSITE_DOCU=$BUILD_DOCU -DBUILD_EXAMPLES=$BUILD_EXAMPLES -DBUILD_BENCHMARKS=$BUILD_BENCHMARKS ..) script: + # show OS/compiler version + - uname -a + - $CXX --version - | if [[ "${CHECK_FORMATTING}" == "true" ]]; then # F001: Source files should not use the '\r' (CR) character diff --git a/CMake/config.cmake b/CMake/config.cmake index a6680601..3d25669e 100644 --- a/CMake/config.cmake +++ b/CMake/config.cmake @@ -113,41 +113,17 @@ endif() enable_rtti(BUILD_WITH_RTTI) -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -Werror") - message(STATUS "added flag -std=c++0x, -Wall, -Werror to g++") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror") - message(STATUS "added flag -std=c++11, -Wall, -Werror to g++") - endif() - if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.0.0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden") - endif() - - if(MINGW) - set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") - else() - set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++") - endif() -endif() - -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror") - message(STATUS "added flag -std=c++11, -Wall, -Werror to g++") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden") - message(WARNING "clang support is currently experimental") - - set(CLANG_STATIC_LINKER_FLAGS "-stdlib=libc++ -static-libstdc++") -endif() +get_latest_supported_cxx(CXX_STANDARD) +set(MAX_CXX_STANDARD ${CXX_STANDARD}) if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj /WX") - replaceCompilerOption("/W3" "/W4") - message(STATUS "added flag /bigobj, /W4 to MSVC compiler") - message(STATUS "Treats all compiler warnings as errors.") + if (${CXX_STANDARD} EQUAL 17 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.12.25835.0") + set(MAX_CXX_STANDARD 14) # downgrade, because RTTR does not compile with this flag (template error) + endif() endif() +message(STATUS "using C++: ${MAX_CXX_STANDARD}") + # RelWithDepInfo should have the same option like the Release build # but of course with Debug informations if(MSVC) @@ -163,6 +139,25 @@ else() message(WARNING "Please adjust CMAKE_CXX_FLAGS_RELWITHDEBINFO flags for this compiler!") endif() +if(MSVC) + # we have to remove the default warning level, + # otherwise we get ugly compiler warnings, because of later replacing + # option /W3 with /W4 (which will be later added) + replace_compiler_option("/W3" " ") + if (BUILD_WITH_STATIC_RUNTIME_LIBS) + replace_compiler_option("/MD" " ") + endif() + +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(MINGW) + set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") + else() + set(GNU_STATIC_LINKER_FLAGS "-static-libgcc -static-libstdc++") + endif() +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CLANG_STATIC_LINKER_FLAGS "-stdlib=libc++ -static-libstdc++") +endif() + include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/CMake/rttr-config-version.cmake" diff --git a/CMake/utility.cmake b/CMake/utility.cmake index 31d9cde7..905321dd 100644 --- a/CMake/utility.cmake +++ b/CMake/utility.cmake @@ -386,17 +386,36 @@ function(activate_precompiled_headers _PRECOMPILED_HEADER _SOURCE_FILES) endif() endfunction() +#################################################################################### +# Adds warnings compiler options to the target depending on the category +# target Target name +#################################################################################### +function( set_compiler_warnings target) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(WARNINGS "-Werror" + "-Wall") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(WARNINGS "-Werror" + "-Wall") + elseif(MSVC) + set(WARNINGS "/WX" + "/W4") + endif() + + target_compile_options(${target} PRIVATE ${WARNINGS}) +endfunction() + #################################################################################### # Adds or replace a compiler option # _OLD_OPTION The option which should be replaced # _NEW_OPTION The new option which should be added #################################################################################### -macro( replaceCompilerOption _OLD_OPTION _NEW_OPTION) +macro( replace_compiler_option _OLD_OPTION _NEW_OPTION) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES ${_OLD_OPTION}) - string(REGEX REPLACE ${_OLD_OPTION} ${_NEW_OPTION} ${flag_var} "${${flag_var}}") + string(REGEX REPLACE "${_OLD_OPTION}" "${_NEW_OPTION}" ${flag_var} "${${flag_var}}") else() set(${flag_var} "${${flag_var}} ${_NEW_OPTION}") endif() @@ -426,10 +445,10 @@ macro(enable_rtti _ENABLE) if (${_ENABLE}) message(STATUS "Enabled: use of RTTI") - replaceCompilerOption("${disable_rtti_opt}" "${enable_rtti_opt}") + replace_compiler_option("${disable_rtti_opt}" "${enable_rtti_opt}") else() message(STATUS "Disabled: use of RTTI") - replaceCompilerOption(${enable_rtti_opt} ${disable_rtti_opt}) + replace_compiler_option(${enable_rtti_opt} ${disable_rtti_opt}) endif() endmacro() @@ -504,4 +523,68 @@ macro(generateLibraryVersionVariables MAJOR MINOR PATCH PRODUCT_NAME PRODUCT_CPY set(LIBRARY_PRODUCT_NAME ${PRODUCT_NAME}) set(LIBRARY_COPYRIGHT ${PRODUCT_CPY_RIGHT}) set(LIBRARY_LICENSE ${PRODUCT_LICENSE}) -endmacro() \ No newline at end of file +endmacro() + +function(get_latest_supported_cxx CXX_STANDARD) + + set(CMAKE_CXX_STANDARD 17) + + if (POLICY CMP0067) + cmake_policy(SET CMP0067 NEW) + endif() + + if(${CMAKE_VERSION} VERSION_LESS "3.8.0") + set(MAX_CXX_STANDARD 14) + endif() + + include(CheckCXXSourceCompiles) + + check_cxx_source_compiles( + "#include + typedef void F(); + typedef void G() noexcept; + + std::enable_if< + !std::is_same::value, + int + >::type i = 42; + + int main() { return 0; } + " + HAS_NO_EXCEPT_TYPE_SIGNATURE_SUPPORT) + + check_cxx_source_compiles( + "#include + struct foo { void func() const noexcept {} }; + template + void test_func(T) + { + static_assert(std::is_member_function_pointer::value, \"Failed\"); + } + int main() { test_func(&foo::func); return 0; } + " + HAS_STL_NO_EXCEPT_TYPE_SIGNATURE_SUPPORT) + + check_cxx_source_compiles(" + constexpr int abs(int x) + { + if(x < 0) x = -x; + return x; + } + + int main() { } + " + HAS_CXX_CONSTEXPR) + + if (HAS_NO_EXCEPT_TYPE_SIGNATURE_SUPPORT AND HAS_STL_NO_EXCEPT_TYPE_SIGNATURE_SUPPORT) + set(${CXX_STANDARD} 17 PARENT_SCOPE) + else() + if (HAS_CXX_CONSTEXPR) + set(${CXX_STANDARD} 14 PARENT_SCOPE) + else() + set(${CXX_STANDARD} 11 PARENT_SCOPE) + endif() + endif() + +endfunction() + diff --git a/CMakeLists.txt b/CMakeLists.txt index a15d5916..a9f46b0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,10 @@ cmake_minimum_required (VERSION 3.0) -project ("rttr") +project ("rttr" LANGUAGES CXX) + +set(CMAKE_CXX_EXTENSIONS OFF) +message("Supported features = ${CMAKE_CXX_COMPILE_FEATURES}") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake") @@ -52,8 +55,8 @@ option(BUILD_UNIT_TESTS "Build the unit tests of RTTR" ON) option(BUILD_STATIC "Build RTTR as static library" OFF) option(BUILD_WITH_STATIC_RUNTIME_LIBS "Link against the static runtime libraries" OFF) option(BUILD_WITH_RTTI "Enable build with C++ runtime type information for compilation" ON) -option(BUILD_BENCHMARKS "Enable this to build the benchmarks" ON) -option(BUILD_EXAMPLES "Enable this to build the examples" ON) +option(BUILD_BENCHMARKS "Enable this to build the benchmarks" OFF) +option(BUILD_EXAMPLES "Enable this to build the examples" On) option(BUILD_DOCUMENTATION "Enable this to build the documentation" ON) option(BUILD_INSTALLER "Enable this to build the installer" ON) option(BUILD_PACKAGE "Enable this to build the installer" ON) diff --git a/src/benchmarks/bench_method/CMakeLists.txt b/src/benchmarks/bench_method/CMakeLists.txt index cfb09d6a..516f4e54 100644 --- a/src/benchmarks/bench_method/CMakeLists.txt +++ b/src/benchmarks/bench_method/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(bench_method) +project(bench_method LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -51,13 +51,16 @@ endif() target_include_directories(bench_method PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_method PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_method PROPERTIES COMPILE_FLAGS "/Zm200") + target_compile_options(bench_method PRIVATE /Zm200) endif() + set_target_properties(bench_method PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") -add_dependencies(bench_method RTTR::Core) + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) + +set_compiler_warnings(bench_method) install(TARGETS bench_method RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -78,14 +81,15 @@ if (BUILD_STATIC) target_include_directories(bench_method_lib PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_method_lib PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_method_lib PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_method_lib PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_method_lib PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_method_lib RTTR::Core_Lib) + set_compiler_warnings(bench_method_lib) install(TARGETS bench_method_lib RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -107,14 +111,16 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_method_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_method_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_method_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_method_s PRIVATE /Zm200 /bigobj) endif() + set_target_properties(bench_method_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") - - add_dependencies(bench_method_s RTTR::Core_STL) + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) + + set_compiler_warnings(bench_method_s) if (MSVC) target_compile_options(bench_method_s PUBLIC "/MT$<$:d>") @@ -143,14 +149,15 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_method_lib_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_method_lib_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_method_lib_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_method_lib_s PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_method_lib_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_method_lib_s RTTR::Core_Lib_STL) + set_compiler_warnings(bench_method_lib_s) if (MSVC) target_compile_options(bench_method_lib_s PUBLIC "/MT$<$:d>") diff --git a/src/benchmarks/bench_method/test_methods.h b/src/benchmarks/bench_method/test_methods.h index 1116de4e..abfe42c7 100644 --- a/src/benchmarks/bench_method/test_methods.h +++ b/src/benchmarks/bench_method/test_methods.h @@ -30,7 +30,7 @@ #include -#if RTTR_COMPILER == RTTR_COMPILER_CLANG +#if RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-private-field" #endif @@ -173,7 +173,7 @@ struct class_multiple_final_D : class_multiple_final .method("method_" #NUMBER, &ns_foo::CLASS_NAME::RTTR_CAT(method_,NUMBER)) \ ; -#if RTTR_COMPILER == RTTR_COMPILER_CLANG +#if RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG # pragma GCC diagnostic pop #endif diff --git a/src/benchmarks/bench_rttr_cast/CMakeLists.txt b/src/benchmarks/bench_rttr_cast/CMakeLists.txt index 047b27dd..37848be3 100644 --- a/src/benchmarks/bench_rttr_cast/CMakeLists.txt +++ b/src/benchmarks/bench_rttr_cast/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(bench_rttr_cast) +project(bench_rttr_cast LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -51,13 +51,15 @@ endif() target_include_directories(bench_rttr_cast PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_rttr_cast PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_rttr_cast PROPERTIES COMPILE_FLAGS "/Zm200") + target_compile_options(bench_rttr_cast PRIVATE /Zm200) endif() + set_target_properties(bench_rttr_cast PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) -add_dependencies(bench_rttr_cast RTTR::Core) +set_compiler_warnings(bench_rttr_cast) install(TARGETS bench_rttr_cast RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -78,14 +80,15 @@ if (BUILD_STATIC) target_include_directories(bench_rttr_cast_lib PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_rttr_cast_lib PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_rttr_cast_lib PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_rttr_cast_lib PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_rttr_cast_lib PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_rttr_cast_lib RTTR::Core_Lib) + set_compiler_warnings(bench_rttr_cast_lib) install(TARGETS bench_rttr_cast_lib RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -107,14 +110,15 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_rttr_cast_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_rttr_cast_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_rttr_cast_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_rttr_cast_s PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_rttr_cast_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_rttr_cast_s RTTR::Core_STL) + set_compiler_warnings(bench_rttr_cast_s) if (MSVC) target_compile_options(bench_rttr_cast_s PUBLIC "/MT$<$:d>") @@ -143,14 +147,15 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_rttr_cast_lib_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_rttr_cast_lib_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_rttr_cast_lib_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_rttr_cast_lib_s PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_rttr_cast_lib_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_rttr_cast_lib_s RTTR::Core_Lib_STL) + set_compiler_warnings(bench_rttr_cast_lib_s) if (MSVC) target_compile_options(bench_rttr_cast_lib_s PUBLIC "/MT$<$:d>") @@ -171,4 +176,4 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) endif() message(STATUS "Scanning " ${PROJECT_NAME} " module finished!") -message(STATUS "") +message(STATUS "") \ No newline at end of file diff --git a/src/benchmarks/bench_rttr_cast/test_classes.h b/src/benchmarks/bench_rttr_cast/test_classes.h index 677af634..e7dcc4ab 100644 --- a/src/benchmarks/bench_rttr_cast/test_classes.h +++ b/src/benchmarks/bench_rttr_cast/test_classes.h @@ -30,22 +30,23 @@ #include -#if RTTR_COMPILER == RTTR_COMPILER_CLANG -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wunused-private-field" -#endif +#define CLASS(CLASS_NAME) struct CLASS_NAME \ +{ virtual ~CLASS_NAME() {} RTTR_ENABLE() virtual int getType() { return dummyIntValue; } int dummyIntValue; }; -#define CLASS(CLASS_NAME) struct CLASS_NAME { virtual ~CLASS_NAME() {} RTTR_ENABLE() virtual int getType() { return 0; } int dummyIntValue; }; +#define CLASS_INHERIT(CLASS1, CLASS2) struct CLASS1 : CLASS2 \ +{ virtual int getType() { return static_cast(dummyDoubleValue); } RTTR_ENABLE(CLASS2) double dummyDoubleValue; }; -#define CLASS_INHERIT(CLASS1, CLASS2) struct CLASS1 : CLASS2 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2) double dummyDoubleValue; }; +#define CLASS_VIRTUAL_INHERIT(CLASS1, CLASS2) struct CLASS1 : virtual CLASS2 \ +{ virtual int getType() { return static_cast(dummyDoubleValue); } RTTR_ENABLE(CLASS2) double dummyDoubleValue; }; -#define CLASS_VIRTUAL_INHERIT(CLASS1, CLASS2) struct CLASS1 : virtual CLASS2 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2) double dummyDoubleValue; }; +#define CLASS_MULTI_INHERIT_2(CLASS1, CLASS2, CLASS3) struct CLASS1 : CLASS2, CLASS3 \ +{ virtual int getType() { return static_cast(dummyBoolValue); } RTTR_ENABLE(CLASS2, CLASS3) bool dummyBoolValue; }; -#define CLASS_MULTI_INHERIT_2(CLASS1, CLASS2, CLASS3) struct CLASS1 : CLASS2, CLASS3 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2, CLASS3) bool dummyBoolValue; }; +#define CLASS_MULTI_INHERIT_3(CLASS1, CLASS2, CLASS3, CLASS4) struct CLASS1 : CLASS2, CLASS3, CLASS4 \ +{ virtual int getType() { return static_cast(dummyBoolValue); } RTTR_ENABLE(CLASS2, CLASS3, CLASS4) bool dummyBoolValue; }; -#define CLASS_MULTI_INHERIT_3(CLASS1, CLASS2, CLASS3, CLASS4) struct CLASS1 : CLASS2, CLASS3, CLASS4 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2, CLASS3, CLASS4) bool dummyBoolValue; }; - -#define CLASS_MULTI_INHERIT_5(CLASS1, CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) struct CLASS1 : CLASS2, CLASS3, CLASS4, CLASS5, CLASS6 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) bool dummyBoolValue; }; +#define CLASS_MULTI_INHERIT_5(CLASS1, CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) struct CLASS1 : CLASS2, CLASS3, CLASS4, CLASS5, CLASS6 \ +{ virtual int getType() { return static_cast(dummyBoolValue); } RTTR_ENABLE(CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) bool dummyBoolValue; }; ///////////////////////////////////////////////////////////////////////////////////////// // The following class structures has 7 hierarchy levels and is 5 classes wide; @@ -165,8 +166,4 @@ CLASS_INHERIT(ClassDiamondRight6, ClassDiamondRight5) CLASS_MULTI_INHERIT_3(ClassDiamondFinal, ClassDiamondLeft5, ClassDiamondMiddle5, ClassDiamondRight5) -#if RTTR_COMPILER == RTTR_COMPILER_CLANG -# pragma GCC diagnostic pop -#endif - #endif // RTTR_TESTCLASSES_H_ diff --git a/src/benchmarks/bench_variant/CMakeLists.txt b/src/benchmarks/bench_variant/CMakeLists.txt index 34a62452..25179c6e 100644 --- a/src/benchmarks/bench_variant/CMakeLists.txt +++ b/src/benchmarks/bench_variant/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(bench_variant) +project(bench_variant LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -51,14 +51,14 @@ endif() target_include_directories(bench_variant PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_variant PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_variant PROPERTIES COMPILE_FLAGS "/Zm200") + target_compile_options(bench_variant PRIVATE /Zm200) endif() set_target_properties(bench_variant PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") - -add_dependencies(bench_variant RTTR::Core) + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) +set_compiler_warnings(bench_variant) install(TARGETS bench_variant RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -79,14 +79,15 @@ if (BUILD_STATIC) target_include_directories(bench_variant_lib PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_variant_lib PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_variant_lib PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_variant_lib PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_variant_lib PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_variant_lib RTTR::Core_Lib) + set_compiler_warnings(bench_variant_lib) install(TARGETS bench_variant_lib RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -108,14 +109,15 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_variant_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_variant_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_variant_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_variant_s PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_variant_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_variant_s RTTR::Core_STL) + set_compiler_warnings(bench_variant_s) if (MSVC) target_compile_options(bench_variant_s PUBLIC "/MT$<$:d>") @@ -144,14 +146,15 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_include_directories(bench_variant_lib_s PUBLIC ${NONIUS_DIR} ${Boost_INCLUDE_DIR}) target_compile_definitions(bench_variant_lib_s PUBLIC BOOST_ALL_NO_LIB) if(MSVC) - set_target_properties(bench_variant_lib_s PROPERTIES COMPILE_FLAGS "/Zm200 /bigobj") + target_compile_options(bench_variant_lib_s PRIVATE /Zm200 /bigobj) endif() set_target_properties(bench_variant_lib_s PROPERTIES DEBUG_POSTFIX _d FOLDER "Benchmarks" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) - add_dependencies(bench_variant_lib_s RTTR::Core_Lib_STL) + set_compiler_warnings(bench_variant_lib_s) if (MSVC) target_compile_options(bench_variant_lib_s PUBLIC "/MT$<$:d>") diff --git a/src/examples/json_serialization/CMakeLists.txt b/src/examples/json_serialization/CMakeLists.txt index 99679069..17bcecf8 100644 --- a/src/examples/json_serialization/CMakeLists.txt +++ b/src/examples/json_serialization/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(json_serialization) +project(json_serialization LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -44,8 +44,10 @@ target_link_libraries(json_serialization RTTR::Core) target_include_directories(json_serialization PUBLIC ${RAPID_JSON_DIR}) set_target_properties(json_serialization PROPERTIES DEBUG_POSTFIX _d FOLDER "Examples" - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) +set_compiler_warnings(json_serialization) message(STATUS "Scanning " ${PROJECT_NAME} " module finished!") -message(STATUS "") \ No newline at end of file +message(STATUS "") diff --git a/src/rttr/CMakeLists.txt b/src/rttr/CMakeLists.txt index 3addb3f7..6c445727 100644 --- a/src/rttr/CMakeLists.txt +++ b/src/rttr/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(rttr) +project(rttr LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -46,16 +46,27 @@ if (${BUILD_RTTR_DYNAMIC}) target_compile_definitions(rttr_core PRIVATE RTTR_DLL_EXPORTS) target_compile_definitions(rttr_core PUBLIC RTTR_DLL) + + set_target_properties(rttr_core PROPERTIES VERSION ${RTTR_VERSION} SOVERSION ${RTTR_VERSION} EXPORT_NAME Core - DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) + DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX} + CXX_STANDARD ${MAX_CXX_STANDARD} + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN 1) + if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") + target_compile_features(rttr_core PUBLIC cxx_std_11) # at least c++11 is needed to compile RTTR + endif() + target_include_directories(rttr_core PUBLIC $ $ $) - + + set_compiler_warnings(rttr_core) + if (BUILD_INSTALLER) install(TARGETS rttr_core EXPORT rttr_targets RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -77,10 +88,13 @@ endif() if (BUILD_STATIC) add_library(rttr_core_lib STATIC ${UnityBuild} ${SRC_FILES} ${HPP_FILES}) add_library(RTTR::Core_Lib ALIAS rttr_core_lib) + + set_target_properties(rttr_core_lib PROPERTIES VERSION ${RTTR_VERSION} SOVERSION ${RTTR_VERSION} EXPORT_NAME Core_Lib + CXX_STANDARD ${MAX_CXX_STANDARD} DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) if (MSVC) set_target_properties(rttr_core_lib PROPERTIES OUTPUT_NAME librttr_core) @@ -89,7 +103,7 @@ if (BUILD_STATIC) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_target_properties(rttr_core_lib PROPERTIES OUTPUT_NAME rttr_core) else() - message(SEND_ERROR "Do now know how to to name the static library.") + message(SEND_ERROR "Do not know how to name the static library.") endif() target_include_directories(rttr_core_lib PUBLIC @@ -97,6 +111,12 @@ if (BUILD_STATIC) $ $) + if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") + target_compile_features(rttr_core_lib PUBLIC cxx_std_11) # at least c++11 is needed to compile RTTR + endif() + + set_compiler_warnings(rttr_core_lib) + if (BUILD_INSTALLER) install(TARGETS rttr_core_lib EXPORT rttr_targets RUNTIME DESTINATION ${RTTR_RUNTIME_INSTALL_DIR} @@ -114,15 +134,22 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) target_compile_definitions(rttr_core_s PUBLIC RTTR_DLL) target_include_directories(rttr_core_s PUBLIC - $ - $ - $) + $ + $ + $) set_target_properties(rttr_core_s PROPERTIES VERSION ${RTTR_VERSION} SOVERSION ${RTTR_VERSION} EXPORT_NAME Core_STL + CXX_STANDARD ${MAX_CXX_STANDARD} DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) - + + if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") + target_compile_features(rttr_core_s PUBLIC cxx_std_11) # at least c++11 is needed to compile RTTR + endif() + + set_compiler_warnings(rttr_core_s) + if (MSVC) target_compile_options(rttr_core_s PUBLIC "/MT$<$:d>") elseif(CMAKE_COMPILER_IS_GNUCXX) @@ -130,7 +157,7 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_target_properties(rttr_core_s PROPERTIES LINK_FLAGS ${CLANG_STATIC_LINKER_FLAGS}) else() - message(SEND_ERROR "Do now know how to statically link against the standard library with this compiler.") + message(SEND_ERROR "Do not know how to statically link against the standard library with this compiler.") endif() if (BUILD_INSTALLER) @@ -146,15 +173,25 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) add_library(rttr_core_lib_s STATIC ${UnityBuild} ${SRC_FILES} ${HPP_FILES}) add_library(RTTR::Core_Lib_STL ALIAS rttr_core_lib_s) + + target_include_directories(rttr_core_lib_s PUBLIC - $ - $ - $) + $ + $ + $) set_target_properties(rttr_core_lib_s PROPERTIES VERSION ${RTTR_VERSION} SOVERSION ${RTTR_VERSION} EXPORT_NAME Core_Lib_STL + CXX_STANDARD ${MAX_CXX_STANDARD} DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) + + if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") + target_compile_features(rttr_core_lib_s PUBLIC cxx_std_11) # at least c++11 is needed to compile RTTR + endif() + + set_compiler_warnings(rttr_core_lib_s) + if (MSVC) target_compile_options(rttr_core_lib_s PUBLIC "/MT$<$:d>") set_target_properties(rttr_core_lib PROPERTIES OUTPUT_NAME librttr_core_s) @@ -163,7 +200,7 @@ if (BUILD_WITH_STATIC_RUNTIME_LIBS) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_target_properties(rttr_core_lib_s PROPERTIES LINK_FLAGS ${CLANG_STATIC_LINKER_FLAGS} OUTPUT_NAME rttr_core_s) else() - message(SEND_ERROR "Do now know how to statically link against the standard library with this compiler.") + message(SEND_ERROR "Do not know how to statically link against the standard library with this compiler.") endif() if (BUILD_INSTALLER) diff --git a/src/rttr/array_range.h b/src/rttr/array_range.h index a765e48f..f2322718 100644 --- a/src/rttr/array_range.h +++ b/src/rttr/array_range.h @@ -96,8 +96,6 @@ class array_range using iterator_category = std::forward_iterator_tag; using difference_type = std::ptrdiff_t; - reference operator*() const; - pointer operator->(); bool operator==(const self_type& rhs) const; bool operator!=(const self_type& rhs) const; @@ -120,11 +118,16 @@ class array_range { public: using self_type = array_iterator; + using reference = typename array_iterator_base::reference; + using pointer = typename array_iterator_base::pointer; array_iterator(); array_iterator(const array_iterator& other); + reference operator*() const; + pointer operator->(); + self_type& operator++(); self_type operator++(int index); @@ -142,10 +145,15 @@ class array_range { public: using self_type = array_reverse_iterator; + using reference = typename array_iterator_base::reference; + using pointer = typename array_iterator_base::pointer; array_reverse_iterator(); array_reverse_iterator(const array_reverse_iterator& other); + reference operator*() const; + pointer operator->(); + self_type& operator++(); self_type operator++(int index); diff --git a/src/rttr/detail/base/core_prerequisites.h b/src/rttr/detail/base/core_prerequisites.h index a62a575e..01b83379 100644 --- a/src/rttr/detail/base/core_prerequisites.h +++ b/src/rttr/detail/base/core_prerequisites.h @@ -40,6 +40,7 @@ namespace rttr #define RTTR_COMPILER_MSVC 1 #define RTTR_COMPILER_GNUC 2 #define RTTR_COMPILER_CLANG 3 +#define RTTR_COMPILER_APPLECLANG 4 #define RTTR_ENDIAN_LITTLE 1 #define RTTR_ENDIAN_BIG 2 @@ -62,14 +63,19 @@ namespace rttr // Compiler ///////////////////////////////////////////////////////////////////////////////////////// #if defined( __clang__ ) + +#if defined __apple_build_version__ +# define RTTR_COMPILER RTTR_COMPILER_APPLECLANG +#else # define RTTR_COMPILER RTTR_COMPILER_CLANG +#endif # define RTTR_COMP_VER (((__clang_major__)*100) + \ (__clang_minor__*10) + \ __clang_patchlevel__) #elif defined( __GNUC__ ) # define RTTR_COMPILER RTTR_COMPILER_GNUC -# define RTTR_COMP_VER (((__GNUC__)*1000) + \ - (__GNUC_MINOR__*100) + \ +# define RTTR_COMP_VER (((__GNUC__)*100) + \ + (__GNUC_MINOR__*10) + \ __GNUC_PATCHLEVEL__) #elif defined( _MSC_VER ) # define RTTR_COMPILER RTTR_COMPILER_MSVC @@ -95,7 +101,7 @@ namespace rttr #elif RTTR_COMPILER == RTTR_COMPILER_GNUC # define RTTR_INLINE inline # define RTTR_FORCE_INLINE inline __attribute__((always_inline)) -#elif RTTR_COMPILER == RTTR_COMPILER_CLANG +#elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG # define RTTR_INLINE inline # define RTTR_FORCE_INLINE inline __attribute__((always_inline)) #else @@ -111,7 +117,7 @@ namespace rttr # define RTTR_HELPER_DLL_EXPORT __declspec( dllexport ) # define RTTR_HELPER_DLL_LOCAL #elif RTTR_COMPILER == RTTR_COMPILER_GNUC -# if RTTR_COMP_VER >= 4000 +# if RTTR_COMP_VER >= 400 # define RTTR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default"))) # define RTTR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default"))) # define RTTR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden"))) @@ -120,7 +126,7 @@ namespace rttr # define RTTR_HELPER_DLL_EXPORT # define RTTR_HELPER_DLL_LOCAL # endif -#elif RTTR_COMPILER == RTTR_COMPILER_CLANG +#elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG # define RTTR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default"))) # define RTTR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default"))) # define RTTR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden"))) @@ -146,28 +152,29 @@ namespace rttr #if RTTR_COMPILER == RTTR_COMPILER_MSVC -# if RTTR_COMP_VER <= 190023026 +# if RTTR_COMP_VER <= 1800 # define RTTR_NO_CXX11_NOEXCEPT +# define RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE # endif # if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) # define RTTR_NO_CXX11_CONSTEXPR # define RTTR_NO_CXX14_CONSTEXPR # endif -#endif - -#if RTTR_COMPILER == RTTR_COMPILER_GNUC -# if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) -# define RTTR_NO_CXX14_CONSTEXPR +# if !defined(_HAS_CXX17) || _HAS_CXX17 == 0 +# define RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE # endif #endif -#if RTTR_COMPILER == RTTR_COMPILER_CLANG -# if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__) +#if RTTR_COMPILER == RTTR_COMPILER_GNUC || RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG +# if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304) # define RTTR_NO_CXX14_CONSTEXPR # endif -# if !__has_feature(cxx_noexcept) +# if !defined(cpp_noexcept) # define RTTR_NO_CXX11_NOEXCEPT # endif +# if !defined(__cpp_noexcept_function_type) || (__cpp_noexcept_function_type < 201510) +# define RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +# endif #endif ///////////////////////////////////////////////////////////////////////////////////////// @@ -200,7 +207,7 @@ namespace rttr ///////////////////////////////////////////////////////////////////////////////////////// // deprecated macro -#if RTTR_COMPILER == RTTR_COMPILER_GNUC || RTTR_COMPILER == RTTR_COMPILER_CLANG +#if RTTR_COMPILER == RTTR_COMPILER_GNUC || RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG # define RTTR_DEPRECATED __attribute__ ((deprecated)) # define RTTR_DEPRECATED_WITH_MSG(msg) __attribute__ ((deprecated(msg))) #elif RTTR_COMPILER == RTTR_COMPILER_MSVC @@ -251,34 +258,60 @@ namespace rttr #endif #if RTTR_COMPILER == RTTR_COMPILER_GNUC -#define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic pop") +# define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +# define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("GCC diagnostic pop") -#define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING -#define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING +# define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING +# define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING +#if RTTR_COMP_VER >= 700 -#elif RTTR_COMPILER == RTTR_COMPILER_CLANG -#define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic push") \ - _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"") -#define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic pop") + #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wnoexcept-type\"") + #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic pop") +#else -#define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING -#define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING + #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING + #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING + +#endif + +#elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG +# define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic push") \ + _Pragma ("clang diagnostic ignored \"-Wdeprecated-declarations\"") +# define RTTR_END_DISABLE_DEPRECATED_WARNING _Pragma ("clang diagnostic pop") + +# define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING +# define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING + +#if (RTTR_COMPILER == RTTR_COMPILER_CLANG && RTTR_COMP_VER >= 500 ) || \ + (RTTR_COMPILER == RTTR_COMPILER_APPLECLANG && RTTR_COMP_VER >= 900) + +# define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("clang diagnostic push") \ + _Pragma ("clang diagnostic ignored \"-Wnoexcept-type\"") +# define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("clang diagnostic pop") +#else +# define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING +# define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING +#endif #elif RTTR_COMPILER == RTTR_COMPILER_MSVC -#define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING __pragma( warning( push )) \ - __pragma( warning( disable: 4996)) -#define RTTR_END_DISABLE_DEPRECATED_WARNING __pragma( warning( pop )) +# define RTTR_BEGIN_DISABLE_DEPRECATED_WARNING __pragma( warning( push )) \ + __pragma( warning( disable: 4996)) +# define RTTR_END_DISABLE_DEPRECATED_WARNING __pragma( warning( pop )) -#define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( push )) \ - __pragma( warning( disable: 4127)) -#define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( pop )) +# define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( push )) \ + __pragma( warning( disable: 4127)) +# define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING __pragma( warning( pop )) + +# define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING +# define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING #else -# pragma message("WARNING: ukown compiler, don't know how to disable deprecated warnings") +# pragma message("WARNING: unknown compiler, don't know how to disable deprecated warnings") #endif + } // end namespace rttr #endif // RTTR_CORE_PREREQUISITES_H_ diff --git a/src/rttr/detail/impl/array_range_impl.h b/src/rttr/detail/impl/array_range_impl.h index 56489ab3..48cbff6e 100644 --- a/src/rttr/detail/impl/array_range_impl.h +++ b/src/rttr/detail/impl/array_range_impl.h @@ -153,7 +153,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran } else { - const_reverse_iterator itr(m_end - 1, this); + const_reverse_iterator itr(m_end, this); if (m_pred(*itr)) return itr; @@ -168,7 +168,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran template RTTR_INLINE typename array_range::const_reverse_iterator array_range::rend() { - return (empty_() ? const_reverse_iterator{m_begin, this} : const_reverse_iterator{m_begin - 1, this}); + return const_reverse_iterator{m_begin, this}; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -182,7 +182,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran } else { - const_reverse_iterator itr(m_end - 1, this); + const_reverse_iterator itr(m_end, this); if (m_pred(*itr)) return itr; @@ -197,7 +197,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran template RTTR_INLINE typename array_range::const_reverse_iterator array_range::rend() const { - return (empty_() ? const_reverse_iterator{m_begin, this} : const_reverse_iterator{m_begin - 1, this}); + return const_reverse_iterator{m_begin, this}; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -211,7 +211,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran } else { - const_reverse_iterator itr(m_end - 1, this); + const_reverse_iterator itr(m_end, this); if (m_pred(*itr)) return itr; @@ -226,7 +226,7 @@ RTTR_INLINE typename array_range::const_reverse_iterator array_ran template RTTR_INLINE typename array_range::const_reverse_iterator array_range::crend() const { - return (empty_() ? const_reverse_iterator{m_end, this} : const_reverse_iterator{m_begin - 1, this}); + return const_reverse_iterator{m_begin, this}; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -329,26 +329,6 @@ array_range::array_iterator_base::array_iterator_base(ty ///////////////////////////////////////////////////////////////////////////////////////// -template -template -RTTR_INLINE typename array_range::template array_iterator_base::reference -array_range::array_iterator_base::operator*() const -{ - return *m_ptr; -} - -///////////////////////////////////////////////////////////////////////////////////////// - -template -template -RTTR_INLINE typename array_range::template array_iterator_base::pointer -array_range::array_iterator_base::operator->() -{ - return m_ptr; -} - -///////////////////////////////////////////////////////////////////////////////////////// - template template RTTR_INLINE bool array_range::array_iterator_base::operator==(const self_type& rhs) const @@ -407,6 +387,26 @@ RTTR_INLINE array_range::array_iterator::array_iterator( ///////////////////////////////////////////////////////////////////////////////////////// +template +template +RTTR_INLINE typename array_range::template array_iterator::reference +array_range::array_iterator::operator*() const +{ + return *this->m_ptr; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +template +template +RTTR_INLINE typename array_range::template array_iterator::pointer +array_range::array_iterator::operator->() +{ + return this->m_ptr; +} + +///////////////////////////////////////////////////////////////////////////////////////// + template template RTTR_INLINE typename array_range::template array_iterator::self_type& @@ -457,6 +457,28 @@ RTTR_INLINE array_range::array_reverse_iterator::array_r { } +///////////////////////////////////////////////////////////////////////////////////////// + +template +template +RTTR_INLINE typename array_range::template array_reverse_iterator::reference +array_range::array_reverse_iterator::operator*() const +{ + auto tmp = this->m_ptr; + return (*--tmp); +} + +///////////////////////////////////////////////////////////////////////////////////////// + +template +template +RTTR_INLINE typename array_range::template array_reverse_iterator::pointer +array_range::array_reverse_iterator::operator->() +{ + auto tmp = this->m_ptr; + return --tmp; +} + //////////////////////////////////////////////////////////////////////////////////////////// template diff --git a/src/rttr/detail/impl/sequential_mapper_impl.h b/src/rttr/detail/impl/sequential_mapper_impl.h index 8567b485..abc0c2c7 100644 --- a/src/rttr/detail/impl/sequential_mapper_impl.h +++ b/src/rttr/detail/impl/sequential_mapper_impl.h @@ -790,7 +790,7 @@ struct sequential_container_mapper> { // to prevent following gcc bug: 'no matching function for call to `std::vector::erase(const const_itr_t&) return container.erase(itr);` // vec.erase(vec.cbegin()); fails for unkown reason with this old version -#if (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 4900) +#if (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 490) auto itr_non_const = container.begin(); std::advance (itr_non_const, std::distance(itr_non_const, itr)); return container.erase(itr_non_const); @@ -808,7 +808,7 @@ struct sequential_container_mapper> { // to prevent following gcc bug: 'no matching function for call to `std::vector::insert(const const_itr_t&, bool) return container.insert(itr, bool);` // vec.erase(vec.cbegin()); fails for unkown reason with this old version -#if (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 4900) +#if (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 490) auto itr_non_const = container.begin(); std::advance (itr_non_const, std::distance(itr_non_const, itr_pos)); return container.insert(itr_non_const, value); diff --git a/src/rttr/detail/misc/flat_map.h b/src/rttr/detail/misc/flat_map.h index ae5aff96..6c114a4d 100644 --- a/src/rttr/detail/misc/flat_map.h +++ b/src/rttr/detail/misc/flat_map.h @@ -165,7 +165,7 @@ class flat_map # if _LIBCPP_VERSION <= 3700 # define RTTR_NO_CXX11_CONST_EREASE_SUPPORT_IN_STL 1 # endif -#elif (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 4900) +#elif (RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 490) # define RTTR_NO_CXX11_CONST_EREASE_SUPPORT_IN_STL 1 #endif diff --git a/src/rttr/detail/misc/flat_multimap.h b/src/rttr/detail/misc/flat_multimap.h index 327b71d9..7c0cbf41 100644 --- a/src/rttr/detail/misc/flat_multimap.h +++ b/src/rttr/detail/misc/flat_multimap.h @@ -148,7 +148,7 @@ class flat_multimap return (m_value_list.cend()); } // older versions of gcc stl, have no support for const_iterator in std::vector::erase(const_iterator) -#if RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 4900 +#if RTTR_COMPILER == RTTR_COMPILER_GNUC && RTTR_COMP_VER < 490 void erase(const Key& key) { iterator_key itr = find_key(key); diff --git a/src/rttr/detail/misc/function_traits.h b/src/rttr/detail/misc/function_traits.h index 0111f1ea..73f99965 100644 --- a/src/rttr/detail/misc/function_traits.h +++ b/src/rttr/detail/misc/function_traits.h @@ -88,6 +88,14 @@ namespace detail template struct is_functor : std::true_type {}; +#ifndef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE + template + struct is_functor : std::true_type {}; + + template + struct is_functor : std::true_type {}; +#endif + ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// @@ -121,6 +129,26 @@ namespace detail template struct function_traits : function_traits {using class_type = C; }; +#ifndef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE + template + struct function_traits : function_traits { }; + + template + struct function_traits : function_traits { }; + + template + struct function_traits : function_traits { using class_type = C; }; + + template + struct function_traits : function_traits { using class_type = C; }; + + template + struct function_traits : function_traits { using class_type = C; }; + + template + struct function_traits : function_traits {using class_type = C; }; +#endif + template struct function_traits> : function_traits {}; diff --git a/src/rttr/detail/misc/standard_types.cpp b/src/rttr/detail/misc/standard_types.cpp index 1985c9a5..9a90fd13 100644 --- a/src/rttr/detail/misc/standard_types.cpp +++ b/src/rttr/detail/misc/standard_types.cpp @@ -31,6 +31,7 @@ #include #include #include +#include // explicit instantiation of std::string needed, otherwise we get a linker error with clang on osx // thats a bug in libc++, because of interaction with __attribute__ ((__visibility__("hidden"), __always_inline__)) in std::string @@ -89,6 +90,12 @@ RTTR_REGISTRATION .method("operator[]", rttr::select_overload(&std::string::operator[])) .method("operator[]", rttr::select_non_const(&std::string::operator[])) #endif +#if __cplusplus >= 201703L || (RTTR_COMPILER == RTTR_COMPILER_MSVC && !defined(RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE)) || \ + (RTTR_COMP_VER >= 900 && RTTR_PLATFORM == RTTR_PLATFORM_APPLE) + .method("data", rttr::select_const(&std::string::data)) + .method("data", rttr::select_non_const(&std::string::data)) +#else .method("data", &std::string::data) +#endif .method("c_str", &std::string::c_str); } diff --git a/src/rttr/detail/misc/utility.h b/src/rttr/detail/misc/utility.h index 996138b7..036e9d86 100644 --- a/src/rttr/detail/misc/utility.h +++ b/src/rttr/detail/misc/utility.h @@ -40,6 +40,10 @@ #include #include +#ifdef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING +#endif + namespace rttr { namespace detail @@ -521,4 +525,8 @@ struct hash } // end namespace detail } // end namespace rttr +#ifdef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +RTTR_END_DISABLE_EXCEPT_TYPE_WARNING +#endif + #endif //RTTR_UTILITY_H_ diff --git a/src/rttr/detail/type/type_comparator.h b/src/rttr/detail/type/type_comparator.h index a9f1e462..9d89985e 100644 --- a/src/rttr/detail/type/type_comparator.h +++ b/src/rttr/detail/type/type_comparator.h @@ -39,7 +39,7 @@ namespace detail ///////////////////////////////////////////////////////////////////////////////////////// -struct RTTR_LOCAL type_comparator_base +struct type_comparator_base { using cmp_func = bool (*)(const void* lhs, const void* rhs); diff --git a/src/rttr/detail/type/type_converter.h b/src/rttr/detail/type/type_converter.h index 555b0031..a7fb38ab 100644 --- a/src/rttr/detail/type/type_converter.h +++ b/src/rttr/detail/type/type_converter.h @@ -41,7 +41,7 @@ namespace detail ///////////////////////////////////////////////////////////////////////////////////////// -struct RTTR_LOCAL type_converter_base +struct type_converter_base { type_converter_base(const type& target_type) : m_target_type(target_type) {} virtual variant to_variant(void* data, bool& ok) const = 0; diff --git a/src/rttr/detail/type/type_impl.h b/src/rttr/detail/type/type_impl.h index 140c54c7..240014e4 100644 --- a/src/rttr/detail/type/type_impl.h +++ b/src/rttr/detail/type/type_impl.h @@ -140,133 +140,133 @@ RTTR_INLINE type::operator bool() const RTTR_NOEXCEPT ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE type type::get_raw_type() const RTTR_NOEXCEPT +RTTR_INLINE type type::get_raw_type() const RTTR_NOEXCEPT { return type(m_type_data->raw_type_data); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE type type::get_wrapped_type() const RTTR_NOEXCEPT +RTTR_INLINE type type::get_wrapped_type() const RTTR_NOEXCEPT { return type(m_type_data->wrapped_type); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE type type::get_raw_array_type() const RTTR_NOEXCEPT +RTTR_INLINE type type::get_raw_array_type() const RTTR_NOEXCEPT { return type(m_type_data->array_raw_type); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE string_view type::get_name() const RTTR_NOEXCEPT +RTTR_INLINE string_view type::get_name() const RTTR_NOEXCEPT { return m_type_data->name; } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE string_view type::get_full_name() const RTTR_NOEXCEPT +RTTR_INLINE string_view type::get_full_name() const RTTR_NOEXCEPT { return m_type_data->type_name; } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE std::size_t type::get_sizeof() const RTTR_NOEXCEPT +RTTR_INLINE std::size_t type::get_sizeof() const RTTR_NOEXCEPT { return m_type_data->get_sizeof; } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE std::size_t type::get_pointer_dimension() const RTTR_NOEXCEPT +RTTR_INLINE std::size_t type::get_pointer_dimension() const RTTR_NOEXCEPT { return m_type_data->get_pointer_dimension; } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_class() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_class() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_class); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_template_instantiation() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_template_instantiation() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_template_instantiation); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_enumeration() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_enumeration() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_enum); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_array() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_array() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_array); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_associative_container() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_associative_container() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_associative_container); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_sequential_container() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_sequential_container() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_sequential_container); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_pointer() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_pointer() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_pointer); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_arithmetic() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_arithmetic() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_arithmetic); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_function_pointer() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_function_pointer() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_function_pointer); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_member_object_pointer() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_member_object_pointer() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_member_object_pointer); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_member_function_pointer() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_member_function_pointer() const RTTR_NOEXCEPT { return m_type_data->type_trait_value(detail::type_trait_infos::is_member_function_pointer); } ///////////////////////////////////////////////////////////////////////////////////////// -RTTR_FORCE_INLINE bool type::is_wrapper() const RTTR_NOEXCEPT +RTTR_INLINE bool type::is_wrapper() const RTTR_NOEXCEPT { return m_type_data->wrapped_type->is_valid(); } diff --git a/src/rttr/detail/type/type_name.h b/src/rttr/detail/type/type_name.h index 8025fde1..1cc7d1a5 100644 --- a/src/rttr/detail/type/type_name.h +++ b/src/rttr/detail/type/type_name.h @@ -48,11 +48,16 @@ namespace detail \ #if RTTR_COMPILER == RTTR_COMPILER_MSVC // sizeof("const char *__cdecl rttr::detail::f<"), sizeof(">(void)") +#ifdef RTTR_NO_CXX11_NOEXCEPT RTTR_REGISTRATION_FUNC_EXTRACT_VARIABLES(36, 7) +#else + RTTR_REGISTRATION_FUNC_EXTRACT_VARIABLES(36, 16) // with " noexcept" +#endif + #elif RTTR_COMPILER == RTTR_COMPILER_GNUC // sizeof("const char* rttr::detail::f() [with T = "), sizeof("]") RTTR_REGISTRATION_FUNC_EXTRACT_VARIABLES(40, 1) -#elif RTTR_COMPILER == RTTR_COMPILER_CLANG +#elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG // sizeof("const char* rttr::detail::f() [T = "), sizeof("]") RTTR_REGISTRATION_FUNC_EXTRACT_VARIABLES(35, 1) #else @@ -84,7 +89,7 @@ RTTR_INLINE static const char* f() RTTR_NOEXCEPT __FUNCSIG__ #elif RTTR_COMPILER == RTTR_COMPILER_GNUC __PRETTY_FUNCTION__ - #elif RTTR_COMPILER == RTTR_COMPILER_CLANG + #elif RTTR_COMPILER == RTTR_COMPILER_CLANG || RTTR_COMPILER == RTTR_COMPILER_APPLECLANG __PRETTY_FUNCTION__ #else #error "Don't know how the extract type signatur for this compiler! Abort! Abort!" diff --git a/src/rttr/detail/type/type_register.cpp b/src/rttr/detail/type/type_register.cpp index 11584521..50284a09 100644 --- a/src/rttr/detail/type/type_register.cpp +++ b/src/rttr/detail/type/type_register.cpp @@ -560,7 +560,7 @@ void type_register_private::unregister_type(type_data* info) RTTR_NOEXCEPT m_type_data_storage.erase(std::remove_if(m_type_data_storage.begin(), m_type_data_storage.end(), [&found_type_data, info](type_data* data) { - return (data == info) ? found_type_data = true : false; + return (data == info) ? (found_type_data = true) : false; }), m_type_data_storage.end() ); diff --git a/src/rttr/detail/variant_associative_view/variant_associative_view_private.h b/src/rttr/detail/variant_associative_view/variant_associative_view_private.h index ece2efa8..3e4dfb9c 100644 --- a/src/rttr/detail/variant_associative_view/variant_associative_view_private.h +++ b/src/rttr/detail/variant_associative_view/variant_associative_view_private.h @@ -95,59 +95,59 @@ class RTTR_LOCAL variant_associative_view_private { } - RTTR_FORCE_INLINE variant_associative_view_private(const variant_associative_view_private& other) = default; + RTTR_INLINE variant_associative_view_private(const variant_associative_view_private& other) = default; - RTTR_FORCE_INLINE ~variant_associative_view_private() + RTTR_INLINE ~variant_associative_view_private() { } - RTTR_FORCE_INLINE type get_type() const RTTR_NOEXCEPT + RTTR_INLINE type get_type() const RTTR_NOEXCEPT { return m_type; } - RTTR_FORCE_INLINE type get_key_type() const RTTR_NOEXCEPT + RTTR_INLINE type get_key_type() const RTTR_NOEXCEPT { return m_key_type; } - RTTR_FORCE_INLINE type get_value_type() const RTTR_NOEXCEPT + RTTR_INLINE type get_value_type() const RTTR_NOEXCEPT { return m_value_type; } - RTTR_FORCE_INLINE void copy(iterator_data& itr_tgt, const iterator_data& itr_src) const + RTTR_INLINE void copy(iterator_data& itr_tgt, const iterator_data& itr_src) const { m_create_func(itr_tgt, itr_src); } - RTTR_FORCE_INLINE void destroy(iterator_data& itr) const + RTTR_INLINE void destroy(iterator_data& itr) const { m_delete_func(itr); } - RTTR_FORCE_INLINE void begin(iterator_data& itr) const + RTTR_INLINE void begin(iterator_data& itr) const { m_begin_func(m_container, itr); } - RTTR_FORCE_INLINE void end(iterator_data& itr) const + RTTR_INLINE void end(iterator_data& itr) const { m_end_func(m_container, itr); } - RTTR_FORCE_INLINE bool is_empty() const RTTR_NOEXCEPT + RTTR_INLINE bool is_empty() const RTTR_NOEXCEPT { return m_get_is_empty_func(m_container); } - RTTR_FORCE_INLINE std::size_t get_size() const RTTR_NOEXCEPT + RTTR_INLINE std::size_t get_size() const RTTR_NOEXCEPT { return m_get_size_func(m_container); } - RTTR_FORCE_INLINE bool equal(const iterator_data& lhs_itr, const iterator_data& rhs_itr) const RTTR_NOEXCEPT + RTTR_INLINE bool equal(const iterator_data& lhs_itr, const iterator_data& rhs_itr) const RTTR_NOEXCEPT { return m_equal_func(lhs_itr, rhs_itr); } @@ -168,23 +168,23 @@ class RTTR_LOCAL variant_associative_view_private } - RTTR_FORCE_INLINE void advance(iterator_data& itr, std::ptrdiff_t index) const + RTTR_INLINE void advance(iterator_data& itr, std::ptrdiff_t index) const { m_advance_func(itr, index); } - RTTR_FORCE_INLINE void find(iterator_data& itr, argument& key) + RTTR_INLINE void find(iterator_data& itr, argument& key) { m_find_func(m_container, itr, key); } - RTTR_FORCE_INLINE void equal_range(argument& key, + RTTR_INLINE void equal_range(argument& key, iterator_data& itr_begin, detail::iterator_data& itr_end) { m_equal_range_func(m_container, key, itr_begin, itr_end); } - RTTR_FORCE_INLINE void clear() + RTTR_INLINE void clear() { m_clear_func(m_container); } diff --git a/src/rttr/detail/variant_sequential_view/variant_sequential_view_private.h b/src/rttr/detail/variant_sequential_view/variant_sequential_view_private.h index 1ddf881d..a1a62365 100644 --- a/src/rttr/detail/variant_sequential_view/variant_sequential_view_private.h +++ b/src/rttr/detail/variant_sequential_view/variant_sequential_view_private.h @@ -95,74 +95,74 @@ class RTTR_LOCAL variant_sequential_view_private { } - RTTR_FORCE_INLINE variant_sequential_view_private(const variant_sequential_view_private& other) = default; + RTTR_INLINE variant_sequential_view_private(const variant_sequential_view_private& other) = default; - RTTR_FORCE_INLINE ~variant_sequential_view_private() + RTTR_INLINE ~variant_sequential_view_private() { } - RTTR_FORCE_INLINE type get_type() const RTTR_NOEXCEPT + RTTR_INLINE type get_type() const RTTR_NOEXCEPT { return m_type; } - RTTR_FORCE_INLINE type get_value_type() const RTTR_NOEXCEPT + RTTR_INLINE type get_value_type() const RTTR_NOEXCEPT { return m_value_type; } - RTTR_FORCE_INLINE void copy(iterator_data& itr_tgt, const iterator_data& itr_src) const + RTTR_INLINE void copy(iterator_data& itr_tgt, const iterator_data& itr_src) const { m_create_func(itr_tgt, itr_src); } - RTTR_FORCE_INLINE void destroy(iterator_data& itr) const + RTTR_INLINE void destroy(iterator_data& itr) const { m_delete_func(itr); } - RTTR_FORCE_INLINE void begin(iterator_data& itr) const + RTTR_INLINE void begin(iterator_data& itr) const { m_begin_func(m_container, itr); } - RTTR_FORCE_INLINE void end(iterator_data& itr) const + RTTR_INLINE void end(iterator_data& itr) const { m_end_func(m_container, itr); } - RTTR_FORCE_INLINE bool is_empty() const RTTR_NOEXCEPT + RTTR_INLINE bool is_empty() const RTTR_NOEXCEPT { return m_get_is_empty_func(m_container); } - RTTR_FORCE_INLINE bool is_dynamic() const RTTR_NOEXCEPT + RTTR_INLINE bool is_dynamic() const RTTR_NOEXCEPT { return m_is_dynamic_func(); } - RTTR_FORCE_INLINE std::size_t get_rank() const RTTR_NOEXCEPT + RTTR_INLINE std::size_t get_rank() const RTTR_NOEXCEPT { return m_get_rank_func(); } - RTTR_FORCE_INLINE type get_rank_type(std::size_t index) const RTTR_NOEXCEPT + RTTR_INLINE type get_rank_type(std::size_t index) const RTTR_NOEXCEPT { return m_get_rank_type_func(index); } - RTTR_FORCE_INLINE std::size_t get_size() const RTTR_NOEXCEPT + RTTR_INLINE std::size_t get_size() const RTTR_NOEXCEPT { return m_get_size_func(m_container); } - RTTR_FORCE_INLINE bool set_size(std::size_t size) const RTTR_NOEXCEPT + RTTR_INLINE bool set_size(std::size_t size) const RTTR_NOEXCEPT { return m_set_size_func(m_container, size); } - RTTR_FORCE_INLINE bool equal(const iterator_data& lhs_itr, const iterator_data& rhs_itr) const RTTR_NOEXCEPT + RTTR_INLINE bool equal(const iterator_data& lhs_itr, const iterator_data& rhs_itr) const RTTR_NOEXCEPT { return m_equal_func(lhs_itr, rhs_itr); } @@ -173,12 +173,12 @@ class RTTR_LOCAL variant_sequential_view_private } - RTTR_FORCE_INLINE void advance(iterator_data& itr, std::ptrdiff_t index) const + RTTR_INLINE void advance(iterator_data& itr, std::ptrdiff_t index) const { m_advance_func(itr, index); } - RTTR_FORCE_INLINE void clear() + RTTR_INLINE void clear() { m_clear_func(m_container); } diff --git a/src/rttr/enum_flags.h b/src/rttr/enum_flags.h index 5d67f8c3..5e1173a1 100644 --- a/src/rttr/enum_flags.h +++ b/src/rttr/enum_flags.h @@ -273,11 +273,8 @@ namespace detail */ class invalid_enum_flag { -public: - RTTR_CONSTEXPR RTTR_INLINE explicit invalid_enum_flag(int v) : m_value(v) {} - -private: - int32_t m_value; + public: + RTTR_CONSTEXPR RTTR_INLINE explicit invalid_enum_flag(int v){} }; } // end namespace detail diff --git a/src/rttr/registration b/src/rttr/registration index ef09ebfe..bcddced8 100644 --- a/src/rttr/registration +++ b/src/rttr/registration @@ -28,6 +28,12 @@ #ifndef RTTR_REGISTRATION_HEADERS_H_ #define RTTR_REGISTRATION_HEADERS_H_ +#include "detail/base/core_prerequisites.h" + +#ifdef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING +#endif + #include "type.h" #include "rttr_enable.h" #include "rttr_cast.h" @@ -39,4 +45,8 @@ #include "enumeration.h" #include "registration.h" +#ifdef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +RTTR_END_DISABLE_EXCEPT_TYPE_WARNING +#endif + #endif // RTTR_REGISTRATION_HEADERS_H_ diff --git a/src/rttr/registration.h b/src/rttr/registration.h index 6972ed2e..1ccfec16 100644 --- a/src/rttr/registration.h +++ b/src/rttr/registration.h @@ -569,6 +569,19 @@ auto select_const(ReturnType (ClassType::*func)(Args...) const) -> decltype(func return func; } +#ifndef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE +/*! + * \brief Overload with `noexcept` function type. + * + * \see select_const + */ +template +auto select_const(ReturnType (ClassType::*func)(Args...) const noexcept) -> decltype(func) +{ + return func; +} +#endif + /*! * \brief This is a helper function to register overloaded const member functions. * @@ -611,6 +624,20 @@ auto select_non_const(ReturnType(ClassType::*func)(Args...)) -> decltype(func) return func; } +#ifndef RTTR_NO_CXX17_NOEXCEPT_FUNC_TYPE + +/*! + * \brief Overload with `noexcept` function type. + * + * \see select_const + */ +template +auto select_non_const(ReturnType(ClassType::*func)(Args...) noexcept) -> decltype(func) +{ + return func; +} +#endif + /*! * The \ref metadata function can be used to add additional meta data information during the * registration process of reflection information. Use it in the `()` operator of the returned diff --git a/src/rttr/type.h b/src/rttr/type.h index 7ad1dcb7..0dd6741c 100644 --- a/src/rttr/type.h +++ b/src/rttr/type.h @@ -248,7 +248,7 @@ class RTTR_API type * * \return The type name. */ - RTTR_FORCE_INLINE string_view get_name() const RTTR_NOEXCEPT; + RTTR_INLINE string_view get_name() const RTTR_NOEXCEPT; /*! * \brief Returns true if this type is valid, that means the type holds valid data to a type. @@ -272,7 +272,7 @@ class RTTR_API type * * \return The corresponding raw type object. */ - RTTR_FORCE_INLINE type get_raw_type() const RTTR_NOEXCEPT; + RTTR_INLINE type get_raw_type() const RTTR_NOEXCEPT; /*! * \brief Returns a type object which represent the wrapped type. @@ -294,7 +294,7 @@ class RTTR_API type * * \return The type object of the wrapped type. */ - RTTR_FORCE_INLINE type get_wrapped_type() const RTTR_NOEXCEPT; + RTTR_INLINE type get_wrapped_type() const RTTR_NOEXCEPT; /*! * \brief Returns a type object for the given template type \a T. @@ -343,14 +343,14 @@ class RTTR_API type * * \return The size of the type in bytes. */ - RTTR_FORCE_INLINE std::size_t get_sizeof() const RTTR_NOEXCEPT; + RTTR_INLINE std::size_t get_sizeof() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type is class; that is not an atomic type or a method. * * \return True if the type is a class, otherwise false. */ - RTTR_FORCE_INLINE bool is_class() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_class() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type is an instantiation of a class template. @@ -370,7 +370,7 @@ class RTTR_API type * * \see get_template_arguments() */ - RTTR_FORCE_INLINE bool is_template_instantiation() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_template_instantiation() const RTTR_NOEXCEPT; /*! * \brief Returns a list of type objects that represents the template arguments. @@ -400,7 +400,7 @@ class RTTR_API type * * \return True if the type is an enumeration, otherwise false. */ - RTTR_FORCE_INLINE bool is_enumeration() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_enumeration() const RTTR_NOEXCEPT; /*! * \brief Returns the enumerator if this type is an enum type; @@ -429,7 +429,7 @@ class RTTR_API type * \return True if the type is an wrapper, otherwise false. * */ - RTTR_FORCE_INLINE bool is_wrapper() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_wrapper() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents an array. @@ -438,7 +438,7 @@ class RTTR_API type * * \see \ref array_mapper "array_mapper" */ - RTTR_FORCE_INLINE bool is_array() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_array() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents an @@ -448,7 +448,7 @@ class RTTR_API type * * \see \ref associative_container_mapper "associative_container_mapper" */ - RTTR_FORCE_INLINE bool is_associative_container() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_associative_container() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents an @@ -458,7 +458,7 @@ class RTTR_API type * * \see \ref sequential_container_mapper "sequential_container_mapper" */ - RTTR_FORCE_INLINE bool is_sequential_container() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_sequential_container() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents a pointer. @@ -466,7 +466,7 @@ class RTTR_API type * * \return True if the type is a pointer, otherwise false. */ - RTTR_FORCE_INLINE bool is_pointer() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_pointer() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents an arithmetic type. @@ -475,7 +475,7 @@ class RTTR_API type * * \return True if the type is a arithmetic type, otherwise false. */ - RTTR_FORCE_INLINE bool is_arithmetic() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_arithmetic() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents a pointer to a function @@ -483,7 +483,7 @@ class RTTR_API type * * \return True if the type is a function pointer, otherwise false. */ - RTTR_FORCE_INLINE bool is_function_pointer() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_function_pointer() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents a pointer to a member object. @@ -491,7 +491,7 @@ class RTTR_API type * * \return True if the type is a member object pointer, otherwise false. */ - RTTR_FORCE_INLINE bool is_member_object_pointer() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_member_object_pointer() const RTTR_NOEXCEPT; /*! * \brief Returns true whether the given type represents a pointer to a member function. @@ -499,7 +499,7 @@ class RTTR_API type * * \return True if the type is a member function pointer type, otherwise false. */ - RTTR_FORCE_INLINE bool is_member_function_pointer() const RTTR_NOEXCEPT; + RTTR_INLINE bool is_member_function_pointer() const RTTR_NOEXCEPT; /*! * \brief Returns true if this type is derived from the given type \p other, otherwise false. @@ -1128,7 +1128,7 @@ class RTTR_API type * * \return The pointer dimension. */ - RTTR_FORCE_INLINE std::size_t get_pointer_dimension() const RTTR_NOEXCEPT; + RTTR_INLINE std::size_t get_pointer_dimension() const RTTR_NOEXCEPT; /*! * \brief Returns the raw type of an array @@ -1137,14 +1137,14 @@ class RTTR_API type * * \return The raw array type. */ - RTTR_FORCE_INLINE type get_raw_array_type() const RTTR_NOEXCEPT; + RTTR_INLINE type get_raw_array_type() const RTTR_NOEXCEPT; /*! * \brief Returns the compiler depended name of the type. * * \return The full type name. */ - RTTR_FORCE_INLINE string_view get_full_name() const RTTR_NOEXCEPT; + RTTR_INLINE string_view get_full_name() const RTTR_NOEXCEPT; /*! * \brief Creates a wrapped value from the given argument \p arg and moves it into the diff --git a/src/unit_tests/CMakeLists.txt b/src/unit_tests/CMakeLists.txt index d235cbc6..4e876dcd 100644 --- a/src/unit_tests/CMakeLists.txt +++ b/src/unit_tests/CMakeLists.txt @@ -25,7 +25,7 @@ # # #################################################################################### -project(unit_tests) +project(unit_tests LANGUAGES CXX) message(STATUS "Scanning " ${PROJECT_NAME} " module.") message(STATUS "===========================") @@ -44,8 +44,15 @@ target_link_libraries(unit_tests RTTR::Core) add_dependencies(unit_tests RTTR::Core) target_include_directories(unit_tests PUBLIC ${CATCH_DIR}) set_target_properties(unit_tests PROPERTIES DEBUG_POSTFIX _d - INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}") + INSTALL_RPATH "${RTTR_EXECUTABLE_INSTALL_RPATH}" + CXX_STANDARD ${MAX_CXX_STANDARD}) +set_compiler_warnings(unit_tests) + +if (MSVC) + target_compile_options(unit_tests PRIVATE /bigobj) +endif() + # run tests add_custom_target(run_tests ALL COMMAND "$" diff --git a/src/unit_tests/method/test_method_reflection.cpp b/src/unit_tests/method/test_method_reflection.cpp index 6bcfea1e..69394f18 100644 --- a/src/unit_tests/method/test_method_reflection.cpp +++ b/src/unit_tests/method/test_method_reflection.cpp @@ -134,6 +134,7 @@ RTTR_REGISTRATION .method("method_fun_ptr_arg", &method_test::method_fun_ptr_arg) .method("method_with_ptr", &method_test::method_with_ptr) .method("variant_func", &method_test::set_func_via_variant) + .method("func_with_noexcept", &method_test::func_with_noexcept) ; registration::class_("method_test_derived") @@ -303,7 +304,7 @@ TEST_CASE("Test method", "[method]") // check up_cast, cross cast and middle in the hierarchy cast through invoke method_test_final final_obj; type t_final = type::get(final_obj); - REQUIRE(t_final.get_methods().size() == 21); // +1 overloaded + REQUIRE(t_final.get_methods().size() == 22); // +1 overloaded // test the up cast t_final.get_method("method_3").invoke(final_obj, 1000); REQUIRE(final_obj.method_3_called == true); @@ -407,13 +408,13 @@ TEST_CASE("Test method signature", "[method]") { const auto meth_range = type::get().get_methods(); std::vector methods(meth_range.cbegin(), meth_range.cend()); - REQUIRE(methods.size() == 21); + REQUIRE(methods.size() == 22); REQUIRE(methods[0].get_signature() == "method_1( )"); REQUIRE(methods[3].get_signature() == std::string("method_4( ") + type::get().get_name() + " & )"); REQUIRE(methods[4].get_signature() == "method_5( double* )"); REQUIRE(methods[5].get_signature() == "method_5( int, double )"); - REQUIRE(methods[20].get_signature() == "method_13( )"); + REQUIRE(methods[21].get_signature() == "method_13( )"); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -536,6 +537,20 @@ TEST_CASE("method - invoke with variant as argument", "[method]") ///////////////////////////////////////////////////////////////////////////////////////// +TEST_CASE("method - invoke func with noexcept in signature", "[method]") +{ + method meth = type::get().get_method("func_with_noexcept"); + method_test obj; + + auto ret = meth.invoke(obj, 23); + + CHECK(ret.is_valid() == true); + CHECK(ret.to_int() == 42); + CHECK(obj.method_with_noexpcet_called == true); +} + +///////////////////////////////////////////////////////////////////////////////////////// + TEST_CASE("method - invoke base method, which is not registerd", "[method]") { type t_meth = type::get(); diff --git a/src/unit_tests/method/test_method_reflection.h b/src/unit_tests/method/test_method_reflection.h index 5bd83bf3..4017141e 100644 --- a/src/unit_tests/method/test_method_reflection.h +++ b/src/unit_tests/method/test_method_reflection.h @@ -63,6 +63,12 @@ struct method_test return (var == 23) ? true : false; } + int func_with_noexcept(int value) const volatile RTTR_NOEXCEPT + { + method_with_noexpcet_called = true; + return 42; + } + double dummy_data = 12; std::string dummy_text = "Hello World"; int method_3_value = 0; @@ -82,6 +88,7 @@ struct method_test bool method_func_ptr_arg_called = false; bool method_with_ptr_called = false; void(*m_func_ptr)(int) = nullptr; + mutable bool method_with_noexpcet_called= false; RTTR_ENABLE() }; diff --git a/src/unit_tests/misc/string_view_test.cpp b/src/unit_tests/misc/string_view_test.cpp index 468c60f9..68869867 100644 --- a/src/unit_tests/misc/string_view_test.cpp +++ b/src/unit_tests/misc/string_view_test.cpp @@ -36,7 +36,6 @@ #include using namespace rttr; -using namespace std; ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/unit_tests/test_classes.h b/src/unit_tests/test_classes.h index 56311520..c476665f 100644 --- a/src/unit_tests/test_classes.h +++ b/src/unit_tests/test_classes.h @@ -30,13 +30,17 @@ #include -#define CLASS(CLASS_NAME) struct CLASS_NAME { RTTR_ENABLE() virtual int getType() { return 0; } int dummyIntValue; }; +#define CLASS(CLASS_NAME) struct CLASS_NAME \ +{ RTTR_ENABLE() virtual int getType() { return dummyIntValue; } int dummyIntValue = 0; }; -#define CLASS_INHERIT(CLASS1, CLASS2) struct CLASS1 : CLASS2 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2) double dummyDoubleValue; }; +#define CLASS_INHERIT(CLASS1, CLASS2) struct CLASS1 : CLASS2 \ +{ virtual int getType() { return static_cast(dummyDoubleValue); } RTTR_ENABLE(CLASS2) double dummyDoubleValue = 1; }; -#define CLASS_MULTI_INHERIT_2(CLASS1, CLASS2, CLASS3) struct CLASS1 : CLASS2, CLASS3 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2, CLASS3) bool dummyBoolValue; }; +#define CLASS_MULTI_INHERIT_2(CLASS1, CLASS2, CLASS3) struct CLASS1 : CLASS2, CLASS3 \ +{ virtual int getType() { return static_cast(dummyBoolValue); } RTTR_ENABLE(CLASS2, CLASS3) bool dummyBoolValue = false; }; -#define CLASS_MULTI_INHERIT_5(CLASS1, CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) struct CLASS1 : CLASS2, CLASS3, CLASS4, CLASS5, CLASS6 { virtual int getType() { return 1; } RTTR_ENABLE(CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) bool dummyBoolValue; }; +#define CLASS_MULTI_INHERIT_5(CLASS1, CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) struct CLASS1 : CLASS2, CLASS3, CLASS4, CLASS5, CLASS6 \ +{ virtual int getType() { return static_cast(dummyBoolValue); } RTTR_ENABLE(CLASS2, CLASS3, CLASS4, CLASS5, CLASS6) bool dummyBoolValue = true; }; ///////////////////////////////////////////////////////////////////////////////////////// // The following class structures has 7 hierarchy levels and is 5 classes wide;