uvw  2.3.0
request.hpp
1 #pragma once
2 
3 
4 #include <type_traits>
5 #include <utility>
6 #include <memory>
7 #include <uv.h>
8 #include "resource.hpp"
9 
10 
11 namespace uvw {
12 
13 
14 template<typename T, typename U>
15 class Request: public Resource<T, U> {
16 protected:
17  static auto reserve(U *req) {
18  auto ptr = static_cast<T*>(req->data)->shared_from_this();
19  ptr->reset();
20  return ptr;
21  }
22 
23  template<typename E>
24  static void defaultCallback(U *req, int status) {
25  auto ptr = reserve(req);
26  if(status) { ptr->publish(ErrorEvent{status}); }
27  else { ptr->publish(E{}); }
28  }
29 
30  template<typename F, typename... Args>
31  auto invoke(F &&f, Args&&... args) {
32  if constexpr(std::is_void_v<std::invoke_result_t<F, Args...>>) {
33  std::forward<F>(f)(std::forward<Args>(args)...);
34  this->leak();
35  } else {
36  auto err = std::forward<F>(f)(std::forward<Args>(args)...);
37  if(err) { Emitter<T>::publish(ErrorEvent{err}); }
38  else { this->leak(); }
39  }
40  }
41 
42 public:
43  using Resource<T, U>::Resource;
44 
58  bool cancel() {
59  return (0 == uv_cancel(this->template get<uv_req_t>()));
60  }
61 
66  std::size_t size() const noexcept {
67  return uv_req_size(this->template get<uv_req_t>()->type);
68  }
69 };
70 
71 
72 }
uvw default namespace.
Definition: async.hpp:11