// Copyright (C) 1996 DIMACS Center, Rutgers, The State University of New Jersey
// Author(s): Jonathan Berry

// This software is copyrighted by the DIMACS Center at Rutgers, The State
// University of New Jersey.  IT IS PROVIDED AS IS, AND THE AUTHORS, DIMACS, AND
// RUTGERS, THE STATE UNIVERSITY OF NEW JERSEY  DISCLAIM
// ALL LIABILITY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
// DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

// THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
// IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
// NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
// MODIFICATIONS.

// The authors hereby grant permission to use, copy, modify, distribute,
// and license this software and its documentation for any purpose, provided
// that existing copyright notices are retained in all copies and that this
// notice is included verbatim in any distributions. No written agreement,
// license, or royalty fee is required for any of the authorized uses.
// Modifications to this software may be copyrighted by their authors
// and need not follow the licensing terms described here, provided that
// the new terms are clearly indicated on the first page of each file where
// they apply.

// Last File Update: 16-Aug-1996
// 

#ifndef Edge_h
#define Edge_h

#include <LINK/graph/GraphObject.h>
#include <LINK/basic/general.h>
#include <LINK/basic/Sequence.h>
#include <LINK/basic/List.h>

class Graph;
class Vertex;


class Edge : public GraphObject {
public:
    enum EdgeType { UNDIRECTED = 0, DIRECTED = 1 }; // not DataType

    virtual ~Edge();

    Bool			hasVertex(Vertex* v) const
					{ return _vertices->memberQ(v); }
    Vertex*			sourceVertex()	{ return _vertices->first(); }
    Vertex*			sinkVertex()	{ return _vertices->last(); }
    Sequence<Vertex*>		otherVertices(Vertex* v);
    void			replace(Vertex* old_v, Vertex* new_v);

    Collection<Vertex*>*	vertices() const { return _vertices; }
    int				size() const 
					{ return _vertices?_vertices->size():0;}
    DataType			type() const;	

    Bool			sameSequence(const Edge& obj) const;
    Bool			sameSet(const Edge& obj) const;

    Bool			operator==(const Edge& obj) const;
    Bool			operator!=(const Edge& obj) const;
    Bool			operator>=(const Edge& obj) const;
    Bool			operator>(const Edge& obj) const;
    Bool			operator<(const Edge& obj) const;
    Bool			operator<=(const Edge& obj) const;

    ostream&			display(ostream& stream) const;
    //friend ostream&		operator<<(ostream& stream, const Edge& e);
    void			saveToFile(ofstream* fout, int indent);

protected:
    friend class Graph;
    friend class MHyperGraph;
    friend class MUHyperGraph;
    friend class MDHyperGraph;
    friend class MBinGraph;
    friend class MUBinGraph;
    friend class MDBinGraph;
    Edge(const Edge &E, Flag clone=0);
    Edge(Graph* owner, Collection<Vertex*>* passed_vertices);
    Collection<Vertex*>* 	_vertices;
};


#endif
