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