blob: 860bb083af5de352bc65f2ce4d842ffe16b4cec6 [file] [log] [blame]
/*************************************************************************
*
* PathFinder: finding a series of labeled nodes within a
* two-layer directed, cyclic graph.
* Copyright (2013) Sandia Corporation
*
* Copyright (2013) Sandia Corporation. Under the terms of Contract
* DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
* retains certain rights in this software.
*
* This file is part of PathFinder.
*
* PathFinder is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* PathFinder 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.
*
* You should have received a copy of the GNU General Public License
* along with PathFinder. If not, see <http://www.gnu.org/licenses/>.
*
* Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov)
*
*/
/*
* node.h
*
* Created on: Feb 1, 2013
* Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder
*/
#ifndef NODE_H_
#define NODE_H_
/* --------
* Nodes are the basic data structure within the graph. Nodes hold information
* regarding their identity (id, label, type, etc.) and information about their
* edges (list of edges, number of edges).
*
* Node.h/.c contains the data definitions for nodes and edges as well as con-
* tainers for nodes (NodeList, NodePtrVec) and edges (EdgeList)
*/
typedef enum
{
exteriorNode, /* Default unless Node_setParent is called */
interiorNode,
entranceNode /* special interior node(s) that begin the interior graph */
} NodeType;
/* -------------------------------------------
* Node Definitions
*
*/
typedef struct NodeStruct Node;
typedef struct NodeListStruct NodeList;
typedef struct EdgeListStruct EdgeList;
#include "bitfield.h"
#include "vectorUtils.h"
#include <stdbool.h>
struct NodeStruct
{
int id; /* id value for the node - typically associated with an address of the basic block */
int nodeCount; /* a unique index for this node (0 .. whatever) */
char *label;
int labelIdx;
NodeType type;
Node *container; /* if this is an interior node, this points to the outer node containing this one */
NodeList *interiorNodes; /* All the nodes contained in this node's subgraph */
EdgeList *edges; /* Nodes that can be accessed from this node (includes entrance nodes) */
int edgeCount; /* edges from this node to others (DOES NOT INLCUDE INTRANCE NODES) */
int entranceCount; /* number of entrance nodes (if any) */
};
/* "methods" for nodes */
Node *Node_new( int id, int nodeCount ); /* Constructor */
void Node_delete( Node *trash ); /* Destructor */
Node *Node_duplicate(Node *from, int newIndex); /* Duplicates node data, BUT NO EDGE INFORMATION */
void Node_setParent( Node *this, Node *parent ); /* Identifies the Upper-level node containing inner level node */
void Node_addInteriorNode( Node *this, Node *interior ); /* Inserts interior node into parent list */
bool Node_addEdgeToNode(Node *this, Node *node); /* Node* based insertion method */
/* -------------------------------------------
* Node List Definitions
*
*/
struct NodeListStruct
{
Node *node;
NodeList *nextNode;
};
/* "methods" for NodeLists */
NodeList *NodeList_new(); /* Constructor */
/* Destructor - also frees the data allocated for nodes if freeMemory is
* true (calls their "destructor )
*/
void NodeList_clear( NodeList *trash, bool deleteNodes );
/* insertFront modifies the list passed in such that the first element
* points to the new node. This is done by duplicating the first element
* into a new element, and then modifying the true first element to point
* to the node passed and and the created element (which references the
* rest of the list).
*/
bool NodeList_insertFront( NodeList *this, Node *newFront );
/* Create a new node list element, have it reference the node passed in
* and then put it in the back of the list. Returns true on success
*/
bool NodeList_insertBack( NodeList *this, Node *newBack );
/* -------------------------------------------
* Edge List Definitions
*
* Edges are processed a little differently than nodes. As soon as a
* node is identified, it is created. However, the edges may be
* identified prior to the creation of the node to which it references.
* Ergo, there's a two pass process - first identifying the edges,
* then subsequently setting the pointers to reference them.
*
* Rather than making a dual structure "Edge" and "EdgeList" pair,
* the author is combining the data into a single structure.
*/
struct EdgeListStruct
{
int targetNodeId;
Node *targetNode;
EdgeList *nextEdge;
};
EdgeList *EdgeList_new(); /* Constructor */
void EdgeList_clear(EdgeList* this); /* Destructor */
bool EdgeList_insertNodeId(EdgeList *this, int targetNodeId); /* Id based insertion method */
#endif /* NODE_H_ */