/******************************************************************************* * Copyright (c) 2013-2017, Andrés Martinelli . * * 4. Neither the name of the Andrés Martinelli nor the * * names of other contributors may be used to endorse or promote products * * derived from this software without specific prior written permission. * * * * THIS SOFTWARE IS PROVIDED BY ANDRES MARTINELLI ''AS IS'' AND ANY * * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * DISCLAIMED. IN NO EVENT SHALL ANDRES MARTINELLI BE LIABLE FOR ANY * * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;* * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *******************************************************************************/ /** * \file dep_graph.h * \author Andrés Martinelli * \date 2017-07-18 * \brief Header file for dep_graph.c */ #include "sc.h" typedef struct vertexTag { struct ent * ent; /**< Add comment here */ int visited; /**< Add comment here */ struct edgeTag * edges; /**< Add comment here */ struct edgeTag * back_edges; /**< Add comment here */ struct vertexTag * next; /**< Add comment here */ } vertexT; /* For each edge, we need a link to the vertex it connects to and a link to the next edge w.r.t source vertex */ typedef struct edgeTag { vertexT * connectsTo; struct edgeTag * next; } edgeT; typedef struct graphCDT { vertexT * vertices; } graphCDT; typedef struct graphCDT * graphADT; graphADT GraphCreate(); vertexT * GraphAddVertex(graphADT graph , struct ent * ent); vertexT * getVertex(graphADT graph, struct ent * ent, int create); void GraphAddEdge(vertexT * from, vertexT * to); void print_vertexs(); void destroy_list_edges(edgeT * e); void destroy_graph (graphADT graph); void destroy_vertex(struct ent * ent); void delete_reference(vertexT * v_cur, vertexT * vc, int back_reference); void markAllVerticesNotVisited(); void ents_that_depends_on (struct ent * ent); void ents_that_depends_on_range (int r1, int c1, int r2, int c2); int GraphIsReachable(vertexT * src, vertexT * dest, int back_dep); void rebuild_graph(); void EvalAll(); void EvalAllVertexs(); void EvalJustOneVertex(register struct ent * p, int i, int j, int rebuild_graph);