Convert EventScheduler to use classes for callbacks

std::function is slow to construct and destroy.  Convert the hot path
over to use a class instead.

Change-Id: Ic7627da065576ef0c03bb09e07b60ee5a95b0c94
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index 696c16e..71d4138 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -138,6 +138,16 @@
   aos::FlatbufferDetachedBuffer<aos::Configuration> config;
 };
 
+class FunctionEvent : public EventScheduler::Event {
+  public:
+   FunctionEvent(std::function<void()> fn) : fn_(fn) {}
+
+   void Handle() noexcept override { fn_(); }
+
+  private:
+   std::function<void()> fn_;
+};
+
 // Test that creating an event and running the scheduler runs the event.
 TEST(EventSchedulerTest, ScheduleEvent) {
   int counter = 0;
@@ -145,12 +155,12 @@
   EventScheduler scheduler(0);
   scheduler_scheduler.AddEventScheduler(&scheduler);
 
-  scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(1),
-                     [&counter]() { counter += 1; });
+  FunctionEvent e([&counter]() { counter += 1; });
+  scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(1), &e);
   scheduler_scheduler.Run();
   EXPECT_EQ(counter, 1);
-  auto token = scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(2),
-                                  [&counter]() { counter += 1; });
+  auto token =
+      scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(2), &e);
   scheduler.Deschedule(token);
   scheduler_scheduler.Run();
   EXPECT_EQ(counter, 1);
@@ -163,8 +173,9 @@
   EventScheduler scheduler(0);
   scheduler_scheduler.AddEventScheduler(&scheduler);
 
-  auto token = scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(1),
-                                  [&counter]() { counter += 1; });
+  FunctionEvent e([&counter]() { counter += 1; });
+  auto token =
+      scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(1), &e);
   scheduler.Deschedule(token);
   scheduler_scheduler.Run();
   EXPECT_EQ(counter, 0);
@@ -175,8 +186,7 @@
   TestMessage::Builder test_message_builder =
       builder.MakeBuilder<TestMessage>();
   test_message_builder.add_value(value);
-  ASSERT_EQ(builder.Send(test_message_builder.Finish()),
-            RawSender::Error::kOk);
+  ASSERT_EQ(builder.Send(test_message_builder.Finish()), RawSender::Error::kOk);
 }
 
 // Test that sending a message after running gets properly notified.