Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build/
compile_commands.json
118 changes: 96 additions & 22 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,46 +1,120 @@
# -----------------------------------------------------------------------------
# Boost.Any CMake
# Handles: no modules, modules, modules + import std;
# -----------------------------------------------------------------------------
# Copyright 2019 Mike Dev
# 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.8...3.31 )
project( boost_any VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX )
cmake_minimum_required(VERSION 3.21...4.2)

project(boost_any VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)

if(PROJECT_IS_TOP_LEVEL)
find_package(Boost 1.90.0 CONFIG)
endif()

# -----------------------------------------------------------------------------
# User option: enable C++ modules
# -----------------------------------------------------------------------------
option(BOOST_USE_MODULES "Build Boost using C++ modules" OFF)

# -----------------------------------------------------------------------------
# Determine target type and sources
# -----------------------------------------------------------------------------
if(BOOST_USE_MODULES)

# Ensure CMAKE_CXX_STANDARD is set for module detection
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20)
endif()

if (BOOST_USE_MODULES)
add_library(boost_any)
target_sources(boost_any PUBLIC
FILE_SET modules_public
TYPE CXX_MODULES
FILES 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)
# Require C++20 for modules
target_compile_features(boost_any PUBLIC cxx_std_${CMAKE_CXX_STANDARD})

# Define macro indicating modules usage
target_compile_definitions(boost_any PUBLIC BOOST_USE_MODULES)
set(__boost_cxx_standard ${CMAKE_CXX_STANDARD})
if (NOT __boost_cxx_standard)
set(__boost_cxx_standard 20)
endif()
if (CMAKE_CXX_COMPILER_IMPORT_STD AND ${__boost_cxx_standard} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
target_compile_definitions(boost_any PRIVATE BOOST_ANY_USE_STD_MODULE)
message(STATUS "Using `import std;`")

# Check if import std; is available for the current standard
if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD)
target_compile_definitions(boost_any PUBLIC BOOST_ANY_USE_STD_MODULE)
set_property(TARGET boost_any CXX_MODULE_STD ON)
message(STATUS "Boost.Any: Using `import std;`")
else()
message(STATUS "`import std;` is not available")
message(WARNING "Boost.Any: `import std;` is not available for C++${CMAKE_CXX_STANDARD}")
endif()

set(__scope PUBLIC)

else()

# Modules disabled -> INTERFACE library
add_library(boost_any INTERFACE)

# If modules are disabled, require C++17 for headers
target_compile_features(boost_any INTERFACE cxx_std_17)

# Verify interface headers only at top level
if(PROJECT_IS_TOP_LEVEL)
set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ON)
endif()

set(__scope INTERFACE)

endif()

target_include_directories(boost_any ${__scope} include)
target_link_libraries( boost_any
${__scope}
# -----------------------------------------------------------------------------
# Include headers
# -----------------------------------------------------------------------------
if(BOOST_USE_MODULES)
target_sources(
boost_any
PUBLIC
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
)
else()
target_include_directories(boost_any ${__scope} include)
endif()

# -----------------------------------------------------------------------------
# Link dependencies
# -----------------------------------------------------------------------------
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 )
# Alias for convenient import
add_library(Boost::any ALIAS boost_any)

# -----------------------------------------------------------------------------
# Testing
# -----------------------------------------------------------------------------
if(BUILD_TESTING)
add_subdirectory(test)
endif()
3 changes: 3 additions & 0 deletions include/boost/any/fwd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
#ifdef BOOST_HAS_PRAGMA_ONCE
# pragma once
#endif

#include <type_traits>

#endif // #ifndef BOOST_ANY_INTERFACE_UNIT

/// \file boost/any/fwd.hpp
Expand Down
6 changes: 4 additions & 2 deletions modules/boost_any.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ module;
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/throw_exception.hpp>
#include <boost/type_index.hpp>

#include <memory> // for std::addressof

import boost.type_index;

#ifdef BOOST_ANY_USE_STD_MODULE
import std;
#else
#include <memory>
#include <stdexcept>
#include <typeinfo>
#include <type_traits>
Expand Down
44 changes: 42 additions & 2 deletions modules/usage_sample.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <iostream>
# include <sstream>
# include <string>
#endif

