/* * Copyright (c) Rishabh Dwivedi * * Licensed under the Apache License Version 2.0 with LLVM Exceptions * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * https://llvm.org/LICENSE.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include #include #include #include namespace unifex { namespace _into_variant { template struct _receiver { struct type; }; template using receiver_t = typename _receiver::type; template struct _receiver::type { UNIFEX_NO_UNIQUE_ADDRESS Receiver receiver_; template(typename... Values) (requires receiver_of) void set_value(Values&&... values) && { unifex::set_value((Receiver &&) receiver_, VariantType(std::make_tuple((Values &&)(values)...))); } template(typename Error) (requires receiver) void set_error(Error&& error) && noexcept { unifex::set_error((Receiver &&)(receiver_), (Error &&)(error)); } void set_done() && noexcept { unifex::set_done((Receiver &&) receiver_); } template(typename CPO) (requires is_receiver_query_cpo_v AND is_callable_v) friend auto tag_invoke(CPO cpo, const type& r) noexcept( is_nothrow_callable_v) -> callable_result_t { return std::move(cpo)(std::as_const(r.receiver_)); } template friend void tag_invoke(tag_t, const type& self, Visit&& visit) { std::invoke(visit, self.receiver_); } }; template struct _sender { struct type; }; template using sender = typename _sender>::type; template struct _sender::type { UNIFEX_NO_UNIQUE_ADDRESS Predecessor pred_; template < template class Variant, template class Tuple> using value_types = Variant>>; template