1 #pragma once
2 
3 
4 #include <utility>
5 #include <memory>
6 #include <uv.h>
7 #include "handle.hpp"
8 #include "loop.hpp"
9 
10 
11 namespace uvw {
12 
13 
14 /**
15  * @brief PrepareEvent event.
16  *
17  * It will be emitted by PrepareHandle according with its functionalities.
18  */
19 struct PrepareEvent {};
20 
21 
22 /**
23  * @brief The PrepareHandle handle.
24  *
25  * Prepare handles will emit a PrepareEvent event once per loop iteration, right
26  * before polling for I/O.
27  *
28  * To create a `PrepareHandle` through a `Loop`, no arguments are required.
29  */
30 class PrepareHandle final: public Handle<PrepareHandle, uv_prepare_t> {
startCallback(uv_prepare_t * handle)31     static void startCallback(uv_prepare_t *handle) {
32         PrepareHandle &prepare = *(static_cast<PrepareHandle*>(handle->data));
33         prepare.publish(PrepareEvent{});
34     }
35 
36 public:
37     using Handle::Handle;
38 
39     /**
40      * @brief Initializes the handle.
41      * @return True in case of success, false otherwise.
42      */
init()43     bool init() {
44         return initialize(&uv_prepare_init);
45     }
46 
47     /**
48      * @brief Starts the handle.
49      *
50      * A PrepareEvent event will be emitted once per loop iteration, right
51      * before polling for I/O.
52      *
53      * The handle will start emitting PrepareEvent when needed.
54      */
start()55     void start() {
56         invoke(&uv_prepare_start, get(), &startCallback);
57     }
58 
59     /**
60      * @brief Stops the handle.
61      */
stop()62     void stop() {
63         invoke(&uv_prepare_stop, get());
64     }
65 };
66 
67 
68 }
69