/* stateNode.h */


#ifndef STATENODE_H
#define STATENODE_H



// MERKE:
// Wo immer ein StateNode-Pointer als Parameter zu uebergeben ist, kann dies
// auch ein NULL-Pointer sein. Entsprechende Massnahmen werden in den Funktionen
// vorgenommen.



/*
 * Struktur eines Zustandsknoten.
 */
typedef struct _StateNode {
  char *name;                          // fuer Knotenname
  struct _StateNode **stateNodes;      // fuer Array mit Pointer auf Knoten;
                                       //  NULL, falls kein Array (= mit keinem
                                       //  andern Knoten verbunden)
  int numStateNodes;                   // Anzahl verbundener Knoten (= Laenge
                                       //  des obigen Array
} StateNode;


typedef enum _boolean {FALSE, TRUE} boolean;



/*
 * Kreiere ein Objekt vom Typ StateNode auf dem Heap mit Namen name (ebenfalls
 * auf dem Heap), anfaenglich ohne Verknuepfung zu andern Knoten (= kein Array).
 * Rueckgabewert NULL, false Objekt nicht vollstaendig kreiert werden konnte.
 */
StateNode *createStateNode(char *name);



/*
 * Stelle Namen des StateNode sn am stdout dar.
 */
void printStateNodeName(StateNode *sn);



/*
 * Verknuepfe den StateNode source mit dem StateNode dest. Alloziere noetiges
 * Memory auf dem Heap.
 * Rueckgabewert FALSE, falls Allokation nicht erfolgreich war, sonst TRUE.
 */
boolean connectStateNode(StateNode *dest, StateNode *source);



/*
 * Stelle textliche Repraesentation des StateNode sn am stdout dar.
 */
void printStateNode(StateNode *sn);



/*
 * Loese die Verknuepfung vom StateNode source zum StateNode dest. Gib alloziertes
 * Memory zurueck.
 * Rueckgabewert FALSE, falls Enfernen der Knotenverbindung nicht erfolgreich war,
 * sonst TRUE.
 */
boolean disconnectStateNode(StateNode *dest, StateNode *source);



/*
 * Dealloziere StateNode sn vom Heap.
 */
void deleteStateNode(StateNode *sn);

#endif
