summaryrefslogtreecommitdiff
path: root/ufo/ufo-graph.h
blob: 0673e9ca80e7d8f93fa29f553f2732086b98bc24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Copyright (C) 2011-2013 Karlsruhe Institute of Technology
 *
 * This file is part of Ufo.
 *
 * This library 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.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __UFO_GRAPH_H
#define __UFO_GRAPH_H

#if !defined (__UFO_H_INSIDE__) && !defined (UFO_COMPILATION)
#error "Only <ufo/ufo.h> can be included directly."
#endif

#include <ufo/ufo-node.h>

G_BEGIN_DECLS

#define UFO_TYPE_GRAPH             (ufo_graph_get_type())
#define UFO_GRAPH(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), UFO_TYPE_GRAPH, UfoGraph))
#define UFO_IS_GRAPH(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), UFO_TYPE_GRAPH))
#define UFO_GRAPH_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), UFO_TYPE_GRAPH, UfoGraphClass))
#define UFO_IS_GRAPH_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), UFO_TYPE_GRAPH))
#define UFO_GRAPH_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), UFO_TYPE_GRAPH, UfoGraphClass))

typedef struct _UfoGraph           UfoGraph;
typedef struct _UfoGraphClass      UfoGraphClass;
typedef struct _UfoGraphPrivate    UfoGraphPrivate;
typedef struct _UfoEdge            UfoEdge;

typedef gboolean (*UfoFilterPredicate) (UfoNode *node, gpointer user_data);

/**
 * UfoEdge:
 * @source: source node
 * @target: target node
 * @label: label
 *
 * An edge in a #UfoGraph.
 */
struct _UfoEdge {
    UfoNode     *source;
    UfoNode     *target;
    gpointer     label;
};

/**
 * UfoGraph:
 *
 * Main object for organizing filters. The contents of the #UfoGraph structure
 * are private and should only be accessed via the provided API.
 */
struct _UfoGraph {
    /*< private >*/
    GObject parent_instance;

    UfoGraphPrivate *priv;
};

/**
 * UfoGraphClass:
 *
 * #UfoGraph class
 */
struct _UfoGraphClass {
    /*< private >*/
    GObjectClass parent_class;
};

UfoGraph   *ufo_graph_new                   (void);
void        ufo_graph_connect_nodes         (UfoGraph       *graph,
                                             UfoNode        *source,
                                             UfoNode        *target,
                                             gpointer        label);
gboolean    ufo_graph_is_connected          (UfoGraph       *graph,
                                             UfoNode        *from,
                                             UfoNode        *to);
void        ufo_graph_remove_edge           (UfoGraph       *graph,
                                             UfoNode        *source,
                                             UfoNode        *target);
gpointer    ufo_graph_get_edge_label        (UfoGraph       *graph,
                                             UfoNode        *source,
                                             UfoNode        *target);
guint       ufo_graph_get_num_nodes         (UfoGraph       *graph);
GList      *ufo_graph_get_nodes             (UfoGraph       *graph);
GList      *ufo_graph_get_nodes_filtered    (UfoGraph       *graph,
                                             UfoFilterPredicate func,
                                             gpointer        user_data);
guint       ufo_graph_get_num_edges         (UfoGraph       *graph);
GList      *ufo_graph_get_edges             (UfoGraph       *graph);
GList      *ufo_graph_get_roots             (UfoGraph       *graph);
GList      *ufo_graph_get_leaves            (UfoGraph       *graph);
guint       ufo_graph_get_num_predecessors  (UfoGraph       *graph,
                                             UfoNode        *node);
GList      *ufo_graph_get_predecessors      (UfoGraph       *graph,
                                             UfoNode        *node);
guint       ufo_graph_get_num_successors    (UfoGraph       *graph,
                                             UfoNode        *node);
GList      *ufo_graph_get_successors        (UfoGraph       *graph,
                                             UfoNode        *node);
GList      *ufo_graph_find_longest_path     (UfoGraph       *graph,
                                             UfoFilterPredicate pred,
                                             gpointer        user_data);
GList      *ufo_graph_flatten               (UfoGraph       *graph);
void        ufo_graph_expand                (UfoGraph       *graph,
                                             GList          *path);
UfoGraph   *ufo_graph_copy                  (UfoGraph       *graph,
                                             GError        **error);
UfoGraph   *ufo_graph_shallow_copy          (UfoGraph       *graph);
UfoGraph   *ufo_graph_shallow_subgraph      (UfoGraph       *graph,
                                             UfoFilterPredicate pred,
                                             gpointer        user_data);
void        ufo_graph_dump_dot              (UfoGraph       *graph,
                                             const gchar    *filename);
GType       ufo_graph_get_type              (void);

G_END_DECLS

#endif