]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/graph/planar_detail/face_handles.hpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / boost / graph / planar_detail / face_handles.hpp
index 4e28d4afcef571ed0d853491d6ee90a3b89dcd5d..1ea7efcb46733cd8e294e4d72818f3dfd270d79a 100644 (file)
@@ -9,12 +9,10 @@
 #ifndef __FACE_HANDLES_HPP__
 #define __FACE_HANDLES_HPP__
 
-
 #include <list>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/shared_ptr.hpp>
 
-
 // A "face handle" is an optimization meant to serve two purposes in
 // the implementation of the Boyer-Myrvold planarity test: (1) it holds
 // the partial planar embedding of a particular vertex as it's being
@@ -26,7 +24,7 @@
 // sequence of edges. The functions first_vertex/second_vertex and
 // first_edge/second_edge allow fast access to the beginning and end of the
 // stored sequence, which allows one to traverse the outer face of the partial
-// planar embedding as it's being created. 
+// planar embedding as it's being created.
 //
 // There are some policies below that define the contents of the face handles:
 // in the case no embedding is needed (for example, if one just wants to use
 // to keep a record of the previous first/second vertex/edge - this is needed
 // if a Kuratowski subgraph needs to be isolated.
 
-
-namespace boost { namespace graph { namespace detail {
-
-
-  //face handle policies
-  
-  //EmbeddingStorage policy
-  struct store_embedding {};
-  struct recursive_lazy_list : public store_embedding {};
-  struct std_list : public store_embedding {};
-  struct no_embedding {};
-
-  //StoreOldHandlesPolicy
-  struct store_old_handles {};
-  struct no_old_handles {};
-
-
-
-
-  template<typename DataType>
-  struct lazy_list_node
-  {
-    typedef shared_ptr< lazy_list_node<DataType> > ptr_t;
-
-    lazy_list_node(const DataType& data) :
-      m_reversed(false),
-      m_data(data),
-      m_has_data(true)
-    {}
-    
-    lazy_list_node(ptr_t left_child, ptr_t right_child) :
-      m_reversed(false),
-      m_has_data(false),
-      m_left_child(left_child),
-      m_right_child(right_child)
-    {}
-
-    bool m_reversed;
-    DataType m_data;
-    bool m_has_data;
-    shared_ptr<lazy_list_node> m_left_child;
-    shared_ptr<lazy_list_node> m_right_child;
-  };
-  
-
-
-  template <typename StoreOldHandlesPolicy, typename Vertex, typename Edge>
-  struct old_handles_storage;
-
-  template <typename Vertex, typename Edge>
-  struct old_handles_storage<store_old_handles, Vertex, Edge>
-  {
-    Vertex first_vertex;
-    Vertex second_vertex;
-    Edge first_edge;
-    Edge second_edge;
-  };
-
-  template <typename Vertex, typename Edge>
-  struct old_handles_storage<no_old_handles, Vertex, Edge>
-  {};
-
-
-
-
-
-
-  template <typename StoreEmbeddingPolicy, typename Edge>
-  struct edge_list_storage;
-
-
-
-
-
-  template <typename Edge>
-  struct edge_list_storage<no_embedding, Edge>
-  {
-    typedef void type;
-
-    void push_back(Edge) {}
-    void push_front(Edge) {}
-    void reverse() {}
-    void concat_front(edge_list_storage<no_embedding,Edge>) {}
-    void concat_back(edge_list_storage<no_embedding,Edge>) {}
-    template <typename OutputIterator>
-    void get_list(OutputIterator) {}
-  };
-
-
-
-
-
-  template <typename Edge>
-  struct edge_list_storage<recursive_lazy_list, Edge>
-  {
-    typedef lazy_list_node<Edge> node_type;
-    typedef shared_ptr< node_type > type;
-    type value;
-
-    void push_back(Edge e)
-    {
-      type new_node(new node_type(e));
-      value = type(new node_type(value, new_node));
-    }
-
-    void push_front(Edge e)
-    {
-      type new_node(new node_type(e));
-      value = type(new node_type(new_node, value));
-    }
-
-    void reverse()
-    {
-      value->m_reversed = !value->m_reversed;
-    }
-
-    void concat_front(edge_list_storage<recursive_lazy_list, Edge> other)
+namespace boost
+{
+namespace graph
+{
+    namespace detail
     {
-      value = type(new node_type(other.value, value));
-    }
 
-    void concat_back(edge_list_storage<recursive_lazy_list, Edge> other)
-    {
-      value = type(new node_type(value, other.value));
-    }
-
-    template <typename OutputIterator>
-    void get_list(OutputIterator out)
-    {
-      get_list_helper(out, value);
-    }
-
-  private:
+        // face handle policies
 
-    template <typename OutputIterator>
-    void get_list_helper(OutputIterator o_itr, 
-                         type root,
-                         bool flipped = false
-                         )
-    {
-      if (!root)
-        return;
-      
-      if (root->m_has_data)
-        *o_itr = root->m_data;
-      
-      if ((flipped && !root->m_reversed) ||
-          (!flipped && root->m_reversed)
-          )
+        // EmbeddingStorage policy
+        struct store_embedding
         {
-          get_list_helper(o_itr, root->m_right_child, true);
-          get_list_helper(o_itr, root->m_left_child, true);
-        }
-      else
+        };
+        struct recursive_lazy_list : public store_embedding
         {
-          get_list_helper(o_itr, root->m_left_child, false);
-          get_list_helper(o_itr, root->m_right_child, false);
-        }
-      
-    }
-    
-  };
-
-
-
-
-
-  template <typename Edge>
-  struct edge_list_storage<std_list, Edge>
-  {
-    typedef std::list<Edge> type;
-    type value;
-
-    void push_back(Edge e)
-    {
-      value.push_back(e);
-    }
-
-    void push_front(Edge e)
-    {
-      value.push_front(e);
-    }
-
-    void reverse()
-    {
-      value.reverse();
-    }
-
-    void concat_front(edge_list_storage<std_list,Edge> other)
-    {
-      value.splice(value.begin(), other.value);
-    }
-
-    void concat_back(edge_list_storage<std_list, Edge> other)
-    {
-      value.splice(value.end(), other.value);
-    }
-
-    template <typename OutputIterator>
-    void get_list(OutputIterator out)
-    {
-      std::copy(value.begin(), value.end(), out);
-    }
-
-  };
-
-
-
-
-
-
-  
-  template<typename Graph, 
-           typename StoreOldHandlesPolicy, 
-           typename StoreEmbeddingPolicy           
-           >
-  struct face_handle_impl
-  {
-    typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
-    typedef typename graph_traits<Graph>::edge_descriptor edge_t;
-    typedef typename edge_list_storage<StoreEmbeddingPolicy, edge_t>::type 
-      edge_list_storage_t;
-
-
-    face_handle_impl() : 
-      cached_first_vertex(graph_traits<Graph>::null_vertex()),
-      cached_second_vertex(graph_traits<Graph>::null_vertex()),
-      true_first_vertex(graph_traits<Graph>::null_vertex()),
-      true_second_vertex(graph_traits<Graph>::null_vertex()),
-      anchor(graph_traits<Graph>::null_vertex())
-    {
-      initialize_old_vertices_dispatch(StoreOldHandlesPolicy());
-    }
-
-    void initialize_old_vertices_dispatch(store_old_handles)
-    {
-      old_handles.first_vertex = graph_traits<Graph>::null_vertex();
-      old_handles.second_vertex = graph_traits<Graph>::null_vertex();
-    }
-
-    void initialize_old_vertices_dispatch(no_old_handles) {}
-
-    vertex_t cached_first_vertex;
-    vertex_t cached_second_vertex;
-    vertex_t true_first_vertex;
-    vertex_t true_second_vertex;
-    vertex_t anchor;
-    edge_t cached_first_edge;
-    edge_t cached_second_edge;
-
-    edge_list_storage<StoreEmbeddingPolicy, edge_t> edge_list;
-    old_handles_storage<StoreOldHandlesPolicy, vertex_t, edge_t> old_handles;
-
-  };
-
-
-
-
-
-
-
-
-
-
-
-  template <typename Graph, 
-            typename StoreOldHandlesPolicy = store_old_handles, 
-            typename StoreEmbeddingPolicy = recursive_lazy_list
-            >
-  class face_handle 
-  {
-  public:
-    typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
-    typedef typename graph_traits<Graph>::edge_descriptor edge_t;
-    typedef face_handle_impl
-      <Graph, StoreOldHandlesPolicy, StoreEmbeddingPolicy> impl_t;
-    typedef face_handle
-      <Graph, StoreOldHandlesPolicy, StoreEmbeddingPolicy> self_t;
-
-    face_handle(vertex_t anchor = graph_traits<Graph>::null_vertex()) :
-      pimpl(new impl_t())
-    {
-      pimpl->anchor = anchor;
-    }
-
-    face_handle(vertex_t anchor, edge_t initial_edge, const Graph& g) :
-      pimpl(new impl_t())
-    {
-      vertex_t s(source(initial_edge,g));
-      vertex_t t(target(initial_edge,g));
-      vertex_t other_vertex = s == anchor ? t : s;
-      pimpl->anchor = anchor;
-      pimpl->cached_first_edge = initial_edge;
-      pimpl->cached_second_edge = initial_edge;
-      pimpl->cached_first_vertex = other_vertex;
-      pimpl->cached_second_vertex = other_vertex;
-      pimpl->true_first_vertex = other_vertex;
-      pimpl->true_second_vertex = other_vertex;
-
-      pimpl->edge_list.push_back(initial_edge);
-      store_old_face_handles_dispatch(StoreOldHandlesPolicy());
-    }
-
-    //default copy construction, assignment okay.
-    
-    void push_first(edge_t e, const Graph& g) 
-    { 
-      pimpl->edge_list.push_front(e);
-      pimpl->cached_first_vertex = pimpl->true_first_vertex = 
-        source(e, g) == pimpl->anchor ? target(e,g) : source(e,g);
-      pimpl->cached_first_edge = e;
-    }
-  
-    void push_second(edge_t e, const Graph& g) 
-    { 
-      pimpl->edge_list.push_back(e);
-      pimpl->cached_second_vertex = pimpl->true_second_vertex = 
-        source(e, g) == pimpl->anchor ? target(e,g) : source(e,g);
-      pimpl->cached_second_edge = e;
-    }
-
-    inline void store_old_face_handles()
-    {
-      store_old_face_handles_dispatch(StoreOldHandlesPolicy());
-    }
-
-    inline vertex_t first_vertex() const
-    { 
-      return pimpl->cached_first_vertex;
-    }
-    
-    inline vertex_t second_vertex() const 
-    { 
-      return pimpl->cached_second_vertex;
-    }
-
-    inline vertex_t true_first_vertex() const 
-    { 
-      return pimpl->true_first_vertex;
-    }
-
-    inline vertex_t true_second_vertex() const 
-    { 
-      return pimpl->true_second_vertex;
-    }
-
-    inline vertex_t old_first_vertex() const
-    {
-      return pimpl->old_handles.first_vertex;
-    }
-
-    inline vertex_t old_second_vertex() const
-    {
-      return pimpl->old_handles.second_vertex;
-    }
-
-    inline edge_t old_first_edge() const
-    {
-      return pimpl->old_handles.first_edge;
-    }
-
-    inline edge_t old_second_edge() const
-    {
-      return pimpl->old_handles.second_edge;
-    }
-
-    inline edge_t first_edge() const
-    {
-      return pimpl->cached_first_edge;
-    }
-  
-    inline edge_t second_edge() const
-    {
-      return pimpl->cached_second_edge;
-    }
-    
-    inline vertex_t get_anchor() const
-    {
-      return pimpl->anchor;
-    }
-  
-    void glue_first_to_second
-      (face_handle<Graph,StoreOldHandlesPolicy,StoreEmbeddingPolicy>& bottom)
-    {
-      pimpl->edge_list.concat_front(bottom.pimpl->edge_list);
-      pimpl->true_first_vertex = bottom.pimpl->true_first_vertex;
-      pimpl->cached_first_vertex = bottom.pimpl->cached_first_vertex;
-      pimpl->cached_first_edge = bottom.pimpl->cached_first_edge;
-    }
-    
-    void glue_second_to_first
-      (face_handle<Graph,StoreOldHandlesPolicy,StoreEmbeddingPolicy>& bottom)
-    {
-      pimpl->edge_list.concat_back(bottom.pimpl->edge_list);
-      pimpl->true_second_vertex = bottom.pimpl->true_second_vertex;
-      pimpl->cached_second_vertex = bottom.pimpl->cached_second_vertex;
-      pimpl->cached_second_edge = bottom.pimpl->cached_second_edge;
-    }
-  
-    void flip()
-    {
-      pimpl->edge_list.reverse();
-      std::swap(pimpl->true_first_vertex, pimpl->true_second_vertex);
-      std::swap(pimpl->cached_first_vertex, pimpl->cached_second_vertex);
-      std::swap(pimpl->cached_first_edge, pimpl->cached_second_edge);
-    }
-    
-    template <typename OutputIterator>
-    void get_list(OutputIterator o_itr)
-    {
-      pimpl->edge_list.get_list(o_itr);
-    }
-
-    void reset_vertex_cache()
-    {
-      pimpl->cached_first_vertex = pimpl->true_first_vertex;
-      pimpl->cached_second_vertex = pimpl->true_second_vertex;
-    }
+        };
+        struct std_list : public store_embedding
+        {
+        };
+        struct no_embedding
+        {
+        };
 
-    inline void set_first_vertex(vertex_t v)
-    {
-      pimpl->cached_first_vertex = v;
-    }
+        // StoreOldHandlesPolicy
+        struct store_old_handles
+        {
+        };
+        struct no_old_handles
+        {
+        };
 
-    inline void set_second_vertex(vertex_t v)
-    {
-      pimpl->cached_second_vertex = v;
-    }
+        template < typename DataType > struct lazy_list_node
+        {
+            typedef shared_ptr< lazy_list_node< DataType > > ptr_t;
+
+            lazy_list_node(const DataType& data)
+            : m_reversed(false), m_data(data), m_has_data(true)
+            {
+            }
+
+            lazy_list_node(ptr_t left_child, ptr_t right_child)
+            : m_reversed(false)
+            , m_has_data(false)
+            , m_left_child(left_child)
+            , m_right_child(right_child)
+            {
+            }
+
+            bool m_reversed;
+            DataType m_data;
+            bool m_has_data;
+            shared_ptr< lazy_list_node > m_left_child;
+            shared_ptr< lazy_list_node > m_right_child;
+        };
+
+        template < typename StoreOldHandlesPolicy, typename Vertex,
+            typename Edge >
+        struct old_handles_storage;
+
+        template < typename Vertex, typename Edge >
+        struct old_handles_storage< store_old_handles, Vertex, Edge >
+        {
+            Vertex first_vertex;
+            Vertex second_vertex;
+            Edge first_edge;
+            Edge second_edge;
+        };
+
+        template < typename Vertex, typename Edge >
+        struct old_handles_storage< no_old_handles, Vertex, Edge >
+        {
+        };
 
-  private:
+        template < typename StoreEmbeddingPolicy, typename Edge >
+        struct edge_list_storage;
 
-    void store_old_face_handles_dispatch(store_old_handles)
-    {
-      pimpl->old_handles.first_vertex = pimpl->true_first_vertex;
-      pimpl->old_handles.second_vertex = pimpl->true_second_vertex;
-      pimpl->old_handles.first_edge = pimpl->cached_first_edge;
-      pimpl->old_handles.second_edge = pimpl->cached_second_edge;
-    }
-  
-    void store_old_face_handles_dispatch(no_old_handles) {}
+        template < typename Edge >
+        struct edge_list_storage< no_embedding, Edge >
+        {
+            typedef void type;
+
+            void push_back(Edge) {}
+            void push_front(Edge) {}
+            void reverse() {}
+            void concat_front(edge_list_storage< no_embedding, Edge >) {}
+            void concat_back(edge_list_storage< no_embedding, Edge >) {}
+            template < typename OutputIterator > void get_list(OutputIterator)
+            {
+            }
+        };
+
+        template < typename Edge >
+        struct edge_list_storage< recursive_lazy_list, Edge >
+        {
+            typedef lazy_list_node< Edge > node_type;
+            typedef shared_ptr< node_type > type;
+            type value;
+
+            void push_back(Edge e)
+            {
+                type new_node(new node_type(e));
+                value = type(new node_type(value, new_node));
+            }
+
+            void push_front(Edge e)
+            {
+                type new_node(new node_type(e));
+                value = type(new node_type(new_node, value));
+            }
+
+            void reverse() { value->m_reversed = !value->m_reversed; }
+
+            void concat_front(
+                edge_list_storage< recursive_lazy_list, Edge > other)
+            {
+                value = type(new node_type(other.value, value));
+            }
+
+            void concat_back(
+                edge_list_storage< recursive_lazy_list, Edge > other)
+            {
+                value = type(new node_type(value, other.value));
+            }
+
+            template < typename OutputIterator >
+            void get_list(OutputIterator out)
+            {
+                get_list_helper(out, value);
+            }
+
+        private:
+            template < typename OutputIterator >
+            void get_list_helper(
+                OutputIterator o_itr, type root, bool flipped = false)
+            {
+                if (!root)
+                    return;
+
+                if (root->m_has_data)
+                    *o_itr = root->m_data;
+
+                if ((flipped && !root->m_reversed)
+                    || (!flipped && root->m_reversed))
+                {
+                    get_list_helper(o_itr, root->m_right_child, true);
+                    get_list_helper(o_itr, root->m_left_child, true);
+                }
+                else
+                {
+                    get_list_helper(o_itr, root->m_left_child, false);
+                    get_list_helper(o_itr, root->m_right_child, false);
+                }
+            }
+        };
+
+        template < typename Edge > struct edge_list_storage< std_list, Edge >
+        {
+            typedef std::list< Edge > type;
+            type value;
 
+            void push_back(Edge e) { value.push_back(e); }
 
+            void push_front(Edge e) { value.push_front(e); }
 
-    boost::shared_ptr<impl_t> pimpl;
+            void reverse() { value.reverse(); }
 
-  };
+            void concat_front(edge_list_storage< std_list, Edge > other)
+            {
+                value.splice(value.begin(), other.value);
+            }
 
+            void concat_back(edge_list_storage< std_list, Edge > other)
+            {
+                value.splice(value.end(), other.value);
+            }
 
-} /* namespace detail */ } /* namespace graph */ } /* namespace boost */
+            template < typename OutputIterator >
+            void get_list(OutputIterator out)
+            {
+                std::copy(value.begin(), value.end(), out);
+            }
+        };
 
