diff --git a/.gitmodules b/.gitmodules index b0b35e4..6feceff 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,9 @@ [submodule "develop/vendors/fmt"] path = develop/vendors/fmt url = https://github.com/fmtlib/fmt +[submodule "develop/vendors/gbench"] + path = develop/vendors/gbench + url = https://github.com/google/benchmark +[submodule "develop/vendors/vmath.hpp"] + path = develop/vendors/vmath.hpp + url = https://github.com/BlackMATov/vmath.hpp diff --git a/develop/CMakeLists.txt b/develop/CMakeLists.txt index 83b1241..162f558 100644 --- a/develop/CMakeLists.txt +++ b/develop/CMakeLists.txt @@ -16,6 +16,7 @@ include(SetupTargets) add_subdirectory(manuals) add_subdirectory(singles) +add_subdirectory(unbench) add_subdirectory(untests) add_subdirectory(vendors) diff --git a/develop/cmake/SetupTargets.cmake b/develop/cmake/SetupTargets.cmake index c1ae755..2effad2 100644 --- a/develop/cmake/SetupTargets.cmake +++ b/develop/cmake/SetupTargets.cmake @@ -1,10 +1,6 @@ add_library(${PROJECT_NAME}.setup_targets INTERFACE) add_library(${PROJECT_NAME}::setup_targets ALIAS ${PROJECT_NAME}.setup_targets) -target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE - meta.hpp.vendors::doctest - meta.hpp.vendors::fmt) - target_compile_options(${PROJECT_NAME}.setup_targets INTERFACE $<$: /WX /W4> @@ -15,6 +11,7 @@ target_compile_options(${PROJECT_NAME}.setup_targets INTERFACE -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-exit-time-destructors + -Wno-global-constructors -Wno-padded -Wno-unneeded-internal-declaration -Wno-unused-macros @@ -23,26 +20,13 @@ target_compile_options(${PROJECT_NAME}.setup_targets INTERFACE -Wno-zero-as-null-pointer-constant >) -if(BUILD_WITH_COVERAGE) - target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE - meta.hpp::enable_gcov) -endif() - -if(BUILD_WITH_SANITIZERS) - target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE +target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE + $<$: + meta.hpp::enable_gcov> + $<$: meta.hpp::enable_asan - meta.hpp::enable_ubsan) -endif() - -if(BUILD_WITH_NO_EXCEPTIONS) - target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE - meta.hpp::disable_exceptions) - - target_compile_definitions(${PROJECT_NAME}.setup_targets INTERFACE - DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS) -endif() - -if(BUILD_WITH_NO_RTTI) - target_link_libraries(${PROJECT_NAME}.setup_targets INTERFACE - meta.hpp::disable_rtti) -endif() + meta.hpp::enable_ubsan> + $<$: + meta.hpp::disable_exceptions> + $<$: + meta.hpp::disable_rtti>) diff --git a/develop/manuals/CMakeLists.txt b/develop/manuals/CMakeLists.txt index 92706b0..861c994 100644 --- a/develop/manuals/CMakeLists.txt +++ b/develop/manuals/CMakeLists.txt @@ -8,11 +8,15 @@ add_executable(${PROJECT_NAME}.singles ${MANUALS_SOURCES}) target_link_libraries(${PROJECT_NAME} PRIVATE meta.hpp::meta.hpp - meta.hpp::setup_targets) + meta.hpp::setup_targets + meta.hpp.vendors::doctest + meta.hpp.vendors::fmt) target_link_libraries(${PROJECT_NAME}.singles PRIVATE meta.hpp::singles - meta.hpp::setup_targets) + meta.hpp::setup_targets + meta.hpp.vendors::doctest + meta.hpp.vendors::fmt) add_test(${PROJECT_NAME} ${PROJECT_NAME}) add_test(${PROJECT_NAME} ${PROJECT_NAME}.singles) diff --git a/develop/unbench/CMakeLists.txt b/develop/unbench/CMakeLists.txt new file mode 100644 index 0000000..4661203 --- /dev/null +++ b/develop/unbench/CMakeLists.txt @@ -0,0 +1,22 @@ +project(meta.hpp.unbench) + +file(GLOB_RECURSE UNBENCH_SOURCES CONFIGURE_DEPENDS "*.cpp" "*.hpp") +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${UNBENCH_SOURCES}) + +add_executable(${PROJECT_NAME} ${UNBENCH_SOURCES}) +add_executable(${PROJECT_NAME}.singles ${UNBENCH_SOURCES}) + +target_link_libraries(${PROJECT_NAME} PRIVATE + meta.hpp::meta.hpp + meta.hpp::setup_targets + meta.hpp.vendors::gbench + meta.hpp.vendors::vmath.hpp) + +target_link_libraries(${PROJECT_NAME}.singles PRIVATE + meta.hpp::singles + meta.hpp::setup_targets + meta.hpp.vendors::gbench + meta.hpp.vendors::vmath.hpp) + +add_test(${PROJECT_NAME} ${PROJECT_NAME}) +add_test(${PROJECT_NAME} ${PROJECT_NAME}.singles) diff --git a/develop/unbench/invoke_with_args_bench.cpp b/develop/unbench/invoke_with_args_bench.cpp new file mode 100644 index 0000000..222a91e --- /dev/null +++ b/develop/unbench/invoke_with_args_bench.cpp @@ -0,0 +1,61 @@ +/******************************************************************************* + * This file is part of the "https://github.com/blackmatov/meta.hpp" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2021-2023, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include + +#include +#include + +namespace +{ + namespace meta = meta_hpp; + namespace vmath = vmath_hpp; + + struct clazz { + static float static_function(float angle, const vmath::fvec3& axis) { + return vmath::determinant(vmath::inverse(vmath::rotate4(angle, axis))); + } + }; + + const float angle{0.2f}; + const meta::uvalue angle_v{angle}; + + const vmath::fvec3 axis{1.f, 0.f, 0.f}; + const meta::uvalue axis_v{axis}; + + const meta::function dynamic_function{[](){ + meta::class_().function_("static_function", &clazz::static_function); + return meta::resolve_type().get_function("static_function"); + }()}; + + void invoke_with_args_native(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{clazz::static_function(angle, axis)}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } + + void invoke_with_args_dynamic1(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{meta::invoke(&clazz::static_function, angle, axis)}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } + + void invoke_with_args_dynamic2(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{meta::invoke(dynamic_function, angle_v, axis_v)}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } +} + +BENCHMARK(invoke_with_args_native); +BENCHMARK(invoke_with_args_dynamic1); +BENCHMARK(invoke_with_args_dynamic2); diff --git a/develop/unbench/invoke_without_args_bench.cpp b/develop/unbench/invoke_without_args_bench.cpp new file mode 100644 index 0000000..b848420 --- /dev/null +++ b/develop/unbench/invoke_without_args_bench.cpp @@ -0,0 +1,55 @@ +/******************************************************************************* + * This file is part of the "https://github.com/blackmatov/meta.hpp" + * For conditions of distribution and use, see copyright notice in LICENSE.md + * Copyright (C) 2021-2023, by Matvey Cherevko (blackmatov@gmail.com) + ******************************************************************************/ + +#include + +#include +#include + +namespace +{ + namespace meta = meta_hpp; + namespace vmath = vmath_hpp; + + struct clazz { + static float static_function() { + return vmath::determinant(vmath::inverse(vmath::fmat4{})); + } + }; + + const meta::function dynamic_function{[](){ + meta::class_().function_("static_function", &clazz::static_function); + return meta::resolve_type().get_function("static_function"); + }()}; + + void invoke_without_args_native(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{clazz::static_function()}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } + + void invoke_without_args_dynamic1(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{meta::invoke(&clazz::static_function)}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } + + void invoke_without_args_dynamic2(benchmark::State &state) { + for ( auto _ : state ) { + const auto r{meta::invoke(dynamic_function)}; + benchmark::DoNotOptimize(r); + benchmark::ClobberMemory(); + } + } +} + +BENCHMARK(invoke_without_args_native); +BENCHMARK(invoke_without_args_dynamic1); +BENCHMARK(invoke_without_args_dynamic2); diff --git a/develop/untests/CMakeLists.txt b/develop/untests/CMakeLists.txt index 07de844..8396a48 100644 --- a/develop/untests/CMakeLists.txt +++ b/develop/untests/CMakeLists.txt @@ -8,11 +8,13 @@ add_executable(${PROJECT_NAME}.singles ${UNTESTS_SOURCES}) target_link_libraries(${PROJECT_NAME} PRIVATE meta.hpp::meta.hpp - meta.hpp::setup_targets) + meta.hpp::setup_targets + meta.hpp.vendors::doctest) target_link_libraries(${PROJECT_NAME}.singles PRIVATE meta.hpp::singles - meta.hpp::setup_targets) + meta.hpp::setup_targets + meta.hpp.vendors::doctest) add_test(${PROJECT_NAME} ${PROJECT_NAME}) add_test(${PROJECT_NAME} ${PROJECT_NAME}.singles) diff --git a/develop/vendors/CMakeLists.txt b/develop/vendors/CMakeLists.txt index df35475..b9a2f12 100644 --- a/develop/vendors/CMakeLists.txt +++ b/develop/vendors/CMakeLists.txt @@ -14,8 +14,12 @@ target_include_directories(${PROJECT_NAME}.doctest SYSTEM PUBLIC doctest) target_compile_definitions(${PROJECT_NAME}.doctest - PRIVATE DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN - INTERFACE DOCTEST_CONFIG_USE_STD_HEADERS) + PRIVATE + DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN + PUBLIC + DOCTEST_CONFIG_USE_STD_HEADERS + $<$: + DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS>) # # fmt @@ -32,3 +36,33 @@ target_include_directories(${PROJECT_NAME}.fmt SYSTEM target_compile_definitions(${PROJECT_NAME}.fmt INTERFACE FMT_HEADER_ONLY) + +# +# gbench +# + +file(GLOB_RECURSE GBENCH_SOURCES CONFIGURE_DEPENDS "gbench/src/*.cc") +add_library(${PROJECT_NAME}.gbench STATIC ${GBENCH_SOURCES}) +add_library(${PROJECT_NAME}::gbench ALIAS ${PROJECT_NAME}.gbench) + +target_compile_features(${PROJECT_NAME}.gbench + PUBLIC cxx_std_20) + +target_include_directories(${PROJECT_NAME}.gbench SYSTEM + PUBLIC gbench/include) + +target_compile_definitions(${PROJECT_NAME}.gbench + PUBLIC BENCHMARK_STATIC_DEFINE) + +# +# vmath +# + +add_library(${PROJECT_NAME}.vmath.hpp INTERFACE) +add_library(${PROJECT_NAME}::vmath.hpp ALIAS ${PROJECT_NAME}.vmath.hpp) + +target_compile_features(${PROJECT_NAME}.vmath.hpp + INTERFACE cxx_std_20) + +target_include_directories(${PROJECT_NAME}.vmath.hpp SYSTEM + INTERFACE vmath.hpp/headers) diff --git a/develop/vendors/gbench b/develop/vendors/gbench new file mode 160000 index 0000000..d572f47 --- /dev/null +++ b/develop/vendors/gbench @@ -0,0 +1 @@ +Subproject commit d572f4777349d43653b21d6c2fc63020ab326db2 diff --git a/develop/vendors/vmath.hpp b/develop/vendors/vmath.hpp new file mode 160000 index 0000000..4699938 --- /dev/null +++ b/develop/vendors/vmath.hpp @@ -0,0 +1 @@ +Subproject commit 4699938160c90ae5539b3b1a26dbeaef0bf0ab0c