From dc4bd89931e7d304be52dcdef81b06d57c8847af Mon Sep 17 00:00:00 2001 From: Edward Nolan Date: Sun, 13 Jul 2025 10:04:03 -0400 Subject: [PATCH] Add pre-commit configuration from exemplar Adds checks such as trailing whitespace fixes, clang-format, CMake linting, and spell checking. Also addresses the fact that CI is currently failing for the main branch because it expects a .pre-commit-config.yaml file. --- .pre-commit-config.yaml | 41 +++++++++++ CMakeLists.txt | 24 ++++--- bin/mk-compiler-explorer.py | 2 +- bin/update-cmake-headers.py | 2 +- etc/ci-clang-toolchain.cmake | 42 ++++++++++-- etc/clang-flags.cmake | 42 ++++++++++-- etc/gcc-flags.cmake | 39 ++++++++--- etc/gcc-toolchain.cmake | 42 ++++++++++-- etc/llvm-16-toolchain.cmake | 42 ++++++++++-- etc/llvm-master-toolchain.cmake | 49 ++++++++++--- etc/llvm-toolchain.cmake | 42 ++++++++++-- examples/CMakeLists.txt | 26 +++---- examples/client.cpp | 2 +- examples/empty.cpp | 2 +- examples/http-munich.cpp | 28 ++++---- examples/munich.cpp | 34 ++++----- include/beman/net/detail/container.hpp | 2 +- include/beman/net/detail/internet.hpp | 2 +- src/beman/net/CMakeLists.txt | 95 ++++++++++++++------------ tests/beman/net/CMakeLists.txt | 4 +- 20 files changed, 400 insertions(+), 162 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..840c78e --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,41 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + + # Clang-format for C++ + # This brings in a portable version of clang-format. + # See also: https://github.com/ssciwr/clang-format-wheel + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v20.1.7 + hooks: + - id: clang-format + types_or: [c++, c] + + # CMake linting and formatting + - repo: https://github.com/BlankSpruce/gersemi + rev: 0.15.1 + hooks: + - id: gersemi + name: CMake linting + + # Markdown linting + # Config file: .markdownlint.yaml + # Commented out to disable this by default. Uncomment to enable markdown linting. + # - repo: https://github.com/igorshubovych/markdownlint-cli + # rev: v0.42.0 + # hooks: + # - id: markdownlint + + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + +exclude: 'cookiecutter/' diff --git a/CMakeLists.txt b/CMakeLists.txt index ea07ff4..b2fd1a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,8 +22,8 @@ FetchContent_MakeAvailable(execution) include(CTest) if(BUILD_TESTING) - add_subdirectory(tests/beman/${TARGET_NAME}) - enable_testing() + add_subdirectory(tests/beman/${TARGET_NAME}) + enable_testing() endif() add_subdirectory(src/beman/${TARGET_NAME}) @@ -36,16 +36,20 @@ set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake) include(CMakePackageConfigHelpers) write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion) + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) configure_package_config_file( - "cmake/Config.cmake.in" - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake - INSTALL_DESTINATION ${INSTALL_CONFIGDIR}) + "cmake/Config.cmake.in" + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake + INSTALL_DESTINATION ${INSTALL_CONFIGDIR} +) install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake + FILES + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake - DESTINATION ${INSTALL_CONFIGDIR}) + DESTINATION ${INSTALL_CONFIGDIR} +) diff --git a/bin/mk-compiler-explorer.py b/bin/mk-compiler-explorer.py index 6372f0c..d355fc5 100755 --- a/bin/mk-compiler-explorer.py +++ b/bin/mk-compiler-explorer.py @@ -74,7 +74,7 @@ def build_header(file, to, header): for new in dependencies[todo[0]]: todo.append(new) todo = todo[1:] - + while 0 < len(deps): empty = [item for item in deps.keys() if 0 == len(deps[item])] for e in empty: diff --git a/bin/update-cmake-headers.py b/bin/update-cmake-headers.py index 6f305b6..b20fbb3 100755 --- a/bin/update-cmake-headers.py +++ b/bin/update-cmake-headers.py @@ -57,4 +57,4 @@ def get_headers(dir): output.write(f' {project}/include/{header}.hpp\n') else: output.write(line) - pass \ No newline at end of file + pass diff --git a/etc/ci-clang-toolchain.cmake b/etc/ci-clang-toolchain.cmake index 75531ee..8158594 100755 --- a/etc/ci-clang-toolchain.cmake +++ b/etc/ci-clang-toolchain.cmake @@ -4,13 +4,41 @@ set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_FLAGS - "-std=c++20 \ + "-std=c++20 \ -Wall -Wextra \ -stdlib=libc++ -fexperimental-library" -CACHE STRING "CXX_FLAGS" FORCE) + CACHE STRING + "CXX_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/clang-flags.cmake b/etc/clang-flags.cmake index fdb64dc..44733e3 100644 --- a/etc/clang-flags.cmake +++ b/etc/clang-flags.cmake @@ -3,11 +3,39 @@ include_guard(GLOBAL) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_FLAGS - "-stdlib=libc++ -Wall -Wextra " -CACHE STRING "CXX_FLAGS" FORCE) + "-stdlib=libc++ -Wall -Wextra " + CACHE STRING + "CXX_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/gcc-flags.cmake b/etc/gcc-flags.cmake index 60d6f63..e7065fa 100644 --- a/etc/gcc-flags.cmake +++ b/etc/gcc-flags.cmake @@ -2,12 +2,35 @@ include_guard(GLOBAL) set(CMAKE_CXX_STANDARD 23) -set(CMAKE_CXX_FLAGS - "-std=c++23 -Wall -Wextra " -CACHE STRING "CXX_FLAGS" FORCE) +set(CMAKE_CXX_FLAGS "-std=c++23 -Wall -Wextra " CACHE STRING "CXX_FLAGS" FORCE) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=undefined" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=undefined" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/gcc-toolchain.cmake b/etc/gcc-toolchain.cmake index ab7ec45..1513150 100755 --- a/etc/gcc-toolchain.cmake +++ b/etc/gcc-toolchain.cmake @@ -4,12 +4,40 @@ set(CMAKE_C_COMPILER gcc) set(CMAKE_CXX_COMPILER g++) set(CMAKE_CXX_FLAGS - "-std=c++20 \ + "-std=c++20 \ -Wall -Wextra " -CACHE STRING "CXX_FLAGS" FORCE) + CACHE STRING + "CXX_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/llvm-16-toolchain.cmake b/etc/llvm-16-toolchain.cmake index ce7beeb..317eb15 100755 --- a/etc/llvm-16-toolchain.cmake +++ b/etc/llvm-16-toolchain.cmake @@ -4,13 +4,41 @@ set(CMAKE_C_COMPILER clang-16) set(CMAKE_CXX_COMPILER clang++-16) set(CMAKE_CXX_FLAGS - "-std=c++20 \ + "-std=c++20 \ -Wall -Wextra \ -stdlib=libc++ -fexperimental-library" -CACHE STRING "CXX_FLAGS" FORCE) + CACHE STRING + "CXX_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/llvm-master-toolchain.cmake b/etc/llvm-master-toolchain.cmake index cc09e50..9f1ff60 100644 --- a/etc/llvm-master-toolchain.cmake +++ b/etc/llvm-master-toolchain.cmake @@ -4,17 +4,48 @@ set(CMAKE_C_COMPILER ${LLVM_ROOT}/bin/clang) set(CMAKE_CXX_COMPILER ${LLVM_ROOT}/bin/clang++) set(CMAKE_CXX_FLAGS - "-std=c++2a \ + "-std=c++2a \ -Wall -Wextra \ -stdlib=libc++ " -CACHE STRING "CXX_FLAGS" FORCE) + CACHE STRING + "CXX_FLAGS" + FORCE +) set(CMAKE_EXE_LINKER_FLAGS - "-Wl,-rpath,${LLVM_ROOT}/lib" -CACHE STRING "CMAKE_EXE_LINKER_FLAGS" FORCE) + "-Wl,-rpath,${LLVM_ROOT}/lib" + CACHE STRING + "CMAKE_EXE_LINKER_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/etc/llvm-toolchain.cmake b/etc/llvm-toolchain.cmake index 5bd9225..b0cbfbd 100755 --- a/etc/llvm-toolchain.cmake +++ b/etc/llvm-toolchain.cmake @@ -4,13 +4,41 @@ set(CMAKE_C_COMPILER clang-14) set(CMAKE_CXX_COMPILER clang++-14) set(CMAKE_CXX_FLAGS - "-std=c++20 \ + "-std=c++20 \ -Wall -Wextra \ -stdlib=libstdc++ " -CACHE STRING "CXX_FLAGS" FORCE) + CACHE STRING + "CXX_FLAGS" + FORCE +) -set(CMAKE_CXX_FLAGS_DEBUG "-O0 -fno-inline -g3" CACHE STRING "C++ DEBUG Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -g0 -DNDEBUG" CACHE STRING "C++ Release Flags" FORCE) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG" CACHE STRING "C++ RelWithDebInfo Flags" FORCE) -set(CMAKE_CXX_FLAGS_TSAN "-O3 -g -DNDEBUG -fsanitize=thread" CACHE STRING "C++ TSAN Flags" FORCE) -set(CMAKE_CXX_FLAGS_ASAN "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" CACHE STRING "C++ ASAN Flags" FORCE) +set(CMAKE_CXX_FLAGS_DEBUG + "-O0 -fno-inline -g3" + CACHE STRING + "C++ DEBUG Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELEASE + "-Ofast -g0 -DNDEBUG" + CACHE STRING + "C++ Release Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO + "-O3 -g -DNDEBUG" + CACHE STRING + "C++ RelWithDebInfo Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_TSAN + "-O3 -g -DNDEBUG -fsanitize=thread" + CACHE STRING + "C++ TSAN Flags" + FORCE +) +set(CMAKE_CXX_FLAGS_ASAN + "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" + CACHE STRING + "C++ ASAN Flags" + FORCE +) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b4ac76f..f84408e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,20 +4,20 @@ # cmake-format: on set(EXAMPLES - client - cppcon-2024 - empty - http-server - milano - http-munich - server - task + client + cppcon-2024 + empty + http-server + milano + http-munich + server + task ) foreach(EXAMPLE ${EXAMPLES}) - set(EXAMPLE_TARGET ${TARGET_PREFIX}.examples.${EXAMPLE}) - add_executable(${EXAMPLE_TARGET}) - target_sources(${EXAMPLE_TARGET} PRIVATE ${EXAMPLE}.cpp) - target_link_libraries(${EXAMPLE_TARGET} PRIVATE ${TARGET_LIBRARY}) - target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::execution) + set(EXAMPLE_TARGET ${TARGET_PREFIX}.examples.${EXAMPLE}) + add_executable(${EXAMPLE_TARGET}) + target_sources(${EXAMPLE_TARGET} PRIVATE ${EXAMPLE}.cpp) + target_link_libraries(${EXAMPLE_TARGET} PRIVATE ${TARGET_LIBRARY}) + target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::execution) endforeach() diff --git a/examples/client.cpp b/examples/client.cpp index 23ef1d7..d145cf6 100644 --- a/examples/client.cpp +++ b/examples/client.cpp @@ -43,7 +43,7 @@ auto main() -> int { scope.spawn(std::invoke( [](auto& ctxt, auto stp) -> demo::task<> { - on_exit msg("timer task (enqueing stop task) - done"); + on_exit msg("timer task (enqueuing stop task) - done"); co_await net::resume_after(ctxt.get_scheduler(), 1s); stp(); }, diff --git a/examples/empty.cpp b/examples/empty.cpp index 1e2490d..862272a 100644 --- a/examples/empty.cpp +++ b/examples/empty.cpp @@ -28,7 +28,7 @@ std::unordered_map files{ }; auto main() -> int { - net::io_context context; + net::io_context context; net::ip::tcp::endpoint ep(net::ip::address_v4::any(), 12345); net::ip::tcp::acceptor server(context, ep); diff --git a/examples/http-munich.cpp b/examples/http-munich.cpp index 1edf0a0..c9e3709 100644 --- a/examples/http-munich.cpp +++ b/examples/http-munich.cpp @@ -28,26 +28,22 @@ std::unordered_map files{ }; auto timeout(auto scheduler, auto&& dur, auto&& sender) { - return demo::when_any( - std::forward(sender), - net::resume_after(scheduler, dur) | ex::then([]{ return std::size_t(0); }) - ); + return demo::when_any(std::forward(sender), + net::resume_after(scheduler, dur) | ex::then([] { return std::size_t(0); })); } demo::task<> run_client(auto scheduler, auto stream) { std::cout << "started client\n"; char buffer[1000]; - while (std::size_t n = co_await - timeout(scheduler, 3s, net::async_receive(stream, net::buffer(buffer))) - ) { + while (std::size_t n = co_await timeout(scheduler, 3s, net::async_receive(stream, net::buffer(buffer)))) { std::string request(buffer, n); - //std::cout << "received='" << request << "'\n"; + // std::cout << "received='" << request << "'\n"; std::istringstream in(request); - std::string method, url, version; + std::string method, url, version; if ((in >> method >> url >> version) && method == "GET" && files.contains(url)) { - //std::cout << "requesting url='" << url << "'\n"; - std::ifstream in(files[url], std::ios::binary); - std::ostringstream out; + // std::cout << "requesting url='" << url << "'\n"; + std::ifstream in(files[url], std::ios::binary); + std::ostringstream out; out << in.rdbuf(); std::string data(out.str()); @@ -66,15 +62,15 @@ demo::task<> run_client(auto scheduler, auto stream) { auto main() -> int { std::cout << std::unitbuf; - net::io_context context{}; + net::io_context context{}; net::ip::tcp::endpoint ep(net::ip::address_v4::any(), 12345); net::ip::tcp::acceptor server(context, ep); - demo::scope scope; + demo::scope scope; - scope.spawn([](auto& srv, auto& sc, auto scheduler)->demo::task<>{ + scope.spawn([](auto& srv, auto& sc, auto scheduler) -> demo::task<> { while (true) { std::cout << "ready to receive a client\n"; - auto[client, addr] = co_await net::async_accept(srv); + auto [client, addr] = co_await net::async_accept(srv); std::cout << "received connection from " << addr << "\n"; sc.spawn(run_client(scheduler, std::move(client))); } diff --git a/examples/munich.cpp b/examples/munich.cpp index 539fe0f..d7a113d 100644 --- a/examples/munich.cpp +++ b/examples/munich.cpp @@ -28,26 +28,21 @@ std::unordered_map files{ }; auto timeout(ex::scheduler auto scheduler, auto dur, ex::sender auto sender) { - return demo::when_any( - std::move(sender), - net::resume_after(scheduler, dur) - | ex::then([]{ return std::size_t(); }) - //| ex::let_value([]{ return ex::just_stopped(); }) + return demo::when_any(std::move(sender), net::resume_after(scheduler, dur) | ex::then([] { return std::size_t(); }) + //| ex::let_value([]{ return ex::just_stopped(); }) ); } -demo::task<> run_client(auto client, auto scheduler) -{ +demo::task<> run_client(auto client, auto scheduler) { std::cout << "new client\n"; char buffer[10000]; while (std::size_t n = co_await timeout(scheduler, 3s, net::async_receive(client, net::buffer(buffer)))) { - std::string request(buffer, n); + std::string request(buffer, n); std::istringstream in(request); - std::string method, url, version; - if ((in >> method >> url >> version) && method == "GET" - && files.contains(url)) { + std::string method, url, version; + if ((in >> method >> url >> version) && method == "GET" && files.contains(url)) { std::cout << "requesting '" << url << "'\n"; - std::ifstream fin(files[url]); + std::ifstream fin(files[url]); std::ostringstream out; out << fin.rdbuf(); auto data = out.str(); @@ -55,7 +50,8 @@ demo::task<> run_client(auto client, auto scheduler) out.str(std::string()); out << "HTTP/1.1 200\r\n" << "Content-Length: " << data.size() << "\r\n" - << "\r\n" << data; + << "\r\n" + << data; auto response = out.str(); co_await net::async_send(client, net::buffer(response)); } @@ -65,19 +61,19 @@ demo::task<> run_client(auto client, auto scheduler) auto main() -> int { std::cout << std::unitbuf; - net::io_context context; + net::io_context context; net::ip::tcp::endpoint ep(net::ip::address_v4::any(), 12345); net::ip::tcp::acceptor server(context, ep); - demo::scope scope; + demo::scope scope; - scope.spawn([](auto& srv, auto& sc, auto sched)->demo::task<> { + scope.spawn([](auto& srv, auto& sc, auto sched) -> demo::task<> { while (true) { - std::cout << "awaiting a connetion\n"; - auto[client, addr] = co_await net::async_accept(srv); + std::cout << "awaiting a connection\n"; + auto [client, addr] = co_await net::async_accept(srv); std::cout << "receiver connection from " << addr << "\n"; sc.spawn(run_client(std::move(client), sched)); } }(server, scope, context.get_scheduler())); - + context.run(); } diff --git a/include/beman/net/detail/container.hpp b/include/beman/net/detail/container.hpp index 9585fdb..f6689a3 100644 --- a/include/beman/net/detail/container.hpp +++ b/include/beman/net/detail/container.hpp @@ -57,4 +57,4 @@ inline auto beman::net::detail::container::operator[](::beman::net::deta // ---------------------------------------------------------------------------- -#endif \ No newline at end of file +#endif diff --git a/include/beman/net/detail/internet.hpp b/include/beman/net/detail/internet.hpp index 7e3d451..e11130d 100644 --- a/include/beman/net/detail/internet.hpp +++ b/include/beman/net/detail/internet.hpp @@ -261,7 +261,7 @@ class beman::net::ip::basic_endpoint : public ::beman::net::detail::endpoint { return ::beman::net::ip::address_v4( ntohl(reinterpret_cast(this->storage()).sin_addr.s_addr)); //-dk:TODO case PF_INET6: return ::beman::net::ip::address_v6(reinterpret_cast<::sockaddr_in6 - //const&>(this->storage()).sin6_addr.s_addr); + // const&>(this->storage()).sin6_addr.s_addr); } } auto address(const ::beman::net::ip::address&) noexcept -> void; diff --git a/src/beman/net/CMakeLists.txt b/src/beman/net/CMakeLists.txt index f67869a..1076d0b 100644 --- a/src/beman/net/CMakeLists.txt +++ b/src/beman/net/CMakeLists.txt @@ -6,41 +6,46 @@ add_library(${TARGET_LIBRARY} STATIC) add_library(${TARGET_ALIAS} ALIAS ${TARGET_LIBRARY}) -target_sources(${TARGET_LIBRARY} - PRIVATE - net.cpp +target_sources( + ${TARGET_LIBRARY} + PRIVATE net.cpp PUBLIC - FILE_SET ${TARGET_LIBRARY}_public_headers TYPE HEADERS - BASE_DIRS ${PROJECT_SOURCE_DIR}/include - FILES - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/net.hpp + FILE_SET ${TARGET_LIBRARY}_public_headers + TYPE HEADERS + BASE_DIRS ${PROJECT_SOURCE_DIR}/include + FILES ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/net.hpp PUBLIC - FILE_SET ${TARGET_LIBRARY}_detail_headers TYPE HEADERS - BASE_DIRS ${PROJECT_SOURCE_DIR}/include - FILES - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket_acceptor.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_stream_socket.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/buffer.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/container.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/context_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/endpoint.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/execution.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/internet.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context_scheduler.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/netfwd.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/operations.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/poll_context.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sender.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_base.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_category.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sorted_list.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/stop_token.hpp - ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/timer.hpp + FILE_SET ${TARGET_LIBRARY}_detail_headers + TYPE HEADERS + BASE_DIRS ${PROJECT_SOURCE_DIR}/include + FILES + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_socket_acceptor.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/basic_stream_socket.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/buffer.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/container.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/context_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/endpoint.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/execution.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/internet.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/io_context_scheduler.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/netfwd.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/operations.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/poll_context.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sender.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_base.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/socket_category.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/sorted_list.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/stop_token.hpp + ${PROJECT_SOURCE_DIR}/include/beman/${TARGET_NAME}/detail/timer.hpp +) +get_property( + DETAIL_HEADER_FILES + TARGET ${TARGET_LIBRARY} + PROPERTY HEADER_SET_${TARGET_LIBRARY}_detail_headers ) -get_property(DETAIL_HEADER_FILES TARGET ${TARGET_LIBRARY} PROPERTY HEADER_SET_${TARGET_LIBRARY}_detail_headers) source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) include(GNUInstallDirs) @@ -49,19 +54,23 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) string(TOLOWER ${CMAKE_PROJECT_NAME} CMAKE_LOWER_PROJECT_NAME) install( - TARGETS ${TARGET_LIBRARY} - EXPORT ${TARGETS_EXPORT_NAME} - ARCHIVE DESTINATION lib/$ - FILE_SET ${TARGET_LIBRARY}_public_headers - FILE_SET ${TARGET_LIBRARY}_detail_headers + TARGETS ${TARGET_LIBRARY} + EXPORT ${TARGETS_EXPORT_NAME} + ARCHIVE DESTINATION lib/$ + FILE_SET ${TARGET_LIBRARY}_public_headers + FILE_SET ${TARGET_LIBRARY}_detail_headers +) +target_include_directories( + ${TARGET_LIBRARY} + PUBLIC $ ) -target_include_directories(${TARGET_LIBRARY} PUBLIC $) target_link_libraries(${TARGET_LIBRARY} PUBLIC beman::execution) if(FALSE) -install(EXPORT ${TARGETS_EXPORT_NAME} - FILE ${TARGET_LIBRARY}-config.cmake - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_LIBRARY}" - NAMESPACE ${TARGET_LIBRARY}:: -) + install( + EXPORT ${TARGETS_EXPORT_NAME} + FILE ${TARGET_LIBRARY}-config.cmake + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${TARGET_LIBRARY}" + NAMESPACE ${TARGET_LIBRARY}:: + ) endif() diff --git a/tests/beman/net/CMakeLists.txt b/tests/beman/net/CMakeLists.txt index b99c827..8c9e744 100644 --- a/tests/beman/net/CMakeLists.txt +++ b/tests/beman/net/CMakeLists.txt @@ -3,9 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # cmake-format: on -list(APPEND tests - sorted_list.pass -) +list(APPEND tests sorted_list.pass) foreach(test ${tests}) add_executable(${test} ${test}.cpp)