Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Subproject support #21

Merged
merged 7 commits into from
Sep 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ cmake_minimum_required(VERSION 3.23)

project(beman_execution26 VERSION 0.0.0 LANGUAGES CXX)

enable_testing()
if(PROJECT_IS_TOP_LEVEL)
enable_testing()
endif()

set(CMAKE_CXX_STANDARD 23)
set(TARGETS_EXPORT_NAME ${CMAKE_PROJECT_NAME}Targets)
Expand Down
27 changes: 20 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,25 @@
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

SANITIZERS = none debug msan asan usan tsan
.PHONY: default update check ce todo distclean clean build test all $(SANITIZERS)
.PHONY: default run update check ce todo distclean clean build test all $(SANITIZERS)

COMPILER=system
CXX_BASE=$(CXX:$(dir $(CXX))%=%)
ifeq ($(CXX_BASE),g++)
COMPILER=gcc
endif
ifeq ($(CXX_BASE),clang++)
COMPILER=clang
endif

CXX_FLAGS = -g
SANITIZER = none
SOURCEDIR = $(shell pwd)
BUILDROOT = build
BUILD = $(BUILDROOT)/$(SANITIZER)
BUILD = $(BUILDROOT)/$(COMPILER)/$(SANITIZER)
EXAMPLE = stop_token
CMAKE_C_COMPILER=$(COMPILER)
CMAKE_CXX_COMPILER=$(COMPILER)

ifeq ($(SANITIZER),none)
CXX_FLAGS = -O3 -pedantic -Wall -Wextra -Werror
Expand Down Expand Up @@ -41,17 +54,17 @@ default: test

all: $(SANITIZERS)

run: build
./$(BUILD)/examples/$(EXAMPLE)

none: test

$(SANITIZERS):
$(MAKE) SANITIZER=$@

SYSROOT = -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.sdk
# TOOLCHAIN = -DCMAKE_TOOLCHAIN_FILE=$(CURDIR)/etc/gcc-toolchain.cmake

build:
@mkdir -p $(BUILD)
cd $(BUILD); CC=$(CXX) cmake ../.. $(TOOLCHAIN) $(SYSROOT) -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)"
cd $(BUILD); CC=$(CXX) cmake $(SOURCEDIR) $(TOOLCHAIN) $(SYSROOT) -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)"
cmake --build $(BUILD)

test: build
Expand All @@ -61,7 +74,7 @@ ce:
@mkdir -p $(BUILD)
bin/mk-compiler-explorer.py $(BUILD)

SOURCE_CMAKELISTS = src/beman/execution26/CMakeLists.txt
SOURCE_CMAKELISTS = src/beman/net29/CMakeLists.txt
update:
bin/update-cmake-headers.py $(SOURCE_CMAKELISTS)

Expand Down
9 changes: 6 additions & 3 deletions include/beman/execution26/detail/basic_operation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,14 @@ namespace beman::execution26::detail
using inner_ops_t = ::beman::execution26::detail::connect_all_result<Sender, Receiver>;
inner_ops_t inner_ops;

basic_operation(Sender&& sender, Receiver&& receiver) noexcept(true/*-dk:TODO*/)
template <typename S> //-dk:TODO is that deviating from the spec?
basic_operation(S&& sender, Receiver&& receiver) noexcept(true/*-dk:TODO*/)
: ::beman::execution26::detail::basic_state<Sender, Receiver>(
::std::forward<Sender>(sender), ::std::move(receiver)
::std::forward<S>(sender), ::std::move(receiver)
)
, inner_ops(::beman::execution26::detail::connect_all(
this,
::std::forward<Sender>(sender),
::std::forward<S>(sender),
::beman::execution26::detail::indices_for<Sender>()
))
{
Expand All @@ -58,6 +59,8 @@ namespace beman::execution26::detail
);
}
};
template <typename Sender, typename Receiver>
basic_operation(Sender&&, Receiver&&) -> basic_operation<Sender&&, Receiver>;
}