import boost.any;

int main() {
boost::any a = 42;
namespace {

template <typename... Ts> auto any_to_string(const boost::any& a) -> std::string {
std::ostringstream oss;

auto try_cast = [&](auto* dummy) -> bool {
using T = std::decay_t<decltype(*dummy)>;
if (a.type() == typeid(T)) {
oss << boost::any_cast<T>(a);
return true;
}
return false;
};

// Expand over Ts...
bool const success = (try_cast((Ts*)nullptr) || ...);

if (!success) {
oss << "<unknown type: " << a.type().name() << ">";
}
return oss.str();
}

} // namespace

// Usage:
auto main() -> int {
boost::any const a = 42;
#ifdef BOOST_ANY_USE_STD_MODULE
std::println("{}", any_to_string<int, double, std::string>(a));
#else
std::cout << any_to_string<int, double, std::string>(a) << '\n';
#endif
}
//]

58 changes: 36 additions & 22 deletions test/cmake_subdir_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
# 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)
project(boost_any LANGUAGES CXX VERSION 1.90.0)

add_subdirectory(../../../assert boostorg/assert)
add_subdirectory(../../../core boostorg/core)
Expand All @@ -19,35 +19,49 @@ add_subdirectory(../../../throw_exception boostorg/throw_exception)
add_subdirectory(../../../type_index boostorg/type_index)
add_subdirectory(../../../type_traits boostorg/type_traits)

# ../../CMakeLists.txt
add_subdirectory(../../ boostorg/any)

include(cmake/boost-install-library.cmake)
boost_install_library(boost_config TARGETS boost_config)
boost_install_library(boost_assert TARGETS boost_assert)
boost_install_library(boost_mp11 TARGETS boost_mp11 DEPENDENCIES Boost::core)
boost_install_library(boost_describe TARGETS boost_describe DEPENDENCIES Boost::mp11)
boost_install_library(boost_container_hash TARGETS boost_container_hash DEPENDENCIES Boost::describe)
boost_install_library(boost_throw_exception TARGETS boost_throw_exception DEPENDENCIES Boost::assert)
boost_install_library(boost_type_index TARGETS boost_type_index DEPENDENCIES Boost::boost_container_hash)
boost_install_library(boost_any TARGETS boost_any DEPENDENCIES Boost::type_index Boost::config Boost::throw_exception)

enable_testing()

if (BOOST_USE_MODULES)
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)
else()
set(RUN_TESTS_SOURCES
any_test_mplif.cpp
any_test_rv.cpp
basic_any_test.cpp
basic_any_test_large_object.cpp
basic_any_test_mplif.cpp
basic_any_test_rv.cpp
basic_any_test_small_object.cpp
unique_any/base.cpp
unique_any/emplace.cpp
unique_any/from_any.cpp
unique_any/move.cpp
# any_test.cpp # Ambiguous with modules, because all the anys now available
)
endif()

list(APPEND RUN_TESTS_SOURCES
any_test_mplif.cpp
basic_any_test_small_object.cpp
any_test_rv.cpp
basic_any_test.cpp

unique_any/from_any.cpp
unique_any/move.cpp
unique_any/emplace.cpp
unique_any/base.cpp

basic_any_test_mplif.cpp
basic_any_test_rv.cpp
basic_any_test_large_object.cpp
# any_test.cpp # Ambiguous with modules, because all the anys now available
)

foreach (testsourcefile ${RUN_TESTS_SOURCES})
get_filename_component(testname ${testsourcefile} NAME_WLE)
foreach(testsourcefile ${RUN_TESTS_SOURCES})
if(NOT EXISTS ../${testsourcefile})
message(WARNING "Missing ../${testsourcefile}")
continue()
endif()

get_filename_component(testname ../${testsourcefile} NAME_WLE)
add_executable(${PROJECT_NAME}_${testname} ../${testsourcefile})
target_link_libraries(${PROJECT_NAME}_${testname} Boost::any Boost::core)
add_test(NAME ${PROJECT_NAME}_${testname} COMMAND ${PROJECT_NAME}_${testname})
Expand Down
Loading