diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 12efe5e..3d6b80e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,7 @@ jobs: cd .. rm -rf __build - - name: Run modules tests wihtout 'import std;' + - name: Run modules tests without 'import std;' if: ${{matrix.toolset == 'clang-19'}} run: | cd ../boost-root/libs/any @@ -218,7 +218,7 @@ jobs: cd .. rm -rf build_module - - name: Run modules tests wihtout 'import std;' + - name: Run modules tests without 'import std;' if: ${{matrix.toolset == 'msvc-14.3'}} shell: cmd run: | @@ -243,8 +243,8 @@ jobs: needs: posix runs-on: ubuntu-latest steps: - - name: Coveralls Finished - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.github_token }} - parallel-finished: true + - name: Coveralls Finished + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.github_token }} + parallel-finished: true diff --git a/CMakeLists.txt b/CMakeLists.txt index 014cdad..2a26570 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,39 +2,82 @@ # Distributed under the Boost Software License, Version 1.0. # See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt -cmake_minimum_required( VERSION 3.5...3.31 ) -project( boost_any VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX ) +cmake_minimum_required(VERSION 3.21...4.2) -if (BOOST_USE_MODULES) +project(boost_any VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX) + +if(PROJECT_IS_TOP_LEVEL) + find_package(Boost 1.90.0 CONFIG) +endif() + +if(BOOST_USE_MODULES) + if(NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 20) + endif() add_library(boost_any) - target_sources(boost_any PUBLIC - FILE_SET modules_public TYPE CXX_MODULES FILES - ${CMAKE_CURRENT_LIST_DIR}/modules/boost_any.cppm + target_sources( + boost_any + PUBLIC + FILE_SET modules_public + TYPE CXX_MODULES + FILES modules/boost_any.cppm ) target_compile_features(boost_any PUBLIC cxx_std_20) target_compile_definitions(boost_any PUBLIC BOOST_USE_MODULES) - if (CMAKE_CXX_COMPILER_IMPORT_STD) + if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) + set(CMAKE_CXX_MODULE_STD ON) target_compile_definitions(boost_any PRIVATE BOOST_ANY_USE_STD_MODULE) message(STATUS "Using `import std;`") else() - message(STATUS "`import std;` is not available") + message(WARNING "`import std;` is not available") endif() set(__scope PUBLIC) else() + set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL}) add_library(boost_any INTERFACE) set(__scope INTERFACE) endif() -target_include_directories(boost_any ${__scope} include) -target_link_libraries( boost_any - ${__scope} - Boost::config - Boost::throw_exception - Boost::type_index -) +if(CMAKE_VERSION VERSION_LESS 3.23) + target_include_directories(boost_any ${__scope} include) +else() + target_sources( + boost_any + ${__scope} + FILE_SET headers_public + TYPE HEADERS + BASE_DIRS include + FILES + include/boost/any/bad_any_cast.hpp + include/boost/any/basic_any.hpp + include/boost/any/fwd.hpp + include/boost/any/unique_any.hpp + include/boost/any/detail/config.hpp + include/boost/any/detail/placeholder.hpp + ) + if(NOT BOOST_USE_MODULES) + target_compile_features(boost_any ${__scope} cxx_std_17) + endif() +endif() + +if(PROJECT_IS_TOP_LEVEL) + target_link_libraries( + boost_any + ${__scope} + Boost::headers + ) +else() + target_link_libraries( + boost_any + ${__scope} + Boost::config + Boost::throw_exception + Boost::type_index + ) +endif() -add_library( Boost::any ALIAS boost_any ) +add_library(Boost::any ALIAS boost_any) if(BUILD_TESTING) add_subdirectory(test) diff --git a/include/boost/any/fwd.hpp b/include/boost/any/fwd.hpp index 0263a61..d41a735 100644 --- a/include/boost/any/fwd.hpp +++ b/include/boost/any/fwd.hpp @@ -17,6 +17,9 @@ #ifdef BOOST_HAS_PRAGMA_ONCE # pragma once #endif + +#include + #endif // #ifndef BOOST_ANY_INTERFACE_UNIT /// \file boost/any/fwd.hpp diff --git a/modules/boost_any.cppm b/modules/boost_any.cppm index 9eedd5b..652343e 100644 --- a/modules/boost_any.cppm +++ b/modules/boost_any.cppm @@ -11,7 +11,8 @@ module; #include #include #include -#include + +import boost.type_index; #ifdef BOOST_ANY_USE_STD_MODULE import std; diff --git a/modules/usage_sample.cpp b/modules/usage_sample.cpp index ba72469..6c88273 100644 --- a/modules/usage_sample.cpp +++ b/modules/usage_sample.cpp @@ -7,10 +7,50 @@ // clang++ -std=c++20 -fmodule-file=type_index.pcm type_index.pcm usage_sample.cpp //[any_module_example + +#ifdef BOOST_ANY_USE_STD_MODULE +import std; +#else +# include +# include +# include +#endif + import boost.any; -int main() { - boost::any a = 42; +namespace { + + template auto any_to_string(const boost::any& a) -> std::string { + std::ostringstream oss; + + auto try_cast = [&](auto* dummy) -> bool { + using T = std::decay_t; + if (a.type() == typeid(T)) { + oss << boost::any_cast(a); + return true; + } + return false; + }; + + // Expand over Ts... + bool const success = (try_cast((Ts*)nullptr) || ...); + + if (!success) { + oss << ""; + } + return oss.str(); + } + +} // namespace + +// Usage: +auto main() -> int { + boost::any const a = 42; +#ifdef BOOST_ANY_USE_STD_MODULE + std::println(stdout, "{}", any_to_string(a)); +#else + std::cout << any_to_string(a) << '\n'; +#endif } //] diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index a934b81..4ddb910 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -2,7 +2,7 @@ # Distributed under the Boost Software License, Version 1.0. # See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt -cmake_minimum_required(VERSION 3.5...4.0) +cmake_minimum_required(VERSION 3.21...4.2) project(any_subdir_test LANGUAGES CXX) @@ -24,8 +24,8 @@ add_subdirectory(../../ boostorg/any) enable_testing() -if (BOOST_USE_MODULES) - add_executable(boost_any_module_usage ../modules/usage_sample.cpp) +if(BOOST_USE_MODULES) + add_executable(boost_any_module_usage ../../modules/usage_sample.cpp) target_link_libraries(boost_any_module_usage PRIVATE Boost::any) add_test(NAME boost_any_module_usage COMMAND boost_any_module_usage) endif() @@ -47,10 +47,10 @@ list(APPEND RUN_TESTS_SOURCES # any_test.cpp # Ambiguous with modules, because all the anys now available ) -foreach (testsourcefile ${RUN_TESTS_SOURCES}) +foreach(testsourcefile ${RUN_TESTS_SOURCES}) get_filename_component(testname ${testsourcefile} NAME_WLE) add_executable(${PROJECT_NAME}_${testname} ../${testsourcefile}) - target_link_libraries(${PROJECT_NAME}_${testname} Boost::any) + target_link_libraries(${PROJECT_NAME}_${testname} Boost::any Boost::core) add_test(NAME ${PROJECT_NAME}_${testname} COMMAND ${PROJECT_NAME}_${testname}) endforeach()