// ----------------------------------------------------------------------------
Expand Down
7 changes: 5 additions & 2 deletions include/beman/execution26/detail/basic_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@ namespace beman::execution26::detail
template <typename Sender, typename Receiver>
struct basic_state
{
basic_state(Sender&& sender, Receiver&& receiver) noexcept(true)
template <typename S> //-dk:TODO is that deviating from the spec?
basic_state(S&& sender, Receiver&& receiver) noexcept(true)
: receiver(::std::move(receiver))
, state(::beman::execution26::detail::impls_for<
::beman::execution26::tag_of_t<Sender>
>::get_state(::std::forward<Sender>(sender), receiver))
>::get_state(::std::forward<S>(sender), receiver))
{
}

Receiver receiver;
::beman::execution26::detail::state_type<Sender, Receiver> state;
};
template <typename Sender, typename Receiver>
basic_state(Sender&&, Receiver&&) -> basic_state<Sender&&, Receiver>;
}

// ----------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ namespace beman::execution26::detail

template <typename Sender, typename Env>
struct completion_signatures_for_impl
{
using type = ::beman::execution26::detail::no_completion_signatures_defined_in_sender;
};
#if 0
{
using type = decltype(::std::invoke([]{
if constexpr (::beman::execution26::sender_in<Sender, Env>)
Expand All @@ -28,6 +32,7 @@ namespace beman::execution26::detail
return ::beman::execution26::detail::no_completion_signatures_defined_in_sender{};
}));
};
#endif