+        template < typename Graph, typename StoreOldHandlesPolicy,
+            typename StoreEmbeddingPolicy >
+        struct face_handle_impl
+        {
+            typedef typename graph_traits< Graph >::vertex_descriptor vertex_t;
+            typedef typename graph_traits< Graph >::edge_descriptor edge_t;
+            typedef
+                typename edge_list_storage< StoreEmbeddingPolicy, edge_t >::type
+                    edge_list_storage_t;
+
+            face_handle_impl()
+            : cached_first_vertex(graph_traits< Graph >::null_vertex())
+            , cached_second_vertex(graph_traits< Graph >::null_vertex())
+            , true_first_vertex(graph_traits< Graph >::null_vertex())
+            , true_second_vertex(graph_traits< Graph >::null_vertex())
+            , anchor(graph_traits< Graph >::null_vertex())
+            {
+                initialize_old_vertices_dispatch(StoreOldHandlesPolicy());
+            }
+
+            void initialize_old_vertices_dispatch(store_old_handles)
+            {
+                old_handles.first_vertex = graph_traits< Graph >::null_vertex();
+                old_handles.second_vertex
+                    = graph_traits< Graph >::null_vertex();
+            }
+
+            void initialize_old_vertices_dispatch(no_old_handles) {}
+
+            vertex_t cached_first_vertex;
+            vertex_t cached_second_vertex;
+            vertex_t true_first_vertex;
+            vertex_t true_second_vertex;
+            vertex_t anchor;
+            edge_t cached_first_edge;
+            edge_t cached_second_edge;
+
+            edge_list_storage< StoreEmbeddingPolicy, edge_t > edge_list;
+            old_handles_storage< StoreOldHandlesPolicy, vertex_t, edge_t >
+                old_handles;
+        };
+
+        template < typename Graph,
+            typename StoreOldHandlesPolicy = store_old_handles,
+            typename StoreEmbeddingPolicy = recursive_lazy_list >
+        class face_handle
+        {
+        public:
+            typedef typename graph_traits< Graph >::vertex_descriptor vertex_t;
+            typedef typename graph_traits< Graph >::edge_descriptor edge_t;
+            typedef face_handle_impl< Graph, StoreOldHandlesPolicy,
+                StoreEmbeddingPolicy >
+                impl_t;
+            typedef face_handle< Graph, StoreOldHandlesPolicy,
+                StoreEmbeddingPolicy >
+                self_t;
+
+            face_handle(vertex_t anchor = graph_traits< Graph >::null_vertex())
+            : pimpl(new impl_t())
+            {
+                pimpl->anchor = anchor;
+            }
+
+            face_handle(vertex_t anchor, edge_t initial_edge, const Graph& g)
+            : pimpl(new impl_t())
+            {
+                vertex_t s(source(initial_edge, g));
+                vertex_t t(target(initial_edge, g));
+                vertex_t other_vertex = s == anchor ? t : s;
+                pimpl->anchor = anchor;
+                pimpl->cached_first_edge = initial_edge;
+                pimpl->cached_second_edge = initial_edge;
+                pimpl->cached_first_vertex = other_vertex;
+                pimpl->cached_second_vertex = other_vertex;
+                pimpl->true_first_vertex = other_vertex;
+                pimpl->true_second_vertex = other_vertex;
+
+                pimpl->edge_list.push_back(initial_edge);
+                store_old_face_handles_dispatch(StoreOldHandlesPolicy());
+            }
+
+            // default copy construction, assignment okay.
+
+            void push_first(edge_t e, const Graph& g)
+            {
+                pimpl->edge_list.push_front(e);
+                pimpl->cached_first_vertex = pimpl->true_first_vertex
+                    = source(e, g) == pimpl->anchor ? target(e, g)
+                                                    : source(e, g);
+                pimpl->cached_first_edge = e;
+            }
+
+            void push_second(edge_t e, const Graph& g)
+            {
+                pimpl->edge_list.push_back(e);
+                pimpl->cached_second_vertex = pimpl->true_second_vertex
+                    = source(e, g) == pimpl->anchor ? target(e, g)
+                                                    : source(e, g);
+                pimpl->cached_second_edge = e;
+            }
+
+            inline void store_old_face_handles()
+            {
+                store_old_face_handles_dispatch(StoreOldHandlesPolicy());
+            }
+
+            inline vertex_t first_vertex() const
+            {
+                return pimpl->cached_first_vertex;
+            }
+
+            inline vertex_t second_vertex() const
+            {
+                return pimpl->cached_second_vertex;
+            }
+
+            inline vertex_t true_first_vertex() const
+            {
+                return pimpl->true_first_vertex;
+            }
+
+            inline vertex_t true_second_vertex() const
+            {
+                return pimpl->true_second_vertex;
+            }
+
+            inline vertex_t old_first_vertex() const
+            {
+                return pimpl->old_handles.first_vertex;
+            }
+
+            inline vertex_t old_second_vertex() const
+            {
+                return pimpl->old_handles.second_vertex;
+            }
+
+            inline edge_t old_first_edge() const
+            {
+                return pimpl->old_handles.first_edge;
+            }
+
+            inline edge_t old_second_edge() const
+            {
+                return pimpl->old_handles.second_edge;
+            }
+
+            inline edge_t first_edge() const
+            {
+                return pimpl->cached_first_edge;
+            }
+
+            inline edge_t second_edge() const
+            {
+                return pimpl->cached_second_edge;
+            }
+
+            inline vertex_t get_anchor() const { return pimpl->anchor; }
+
+            void glue_first_to_second(face_handle< Graph, StoreOldHandlesPolicy,
+                StoreEmbeddingPolicy >& bottom)
+            {
+                pimpl->edge_list.concat_front(bottom.pimpl->edge_list);
+                pimpl->true_first_vertex = bottom.pimpl->true_first_vertex;
+                pimpl->cached_first_vertex = bottom.pimpl->cached_first_vertex;
+                pimpl->cached_first_edge = bottom.pimpl->cached_first_edge;
+            }
+
+            void glue_second_to_first(face_handle< Graph, StoreOldHandlesPolicy,
+                StoreEmbeddingPolicy >& bottom)
+            {
+                pimpl->edge_list.concat_back(bottom.pimpl->edge_list);
+                pimpl->true_second_vertex = bottom.pimpl->true_second_vertex;
+                pimpl->cached_second_vertex
+                    = bottom.pimpl->cached_second_vertex;
+                pimpl->cached_second_edge = bottom.pimpl->cached_second_edge;
+            }
+
+            void flip()
+            {
+                pimpl->edge_list.reverse();
+                std::swap(pimpl->true_first_vertex, pimpl->true_second_vertex);
+                std::swap(
+                    pimpl->cached_first_vertex, pimpl->cached_second_vertex);
+                std::swap(pimpl->cached_first_edge, pimpl->cached_second_edge);
+            }
+
+            template < typename OutputIterator >
+            void get_list(OutputIterator o_itr)
+            {
+                pimpl->edge_list.get_list(o_itr);
+            }
+
+            void reset_vertex_cache()
+            {
+                pimpl->cached_first_vertex = pimpl->true_first_vertex;
+                pimpl->cached_second_vertex = pimpl->true_second_vertex;
+            }
+
+            inline void set_first_vertex(vertex_t v)
+            {
+                pimpl->cached_first_vertex = v;
+            }
+
+            inline void set_second_vertex(vertex_t v)
+            {
+                pimpl->cached_second_vertex = v;
+            }
+
+        private:
+            void store_old_face_handles_dispatch(store_old_handles)
+            {
+                pimpl->old_handles.first_vertex = pimpl->true_first_vertex;
+                pimpl->old_handles.second_vertex = pimpl->true_second_vertex;
+                pimpl->old_handles.first_edge = pimpl->cached_first_edge;
+                pimpl->old_handles.second_edge = pimpl->cached_second_edge;
+            }
+
+            void store_old_face_handles_dispatch(no_old_handles) {}
+
+            boost::shared_ptr< impl_t > pimpl;
+        };
+
+    } /* namespace detail */
+} /* namespace graph */
+} /* namespace boost */
 
 #endif //__FACE_HANDLES_HPP__