1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/event/dispatcher.h"
6

            
7
namespace Envoy {
8
namespace Event {
9

            
10
/**
11
 * A util to schedule a task to run in a future event loop cycle. One of the use cases is to run the
12
 * task after the previously DeferredDeletable objects are destroyed.
13
 */
14
class DeferredTaskUtil {
15
private:
16
  class DeferredTask : public DeferredDeletable {
17
  public:
18
34
    DeferredTask(std::function<void()>&& task) : task_(std::move(task)) {}
19
34
    ~DeferredTask() override { task_(); }
20

            
21
  private:
22
    std::function<void()> task_;
23
  };
24

            
25
public:
26
  /**
27
   * Submits an item for run deferred delete.
28
   */
29
34
  static void deferredRun(Dispatcher& dispatcher, std::function<void()>&& func) {
30
34
    dispatcher.deferredDelete(std::make_unique<DeferredTask>(std::move(func)));
31
34
  }
32
};
33

            
34
} // namespace Event
35
} // namespace Envoy