template <typename Sender, typename Env>
using completion_signatures_for
Expand Down
7 changes: 4 additions & 3 deletions include/beman/execution26/detail/connect_all.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ namespace beman::execution26::detail
struct connect_all_t
{
static auto use(auto&&...) {}
template <typename Sender, typename Receiver, ::std::size_t... I>
//-dk:TODO is the S parameter deviating from the spec?
template <typename Sender, typename S, typename Receiver, ::std::size_t... I>
auto operator()(::beman::execution26::detail::basic_state<Sender, Receiver>* op,
Sender&& sender,
S&& sender,
::std::index_sequence<I...>) const noexcept(true/*-dk:TODO*/)
{
auto data{::beman::execution26::detail::get_sender_data(::std::forward<Sender>(sender))};
auto data{::beman::execution26::detail::get_sender_data(::std::forward<S>(sender))};
return ::std::apply([&op](auto&&... c){
return [&op]<::std::size_t...J>(::std::index_sequence<J...>, auto&&... c){
use(op);
Expand Down
11 changes: 11 additions & 0 deletions include/beman/execution26/execution.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
#include <beman/execution26/detail/get_stop_token.hpp>
#include <beman/execution26/detail/get_env.hpp>
#include <beman/execution26/detail/get_domain.hpp>
#include <beman/execution26/detail/get_scheduler.hpp>
#include <beman/execution26/detail/get_completion_scheduler.hpp>
#include <beman/execution26/detail/get_delegation_scheduler.hpp>
#include <beman/execution26/detail/get_completion_signatures.hpp>

#include <beman/execution26/detail/completion_signature.hpp>
#include <beman/execution26/detail/completion_signatures.hpp>
Expand All @@ -27,9 +31,16 @@
#include <beman/execution26/detail/set_error.hpp>
#include <beman/execution26/detail/set_stopped.hpp>
#include <beman/execution26/detail/start.hpp>
#include <beman/execution26/detail/connect.hpp>
#include <beman/execution26/detail/scheduler.hpp>
#include <beman/execution26/detail/schedule.hpp>

#include <beman/execution26/detail/into_variant.hpp>
#include <beman/execution26/detail/just.hpp>
#include <beman/execution26/detail/sync_wait.hpp>
#include <beman/execution26/detail/then.hpp>
#include <beman/execution26/detail/write_env.hpp>

// ----------------------------------------------------------------------------

#endif
16 changes: 9 additions & 7 deletions src/beman/execution26/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ list(APPEND execution_tests
exec-read-env.pass
exec-get-delegation-scheduler.pass
exec-snd-apply.pass
exec-sync-wait.pass
meta-combine.pass
exec-into-variant.pass
exec-run-loop-types.pass
Expand Down Expand Up @@ -37,7 +36,6 @@ list(APPEND execution_tests
exec-opstate.pass
exec-opstate-start.pass
allocator-requirements-general.pass
exec-general.pass
exec-utils-cmplsigs.pass
functional-syn.pass
exec-recv.pass
Expand Down Expand Up @@ -75,10 +73,14 @@ list(APPEND execution_tests
stopcallback-inplace.pass
stopcallback-inplace-general.pass
stopcallback-inplace-cons.pass
exec-sync-wait.pass
exec-general.pass
)

foreach(test ${execution_tests})
add_executable(${test} ${test}.cpp)
target_link_libraries(${test} PRIVATE ${TARGET_LIBRARY})
add_test(NAME ${test} COMMAND $<TARGET_FILE:${test}>)
endforeach()
if(PROJECT_IS_TOP_LEVEL)
foreach(test ${execution_tests})
add_executable(${test} ${test}.cpp)
target_link_libraries(${test} PRIVATE ${TARGET_LIBRARY})
add_test(NAME ${test} COMMAND $<TARGET_FILE:${test}>)
endforeach()
endif()
14 changes: 10 additions & 4 deletions src/beman/execution26/tests/exec-snd-expos.pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1066,28 +1066,28 @@ namespace
test_detail::basic_state state{sender1{}, receiver{}};
static_assert(std::same_as<
decltype(test_detail::connect_all(&state, sender1{}, std::index_sequence<0, 1, 2, 3>{})),
test_detail::connect_all_result<sender1, receiver>
test_detail::connect_all_result<sender1&&, receiver>
>);
}
{
test_detail::basic_state state{sender2{}, receiver{}};
static_assert(std::same_as<
decltype(test_detail::connect_all(&state, sender2{}, std::index_sequence<0, 1, 2, 3>{})),
test_detail::connect_all_result<sender2, receiver>
test_detail::connect_all_result<sender2&&, receiver>
>);
}
{
test_detail::basic_state state{sender3{}, receiver{}};
static_assert(std::same_as<
decltype(test_detail::connect_all(&state, sender3{}, std::index_sequence<0, 1, 2, 3>{})),
test_detail::connect_all_result<sender3, receiver>
test_detail::connect_all_result<sender3&&, receiver>
>);
}
{
test_detail::basic_state state{sender4{}, receiver{}};
static_assert(std::same_as<
decltype(test_detail::connect_all(&state, sender4{}, std::index_sequence<0, 1, 2, 3>{})),
test_detail::connect_all_result<sender4, receiver>
test_detail::connect_all_result<sender4&&, receiver>
>);
}
}
Expand Down Expand Up @@ -1131,6 +1131,8 @@ namespace
static_assert(test_std::sender_in<sender, env>);
static_assert(not test_std::sender_in<sender, bad_env>);

#if 0
//-dk:TODO restore completion_signatures_for tests
static_assert(std::same_as<
test_detail::completion_signatures_for<sender, test_std::empty_env>,
sender::empty_env_sigs
Expand All @@ -1139,6 +1141,7 @@ namespace
test_detail::completion_signatures_for<sender, env>,
sender::env_sigs
>);
#endif
static_assert(not test_detail::valid_completion_signatures<
test_detail::no_completion_signatures_defined_in_sender
>);
Expand Down Expand Up @@ -1234,6 +1237,8 @@ namespace
decltype(test_std::transform_sender(test_std::default_domain{}, basic_sender{}, env{}))
>);
static_assert(test_std::sender_in<basic_sender>);
#if 0
//-dk:TODO restore completion_sigatures_for test
static_assert(std::same_as<
basic_sender_tag::sender::completion_signatures,
test_detail::completion_signatures_for<basic_sender, env>
Expand All @@ -1242,6 +1247,7 @@ namespace
basic_sender_tag::sender::completion_signatures,
test_detail::completion_signatures_for<basic_sender, env>
>);
#endif

auto ge{test_std::get_env(bs)};
use(ge);
Expand Down
8 changes: 5 additions & 3 deletions src/beman/execution26/tests/exec-then.pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@ namespace
static_assert(requires{ { in_sender | cpo(fun) } -> test_std::sender; });
static_assert(requires{ { in_sender | cpo(fun) | cpo([](auto&&...){}) } -> test_std::sender; });
auto sender{cpo(in_sender, fun)};
test::use(sender);
auto op{test_std::connect(sender, receiver{})};
test::use(op);
auto op{test_std::connect(::std::move(sender), receiver{})};
test_std::start(op);

auto const csender{cpo(in_sender, fun)};
auto cop{test_std::connect(std::move(csender), receiver{})};
test_std::start(cop);
}
}

Expand Down