lemongraph 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +8 -0
  3. data/LICENSE +674 -0
  4. data/README.md +6 -0
  5. data/ext/lemon-1.3.1/AUTHORS +26 -0
  6. data/ext/lemon-1.3.1/CMakeLists.txt +371 -0
  7. data/ext/lemon-1.3.1/INSTALL +167 -0
  8. data/ext/lemon-1.3.1/LICENSE +32 -0
  9. data/ext/lemon-1.3.1/NEWS +337 -0
  10. data/ext/lemon-1.3.1/README +50 -0
  11. data/ext/lemon-1.3.1/cmake/FindCOIN.cmake +110 -0
  12. data/ext/lemon-1.3.1/cmake/FindGLPK.cmake +55 -0
  13. data/ext/lemon-1.3.1/cmake/FindGhostscript.cmake +10 -0
  14. data/ext/lemon-1.3.1/cmake/FindILOG.cmake +102 -0
  15. data/ext/lemon-1.3.1/cmake/FindSOPLEX.cmake +23 -0
  16. data/ext/lemon-1.3.1/cmake/LEMONConfig.cmake.in +13 -0
  17. data/ext/lemon-1.3.1/cmake/nsis/lemon.ico +0 -0
  18. data/ext/lemon-1.3.1/cmake/nsis/uninstall.ico +0 -0
  19. data/ext/lemon-1.3.1/cmake/version.cmake +1 -0
  20. data/ext/lemon-1.3.1/cmake/version.cmake.in +1 -0
  21. data/ext/lemon-1.3.1/contrib/CMakeLists.txt +19 -0
  22. data/ext/lemon-1.3.1/lemon/CMakeLists.txt +91 -0
  23. data/ext/lemon-1.3.1/lemon/adaptors.h +3638 -0
  24. data/ext/lemon-1.3.1/lemon/arg_parser.cc +474 -0
  25. data/ext/lemon-1.3.1/lemon/arg_parser.h +440 -0
  26. data/ext/lemon-1.3.1/lemon/assert.h +214 -0
  27. data/ext/lemon-1.3.1/lemon/base.cc +37 -0
  28. data/ext/lemon-1.3.1/lemon/bellman_ford.h +1116 -0
  29. data/ext/lemon-1.3.1/lemon/bfs.h +1754 -0
  30. data/ext/lemon-1.3.1/lemon/bin_heap.h +347 -0
  31. data/ext/lemon-1.3.1/lemon/binomial_heap.h +445 -0
  32. data/ext/lemon-1.3.1/lemon/bits/alteration_notifier.h +472 -0
  33. data/ext/lemon-1.3.1/lemon/bits/array_map.h +351 -0
  34. data/ext/lemon-1.3.1/lemon/bits/bezier.h +174 -0
  35. data/ext/lemon-1.3.1/lemon/bits/default_map.h +182 -0
  36. data/ext/lemon-1.3.1/lemon/bits/edge_set_extender.h +627 -0
  37. data/ext/lemon-1.3.1/lemon/bits/enable_if.h +131 -0
  38. data/ext/lemon-1.3.1/lemon/bits/graph_adaptor_extender.h +401 -0
  39. data/ext/lemon-1.3.1/lemon/bits/graph_extender.h +1332 -0
  40. data/ext/lemon-1.3.1/lemon/bits/lock.h +65 -0
  41. data/ext/lemon-1.3.1/lemon/bits/map_extender.h +332 -0
  42. data/ext/lemon-1.3.1/lemon/bits/path_dump.h +177 -0
  43. data/ext/lemon-1.3.1/lemon/bits/solver_bits.h +194 -0
  44. data/ext/lemon-1.3.1/lemon/bits/traits.h +388 -0
  45. data/ext/lemon-1.3.1/lemon/bits/variant.h +494 -0
  46. data/ext/lemon-1.3.1/lemon/bits/vector_map.h +244 -0
  47. data/ext/lemon-1.3.1/lemon/bits/windows.cc +166 -0
  48. data/ext/lemon-1.3.1/lemon/bits/windows.h +44 -0
  49. data/ext/lemon-1.3.1/lemon/bucket_heap.h +594 -0
  50. data/ext/lemon-1.3.1/lemon/capacity_scaling.h +1014 -0
  51. data/ext/lemon-1.3.1/lemon/cbc.cc +460 -0
  52. data/ext/lemon-1.3.1/lemon/cbc.h +129 -0
  53. data/ext/lemon-1.3.1/lemon/christofides_tsp.h +254 -0
  54. data/ext/lemon-1.3.1/lemon/circulation.h +807 -0
  55. data/ext/lemon-1.3.1/lemon/clp.cc +464 -0
  56. data/ext/lemon-1.3.1/lemon/clp.h +164 -0
  57. data/ext/lemon-1.3.1/lemon/color.cc +44 -0
  58. data/ext/lemon-1.3.1/lemon/color.h +204 -0
  59. data/ext/lemon-1.3.1/lemon/concept_check.h +77 -0
  60. data/ext/lemon-1.3.1/lemon/concepts/bpgraph.h +1029 -0
  61. data/ext/lemon-1.3.1/lemon/concepts/digraph.h +491 -0
  62. data/ext/lemon-1.3.1/lemon/concepts/graph.h +788 -0
  63. data/ext/lemon-1.3.1/lemon/concepts/graph_components.h +2134 -0
  64. data/ext/lemon-1.3.1/lemon/concepts/heap.h +324 -0
  65. data/ext/lemon-1.3.1/lemon/concepts/maps.h +223 -0
  66. data/ext/lemon-1.3.1/lemon/concepts/path.h +312 -0
  67. data/ext/lemon-1.3.1/lemon/config.h.in +22 -0
  68. data/ext/lemon-1.3.1/lemon/connectivity.h +1688 -0
  69. data/ext/lemon-1.3.1/lemon/core.h +2506 -0
  70. data/ext/lemon-1.3.1/lemon/cost_scaling.h +1607 -0
  71. data/ext/lemon-1.3.1/lemon/counter.h +249 -0
  72. data/ext/lemon-1.3.1/lemon/cplex.cc +994 -0
  73. data/ext/lemon-1.3.1/lemon/cplex.h +292 -0
  74. data/ext/lemon-1.3.1/lemon/cycle_canceling.h +1230 -0
  75. data/ext/lemon-1.3.1/lemon/dfs.h +1637 -0
  76. data/ext/lemon-1.3.1/lemon/dheap.h +352 -0
  77. data/ext/lemon-1.3.1/lemon/dijkstra.h +1303 -0
  78. data/ext/lemon-1.3.1/lemon/dim2.h +726 -0
  79. data/ext/lemon-1.3.1/lemon/dimacs.h +448 -0
  80. data/ext/lemon-1.3.1/lemon/edge_set.h +1420 -0
  81. data/ext/lemon-1.3.1/lemon/edmonds_karp.h +556 -0
  82. data/ext/lemon-1.3.1/lemon/elevator.h +982 -0
  83. data/ext/lemon-1.3.1/lemon/error.h +276 -0
  84. data/ext/lemon-1.3.1/lemon/euler.h +287 -0
  85. data/ext/lemon-1.3.1/lemon/fib_heap.h +475 -0
  86. data/ext/lemon-1.3.1/lemon/fractional_matching.h +2139 -0
  87. data/ext/lemon-1.3.1/lemon/full_graph.h +1082 -0
  88. data/ext/lemon-1.3.1/lemon/glpk.cc +1012 -0
  89. data/ext/lemon-1.3.1/lemon/glpk.h +263 -0
  90. data/ext/lemon-1.3.1/lemon/gomory_hu.h +568 -0
  91. data/ext/lemon-1.3.1/lemon/graph_to_eps.h +1186 -0
  92. data/ext/lemon-1.3.1/lemon/greedy_tsp.h +251 -0
  93. data/ext/lemon-1.3.1/lemon/grid_graph.h +699 -0
  94. data/ext/lemon-1.3.1/lemon/grosso_locatelli_pullan_mc.h +840 -0
  95. data/ext/lemon-1.3.1/lemon/hao_orlin.h +1015 -0
  96. data/ext/lemon-1.3.1/lemon/hartmann_orlin_mmc.h +654 -0
  97. data/ext/lemon-1.3.1/lemon/howard_mmc.h +651 -0
  98. data/ext/lemon-1.3.1/lemon/hypercube_graph.h +459 -0
  99. data/ext/lemon-1.3.1/lemon/insertion_tsp.h +533 -0
  100. data/ext/lemon-1.3.1/lemon/karp_mmc.h +590 -0
  101. data/ext/lemon-1.3.1/lemon/kruskal.h +324 -0
  102. data/ext/lemon-1.3.1/lemon/lemon.pc.in +10 -0
  103. data/ext/lemon-1.3.1/lemon/lgf_reader.h +3854 -0
  104. data/ext/lemon-1.3.1/lemon/lgf_writer.h +2687 -0
  105. data/ext/lemon-1.3.1/lemon/list_graph.h +2510 -0
  106. data/ext/lemon-1.3.1/lemon/lp.h +95 -0
  107. data/ext/lemon-1.3.1/lemon/lp_base.cc +30 -0
  108. data/ext/lemon-1.3.1/lemon/lp_base.h +2147 -0
  109. data/ext/lemon-1.3.1/lemon/lp_skeleton.cc +143 -0
  110. data/ext/lemon-1.3.1/lemon/lp_skeleton.h +234 -0
  111. data/ext/lemon-1.3.1/lemon/maps.h +4057 -0
  112. data/ext/lemon-1.3.1/lemon/matching.h +3505 -0
  113. data/ext/lemon-1.3.1/lemon/math.h +77 -0
  114. data/ext/lemon-1.3.1/lemon/max_cardinality_search.h +794 -0
  115. data/ext/lemon-1.3.1/lemon/min_cost_arborescence.h +808 -0
  116. data/ext/lemon-1.3.1/lemon/nagamochi_ibaraki.h +702 -0
  117. data/ext/lemon-1.3.1/lemon/nauty_reader.h +113 -0
  118. data/ext/lemon-1.3.1/lemon/nearest_neighbor_tsp.h +238 -0
  119. data/ext/lemon-1.3.1/lemon/network_simplex.h +1659 -0
  120. data/ext/lemon-1.3.1/lemon/opt2_tsp.h +367 -0
  121. data/ext/lemon-1.3.1/lemon/pairing_heap.h +474 -0
  122. data/ext/lemon-1.3.1/lemon/path.h +1164 -0
  123. data/ext/lemon-1.3.1/lemon/planarity.h +2754 -0
  124. data/ext/lemon-1.3.1/lemon/preflow.h +985 -0
  125. data/ext/lemon-1.3.1/lemon/quad_heap.h +343 -0
  126. data/ext/lemon-1.3.1/lemon/radix_heap.h +438 -0
  127. data/ext/lemon-1.3.1/lemon/radix_sort.h +487 -0
  128. data/ext/lemon-1.3.1/lemon/random.cc +29 -0
  129. data/ext/lemon-1.3.1/lemon/random.h +1005 -0
  130. data/ext/lemon-1.3.1/lemon/smart_graph.h +1344 -0
  131. data/ext/lemon-1.3.1/lemon/soplex.cc +465 -0
  132. data/ext/lemon-1.3.1/lemon/soplex.h +158 -0
  133. data/ext/lemon-1.3.1/lemon/static_graph.h +476 -0
  134. data/ext/lemon-1.3.1/lemon/suurballe.h +776 -0
  135. data/ext/lemon-1.3.1/lemon/time_measure.h +610 -0
  136. data/ext/lemon-1.3.1/lemon/tolerance.h +242 -0
  137. data/ext/lemon-1.3.1/lemon/unionfind.h +1824 -0
  138. data/ext/lemon-1.3.1/scripts/unify-sources.sh +390 -0
  139. data/ext/lemon-1.3.1/scripts/valgrind-wrapper.sh +22 -0
  140. data/ext/lemongraph/arc_map.cc +1007 -0
  141. data/ext/lemongraph/digraph.cc +282 -0
  142. data/ext/lemongraph/digraph_arc.cc +153 -0
  143. data/ext/lemongraph/digraph_node.cc +277 -0
  144. data/ext/lemongraph/edge_map.cc +770 -0
  145. data/ext/lemongraph/extconf.rb +53 -0
  146. data/ext/lemongraph/graph.cc +351 -0
  147. data/ext/lemongraph/graph_arc.cc +95 -0
  148. data/ext/lemongraph/graph_edge.cc +153 -0
  149. data/ext/lemongraph/graph_item.cc +76 -0
  150. data/ext/lemongraph/graph_node.cc +321 -0
  151. data/ext/lemongraph/lemongraph.cc +260 -0
  152. data/ext/lemongraph/lemongraph.hh +295 -0
  153. data/ext/lemongraph/lemongraph.map +6 -0
  154. data/ext/lemongraph/lemongraph_export.hh +31 -0
  155. data/ext/lemongraph/node_map.cc +1011 -0
  156. data/lemongraph.gemspec +176 -0
  157. data/lib/lemongraph/graphviz.rb +240 -0
  158. data/lib/lemongraph/version.rb +4 -0
  159. data/lib/lemongraph.rb +21 -0
  160. data/samples/lemondeps.rb +38 -0
  161. metadata +202 -0
