Arm works

Added gravity and calibrated it.  Terifying...

Change-Id: I70babb1cd3b83ddd7a81f06fb2a75cefd55bcdb8
diff --git a/y2018/control_loops/superstructure/arm/graph.h b/y2018/control_loops/superstructure/arm/graph.h
index 1c2f9e5..d295cfc 100644
--- a/y2018/control_loops/superstructure/arm/graph.h
+++ b/y2018/control_loops/superstructure/arm/graph.h
@@ -33,7 +33,7 @@
    public:
     QueueEntry(T *value) : value_(value) { value_->entry_ = this; }
 
-    QueueEntry(QueueEntry &&o) : value_(o.value_) {
+    QueueEntry(QueueEntry &&o) : value_(::std::move(o.value_)) {
       if (value_) {
         value_->entry_ = this;
       }
@@ -133,7 +133,14 @@
     bool operator<(const HalfEdge &o) const { return dest < o.dest; }
   };
 
-  SearchGraph(size_t num_vertexes, const std::vector<Edge> &edges);
+  SearchGraph(size_t num_vertexes, std::vector<Edge> &&edges);
+  SearchGraph(size_t num_vertexes, ::std::initializer_list<Edge> edges);
+  SearchGraph(SearchGraph &&o)
+      : goal_vertex_(o.goal_vertex_),
+        vertexes_(::std::move(o.vertexes_)),
+        edges_(::std::move(o.edges_)),
+        vertex_heap_(::std::move(o.vertex_heap_)) {}
+
   ~SearchGraph();
 
   // Set the goal vertex.
@@ -150,6 +157,8 @@
 
   size_t num_vertexes() const { return vertexes_.size(); }
 
+  const std::vector<Edge> &edges() const { return edges_; }
+
  private:
   size_t goal_vertex_ = std::numeric_limits<size_t>::max();
   struct Vertex {
@@ -169,6 +178,8 @@
   std::vector<Edge> edges_;
 
   IntrusivePriorityQueue<Vertex> vertex_heap_;
+
+  size_t last_searched_vertex_ = 1;
 };
 
 }  // namespace arm