diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 887526d..822fed9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -111,7 +111,7 @@ jobs: - name: Install run: | set -x - cmake --install .build --config RelWithDebInfo --component beman_optional26_development --verbose + cmake --install .build --config RelWithDebInfo --component beman_optional_development --verbose - name: CMake Gcov Build if: matrix.config.coverage run: | diff --git a/CITATION.cff b/CITATION.cff index 35c1d17..bd89450 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,4 +1,4 @@ cff-version: 1.0.0 message: "If you use this software, please cite it as below." -title: "beman.optional26" -url: "https://github.com/bemanproject/optional26" +title: "beman.optional" +url: "https://github.com/bemanproject/optional" diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b4897d..d0cd921 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.27) -project(beman_optional26 VERSION 0.0.0 LANGUAGES CXX) +project(beman_optional VERSION 0.0.0 LANGUAGES CXX) # Includes include(CTest) @@ -13,13 +13,13 @@ include(FetchContent) set(TARGETS_EXPORT_NAME ${CMAKE_PROJECT_NAME}Targets) option( - OPTIONAL26_ENABLE_TESTING + OPTIONAL_ENABLE_TESTING "Enable building tests and test infrastructure" ${PROJECT_IS_TOP_LEVEL} ) -# Build the tests if enabled via the option OPTIONAL26_ENABLE_TESTING -if(OPTIONAL26_ENABLE_TESTING) +# Build the tests if enabled via the option OPTIONAL_ENABLE_TESTING +if(OPTIONAL_ENABLE_TESTING) # Fetch GoogleTest FetchContent_Declare( googletest @@ -33,29 +33,26 @@ endif() set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ON) -# Create the library target and named header set for beman_optional26 -add_library(beman_optional26 INTERFACE) +# Create the library target and named header set for beman_optional +add_library(beman_optional INTERFACE) target_sources( - beman_optional26 - PUBLIC FILE_SET beman_optional26_headers TYPE HEADERS BASE_DIRS include + beman_optional + PUBLIC FILE_SET beman_optional_headers TYPE HEADERS BASE_DIRS include ) -if(OPTIONAL26_ENABLE_TESTING) - # Create the library target and named header set for testing beman_optional26 +if(OPTIONAL_ENABLE_TESTING) + # Create the library target and named header set for testing beman_optional # and mark the set private - add_executable(beman_optional26_test) + add_executable(beman_optional_test) target_sources( - beman_optional26_test - PRIVATE - FILE_SET beman_optional26_test_headers - TYPE HEADERS - BASE_DIRS src + beman_optional_test + PRIVATE FILE_SET beman_optional_test_headers TYPE HEADERS BASE_DIRS src ) - add_subdirectory(src/beman/optional26/tests) + add_subdirectory(src/beman/optional/tests) endif() -add_subdirectory(include/beman/optional26) +add_subdirectory(include/beman/optional) add_subdirectory(examples) @@ -65,17 +62,17 @@ include(CMakePackageConfigHelpers) set(cmakeModulesDir cmake/beman) configure_package_config_file( cmake/Config.cmake.in - BemanOptional26Config.cmake - INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/ + BemanOptionalConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional/ PATH_VARS cmakeModulesDir NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO ) install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/BemanOptional26Config.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/ - COMPONENT beman_optional26_development + FILES ${CMAKE_CURRENT_BINARY_DIR}/BemanOptionalConfig.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional/ + COMPONENT beman_optional_development ) # Coverage diff --git a/Makefile b/Makefile index c98ab60..55fc1de 100755 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ compile: $(_build_path)/CMakeCache.txt ## Compile the project cmake --build $(_build_path) --config $(CONFIG) --target all -- -k 0 install: $(_build_path)/CMakeCache.txt compile ## Install the project - cmake --install $(_build_path) --config $(CONFIG) --component beman_optional26_development --verbose + cmake --install $(_build_path) --config $(CONFIG) --component beman_optional_development --verbose ctest: $(_build_path)/CMakeCache.txt ## Run CTest on current build cd $(_build_path) && ctest --output-on-failure -C $(CONFIG) diff --git a/README.md b/README.md index 4456bb3..a8f41a5 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -# beman.optional26: C++26 Extensions for std::optional +# beman.optional: C++26 Extensions for std::optional - ![CI Tests](https://github.com/bemanproject/optional26/actions/workflows/ci.yml/badge.svg) [![Coverage](https://coveralls.io/repos/github/bemanproject/optional26/badge.svg?branch=main)](https://coveralls.io/github/bemanproject/optional26?branch=main) + ![CI Tests](https://github.com/bemanproject/optional/actions/workflows/ci.yml/badge.svg) [![Coverage](https://coveralls.io/repos/github/bemanproject/optional/badge.svg?branch=main)](https://coveralls.io/github/bemanproject/optional?branch=main) -This repository implements `std::optional` extensions targeting C++26. The `beman.optional26` library aims to evaluate +This repository implements `std::optional` extensions targeting C++26. The `beman.optional` library aims to evaluate the stability, the usability, and the performance of these proposed changes before they are officially adopted by WG21 into the C++ Working Draft. Additionally, it allows developers to use these new features before they are implemented in major standard library compilers. @@ -44,18 +44,18 @@ Full runable examples can be found in `examples/` - please check [./examples/REA The next code snippet shows optional range support added in [Give *std::optional* Range Support(P3168R2)](https://wg21.link/P3168R2): ```cpp -#include +#include ... // Example from P3168R2: basic range loop over C++26 optional. -beman::optional26::optional empty_opt{}; +beman::optional::optional empty_opt{}; for ([[maybe_unused]] const auto& i : empty_opt) { // Should not see this in console. std::cout << "\"for each loop\" over C++26 optional: empty_opt\n"; } -beman::optional26::optional opt{26}; +beman::optional::optional opt{26}; for (const auto& i : opt) { // Should see this in console. std::cout << "\"for each loop\" over C++26 optional: opt = " << i << "\n"; @@ -71,13 +71,13 @@ The next code snippet shows optional reference support added in [`std::optional< (P2988R5)](https://wg21.link/P2988R5): ```cpp -#include +#include ... { // Empty optional example. std::optional std_empty_opt; - beman::optional26::optional beman_empty_opt; + beman::optional::optional beman_empty_opt; assert(!std_empty_opt.has_value() && !beman_empty_opt.has_value()); // or assert(!std_empty_opt && !beman_empty_opt); std::cout << "std_vs_beman: .has_value() matches?: " @@ -87,7 +87,7 @@ The next code snippet shows optional reference support added in [`std::optional< { // Optional with value example. std::optional std_opt = 26; - beman::optional26::optional beman_opt = 26; + beman::optional::optional beman_opt = 26; assert(std_opt.has_value() && beman_opt.has_value()); // or assert(std_opt && beman_opt); assert(std_opt.value() == beman_opt.value()); // or assert(*std_opt == *beman_opt); std::cout << "std_vs_beman: .value() matches?: " << (std_opt.value() == beman_opt.value() ? "yes" : "no") @@ -135,7 +135,7 @@ Full set of supported toolchains can be found in [.github/workflows/ci.yml](.git #### Preset CMake Flows This project strives to be as normal and simple a CMake project as possible. This build workflow in particular will -work, producing a static `beman_optional26` library, ready to package: +work, producing a static `beman_optional` library, ready to package: ```shell # List available preset configurations: @@ -185,14 +185,14 @@ This should build and run the tests with GCC 14 with the address and undefined b CI current build and test flows: ```shell -# Configure build: default build production code + tests (OPTIONAL26_ENABLE_TESTING=ON by default). +# Configure build: default build production code + tests (OPTIONAL_ENABLE_TESTING=ON by default). $ cmake -G "Ninja Multi-Config" \ -DCMAKE_CONFIGURATION_TYPES="RelWithDebInfo;Asan" \ -DCMAKE_TOOLCHAIN_FILE=etc/clang-19-toolchain.cmake \ -B .build -S . -- The CXX compiler identification is Clang 19.0.0 ... --- Build files have been written to: /path/to/optional26/.build +-- Build files have been written to: /path/to/optional/.build # Build. $ cmake --build .build --config Asan --target all -- -k 0 @@ -201,8 +201,8 @@ $ cmake --build .build --config Asan --target all -- -k 0 # Run tests. $ ctest --build-config Asan --output-on-failure --test-dir .build -Internal ctest changing into directory: /path/to/optional26/.build -Test project /path/to/optional26/.build +Internal ctest changing into directory: /path/to/optional/.build +Test project /path/to/optional/.build ... 100% tests passed, 0 tests failed out of 82 @@ -211,18 +211,18 @@ Total Test time (real) = 0.67 sec ##### Build Production, but Skip Tests -By default, we build and run tests. You can provide `-DOPTIONAL26_ENABLE_TESTING=OFF` and completely disable building tests: +By default, we build and run tests. You can provide `-DOPTIONAL_ENABLE_TESTING=OFF` and completely disable building tests: ```shell -# Configure build: build production code, skip tests (OPTIONAL26_ENABLE_TESTING=OFF). +# Configure build: build production code, skip tests (OPTIONAL_ENABLE_TESTING=OFF). $ cmake -G "Ninja Multi-Config" \ -DCMAKE_CONFIGURATION_TYPES="RelWithDebInfo;Asan" \ -DCMAKE_TOOLCHAIN_FILE=etc/clang-19-toolchain.cmake \ - -DOPTIONAL26_ENABLE_TESTING=OFF \ + -DOPTIONAL_ENABLE_TESTING=OFF \ -B .build -S . -- The CXX compiler identification is Clang 19.0.0 ... --- Build files have been written to: /path/to/optional26/.build +-- Build files have been written to: /path/to/optional/.build # Build. $ cmake --build .build --config Asan --target all -- -k 0 @@ -231,8 +231,8 @@ $ cmake --build .build --config Asan --target all -- -k 0 # Check that tests are not built/installed. $ ctest --build-config Asan --output-on-failure --test-dir .build -Internal ctest changing into directory: /path/to/beman.optional26/.build -Test project /path/to/beman.optional26/.build +Internal ctest changing into directory: /path/to/beman.optional/.build +Test project /path/to/beman.optional/.build No tests were found!!! ``` diff --git a/cmake/gcovr.cfg.in b/cmake/gcovr.cfg.in index 6b2523d..91403c7 100644 --- a/cmake/gcovr.cfg.in +++ b/cmake/gcovr.cfg.in @@ -7,7 +7,7 @@ gcov-parallel = yes html-theme = github.dark-blue html-self-contained = yes print-summary = yes -filter = .*/beman/optional26/.* +filter = .*/beman/optional/.* exclude = .*\.t\.cpp coveralls = coverage.json coveralls-pretty = yes diff --git a/docs/debug-ci.md b/docs/debug-ci.md index 0e92566..2d35cee 100644 --- a/docs/debug-ci.md +++ b/docs/debug-ci.md @@ -23,7 +23,7 @@ Stage Job ID Job name Workflow name Workflow file Events 0 build ${{ matrix.config.name }} CI Tests ci.yml pull_request,push # Run all CI jobs -optional26 $ sudo act -P ubuntu-24.04=ghcr.io/catthehacker/ubuntu:full-24.04 --container-architecture linux/amd64 push +optional $ sudo act -P ubuntu-24.04=ghcr.io/catthehacker/ubuntu:full-24.04 --container-architecture linux/amd64 push [CI Tests/Ubuntu Clang 18-2] 🚀 Start image=ghcr.io/catthehacker/ubuntu:full-24.04 [CI Tests/Ubuntu Clang 19-3] 🚀 Start image=ghcr.io/catthehacker/ubuntu:full-24.04 [CI Tests/Ubuntu Clang 17-1] 🚀 Start image=ghcr.io/catthehacker/ubuntu:full-24.04 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b94bbab..7932246 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # cmake-format: on -set(BEMAN_OPTIONAL26_LIBRARY "beman_optional26") +set(BEMAN_OPTIONAL_LIBRARY "beman_optional") include(GNUInstallDirs) @@ -25,14 +25,14 @@ foreach(example ${EXAMPLES}) target_sources(${example} PRIVATE ${example}.cpp) # Link example with the library. - target_link_libraries(${example} "${BEMAN_OPTIONAL26_LIBRARY}") + target_link_libraries(${example} "${BEMAN_OPTIONAL_LIBRARY}") # Install . install( TARGETS ${example} COMPONENT - beman_optional26_examples + beman_optional_examples DESTINATION ${CMAKE_INSTALL_BINDIR} ) diff --git a/examples/README.md b/examples/README.md index 4e50462..56e00ea 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,14 +1,14 @@ -# Examples for beman.optional26 +# Examples for beman.optional -List of usage examples for `beman.optional26`. +List of usage examples for `beman.optional`. ## Samples -Check basic `beman.optional26` library usages: +Check basic `beman.optional` library usages: * local [./sample.cpp](./sample.cpp) or [sample.cpp@Compiler Explorer](https://godbolt.org/z/47vGje65x) * local [./std_vs_beman.cpp](./std_vs_beman.cpp) or [std_vs_beman.cpp@Compiler Explorer](https://godbolt.org/z/ds5MvfGe6) diff --git a/examples/concept_checks.cpp b/examples/concept_checks.cpp index 45025f7..2a12e03 100644 --- a/examples/concept_checks.cpp +++ b/examples/concept_checks.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include -#include +#include #include @@ -85,13 +85,13 @@ int main() { } { - // beman::optional26::optional meets range concepts. - test_concepts_enabled(beman::optional26::optional{}); - test_concepts_enabled(beman::optional26::optional{}); - test_concepts_enabled(beman::optional26::optional{}); - test_concepts_enabled(beman::optional26::optional{}); - test_concepts_enabled(beman::optional26::optional{}); - test_concepts_enabled(beman::optional26::optional{}); + // beman::optional::optional meets range concepts. + test_concepts_enabled(beman::optional::optional{}); + test_concepts_enabled(beman::optional::optional{}); + test_concepts_enabled(beman::optional::optional{}); + test_concepts_enabled(beman::optional::optional{}); + test_concepts_enabled(beman::optional::optional{}); + test_concepts_enabled(beman::optional::optional{}); } return 0; diff --git a/examples/optional_ref.cpp b/examples/optional_ref.cpp index 03aba83..4cb4966 100644 --- a/examples/optional_ref.cpp +++ b/examples/optional_ref.cpp @@ -1,7 +1,7 @@ // examples/optional_ref.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include +#include #include @@ -33,12 +33,12 @@ namespace std26 { // After C++26 with P2988R5, the code would look like this. // Using directly optional to represent optional references. -beman::optional26::optional find_cat(std::string) { return {}; } +beman::optional::optional find_cat(std::string) { return {}; } -beman::optional26::optional do_it(Cat& cat) { return {cat}; } +beman::optional::optional do_it(Cat& cat) { return {cat}; } -beman::optional26::optional api() { - beman::optional26::optional cat = find_cat("Fido"); +beman::optional::optional api() { + beman::optional::optional cat = find_cat("Fido"); return cat.and_then(do_it); } @@ -46,8 +46,8 @@ beman::optional26::optional api() { int main() { // Example from P2988R5: optional reference. - [[maybe_unused]] Cat* old_cat = std17::api(); - [[maybe_unused]] beman::optional26::optional new_cat = std26::api(); + [[maybe_unused]] Cat* old_cat = std17::api(); + [[maybe_unused]] beman::optional::optional new_cat = std26::api(); return 0; } diff --git a/examples/pythagorean_triples.cpp b/examples/pythagorean_triples.cpp index e3b00aa..c5f4c6a 100644 --- a/examples/pythagorean_triples.cpp +++ b/examples/pythagorean_triples.cpp @@ -1,7 +1,7 @@ // examples/pythagorean_triples.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include +#include #include #include @@ -12,8 +12,8 @@ int main() { // Example from P3168R2: generate an infinite sequence of Pythagorean triples. // (x, y, z) is a Pythagorean triple if 1 <= x <= y <= z and x^2 + y^2 = z^2. - constexpr auto yield_if = [](bool b, T x) -> beman::optional26::optional { - return b ? beman::optional26::optional{std::move(x)} : beman::optional26::nullopt; + constexpr auto yield_if = [](bool b, T x) -> beman::optional::optional { + return b ? beman::optional::optional{std::move(x)} : beman::optional::nullopt; }; constexpr auto and_then = [](T&& r, auto fun) { return decltype(r)(r) | std::views::transform(std::move(fun)) | std::views::join; diff --git a/examples/range_loop.cpp b/examples/range_loop.cpp index c7dcc4e..96185e9 100644 --- a/examples/range_loop.cpp +++ b/examples/range_loop.cpp @@ -1,19 +1,19 @@ // examples/range_loop.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include +#include #include int main() { // Example from P3168R2: basic range loop over C++26 optional. - beman::optional26::optional empty_opt{}; + beman::optional::optional empty_opt{}; for ([[maybe_unused]] const auto& i : empty_opt) { // Should not see this in console. std::cout << "\"for each loop\" over C++26 optional: empty_opt\n"; } - beman::optional26::optional opt{26}; + beman::optional::optional opt{26}; for (const auto& i : opt) { // Should see this in console. std::cout << "\"for each loop\" over C++26 optional: opt = " << i << "\n"; diff --git a/examples/sample.cpp b/examples/sample.cpp index e57ab8f..14536f7 100644 --- a/examples/sample.cpp +++ b/examples/sample.cpp @@ -1,16 +1,16 @@ // examples/sample.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include +#include #include int main() { - beman::optional26::optional empty_opt{}; + beman::optional::optional empty_opt{}; if (!empty_opt) { std::cout << "empty_opt is empty!\n"; } - beman::optional26::optional opt{26}; + beman::optional::optional opt{26}; if (opt) { std::cout << "opt = " << *opt << "\n"; } diff --git a/examples/std_vs_beman.cpp b/examples/std_vs_beman.cpp index 69fab96..729d4fe 100644 --- a/examples/std_vs_beman.cpp +++ b/examples/std_vs_beman.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #include -#include +#include #include #include @@ -10,8 +10,8 @@ int main() { { // Empty optional example. - std::optional std_empty_opt; - beman::optional26::optional beman_empty_opt; + std::optional std_empty_opt; + beman::optional::optional beman_empty_opt; assert(!std_empty_opt.has_value() && !beman_empty_opt.has_value()); // or assert(!std_empty_opt && !beman_empty_opt); std::cout << "std_vs_beman: .has_value() matches?: " @@ -20,8 +20,8 @@ int main() { { // Optional with value example. - std::optional std_opt = 26; - beman::optional26::optional beman_opt = 26; + std::optional std_opt = 26; + beman::optional::optional beman_opt = 26; assert(std_opt.has_value() && beman_opt.has_value()); // or assert(std_opt && beman_opt); assert(std_opt.value() == beman_opt.value()); // or assert(*std_opt == *beman_opt); std::cout << "std_vs_beman: .value() matches?: " << (std_opt.value() == beman_opt.value() ? "yes" : "no") @@ -29,7 +29,7 @@ int main() { } // Note: std_empty_opt == beman_empty_opt and std_opt == beman_opt won't compile - // (no implementation of operator== for std::optional and beman::optional26::optional). + // (no implementation of operator== for std::optional and beman::optional::optional). return 0; } diff --git a/include/beman/optional/CMakeLists.txt b/include/beman/optional/CMakeLists.txt new file mode 100644 index 0000000..57c7021 --- /dev/null +++ b/include/beman/optional/CMakeLists.txt @@ -0,0 +1,41 @@ +# include/beman/optional/CMakeLists.txt -*-cmake-*- +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +target_sources( + beman_optional + PUBLIC + FILE_SET beman_optional_headers + TYPE HEADERS + FILES + optional.hpp + detail/iterator.hpp + detail/stl_interfaces/config.hpp + detail/stl_interfaces/fwd.hpp + detail/stl_interfaces/iterator_interface.hpp +) + +install( + TARGETS beman_optional + FILE_SET beman_optional_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT beman_optional_development +) + +install( + TARGETS beman_optional + EXPORT beman_optional_export + DESTINATION + ${CMAKE_INSTALL_LIBDIR} + FILE_SET beman_optional_headers + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + COMPONENT beman_optional_development +) + +install( + EXPORT beman_optional_export + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional/ + NAMESPACE Beman::Optional:: + FILE beman_optional.cmake + EXPORT_LINK_INTERFACE_LIBRARIES + COMPONENT beman_optional_development +) diff --git a/include/beman/optional26/detail/iterator.hpp b/include/beman/optional/detail/iterator.hpp similarity index 84% rename from include/beman/optional26/detail/iterator.hpp rename to include/beman/optional/detail/iterator.hpp index 3683bc9..c7a99f7 100644 --- a/include/beman/optional26/detail/iterator.hpp +++ b/include/beman/optional/detail/iterator.hpp @@ -1,15 +1,15 @@ -// include/beman/optional26/detail/iterator.hpp -*-C++-*- +// include/beman/optional/detail/iterator.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#ifndef BEMAN_OPTIONAL26_DETAIL_ITERATOR_HPP -#define BEMAN_OPTIONAL26_DETAIL_ITERATOR_HPP +#ifndef BEMAN_OPTIONAL_DETAIL_ITERATOR_HPP +#define BEMAN_OPTIONAL_DETAIL_ITERATOR_HPP -#include +#include #include #include -namespace beman::optional26::detail { +namespace beman::optional::detail { // Forward declaration. template @@ -19,7 +19,7 @@ struct contiguous_iterator; // Current implementation based on P2727R4: std::iterator_interface. template using base_contiguous_iterator = stl_interfaces::iterator_interface< -#if !BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS +#if !BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS contiguous_iterator, // Required for P2727R4 to work with C++20/C++23. TODO: Do more experiments. #endif std::contiguous_iterator_tag, @@ -62,6 +62,6 @@ struct contiguous_iterator : public base_contiguous_iterator { T* m_current; }; -} // namespace beman::optional26::detail +} // namespace beman::optional::detail -#endif // BEMAN_OPTIONAL26_DETAIL_ITERATOR_HPP +#endif // BEMAN_OPTIONAL_DETAIL_ITERATOR_HPP diff --git a/include/beman/optional/detail/stl_interfaces/config.hpp b/include/beman/optional/detail/stl_interfaces/config.hpp new file mode 100644 index 0000000..994b933 --- /dev/null +++ b/include/beman/optional/detail/stl_interfaces/config.hpp @@ -0,0 +1,49 @@ +// include/beman/optional/detail/stl_interfaces/config.hpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +// Copyright (C) 2020 T. Zachary Laine +// +// 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) +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_CONFIG_HPP +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_CONFIG_HPP + +// Included for definition of __cpp_lib_concepts. +#include + +#if defined(__cpp_lib_concepts) && defined(__cpp_lib_ranges) && \ + !defined(BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DISABLE_CONCEPTS) +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS 1 +#else +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS 0 +#endif + +#if defined(__cpp_explicit_this_parameter) && BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS && \ + !defined(BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DISABLE_DEDUCED_THIS) +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS 1 +#else +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS 0 +#endif + +// The inline namespaces v1, v2, and v3 represent C++14, C++20, and C++23 and +// later, respectively. v1 is inline for standards before C++20, and v2 is +// inline for C++20 and later. Note that this only applies to code for which +// multiple vI namespace alternatives exist. For example, some instances of +// the v1 namespace may still be inline, if there is no v2 version of its +// contents. +#if !BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS && !BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V1 inline namespace v1 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V2 namespace v2 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V3 namespace v3 +#elif BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS && !BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V1 namespace v1 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V2 inline namespace v2 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V3 namespace v3 +#else +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V1 namespace v1 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V2 namespace v2 +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V3 inline namespace v3 +#endif + +#endif diff --git a/include/beman/optional26/detail/stl_interfaces/fwd.hpp b/include/beman/optional/detail/stl_interfaces/fwd.hpp similarity index 72% rename from include/beman/optional26/detail/stl_interfaces/fwd.hpp rename to include/beman/optional/detail/stl_interfaces/fwd.hpp index ceb7a1e..536ac8a 100644 --- a/include/beman/optional26/detail/stl_interfaces/fwd.hpp +++ b/include/beman/optional/detail/stl_interfaces/fwd.hpp @@ -1,4 +1,4 @@ -// include/beman/optional26/detail/stl_interfaces/fwd.hpp -*-C++-*- +// include/beman/optional/detail/stl_interfaces/fwd.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // Copyright (C) 2019 T. Zachary Laine @@ -6,36 +6,36 @@ // 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) -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_FWD_HPP -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_FWD_HPP +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_FWD_HPP +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_FWD_HPP -#include +#include -#if BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS +#if BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS #include #endif #if defined(__cpp_lib_three_way_comparison) #include #endif -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN #if defined(_MSC_VER) || defined(__GNUC__) && __GNUC__ < 8 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NO_HIDDEN_FRIEND_CONSTEXPR -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NO_HIDDEN_FRIEND_CONSTEXPR +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR #else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR constexpr +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR constexpr #endif #if defined(__GNUC__) && __GNUC__ < 9 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_CONCEPT concept bool +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_CONCEPT concept bool #else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_CONCEPT concept +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_CONCEPT concept #endif #endif -namespace beman::optional26::detail { +namespace beman::optional::detail { namespace stl_interfaces { /** An enumeration used to indicate whether the underlying data have a @@ -43,7 +43,7 @@ namespace stl_interfaces { and `sequence_container_interface`. */ enum class element_layout : bool { discontiguous = false, contiguous = true }; -BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { +BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V1 { namespace v1_dtl { template @@ -83,6 +83,6 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { } // namespace v1_dtl } } // namespace stl_interfaces -} // namespace beman::optional26::detail +} // namespace beman::optional::detail #endif diff --git a/include/beman/optional26/detail/stl_interfaces/iterator_interface.hpp b/include/beman/optional/detail/stl_interfaces/iterator_interface.hpp similarity index 93% rename from include/beman/optional26/detail/stl_interfaces/iterator_interface.hpp rename to include/beman/optional/detail/stl_interfaces/iterator_interface.hpp index a0d97bd..5d439d2 100644 --- a/include/beman/optional26/detail/stl_interfaces/iterator_interface.hpp +++ b/include/beman/optional/detail/stl_interfaces/iterator_interface.hpp @@ -1,4 +1,4 @@ -// include/beman/optional26/detail/stl_interfaces/iterator_interface.hpp -*-C++-*- +// include/beman/optional/detail/stl_interfaces/iterator_interface.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // Copyright (C) 2019 T. Zachary Laine @@ -6,10 +6,10 @@ // 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) -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_ITERATOR_INTERFACE_HPP -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_ITERATOR_INTERFACE_HPP +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_ITERATOR_INTERFACE_HPP +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_ITERATOR_INTERFACE_HPP -#include +#include #include #include @@ -17,13 +17,13 @@ #include #endif -namespace beman::optional26::detail { +namespace beman::optional::detail { namespace stl_interfaces { /** A type for granting access to the private members of an iterator derived from `iterator_interface`. */ struct access { -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN template static constexpr auto base(D& d) noexcept -> decltype(d.base_reference()) { @@ -44,7 +44,7 @@ struct access { this template implies a copy or move of the underlying object of type `T`. */ template -#if defined(BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS +#if defined(BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS // clang-format off requires std::is_object_v #endif @@ -127,11 +127,11 @@ common_diff(T lhs, U rhs) noexcept(noexcept(static_cast>(lhs) - s } // namespace detail } // namespace stl_interfaces -} // namespace beman::optional26::detail +} // namespace beman::optional::detail -namespace beman::optional26::detail { +namespace beman::optional::detail { namespace stl_interfaces { -BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { +BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V1 { /** A CRTP template that one may derive from to make defining iterators easier. @@ -147,7 +147,7 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { typename Reference = ValueType&, typename Pointer = ValueType*, typename DifferenceType = std::ptrdiff_t -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN , typename E = std::enable_if_t::value && std::is_same>::value> @@ -187,13 +187,13 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { typename Reference, typename Pointer, typename DifferenceType -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN , typename E #endif > struct iterator_interface { -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifndef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN private: constexpr Derived& derived() noexcept { return static_cast(*this); } constexpr const Derived& derived() const noexcept { return static_cast(*this); } @@ -279,8 +279,8 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { retval += i; return retval; } - friend BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR Derived operator+(difference_type i, - Derived it) noexcept { + friend BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR Derived operator+(difference_type i, + Derived it) noexcept { return it + i; } @@ -320,7 +320,7 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { return access::base(derived()) - access::base(other); } - friend BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR Derived + friend BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_HIDDEN_FRIEND_CONSTEXPR Derived operator-(Derived it, difference_type i) noexcept { Derived retval = it; retval += -i; @@ -416,13 +416,13 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 { DifferenceType>; } } // namespace stl_interfaces -} // namespace beman::optional26::detail +} // namespace beman::optional::detail -#if defined(BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS +#if defined(BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS -namespace beman::optional26::detail { +namespace beman::optional::detail { namespace stl_interfaces { -BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V2 { +BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V2 { namespace v2_dtl { template @@ -739,15 +739,15 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V2 { DifferenceType>; } } // namespace stl_interfaces -} // namespace beman::optional26::detail +} // namespace beman::optional::detail #endif -#if defined(BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS +#if defined(BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN) || BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS -namespace beman::optional26::detail { +namespace beman::optional::detail { namespace stl_interfaces { -BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V3 { +BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_NAMESPACE_V3 { // clang-format off @@ -928,58 +928,58 @@ BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V3 { iterator_interface, DifferenceType>; } } // namespace stl_interfaces -} // namespace beman::optional26::detail +} // namespace beman::optional::detail #endif -#ifdef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DOXYGEN +#ifdef BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_DOXYGEN /** `static_asserts` that type `type` models concept `concept_name`. This is useful for checking that an iterator, view, etc. that you write using one of the *`_interface` templates models the right C++ concept. - For example: `BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(my_iter, + For example: `BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(my_iter, std::input_iterator)`. \note This macro expands to nothing when `__cpp_lib_concepts` is not defined. */ -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(type, concept_name) +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(type, concept_name) /** `static_asserts` that the types of all typedefs in `std::iterator_traits` match the remaining macro parameters. This is useful for checking that an iterator you write using `iterator_interface` has the correct iterator traits. - For example: `BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(my_iter, + For example: `BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(my_iter, std::input_iterator_tag, std::input_iterator, int, int &, int *, std::ptrdiff_t)`. \note This macro ignores the `concept` parameter when `__cpp_lib_concepts` is not defined. */ -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS( \ +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS( \ iter, category, concept, value_type, reference, pointer, difference_type) #else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_CONCEPT_IMPL(type, concept_name) \ +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_CONCEPT_IMPL(type, concept_name) \ static_assert(concept_name, ""); -#if BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(iter, concept_name) \ - BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_CONCEPT_IMPL(iter, concept_name) +#if BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_USE_CONCEPTS +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(iter, concept_name) \ + BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_CONCEPT_IMPL(iter, concept_name) #else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(iter, concept_name) +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_CONCEPT(iter, concept_name) #endif -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS_IMPL( \ +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS_IMPL( \ iter, category, value_t, ref, ptr, diff_t) \ static_assert(std::is_same::value_type, value_t>::value, ""); \ static_assert(std::is_same::reference, ref>::value, ""); \ static_assert(std::is_same::pointer, ptr>::value, ""); \ static_assert(std::is_same::difference_type, diff_t>::value, ""); -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS( \ - iter, category, concept, value_type, reference, pointer, difference_type) \ - BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS_IMPL( \ +#define BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS( \ + iter, category, concept, value_type, reference, pointer, difference_type) \ + BEMAN_OPTIONAL_DETAIL_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS_IMPL( \ iter, category, value_type, reference, pointer, difference_type) #endif diff --git a/include/beman/optional26/optional.hpp b/include/beman/optional/optional.hpp similarity index 98% rename from include/beman/optional26/optional.hpp rename to include/beman/optional/optional.hpp index 4d433d8..665cf52 100644 --- a/include/beman/optional26/optional.hpp +++ b/include/beman/optional/optional.hpp @@ -1,8 +1,8 @@ -// include/beman/optional26/optional.hpp -*-C++-*- +// include/beman/optional/optional.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#ifndef BEMAN_OPTIONAL26_OPTIONAL_HPP -#define BEMAN_OPTIONAL26_OPTIONAL_HPP +#ifndef BEMAN_OPTIONAL_OPTIONAL_HPP +#define BEMAN_OPTIONAL_OPTIONAL_HPP #include #include @@ -14,9 +14,9 @@ #include #include -#include +#include -namespace beman::optional26 { +namespace beman::optional { namespace detail { template @@ -56,28 +56,28 @@ struct in_place_t { inline constexpr in_place_t in_place{}; -} // namespace beman::optional26 +} // namespace beman::optional -namespace beman::optional26 { +namespace beman::optional { template class optional; // partially freestanding -} // namespace beman::optional26 +} // namespace beman::optional // Since P3168R2: Give std::optional Range Support. template -inline constexpr bool std::ranges::enable_view> = true; +inline constexpr bool std::ranges::enable_view> = true; // Iterators for optional have life times that are not tied to the optional. template -inline constexpr bool std::ranges::enable_borrowed_range> = std::is_reference_v; +inline constexpr bool std::ranges::enable_borrowed_range> = std::is_reference_v; // Since P3168R2: Give std::optional Range Support. #if defined(__cpp_lib_format_ranges) template -inline constexpr auto std::format_kind> = range_format::disabled; +inline constexpr auto std::format_kind> = range_format::disabled; #endif -namespace beman::optional26 { +namespace beman::optional { template concept is_derived_from_optional = requires(const T& t) { // exposition only [](const optional&) {}(t); @@ -1432,17 +1432,16 @@ template constexpr void optional::reset() noexcept { value_ = nullptr; } -} // namespace beman::optional26 +} // namespace beman::optional namespace std { template requires requires(T a) { { std::hash>{}(a) } -> std::convertible_to; } -struct hash> { +struct hash> { static_assert(!is_reference_v, "hash is not enabled for reference types"); - size_t operator()(const beman::optional26::optional& o) const - noexcept(noexcept(hash>{}(*o))) { + size_t operator()(const beman::optional::optional& o) const noexcept(noexcept(hash>{}(*o))) { if (o) { return std::hash>{}(*o); } else { @@ -1452,4 +1451,4 @@ struct hash> { }; } // namespace std -#endif // BEMAN_OPTIONAL26_OPTIONAL_HPP +#endif // BEMAN_OPTIONAL_OPTIONAL_HPP diff --git a/include/beman/optional26/CMakeLists.txt b/include/beman/optional26/CMakeLists.txt deleted file mode 100644 index e43fc93..0000000 --- a/include/beman/optional26/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -# include/beman/optional26/CMakeLists.txt -*-cmake-*- -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -target_sources( - beman_optional26 - PUBLIC - FILE_SET beman_optional26_headers - TYPE HEADERS - FILES - optional.hpp - detail/iterator.hpp - detail/stl_interfaces/config.hpp - detail/stl_interfaces/fwd.hpp - detail/stl_interfaces/iterator_interface.hpp -) - -install( - TARGETS beman_optional26 - FILE_SET beman_optional26_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT beman_optional26_development -) - -install( - TARGETS beman_optional26 - EXPORT beman_optional26_export - DESTINATION - ${CMAKE_INSTALL_LIBDIR} - FILE_SET beman_optional26_headers - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - COMPONENT beman_optional26_development -) - -install( - EXPORT beman_optional26_export - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/beman/optional26/ - NAMESPACE Beman::Optional26:: - FILE beman_optional26.cmake - EXPORT_LINK_INTERFACE_LIBRARIES - COMPONENT beman_optional26_development -) diff --git a/include/beman/optional26/detail/stl_interfaces/config.hpp b/include/beman/optional26/detail/stl_interfaces/config.hpp deleted file mode 100644 index 68ad40c..0000000 --- a/include/beman/optional26/detail/stl_interfaces/config.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// include/beman/optional26/detail/stl_interfaces/config.hpp -*-C++-*- -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -// Copyright (C) 2020 T. Zachary Laine -// -// 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) -#ifndef BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_CONFIG_HPP -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_CONFIG_HPP - -// Included for definition of __cpp_lib_concepts. -#include - -#if defined(__cpp_lib_concepts) && defined(__cpp_lib_ranges) && \ - !defined(BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DISABLE_CONCEPTS) -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS 1 -#else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS 0 -#endif - -#if defined(__cpp_explicit_this_parameter) && BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS && \ - !defined(BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_DISABLE_DEDUCED_THIS) -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS 1 -#else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS 0 -#endif - -// The inline namespaces v1, v2, and v3 represent C++14, C++20, and C++23 and -// later, respectively. v1 is inline for standards before C++20, and v2 is -// inline for C++20 and later. Note that this only applies to code for which -// multiple vI namespace alternatives exist. For example, some instances of -// the v1 namespace may still be inline, if there is no v2 version of its -// contents. -#if !BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS && !BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 inline namespace v1 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V2 namespace v2 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V3 namespace v3 -#elif BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_CONCEPTS && !BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_USE_DEDUCED_THIS -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 namespace v1 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V2 inline namespace v2 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V3 namespace v3 -#else -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V1 namespace v1 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V2 namespace v2 -#define BEMAN_OPTIONAL26_DETAIL_STL_INTERFACES_NAMESPACE_V3 inline namespace v3 -#endif - -#endif diff --git a/src/beman/optional26/tests/CMakeLists.txt b/src/beman/optional/tests/CMakeLists.txt similarity index 75% rename from src/beman/optional26/tests/CMakeLists.txt rename to src/beman/optional/tests/CMakeLists.txt index 5a2c1ad..b3bf63e 100644 --- a/src/beman/optional26/tests/CMakeLists.txt +++ b/src/beman/optional/tests/CMakeLists.txt @@ -1,15 +1,15 @@ # cmake-format: off -# src/beman/optional26/tests/CMakeLists.txt -*-makefile-*- +# src/beman/optional/tests/CMakeLists.txt -*-makefile-*- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # cmake-format: on include(GoogleTest) # Tests -# add_executable(beman_optional26_test) +# add_executable(beman_optional_test) target_sources( - beman_optional26_test + beman_optional_test PRIVATE optional.t.cpp optional_constexpr.t.cpp @@ -20,16 +20,16 @@ target_sources( ) target_sources( - beman_optional26_test + beman_optional_test PRIVATE - FILE_SET beman_optional26_test_headers + FILE_SET beman_optional_test_headers TYPE HEADERS FILES test_types.hpp test_utilities.hpp ) target_link_libraries( - beman_optional26_test - PRIVATE beman_optional26 GTest::gtest GTest::gtest_main + beman_optional_test + PRIVATE beman_optional GTest::gtest GTest::gtest_main ) # Issue #32: Re-enable ASAN run CI/clang-19. @@ -37,11 +37,11 @@ target_link_libraries( # Note: clang-19 + gtest_discover_tests + Asan setup causes errors on some # platforms. Temporary switch to gtest_add_tests and skip some Asan checks. # Change also applied for CI flows. -gtest_add_tests(TARGET beman_optional26_test "" AUTO) +gtest_add_tests(TARGET beman_optional_test "" AUTO) add_library(constructor_fails test_constructor_fail.cpp) -target_link_libraries(constructor_fails PRIVATE beman_optional26) +target_link_libraries(constructor_fails PRIVATE beman_optional) set_target_properties( constructor_fails diff --git a/src/beman/optional26/tests/detail/iterator.t.cpp b/src/beman/optional/tests/detail/iterator.t.cpp similarity index 69% rename from src/beman/optional26/tests/detail/iterator.t.cpp rename to src/beman/optional/tests/detail/iterator.t.cpp index f511b13..190bdf0 100644 --- a/src/beman/optional26/tests/detail/iterator.t.cpp +++ b/src/beman/optional/tests/detail/iterator.t.cpp @@ -1,10 +1,10 @@ -// src/beman/optional26/tests/detail/iterator.t.cpp -*-C++-*- +// src/beman/optional/tests/detail/iterator.t.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception /** - * This file contains tests for beman::optional26::detail::contiguous_iterator. + * This file contains tests for beman::optional::detail::contiguous_iterator. */ -#include +#include #include #include @@ -23,14 +23,14 @@ } else \ EXPECT_EQ(val1, val2) -namespace beman::optional26::tests { +namespace beman::optional::tests { // Dummy containers helper. struct container {}; -} // namespace beman::optional26::tests +} // namespace beman::optional::tests -using namespace beman::optional26::tests; +using namespace beman::optional::tests; TEST(IteratorTest, IteratorConcepts) { const auto test = [](auto&& it) { @@ -47,24 +47,24 @@ TEST(IteratorTest, IteratorConcepts) { }; // non-const iterators - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); // const iterators - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); - test(beman::optional26::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); + test(beman::optional::detail::contiguous_iterator{}); } TEST(IteratorTest, DereferenceOperator) { auto lambda = [&] { std::vector v{10, 20, 30, 40, 50}; - auto it = beman::optional26::detail::contiguous_iterator{v.data()}; + auto it = beman::optional::detail::contiguous_iterator{v.data()}; CONSTEXPR_EXPECT_EQ(*it, 10); *it = 100; @@ -101,8 +101,8 @@ TEST(IteratorTest, ForwardIterator) { CONSTEXPR_EXPECT_EQ(*it, 50); }; - test(beman::optional26::detail::contiguous_iterator{v.data()}); - test(beman::optional26::detail::contiguous_iterator{cv.data()}); + test(beman::optional::detail::contiguous_iterator{v.data()}); + test(beman::optional::detail::contiguous_iterator{cv.data()}); }; static_assert((lambda(), true)); lambda(); @@ -124,8 +124,8 @@ TEST(IteratorTest, BidirectionalIterator) { CONSTEXPR_EXPECT_EQ(*it, 10); }; - test(beman::optional26::detail::contiguous_iterator{v.data()}); - test(beman::optional26::detail::contiguous_iterator{cv.data()}); + test(beman::optional::detail::contiguous_iterator{v.data()}); + test(beman::optional::detail::contiguous_iterator{cv.data()}); }; static_assert((lambda(), true)); lambda(); @@ -155,8 +155,8 @@ TEST(IteratorTest, RandomAccessIterator) { CONSTEXPR_EXPECT_EQ(*it, 30); }; - test(beman::optional26::detail::contiguous_iterator{v.data()}); - test(beman::optional26::detail::contiguous_iterator{cv.data()}); + test(beman::optional::detail::contiguous_iterator{v.data()}); + test(beman::optional::detail::contiguous_iterator{cv.data()}); }; static_assert((lambda(), true)); lambda(); @@ -169,8 +169,8 @@ TEST(IteratorTest, ContainerType) { using containter_type1 = typename std::remove_reference_t; using containter_type2 = typename std::remove_reference_t; - auto it1 = beman::optional26::detail::contiguous_iterator{}; - auto it2 = beman::optional26::detail::contiguous_iterator{}; + auto it1 = beman::optional::detail::contiguous_iterator{}; + auto it2 = beman::optional::detail::contiguous_iterator{}; static_assert(std::is_same_v); }; @@ -187,8 +187,8 @@ TEST(IteratorTest, ContainerType) { using pointer_type1 = typename containter_type1::pointer; using pointer_type2 = typename containter_type2::pointer; - auto it1 = beman::optional26::detail::contiguous_iterator{}; - auto it2 = beman::optional26::detail::contiguous_iterator{}; + auto it1 = beman::optional::detail::contiguous_iterator{}; + auto it2 = beman::optional::detail::contiguous_iterator{}; static_assert(!std::is_same_v); }; diff --git a/src/beman/optional26/tests/optional.t.cpp b/src/beman/optional/tests/optional.t.cpp similarity index 50% rename from src/beman/optional26/tests/optional.t.cpp rename to src/beman/optional/tests/optional.t.cpp index 1fdce09..e425345 100644 --- a/src/beman/optional26/tests/optional.t.cpp +++ b/src/beman/optional/tests/optional.t.cpp @@ -1,11 +1,11 @@ -// src/beman/optional26/tests/optional.t.cpp -*-C++-*- +// src/beman/optional/tests/optional.t.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include +#include -#include // test 2nd include OK +#include // test 2nd include OK -#include +#include #include #include @@ -16,130 +16,130 @@ #include TEST(OptionalTest, Constructors) { - beman::optional26::optional i1; - beman::optional26::optional i2{beman::optional26::nullopt}; + beman::optional::optional i1; + beman::optional::optional i2{beman::optional::nullopt}; std::ignore = i1; std::ignore = i2; - int i = 0; - beman::optional26::optional i3 = i; - std::ignore = i3; + int i = 0; + beman::optional::optional i3 = i; + std::ignore = i3; - using beman::optional26::tests::empty; + using beman::optional::tests::empty; - beman::optional26::optional e1; - beman::optional26::optional e2{beman::optional26::nullopt}; + beman::optional::optional e1; + beman::optional::optional e2{beman::optional::nullopt}; - empty e{}; - beman::optional26::optional e3 = e; - std::ignore = e1; - std::ignore = e2; - std::ignore = e3; + empty e{}; + beman::optional::optional e3 = e; + std::ignore = e1; + std::ignore = e2; + std::ignore = e3; } TEST(OptionalTest, Constructors2) { - beman::optional26::optional o1; + beman::optional::optional o1; EXPECT_TRUE(!o1); - beman::optional26::optional o2 = beman::optional26::nullopt; + beman::optional::optional o2 = beman::optional::nullopt; EXPECT_TRUE(!o2); - beman::optional26::optional o3 = 42; + beman::optional::optional o3 = 42; EXPECT_TRUE(*o3 == 42); - beman::optional26::optional o4 = o3; + beman::optional::optional o4 = o3; EXPECT_TRUE(*o4 == 42); - beman::optional26::optional o5 = o1; + beman::optional::optional o5 = o1; EXPECT_TRUE(!o5); - beman::optional26::optional o6 = std::move(o3); + beman::optional::optional o6 = std::move(o3); EXPECT_TRUE(*o6 == 42); - beman::optional26::optional o7 = 42; + beman::optional::optional o7 = 42; EXPECT_TRUE(*o7 == 42); - beman::optional26::optional o8 = o7; + beman::optional::optional o8 = o7; EXPECT_TRUE(*o8 == 42); - beman::optional26::optional o9 = std::move(o7); + beman::optional::optional o9 = std::move(o7); EXPECT_TRUE(*o9 == 42); { - beman::optional26::optional o; + beman::optional::optional o; EXPECT_TRUE(!o); - beman::optional26::optional oo = o; + beman::optional::optional oo = o; EXPECT_TRUE(!oo); } { - auto i = 42; - beman::optional26::optional o = i; + auto i = 42; + beman::optional::optional o = i; EXPECT_TRUE(o); EXPECT_TRUE(*o == 42); - beman::optional26::optional oo = o; + beman::optional::optional oo = o; EXPECT_TRUE(oo); EXPECT_TRUE(*oo == 42); } - using beman::optional26::tests::base; + using beman::optional::tests::base; std::vector v; v.emplace_back(); - beman::optional26::optional> ov = std::move(v); + beman::optional::optional> ov = std::move(v); EXPECT_TRUE(ov->size() == 1); } TEST(OptionalTest, Constructors3) { - beman::optional26::optional ie; - beman::optional26::optional i4 = ie; + beman::optional::optional ie; + beman::optional::optional i4 = ie; EXPECT_FALSE(i4); - using beman::optional26::tests::base; - using beman::optional26::tests::derived; + using beman::optional::tests::base; + using beman::optional::tests::derived; - base b{1}; - derived d(1, 2); - beman::optional26::optional b1{b}; - beman::optional26::optional b2{d}; + base b{1}; + derived d(1, 2); + beman::optional::optional b1{b}; + beman::optional::optional b2{d}; - beman::optional26::optional d2{d}; - beman::optional26::optional b3 = d2; - beman::optional26::optional b4{d2}; + beman::optional::optional d2{d}; + beman::optional::optional b3 = d2; + beman::optional::optional b4{d2}; } TEST(OptionalTest, NonDefaultConstruct) { - using beman::optional26::tests::int_ctor; + using beman::optional::tests::int_ctor; - int_ctor i = 7; - beman::optional26::optional v1{}; - beman::optional26::optional v2{i}; + int_ctor i = 7; + beman::optional::optional v1{}; + beman::optional::optional v2{i}; std::ignore = v1; std::ignore = v2; } TEST(OptionalTest, OptionalOfOptional) { - using O = beman::optional26::optional; - O o; - beman::optional26::optional oo1 = o; + using O = beman::optional::optional; + O o; + beman::optional::optional oo1 = o; EXPECT_TRUE(oo1.has_value()); oo1 = o; EXPECT_TRUE(oo1.has_value()); EXPECT_FALSE(oo1->has_value()); - beman::optional26::optional oo2 = std::move(o); + beman::optional::optional oo2 = std::move(o); EXPECT_TRUE(oo2.has_value()); oo2 = o; EXPECT_TRUE(oo2.has_value()); EXPECT_FALSE(oo2->has_value()); // emplace constructs the inner optional - oo2.emplace(beman::optional26::nullopt); + oo2.emplace(beman::optional::nullopt); EXPECT_TRUE(oo2.has_value()); EXPECT_FALSE(oo2->has_value()); - oo2.emplace(beman::optional26::in_place, 41); + oo2.emplace(beman::optional::in_place, 41); EXPECT_TRUE(oo2.has_value()); EXPECT_TRUE(oo2.value() == 41); oo2.emplace(42); @@ -154,11 +154,11 @@ TEST(OptionalTest, OptionalOfOptional) { } TEST(OptionalTest, AssignmentValue) { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; - beman::optional26::optional o3; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; + beman::optional::optional o3; - o1 = static_cast&>(o1); + o1 = static_cast&>(o1); EXPECT_TRUE(*o1 == 42); o1 = o2; @@ -170,13 +170,13 @@ TEST(OptionalTest, AssignmentValue) { o1 = 42; EXPECT_TRUE(*o1 == 42); - o1 = beman::optional26::nullopt; + o1 = beman::optional::nullopt; EXPECT_TRUE(!o1); o1 = std::move(o2); EXPECT_TRUE(*o1 == 12); - beman::optional26::optional o4 = 42; + beman::optional::optional o4 = 42; o1 = o4; EXPECT_TRUE(*o1 == 42); @@ -207,8 +207,8 @@ TEST(OptionalTest, AssignmentValue) { requires std::is_copy_constructible_v && std::is_copy_assignable_v && (!std::is_trivially_copy_assignable_v) */ - beman::optional26::optional o5{5}; - beman::optional26::optional o6; + beman::optional::optional o5{5}; + beman::optional::optional o6; // Copy into empty optional. o6 = o5; @@ -222,13 +222,13 @@ TEST(OptionalTest, AssignmentValue) { EXPECT_TRUE(o6->i_ == 5); // Copy into engaged optional. - beman::optional26::optional o7{7}; + beman::optional::optional o7{7}; o6 = o7; EXPECT_TRUE(o6); EXPECT_TRUE(o6->i_ == 7); // Move into engaged optional. - beman::optional26::optional o8{8}; + beman::optional::optional o8{8}; o6 = std::move(o8); EXPECT_TRUE(o6); EXPECT_TRUE(o6->i_ == 8); @@ -244,11 +244,11 @@ TEST(OptionalTest, AssignmentValue) { } TEST(OptionalTest, Triviality) { - EXPECT_TRUE(std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(std::is_trivially_move_constructible>::value); - EXPECT_TRUE(std::is_trivially_move_assignable>::value); - EXPECT_TRUE(std::is_trivially_destructible>::value); + EXPECT_TRUE(std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(std::is_trivially_move_constructible>::value); + EXPECT_TRUE(std::is_trivially_move_assignable>::value); + EXPECT_TRUE(std::is_trivially_destructible>::value); { struct T { @@ -258,11 +258,11 @@ TEST(OptionalTest, Triviality) { T& operator=(T&&) = default; ~T() = default; }; - EXPECT_TRUE(std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(std::is_trivially_move_constructible>::value); - EXPECT_TRUE(std::is_trivially_move_assignable>::value); - EXPECT_TRUE(std::is_trivially_destructible>::value); + EXPECT_TRUE(std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(std::is_trivially_move_constructible>::value); + EXPECT_TRUE(std::is_trivially_move_assignable>::value); + EXPECT_TRUE(std::is_trivially_destructible>::value); } { @@ -273,20 +273,20 @@ TEST(OptionalTest, Triviality) { T& operator=(T&&) { return *this; }; ~T() {} }; - EXPECT_TRUE(!std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(!std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(!std::is_trivially_move_constructible>::value); - EXPECT_TRUE(!std::is_trivially_move_assignable>::value); - EXPECT_TRUE(!std::is_trivially_destructible>::value); + EXPECT_TRUE(!std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(!std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(!std::is_trivially_move_constructible>::value); + EXPECT_TRUE(!std::is_trivially_move_assignable>::value); + EXPECT_TRUE(!std::is_trivially_destructible>::value); } } TEST(OptionalTest, Deletion) { - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); - EXPECT_TRUE(std::is_destructible>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_destructible>::value); { struct T { @@ -296,11 +296,11 @@ TEST(OptionalTest, Deletion) { T& operator=(T&&) = default; ~T() = default; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); - EXPECT_TRUE(std::is_destructible>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_destructible>::value); } { @@ -310,10 +310,10 @@ TEST(OptionalTest, Deletion) { T& operator=(const T&) = delete; T& operator=(T&&) = delete; }; - EXPECT_TRUE(!std::is_copy_constructible>::value); - EXPECT_TRUE(!std::is_copy_assignable>::value); - EXPECT_TRUE(!std::is_move_constructible>::value); - EXPECT_TRUE(!std::is_move_assignable>::value); + EXPECT_TRUE(!std::is_copy_constructible>::value); + EXPECT_TRUE(!std::is_copy_assignable>::value); + EXPECT_TRUE(!std::is_move_constructible>::value); + EXPECT_TRUE(!std::is_move_assignable>::value); } { @@ -323,10 +323,10 @@ TEST(OptionalTest, Deletion) { T& operator=(const T&) = delete; T& operator=(T&&) = default; }; - EXPECT_TRUE(!std::is_copy_constructible>::value); - EXPECT_TRUE(!std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(!std::is_copy_constructible>::value); + EXPECT_TRUE(!std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); } { @@ -336,8 +336,8 @@ TEST(OptionalTest, Deletion) { T& operator=(const T&) = default; T& operator=(T&&) = delete; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); } } @@ -349,27 +349,27 @@ struct takes_init_and_variadic { }; TEST(OptionalTest, InPlace) { - beman::optional26::optional o1{beman::optional26::in_place}; - beman::optional26::optional o2(beman::optional26::in_place); + beman::optional::optional o1{beman::optional::in_place}; + beman::optional::optional o2(beman::optional::in_place); EXPECT_TRUE(o1); EXPECT_TRUE(o1 == 0); EXPECT_TRUE(o2); EXPECT_TRUE(o2 == 0); - beman::optional26::optional o3(beman::optional26::in_place, 42); + beman::optional::optional o3(beman::optional::in_place, 42); EXPECT_TRUE(o3 == 42); - beman::optional26::optional> o4(beman::optional26::in_place, 0, 1); + beman::optional::optional> o4(beman::optional::in_place, 0, 1); EXPECT_TRUE(o4); EXPECT_TRUE(std::get<0>(*o4) == 0); EXPECT_TRUE(std::get<1>(*o4) == 1); - beman::optional26::optional> o5(beman::optional26::in_place, {0, 1}); + beman::optional::optional> o5(beman::optional::in_place, {0, 1}); EXPECT_TRUE(o5); EXPECT_TRUE((*o5)[0] == 0); EXPECT_TRUE((*o5)[1] == 1); - beman::optional26::optional o6(beman::optional26::in_place, {0, 1}, 2, 3); + beman::optional::optional o6(beman::optional::in_place, {0, 1}, 2, 3); EXPECT_TRUE(o6->v[0] == 0); EXPECT_TRUE(o6->v[1] == 1); EXPECT_TRUE(std::get<0>(o6->t) == 2); @@ -377,26 +377,26 @@ TEST(OptionalTest, InPlace) { } TEST(OptionalTest, MakeOptional) { - auto o1 = beman::optional26::make_optional(42); - auto o2 = beman::optional26::optional(42); + auto o1 = beman::optional::make_optional(42); + auto o2 = beman::optional::optional(42); - constexpr bool is_same = std::is_same>::value; + constexpr bool is_same = std::is_same>::value; EXPECT_TRUE(is_same); EXPECT_TRUE(o1 == o2); - auto o3 = beman::optional26::make_optional>(0, 1, 2, 3); + auto o3 = beman::optional::make_optional>(0, 1, 2, 3); EXPECT_TRUE(std::get<0>(*o3) == 0); EXPECT_TRUE(std::get<1>(*o3) == 1); EXPECT_TRUE(std::get<2>(*o3) == 2); EXPECT_TRUE(std::get<3>(*o3) == 3); - auto o4 = beman::optional26::make_optional>({0, 1, 2, 3}); + auto o4 = beman::optional::make_optional>({0, 1, 2, 3}); EXPECT_TRUE(o4.value()[0] == 0); EXPECT_TRUE(o4.value()[1] == 1); EXPECT_TRUE(o4.value()[2] == 2); EXPECT_TRUE(o4.value()[3] == 3); - auto o5 = beman::optional26::make_optional({0, 1}, 2, 3); + auto o5 = beman::optional::make_optional({0, 1}, 2, 3); EXPECT_TRUE(o5->v[0] == 0); EXPECT_TRUE(o5->v[1] == 1); EXPECT_TRUE(std::get<0>(o5->t) == 2); @@ -404,17 +404,17 @@ TEST(OptionalTest, MakeOptional) { } TEST(OptionalTest, Nullopt) { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2{beman::optional26::nullopt}; - beman::optional26::optional o3(beman::optional26::nullopt); - beman::optional26::optional o4 = {beman::optional26::nullopt}; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2{beman::optional::nullopt}; + beman::optional::optional o3(beman::optional::nullopt); + beman::optional::optional o4 = {beman::optional::nullopt}; EXPECT_TRUE(!o1); EXPECT_TRUE(!o2); EXPECT_TRUE(!o3); EXPECT_TRUE(!o4); - EXPECT_TRUE(!std::is_default_constructible::value); + EXPECT_TRUE(!std::is_default_constructible::value); } struct move_detector { @@ -424,9 +424,9 @@ struct move_detector { }; TEST(OptionalTest, Observers) { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2; - const beman::optional26::optional o3 = 42; + beman::optional::optional o1 = 42; + beman::optional::optional o2; + const beman::optional::optional o3 = 42; EXPECT_TRUE(*o1 == 42); EXPECT_TRUE(*o1 == o1.value()); @@ -439,16 +439,16 @@ TEST(OptionalTest, Observers) { success = std::is_same::value; EXPECT_TRUE(success); - beman::optional26::optional o4{beman::optional26::in_place}; - move_detector o5 = std::move(o4).value(); + beman::optional::optional o4{beman::optional::in_place}; + move_detector o5 = std::move(o4).value(); EXPECT_TRUE(o4->been_moved); EXPECT_TRUE(!o5.been_moved); } TEST(OptionalTest, RelationalOps) { - beman::optional26::optional o1{4}; - beman::optional26::optional o2{42}; - beman::optional26::optional o3{}; + beman::optional::optional o1{4}; + beman::optional::optional o2{42}; + beman::optional::optional o3{}; // SECTION("self simple") { @@ -467,31 +467,31 @@ TEST(OptionalTest, RelationalOps) { } // SECTION("nullopt simple") { - EXPECT_TRUE(!(o1 == beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt == o1)); - EXPECT_TRUE(o1 != beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt != o1); - EXPECT_TRUE(!(o1 < beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt < o1); - EXPECT_TRUE(o1 > beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt > o1)); - EXPECT_TRUE(!(o1 <= beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt <= o1); - EXPECT_TRUE(o1 >= beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt >= o1)); - - EXPECT_TRUE(o3 == beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt == o3); - EXPECT_TRUE(!(o3 != beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt != o3)); - EXPECT_TRUE(!(o3 < beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt < o3)); - EXPECT_TRUE(!(o3 > beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt > o3)); - EXPECT_TRUE(o3 <= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt <= o3); - EXPECT_TRUE(o3 >= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt >= o3); + EXPECT_TRUE(!(o1 == beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt == o1)); + EXPECT_TRUE(o1 != beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt != o1); + EXPECT_TRUE(!(o1 < beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt < o1); + EXPECT_TRUE(o1 > beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt > o1)); + EXPECT_TRUE(!(o1 <= beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt <= o1); + EXPECT_TRUE(o1 >= beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt >= o1)); + + EXPECT_TRUE(o3 == beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt == o3); + EXPECT_TRUE(!(o3 != beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt != o3)); + EXPECT_TRUE(!(o3 < beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt < o3)); + EXPECT_TRUE(!(o3 > beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt > o3)); + EXPECT_TRUE(o3 <= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt <= o3); + EXPECT_TRUE(o3 >= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt >= o3); } // SECTION("with T simple") { @@ -521,8 +521,8 @@ TEST(OptionalTest, RelationalOps) { EXPECT_TRUE(o1 >= 4); EXPECT_TRUE(4 >= o1); } - beman::optional26::optional o4{"hello"}; - beman::optional26::optional o5{"xyz"}; + beman::optional::optional o4{"hello"}; + beman::optional::optional o5{"xyz"}; // SECTION("self complex") { @@ -541,31 +541,31 @@ TEST(OptionalTest, RelationalOps) { } // SECTION("nullopt complex") { - EXPECT_TRUE(!(o4 == beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt == o4)); - EXPECT_TRUE(o4 != beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt != o4); - EXPECT_TRUE(!(o4 < beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt < o4); - EXPECT_TRUE(o4 > beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt > o4)); - EXPECT_TRUE(!(o4 <= beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt <= o4); - EXPECT_TRUE(o4 >= beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt >= o4)); - - EXPECT_TRUE(o3 == beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt == o3); - EXPECT_TRUE(!(o3 != beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt != o3)); - EXPECT_TRUE(!(o3 < beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt < o3)); - EXPECT_TRUE(!(o3 > beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt > o3)); - EXPECT_TRUE(o3 <= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt <= o3); - EXPECT_TRUE(o3 >= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt >= o3); + EXPECT_TRUE(!(o4 == beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt == o4)); + EXPECT_TRUE(o4 != beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt != o4); + EXPECT_TRUE(!(o4 < beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt < o4); + EXPECT_TRUE(o4 > beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt > o4)); + EXPECT_TRUE(!(o4 <= beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt <= o4); + EXPECT_TRUE(o4 >= beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt >= o4)); + + EXPECT_TRUE(o3 == beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt == o3); + EXPECT_TRUE(!(o3 != beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt != o3)); + EXPECT_TRUE(!(o3 < beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt < o3)); + EXPECT_TRUE(!(o3 > beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt > o3)); + EXPECT_TRUE(o3 <= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt <= o3); + EXPECT_TRUE(o3 >= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt >= o3); } // SECTION("with T complex") @@ -599,31 +599,31 @@ TEST(OptionalTest, RelationalOps) { } TEST(OptionalTest, SwapValue) { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; o1.swap(o2); EXPECT_EQ(o1.value(), 12); EXPECT_EQ(o2.value(), 42); } TEST(OptionalTest, SwapWNull) { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = beman::optional26::nullopt; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = beman::optional::nullopt; o1.swap(o2); EXPECT_TRUE(!o1.has_value()); EXPECT_EQ(o2.value(), 42); } TEST(OptionalTest, SwapNullIntializedWithValue) { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = 42; o1.swap(o2); EXPECT_EQ(o1.value(), 42); EXPECT_TRUE(!o2.has_value()); } TEST(OptionalTest, Emplace) { - beman::optional26::optional, std::pair>> i; + beman::optional::optional, std::pair>> i; i.emplace(std::piecewise_construct, std::make_tuple(0, 2), std::make_tuple(3, 4)); EXPECT_TRUE(i->first.first == 0); EXPECT_TRUE(i->first.second == 2); @@ -636,13 +636,13 @@ struct A { }; TEST(OptionalTest, EmplaceWithExceptionThrown) { - beman::optional26::optional a; + beman::optional::optional a; EXPECT_ANY_THROW(a.emplace()); } TEST(OptionalTest, RangeTest) { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = 42; EXPECT_EQ(*o2, 42); for (auto k : o1) { std::ignore = k; @@ -660,52 +660,52 @@ TEST(OptionalTest, RangeConstructors) { std::ignore = s2; std::ignore = s3; - beman::optional26::optional> n; - beman::optional26::optional> n2{n}; - beman::optional26::optional> n3{std::optional{}}; + beman::optional::optional> n; + beman::optional::optional> n2{n}; + beman::optional::optional> n3{std::optional{}}; std::ignore = n2; std::ignore = n3; } TEST(OptionalTest, ConceptCheckRef) { - static_assert(std::ranges::range>); - static_assert(std::ranges::view>); - static_assert(std::ranges::input_range>); - static_assert(std::ranges::forward_range>); - static_assert(std::ranges::bidirectional_range>); - static_assert(std::ranges::contiguous_range>); - static_assert(std::ranges::common_range>); - static_assert(std::ranges::viewable_range>); - static_assert(std::ranges::borrowed_range>); - static_assert(std::ranges::random_access_range>); - - static_assert(std::ranges::range>); - static_assert(std::ranges::view>); - static_assert(std::ranges::input_range>); - static_assert(std::ranges::forward_range>); - static_assert(std::ranges::bidirectional_range>); - static_assert(std::ranges::contiguous_range>); - static_assert(std::ranges::common_range>); - static_assert(std::ranges::viewable_range>); - static_assert(std::ranges::borrowed_range>); - static_assert(std::ranges::random_access_range>); + static_assert(std::ranges::range>); + static_assert(std::ranges::view>); + static_assert(std::ranges::input_range>); + static_assert(std::ranges::forward_range>); + static_assert(std::ranges::bidirectional_range>); + static_assert(std::ranges::contiguous_range>); + static_assert(std::ranges::common_range>); + static_assert(std::ranges::viewable_range>); + static_assert(std::ranges::borrowed_range>); + static_assert(std::ranges::random_access_range>); + + static_assert(std::ranges::range>); + static_assert(std::ranges::view>); + static_assert(std::ranges::input_range>); + static_assert(std::ranges::forward_range>); + static_assert(std::ranges::bidirectional_range>); + static_assert(std::ranges::contiguous_range>); + static_assert(std::ranges::common_range>); + static_assert(std::ranges::viewable_range>); + static_assert(std::ranges::borrowed_range>); + static_assert(std::ranges::random_access_range>); using ref = std::reference_wrapper&; - static_assert(std::ranges::range>); - static_assert(std::ranges::view>); - static_assert(std::ranges::input_range>); - static_assert(std::ranges::forward_range>); - static_assert(std::ranges::bidirectional_range>); - static_assert(std::ranges::contiguous_range>); - static_assert(std::ranges::common_range>); - static_assert(std::ranges::viewable_range>); - static_assert(std::ranges::borrowed_range>); - static_assert(std::ranges::random_access_range>); + static_assert(std::ranges::range>); + static_assert(std::ranges::view>); + static_assert(std::ranges::input_range>); + static_assert(std::ranges::forward_range>); + static_assert(std::ranges::bidirectional_range>); + static_assert(std::ranges::contiguous_range>); + static_assert(std::ranges::common_range>); + static_assert(std::ranges::viewable_range>); + static_assert(std::ranges::borrowed_range>); + static_assert(std::ranges::random_access_range>); } TEST(OptionalTest, BreathingTest) { - beman::optional26::optional m; - beman::optional26::optional m1{1}; + beman::optional::optional m; + beman::optional::optional m1{1}; m = m1; ASSERT_EQ(*std::begin(m), 1); @@ -713,38 +713,38 @@ TEST(OptionalTest, BreathingTest) { m = {}; ASSERT_FALSE(m); - beman::optional26::optional d0{0}; + beman::optional::optional d0{0}; - beman::optional26::optional d1{1}; + beman::optional::optional d1{1}; d0 = d1; ASSERT_EQ(*std::begin(d0), 1.0); } TEST(OptionalTest, BreathingTestRef) { - beman::optional26::optional m; + beman::optional::optional m; - int one = 1; - beman::optional26::optional m1{one}; + int one = 1; + beman::optional::optional m1{one}; m = m1; ASSERT_EQ(*std::begin(m), 1); - double zero = 0.0; - beman::optional26::optional d0{zero}; + double zero = 0.0; + beman::optional::optional d0{zero}; - double one_d = 1.0; - beman::optional26::optional d1{one_d}; + double one_d = 1.0; + beman::optional::optional d1{one_d}; d0 = d1; ASSERT_EQ(*std::begin(d0), 1.0); } TEST(OptionalTest, CompTest) { - beman::optional26::optional m; - beman::optional26::optional m0{0}; - beman::optional26::optional m1{1}; - beman::optional26::optional m1a{1}; + beman::optional::optional m; + beman::optional::optional m0{0}; + beman::optional::optional m1{1}; + beman::optional::optional m1a{1}; ASSERT_EQ(m, m); ASSERT_EQ(m0, m0); @@ -761,13 +761,13 @@ TEST(OptionalTest, CompTest) { } TEST(OptionalTest, CompTestRef) { - beman::optional26::optional m; - int zero = 0; - int one = 1; - int one_a = 1; - beman::optional26::optional m0{zero}; - beman::optional26::optional m1{one}; - beman::optional26::optional m1a{one_a}; + beman::optional::optional m; + int zero = 0; + int one = 1; + int one_a = 1; + beman::optional::optional m0{zero}; + beman::optional::optional m1{one}; + beman::optional::optional m1a{one_a}; ASSERT_EQ(m, m); ASSERT_EQ(m0, m0); @@ -797,7 +797,7 @@ inline constexpr auto and_then = [](auto&& r, auto fun) { // "yield_if" takes a bool and a value and // returns a view of zero or one elements. inline constexpr auto yield_if = [](bool b, T x) { - return b ? beman::optional26::optional{std::move(x)} : beman::optional26::nullopt; + return b ? beman::optional::optional{std::move(x)} : beman::optional::nullopt; }; TEST(OptionalTest, PythTripleTest) { @@ -815,10 +815,10 @@ TEST(OptionalTest, PythTripleTest) { using namespace beman; TEST(OptionalTest, ValueBase) { - int i = 7; - beman::optional26::optional v1{}; + int i = 7; + beman::optional::optional v1{}; - beman::optional26::optional v2{i}; + beman::optional::optional v2{i}; for (auto i : v1) ASSERT_TRUE(i != i); // tautology so i is used and not warned @@ -829,27 +829,27 @@ TEST(OptionalTest, ValueBase) { TEST(OptionalTest, RefWrapper) { int i = 7; - beman::optional26::optional v2{std::ref(i)}; + beman::optional::optional v2{std::ref(i)}; for (auto i : v2) ASSERT_EQ(i, 7); } TEST(OptionalTest, ValueNonDefaultConstruct) { - using beman::optional26::tests::int_ctor; - int_ctor i = 7; - beman::optional26::optional v1{}; - beman::optional26::optional v2{i}; + using beman::optional::tests::int_ctor; + int_ctor i = 7; + beman::optional::optional v1{}; + beman::optional::optional v2{i}; std::ignore = v1; std::ignore = v2; } TEST(OptionalTest, RefBase) { - int i = 7; - beman::optional26::optional v1{}; + int i = 7; + beman::optional::optional v1{}; // ASSERT_TRUE(v1.size() == 0); - beman::optional26::optional v2{i}; + beman::optional::optional v2{i}; // ASSERT_TRUE(v2.size() == 1); for (auto i : v1) ASSERT_TRUE(i != i); // tautology so i is used and not warned @@ -870,7 +870,7 @@ TEST(OptionalTest, RefBase) { int s = 4; - for (auto&& i : beman::optional26::optional(s)) { + for (auto&& i : beman::optional::optional(s)) { ASSERT_EQ(i, 4); i = 9; ASSERT_EQ(i, 9); @@ -879,58 +879,58 @@ TEST(OptionalTest, RefBase) { } TEST(OptionalTest, HashTest) { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = beman::optional26::nullopt; - beman::optional26::optional o3 = 42; - beman::optional26::optional o4 = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = beman::optional::nullopt; + beman::optional::optional o3 = 42; + beman::optional::optional o4 = 42; - auto h1 = std::hash>{}(o1); - auto h2 = std::hash>{}(o2); - auto h3 = std::hash>{}(o3); - auto h4 = std::hash>{}(o4); + auto h1 = std::hash>{}(o1); + auto h2 = std::hash>{}(o2); + auto h3 = std::hash>{}(o3); + auto h4 = std::hash>{}(o4); EXPECT_EQ(h1, h2); EXPECT_EQ(h3, h4); EXPECT_NE(h1, h3); for (int i : std::views::iota(0, 1000)) { - auto h1 = std::hash>{}(i); + auto h1 = std::hash>{}(i); auto h2 = std::hash{}(i); EXPECT_EQ(h1, h2); } } TEST(OptionalTest, CanHoldValueOfImmovableType) { - using beman::optional26::tests::immovable; + using beman::optional::tests::immovable; - beman::optional26::optional o1(beman::optional26::in_place); + beman::optional::optional o1(beman::optional::in_place); EXPECT_TRUE(o1); // ...and can reset it with `nullopt`. - static_assert(noexcept(o1 = beman::optional26::nullopt)); - o1 = beman::optional26::nullopt; + static_assert(noexcept(o1 = beman::optional::nullopt)); + o1 = beman::optional::nullopt; EXPECT_FALSE(o1); // Also, can construct with `nullopt`. - beman::optional26::optional o2 = beman::optional26::nullopt; + beman::optional::optional o2 = beman::optional::nullopt; EXPECT_FALSE(o2); } // Moving an `optional` should not move the remote value. TEST(OptionalTest, OptionalFromOptionalRef) { - using beman::optional26::tests::copyable_from_non_const_lvalue_only; + using beman::optional::tests::copyable_from_non_const_lvalue_only; copyable_from_non_const_lvalue_only cm; - beman::optional26::optional o1 = cm; + beman::optional::optional o1 = cm; ASSERT_TRUE(o1); { - beman::optional26::optional o2 = o1; + beman::optional::optional o2 = o1; ASSERT_TRUE(o2); } - beman::optional26::optional o2 = std::move(o1); + beman::optional::optional o2 = std::move(o1); ASSERT_TRUE(o2); o2 = o1; @@ -949,33 +949,33 @@ TEST(OptionalTest, OptionalFromOptionalRef) { } TEST(OptionalTest, OptionalFromOptionalRefExplicit) { - using beman::optional26::tests::copyable_from_non_const_lvalue_only; - using beman::optional26::tests::explicitly_convertible_from_non_const_lvalue_only; + using beman::optional::tests::copyable_from_non_const_lvalue_only; + using beman::optional::tests::explicitly_convertible_from_non_const_lvalue_only; explicitly_convertible_from_non_const_lvalue_only ec; - beman::optional26::optional o3 = ec; + beman::optional::optional o3 = ec; - beman::optional26::optional o4(o3); + beman::optional::optional o4(o3); ASSERT_TRUE(o4); - beman::optional26::optional o5(std::move(o3)); + beman::optional::optional o5(std::move(o3)); ASSERT_TRUE(o5); } TEST(OptionalTest, OptionalFromOptionalConstRef) { - using beman::optional26::tests::copyable_from_const_lvalue_only; + using beman::optional::tests::copyable_from_const_lvalue_only; copyable_from_const_lvalue_only cm; - beman::optional26::optional o1 = cm; + beman::optional::optional o1 = cm; ASSERT_TRUE(o1); { - beman::optional26::optional o2 = o1; + beman::optional::optional o2 = o1; ASSERT_TRUE(o2); } - beman::optional26::optional o2 = std::move(o1); + beman::optional::optional o2 = std::move(o1); ASSERT_TRUE(o2); o2 = o1; @@ -994,25 +994,25 @@ TEST(OptionalTest, OptionalFromOptionalConstRef) { } TEST(OptionalTest, OptionalFromOptionalConstRefExplicit) { - using beman::optional26::tests::copyable_from_const_lvalue_only; - using beman::optional26::tests::explicitly_convertible_from_const_lvalue_only; + using beman::optional::tests::copyable_from_const_lvalue_only; + using beman::optional::tests::explicitly_convertible_from_const_lvalue_only; explicitly_convertible_from_const_lvalue_only ec; - beman::optional26::optional o3 = ec; + beman::optional::optional o3 = ec; - beman::optional26::optional o4(o3); + beman::optional::optional o4(o3); ASSERT_TRUE(o4); - beman::optional26::optional o5(std::move(o3)); + beman::optional::optional o5(std::move(o3)); ASSERT_TRUE(o5); } TEST(OptionalTest, OptionalOfAnyWorks) { - beman::optional26::optional o1 = 42; + beman::optional::optional o1 = 42; - beman::optional26::optional o2 = o1; + beman::optional::optional o2 = o1; EXPECT_TRUE(std::any_cast(*o2) == 42); - beman::optional26::optional o3 = std::move(o1); + beman::optional::optional o3 = std::move(o1); EXPECT_TRUE(std::any_cast(*o3) == 42); } diff --git a/src/beman/optional26/tests/optional_constexpr.t.cpp b/src/beman/optional/tests/optional_constexpr.t.cpp similarity index 61% rename from src/beman/optional26/tests/optional_constexpr.t.cpp rename to src/beman/optional/tests/optional_constexpr.t.cpp index f6afd1a..c6c797b 100644 --- a/src/beman/optional26/tests/optional_constexpr.t.cpp +++ b/src/beman/optional/tests/optional_constexpr.t.cpp @@ -1,9 +1,9 @@ -// src/beman/optional26/tests/optional_constexpr.t.cpp -*-C++-*- +// src/beman/optional/tests/optional_constexpr.t.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include -#include -#include +#include +#include +#include #include #include @@ -12,90 +12,90 @@ #include TEST(OptionalConstexprTest, Constructors) { - constexpr beman::optional26::optional i1; - constexpr beman::optional26::optional i2{beman::optional26::nullopt}; + constexpr beman::optional::optional i1; + constexpr beman::optional::optional i2{beman::optional::nullopt}; std::ignore = i1; std::ignore = i2; - constexpr int i = 0; - constexpr beman::optional26::optional i3 = i; - std::ignore = i3; + constexpr int i = 0; + constexpr beman::optional::optional i3 = i; + std::ignore = i3; - constexpr beman::optional26::optional e1; - constexpr beman::optional26::optional e2{beman::optional26::nullopt}; + constexpr beman::optional::optional e1; + constexpr beman::optional::optional e2{beman::optional::nullopt}; - constexpr beman::optional26::tests::empty e{}; - constexpr beman::optional26::optional e3 = e; - std::ignore = e1; - std::ignore = e2; - std::ignore = e; - std::ignore = e3; + constexpr beman::optional::tests::empty e{}; + constexpr beman::optional::optional e3 = e; + std::ignore = e1; + std::ignore = e2; + std::ignore = e; + std::ignore = e3; } TEST(OptionalConstexprTest, Constructors2) { - constexpr beman::optional26::optional o1; + constexpr beman::optional::optional o1; EXPECT_TRUE(!o1); - constexpr beman::optional26::optional o2 = beman::optional26::nullopt; + constexpr beman::optional::optional o2 = beman::optional::nullopt; EXPECT_TRUE(!o2); - constexpr beman::optional26::optional o3 = 42; + constexpr beman::optional::optional o3 = 42; EXPECT_TRUE(*o3 == 42); - constexpr beman::optional26::optional o4 = o3; + constexpr beman::optional::optional o4 = o3; EXPECT_TRUE(*o4 == 42); - constexpr beman::optional26::optional o5 = o1; + constexpr beman::optional::optional o5 = o1; EXPECT_TRUE(!o5); - constexpr beman::optional26::optional o6 = std::move(o3); + constexpr beman::optional::optional o6 = std::move(o3); EXPECT_TRUE(*o6 == 42); - constexpr beman::optional26::optional o7 = 42; + constexpr beman::optional::optional o7 = 42; EXPECT_TRUE(*o7 == 42); - constexpr beman::optional26::optional o8 = o7; + constexpr beman::optional::optional o8 = o7; EXPECT_TRUE(*o8 == 42); - constexpr beman::optional26::optional o9 = std::move(o7); + constexpr beman::optional::optional o9 = std::move(o7); EXPECT_TRUE(*o9 == 42); { - constexpr beman::optional26::optional o; + constexpr beman::optional::optional o; EXPECT_TRUE(!o); - constexpr beman::optional26::optional oo = o; + constexpr beman::optional::optional oo = o; EXPECT_TRUE(!oo); } { - static constexpr auto i = 42; - constexpr beman::optional26::optional o = i; + static constexpr auto i = 42; + constexpr beman::optional::optional o = i; EXPECT_TRUE(o); EXPECT_TRUE(*o == 42); - constexpr beman::optional26::optional oo = o; + constexpr beman::optional::optional oo = o; EXPECT_TRUE(oo); EXPECT_TRUE(*oo == 42); } } TEST(OptionalConstexprTest, Constructors3) { - constexpr beman::optional26::optional ie; - constexpr beman::optional26::optional i4 = ie; + constexpr beman::optional::optional ie; + constexpr beman::optional::optional i4 = ie; EXPECT_FALSE(i4); - using beman::optional26::tests::base; - using beman::optional26::tests::derived; + using beman::optional::tests::base; + using beman::optional::tests::derived; - constexpr base b{1}; - constexpr derived d(1, 2); - constexpr beman::optional26::optional b1{b}; - constexpr beman::optional26::optional b2{d}; + constexpr base b{1}; + constexpr derived d(1, 2); + constexpr beman::optional::optional b1{b}; + constexpr beman::optional::optional b2{d}; - constexpr beman::optional26::optional d2{d}; - constexpr beman::optional26::optional b3 = d2; - constexpr beman::optional26::optional b4{d2}; + constexpr beman::optional::optional d2{d}; + constexpr beman::optional::optional b3 = d2; + constexpr beman::optional::optional b4{d2}; std::ignore = b1; std::ignore = b2; std::ignore = b3; @@ -114,20 +114,20 @@ class NoDefault { } // namespace TEST(OptionalConstexprTest, NonDefaultConstruct) { - constexpr NoDefault i = 7; - constexpr beman::optional26::optional v1{}; - constexpr beman::optional26::optional v2{i}; + constexpr NoDefault i = 7; + constexpr beman::optional::optional v1{}; + constexpr beman::optional::optional v2{i}; std::ignore = v1; std::ignore = v2; } consteval bool testConstexprAssignmentValue() { - bool retval = true; - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; - beman::optional26::optional o3; + bool retval = true; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; + beman::optional::optional o3; - o1 = static_cast&>(o1); + o1 = static_cast&>(o1); retval &= (*o1 == 42); o1 = o2; @@ -139,13 +139,13 @@ consteval bool testConstexprAssignmentValue() { o1 = 42; retval &= (*o1 == 42); - o1 = beman::optional26::nullopt; + o1 = beman::optional::nullopt; retval &= (!o1); o1 = std::move(o2); retval &= (*o1 == 12); - beman::optional26::optional o4 = 42; + beman::optional::optional o4 = 42; o1 = o4; retval &= (*o1 == 42); @@ -176,8 +176,8 @@ consteval bool testConstexprAssignmentValue() { requires std::is_copy_constructible_v && std::is_copy_assignable_v && (!std::is_trivially_copy_assignable_v) */ - beman::optional26::optional o5{5}; - beman::optional26::optional o6; + beman::optional::optional o5{5}; + beman::optional::optional o6; o6 = o5; retval &= (o5->i_ == 5); return retval; @@ -194,71 +194,71 @@ struct takes_init_and_variadic { }; consteval bool testConstexprInPlace() { - bool retval = true; - constexpr beman::optional26::optional o1{beman::optional26::in_place}; - constexpr beman::optional26::optional o2(beman::optional26::in_place); + bool retval = true; + constexpr beman::optional::optional o1{beman::optional::in_place}; + constexpr beman::optional::optional o2(beman::optional::in_place); retval &= (bool(o1)); retval &= (o1 == 0); retval &= (bool(o2)); retval &= (o2 == 0); - constexpr beman::optional26::optional o3(beman::optional26::in_place, 42); + constexpr beman::optional::optional o3(beman::optional::in_place, 42); retval &= (o3 == 42); - constexpr beman::optional26::optional> o4(beman::optional26::in_place, 0, 1); + constexpr beman::optional::optional> o4(beman::optional::in_place, 0, 1); retval &= (bool(o4)); retval &= (std::get<0>(*o4) == 0); retval &= (std::get<1>(*o4) == 1); - constexpr beman::optional26::optional o6(beman::optional26::in_place, {0, 1}, 2, 3); + constexpr beman::optional::optional o6(beman::optional::in_place, {0, 1}, 2, 3); retval &= (o6->v0 == 0); retval &= (std::get<0>(o6->t) == 2); retval &= (std::get<1>(o6->t) == 3); return retval; } -using beman::optional26::tests::constify; +using beman::optional::tests::constify; TEST(OptionalConstexprTest, InPlace) { EXPECT_TRUE(constify(testConstexprInPlace())); } TEST(OptionalConstexprTest, MakeOptional) { - constexpr auto o1 = beman::optional26::make_optional(42); - constexpr auto o2 = beman::optional26::optional(42); + constexpr auto o1 = beman::optional::make_optional(42); + constexpr auto o2 = beman::optional::optional(42); - constexpr bool is_same = std::is_same>::value; + constexpr bool is_same = std::is_same>::value; EXPECT_TRUE(is_same); EXPECT_TRUE(o1 == o2); - constexpr auto o3 = beman::optional26::make_optional>(0, 1, 2, 3); + constexpr auto o3 = beman::optional::make_optional>(0, 1, 2, 3); EXPECT_TRUE(std::get<0>(*o3) == 0); EXPECT_TRUE(std::get<1>(*o3) == 1); EXPECT_TRUE(std::get<2>(*o3) == 2); EXPECT_TRUE(std::get<3>(*o3) == 3); - constexpr auto o5 = beman::optional26::make_optional({0, 1}, 2, 3); + constexpr auto o5 = beman::optional::make_optional({0, 1}, 2, 3); EXPECT_TRUE(o5->v0 == 0); EXPECT_TRUE(std::get<0>(o5->t) == 2); EXPECT_TRUE(std::get<1>(o5->t) == 3); } TEST(OptionalConstexprTest, Nullopt) { - constexpr beman::optional26::optional o1 = beman::optional26::nullopt; - constexpr beman::optional26::optional o2{beman::optional26::nullopt}; - constexpr beman::optional26::optional o3(beman::optional26::nullopt); - constexpr beman::optional26::optional o4 = {beman::optional26::nullopt}; + constexpr beman::optional::optional o1 = beman::optional::nullopt; + constexpr beman::optional::optional o2{beman::optional::nullopt}; + constexpr beman::optional::optional o3(beman::optional::nullopt); + constexpr beman::optional::optional o4 = {beman::optional::nullopt}; EXPECT_TRUE(constify(!o1)); EXPECT_TRUE(constify(!o2)); EXPECT_TRUE(constify(!o3)); EXPECT_TRUE(constify(!o4)); - EXPECT_TRUE(!std::is_default_constructible::value); + EXPECT_TRUE(!std::is_default_constructible::value); } TEST(OptionalConstexprTest, Observers) { - constexpr beman::optional26::optional o1 = 42; - constexpr beman::optional26::optional o2; - constexpr beman::optional26::optional o3 = 42; + constexpr beman::optional::optional o1 = 42; + constexpr beman::optional::optional o2; + constexpr beman::optional::optional o3 = 42; EXPECT_TRUE(*o1 == 42); EXPECT_TRUE(*o1 == o1.value()); @@ -273,9 +273,9 @@ TEST(OptionalConstexprTest, Observers) { } TEST(OptionalConstexprTest, RelationalOps) { - constexpr beman::optional26::optional o1{4}; - constexpr beman::optional26::optional o2{42}; - constexpr beman::optional26::optional o3{}; + constexpr beman::optional::optional o1{4}; + constexpr beman::optional::optional o2{42}; + constexpr beman::optional::optional o3{}; // SECTION("self simple") { @@ -295,30 +295,30 @@ TEST(OptionalConstexprTest, RelationalOps) { // SECTION("nullopt simple") { { - EXPECT_TRUE(constify((!(o1 == beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt == o1)))); - EXPECT_TRUE(constify((o1 != beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt != o1))); - EXPECT_TRUE(constify((!(o1 < beman::optional26::nullopt)))); - EXPECT_TRUE(constify((beman::optional26::nullopt < o1))); - EXPECT_TRUE(constify((o1 > beman::optional26::nullopt))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt > o1)))); - EXPECT_TRUE(constify((!(o1 <= beman::optional26::nullopt)))); - EXPECT_TRUE(constify((beman::optional26::nullopt <= o1))); - EXPECT_TRUE(constify((o1 >= beman::optional26::nullopt))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt >= o1)))); - EXPECT_TRUE(constify((o3 == beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt == o3))); - EXPECT_TRUE(constify((!(o3 != beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt != o3)))); - EXPECT_TRUE(constify((!(o3 < beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt < o3)))); - EXPECT_TRUE(constify((!(o3 > beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt > o3)))); - EXPECT_TRUE(constify((o3 <= beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt <= o3))); - EXPECT_TRUE(constify((o3 >= beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt >= o3))); + EXPECT_TRUE(constify((!(o1 == beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt == o1)))); + EXPECT_TRUE(constify((o1 != beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt != o1))); + EXPECT_TRUE(constify((!(o1 < beman::optional::nullopt)))); + EXPECT_TRUE(constify((beman::optional::nullopt < o1))); + EXPECT_TRUE(constify((o1 > beman::optional::nullopt))); + EXPECT_TRUE(constify((!(beman::optional::nullopt > o1)))); + EXPECT_TRUE(constify((!(o1 <= beman::optional::nullopt)))); + EXPECT_TRUE(constify((beman::optional::nullopt <= o1))); + EXPECT_TRUE(constify((o1 >= beman::optional::nullopt))); + EXPECT_TRUE(constify((!(beman::optional::nullopt >= o1)))); + EXPECT_TRUE(constify((o3 == beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt == o3))); + EXPECT_TRUE(constify((!(o3 != beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt != o3)))); + EXPECT_TRUE(constify((!(o3 < beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt < o3)))); + EXPECT_TRUE(constify((!(o3 > beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt > o3)))); + EXPECT_TRUE(constify((o3 <= beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt <= o3))); + EXPECT_TRUE(constify((o3 >= beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt >= o3))); } } // SECTION("with T simple") @@ -354,13 +354,13 @@ TEST(OptionalConstexprTest, RelationalOps) { } } - using beman::optional26::tests::Point; + using beman::optional::tests::Point; constexpr Point p4{2, 3}; constexpr Point p5{3, 4}; - constexpr beman::optional26::optional o4{p4}; - constexpr beman::optional26::optional o5{p5}; + constexpr beman::optional::optional o4{p4}; + constexpr beman::optional::optional o5{p5}; // SECTION("self complex") { @@ -382,33 +382,33 @@ TEST(OptionalConstexprTest, RelationalOps) { // SECTION("nullopt complex") { { - EXPECT_TRUE(constify((!(o4 == beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt == o4)))); - EXPECT_TRUE(constify((o4 != beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt != o4))); - EXPECT_TRUE(constify((!(o4 < beman::optional26::nullopt)))); - EXPECT_TRUE(constify((beman::optional26::nullopt < o4))); - EXPECT_TRUE(constify((o4 > beman::optional26::nullopt))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt > o4)))); - EXPECT_TRUE(constify((!(o4 <= beman::optional26::nullopt)))); - EXPECT_TRUE(constify((beman::optional26::nullopt <= o4))); - EXPECT_TRUE(constify((o4 >= beman::optional26::nullopt))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt >= o4)))); - } - - { - EXPECT_TRUE(constify((o3 == beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt == o3))); - EXPECT_TRUE(constify((!(o3 != beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt != o3)))); - EXPECT_TRUE(constify((!(o3 < beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt < o3)))); - EXPECT_TRUE(constify((!(o3 > beman::optional26::nullopt)))); - EXPECT_TRUE(constify((!(beman::optional26::nullopt > o3)))); - EXPECT_TRUE(constify((o3 <= beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt <= o3))); - EXPECT_TRUE(constify((o3 >= beman::optional26::nullopt))); - EXPECT_TRUE(constify((beman::optional26::nullopt >= o3))); + EXPECT_TRUE(constify((!(o4 == beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt == o4)))); + EXPECT_TRUE(constify((o4 != beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt != o4))); + EXPECT_TRUE(constify((!(o4 < beman::optional::nullopt)))); + EXPECT_TRUE(constify((beman::optional::nullopt < o4))); + EXPECT_TRUE(constify((o4 > beman::optional::nullopt))); + EXPECT_TRUE(constify((!(beman::optional::nullopt > o4)))); + EXPECT_TRUE(constify((!(o4 <= beman::optional::nullopt)))); + EXPECT_TRUE(constify((beman::optional::nullopt <= o4))); + EXPECT_TRUE(constify((o4 >= beman::optional::nullopt))); + EXPECT_TRUE(constify((!(beman::optional::nullopt >= o4)))); + } + + { + EXPECT_TRUE(constify((o3 == beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt == o3))); + EXPECT_TRUE(constify((!(o3 != beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt != o3)))); + EXPECT_TRUE(constify((!(o3 < beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt < o3)))); + EXPECT_TRUE(constify((!(o3 > beman::optional::nullopt)))); + EXPECT_TRUE(constify((!(beman::optional::nullopt > o3)))); + EXPECT_TRUE(constify((o3 <= beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt <= o3))); + EXPECT_TRUE(constify((o3 >= beman::optional::nullopt))); + EXPECT_TRUE(constify((beman::optional::nullopt >= o3))); } } @@ -447,9 +447,9 @@ TEST(OptionalConstexprTest, RelationalOps) { } consteval bool testComparisons() { - constexpr beman::optional26::optional o1{4}; - constexpr beman::optional26::optional o2{42}; - constexpr beman::optional26::optional o3{}; + constexpr beman::optional::optional o1{4}; + constexpr beman::optional::optional o2{42}; + constexpr beman::optional::optional o3{}; // SECTION("self simple") { @@ -516,122 +516,122 @@ consteval bool testComparisons() { // SECTION("nullopt simple") { { - constexpr auto b = (!(o1 == beman::optional26::nullopt)); + constexpr auto b = (!(o1 == beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt == o1)); + constexpr auto b = (!(beman::optional::nullopt == o1)); static_assert(b); } { - constexpr auto b = (o1 != beman::optional26::nullopt); + constexpr auto b = (o1 != beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt != o1); + constexpr auto b = (beman::optional::nullopt != o1); static_assert(b); } { - constexpr auto b = (!(o1 < beman::optional26::nullopt)); + constexpr auto b = (!(o1 < beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt < o1); + constexpr auto b = (beman::optional::nullopt < o1); static_assert(b); } { - constexpr auto b = (o1 > beman::optional26::nullopt); + constexpr auto b = (o1 > beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt > o1)); + constexpr auto b = (!(beman::optional::nullopt > o1)); static_assert(b); } { - constexpr auto b = (!(o1 <= beman::optional26::nullopt)); + constexpr auto b = (!(o1 <= beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt <= o1); + constexpr auto b = (beman::optional::nullopt <= o1); static_assert(b); } { - constexpr auto b = (o1 >= beman::optional26::nullopt); + constexpr auto b = (o1 >= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt >= o1)); + constexpr auto b = (!(beman::optional::nullopt >= o1)); static_assert(b); } { - constexpr auto b = (o3 == beman::optional26::nullopt); + constexpr auto b = (o3 == beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt == o3); + constexpr auto b = (beman::optional::nullopt == o3); static_assert(b); } { - constexpr auto b = (!(o3 != beman::optional26::nullopt)); + constexpr auto b = (!(o3 != beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt != o3)); + constexpr auto b = (!(beman::optional::nullopt != o3)); static_assert(b); } { - constexpr auto b = (!(o3 < beman::optional26::nullopt)); + constexpr auto b = (!(o3 < beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt < o3)); + constexpr auto b = (!(beman::optional::nullopt < o3)); static_assert(b); } { - constexpr auto b = (!(o3 > beman::optional26::nullopt)); + constexpr auto b = (!(o3 > beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt > o3)); + constexpr auto b = (!(beman::optional::nullopt > o3)); static_assert(b); } { - constexpr auto b = (o3 <= beman::optional26::nullopt); + constexpr auto b = (o3 <= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt <= o3); + constexpr auto b = (beman::optional::nullopt <= o3); static_assert(b); } { - constexpr auto b = (o3 >= beman::optional26::nullopt); + constexpr auto b = (o3 >= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt >= o3); + constexpr auto b = (beman::optional::nullopt >= o3); static_assert(b); } } @@ -758,13 +758,13 @@ consteval bool testComparisons() { } } - using beman::optional26::tests::Point; + using beman::optional::tests::Point; constexpr Point p4{2, 3}; constexpr Point p5{3, 4}; - constexpr beman::optional26::optional o4{p4}; - constexpr beman::optional26::optional o5{p5}; + constexpr beman::optional::optional o4{p4}; + constexpr beman::optional::optional o5{p5}; // SECTION("self complex") { @@ -831,122 +831,122 @@ consteval bool testComparisons() { // SECTION("nullopt complex") { { - constexpr auto b = (!(o4 == beman::optional26::nullopt)); + constexpr auto b = (!(o4 == beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt == o4)); + constexpr auto b = (!(beman::optional::nullopt == o4)); static_assert(b); } { - constexpr auto b = (o4 != beman::optional26::nullopt); + constexpr auto b = (o4 != beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt != o4); + constexpr auto b = (beman::optional::nullopt != o4); static_assert(b); } { - constexpr auto b = (!(o4 < beman::optional26::nullopt)); + constexpr auto b = (!(o4 < beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt < o4); + constexpr auto b = (beman::optional::nullopt < o4); static_assert(b); } { - constexpr auto b = (o4 > beman::optional26::nullopt); + constexpr auto b = (o4 > beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt > o4)); + constexpr auto b = (!(beman::optional::nullopt > o4)); static_assert(b); } { - constexpr auto b = (!(o4 <= beman::optional26::nullopt)); + constexpr auto b = (!(o4 <= beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt <= o4); + constexpr auto b = (beman::optional::nullopt <= o4); static_assert(b); } { - constexpr auto b = (o4 >= beman::optional26::nullopt); + constexpr auto b = (o4 >= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt >= o4)); + constexpr auto b = (!(beman::optional::nullopt >= o4)); static_assert(b); } { - constexpr auto b = (o3 == beman::optional26::nullopt); + constexpr auto b = (o3 == beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt == o3); + constexpr auto b = (beman::optional::nullopt == o3); static_assert(b); } { - constexpr auto b = (!(o3 != beman::optional26::nullopt)); + constexpr auto b = (!(o3 != beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt != o3)); + constexpr auto b = (!(beman::optional::nullopt != o3)); static_assert(b); } { - constexpr auto b = (!(o3 < beman::optional26::nullopt)); + constexpr auto b = (!(o3 < beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt < o3)); + constexpr auto b = (!(beman::optional::nullopt < o3)); static_assert(b); } { - constexpr auto b = (!(o3 > beman::optional26::nullopt)); + constexpr auto b = (!(o3 > beman::optional::nullopt)); static_assert(b); } { - constexpr auto b = (!(beman::optional26::nullopt > o3)); + constexpr auto b = (!(beman::optional::nullopt > o3)); static_assert(b); } { - constexpr auto b = (o3 <= beman::optional26::nullopt); + constexpr auto b = (o3 <= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt <= o3); + constexpr auto b = (beman::optional::nullopt <= o3); static_assert(b); } { - constexpr auto b = (o3 >= beman::optional26::nullopt); + constexpr auto b = (o3 >= beman::optional::nullopt); static_assert(b); } { - constexpr auto b = (beman::optional26::nullopt >= o3); + constexpr auto b = (beman::optional::nullopt >= o3); static_assert(b); } } @@ -1080,8 +1080,8 @@ constexpr bool checkTestComparison = testComparisons(); static_assert(checkTestComparison); TEST(OptionalConstexprTest, RangeTest) { - constexpr beman::optional26::optional o1 = beman::optional26::nullopt; - constexpr beman::optional26::optional o2 = 42; + constexpr beman::optional::optional o1 = beman::optional::nullopt; + constexpr beman::optional::optional o2 = 42; EXPECT_EQ(*o2, 42); for (auto k : o1) { std::ignore = k; @@ -1093,46 +1093,46 @@ TEST(OptionalConstexprTest, RangeTest) { } consteval bool testSwap() { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; o1.swap(o2); return (o1.value() == 12) && (o2.value() == 42); } static_assert(testSwap()); consteval bool testSwapWNull() { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = beman::optional26::nullopt; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = beman::optional::nullopt; o1.swap(o2); return (!o1.has_value()) && (o2.value(), 42); } static_assert(testSwapWNull()); consteval bool testSwapNullIntializedWithValue() { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = 42; o1.swap(o2); return (o1.value() == 42) && (!o2.has_value()); } static_assert(testSwapNullIntializedWithValue()); consteval bool testEmplace() { - beman::optional26::optional, std::pair>> i; + beman::optional::optional, std::pair>> i; i.emplace(std::piecewise_construct, std::make_tuple(0, 2), std::make_tuple(3, 4)); return (i->first.first == 0) && (i->first.second == 2) && (i->second.first == 3) && (i->second.second == 4); } static_assert(testEmplace()); consteval bool testEmplaceInitList() { - beman::optional26::optional o; + beman::optional::optional o; o.emplace({0, 1}, 2, 3); return (o->v0 == 0) && (std::get<0>(o->t) == 2) && (std::get<1>(o->t) == 3); } static_assert(testEmplaceInitList()); consteval bool testAssignment() { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; bool retval = true; @@ -1146,9 +1146,9 @@ consteval bool testAssignment() { static_assert(testAssignment()); consteval bool testAssignmentValue() { - beman::optional26::optional o1 = 42; - beman::optional26::optional o2 = 12; - beman::optional26::optional o3; + beman::optional::optional o1 = 42; + beman::optional::optional o2 = 12; + beman::optional::optional o3; bool retval = true; @@ -1163,13 +1163,13 @@ consteval bool testAssignmentValue() { o1 = 42; retval &= (*o1 == 42); - o1 = beman::optional26::nullopt; + o1 = beman::optional::nullopt; retval &= (!o1); o1 = std::move(o2); retval &= (*o1 == 12); - beman::optional26::optional o4 = 42; + beman::optional::optional o4 = 42; o1 = o4; retval &= (*o1 == 42); @@ -1202,8 +1202,8 @@ consteval bool testAssignmentValue() { requires std::is_copy_constructible_v && std::is_copy_assignable_v && (!std::is_trivially_copy_assignable_v) */ - beman::optional26::optional o5{5}; - beman::optional26::optional o6; + beman::optional::optional o5{5}; + beman::optional::optional o6; o6 = o5; retval &= (o5->i_ == 5); diff --git a/src/beman/optional/tests/optional_monadic.t.cpp b/src/beman/optional/tests/optional_monadic.t.cpp new file mode 100644 index 0000000..81e4cf9 --- /dev/null +++ b/src/beman/optional/tests/optional_monadic.t.cpp @@ -0,0 +1,325 @@ +// src/beman/optional/tests/optional_monadic.t.cpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include + +#include + +constexpr int get_int(int) { return 42; } +constexpr beman::optional::optional get_opt_int(int) { return 42; } + +TEST(OptionalMonadicTest, Transform) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + beman::optional::optional o2 = 40; + auto o2r = o2.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42); + + struct rval_call_transform { + double operator()(int) && { return 42.0; }; + }; + + // ensure that function object is forwarded + beman::optional::optional o3 = 42; + auto o3r = o3.transform(rval_call_transform{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o3r.value() == 42); + + // ensure that lhs is forwarded + beman::optional::optional o4 = 40; + auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o4r.value() == 42); + + // ensure that lhs is const-propagated + const beman::optional::optional o5 = 40; + auto o5r = o5.transform([](const int& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // test each overload in turn + beman::optional::optional o8 = 42; + auto o8r = o8.transform([](int) { return 42; }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o12 = 42; + auto o12r = std::move(o12).transform([](int) { return 42; }); + EXPECT_TRUE(*o12r == 42); + + const beman::optional::optional o16 = 42; + auto o16r = o16.transform([](int) { return 42; }); + EXPECT_TRUE(*o16r == 42); + + const beman::optional::optional o20 = 42; + auto o20r = std::move(o20).transform([](int) { return 42; }); + EXPECT_TRUE(*o20r == 42); + + beman::optional::optional o24 = beman::optional::nullopt; + auto o24r = o24.transform([](int) { return 42; }); + EXPECT_TRUE(!o24r); + + beman::optional::optional o28 = beman::optional::nullopt; + auto o28r = std::move(o28).transform([](int) { return 42; }); + EXPECT_TRUE(!o28r); + + const beman::optional::optional o32 = beman::optional::nullopt; + auto o32r = o32.transform([](int) { return 42; }); + EXPECT_TRUE(!o32r); + + const beman::optional::optional o36 = beman::optional::nullopt; + auto o36r = std::move(o36).transform([](int) { return 42; }); + EXPECT_TRUE(!o36r); + + // callable which returns a reference + beman::optional::optional o38 = 42; + beman::optional::optional o38r = o38.transform([](int& i) -> const int& { return i; }); + EXPECT_TRUE(o38r); + EXPECT_TRUE(*o38r == 42); +} + +TEST(OptionalMonadicTest, TransformConstexpr) { + // test each overload in turn + constexpr beman::optional::optional o16 = 42; + constexpr auto o16r = o16.transform(get_int); + static_assert(*o16r == 42); + + constexpr beman::optional::optional o20 = 42; + constexpr auto o20r = std::move(o20).transform(get_int); + static_assert(*o20r == 42); + + constexpr beman::optional::optional o32 = beman::optional::nullopt; + constexpr auto o32r = o32.transform(get_int); + static_assert(!o32r); + constexpr beman::optional::optional o36 = beman::optional::nullopt; + constexpr auto o36r = std::move(o36).transform(get_int); + static_assert(!o36r); +} + +TEST(OptionalMonadicTest, Transform2) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + beman::optional::optional o2 = 40; + auto o2r = o2.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42); + + struct rval_call_transform { + double operator()(int) && { return 42.0; }; + }; + + // ensure that function object is forwarded + beman::optional::optional o3 = 42; + auto o3r = o3.transform(rval_call_transform{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o3r.value() == 42); + + // ensure that lhs is forwarded + beman::optional::optional o4 = 40; + auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o4r.value() == 42); + + // ensure that lhs is const-propagated + const beman::optional::optional o5 = 40; + auto o5r = o5.transform([](const int& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // test each overload in turn + beman::optional::optional o8 = 42; + auto o8r = o8.transform([](int) { return 42; }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o12 = 42; + auto o12r = std::move(o12).transform([](int) { return 42; }); + EXPECT_TRUE(*o12r == 42); + + const beman::optional::optional o16 = 42; + auto o16r = o16.transform([](int) { return 42; }); + EXPECT_TRUE(*o16r == 42); + + const beman::optional::optional o20 = 42; + auto o20r = std::move(o20).transform([](int) { return 42; }); + EXPECT_TRUE(*o20r == 42); + + beman::optional::optional o24 = beman::optional::nullopt; + auto o24r = o24.transform([](int) { return 42; }); + EXPECT_TRUE(!o24r); + + beman::optional::optional o28 = beman::optional::nullopt; + auto o28r = std::move(o28).transform([](int) { return 42; }); + EXPECT_TRUE(!o28r); + + const beman::optional::optional o32 = beman::optional::nullopt; + auto o32r = o32.transform([](int) { return 42; }); + EXPECT_TRUE(!o32r); + + const beman::optional::optional o36 = beman::optional::nullopt; + auto o36r = std::move(o36).transform([](int) { return 42; }); + EXPECT_TRUE(!o36r); +} + +TEST(OptionalMonadicTest, TransformConstxpr) { + // test each overload in turn + constexpr beman::optional::optional o16 = 42; + constexpr auto o16r = o16.transform(get_int); + static_assert(*o16r == 42); + + constexpr beman::optional::optional o20 = 42; + constexpr auto o20r = std::move(o20).transform(get_int); + static_assert(*o20r == 42); + + constexpr beman::optional::optional o32 = beman::optional::nullopt; + constexpr auto o32r = o32.transform(get_int); + static_assert(!o32r); + constexpr beman::optional::optional o36 = beman::optional::nullopt; + constexpr auto o36r = std::move(o36).transform(get_int); + static_assert(!o36r); +} + +TEST(OptionalMonadicTest, and_then) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.and_then([](int) { return beman::optional::optional{42}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + beman::optional::optional o2 = 12; + auto o2r = o2.and_then([](int) { return beman::optional::optional{42}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42.f); + + // lhs is empty, rhs returns empty + beman::optional::optional o3; + auto o3r = o3.and_then([](int) { return beman::optional::optional{}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o3r); + + // rhs returns empty + beman::optional::optional o4 = 12; + auto o4r = o4.and_then([](int) { return beman::optional::optional{}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o4r); + + struct rval_call_and_then { + beman::optional::optional operator()(int) && { return beman::optional::optional(42.0); }; + }; + + // ensure that function object is forwarded + beman::optional::optional o5 = 42; + auto o5r = o5.and_then(rval_call_and_then{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // ensure that lhs is forwarded + beman::optional::optional o6 = 42; + auto o6r = std::move(o6).and_then([](int&& i) { return beman::optional::optional(i); }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o6r.value() == 42); + + // ensure that function object is const-propagated + const beman::optional::optional o7 = 42; + auto o7r = o7.and_then([](const int& i) { return beman::optional::optional(i); }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o7r.value() == 42); + + // test each overload in turn + beman::optional::optional o8 = 42; + auto o8r = o8.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o9 = 42; + auto o9r = std::move(o9).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o9r == 42); + + const beman::optional::optional o10 = 42; + auto o10r = o10.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o10r == 42); + + const beman::optional::optional o11 = 42; + auto o11r = std::move(o11).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o11r == 42); + + beman::optional::optional o16 = beman::optional::nullopt; + auto o16r = o16.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o16r); + + beman::optional::optional o17 = beman::optional::nullopt; + auto o17r = std::move(o17).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o17r); + + const beman::optional::optional o18 = beman::optional::nullopt; + auto o18r = o18.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o18r); + + const beman::optional::optional o19 = beman::optional::nullopt; + auto o19r = std::move(o19).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o19r); + + int i = 3; + beman::optional::optional o20{i}; + std::move(o20).and_then([](int& r) { return beman::optional::optional{++r}; }); + EXPECT_TRUE(o20); + EXPECT_TRUE(i == 4); +} + +TEST(OptionalMonadicTest, Constexpr_and_then) { + constexpr beman::optional::optional o10 = 42; + constexpr auto o10r = o10.and_then(get_opt_int); + EXPECT_TRUE(*o10r == 42); + + constexpr beman::optional::optional o11 = 42; + constexpr auto o11r = std::move(o11).and_then(get_opt_int); + EXPECT_TRUE(*o11r == 42); + + constexpr beman::optional::optional o18 = beman::optional::nullopt; + constexpr auto o18r = o18.and_then(get_opt_int); + EXPECT_TRUE(!o18r); + + constexpr beman::optional::optional o19 = beman::optional::nullopt; + constexpr auto o19r = std::move(o19).and_then(get_opt_int); + EXPECT_TRUE(!o19r); +} + +TEST(OptionalMonadicTest, or_else) { + beman::optional::optional o1 = 42; + EXPECT_TRUE(*(o1.or_else([] { return beman::optional::make_optional(13); })) == 42); + + beman::optional::optional o2; + EXPECT_EQ(*(o2.or_else([] { return beman::optional::make_optional(13); })), 13); + + /* + optional or_else(F&& f) && { + */ + EXPECT_TRUE(*(std::move(o1).or_else([] { return beman::optional::make_optional(13); })) == 42); + EXPECT_EQ(*(std::move(o2).or_else([] { return beman::optional::make_optional(13); })), 13); +} + +TEST(OptionalMonadicTest, Constexpr_or_else) { + constexpr beman::optional::optional o1 = 42; + constexpr auto test = (*(o1.or_else([] { return beman::optional::make_optional(13); })) == 42); + EXPECT_TRUE(test); + constexpr beman::optional::optional o2; + constexpr auto test2 = *(o2.or_else([] { return beman::optional::make_optional(13); })) == 13; + EXPECT_TRUE(test2); + + /* + optional or_else(F&& f) && { + */ + constexpr auto test3 = (*(std::move(o1).or_else([] { return beman::optional::make_optional(13); })) == 42); + EXPECT_TRUE(test3); + constexpr auto test4 = *(std::move(o2).or_else([] { return beman::optional::make_optional(13); })) == 13; + EXPECT_TRUE(test4); +} diff --git a/src/beman/optional26/tests/optional_range_support.t.cpp b/src/beman/optional/tests/optional_range_support.t.cpp similarity index 81% rename from src/beman/optional26/tests/optional_range_support.t.cpp rename to src/beman/optional/tests/optional_range_support.t.cpp index a584885..8fa3758 100644 --- a/src/beman/optional26/tests/optional_range_support.t.cpp +++ b/src/beman/optional/tests/optional_range_support.t.cpp @@ -1,4 +1,4 @@ -// src/beman/optional26/tests/optional_range_support.t.cpp -*-C++-*- +// src/beman/optional/tests/optional_range_support.t.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception /** @@ -8,12 +8,12 @@ * * Classes used in the tests: int, pointers, empty, no_default_ctor, base, derived. */ -#include +#include #include -#include -#include +#include +#include #include #include @@ -61,7 +61,7 @@ } else \ ASSERT_FALSE(val) -using namespace beman::optional26::tests; +using namespace beman::optional::tests; TEST(RangeSupportTest, RangeConcepts) { const auto test = [](auto&& opt) { @@ -82,12 +82,12 @@ TEST(RangeSupportTest, RangeConcepts) { static_assert(std::ranges::sized_range); }; - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); } TEST(RangeSupportTest, IteratorConcepts) { @@ -115,12 +115,12 @@ TEST(RangeSupportTest, IteratorConcepts) { static_assert(std::contiguous_iterator); }; - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); } TEST(RangeSupportTest, BeginOnEmptyOptional) { @@ -138,12 +138,12 @@ TEST(RangeSupportTest, BeginOnEmptyOptional) { CONSTEXPR_EXPECT_EQ(const_opt.begin(), const_iterator()); }; - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); }; static_assert((lambda(), true)); lambda(); @@ -164,14 +164,14 @@ TEST(RangeSupportTest, BeginOnNonEmptyOptional) { CONSTEXPR_EXPECT_EQ(const_opt.begin(), const_iterator(&*opt)); }; - test(beman::optional26::optional{26}); + test(beman::optional::optional{26}); if (!std::is_constant_evaluated()) { - test(beman::optional26::optional{reinterpret_cast(0XCAFEBABE)}); + test(beman::optional::optional{reinterpret_cast(0XCAFEBABE)}); } - test(beman::optional26::optional{empty{}}); - test(beman::optional26::optional{no_default_ctor{empty{}}}); - test(beman::optional26::optional{base{}}); - test(beman::optional26::optional{derived{}}); + test(beman::optional::optional{empty{}}); + test(beman::optional::optional{no_default_ctor{empty{}}}); + test(beman::optional::optional{base{}}); + test(beman::optional::optional{derived{}}); }; static_assert((lambda(), true)); lambda(); @@ -192,12 +192,12 @@ TEST(RangeSupportTest, EndOnEmptyOptional) { CONSTEXPR_EXPECT_EQ(const_opt.end(), const_iterator()); }; - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); - test(beman::optional26::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); + test(beman::optional::optional{}); }; static_assert((lambda(), true)); lambda(); @@ -218,14 +218,14 @@ TEST(RangeSupportTest, EndOnNonEmptyOptional) { CONSTEXPR_EXPECT_EQ(const_opt.end(), const_iterator(&*opt + 1)); }; - test(beman::optional26::optional{26}); + test(beman::optional::optional{26}); if (!std::is_constant_evaluated()) { - test(beman::optional26::optional{reinterpret_cast(0XCAFEBABE)}); + test(beman::optional::optional{reinterpret_cast(0XCAFEBABE)}); } - test(beman::optional26::optional{empty{}}); - test(beman::optional26::optional{no_default_ctor{empty{}}}); - test(beman::optional26::optional{base{}}); - test(beman::optional26::optional{derived{}}); + test(beman::optional::optional{empty{}}); + test(beman::optional::optional{no_default_ctor{empty{}}}); + test(beman::optional::optional{base{}}); + test(beman::optional::optional{derived{}}); }; static_assert((lambda(), true)); lambda(); @@ -234,17 +234,17 @@ TEST(RangeSupportTest, EndOnNonEmptyOptional) { TEST(RangeSupportTest, FormatOptionalIsStillDisabled) { // TODO: Always enable when all major compilers implement P2585R1: "Improve default container formatting". #if defined(__cpp_lib_format_ranges) - static_assert(std::format_kind> == std::range_format::disabled); - EXPECT_EQ(std::format_kind>, std::range_format::disabled); + static_assert(std::format_kind> == std::range_format::disabled); + EXPECT_EQ(std::format_kind>, std::range_format::disabled); // Next line should not compile: formatter is not defined for optional. - // EXPECT_EQ(std::format("{}", beman::optional26::optional {}), "[]"); + // EXPECT_EQ(std::format("{}", beman::optional::optional {}), "[]"); #endif } TEST(RangeSupportTest, LoopOverEmptyRange) { auto lambda = [&] { - beman::optional26::optional empty; + beman::optional::optional empty; CONSTEXPR_ASSERT_FALSE(empty.has_value()); for ([[maybe_unused]] auto _ : empty) { @@ -257,8 +257,8 @@ TEST(RangeSupportTest, LoopOverEmptyRange) { TEST(RangeSupportTest, LoopOverNonEmptyRange) { auto lambda = [&] { - const auto expected_value = 0xCAFEBABE; - beman::optional26::optional empty{expected_value}; + const auto expected_value = 0xCAFEBABE; + beman::optional::optional empty{expected_value}; CONSTEXPR_ASSERT_TRUE(empty.has_value()); bool entered_loop = false; @@ -276,7 +276,7 @@ TEST(RangeSupportTest, LoopOptionalAccess) { auto lambda = [&] { // Example from P3168R2: should access the value from an optional object. const int expected_value = 0xCAFEBABE; - const auto get_optional = [&]() -> beman::optional26::optional { return expected_value; }; + const auto get_optional = [&]() -> beman::optional::optional { return expected_value; }; CONSTEXPR_ASSERT_TRUE(get_optional().has_value()); for (auto&& opt : get_optional()) { @@ -292,7 +292,7 @@ TEST(RangeSupportTest, LoopOptionalAssignment) { // Example from P3168R2: should mutate the value from an optional object. const int initial_expected_value = 0xCAFEBABE; const int expected_value = 0xDEADBEEF; - const auto get_optional = [&]() -> beman::optional26::optional { return initial_expected_value; }; + const auto get_optional = [&]() -> beman::optional::optional { return initial_expected_value; }; CONSTEXPR_ASSERT_TRUE(get_optional().has_value()); CONSTEXPR_ASSERT_TRUE(get_optional().value() == initial_expected_value); @@ -311,7 +311,7 @@ TEST(RangeSupportTest, LoopOptionalAssignment) { TEST(RangeSupportTest, RangeChainExample) { // Example from P3168R2: start from a set of values, apply multiple range operations involving optional values. std::unordered_set s{1, 3, 7, 9}; - const auto flt = [&](int i) -> beman::optional26::optional { + const auto flt = [&](int i) -> beman::optional::optional { if (s.contains(i)) { return i; } else { @@ -334,8 +334,8 @@ TEST(RangeSupportTest, PythagoreanTriples) { auto lambda = [&] { // Example from P3168R2: generate an infinite sequence of Pythagorean triples. // (x, y, z) is a Pythagorean triple if 1 <= x <= y <= z and x^2 + y^2 = z^2. - constexpr auto yield_if = [](bool b, T x) -> beman::optional26::optional { - return b ? beman::optional26::optional{std::move(x)} : beman::optional26::nullopt; + constexpr auto yield_if = [](bool b, T x) -> beman::optional::optional { + return b ? beman::optional::optional{std::move(x)} : beman::optional::nullopt; }; constexpr auto and_then = [](T&& r, auto fun) { return decltype(r)(r) | std::views::transform(std::move(fun)) | std::views::join; diff --git a/src/beman/optional26/tests/optional_ref.t.cpp b/src/beman/optional/tests/optional_ref.t.cpp similarity index 52% rename from src/beman/optional26/tests/optional_ref.t.cpp rename to src/beman/optional/tests/optional_ref.t.cpp index 8635657..bb71fc6 100644 --- a/src/beman/optional26/tests/optional_ref.t.cpp +++ b/src/beman/optional/tests/optional_ref.t.cpp @@ -1,63 +1,63 @@ -// src/beman/optional26/tests/optional_ref.t.cpp -*-C++-*- +// src/beman/optional/tests/optional_ref.t.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#include -#include +#include +#include #include TEST(OptionalRefTest, Constructors) { - beman::optional26::optional i1; - beman::optional26::optional i2{beman::optional26::nullopt}; + beman::optional::optional i1; + beman::optional::optional i2{beman::optional::nullopt}; std::ignore = i1; std::ignore = i2; - int i = 0; - beman::optional26::optional i3 = i; - std::ignore = i3; + int i = 0; + beman::optional::optional i3 = i; + std::ignore = i3; - using beman::optional26::tests::empty; + using beman::optional::tests::empty; - beman::optional26::optional e1; - beman::optional26::optional e2{beman::optional26::nullopt}; + beman::optional::optional e1; + beman::optional::optional e2{beman::optional::nullopt}; std::ignore = e1; std::ignore = e2; - empty e{}; - beman::optional26::optional e3 = e; - std::ignore = e3; + empty e{}; + beman::optional::optional e3 = e; + std::ignore = e3; - using beman::optional26::tests::no_default_ctor; + using beman::optional::tests::no_default_ctor; - beman::optional26::optional nd1; - beman::optional26::optional nd2{beman::optional26::nullopt}; + beman::optional::optional nd1; + beman::optional::optional nd2{beman::optional::nullopt}; std::ignore = nd1; std::ignore = nd2; no_default_ctor no_def{e}; - beman::optional26::optional nd3 = no_def; - std::ignore = nd3; + beman::optional::optional nd3 = no_def; + std::ignore = nd3; - beman::optional26::optional ie; - beman::optional26::optional i4 = ie; + beman::optional::optional ie; + beman::optional::optional i4 = ie; EXPECT_FALSE(i4); - using beman::optional26::tests::base; - using beman::optional26::tests::derived; + using beman::optional::tests::base; + using beman::optional::tests::derived; - base b{1}; - derived d(1, 2); - beman::optional26::optional b1 = b; - beman::optional26::optional b2 = d; + base b{1}; + derived d(1, 2); + beman::optional::optional b1 = b; + beman::optional::optional b2 = d; - beman::optional26::optional d2 = d; - beman::optional26::optional b3 = d2; - beman::optional26::optional b4{d2}; + beman::optional::optional d2 = d; + beman::optional::optional b3 = d2; + beman::optional::optional b4{d2}; - beman::optional26::optional empty; - beman::optional26::optional fromEmpty(empty); - beman::optional26::optional fromEmpty2 = empty; + beman::optional::optional empty; + beman::optional::optional fromEmpty(empty); + beman::optional::optional fromEmpty2 = empty; /* * template @@ -68,18 +68,18 @@ TEST(OptionalRefTest, Constructors) { * *DIS*engaged */ - beman::optional26::optional tempint = {}; + beman::optional::optional tempint = {}; EXPECT_FALSE(tempint); } struct Thing {}; -beman::optional26::optional process() { +beman::optional::optional process() { static Thing t; return t; } TEST(OptionalRefTest, Assignment) { - beman::optional26::optional i1; + beman::optional::optional i1; EXPECT_FALSE(i1); int i = 5; i1 = i; @@ -90,13 +90,13 @@ TEST(OptionalRefTest, Assignment) { double d; // i1 = d; // ill-formed by mandate - beman::optional26::optional d1 = d; + beman::optional::optional d1 = d; // i1 = d1; // ill-formed by mandate - beman::optional26::optional i2 = i1; + beman::optional::optional i2 = i1; EXPECT_TRUE(i2); EXPECT_TRUE(*i2 = 7); - beman::optional26::optional empty; + beman::optional::optional empty; EXPECT_FALSE(empty); i2 = empty; EXPECT_FALSE(i2); @@ -106,12 +106,12 @@ TEST(OptionalRefTest, Assignment) { EXPECT_EQ(empty, 8); EXPECT_EQ(&result, &eight); - beman::optional26::optional o; + beman::optional::optional o; EXPECT_FALSE(o); o = process(); // well-formed EXPECT_TRUE(o); - beman::optional26::optional o2; + beman::optional::optional o2; EXPECT_FALSE(o2); o2 = [&]() { return i1; }(); @@ -119,11 +119,11 @@ TEST(OptionalRefTest, Assignment) { } TEST(OptionalRefTest, RelationalOps) { - int i1 = 4; - int i2 = 42; - beman::optional26::optional o1{i1}; - beman::optional26::optional o2{i2}; - beman::optional26::optional o3{}; + int i1 = 4; + int i2 = 42; + beman::optional::optional o1{i1}; + beman::optional::optional o2{i2}; + beman::optional::optional o3{}; // SECTION("self simple") { @@ -142,31 +142,31 @@ TEST(OptionalRefTest, RelationalOps) { } // SECTION("nullopt simple") { - EXPECT_TRUE(!(o1 == beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt == o1)); - EXPECT_TRUE(o1 != beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt != o1); - EXPECT_TRUE(!(o1 < beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt < o1); - EXPECT_TRUE(o1 > beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt > o1)); - EXPECT_TRUE(!(o1 <= beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt <= o1); - EXPECT_TRUE(o1 >= beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt >= o1)); - - EXPECT_TRUE(o3 == beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt == o3); - EXPECT_TRUE(!(o3 != beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt != o3)); - EXPECT_TRUE(!(o3 < beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt < o3)); - EXPECT_TRUE(!(o3 > beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt > o3)); - EXPECT_TRUE(o3 <= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt <= o3); - EXPECT_TRUE(o3 >= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt >= o3); + EXPECT_TRUE(!(o1 == beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt == o1)); + EXPECT_TRUE(o1 != beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt != o1); + EXPECT_TRUE(!(o1 < beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt < o1); + EXPECT_TRUE(o1 > beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt > o1)); + EXPECT_TRUE(!(o1 <= beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt <= o1); + EXPECT_TRUE(o1 >= beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt >= o1)); + + EXPECT_TRUE(o3 == beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt == o3); + EXPECT_TRUE(!(o3 != beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt != o3)); + EXPECT_TRUE(!(o3 < beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt < o3)); + EXPECT_TRUE(!(o3 > beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt > o3)); + EXPECT_TRUE(o3 <= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt <= o3); + EXPECT_TRUE(o3 >= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt >= o3); } // SECTION("with T simple") { @@ -196,10 +196,10 @@ TEST(OptionalRefTest, RelationalOps) { EXPECT_TRUE(o1 >= 4); EXPECT_TRUE(4 >= o1); } - std::string s4 = "hello"; - std::string s5 = "xyz"; - beman::optional26::optional o4{s4}; - beman::optional26::optional o5{s5}; + std::string s4 = "hello"; + std::string s5 = "xyz"; + beman::optional::optional o4{s4}; + beman::optional::optional o5{s5}; // SECTION("self complex") { @@ -218,31 +218,31 @@ TEST(OptionalRefTest, RelationalOps) { } // SECTION("nullopt complex") { - EXPECT_TRUE(!(o4 == beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt == o4)); - EXPECT_TRUE(o4 != beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt != o4); - EXPECT_TRUE(!(o4 < beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt < o4); - EXPECT_TRUE(o4 > beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt > o4)); - EXPECT_TRUE(!(o4 <= beman::optional26::nullopt)); - EXPECT_TRUE(beman::optional26::nullopt <= o4); - EXPECT_TRUE(o4 >= beman::optional26::nullopt); - EXPECT_TRUE(!(beman::optional26::nullopt >= o4)); - - EXPECT_TRUE(o3 == beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt == o3); - EXPECT_TRUE(!(o3 != beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt != o3)); - EXPECT_TRUE(!(o3 < beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt < o3)); - EXPECT_TRUE(!(o3 > beman::optional26::nullopt)); - EXPECT_TRUE(!(beman::optional26::nullopt > o3)); - EXPECT_TRUE(o3 <= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt <= o3); - EXPECT_TRUE(o3 >= beman::optional26::nullopt); - EXPECT_TRUE(beman::optional26::nullopt >= o3); + EXPECT_TRUE(!(o4 == beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt == o4)); + EXPECT_TRUE(o4 != beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt != o4); + EXPECT_TRUE(!(o4 < beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt < o4); + EXPECT_TRUE(o4 > beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt > o4)); + EXPECT_TRUE(!(o4 <= beman::optional::nullopt)); + EXPECT_TRUE(beman::optional::nullopt <= o4); + EXPECT_TRUE(o4 >= beman::optional::nullopt); + EXPECT_TRUE(!(beman::optional::nullopt >= o4)); + + EXPECT_TRUE(o3 == beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt == o3); + EXPECT_TRUE(!(o3 != beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt != o3)); + EXPECT_TRUE(!(o3 < beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt < o3)); + EXPECT_TRUE(!(o3 > beman::optional::nullopt)); + EXPECT_TRUE(!(beman::optional::nullopt > o3)); + EXPECT_TRUE(o3 <= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt <= o3); + EXPECT_TRUE(o3 >= beman::optional::nullopt); + EXPECT_TRUE(beman::optional::nullopt >= o3); } // SECTION("with T complex") @@ -276,11 +276,11 @@ TEST(OptionalRefTest, RelationalOps) { } TEST(OptionalRefTest, Triviality) { - EXPECT_TRUE(std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(std::is_trivially_move_constructible>::value); - EXPECT_TRUE(std::is_trivially_move_assignable>::value); - EXPECT_TRUE(std::is_trivially_destructible>::value); + EXPECT_TRUE(std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(std::is_trivially_move_constructible>::value); + EXPECT_TRUE(std::is_trivially_move_assignable>::value); + EXPECT_TRUE(std::is_trivially_destructible>::value); { struct T { @@ -290,11 +290,11 @@ TEST(OptionalRefTest, Triviality) { T& operator=(T&&) = default; ~T() = default; }; - EXPECT_TRUE(std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(std::is_trivially_move_constructible>::value); - EXPECT_TRUE(std::is_trivially_move_assignable>::value); - EXPECT_TRUE(std::is_trivially_destructible>::value); + EXPECT_TRUE(std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(std::is_trivially_move_constructible>::value); + EXPECT_TRUE(std::is_trivially_move_assignable>::value); + EXPECT_TRUE(std::is_trivially_destructible>::value); } { @@ -305,23 +305,23 @@ TEST(OptionalRefTest, Triviality) { T& operator=(T&&) { return *this; }; ~T() {} }; - EXPECT_TRUE(std::is_trivially_copy_constructible>::value); - EXPECT_TRUE(std::is_trivially_copy_assignable>::value); - EXPECT_TRUE(std::is_trivially_move_constructible>::value); - EXPECT_TRUE(std::is_trivially_move_assignable>::value); - EXPECT_TRUE(std::is_trivially_destructible>::value); - - EXPECT_TRUE((std::is_trivially_constructible, - beman::optional26::optional&>::value)); + EXPECT_TRUE(std::is_trivially_copy_constructible>::value); + EXPECT_TRUE(std::is_trivially_copy_assignable>::value); + EXPECT_TRUE(std::is_trivially_move_constructible>::value); + EXPECT_TRUE(std::is_trivially_move_assignable>::value); + EXPECT_TRUE(std::is_trivially_destructible>::value); + + EXPECT_TRUE( + (std::is_trivially_constructible, beman::optional::optional&>::value)); } } TEST(OptionalRefTest, Deletion) { - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); - EXPECT_TRUE(std::is_destructible>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_destructible>::value); { struct T { @@ -331,11 +331,11 @@ TEST(OptionalRefTest, Deletion) { T& operator=(T&&) = default; ~T() = default; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); - EXPECT_TRUE(std::is_destructible>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_destructible>::value); } { @@ -345,10 +345,10 @@ TEST(OptionalRefTest, Deletion) { T& operator=(const T&) = delete; T& operator=(T&&) = delete; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); } { @@ -358,10 +358,10 @@ TEST(OptionalRefTest, Deletion) { T& operator=(const T&) = delete; T& operator=(T&&) = default; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); - EXPECT_TRUE(std::is_move_constructible>::value); - EXPECT_TRUE(std::is_move_assignable>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_move_constructible>::value); + EXPECT_TRUE(std::is_move_assignable>::value); } { @@ -371,8 +371,8 @@ TEST(OptionalRefTest, Deletion) { T& operator=(const T&) = default; T& operator=(T&&) = delete; }; - EXPECT_TRUE(std::is_copy_constructible>::value); - EXPECT_TRUE(std::is_copy_assignable>::value); + EXPECT_TRUE(std::is_copy_constructible>::value); + EXPECT_TRUE(std::is_copy_assignable>::value); } } @@ -384,27 +384,27 @@ struct takes_init_and_variadic { }; TEST(OptionalRefTest, Nullopt) { - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2{beman::optional26::nullopt}; - beman::optional26::optional o3(beman::optional26::nullopt); - beman::optional26::optional o4 = {beman::optional26::nullopt}; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2{beman::optional::nullopt}; + beman::optional::optional o3(beman::optional::nullopt); + beman::optional::optional o4 = {beman::optional::nullopt}; EXPECT_TRUE(!o1); EXPECT_TRUE(!o2); EXPECT_TRUE(!o3); EXPECT_TRUE(!o4); - EXPECT_TRUE(!std::is_default_constructible::value); + EXPECT_TRUE(!std::is_default_constructible::value); } TEST(OptionalRefTest, Observers) { - int var = 42; - beman::optional26::optional o1 = var; - beman::optional26::optional o2; - const beman::optional26::optional o3 = var; - const beman::optional26::optional o4; - int var2 = 42; - int var3 = 6 * 9; + int var = 42; + beman::optional::optional o1 = var; + beman::optional::optional o2; + const beman::optional::optional o3 = var; + const beman::optional::optional o4; + int var2 = 42; + int var3 = 6 * 9; EXPECT_TRUE(*o1 == 42); EXPECT_TRUE(*o1 == o1.value()); EXPECT_TRUE(o2.value_or(var2) == 42); @@ -418,13 +418,13 @@ TEST(OptionalRefTest, Observers) { int var99 = 99; j = 88; EXPECT_TRUE([&]() { - beman::optional26::optional o(j); + beman::optional::optional o(j); return o; }() .value_or(var99) == 88); EXPECT_TRUE([&]() { - beman::optional26::optional o; + beman::optional::optional o; return o; }() .value_or(var99) == 99); @@ -432,12 +432,12 @@ TEST(OptionalRefTest, Observers) { EXPECT_TRUE(o3.value_or([&]() -> int& { return var3; }()) == 42); EXPECT_TRUE(o4.value_or([&]() -> int& { return var3; }()) == 54); - std::string meow{"meow"}; - std::string bark{"bark"}; - beman::optional26::optional so1; - beman::optional26::optional so2{meow}; - auto t1 = so1.value_or(bark); - auto t2 = so2.value_or(bark); + std::string meow{"meow"}; + std::string bark{"bark"}; + beman::optional::optional so1; + beman::optional::optional so2{meow}; + auto t1 = so1.value_or(bark); + auto t2 = so2.value_or(bark); // auto t3 = so1.value_or("bark"); // auto t4 = so2.value_or("bark"); // std::tuple t("meow"); @@ -484,11 +484,11 @@ TEST(OptionalRefTest, Observers) { struct int_box { int i_; }; - int_box i1{3}; - beman::optional26::optional ob1 = i1; - beman::optional26::optional ob2; - const beman::optional26::optional ob3 = i1; - success = std::is_samei_), int>::value; + int_box i1{3}; + beman::optional::optional ob1 = i1; + beman::optional::optional ob2; + const beman::optional::optional ob3 = i1; + success = std::is_samei_), int>::value; static_assert(std::is_samei_), int>::value); EXPECT_TRUE(success); success = std::is_samei_), int>::value; @@ -504,18 +504,18 @@ TEST(OptionalRefTest, Observers) { TEST(OptionalRefTest, MoveCheck) { int x = 0; - int& y = std::move(beman::optional26::optional(x)).value(); + int& y = std::move(beman::optional::optional(x)).value(); EXPECT_EQ(&y, &x); - int& z = *std::move(beman::optional26::optional(x)); + int& z = *std::move(beman::optional::optional(x)); EXPECT_EQ(&z, &x); } TEST(OptionalRefTest, SwapValue) { - int var = 42; - int twelve = 12; - beman::optional26::optional o1 = var; - beman::optional26::optional o2 = twelve; + int var = 42; + int twelve = 12; + beman::optional::optional o1 = var; + beman::optional::optional o2 = twelve; o1.swap(o2); EXPECT_EQ(o1.value(), 12); EXPECT_EQ(o2.value(), 42); @@ -524,41 +524,41 @@ TEST(OptionalRefTest, SwapValue) { TEST(OptionalRefTest, SwapWNull) { int var = 42; - beman::optional26::optional o1 = var; - beman::optional26::optional o2 = beman::optional26::nullopt; + beman::optional::optional o1 = var; + beman::optional::optional o2 = beman::optional::nullopt; o1.swap(o2); EXPECT_TRUE(!o1.has_value()); EXPECT_EQ(o2.value(), 42); } TEST(OptionalRefTest, SwapNullIntializedWithValue) { - int var = 42; - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = var; + int var = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = var; o1.swap(o2); EXPECT_EQ(o1.value(), 42); EXPECT_TRUE(!o2.has_value()); } TEST(OptionalRefTest, AssignFromOptional) { - int var = 42; - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2 = var; + int var = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2 = var; o2 = o1; - using beman::optional26::tests::base; - using beman::optional26::tests::derived; + using beman::optional::tests::base; + using beman::optional::tests::derived; - base b{1}; - derived d(1, 2); - beman::optional26::optional empty_base; - beman::optional26::optional engaged_base{b}; + base b{1}; + derived d(1, 2); + beman::optional::optional empty_base; + beman::optional::optional engaged_base{b}; - beman::optional26::optional empty_derived_ref; - beman::optional26::optional engaged_derived_ref{d}; + beman::optional::optional empty_derived_ref; + beman::optional::optional engaged_derived_ref{d}; - beman::optional26::optional optional_base_ref; + beman::optional::optional optional_base_ref; optional_base_ref = empty_base; EXPECT_FALSE(optional_base_ref.has_value()); optional_base_ref = engaged_base; @@ -570,12 +570,12 @@ TEST(OptionalRefTest, AssignFromOptional) { optional_base_ref = engaged_derived_ref; EXPECT_TRUE(optional_base_ref.has_value()); - beman::optional26::optional empty_derived; - beman::optional26::optional engaged_derived{d}; + beman::optional::optional empty_derived; + beman::optional::optional engaged_derived{d}; static_assert(std::is_constructible_v); - beman::optional26::optional optional_base_const_ref; + beman::optional::optional optional_base_const_ref; optional_base_const_ref = empty_derived; EXPECT_FALSE(optional_base_const_ref.has_value()); @@ -604,47 +604,47 @@ TEST(OptionalRefTest, AssignFromOptional) { // template // constexpr optional& operator=(optional&& rhs) = delete; // -- force failures for - // optional_base_const_ref = beman::optional26::optional(derived(3, 4)); + // optional_base_const_ref = beman::optional::optional(derived(3, 4)); // and - // optional_base_const_ref = [](){return beman::optional26::optional(derived(3, 4));}(); + // optional_base_const_ref = [](){return beman::optional::optional(derived(3, 4));}(); // TODO: Add to "fail-to-compile" tests when they exist } TEST(OptionalRefTest, ConstructFromOptional) { - int var = 42; - beman::optional26::optional o1 = beman::optional26::nullopt; - beman::optional26::optional o2{var}; + int var = 42; + beman::optional::optional o1 = beman::optional::nullopt; + beman::optional::optional o2{var}; EXPECT_FALSE(o1.has_value()); EXPECT_TRUE(o2.has_value()); - using beman::optional26::tests::base; - using beman::optional26::tests::derived; + using beman::optional::tests::base; + using beman::optional::tests::derived; - base b{1}; - derived d(1, 2); - beman::optional26::optional disengaged_base; - beman::optional26::optional engaged_base{b}; + base b{1}; + derived d(1, 2); + beman::optional::optional disengaged_base; + beman::optional::optional engaged_base{b}; EXPECT_FALSE(disengaged_base.has_value()); EXPECT_TRUE(engaged_base.has_value()); - beman::optional26::optional disengaged_derived_ref; - beman::optional26::optional engaged_derived_ref{d}; + beman::optional::optional disengaged_derived_ref; + beman::optional::optional engaged_derived_ref{d}; - beman::optional26::optional optional_base_ref{disengaged_derived_ref}; + beman::optional::optional optional_base_ref{disengaged_derived_ref}; EXPECT_FALSE(optional_base_ref.has_value()); - beman::optional26::optional optional_base_ref2{engaged_derived_ref}; + beman::optional::optional optional_base_ref2{engaged_derived_ref}; EXPECT_TRUE(optional_base_ref2.has_value()); - beman::optional26::optional disengaged_derived; - beman::optional26::optional engaged_derived{d}; + beman::optional::optional disengaged_derived; + beman::optional::optional engaged_derived{d}; static_assert(std::is_constructible_v); - beman::optional26::optional optional_base_const_ref{disengaged_derived}; + beman::optional::optional optional_base_const_ref{disengaged_derived}; EXPECT_FALSE(optional_base_const_ref.has_value()); - beman::optional26::optional optional_base_const_ref2{engaged_derived}; + beman::optional::optional optional_base_const_ref2{engaged_derived}; EXPECT_TRUE(optional_base_const_ref2.has_value()); } @@ -653,33 +653,33 @@ TEST(OptionalRefTest, InPlace) { int two = 2; int fortytwo = 42; - beman::optional26::optional o1{beman::optional26::in_place, one}; - beman::optional26::optional o2(beman::optional26::in_place, two); + beman::optional::optional o1{beman::optional::in_place, one}; + beman::optional::optional o2(beman::optional::in_place, two); EXPECT_TRUE(o1); EXPECT_TRUE(o1 == 1); EXPECT_TRUE(o2); EXPECT_TRUE(o2 == 2); - beman::optional26::optional o3(beman::optional26::in_place, fortytwo); + beman::optional::optional o3(beman::optional::in_place, fortytwo); EXPECT_TRUE(o3 == 42); - // beman::optional26::optional&> o5(beman::optional26::in_place, {0, 1}); + // beman::optional::optional&> o5(beman::optional::in_place, {0, 1}); // EXPECT_TRUE(o5); // EXPECT_TRUE((*o5)[0] == 0); // EXPECT_TRUE((*o5)[1] == 1); - // beman::optional26::optional const&> o4(beman::optional26::in_place, zero, one); + // beman::optional::optional const&> o4(beman::optional::in_place, zero, one); // EXPECT_TRUE(o4); // EXPECT_TRUE(std::get<0>(*o4) == 0); // EXPECT_TRUE(std::get<1>(*o4) == 1); } TEST(OptionalRefTest, OptionalOfOptional) { - using O = beman::optional26::optional; - O o; - beman::optional26::optional oo1a(o); - beman::optional26::optional oo1{o}; - beman::optional26::optional oo1b = o; + using O = beman::optional::optional; + O o; + beman::optional::optional oo1a(o); + beman::optional::optional oo1{o}; + beman::optional::optional oo1b = o; EXPECT_TRUE(oo1.has_value()); oo1 = o; EXPECT_TRUE(oo1.has_value()); @@ -688,7 +688,7 @@ TEST(OptionalRefTest, OptionalOfOptional) { EXPECT_TRUE(oo1.has_value()); EXPECT_TRUE(&oo1.value() == &o); - beman::optional26::optional oo2 = o; + beman::optional::optional oo2 = o; EXPECT_TRUE(oo2.has_value()); oo2 = o; EXPECT_TRUE(oo2.has_value()); @@ -699,29 +699,29 @@ TEST(OptionalRefTest, OptionalOfOptional) { } TEST(OptionalRefTest, ConstructFromReferenceWrapper) { - using O = beman::optional26::optional; + using O = beman::optional::optional; O o; - beman::optional26::optional oo1 = std::ref(o); + beman::optional::optional oo1 = std::ref(o); EXPECT_TRUE(oo1.has_value()); oo1 = std::ref(o); EXPECT_TRUE(oo1.has_value()); EXPECT_TRUE(&oo1.value() == &o); - auto lvalue_refwrapper = std::ref(o); - beman::optional26::optional oo2 = lvalue_refwrapper; + auto lvalue_refwrapper = std::ref(o); + beman::optional::optional oo2 = lvalue_refwrapper; EXPECT_TRUE(oo2.has_value()); oo2 = lvalue_refwrapper; EXPECT_TRUE(oo2.has_value()); EXPECT_TRUE(&oo2.value() == &o); - beman::optional26::optional oo3 = std::ref(o); + beman::optional::optional oo3 = std::ref(o); EXPECT_TRUE(oo3.has_value()); oo3 = std::ref(o); EXPECT_TRUE(oo3.has_value()); EXPECT_TRUE(&oo3.value() == &o); - beman::optional26::optional oo4 = lvalue_refwrapper; + beman::optional::optional oo4 = lvalue_refwrapper; EXPECT_TRUE(oo4.has_value()); oo4 = lvalue_refwrapper; EXPECT_TRUE(oo4.has_value()); @@ -729,52 +729,52 @@ TEST(OptionalRefTest, ConstructFromReferenceWrapper) { } TEST(OptionalRefTest, OverloadResolutionChecksDangling) { - extern int check_dangling(beman::optional26::optional); - extern void check_dangling(beman::optional26::optional); + extern int check_dangling(beman::optional::optional); + extern void check_dangling(beman::optional::optional); std::string lvalue_string = "abc"; static_assert(std::is_same_v); // static_assert(std::is_same_v); } -// beman::optional26::optional foo() { -// beman::optional26::optional o(10); +// beman::optional::optional foo() { +// beman::optional::optional o(10); // return o; // Thanks to a simpler implicit move. // /* error: use of deleted function ‘constexpr -// beman::optional26::optional::optional(beman::optional26::optional&&) [with U = int; T = const int]’ +// beman::optional::optional::optional(beman::optional::optional&&) [with U = int; T = const int]’ // */ // } // TEST(OptionalRefTest, iff) { -// beman::optional26::optional o = -// beman::optional26::optional(o); +// beman::optional::optional o = +// beman::optional::optional(o); // // error: use of deleted function ‘constexpr -// // beman::optional26::optional::optional(beman::optional26::optional&&) +// // beman::optional::optional::optional(beman::optional::optional&&) // // [with U = int; T = const int]’ // } // TEST(OptionalRefTest, dangle) { // extern int check_dangling( -// beman::optional26::optional); // #1 +// beman::optional::optional); // #1 // extern void check_dangling( -// beman::optional26::optional); // #2 -// beman::optional26::optional optional_string = "abc"; -// beman::optional26::optional optional_pointer = "abc"; +// beman::optional::optional); // #2 +// beman::optional::optional optional_string = "abc"; +// beman::optional::optional optional_pointer = "abc"; // static_assert(std::is_same_v); // unambiguously calls #1 // static_assert(std::is_same_v( // optional_pointer))), // void>); // unambiguously calls #2 // static_assert(std::is_same_v); // ambiguous // // error: call of overloaded -// // ‘check_dangling(beman::optional26::optional&)’ is +// // ‘check_dangling(beman::optional::optional&)’ is // ambiguous // } // namespace { -// void process(beman::optional26::optional) {} -// void process(beman::optional26::optional) {} +// void process(beman::optional::optional) {} +// void process(beman::optional::optional) {} // } // TEST(OptionalRefTest, more_dangle){ diff --git a/src/beman/optional/tests/optional_ref_monadic.t.cpp b/src/beman/optional/tests/optional_ref_monadic.t.cpp new file mode 100644 index 0000000..e23f50e --- /dev/null +++ b/src/beman/optional/tests/optional_ref_monadic.t.cpp @@ -0,0 +1,321 @@ +// src/beman/optional/tests/optional_ref_monadic.t.cpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include + +#include + +namespace { +inline constexpr int constexpr_fortytwo = 42; +constexpr int get_int(int) { return constexpr_fortytwo; } +constexpr beman::optional::optional get_opt_int(int) { return constexpr_fortytwo; } +} // namespace + +TEST(OptionalRefMonadicTest, Transform) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + int forty = 40; + beman::optional::optional o2 = forty; + auto o2r = o2.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42); + + struct rval_call_transform { + double operator()(int) && { return 42.0; }; + }; + + // ensure that function object is forwarded + int fortytwo = 42; + beman::optional::optional o3 = fortytwo; + auto o3r = o3.transform(rval_call_transform{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o3r.value() == 42); + + // // ensure that lhs is forwarded + // forty = 40; + // beman::optional::optional o4 = forty; + // auto o4r = std::move(o4).transform([](int &&i) { return i + 2; }); + // static_assert((std::is_same>::value)); + // EXPECT_TRUE(o4r.value() == 42); + + // ensure that lhs is const-propagated + forty = 40; + const beman::optional::optional o5 = forty; + auto o5r = o5.transform([](const int& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // test each overload in turn + fortytwo = 42; + beman::optional::optional o8 = fortytwo; + auto o8r = o8.transform([](int) { return 42; }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o12 = fortytwo; + auto o12r = std::move(o12).transform([](int) { return 42; }); + EXPECT_TRUE(*o12r == 42); + + const beman::optional::optional o16 = fortytwo; + auto o16r = o16.transform([](int) { return 42; }); + EXPECT_TRUE(*o16r == 42); + + const beman::optional::optional o20 = fortytwo; + auto o20r = std::move(o20).transform([](int) { return 42; }); + EXPECT_TRUE(*o20r == 42); + + beman::optional::optional o24 = beman::optional::nullopt; + auto o24r = o24.transform([](int) { return 42; }); + EXPECT_TRUE(!o24r); + + beman::optional::optional o28 = beman::optional::nullopt; + auto o28r = std::move(o28).transform([](int) { return 42; }); + EXPECT_TRUE(!o28r); + + const beman::optional::optional o32 = beman::optional::nullopt; + auto o32r = o32.transform([](int) { return 42; }); + EXPECT_TRUE(!o32r); + + const beman::optional::optional o36 = beman::optional::nullopt; + auto o36r = std::move(o36).transform([](int) { return 42; }); + EXPECT_TRUE(!o36r); + + // callable which returns a reference + beman::optional::optional o38 = fortytwo; + auto o38r = o38.transform([](int& i) -> const int& { return i; }); + EXPECT_TRUE(o38r); + EXPECT_TRUE(*o38r == 42); +} + +TEST(OptionalRefMonadicTest, TransformConstexpr) { + + // test each overload in turn + constexpr beman::optional::optional o16 = constexpr_fortytwo; + constexpr auto o16r = o16.transform(get_int); + static_assert(*o16r == 42); + + constexpr beman::optional::optional o20 = constexpr_fortytwo; + constexpr auto o20r = std::move(o20).transform(get_int); + static_assert(*o20r == 42); + + constexpr beman::optional::optional o32 = beman::optional::nullopt; + constexpr auto o32r = o32.transform(get_int); + static_assert(!o32r); + constexpr beman::optional::optional o36 = beman::optional::nullopt; + constexpr auto o36r = std::move(o36).transform(get_int); + static_assert(!o36r); +} + +TEST(OptionalRefMonadicTest, Transform2) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + int forty = 40; + beman::optional::optional o2 = forty; + auto o2r = o2.transform([](int i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42); + + struct rval_call_transform { + double operator()(int) && { return 42.0; }; + }; + + // ensure that function object is forwarded + int fortytwo = 42; + beman::optional::optional o3 = fortytwo; + auto o3r = o3.transform(rval_call_transform{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o3r.value() == 42); + + // // ensure that lhs is forwarded + // int forty = 40; + // beman::optional::optional o4 = forty; + // auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); + // static_assert((std::is_same>::value)); + // EXPECT_TRUE(o4r.value() == 42); + + // ensure that lhs is const-propagated + forty = 40; + const beman::optional::optional o5 = forty; + auto o5r = o5.transform([](const int& i) { return i + 2; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // test each overload in turn + fortytwo = 42; + beman::optional::optional o8 = fortytwo; + auto o8r = o8.transform([](int) { return 42; }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o12 = fortytwo; + auto o12r = std::move(o12).transform([](int) { return 42; }); + EXPECT_TRUE(*o12r == 42); + + const beman::optional::optional o16 = fortytwo; + auto o16r = o16.transform([](int) { return 42; }); + EXPECT_TRUE(*o16r == 42); + + const beman::optional::optional o20 = fortytwo; + auto o20r = std::move(o20).transform([](int) { return 42; }); + EXPECT_TRUE(*o20r == 42); + + beman::optional::optional o24 = beman::optional::nullopt; + auto o24r = o24.transform([](int) { return 42; }); + EXPECT_TRUE(!o24r); + + beman::optional::optional o28 = beman::optional::nullopt; + auto o28r = std::move(o28).transform([](int) { return 42; }); + EXPECT_TRUE(!o28r); + + const beman::optional::optional o32 = beman::optional::nullopt; + auto o32r = o32.transform([](int) { return 42; }); + EXPECT_TRUE(!o32r); + + const beman::optional::optional o36 = beman::optional::nullopt; + auto o36r = std::move(o36).transform([](int) { return 42; }); + EXPECT_TRUE(!o36r); +} + +TEST(OptionalRefMonadicTest, TransformConstxpr) { + // test each overload in turn + constexpr beman::optional::optional o16 = constexpr_fortytwo; + constexpr auto o16r = o16.transform(get_int); + static_assert(*o16r == 42); + + constexpr beman::optional::optional o20 = constexpr_fortytwo; + constexpr auto o20r = std::move(o20).transform(get_int); + static_assert(*o20r == 42); + + constexpr beman::optional::optional o32 = beman::optional::nullopt; + constexpr auto o32r = o32.transform(get_int); + static_assert(!o32r); + constexpr beman::optional::optional o36 = beman::optional::nullopt; + constexpr auto o36r = std::move(o36).transform(get_int); + static_assert(!o36r); +} + +TEST(OptionalRefMonadicTest, and_then) { + // lhs is empty + beman::optional::optional o1; + auto o1r = o1.and_then([](int) { return beman::optional::optional{42}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o1r); + + // lhs has value + int twelve = 12; + beman::optional::optional o2 = twelve; + auto o2r = o2.and_then([](int) { return beman::optional::optional{42}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o2r.value() == 42.f); + + // lhs is empty, rhs returns empty + beman::optional::optional o3; + auto o3r = o3.and_then([](int) { return beman::optional::optional{}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o3r); + + // rhs returns empty + beman::optional::optional o4 = twelve; + auto o4r = o4.and_then([](int) { return beman::optional::optional{}; }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(!o4r); + + struct rval_call_and_then { + beman::optional::optional operator()(int) && { return beman::optional::optional(42.0); }; + }; + + // ensure that function object is forwarded + int fortytwo = 42; + beman::optional::optional o5 = fortytwo; + auto o5r = o5.and_then(rval_call_and_then{}); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o5r.value() == 42); + + // // ensure that lhs is forwarded + // beman::optional::optional o6 = fortytwo; + // auto o6r = + // std::move(o6).and_then([](int &&i) { return beman::optional::optional(i); }); + // static_assert((std::is_same>::value)); + // EXPECT_TRUE(o6r.value() == 42); + + // ensure that function object is const-propagated + const beman::optional::optional o7 = fortytwo; + auto o7r = o7.and_then([](const int& i) { return beman::optional::optional(i); }); + static_assert((std::is_same>::value)); + EXPECT_TRUE(o7r.value() == 42); + + // test each overload in turn + beman::optional::optional o8 = fortytwo; + auto o8r = o8.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o8r == 42); + + beman::optional::optional o9 = fortytwo; + auto o9r = std::move(o9).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o9r == 42); + + const beman::optional::optional o10 = fortytwo; + auto o10r = o10.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o10r == 42); + + const beman::optional::optional o11 = fortytwo; + auto o11r = std::move(o11).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(*o11r == 42); + + beman::optional::optional o16 = beman::optional::nullopt; + auto o16r = o16.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o16r); + + beman::optional::optional o17 = beman::optional::nullopt; + auto o17r = std::move(o17).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o17r); + + const beman::optional::optional o18 = beman::optional::nullopt; + auto o18r = o18.and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o18r); + + const beman::optional::optional o19 = beman::optional::nullopt; + auto o19r = std::move(o19).and_then([](int) { return beman::optional::make_optional(42); }); + EXPECT_TRUE(!o19r); + + int i = 3; + beman::optional::optional o20{i}; + std::move(o20).and_then([](int& r) { return beman::optional::optional{++r}; }); + EXPECT_TRUE(o20); + EXPECT_TRUE(i == 4); +} + +TEST(OptionalRefMonadicTest, Constexpr_and_then) { + constexpr beman::optional::optional o10 = constexpr_fortytwo; + constexpr auto o10r = o10.and_then(get_opt_int); + EXPECT_TRUE(*o10r == 42); + + constexpr beman::optional::optional o11 = constexpr_fortytwo; + constexpr auto o11r = std::move(o11).and_then(get_opt_int); + EXPECT_TRUE(*o11r == 42); + + constexpr beman::optional::optional o18 = beman::optional::nullopt; + constexpr auto o18r = o18.and_then(get_opt_int); + EXPECT_TRUE(!o18r); + + constexpr beman::optional::optional o19 = beman::optional::nullopt; + constexpr auto o19r = std::move(o19).and_then(get_opt_int); + EXPECT_TRUE(!o19r); +} + +TEST(OptionalRefMonadicTest, or_else) { + int fortytwo = 42; + int thirteen = 13; + beman::optional::optional o1 = fortytwo; + EXPECT_TRUE(*(o1.or_else([&] { return beman::optional::optional(thirteen); })) == 42); + + beman::optional::optional o2; + EXPECT_EQ(*(o2.or_else([&] { return beman::optional::optional(thirteen); })), 13); +} diff --git a/src/beman/optional26/tests/test_constructor_fail.cpp b/src/beman/optional/tests/test_constructor_fail.cpp similarity index 100% rename from src/beman/optional26/tests/test_constructor_fail.cpp rename to src/beman/optional/tests/test_constructor_fail.cpp diff --git a/src/beman/optional26/tests/test_types.hpp b/src/beman/optional/tests/test_types.hpp similarity index 94% rename from src/beman/optional26/tests/test_types.hpp rename to src/beman/optional/tests/test_types.hpp index 184592d..8430853 100644 --- a/src/beman/optional26/tests/test_types.hpp +++ b/src/beman/optional/tests/test_types.hpp @@ -1,12 +1,12 @@ -// src/beman/optional26/tests/test_types.h -*-C++-*- +// src/beman/optional/tests/test_types.h -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#ifndef BEMAN_OPTIONAL26_TESTS_TEST_TYPES_HPP -#define BEMAN_OPTIONAL26_TESTS_TEST_TYPES_HPP +#ifndef BEMAN_OPTIONAL_TESTS_TEST_TYPES_HPP +#define BEMAN_OPTIONAL_TESTS_TEST_TYPES_HPP #include -namespace beman::optional26::tests { +namespace beman::optional::tests { // Classes used in the tests. // Empty class helper. @@ -109,6 +109,6 @@ struct explicitly_convertible_from_const_lvalue_only { explicit operator copyable_from_const_lvalue_only() const&& = delete; }; -} // namespace beman::optional26::tests +} // namespace beman::optional::tests -#endif // BEMAN_OPTIONAL26_TESTS_TEST_TYPES_HPP +#endif // BEMAN_OPTIONAL_TESTS_TEST_TYPES_HPP diff --git a/src/beman/optional/tests/test_utilities.hpp b/src/beman/optional/tests/test_utilities.hpp new file mode 100644 index 0000000..17ebb77 --- /dev/null +++ b/src/beman/optional/tests/test_utilities.hpp @@ -0,0 +1,15 @@ +// src/beman/optional/tests/test_utilities.hpp -*-C++-*- +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef BEMAN_OPTIONAL_TESTS_TEST_UTILITIES_HPP +#define BEMAN_OPTIONAL_TESTS_TEST_UTILITIES_HPP + +namespace beman::optional::tests { +/*** + * Evaluate and return an expression in a consteval context for testing + * constexpr correctness. + */ +auto consteval constify(auto expr) { return (expr); } +} // namespace beman::optional::tests + +#endif diff --git a/src/beman/optional26/tests/optional_monadic.t.cpp b/src/beman/optional26/tests/optional_monadic.t.cpp deleted file mode 100644 index f9da55e..0000000 --- a/src/beman/optional26/tests/optional_monadic.t.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// src/beman/optional26/tests/optional_monadic.t.cpp -*-C++-*- -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#include - -#include - -constexpr int get_int(int) { return 42; } -constexpr beman::optional26::optional get_opt_int(int) { return 42; } - -TEST(OptionalMonadicTest, Transform) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - beman::optional26::optional o2 = 40; - auto o2r = o2.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42); - - struct rval_call_transform { - double operator()(int) && { return 42.0; }; - }; - - // ensure that function object is forwarded - beman::optional26::optional o3 = 42; - auto o3r = o3.transform(rval_call_transform{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o3r.value() == 42); - - // ensure that lhs is forwarded - beman::optional26::optional o4 = 40; - auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o4r.value() == 42); - - // ensure that lhs is const-propagated - const beman::optional26::optional o5 = 40; - auto o5r = o5.transform([](const int& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // test each overload in turn - beman::optional26::optional o8 = 42; - auto o8r = o8.transform([](int) { return 42; }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o12 = 42; - auto o12r = std::move(o12).transform([](int) { return 42; }); - EXPECT_TRUE(*o12r == 42); - - const beman::optional26::optional o16 = 42; - auto o16r = o16.transform([](int) { return 42; }); - EXPECT_TRUE(*o16r == 42); - - const beman::optional26::optional o20 = 42; - auto o20r = std::move(o20).transform([](int) { return 42; }); - EXPECT_TRUE(*o20r == 42); - - beman::optional26::optional o24 = beman::optional26::nullopt; - auto o24r = o24.transform([](int) { return 42; }); - EXPECT_TRUE(!o24r); - - beman::optional26::optional o28 = beman::optional26::nullopt; - auto o28r = std::move(o28).transform([](int) { return 42; }); - EXPECT_TRUE(!o28r); - - const beman::optional26::optional o32 = beman::optional26::nullopt; - auto o32r = o32.transform([](int) { return 42; }); - EXPECT_TRUE(!o32r); - - const beman::optional26::optional o36 = beman::optional26::nullopt; - auto o36r = std::move(o36).transform([](int) { return 42; }); - EXPECT_TRUE(!o36r); - - // callable which returns a reference - beman::optional26::optional o38 = 42; - beman::optional26::optional o38r = o38.transform([](int& i) -> const int& { return i; }); - EXPECT_TRUE(o38r); - EXPECT_TRUE(*o38r == 42); -} - -TEST(OptionalMonadicTest, TransformConstexpr) { - // test each overload in turn - constexpr beman::optional26::optional o16 = 42; - constexpr auto o16r = o16.transform(get_int); - static_assert(*o16r == 42); - - constexpr beman::optional26::optional o20 = 42; - constexpr auto o20r = std::move(o20).transform(get_int); - static_assert(*o20r == 42); - - constexpr beman::optional26::optional o32 = beman::optional26::nullopt; - constexpr auto o32r = o32.transform(get_int); - static_assert(!o32r); - constexpr beman::optional26::optional o36 = beman::optional26::nullopt; - constexpr auto o36r = std::move(o36).transform(get_int); - static_assert(!o36r); -} - -TEST(OptionalMonadicTest, Transform2) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - beman::optional26::optional o2 = 40; - auto o2r = o2.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42); - - struct rval_call_transform { - double operator()(int) && { return 42.0; }; - }; - - // ensure that function object is forwarded - beman::optional26::optional o3 = 42; - auto o3r = o3.transform(rval_call_transform{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o3r.value() == 42); - - // ensure that lhs is forwarded - beman::optional26::optional o4 = 40; - auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o4r.value() == 42); - - // ensure that lhs is const-propagated - const beman::optional26::optional o5 = 40; - auto o5r = o5.transform([](const int& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // test each overload in turn - beman::optional26::optional o8 = 42; - auto o8r = o8.transform([](int) { return 42; }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o12 = 42; - auto o12r = std::move(o12).transform([](int) { return 42; }); - EXPECT_TRUE(*o12r == 42); - - const beman::optional26::optional o16 = 42; - auto o16r = o16.transform([](int) { return 42; }); - EXPECT_TRUE(*o16r == 42); - - const beman::optional26::optional o20 = 42; - auto o20r = std::move(o20).transform([](int) { return 42; }); - EXPECT_TRUE(*o20r == 42); - - beman::optional26::optional o24 = beman::optional26::nullopt; - auto o24r = o24.transform([](int) { return 42; }); - EXPECT_TRUE(!o24r); - - beman::optional26::optional o28 = beman::optional26::nullopt; - auto o28r = std::move(o28).transform([](int) { return 42; }); - EXPECT_TRUE(!o28r); - - const beman::optional26::optional o32 = beman::optional26::nullopt; - auto o32r = o32.transform([](int) { return 42; }); - EXPECT_TRUE(!o32r); - - const beman::optional26::optional o36 = beman::optional26::nullopt; - auto o36r = std::move(o36).transform([](int) { return 42; }); - EXPECT_TRUE(!o36r); -} - -TEST(OptionalMonadicTest, TransformConstxpr) { - // test each overload in turn - constexpr beman::optional26::optional o16 = 42; - constexpr auto o16r = o16.transform(get_int); - static_assert(*o16r == 42); - - constexpr beman::optional26::optional o20 = 42; - constexpr auto o20r = std::move(o20).transform(get_int); - static_assert(*o20r == 42); - - constexpr beman::optional26::optional o32 = beman::optional26::nullopt; - constexpr auto o32r = o32.transform(get_int); - static_assert(!o32r); - constexpr beman::optional26::optional o36 = beman::optional26::nullopt; - constexpr auto o36r = std::move(o36).transform(get_int); - static_assert(!o36r); -} - -TEST(OptionalMonadicTest, and_then) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.and_then([](int) { return beman::optional26::optional{42}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - beman::optional26::optional o2 = 12; - auto o2r = o2.and_then([](int) { return beman::optional26::optional{42}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42.f); - - // lhs is empty, rhs returns empty - beman::optional26::optional o3; - auto o3r = o3.and_then([](int) { return beman::optional26::optional{}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o3r); - - // rhs returns empty - beman::optional26::optional o4 = 12; - auto o4r = o4.and_then([](int) { return beman::optional26::optional{}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o4r); - - struct rval_call_and_then { - beman::optional26::optional operator()(int) && { return beman::optional26::optional(42.0); }; - }; - - // ensure that function object is forwarded - beman::optional26::optional o5 = 42; - auto o5r = o5.and_then(rval_call_and_then{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // ensure that lhs is forwarded - beman::optional26::optional o6 = 42; - auto o6r = std::move(o6).and_then([](int&& i) { return beman::optional26::optional(i); }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o6r.value() == 42); - - // ensure that function object is const-propagated - const beman::optional26::optional o7 = 42; - auto o7r = o7.and_then([](const int& i) { return beman::optional26::optional(i); }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o7r.value() == 42); - - // test each overload in turn - beman::optional26::optional o8 = 42; - auto o8r = o8.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o9 = 42; - auto o9r = std::move(o9).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o9r == 42); - - const beman::optional26::optional o10 = 42; - auto o10r = o10.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o10r == 42); - - const beman::optional26::optional o11 = 42; - auto o11r = std::move(o11).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o11r == 42); - - beman::optional26::optional o16 = beman::optional26::nullopt; - auto o16r = o16.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o16r); - - beman::optional26::optional o17 = beman::optional26::nullopt; - auto o17r = std::move(o17).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o17r); - - const beman::optional26::optional o18 = beman::optional26::nullopt; - auto o18r = o18.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o18r); - - const beman::optional26::optional o19 = beman::optional26::nullopt; - auto o19r = std::move(o19).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o19r); - - int i = 3; - beman::optional26::optional o20{i}; - std::move(o20).and_then([](int& r) { return beman::optional26::optional{++r}; }); - EXPECT_TRUE(o20); - EXPECT_TRUE(i == 4); -} - -TEST(OptionalMonadicTest, Constexpr_and_then) { - constexpr beman::optional26::optional o10 = 42; - constexpr auto o10r = o10.and_then(get_opt_int); - EXPECT_TRUE(*o10r == 42); - - constexpr beman::optional26::optional o11 = 42; - constexpr auto o11r = std::move(o11).and_then(get_opt_int); - EXPECT_TRUE(*o11r == 42); - - constexpr beman::optional26::optional o18 = beman::optional26::nullopt; - constexpr auto o18r = o18.and_then(get_opt_int); - EXPECT_TRUE(!o18r); - - constexpr beman::optional26::optional o19 = beman::optional26::nullopt; - constexpr auto o19r = std::move(o19).and_then(get_opt_int); - EXPECT_TRUE(!o19r); -} - -TEST(OptionalMonadicTest, or_else) { - beman::optional26::optional o1 = 42; - EXPECT_TRUE(*(o1.or_else([] { return beman::optional26::make_optional(13); })) == 42); - - beman::optional26::optional o2; - EXPECT_EQ(*(o2.or_else([] { return beman::optional26::make_optional(13); })), 13); - - /* - optional or_else(F&& f) && { - */ - EXPECT_TRUE(*(std::move(o1).or_else([] { return beman::optional26::make_optional(13); })) == 42); - EXPECT_EQ(*(std::move(o2).or_else([] { return beman::optional26::make_optional(13); })), 13); -} - -TEST(OptionalMonadicTest, Constexpr_or_else) { - constexpr beman::optional26::optional o1 = 42; - constexpr auto test = (*(o1.or_else([] { return beman::optional26::make_optional(13); })) == 42); - EXPECT_TRUE(test); - constexpr beman::optional26::optional o2; - constexpr auto test2 = *(o2.or_else([] { return beman::optional26::make_optional(13); })) == 13; - EXPECT_TRUE(test2); - - /* - optional or_else(F&& f) && { - */ - constexpr auto test3 = (*(std::move(o1).or_else([] { return beman::optional26::make_optional(13); })) == 42); - EXPECT_TRUE(test3); - constexpr auto test4 = *(std::move(o2).or_else([] { return beman::optional26::make_optional(13); })) == 13; - EXPECT_TRUE(test4); -} diff --git a/src/beman/optional26/tests/optional_ref_monadic.t.cpp b/src/beman/optional26/tests/optional_ref_monadic.t.cpp deleted file mode 100644 index 78858ef..0000000 --- a/src/beman/optional26/tests/optional_ref_monadic.t.cpp +++ /dev/null @@ -1,321 +0,0 @@ -// src/beman/optional26/tests/optional_ref_monadic.t.cpp -*-C++-*- -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#include - -#include - -namespace { -inline constexpr int constexpr_fortytwo = 42; -constexpr int get_int(int) { return constexpr_fortytwo; } -constexpr beman::optional26::optional get_opt_int(int) { return constexpr_fortytwo; } -} // namespace - -TEST(OptionalRefMonadicTest, Transform) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - int forty = 40; - beman::optional26::optional o2 = forty; - auto o2r = o2.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42); - - struct rval_call_transform { - double operator()(int) && { return 42.0; }; - }; - - // ensure that function object is forwarded - int fortytwo = 42; - beman::optional26::optional o3 = fortytwo; - auto o3r = o3.transform(rval_call_transform{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o3r.value() == 42); - - // // ensure that lhs is forwarded - // forty = 40; - // beman::optional26::optional o4 = forty; - // auto o4r = std::move(o4).transform([](int &&i) { return i + 2; }); - // static_assert((std::is_same>::value)); - // EXPECT_TRUE(o4r.value() == 42); - - // ensure that lhs is const-propagated - forty = 40; - const beman::optional26::optional o5 = forty; - auto o5r = o5.transform([](const int& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // test each overload in turn - fortytwo = 42; - beman::optional26::optional o8 = fortytwo; - auto o8r = o8.transform([](int) { return 42; }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o12 = fortytwo; - auto o12r = std::move(o12).transform([](int) { return 42; }); - EXPECT_TRUE(*o12r == 42); - - const beman::optional26::optional o16 = fortytwo; - auto o16r = o16.transform([](int) { return 42; }); - EXPECT_TRUE(*o16r == 42); - - const beman::optional26::optional o20 = fortytwo; - auto o20r = std::move(o20).transform([](int) { return 42; }); - EXPECT_TRUE(*o20r == 42); - - beman::optional26::optional o24 = beman::optional26::nullopt; - auto o24r = o24.transform([](int) { return 42; }); - EXPECT_TRUE(!o24r); - - beman::optional26::optional o28 = beman::optional26::nullopt; - auto o28r = std::move(o28).transform([](int) { return 42; }); - EXPECT_TRUE(!o28r); - - const beman::optional26::optional o32 = beman::optional26::nullopt; - auto o32r = o32.transform([](int) { return 42; }); - EXPECT_TRUE(!o32r); - - const beman::optional26::optional o36 = beman::optional26::nullopt; - auto o36r = std::move(o36).transform([](int) { return 42; }); - EXPECT_TRUE(!o36r); - - // callable which returns a reference - beman::optional26::optional o38 = fortytwo; - auto o38r = o38.transform([](int& i) -> const int& { return i; }); - EXPECT_TRUE(o38r); - EXPECT_TRUE(*o38r == 42); -} - -TEST(OptionalRefMonadicTest, TransformConstexpr) { - - // test each overload in turn - constexpr beman::optional26::optional o16 = constexpr_fortytwo; - constexpr auto o16r = o16.transform(get_int); - static_assert(*o16r == 42); - - constexpr beman::optional26::optional o20 = constexpr_fortytwo; - constexpr auto o20r = std::move(o20).transform(get_int); - static_assert(*o20r == 42); - - constexpr beman::optional26::optional o32 = beman::optional26::nullopt; - constexpr auto o32r = o32.transform(get_int); - static_assert(!o32r); - constexpr beman::optional26::optional o36 = beman::optional26::nullopt; - constexpr auto o36r = std::move(o36).transform(get_int); - static_assert(!o36r); -} - -TEST(OptionalRefMonadicTest, Transform2) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - int forty = 40; - beman::optional26::optional o2 = forty; - auto o2r = o2.transform([](int i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42); - - struct rval_call_transform { - double operator()(int) && { return 42.0; }; - }; - - // ensure that function object is forwarded - int fortytwo = 42; - beman::optional26::optional o3 = fortytwo; - auto o3r = o3.transform(rval_call_transform{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o3r.value() == 42); - - // // ensure that lhs is forwarded - // int forty = 40; - // beman::optional26::optional o4 = forty; - // auto o4r = std::move(o4).transform([](int&& i) { return i + 2; }); - // static_assert((std::is_same>::value)); - // EXPECT_TRUE(o4r.value() == 42); - - // ensure that lhs is const-propagated - forty = 40; - const beman::optional26::optional o5 = forty; - auto o5r = o5.transform([](const int& i) { return i + 2; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // test each overload in turn - fortytwo = 42; - beman::optional26::optional o8 = fortytwo; - auto o8r = o8.transform([](int) { return 42; }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o12 = fortytwo; - auto o12r = std::move(o12).transform([](int) { return 42; }); - EXPECT_TRUE(*o12r == 42); - - const beman::optional26::optional o16 = fortytwo; - auto o16r = o16.transform([](int) { return 42; }); - EXPECT_TRUE(*o16r == 42); - - const beman::optional26::optional o20 = fortytwo; - auto o20r = std::move(o20).transform([](int) { return 42; }); - EXPECT_TRUE(*o20r == 42); - - beman::optional26::optional o24 = beman::optional26::nullopt; - auto o24r = o24.transform([](int) { return 42; }); - EXPECT_TRUE(!o24r); - - beman::optional26::optional o28 = beman::optional26::nullopt; - auto o28r = std::move(o28).transform([](int) { return 42; }); - EXPECT_TRUE(!o28r); - - const beman::optional26::optional o32 = beman::optional26::nullopt; - auto o32r = o32.transform([](int) { return 42; }); - EXPECT_TRUE(!o32r); - - const beman::optional26::optional o36 = beman::optional26::nullopt; - auto o36r = std::move(o36).transform([](int) { return 42; }); - EXPECT_TRUE(!o36r); -} - -TEST(OptionalRefMonadicTest, TransformConstxpr) { - // test each overload in turn - constexpr beman::optional26::optional o16 = constexpr_fortytwo; - constexpr auto o16r = o16.transform(get_int); - static_assert(*o16r == 42); - - constexpr beman::optional26::optional o20 = constexpr_fortytwo; - constexpr auto o20r = std::move(o20).transform(get_int); - static_assert(*o20r == 42); - - constexpr beman::optional26::optional o32 = beman::optional26::nullopt; - constexpr auto o32r = o32.transform(get_int); - static_assert(!o32r); - constexpr beman::optional26::optional o36 = beman::optional26::nullopt; - constexpr auto o36r = std::move(o36).transform(get_int); - static_assert(!o36r); -} - -TEST(OptionalRefMonadicTest, and_then) { - // lhs is empty - beman::optional26::optional o1; - auto o1r = o1.and_then([](int) { return beman::optional26::optional{42}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o1r); - - // lhs has value - int twelve = 12; - beman::optional26::optional o2 = twelve; - auto o2r = o2.and_then([](int) { return beman::optional26::optional{42}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o2r.value() == 42.f); - - // lhs is empty, rhs returns empty - beman::optional26::optional o3; - auto o3r = o3.and_then([](int) { return beman::optional26::optional{}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o3r); - - // rhs returns empty - beman::optional26::optional o4 = twelve; - auto o4r = o4.and_then([](int) { return beman::optional26::optional{}; }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(!o4r); - - struct rval_call_and_then { - beman::optional26::optional operator()(int) && { return beman::optional26::optional(42.0); }; - }; - - // ensure that function object is forwarded - int fortytwo = 42; - beman::optional26::optional o5 = fortytwo; - auto o5r = o5.and_then(rval_call_and_then{}); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o5r.value() == 42); - - // // ensure that lhs is forwarded - // beman::optional26::optional o6 = fortytwo; - // auto o6r = - // std::move(o6).and_then([](int &&i) { return beman::optional26::optional(i); }); - // static_assert((std::is_same>::value)); - // EXPECT_TRUE(o6r.value() == 42); - - // ensure that function object is const-propagated - const beman::optional26::optional o7 = fortytwo; - auto o7r = o7.and_then([](const int& i) { return beman::optional26::optional(i); }); - static_assert((std::is_same>::value)); - EXPECT_TRUE(o7r.value() == 42); - - // test each overload in turn - beman::optional26::optional o8 = fortytwo; - auto o8r = o8.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o8r == 42); - - beman::optional26::optional o9 = fortytwo; - auto o9r = std::move(o9).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o9r == 42); - - const beman::optional26::optional o10 = fortytwo; - auto o10r = o10.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o10r == 42); - - const beman::optional26::optional o11 = fortytwo; - auto o11r = std::move(o11).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(*o11r == 42); - - beman::optional26::optional o16 = beman::optional26::nullopt; - auto o16r = o16.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o16r); - - beman::optional26::optional o17 = beman::optional26::nullopt; - auto o17r = std::move(o17).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o17r); - - const beman::optional26::optional o18 = beman::optional26::nullopt; - auto o18r = o18.and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o18r); - - const beman::optional26::optional o19 = beman::optional26::nullopt; - auto o19r = std::move(o19).and_then([](int) { return beman::optional26::make_optional(42); }); - EXPECT_TRUE(!o19r); - - int i = 3; - beman::optional26::optional o20{i}; - std::move(o20).and_then([](int& r) { return beman::optional26::optional{++r}; }); - EXPECT_TRUE(o20); - EXPECT_TRUE(i == 4); -} - -TEST(OptionalRefMonadicTest, Constexpr_and_then) { - constexpr beman::optional26::optional o10 = constexpr_fortytwo; - constexpr auto o10r = o10.and_then(get_opt_int); - EXPECT_TRUE(*o10r == 42); - - constexpr beman::optional26::optional o11 = constexpr_fortytwo; - constexpr auto o11r = std::move(o11).and_then(get_opt_int); - EXPECT_TRUE(*o11r == 42); - - constexpr beman::optional26::optional o18 = beman::optional26::nullopt; - constexpr auto o18r = o18.and_then(get_opt_int); - EXPECT_TRUE(!o18r); - - constexpr beman::optional26::optional o19 = beman::optional26::nullopt; - constexpr auto o19r = std::move(o19).and_then(get_opt_int); - EXPECT_TRUE(!o19r); -} - -TEST(OptionalRefMonadicTest, or_else) { - int fortytwo = 42; - int thirteen = 13; - beman::optional26::optional o1 = fortytwo; - EXPECT_TRUE(*(o1.or_else([&] { return beman::optional26::optional(thirteen); })) == 42); - - beman::optional26::optional o2; - EXPECT_EQ(*(o2.or_else([&] { return beman::optional26::optional(thirteen); })), 13); -} diff --git a/src/beman/optional26/tests/test_utilities.hpp b/src/beman/optional26/tests/test_utilities.hpp deleted file mode 100644 index 9cc9828..0000000 --- a/src/beman/optional26/tests/test_utilities.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// src/beman/optional26/tests/test_utilities.hpp -*-C++-*- -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#ifndef BEMAN_OPTIONAL26_TESTS_TEST_UTILITIES_HPP -#define BEMAN_OPTIONAL26_TESTS_TEST_UTILITIES_HPP - -namespace beman::optional26::tests { -/*** - * Evaluate and return an expression in a consteval context for testing - * constexpr correctness. - */ -auto consteval constify(auto expr) { return (expr); } -} // namespace beman::optional26::tests - -#endif