@@ -0,0 +1,76 @@
1
+ /* Copyright (C) 2022 Théotime Bollengier <theotime.bollengier@ensta-bretagne.fr>
2
+ *
3
+ * This file is part of LemonGraph. <https://gitlab.ensta-bretagne.fr/bollenth/lemongraph>
4
+ *
5
+ * LemonGraph is free software: you can redistribute it and/or modify it
6
+ * under the terms of the GNU General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License,
8
+ * or (at your option) any later version.
9
+ *
10
+ * LemonGraph is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with LemonGraph. If not, see <https://www.gnu.org/licenses/>. 
17
+ */
18
+
19
+
20
+ #include "lemongraph.hh"
21
+
22
+
23
+ VALUE c_GraphItem;
24
+
25
+
26
+ /* Document-class: LemonGraph::GraphItem
27
+ * Base class for nodes, arcs and edges of directed or undirected graphs.
28
+ */
29
+
30
+
31
+ /* @!visibility private
32
+ */
33
+ VALUE lemongraph_graphitem_initialize(VALUE self, VALUE id, VALUE graph)
34
+ {
35
+ if (!RB_FIXNUM_P(id))
36
+ rb_raise(rb_eRuntimeError, "expecting an integer as ID, not a %s", rb_obj_classname(id));
37
+ rb_iv_set(self, "@id", id);
38
+ rb_iv_set(self, "@graph", graph);
39
+ return self;
40
+ }
41
+
42
+
43
+ /* Returns _true_ if _other_ has the same class as _self_ and _self_ and _other_ share the same graph and id.
44
+ * @return [Boolean]
45
+ */
46
+ VALUE lemongraph_graphitem_is_equal(VALUE self, VALUE other)
47
+ {
48
+ if (rb_class_of(other) != rb_class_of(self))
49
+ return Qfalse;
50
+ return ((rb_iv_get(self, "@id") == rb_iv_get(other, "@id")) && (rb_iv_get(self, "@graph") == rb_iv_get(other, "@graph"))) ? Qtrue : Qfalse;
51
+ }
52
+
53
+
54
+ /* @return [Boolean]
55
+ */
56
+ VALUE lemongraph_graphitem_is_notequal(VALUE self, VALUE other)
57
+ {
58
+ if (rb_class_of(other) != rb_class_of(self))
59
+ return Qtrue;
60
+ return ((rb_iv_get(self, "@id") != rb_iv_get(other, "@id")) || (rb_iv_get(self, "@graph") != rb_iv_get(other, "@graph"))) ? Qtrue : Qfalse;
61
+ }
62
+
63
+
64
+ /* Compare _self_ with another graph item.
65
+ * Returns _nil_ if _other_ and _self_ do not have the same class, else returns `self.id <=> other.id`.
66
+ * @param other [GraphItem]
67
+ * @return [Boolean,nil]
68
+ */
69
+ VALUE lemongraph_graphitem_compare(VALUE self, VALUE other)
70
+ {
71
+ if (rb_class_of(other) != rb_class_of(self) || rb_iv_get(self, "@graph") != rb_iv_get(other, "@graph"))
72
+ return Qnil;
73
+ return rb_funcall(rb_iv_get(self, "@id"), id_comp, 1, rb_iv_get(other, "@id"));
74
+ }
75
+
76
+
@@ -0,0 +1,321 @@
1
+ /* Copyright (C) 2022 Théotime Bollengier <theotime.bollengier@ensta-bretagne.fr>
2
+ *
3
+ * This file is part of LemonGraph. <https://gitlab.ensta-bretagne.fr/bollenth/lemongraph>
4
+ *
5
+ * LemonGraph is free software: you can redistribute it and/or modify it
6
+ * under the terms of the GNU General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License,
8
+ * or (at your option) any later version.
9
+ *
10
+ * LemonGraph is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with LemonGraph. If not, see <https://www.gnu.org/licenses/>. 
17
+ */
18
+
19
+
20
+ #include "lemongraph.hh"
21
+
22
+
23
+ VALUE c_UnNode;
24
+
25
+
26
+ /* Document-class: LemonGraph::Graph::Node
27
+ * Node of a {Graph}.
28
+ */
29
+
30
+
31
+ VALUE lemongraph_make_unnode(const lemon::ListGraph::Node& node, VALUE graph)
32
+ {
33
+ if (node == lemon::INVALID)
34
+ return Qnil;
35
+ VALUE args[2] = {INT2NUM(lemon::ListGraph::id(node)), graph};
36
+ return rb_class_new_instance(2, args, c_UnNode);
37
+ }
38
+
39
+
40
+ /* @!visibility private
41
+ */
42
+ VALUE lemongraph_unnode_initialize(VALUE self, VALUE id, VALUE graph)
43
+ {
44
+ if (rb_obj_is_kind_of(graph, c_Graph) != Qtrue) {
45
+ rb_raise(rb_eRuntimeError, "expecting a %" PRIsVALUE " as graph, not a %s",
46
+ rb_class_name(c_Graph), rb_obj_classname(graph));
47
+ }
48
+ VALUE args[2] = {id, graph};
49
+ return rb_call_super(2, args);
50
+ }
51
+
52
+
53
+ /* Test if the node is valid, i.e. it is a real node of the graph it belongs to.
54
+ * @return [Boolean]
55
+ */
56
+ VALUE lemongraph_unnode_is_valid(VALUE self)
57
+ {
58
+ return lemongraph_graph_rb2ref(rb_iv_get(self, "@graph")).valid(lemongraph_rbunnode2unnode(self)) ? Qtrue : Qfalse;
59
+ }
60
+
61
+
62
+ /* Erases the node from the graph it belongs to.
63
+ * @return [self]
64
+ */
65
+ VALUE lemongraph_unnode_erase(VALUE self)
66
+ {
67
+ lemongraph_graph_rb2ref(rb_iv_get(self, "@graph")).erase(lemongraph_rbunnode2unnode(self));
68
+ return self;
69
+ }
70
+
71
+
72
+ /* Contracts _self_ into the given node.
73
+ * _self_ is removed, but instead of deleting its incident edges, they are joined to node _other_.
74
+ * If _remove_new_loops_ is _true_ (this is the default), then the newly created loops are removed.
75
+ * @return [Node] _other_ is returned, _self_ is erased
76
+ * @overload contract_in(other, remove_new_loops = true)
77
+ * @param other [Node] the node in which to contract _self_
78
+ * @param remove_new_loops [Boolean] whether or not to remove newly created loops
79
+ */
80
+ VALUE lemongraph_unnode_contract(int argc, VALUE *argv, VALUE self)
81
+ {
82
+ if (argc < 1 || argc > 2)
83
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 1..2)", argc);
84
+ bool remove_new_loops = true;
85
+ VALUE other = argv[0];
86
+ if (argc == 2)
87
+ remove_new_loops = (argv[1] != Qnil && argv[1] != Qfalse);
88
+ VALUE rbg = rb_iv_get(self, "@graph");
89
+ lemon::ListGraph &g = lemongraph_graph_rb2ref(rbg);
90
+ lemongraph_graph_raise_if_not_valid_node(g, rbg, self);
91
+ lemongraph_graph_raise_if_not_valid_node(g, rbg, other);
92
+ g.contract(lemongraph_rbunnode2unnode(other), lemongraph_rbunnode2unnode(self), remove_new_loops);
93
+ return other;
94
+ }
95
+
96
+
97
+ /* Number of edges incident to the node.
98
+ * @return [Integer]
99
+ */
100
+ VALUE lemongraph_unnode_nb_edges(VALUE self)
101
+ {
102
+ VALUE rbg = rb_iv_get(self, "@graph");
103
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
104
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
105
+ return INT2NUM(lemon::countIncEdges(g, n));
106
+ }
107
+
108
+
109
+ /* Returns an array containing all the edges incident to the node.
110
+ * @return [Array<Edge>]
111
+ */
112
+ VALUE lemongraph_unnode_edges(VALUE self)
113
+ {
114
+ VALUE rbg = rb_iv_get(self, "@graph");
115
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
116
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
117
+ VALUE ar = rb_ary_new_capa(lemon::countIncEdges(g, n));
118
+ for (lemon::ListGraph::IncEdgeIt e(g, n); e != lemon::INVALID; ++e)
119
+ rb_ary_push(ar, lemongraph_make_unedge(e, rbg));
120
+ return ar;
121
+ }
122
+
123
+
124
+ static VALUE lemongraph_unnode_edgeenum_nbedges(VALUE obj, VALUE args, VALUE eobj)
125
+ {
126
+ (void)args;
127
+ (void)eobj;
128
+ return lemongraph_unnode_nb_edges(obj);
129
+ }
130
+
131
+
132
+ /* Calls the block, if given, once for each edges incident to the node.
133
+ * The edges are passed as parameters to the block.
134
+ *
135
+ * Returns _self_, or, if no block is given, an Enumerator is returned.
136
+ * @return [self, Enumerator]
137
+ * @overload each_edge
138
+ * @yieldparam edge [Edge]
139
+ * @return [self]
140
+ * @overload each_edge
141
+ * @return [Enumerator]
142
+ */
143
+ VALUE lemongraph_unnode_each_edge(VALUE self)
144
+ {
145
+ RETURN_SIZED_ENUMERATOR(self, 0, 0, lemongraph_unnode_edgeenum_nbedges);
146
+ VALUE rbg = rb_iv_get(self, "@graph");
147
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
148
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
149
+ for (lemon::ListGraph::IncEdgeIt e(g, n); e != lemon::INVALID; ++e)
150
+ rb_yield(lemongraph_make_unedge(e, rbg));
151
+ return self;
152
+ }
153
+
154
+
155
+ /* Number of incoming arcs to the node.
156
+ * @return [Integer]
157
+ */
158
+ VALUE lemongraph_unnode_nb_inarcs(VALUE self)
159
+ {
160
+ VALUE rbg = rb_iv_get(self, "@graph");
161
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
162
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
163
+ return INT2NUM(lemon::countInArcs(g, n));
164
+ }
165
+
166
+
167
+ /* Returns an array containing all the incoming arcs to the node.
168
+ * @return [Array<Arc>]
169
+ */
170
+ VALUE lemongraph_unnode_inarcs(VALUE self)
171
+ {
172
+ VALUE rbg = rb_iv_get(self, "@graph");
173
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
174
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
175
+ VALUE ar = rb_ary_new_capa(lemon::countInArcs(g, n));
176
+ for (lemon::ListGraph::InArcIt a(g, n); a != lemon::INVALID; ++a)
177
+ rb_ary_push(ar, lemongraph_make_unarc(a, rbg));
178
+ return ar;
179
+ }
180
+
181
+
182
+ static VALUE lemongraph_unnode_inarcenum_nbinarcs(VALUE obj, VALUE args, VALUE eobj)
183
+ {
184
+ (void)args;
185
+ (void)eobj;
186
+ return lemongraph_unnode_nb_inarcs(obj);
187
+ }
188
+
189
+
190
+ /* Calls the block, if given, once for each incoming {Arc} of the node.
191
+ * The arcs are passed as parameters to the block.
192
+ *
193
+ * Returns _self_, or, if no block is given, an Enumerator is returned.
194
+ * @return [self, Enumerator]
195
+ * @overload each_inarc
196
+ * @yieldparam arc [Arc]
197
+ * @return [self]
198
+ * @overload each_inarc
199
+ * @return [Enumerator]
200
+ */
201
+ VALUE lemongraph_unnode_each_inarc(VALUE self)
202
+ {
203
+ RETURN_SIZED_ENUMERATOR(self, 0, 0, lemongraph_unnode_inarcenum_nbinarcs);
204
+ VALUE rbg = rb_iv_get(self, "@graph");
205
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
206
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
207
+ for (lemon::ListGraph::InArcIt a(g, n); a != lemon::INVALID; ++a)
208
+ rb_yield(lemongraph_make_unarc(a, rbg));
209
+ return self;
210
+ }
211
+
212
+
213
+ /* Number of outgoing arcs from the node.
214
+ * @return [Integer]
215
+ */
216
+ VALUE lemongraph_unnode_nb_outarcs(VALUE self)
217
+ {
218
+ VALUE rbg = rb_iv_get(self, "@graph");
219
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
220
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
221
+ return INT2NUM(lemon::countOutArcs(g, n));
222
+ }
223
+
224
+
225
+ /* Returns an array containing all the outgoing arcs from the node.
226
+ * @return [Array<Arc>]
227
+ */
228
+ VALUE lemongraph_unnode_outarcs(VALUE self)
229
+ {
230
+ VALUE rbg = rb_iv_get(self, "@graph");
231
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
232
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
233
+ VALUE ar = rb_ary_new_capa(lemon::countOutArcs(g, n));
234
+ for (lemon::ListGraph::OutArcIt a(g, n); a != lemon::INVALID; ++a)
235
+ rb_ary_push(ar, lemongraph_make_unarc(a, rbg));
236
+ return ar;
237
+ }
238
+
239
+
240
+ static VALUE lemongraph_unnode_outarcenum_nboutarcs(VALUE obj, VALUE args, VALUE eobj)
241
+ {
242
+ (void)args;
243
+ (void)eobj;
244
+ return lemongraph_unnode_nb_outarcs(obj);
245
+ }
246
+
247
+
248
+ /* Calls the block, if given, once for each outgoing {Arc} from the node.
249
+ * The arcs are passed as parameters to the block.
250
+ *
251
+ * Returns _self_, or, if no block is given, an Enumerator is returned.
252
+ * @return [self, Enumerator]
253
+ * @overload each_outarc
254
+ * @yieldparam arc [Arc]
255
+ * @return [self]
256
+ * @overload each_outarc
257
+ * @return [Enumerator]
258
+ */
259
+ VALUE lemongraph_unnode_each_outarc(VALUE self)
260
+ {
261
+ RETURN_SIZED_ENUMERATOR(self, 0, 0, lemongraph_unnode_outarcenum_nboutarcs);
262
+ VALUE rbg = rb_iv_get(self, "@graph");
263
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
264
+ lemon::ListGraph::Node n = lemongraph_rbunnode2unnode(self);
265
+ for (lemon::ListGraph::OutArcIt a(g, n); a != lemon::INVALID; ++a)
266
+ rb_yield(lemongraph_make_unarc(a, rbg));
267
+ return self;
268
+ }
269
+
270
+
271
+ /* Creates an {Edge} from _self_ to node _v_.
272
+ * @param v [Node] node to form an edge with
273
+ * @return [Edge]
274
+ */
275
+ VALUE lemongraph_unnode_edge_to(VALUE self, VALUE v)
276
+ {
277
+ VALUE rbg = rb_iv_get(self, "@graph");
278
+ return lemongraph_graph_add_edge(rbg, self, v);
279
+ }
280
+
281
+
282
+ /* Creates an {Edge} from node _u_ to _self_.
283
+ * @param u [Node] node to form an edge with
284
+ * @return [Edge]
285
+ */
286
+ VALUE lemongraph_unnode_edge_from(VALUE self, VALUE u)
287
+ {
288
+ VALUE rbg = rb_iv_get(self, "@graph");
289
+ return lemongraph_graph_add_edge(rbg, u, self);
290
+ }
291
+
292
+
293
+ /* Returns the node opposite to _self_ on _edge_.
294
+ * Returns _nil_ if _edge_ is not incident to _self_.
295
+ * @param edge [Edge, Arc]
296
+ * @return [Node]
297
+ */
298
+ VALUE lemongraph_unnode_opposite(VALUE self, VALUE edge)
299
+ {
300
+ VALUE r;
301
+ VALUE rbg = rb_iv_get(self, "@graph");
302
+ lemon::ListGraph& g = lemongraph_graph_rb2ref(rbg);
303
+ VALUE klass = rb_class_of(edge);
304
+ if (klass == c_UnEdge) {
305
+ if (rb_iv_get(edge, "@graph") != rbg)
306
+ rb_raise(rb_eRuntimeError, "node and edge are not from the same graph");
307
+ r = lemongraph_make_unnode(g.oppositeNode(lemongraph_rbunnode2unnode(self), lemongraph_rbunedge2unedge(edge)), rbg);
308
+ }
309
+ else if (klass == c_UnArc) {
310
+ if (rb_iv_get(edge, "@graph") != rbg)
311
+ rb_raise(rb_eRuntimeError, "node and arc are not from the same graph");
312
+ r = lemongraph_make_unnode(g.oppositeNode(lemongraph_rbunnode2unnode(self), lemongraph_rbunarc2unarc(edge)), rbg);
313
+ }
314
+ else {
315
+ rb_raise(rb_eTypeError, "expecting a %" PRIsVALUE " or a %" PRIsVALUE ", not a %s",
316
+ rb_class_name(c_UnEdge), rb_class_name(c_UnArc), rb_obj_classname(edge));
317
+ }
318
+ return r;
319
+ }
320
+
321
+
@@ -0,0 +1,260 @@
1
+ /* Copyright (C) 2022 Théotime Bollengier <theotime.bollengier@ensta-bretagne.fr>
2
+ *
3
+ * This file is part of LemonGraph. <https://gitlab.ensta-bretagne.fr/bollenth/lemongraph>
4
+ *
5
+ * LemonGraph is free software: you can redistribute it and/or modify it
6
+ * under the terms of the GNU General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License,
8
+ * or (at your option) any later version.
9
+ *
10
+ * LemonGraph is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ * See the GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with LemonGraph. If not, see <https://www.gnu.org/licenses/>. 
17
+ */
18
+
19
+ /* TODO:
20
+ * nodemap
21
+ * arcmap
22
+ * edgemap
23
+ * to_graphviz edgemap arcmap
24
+ */
25
+
26
+ #include <ruby.h>
27
+ #include "lemongraph.hh"
28
+
29
+
30
+ VALUE m_LemonGraph;
31
+
32
+ ID id_comp;
33
+ ID id_eqeq;
34
+
35
+
36
+ /* Document-module: LemonGraph
37
+ * Top-level namespace.
38
+ */
39
+
40
+
41
+ extern "C" LEMONGRAPH_PUBLIC void Init_lemongraph()
42
+ {
43
+ id_comp = rb_intern("<=>");
44
+ id_eqeq = rb_intern("==");
45
+
46
+ m_LemonGraph = rb_define_module("LemonGraph");
47
+
48
+ c_GraphItem = rb_define_class_under(m_LemonGraph, "GraphItem", rb_cObject);
49
+ rb_include_module(c_GraphItem, rb_mComparable);
50
+ rb_define_method(c_GraphItem, "initialize", lemongraph_graphitem_initialize, 2); // in ext/lemongraph/graph_item.cc
51
+ rb_undef_method(rb_class_of(c_GraphItem), "new");
52
+ rb_define_attr(c_GraphItem, "id", 1, 0); // @return [Integer] the graph item's id
53
+ rb_define_attr(c_GraphItem, "graph", 1, 0); // @return [Digraph,Graph] the graph the item belongs to
54
+ rb_define_method(c_GraphItem, "==", lemongraph_graphitem_is_equal, 1); // in ext/lemongraph/graph_item.cc
55
+ rb_define_method(c_GraphItem, "!=", lemongraph_graphitem_is_notequal, 1); // in ext/lemongraph/graph_item.cc
56
+ rb_define_method(c_GraphItem, "<=>", lemongraph_graphitem_compare, 1); // in ext/lemongraph/graph_item.cc
57
+
58
+ /**************************** Digraph *************************************/
59
+
60
+ c_Digraph = rb_define_class_under(m_LemonGraph, "Digraph", rb_cObject);
61
+ rb_define_alloc_func(c_Digraph, lemongraph_digraph_alloc);
62
+ rb_undef_method(rb_class_of(c_Digraph), "allocate");
63
+ rb_define_method(c_Digraph, "initialize_copy", lemongraph_digraph_initialize_copy, 1); // in ext/lemongraph/digraph.cc
64
+ rb_define_method(c_Digraph, "add_node", lemongraph_digraph_add_node, 0); // in ext/lemongraph/digraph.cc
65
+ rb_define_method(c_Digraph, "add_arc", lemongraph_digraph_add_arc, 2); // in ext/lemongraph/digraph.cc
66
+ rb_define_method(c_Digraph, "valid?", lemongraph_digraph_item_is_valid, 1); // in ext/lemongraph/digraph.cc
67
+ rb_define_method(c_Digraph, "erase", lemongraph_digraph_erase_nodearc, 1); // in ext/lemongraph/digraph.cc
68
+ rb_define_method(c_Digraph, "clear", lemongraph_digraph_clear, 0); // in ext/lemongraph/digraph.cc
69
+ rb_define_method(c_Digraph, "nb_nodes", lemongraph_digraph_nb_nodes, 0); // in ext/lemongraph/digraph.cc
70
+ rb_define_method(c_Digraph, "nodes", lemongraph_digraph_nodes, 0); // in ext/lemongraph/digraph.cc
71
+ rb_define_method(c_Digraph, "each_node", lemongraph_digraph_each_node, 0); // in ext/lemongraph/digraph.cc
72
+ rb_define_method(c_Digraph, "nb_arcs", lemongraph_digraph_nb_arcs, 0); // in ext/lemongraph/digraph.cc
73
+ rb_define_method(c_Digraph, "arcs", lemongraph_digraph_arcs, 0); // in ext/lemongraph/digraph.cc
74
+ rb_define_method(c_Digraph, "each_arc", lemongraph_digraph_each_arc, 0); // in ext/lemongraph/digraph.cc
75
+
76
+ c_DiNode = rb_define_class_under(c_Digraph, "Node", c_GraphItem);
77
+ rb_define_method(c_DiNode, "initialize", lemongraph_dinode_initialize, 2); // in ext/lemongraph/digraph_node.cc
78
+ rb_define_method(c_DiNode, "valid?", lemongraph_dinode_is_valid, 0); // in ext/lemongraph/digraph_node.cc
79
+ rb_define_method(c_DiNode, "erase", lemongraph_dinode_erase, 0); // in ext/lemongraph/digraph_node.cc
80
+ rb_define_method(c_DiNode, "arc_to", lemongraph_dinode_arc_to, 1); // in ext/lemongraph/digraph_node.cc
81
+ rb_define_method(c_DiNode, "arc_from", lemongraph_dinode_arc_from, 1); // in ext/lemongraph/digraph_node.cc
82
+ rb_define_method(c_DiNode, "split", lemongraph_dinode_split, -1); // in ext/lemongraph/digraph_node.cc
83
+ rb_define_method(c_DiNode, "contract_in", lemongraph_dinode_contract, -1); // in ext/lemongraph/digraph_node.cc
84
+ rb_define_method(c_DiNode, "nb_inarcs", lemongraph_dinode_nb_inarcs, 0); // in ext/lemongraph/digraph_node.cc
85
+ rb_define_method(c_DiNode, "inarcs", lemongraph_dinode_inarcs, 0); // in ext/lemongraph/digraph_node.cc
86
+ rb_define_method(c_DiNode, "each_inarc", lemongraph_dinode_each_inarc, 0); // in ext/lemongraph/digraph_node.cc
87
+ rb_define_method(c_DiNode, "nb_outarcs", lemongraph_dinode_nb_outarcs, 0); // in ext/lemongraph/digraph_node.cc
88
+ rb_define_method(c_DiNode, "outarcs", lemongraph_dinode_outarcs, 0); // in ext/lemongraph/digraph_node.cc
89
+ rb_define_method(c_DiNode, "each_outarc", lemongraph_dinode_each_outarc, 0); // in ext/lemongraph/digraph_node.cc
90
+ rb_define_method(c_DiNode, "opposite", lemongraph_dinode_opposite, 1); // in ext/lemongraph/digraph_node.cc
91
+
92
+ c_DiArc = rb_define_class_under(c_Digraph, "Arc", c_GraphItem);
93
+ rb_define_method(c_DiArc, "initialize", lemongraph_diarc_initialize, 2); // in ext/lemongraph/digraph_arc.cc
94
+ rb_define_method(c_DiArc, "valid?", lemongraph_diarc_is_valid, 0); // in ext/lemongraph/digraph_arc.cc
95
+ rb_define_method(c_DiArc, "erase", lemongraph_diarc_erase, 0); // in ext/lemongraph/digraph_arc.cc
96
+ rb_define_method(c_DiArc, "source", lemongraph_diarc_source, 0); // in ext/lemongraph/digraph_arc.cc
97
+ rb_define_method(c_DiArc, "source=", lemongraph_diarc_change_source, 1); // in ext/lemongraph/digraph_arc.cc
98
+ rb_define_method(c_DiArc, "target", lemongraph_diarc_target, 0); // in ext/lemongraph/digraph_arc.cc
99
+ rb_define_method(c_DiArc, "target=", lemongraph_diarc_change_target, 1); // in ext/lemongraph/digraph_arc.cc
100
+ rb_define_method(c_DiArc, "reverse!", lemongraph_diarc_reverse, 0); // in ext/lemongraph/digraph_arc.cc
101
+ rb_define_method(c_DiArc, "split", lemongraph_diarc_split, 0); // in ext/lemongraph/digraph_arc.cc
102
+
103
+ /****************************** Graph *************************************/
104
+
105
+ c_Graph = rb_define_class_under(m_LemonGraph, "Graph", rb_cObject);
106
+ rb_define_alloc_func(c_Graph, lemongraph_graph_alloc);
107
+ rb_undef_method(rb_class_of(c_Graph), "allocate");
108
+ rb_define_method(c_Graph, "initialize_copy", lemongraph_graph_initialize_copy, 1); // in ext/lemongraph/graph.cc
109
+ rb_define_method(c_Graph, "add_node", lemongraph_graph_add_node, 0); // in ext/lemongraph/graph.cc
110
+ rb_define_method(c_Graph, "add_edge", lemongraph_graph_add_edge, 2); // in ext/lemongraph/graph.cc
111
+ rb_define_method(c_Graph, "valid?", lemongraph_graph_item_is_valid, 1); // in ext/lemongraph/graph.cc
112
+ rb_define_method(c_Graph, "erase", lemongraph_graph_erase_item, 1); // in ext/lemongraph/graph.cc
113
+ rb_define_method(c_Graph, "clear", lemongraph_graph_clear, 0); // in ext/lemongraph/graph.cc
114
+ rb_define_method(c_Graph, "nb_nodes", lemongraph_graph_nb_nodes, 0); // in ext/lemongraph/graph.cc
115
+ rb_define_method(c_Graph, "nodes", lemongraph_graph_nodes, 0); // in ext/lemongraph/graph.cc
116
+ rb_define_method(c_Graph, "each_node", lemongraph_graph_each_node, 0); // in ext/lemongraph/graph.cc
117
+ rb_define_method(c_Graph, "nb_edges", lemongraph_graph_nb_edges, 0); // in ext/lemongraph/graph.cc
118
+ rb_define_method(c_Graph, "edges", lemongraph_graph_edges, 0); // in ext/lemongraph/graph.cc
119
+ rb_define_method(c_Graph, "each_edge", lemongraph_graph_each_edge, 0); // in ext/lemongraph/graph.cc
120
+ rb_define_method(c_Graph, "nb_arcs", lemongraph_graph_nb_arcs, 0); // in ext/lemongraph/graph.cc
121
+ rb_define_method(c_Graph, "arcs", lemongraph_graph_arcs, 0); // in ext/lemongraph/graph.cc
122
+ rb_define_method(c_Graph, "each_arc", lemongraph_graph_each_arc, 0); // in ext/lemongraph/graph.cc
123
+
124
+ c_UnNode = rb_define_class_under(c_Graph, "Node", c_GraphItem);
125
+ rb_define_method(c_UnNode, "initialize", lemongraph_unnode_initialize, 2); // in ext/lemongraph/graph_node.cc
126
+ rb_define_method(c_UnNode, "valid?", lemongraph_unnode_is_valid, 0); // in ext/lemongraph/graph_node.cc
127
+ rb_define_method(c_UnNode, "erase", lemongraph_unnode_erase, 0); // in ext/lemongraph/graph_node.cc
128
+ rb_define_method(c_UnNode, "edge_to", lemongraph_unnode_edge_to, 1); // in ext/lemongraph/graph_node.cc
129
+ rb_define_method(c_UnNode, "edge_from", lemongraph_unnode_edge_from, 1); // in ext/lemongraph/graph_node.cc
130
+ rb_define_method(c_UnNode, "contract_in", lemongraph_unnode_contract, -1); // in ext/lemongraph/graph_node.cc
131
+ rb_define_method(c_UnNode, "nb_edges", lemongraph_unnode_nb_edges, 0); // in ext/lemongraph/graph_node.cc
132
+ rb_define_method(c_UnNode, "edges", lemongraph_unnode_edges, 0); // in ext/lemongraph/graph_node.cc
133
+ rb_define_method(c_UnNode, "each_edge", lemongraph_unnode_each_edge, 0); // in ext/lemongraph/graph_node.cc
134
+ rb_define_method(c_UnNode, "nb_inarcs", lemongraph_unnode_nb_inarcs, 0); // in ext/lemongraph/graph_node.cc
135
+ rb_define_method(c_UnNode, "inarcs", lemongraph_unnode_inarcs, 0); // in ext/lemongraph/graph_node.cc
136
+ rb_define_method(c_UnNode, "each_inarc", lemongraph_unnode_each_inarc, 0); // in ext/lemongraph/graph_node.cc
137
+ rb_define_method(c_UnNode, "nb_outarcs", lemongraph_unnode_nb_outarcs, 0); // in ext/lemongraph/graph_node.cc
138
+ rb_define_method(c_UnNode, "outarcs", lemongraph_unnode_outarcs, 0); // in ext/lemongraph/graph_node.cc
139
+ rb_define_method(c_UnNode, "each_outarc", lemongraph_unnode_each_outarc, 0); // in ext/lemongraph/graph_node.cc
140
+ rb_define_method(c_UnNode, "opposite", lemongraph_unnode_opposite, 1); // in ext/lemongraph/graph_node.cc
141
+
142
+ c_UnEdge = rb_define_class_under(c_Graph, "Edge", c_GraphItem);
143
+ rb_define_method(c_UnEdge, "initialize", lemongraph_unedge_initialize, 2); // in ext/lemongraph/graph_edge.cc
144
+ rb_define_method(c_UnEdge, "valid?", lemongraph_unedge_is_valid, 0); // in ext/lemongraph/graph_edge.cc
145
+ rb_define_method(c_UnEdge, "erase", lemongraph_unedge_erase, 0); // in ext/lemongraph/graph_edge.cc
146
+ rb_define_method(c_UnEdge, "u", lemongraph_unedge_u, 0); // in ext/lemongraph/graph_edge.cc
147
+ rb_define_method(c_UnEdge, "u=", lemongraph_unedge_change_u, 1); // in ext/lemongraph/graph_edge.cc
148
+ rb_define_method(c_UnEdge, "v", lemongraph_unedge_v, 0); // in ext/lemongraph/graph_edge.cc
149
+ rb_define_method(c_UnEdge, "v=", lemongraph_unedge_change_v, 1); // in ext/lemongraph/graph_edge.cc
150
+ rb_define_method(c_UnEdge, "arc1", lemongraph_unedge_arc1, 0); // in ext/lemongraph/graph_edge.cc
151
+ rb_define_method(c_UnEdge, "arc2", lemongraph_unedge_arc2, 0); // in ext/lemongraph/graph_edge.cc
152
+
153
+ c_UnArc = rb_define_class_under(c_Graph, "Arc", c_GraphItem);
154
+ rb_define_method(c_UnArc, "initialize", lemongraph_unarc_initialize, 2); // in ext/lemongraph/graph_arc.cc
155
+ rb_define_method(c_UnArc, "valid?", lemongraph_unarc_is_valid, 0); // in ext/lemongraph/graph_arc.cc
156
+ rb_define_method(c_UnArc, "source", lemongraph_unarc_source, 0); // in ext/lemongraph/graph_arc.cc
157
+ rb_define_method(c_UnArc, "target", lemongraph_unarc_target, 0); // in ext/lemongraph/graph_arc.cc
158
+ rb_define_method(c_UnArc, "opposite", lemongraph_unarc_opposite, 0); // in ext/lemongraph/graph_arc.cc
159
+
160
+ /****************************** NodeMap ***********************************/
161
+
162
+ c_NodeMap = rb_define_class_under(m_LemonGraph, "NodeMap", rb_cObject);
163
+ rb_include_module(c_NodeMap, rb_mEnumerable);
164
+ rb_define_alloc_func(c_NodeMap, lemongraph_nodemap_alloc);
165
+ rb_undef_method(rb_class_of(c_NodeMap), "allocate");
166
+ rb_define_method(c_NodeMap, "initialize", lemongraph_nodemap_initialize, -1); // in ext/lemongraph/node_map.cc
167
+ rb_define_method(c_NodeMap, "initialize_copy", lemongraph_nodemap_initialize_copy, 1); // in ext/lemongraph/node_map.cc
168
+ rb_define_method(c_NodeMap, "graph", lemongraph_nodemap_graph, 0); // in ext/lemongraph/node_map.cc
169
+ rb_define_method(c_NodeMap, "default", lemongraph_nodemap_get_dflt_val, 0); // in ext/lemongraph/node_map.cc
170
+ rb_define_method(c_NodeMap, "default=", lemongraph_nodemap_set_dflt_val, 1); // in ext/lemongraph/node_map.cc
171
+ rb_define_method(c_NodeMap, "default_proc", lemongraph_nodemap_get_dflt_proc, 0); // in ext/lemongraph/node_map.cc
172
+ rb_define_method(c_NodeMap, "default_proc=", lemongraph_nodemap_set_dflt_proc, 1); // in ext/lemongraph/node_map.cc
173
+ rb_define_method(c_NodeMap, "==", lemongraph_nodemap_is_equal, 1); // in ext/lemongraph/node_map.cc
174
+ rb_define_method(c_NodeMap, "hash", lemongraph_nodemap_hash, 0); // in ext/lemongraph/node_map.cc
175
+ rb_define_method(c_NodeMap, "length", lemongraph_nodemap_length, 0); // in ext/lemongraph/node_map.cc
176
+ rb_define_method(c_NodeMap, "empty?", lemongraph_nodemap_is_empty, 0); // in ext/lemongraph/node_map.cc
177
+ rb_define_method(c_NodeMap, "[]", lemongraph_nodemap_get, 1); // in ext/lemongraph/node_map.cc
178
+ rb_define_method(c_NodeMap, "[]=", lemongraph_nodemap_set, 2); // in ext/lemongraph/node_map.cc
179
+ rb_define_method(c_NodeMap, "delete", lemongraph_nodemap_delete, 1); // in ext/lemongraph/node_map.cc
180
+ rb_define_method(c_NodeMap, "delete_if", lemongraph_nodemap_delete_if, 0); // in ext/lemongraph/node_map.cc
181
+ rb_define_method(c_NodeMap, "has_node?", lemongraph_nodemap_has_node, 1); // in ext/lemongraph/node_map.cc
182
+ rb_define_alias(c_NodeMap, "node?", "has_node?");
183
+ rb_define_method(c_NodeMap, "has_value?", lemongraph_nodemap_has_value, 1); // in ext/lemongraph/node_map.cc
184
+ rb_define_alias(c_NodeMap, "value?", "has_value?");
185
+ rb_define_method(c_NodeMap, "nodes", lemongraph_nodemap_nodes, 0); // in ext/lemongraph/node_map.cc
186
+ rb_define_method(c_NodeMap, "values", lemongraph_nodemap_values, 0); // in ext/lemongraph/node_map.cc
187
+ rb_define_method(c_NodeMap, "each_node", lemongraph_nodemap_each_node, 0); // in ext/lemongraph/node_map.cc
188
+ rb_define_method(c_NodeMap, "each_value", lemongraph_nodemap_each_value, 0); // in ext/lemongraph/node_map.cc
189
+ rb_define_method(c_NodeMap, "each_pair", lemongraph_nodemap_each_pair, 0); // in ext/lemongraph/node_map.cc
190
+ rb_define_method(c_NodeMap, "each", lemongraph_nodemap_each_pair, 0); // in ext/lemongraph/node_map.cc
191
+ rb_define_method(c_NodeMap, "clear", lemongraph_nodemap_clear, 0); // in ext/lemongraph/node_map.cc
192
+
193
+ /****************************** ArcMap ************************************/
194
+
195
+ c_ArcMap = rb_define_class_under(m_LemonGraph, "ArcMap", rb_cObject);
196
+ rb_include_module(c_ArcMap, rb_mEnumerable);
197
+ rb_define_alloc_func(c_ArcMap, lemongraph_arcmap_alloc);
198
+ rb_undef_method(rb_class_of(c_ArcMap), "allocate");
199
+ rb_define_method(c_ArcMap, "initialize", lemongraph_arcmap_initialize, -1); // in ext/lemongraph/arc_map.cc
200
+ rb_define_method(c_ArcMap, "initialize_copy", lemongraph_arcmap_initialize_copy, 1); // in ext/lemongraph/arc_map.cc
201
+ rb_define_method(c_ArcMap, "graph", lemongraph_arcmap_graph, 0); // in ext/lemongraph/arc_map.cc
202
+ rb_define_method(c_ArcMap, "default", lemongraph_arcmap_get_dflt_val, 0); // in ext/lemongraph/arc_map.cc
203
+ rb_define_method(c_ArcMap, "default=", lemongraph_arcmap_set_dflt_val, 1); // in ext/lemongraph/arc_map.cc
204
+ rb_define_method(c_ArcMap, "default_proc", lemongraph_arcmap_get_dflt_proc, 0); // in ext/lemongraph/arc_map.cc
205
+ rb_define_method(c_ArcMap, "default_proc=", lemongraph_arcmap_set_dflt_proc, 1); // in ext/lemongraph/arc_map.cc
206
+ rb_define_method(c_ArcMap, "==", lemongraph_arcmap_is_equal, 1); // in ext/lemongraph/arc_map.cc
207
+ rb_define_method(c_ArcMap, "hash", lemongraph_arcmap_hash, 0); // in ext/lemongraph/arc_map.cc
208
+ rb_define_method(c_ArcMap, "length", lemongraph_arcmap_length, 0); // in ext/lemongraph/arc_map.cc
209
+ rb_define_method(c_ArcMap, "empty?", lemongraph_arcmap_is_empty, 0); // in ext/lemongraph/arc_map.cc
210
+ rb_define_method(c_ArcMap, "[]", lemongraph_arcmap_get, 1); // in ext/lemongraph/arc_map.cc
211
+ rb_define_method(c_ArcMap, "[]=", lemongraph_arcmap_set, 2); // in ext/lemongraph/arc_map.cc
212
+ rb_define_method(c_ArcMap, "delete", lemongraph_arcmap_delete, 1); // in ext/lemongraph/arc_map.cc
213
+ rb_define_method(c_ArcMap, "delete_if", lemongraph_arcmap_delete_if, 0); // in ext/lemongraph/arc_map.cc
214
+ rb_define_method(c_ArcMap, "has_arc?", lemongraph_arcmap_has_arc, 1); // in ext/lemongraph/arc_map.cc
215
+ rb_define_alias(c_ArcMap, "arc?", "has_arc?");
216
+ rb_define_method(c_ArcMap, "has_value?", lemongraph_arcmap_has_value, 1); // in ext/lemongraph/arc_map.cc
217
+ rb_define_alias(c_ArcMap, "value?", "has_value?");
218
+ rb_define_method(c_ArcMap, "arcs", lemongraph_arcmap_arcs, 0); // in ext/lemongraph/arc_map.cc
219
+ rb_define_method(c_ArcMap, "values", lemongraph_arcmap_values, 0); // in ext/lemongraph/arc_map.cc
220
+ rb_define_method(c_ArcMap, "each_arc", lemongraph_arcmap_each_arc, 0); // in ext/lemongraph/arc_map.cc
221
+ rb_define_method(c_ArcMap, "each_value", lemongraph_arcmap_each_value, 0); // in ext/lemongraph/arc_map.cc
222
+ rb_define_method(c_ArcMap, "each_pair", lemongraph_arcmap_each_pair, 0); // in ext/lemongraph/arc_map.cc
223
+ rb_define_method(c_ArcMap, "each", lemongraph_arcmap_each_pair, 0); // in ext/lemongraph/arc_map.cc
224
+ rb_define_method(c_ArcMap, "clear", lemongraph_arcmap_clear, 0); // in ext/lemongraph/arc_map.cc
225
+
226
+ /****************************** EdgeMap ***********************************/
227
+
228
+ c_EdgeMap = rb_define_class_under(m_LemonGraph, "EdgeMap", rb_cObject);
229
+ rb_include_module(c_EdgeMap, rb_mEnumerable);
230
+ rb_define_alloc_func(c_EdgeMap, lemongraph_arcmap_alloc);
231
+ rb_undef_method(rb_class_of(c_EdgeMap), "allocate");
232
+ rb_define_method(c_EdgeMap, "initialize", lemongraph_edgemap_initialize, -1); // in ext/lemongraph/edge_map.cc
233
+ rb_define_method(c_EdgeMap, "initialize_copy", lemongraph_edgemap_initialize_copy, 1); // in ext/lemongraph/edge_map.cc
234
+ rb_define_method(c_EdgeMap, "graph", lemongraph_edgemap_graph, 0); // in ext/lemongraph/edge_map.cc
235
+ rb_define_method(c_EdgeMap, "default", lemongraph_edgemap_get_dflt_val, 0); // in ext/lemongraph/edge_map.cc
236
+ rb_define_method(c_EdgeMap, "default=", lemongraph_edgemap_set_dflt_val, 1); // in ext/lemongraph/edge_map.cc
237
+ rb_define_method(c_EdgeMap, "default_proc", lemongraph_edgemap_get_dflt_proc, 0); // in ext/lemongraph/edge_map.cc
238
+ rb_define_method(c_EdgeMap, "default_proc=", lemongraph_edgemap_set_dflt_proc, 1); // in ext/lemongraph/edge_map.cc
239
+ rb_define_method(c_EdgeMap, "==", lemongraph_edgemap_is_equal, 1); // in ext/lemongraph/edge_map.cc
240
+ rb_define_method(c_EdgeMap, "hash", lemongraph_edgemap_hash, 0); // in ext/lemongraph/edge_map.cc
241
+ rb_define_method(c_EdgeMap, "length", lemongraph_edgemap_length, 0); // in ext/lemongraph/edge_map.cc
242
+ rb_define_method(c_EdgeMap, "empty?", lemongraph_edgemap_is_empty, 0); // in ext/lemongraph/edge_map.cc
243
+ rb_define_method(c_EdgeMap, "[]", lemongraph_edgemap_get, 1); // in ext/lemongraph/edge_map.cc
244
+ rb_define_method(c_EdgeMap, "[]=", lemongraph_edgemap_set, 2); // in ext/lemongraph/edge_map.cc
245
+ rb_define_method(c_EdgeMap, "delete", lemongraph_edgemap_delete, 1); // in ext/lemongraph/edge_map.cc
246
+ rb_define_method(c_EdgeMap, "delete_if", lemongraph_edgemap_delete_if, 0); // in ext/lemongraph/edge_map.cc
247
+ rb_define_method(c_EdgeMap, "has_edge?", lemongraph_edgemap_has_edge, 1); // in ext/lemongraph/edge_map.cc
248
+ rb_define_alias(c_EdgeMap, "edge?", "has_edge?");
249
+ rb_define_method(c_EdgeMap, "has_value?", lemongraph_edgemap_has_value, 1); // in ext/lemongraph/edge_map.cc
250
+ rb_define_alias(c_EdgeMap, "value?", "has_value?");
251
+ rb_define_method(c_EdgeMap, "edges", lemongraph_edgemap_edges, 0); // in ext/lemongraph/edge_map.cc
252
+ rb_define_method(c_EdgeMap, "values", lemongraph_edgemap_values, 0); // in ext/lemongraph/edge_map.cc
253
+ rb_define_method(c_EdgeMap, "each_edge", lemongraph_edgemap_each_edge, 0); // in ext/lemongraph/edge_map.cc
254
+ rb_define_method(c_EdgeMap, "each_value", lemongraph_edgemap_each_value, 0); // in ext/lemongraph/edge_map.cc
255
+ rb_define_method(c_EdgeMap, "each_pair", lemongraph_edgemap_each_pair, 0); // in ext/lemongraph/edge_map.cc
256
+ rb_define_method(c_EdgeMap, "each", lemongraph_edgemap_each_pair, 0); // in ext/lemongraph/edge_map.cc
257
+ rb_define_method(c_EdgeMap, "clear", lemongraph_edgemap_clear, 0); // in ext/lemongraph/edge_map.cc
258
+ }
259
+
260
+