Add a simulated message bridge

This gives us multi-node simulations!

Change-Id: I10fa955653766a26e4d11471a6dae5b47ea5cd1c
diff --git a/aos/events/simulated_network_bridge.h b/aos/events/simulated_network_bridge.h
new file mode 100644
index 0000000..5d613ab
--- /dev/null
+++ b/aos/events/simulated_network_bridge.h
@@ -0,0 +1,36 @@
+#ifndef AOS_EVENTS_SIMULATED_NETWORK_BRIDGE_H_
+#define AOS_EVENTS_SIMULATED_NETWORK_BRIDGE_H_
+
+#include "aos/events/event_loop.h"
+#include "aos/events/simulated_event_loop.h"
+
+namespace aos {
+namespace message_bridge {
+
+class RawMessageDelayer;
+
+// This class moves messages between nodes.  It is implemented as a separate
+// class because it would have been even harder to manage forwarding in the
+// SimulatedEventLoopFactory.
+class SimulatedMessageBridge {
+ public:
+  // Constructs the bridge.
+  SimulatedMessageBridge(
+      SimulatedEventLoopFactory *simulated_event_loop_factory);
+  ~SimulatedMessageBridge();
+
+ private:
+  // Map of nodes to event loops.  This is a member variable so that the
+  // lifetime of the event loops matches the lifetime of the bridge.
+  std::map<const Node *, std::unique_ptr<aos::EventLoop>> event_loop_map_;
+
+
+  // List of delayers used to resend the messages.
+  using DelayersVector = std::vector<std::unique_ptr<RawMessageDelayer>>;
+  std::vector<std::unique_ptr<DelayersVector>> delayers_list_;
+};
+
+}  // namespace message_bridge
+}  // namespace aos
+
+#endif  // AOS_EVENTS_SIMULATED_NETWORK_BRIDGE_H_