
/*
**  This file forms part of the GOBLIN C++ Class Library.
**
**  Written by Birk Eisermann, August 2003.
**
**  Copying, compiling, distribution and modification
**  of this source code is permitted only in accordance
**  with the GOBLIN general licence information.
*/


#ifndef _COMPLEMENT_H_
#define _COMPLEMENT_H_

#include "subgraph.h"

/*!
 * \brief (private) Klasse
 *
 * Dieses Klasse soll nicht direkt instanziiert werden. Sie wird von einem
 * subgraph-Objekt verwendet, um den Graphen: Ursprungsgraph
 * subgraph::getSourceGraph ohne Knoten des eigenen Graphen darzustellen.
 * Dazu wird es der Klasse complementarySubgraph erlaubt, vollständig auf das
 * zugehörige subgraph-Objekt (d.h. auch auf private Member) zu zugreifen.
 *
 * Knoten- und Kantenmanipulation nicht möglich!!
 */
class complementarySubgraph : public virtual abstractSubgraph
{
friend class subgraph;
private:

    subgraph*           Complement;		///<Teilgraph von SourceGraph
    /* Kanten von diesem Subgraph werden separat gespeichert, da nur aufwendig
     * aus WithoutArcs errechnet werden können.    */
    TArc*               Arcs;
    TArc                ArcsCount;
        //im folgenden Kopien von complGraph-Feldern (für direkten Zugriff)
    abstractMixedGraph* S;
    TNode*              WithoutNodes;

protected:

    complementarySubgraph(subgraph *G) throw();
    virtual ~complementarySubgraph() throw();

public:

    //from abstractMixedSubgraph
    virtual abstractMixedGraph* SourceGraph() throw();
    virtual abstractSubgraph*   ComplementarySubgraph() throw();

    virtual bool    HasNode(TNode node) throw(ERRange);

    virtual void    AddArc(TArc a) throw(ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual TArc    AddArc(TNode u,TNode v) throw(ERRange,ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual void    AddNode(TNode u) throw(ERRange,ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual void    OmitArc(TArc a) throw(ERRange,ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual void    OmitArc(TNode u,TNode v) throw(ERRange,ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual void    OmitNode(TNode u) throw(ERRange,ERRejected)
        {throw ERRejected(); /*nicht möglich*/};
    virtual void    OmitIsolatedNodes() throw()
        {throw ERRejected();};

    //from abstractMixedGraph_Int
    virtual TArc    Adjacency(TNode from,TNode to) throw(ERRange);

    virtual TNode   N() throw();
    virtual TArc    M() throw();
    virtual TNode   StartNode(TArc) throw(ERRange);
    virtual TNode   EndNode(TArc) throw(ERRange);
    virtual bool    HasArc(TArc) throw(ERRange);
    virtual TArc    First(TNode) throw(ERRange,ERRejected);
    virtual TArc    Right(TArc,TNode) throw(ERRange,ERRejected);

};

#endif

