void operator()

in include/unifex/submit.hpp [164:199]


    void operator()(Sender&& sender, Receiver&& receiver) const {
      // Default implementation in terms of connect/start
      switch (blocking(sender)) {
        case blocking_kind::always:
        case blocking_kind::always_inline:
        {
          // The sender will complete synchronously so we can avoid allocating the
          // state on the heap.
          auto op = unifex::connect((Sender &&) sender, (Receiver &&) receiver);
          unifex::start(op);
          break;
        }
        default:
        {
          // Otherwise need to heap-allocate the operation-state
          using op_t = _submit::operation<Sender, Receiver>;
          op_t* op = nullptr;

          {
            // Use the receiver's associated allocator to allocate this state.
            auto allocator = get_allocator(receiver);
            using allocator_t = decltype(allocator);

            rebind_alloc_t<allocator_t, op_t> typedAllocator{allocator};
            op = rebind_traits_t<allocator_t, op_t>::allocate(typedAllocator, 1);
            scope_guard freeOnError = [&]() noexcept {
              rebind_traits_t<allocator_t, op_t>::deallocate(typedAllocator, op, 1);
            };
            rebind_traits_t<allocator_t, op_t>::construct(
                typedAllocator, op, (Sender&&)sender, (Receiver&&)receiver);
            freeOnError.release();
          }
          op->start();
        }
      }
    }