/*
* $Revision: 2559 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
***************************************************************/
/** \file
* \brief Declaration of class Edge.
*
* \author Stefan Hachul
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
#ifndef OGDF_EDGE_H
#define OGDF_EDGE_H
#include "../basic/Graph.h"
namespace ogdf {
class Edge
{
//helping data structure for deleting parallel edges in class FMMMLayout and
//Multilevel (needed for the bucket sort algorithm)
//outputstream for Edge
friend ostream &operator<< (ostream & output, const Edge & E)
{
output <<"edge_index " << E.e->index() << " Graph_ptr " << E.Graph_ptr << " angle"
<< E.angle << " cut vertex " << E.cut_vertex->index();
return output;
}
//inputstream for Edge
friend istream &operator>> (istream & input, Edge & E)
{
int c = input.peek();
if (c != EOF)
input >> E;//.e>>E.Graph_ptr;
return input;
}
public:
//constructor
Edge() {
e = NULL;
Graph_ptr = NULL;
angle = 0;
cut_vertex = NULL;
}
~Edge() { } //destructor
void set_Edge (edge f,Graph* g_ptr) {
Graph_ptr = g_ptr;
e = f;
}
void set_Edge(edge f,double i,node c) {
angle = i;
e = f;
cut_vertex = c;
}
Graph* get_Graph_ptr() const { return Graph_ptr; }
edge get_edge() const { return e; }
double get_angle() const { return angle; }
node get_cut_vertex() const { return cut_vertex; }
private:
edge e;
Graph* Graph_ptr;
double angle;
node cut_vertex;
};
class EdgeMaxBucketFunc : public BucketFunc
{
public:
EdgeMaxBucketFunc() {};
int getBucket(const Edge& E) { return get_max_index(E); }
private:
//returns the maximum index of e
int get_max_index(const Edge& E) {
int source_index = E.get_edge()->source()->index();
int target_index = E.get_edge()->target()->index();
OGDF_ASSERT(source_index != target_index);
if(source_index < target_index) return target_index;
else /*if (source_index > target_index)*/ return source_index;
//else cout<<"Error Edge::get_max_index() The Graph has a self loop"<
{
public:
EdgeMinBucketFunc() { }
int getBucket(const Edge& E) { return get_min_index(E); }
private:
//returns the minimum index of e
int get_min_index(const Edge& E)
{
int source_index = E.get_edge()->source()->index();
int target_index = E.get_edge()->target()->index();
OGDF_ASSERT(source_index != target_index);
if(source_index < target_index) return source_index;
else /*if (source_index > target_index)*/ return target_index;
//else cout<<"Error Edge::get_min_index() The Graph has a self loop"<