// Description: Removes an edge.
#ifndef PASTELGEOMETRY_HALFMESH_MERGE_HPP
#define PASTELGEOMETRY_HALFMESH_MERGE_HPP
#include "pastel/geometry/halfmesh/halfmesh.h"
namespace Pastel
{
    template <
        typename Settings, 
        template <typename> class Customization>
    auto HalfMesh<Settings, Customization>::removeEdge(
        const Edge_ConstIterator& edge)
    -> Edge_Iterator
    {
        if (edge.isEnd() || edge.empty())
        {
            return cast(edge);
        }
        this->onRemoveEdge(cast(edge));
        Half_Iterator fromTo = 
            cast(edge->half());
        ASSERT(!fromTo.empty());
        Half_Iterator toFrom =
            fromTo->pair();
        // Remove the left polygon.
        removePolygon(fromTo->left());
        // Remove the right polygon.
        removePolygon(toFrom->left());
        // Link the from-side of the edge off the model.
        detachHalf(fromTo);
        // Link the to-side of the edge off the model.
        detachHalf(toFrom);
        // Deallocate half-edges.
        halfSet_.erase(fromTo);
        halfSet_.erase(toFrom);
        // Deallocate edge.
        return edgeSet_.erase(edge);
    }
}
#endif