GRASS 8 Programmer's Manual 8.6.0dev(2026)-4bb960b182
Loading...
Searching...
No Matches
vector/dglib/graph.c
Go to the documentation of this file.
1/* LIBDGL -- a Directed Graph Library implementation
2 * SPDX-FileCopyrightText: 2002 Roberto Micarelli
3 * SPDX-FileCopyrightText: GRASS Development Team
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7/*
8 * best view with tabstop=4
9 */
10
11#include <stdio.h>
12#include <string.h>
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <unistd.h>
16#include <stdlib.h>
17#include <errno.h>
18
19#define DGL_V2 1
20
21#include <grass/gis.h>
22#include "type.h"
23#include "tree.h"
24#include "graph.h"
25#include "graph_v1.h"
26#if defined(DGL_V2)
27#include "graph_v2.h"
28#endif
29#include "helpers.h"
30
32{
33#ifdef DGL_STATS
34 pgraph->clkAddEdge = 0;
35 pgraph->cAddEdge = 0;
36 pgraph->clkNodeTree = 0;
37 pgraph->cNodeTree = 0;
38#endif
39}
40
41int dglInitialize(dglGraph_s *pGraph, dglByte_t Version,
42 dglInt32_t NodeAttrSize, dglInt32_t EdgeAttrSize,
44{
45 if (pGraph == NULL) {
46 return -DGL_ERR_BadArgument;
47 }
48 switch (Version) {
49 case 1:
50#ifdef DGL_V2
51 case 2:
52 case 3:
53#endif
54 memset(pGraph, 0, sizeof(dglGraph_s));
55 /*
56 * round attr size to the upper multiple of dglInt32_t size
57 */
58 if (NodeAttrSize % sizeof(dglInt32_t))
59 NodeAttrSize +=
60 (sizeof(dglInt32_t) - (NodeAttrSize % sizeof(dglInt32_t)));
61 if (EdgeAttrSize % sizeof(dglInt32_t))
62 EdgeAttrSize +=
63 (sizeof(dglInt32_t) - (EdgeAttrSize % sizeof(dglInt32_t)));
64 pGraph->Version = Version;
65 pGraph->NodeAttrSize = NodeAttrSize;
66 pGraph->EdgeAttrSize = EdgeAttrSize;
67 if (pOpaqueSet)
68 memcpy(&pGraph->aOpaqueSet, pOpaqueSet, sizeof(dglInt32_t) * 16);
69#ifdef DGL_ENDIAN_BIG
70 pGraph->Endian = DGL_ENDIAN_BIG;
71#else
72 pGraph->Endian = DGL_ENDIAN_LITTLE;
73#endif
74 }
75 switch (Version) {
76 case 1:
77 if (dgl_initialize_V1(pGraph) < 0) {
78 return -pGraph->iErrno;
79 }
80 else
81 return 0;
82#ifdef DGL_V2
83 case 2:
84 case 3:
85 if (dgl_initialize_V2(pGraph) < 0) {
86 return -pGraph->iErrno;
87 }
88 else
89 return 0;
90#endif
91 }
93 return -pGraph->iErrno;
94}
95
97{
98 switch (pGraph->Version) {
99 case 1:
100 return dgl_release_V1(pGraph);
101#ifdef DGL_V2
102 case 2:
103 case 3:
104 return dgl_release_V2(pGraph);
105#endif
106 }
107 pGraph->iErrno = DGL_ERR_BadVersion;
108 return -pGraph->iErrno;
109}
110
112{
113 switch (pGraph->Version) {
114 case 1:
115 return dgl_unflatten_V1(pGraph);
116#ifdef DGL_V2
117 case 2:
118 case 3:
119 return dgl_unflatten_V2(pGraph);
120#endif
121 }
122 pGraph->iErrno = DGL_ERR_BadVersion;
123 return -pGraph->iErrno;
124}
125
127{
128 switch (pGraph->Version) {
129 case 1:
130 return dgl_flatten_V1(pGraph);
131#ifdef DGL_V2
132 case 2:
133 case 3:
134 return dgl_flatten_V2(pGraph);
135#endif
136 }
137 pGraph->iErrno = DGL_ERR_BadVersion;
138 return -pGraph->iErrno;
139}
140
142{
143 switch (pGraph->Version) {
144 case 1:
145 return dgl_get_node_V1(pGraph, nNodeId);
146#ifdef DGL_V2
147 case 2:
148 case 3:
149 return dgl_get_node_V2(pGraph, nNodeId);
150#endif
151 }
152 pGraph->iErrno = DGL_ERR_BadVersion;
153 return NULL;
154}
155
157{
158 if (pnNode) {
159 switch (pGraph->Version) {
160 case 1:
161 return dgl_getnode_outedgeset_V1(pGraph, pnNode);
162#ifdef DGL_V2
163 case 2:
164 case 3:
165 return dgl_getnode_outedgeset_V2(pGraph, pnNode);
166#endif
167 }
168 pGraph->iErrno = DGL_ERR_BadVersion;
169 return NULL;
170 }
171 return NULL;
172}
173
175{
176 if (pnNode) {
177 switch (pGraph->Version) {
178 case 1:
180 return NULL;
181#ifdef DGL_V2
182 case 2:
183 case 3:
184 return dgl_getnode_inedgeset_V2(pGraph, pnNode);
185#endif
186 }
187 pGraph->iErrno = DGL_ERR_BadVersion;
188 return NULL;
189 }
190 return NULL;
191}
192
193/*
194 * Given that node id can be negative, only iErrno can report a error,
195 * thus it is initialized to zero
196 */
198{
199 pGraph->iErrno = 0;
200 if (pnNode) {
201 switch (pGraph->Version) {
202 case 1:
203 return DGL_NODE_ID_v1(pnNode);
204#ifdef DGL_V2
205 case 2:
206 case 3:
207 return DGL_NODE_ID_v2(pnNode);
208#endif
209 }
210 pGraph->iErrno = DGL_ERR_BadVersion;
211 return 0;
212 }
214 return 0;
215}
216
218{
219 pGraph->iErrno = 0;
220 if (pnNode) {
221 switch (pGraph->Version) {
222 case 1:
223 return DGL_NODE_STATUS_v1(pnNode);
224#ifdef DGL_V2
225 case 2:
226 case 3:
227 return DGL_NODE_STATUS_v2(pnNode);
228#endif
229 }
230 pGraph->iErrno = DGL_ERR_BadVersion;
231 return 0;
232 }
234 return 0;
235}
236
238{
239 if (pnNode) {
240 switch (pGraph->Version) {
241 case 1:
242 return DGL_NODE_ATTR_PTR_v1(pnNode);
243#ifdef DGL_V2
244 case 2:
245 case 3:
246 return DGL_NODE_ATTR_PTR_v2(pnNode);
247#endif
248 }
249 pGraph->iErrno = DGL_ERR_BadVersion;
250 return NULL;
251 }
253 return NULL;
254}
255
257{
258 if (pnNode) {
259 switch (pGraph->Version) {
260 case 1:
262 return;
263#ifdef DGL_V2
264 case 2:
265 case 3:
267 return;
268#endif
269 }
270 return;
271 }
272 return;
273}
274
276{
277#ifdef DGL_V2
279#endif
280
281 pGraph->iErrno = 0;
282 if (pnNode) {
283 switch (pGraph->Version) {
284 case 1:
286 return 0;
287#ifdef DGL_V2
288 case 2:
289 if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
290 return 0;
291 pinedgeset = dglNodeGet_InEdgeset(pGraph, pnNode);
292 if (pinedgeset)
294 return 0;
295 case 3:
296 return dglNodeGet_Valence(pGraph, pnNode);
297#endif
298 }
299 pGraph->iErrno = DGL_ERR_BadVersion;
300 return 0;
301 }
303 return 0;
304}
305
307{
309
310 pGraph->iErrno = 0;
311 if (pnNode) {
312 switch (pGraph->Version) {
313 case 1:
314 if (DGL_NODE_STATUS_v1(pnNode) & DGL_NS_ALONE)
315 return 0;
316 poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
317 if (poutedgeset)
319 return 0;
320#ifdef DGL_V2
321 case 2:
322 if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
323 return 0;
324 poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
325 if (poutedgeset)
327 return 0;
328 case 3:
329 return dglNodeGet_Valence(pGraph, pnNode);
330#endif
331 }
332 pGraph->iErrno = DGL_ERR_BadVersion;
333 return 0;
334 }
336 return 0;
337}
338
340{
341#ifdef DGL_V2
344 int c;
345#endif
346
347 pGraph->iErrno = 0;
348 if (pnNode) {
349 switch (pGraph->Version) {
350#ifdef DGL_V2
351 case 3:
352 if (DGL_NODE_STATUS_v2(pnNode) & DGL_NS_ALONE)
353 return 0;
354 poutedgeset = dglNodeGet_OutEdgeset(pGraph, pnNode);
355 pinedgeset = dglNodeGet_InEdgeset(pGraph, pnNode);
356 c = 0;
357 if (poutedgeset)
359 if (pinedgeset)
361 return c;
362#endif
363 }
364 pGraph->iErrno = DGL_ERR_BadVersion;
365 return 0;
366 }
368 return 0;
369}
370
372{
373 pGraph->iErrno = 0;
374 if (pnEdgeset) {
375 switch (pGraph->Version) {
376 case 1:
377 return DGL_EDGESET_EDGECOUNT_v1(pnEdgeset);
378#ifdef DGL_V2
379 case 2:
380 case 3:
381 return DGL_EDGESET_EDGECOUNT_v2(pnEdgeset);
382#endif
383 }
384 pGraph->iErrno = DGL_ERR_BadVersion;
385 return 0;
386 }
388 return 0;
389}
390
392{
393 pGraph->iErrno = 0;
394 if (pnEdge) {
395 switch (pGraph->Version) {
396 case 1:
397 return DGL_EDGE_COST_v1(pnEdge);
398#ifdef DGL_V2
399 case 2:
400 case 3:
401 return DGL_EDGE_COST_v2(pnEdge);
402#endif
403 }
404 pGraph->iErrno = DGL_ERR_BadVersion;
405 return 0;
406 }
408 return 0;
409}
410
412{
413 pGraph->iErrno = 0;
414 if (pnEdge) {
415 switch (pGraph->Version) {
416 case 1:
417 return DGL_EDGE_ID_v1(pnEdge);
418#ifdef DGL_V2
419 case 2:
420 case 3:
421 return DGL_EDGE_ID_v2(pnEdge);
422#endif
423 }
424 pGraph->iErrno = DGL_ERR_BadVersion;
425 return 0;
426 }
428 return 0;
429}
430
432{
433 pGraph->iErrno = 0;
434 if (pnEdge) {
435 switch (pGraph->Version) {
436 case 1:
437 if (pGraph->Flags & DGL_GS_FLAT) {
439 pGraph, DGL_EDGE_HEADNODE_OFFSET_v1(pnEdge));
440 }
441 else {
442 return dgl_get_node_V1(pGraph,
444 }
445#ifdef DGL_V2
446 case 2:
447 case 3:
448 if (pGraph->Flags & DGL_GS_FLAT) {
450 pGraph, DGL_EDGE_HEADNODE_OFFSET_v2(pnEdge));
451 }
452 else {
453 return dgl_get_node_V2(pGraph,
455 }
456#endif
457 }
458 pGraph->iErrno = DGL_ERR_BadVersion;
459 return NULL;
460 }
462 return NULL;
463}
464
466{
467 pGraph->iErrno = 0;
468 if (pnEdge) {
469 switch (pGraph->Version) {
470 case 1:
471 if (pGraph->Flags & DGL_GS_FLAT) {
473 pGraph, DGL_EDGE_TAILNODE_OFFSET_v1(pnEdge));
474 }
475 else {
476 return dgl_get_node_V1(pGraph,
478 }
479#ifdef DGL_V2
480 case 2:
481 case 3:
482 if (pGraph->Flags & DGL_GS_FLAT) {
484 pGraph, DGL_EDGE_TAILNODE_OFFSET_v2(pnEdge));
485 }
486 else {
487 return dgl_get_node_V2(pGraph,
489 }
490#endif
491 }
492 pGraph->iErrno = DGL_ERR_BadVersion;
493 return NULL;
494 }
496 return NULL;
497}
498
500{
501 pGraph->iErrno = 0;
502 if (pnEdge) {
503 switch (pGraph->Version) {
504 case 1:
505 return DGL_EDGE_ATTR_PTR_v1(pnEdge);
506#ifdef DGL_V2
507 case 2:
508 case 3:
509 return DGL_EDGE_ATTR_PTR_v2(pnEdge);
510#endif
511 }
512 pGraph->iErrno = DGL_ERR_BadVersion;
513 return NULL;
514 }
516 return NULL;
517}
518
520{
521 if (pnEdge) {
522 switch (pGraph->Version) {
523 case 1:
525 return 0;
526#ifdef DGL_V2
527 case 2:
528 case 3:
530 return 0;
531#endif
532 }
533 pGraph->iErrno = DGL_ERR_BadVersion;
534 return -pGraph->iErrno;
535 }
537 return -pGraph->iErrno;
538}
539
541{
542 switch (pGraph->Version) {
543 case 1:
544 return dgl_get_edge_V1(pGraph, nEdgeId);
545 break;
546#ifdef DGL_V2
547 case 2:
548 case 3:
549 return dgl_get_edge_V2(pGraph, nEdgeId);
550 break;
551#endif
552 }
553 pGraph->iErrno = DGL_ERR_BadVersion;
554 return NULL;
555}
556
558{
559 switch (pGraph->Version) {
560 case 1:
561 return dgl_del_edge_V1(pGraph, nEdgeId);
562 break;
563#ifdef DGL_V2
564 case 2:
565 case 3:
566 return dgl_del_edge_V2(pGraph, nEdgeId);
567 break;
568#endif
569 }
570 pGraph->iErrno = DGL_ERR_BadVersion;
571 return -pGraph->iErrno;
572}
573
576{
577 int nRet;
578
579#ifdef DGL_STATS
580 clock_t clk;
581
582 clk = clock();
583 pGraph->cAddEdge++;
584#endif
585 switch (pGraph->Version) {
586 case 1:
587 nRet = dgl_add_edge_V1(pGraph, nHead, nTail, nCost, nEdge, NULL, NULL,
588 NULL, 0);
589 break;
590#ifdef DGL_V2
591 case 2:
592 case 3:
593 nRet = dgl_add_edge_V2(pGraph, nHead, nTail, nCost, nEdge, NULL, NULL,
594 NULL, 0);
595 break;
596#endif
597 default:
598 pGraph->iErrno = DGL_ERR_BadVersion;
599 nRet = -pGraph->iErrno;
600 break;
601 }
602#ifdef DGL_STATS
603 pGraph->clkAddEdge += clock() - clk;
604#endif
605 return nRet;
606}
607
611{
612 int nRet;
613
614#ifdef DGL_STATS
615 clock_t clk;
616
617 clk = clock();
618 pGraph->cAddEdge++;
619#endif
620 switch (pGraph->Version) {
621 case 1:
622 nRet = dgl_add_edge_V1(pGraph, nHead, nTail, nCost, nEdge, pvHeadAttr,
624 break;
625#ifdef DGL_V2
626 case 2:
627 case 3:
628 nRet = dgl_add_edge_V2(pGraph, nHead, nTail, nCost, nEdge, pvHeadAttr,
630 break;
631#endif
632 default:
633 pGraph->iErrno = DGL_ERR_BadVersion;
634 nRet = -pGraph->iErrno;
635 break;
636 }
637#ifdef DGL_STATS
638 pGraph->clkAddEdge += clock() - clk;
639#endif
640 return nRet;
641}
642
645{
646 int nRet;
647
648 switch (pGraph->Version) {
649 case 1:
651 break;
652#ifdef DGL_V2
653 case 2:
654 case 3:
656 break;
657#endif
658 default:
659 pGraph->iErrno = DGL_ERR_BadVersion;
660 nRet = -pGraph->iErrno;
661 break;
662 }
663 return nRet;
664}
665
667{
668 int nRet;
669
670 switch (pGraph->Version) {
671 case 1:
672 nRet = dgl_del_node_V1(pGraph, nNodeId);
673 break;
674#ifdef DGL_V2
675 case 2:
676 case 3:
677 nRet = dgl_del_node_V2(pGraph, nNodeId);
678 break;
679#endif
680 default:
681 pGraph->iErrno = DGL_ERR_BadVersion;
682 nRet = -pGraph->iErrno;
683 break;
684 }
685 return nRet;
686}
687
688int dglWrite(dglGraph_s *pGraph, int fd)
689{
690 int nRet;
691
692 switch (pGraph->Version) {
693 case 1:
694 nRet = dgl_write_V1(pGraph, fd);
695 break;
696#ifdef DGL_V2
697 case 2:
698 case 3:
699 nRet = dgl_write_V2(pGraph, fd);
700 break;
701#endif
702 default:
703 pGraph->iErrno = DGL_ERR_BadVersion;
704 nRet = -pGraph->iErrno;
705 break;
706 }
707 return nRet;
708}
709
710int dglRead(dglGraph_s *pGraph, int fd)
711{
713 int nRet;
714
715 if (read(fd, &bVersion, 1) != 1) {
716 pGraph->iErrno = DGL_ERR_Read;
717 nRet = -pGraph->iErrno;
718 }
719 else {
720 switch (bVersion) {
721 case 1:
722 nRet = dgl_read_V1(pGraph, fd);
723 break;
724#ifdef DGL_V2
725 case 2:
726 case 3:
727 nRet = dgl_read_V2(pGraph, fd, bVersion);
728 break;
729#endif
730 default:
732 nRet = -pGraph->iErrno;
733 break;
734 }
735 }
736 return nRet;
737}
738
742{
743 int nRet;
744
745 switch (pGraph->Version) {
746 case 1:
749 break;
750#ifdef DGL_V2
751 case 2:
752 case 3:
755 break;
756#endif
757 default:
758 pGraph->iErrno = DGL_ERR_BadVersion;
759 nRet = -pGraph->iErrno;
760 break;
761 }
762 return nRet;
763}
764
769{
770 int nRet;
771
772 switch (pGraph->Version) {
773 case 1:
776 break;
777#ifdef DGL_V2
778 case 2:
779 case 3:
782 break;
783#endif
784 default:
785 pGraph->iErrno = DGL_ERR_BadVersion;
786 nRet = -pGraph->iErrno;
787 break;
788 }
789 return nRet;
790}
791
794 void *pvClipArg)
795{
796 int nRet;
797 void *pvVisited;
798
799 if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
800 pgraphInput->iErrno = 0;
801 return 0;
802 }
803
804#ifndef DGL_V2
805 if (pgraphInput->Version == 2) {
807 return -pgraphInput->iErrno;
808 }
809#endif
810
815
816 if (nRet < 0)
817 return nRet;
818
819 if ((pvVisited = avl_create(dglTreeNodeCompare, NULL,
820 dglTreeGetAllocator())) == NULL) {
822 return -pgraphInput->iErrno;
823 }
824
825 switch (pgraphInput->Version) {
826 case 1:
827 nRet =
829 pvVisited, fnClip, pvClipArg);
830 break;
831#ifdef DGL_V2
832 case 2:
833 case 3:
834 nRet =
836 pvVisited, fnClip, pvClipArg);
837 break;
838#endif
839 default:
841 nRet = -pgraphInput->iErrno;
842 break;
843 }
844
845 avl_destroy(pvVisited, dglTreeNodeCancel);
846
847 if (nRet < 0) {
849 }
850
851 return nRet;
852}
853
856 void *pvClipArg)
857{
858 int i, nret = 0;
860 void *pvVisited;
861 dglInt32_t *pvertex, *pnode;
862
863 if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
864 pgraphInput->iErrno = 0;
865 return 0;
866 }
867
868#ifndef DGL_V2
869 if (pgraphInput->Version == 2 || pgraphInput->Version == 3) {
871 return -pgraphInput->iErrno;
872 }
873#endif
874
875 if ((pvVisited = avl_create(dglTreeNodeCompare, NULL,
876 dglTreeGetAllocator())) == NULL) {
878 goto error;
879 }
880
881 /*
882 * choose a vertex to start from
883 */
884 pvertex = NULL;
885 {
887
889 for (pnode = dglNode_T_First(&pT); pnode; pnode = dglNode_T_Next(&pT)) {
890 switch (pgraphInput->Version) {
891 case 1:
892 if (DGL_NODE_STATUS_v1(pnode) & DGL_NS_HEAD)
893 pvertex = pnode;
894 break;
895#ifdef DGL_V2
896 case 2:
897 case 3:
898 if (DGL_NODE_STATUS_v2(pnode) & DGL_NS_HEAD)
899 pvertex = pnode;
900 break;
901#endif
902 }
903 if (pvertex)
904 break;
905 }
907 }
908
909 if (pvertex == NULL) {
911 goto error;
912 }
913
914 for (i = 0; i < cgraphComponents && pvertex; i++) {
919
920 if (nret < 0)
921 goto error;
922
923 switch (pgraphInput->Version) {
924 case 1:
927 pvVisited, fnClip, pvClipArg);
928 if (nret < 0)
929 goto error;
930 break;
931#ifdef DGL_V2
932 case 2:
933 case 3:
936 pvVisited, fnClip, pvClipArg);
937 if (nret < 0)
938 goto error;
939 break;
940#endif
941 default:
943 nret = -pgraphInput->iErrno;
944 goto error;
945 }
946
947 /*
948 * select next unvisited vertex
949 */
950 pvertex = NULL;
951 {
953
955 for (pnode = dglNode_T_First(&pT); pnode;
956 pnode = dglNode_T_Next(&pT)) {
957 switch (pgraphInput->Version) {
958 case 1:
959 if (DGL_NODE_STATUS_v1(pnode) & DGL_NS_HEAD) {
960 findVisited.nKey = DGL_NODE_ID_v1(pnode);
961 if (avl_find(pvVisited, &findVisited) == NULL) {
962 pvertex = pnode;
963 break;
964 }
965 }
966 break;
967#ifdef DGL_V2
968 case 2:
969 case 3:
970 if (DGL_NODE_STATUS_v2(pnode) & DGL_NS_HEAD) {
971 findVisited.nKey = DGL_NODE_ID_v2(pnode);
972 if (avl_find(pvVisited, &findVisited) == NULL) {
973 pvertex = pnode;
974 break;
975 }
976 }
977 break;
978#endif
979 }
980 if (pvertex)
981 break;
982 }
984 }
985 }
986
987 avl_destroy(pvVisited, dglTreeNodeCancel);
988 return i;
989
990error:
991 avl_destroy(pvVisited, dglTreeNodeCancel);
992 return nret;
993}
994
997 void *pvClipArg)
998{
999 int nRet;
1000
1001 if (dglGet_EdgeCount(pgraphInput) == 0) { /* no span */
1002 pgraphInput->iErrno = 0;
1003 return 0;
1004 }
1005
1010
1011 if (nRet < 0)
1012 return nRet;
1013
1014 switch (pgraphInput->Version) {
1015 case 1:
1017 fnClip, pvClipArg);
1018 break;
1019#ifdef DGL_V2
1020 case 2:
1021 case 3:
1023 fnClip, pvClipArg);
1024 break;
1025#endif
1026 default:
1028 nRet = -pgraphInput->iErrno;
1029 break;
1030 }
1031 if (nRet < 0) {
1033 }
1034 return nRet;
1035}
1036
1038{
1039 int iArc;
1040
1041 if (pSPReport) {
1042 if (pSPReport->pArc) {
1043 for (iArc = 0; iArc < pSPReport->cArc; iArc++) {
1044 if (pSPReport->pArc[iArc].pnEdge)
1045 free(pSPReport->pArc[iArc].pnEdge);
1046 }
1047 free(pSPReport->pArc);
1048 }
1049 free(pSPReport);
1050 }
1051}
1052
1054{
1055 switch (pGraph->Version) {
1056 case 1:
1057 return dgl_sp_cache_initialize_V1(pGraph, pCache, 0);
1058#ifdef DGL_V2
1059 case 2:
1060 case 3:
1061 return dgl_sp_cache_initialize_V2(pGraph, pCache, 0);
1062#endif
1063 }
1064 pGraph->iErrno = DGL_ERR_BadVersion;
1065 return -pGraph->iErrno;
1066}
1067
1069{
1070 pGraph->iErrno = 0;
1071 switch (pGraph->Version) {
1072 case 1:
1074 break;
1075#ifdef DGL_V2
1076 case 2:
1077 case 3:
1079 break;
1080#endif
1081 }
1082 pGraph->iErrno = DGL_ERR_BadVersion;
1083}
1084
1086{
1087 return pgraph->iErrno;
1088}
1089
1091{
1092 switch (pgraph->iErrno) {
1093 case DGL_ERR_BadVersion:
1094 return "Bad Version";
1096 return "Bad Node Type";
1098 return "Memory Exhausted";
1099 case DGL_ERR_HeapError:
1100 return "Heap Error";
1102 return "Undefined Method";
1103 case DGL_ERR_Write:
1104 return "Write";
1105 case DGL_ERR_Read:
1106 return "Read";
1108 return "Not Supported";
1110 return "Unknown Byte Order";
1112 return "Node Not Found";
1114 return "Head Node Not Found";
1116 return "Tail Node Not Found";
1117 case DGL_ERR_BadEdge:
1118 return "Bad Edge";
1120 return "Operation Not Supported On Flat-State Graph";
1122 return "Operation Not Supported On Tree-State Graph";
1124 return "Tree Search Error";
1126 return "Unexpected Null Pointer";
1128 return "Version Not Supported";
1130 return "Edge Not Found";
1132 return "Node Already Exist";
1134 return "Node Is A Component";
1136 return "Edge Already Exist";
1138 return "Bad Argument";
1139 }
1140
1141 return "unknown graph error code";
1142}
1143
1144/*
1145 * dglGraph_s hiders
1146 */
1148{
1149 return pgraph->Version;
1150}
1152{
1153 pgraph->Version = nVersion;
1154}
1155
1157{
1158 return pgraph->Endian;
1159}
1160
1162{
1163 return pgraph->NodeAttrSize;
1164}
1165
1167{
1168 return pgraph->EdgeAttrSize;
1169}
1170
1172{
1173 return pgraph->cNode;
1174}
1175
1177{
1178 return pgraph->cHead;
1179}
1180
1182{
1183 return pgraph->cTail;
1184}
1185
1187{
1188 return pgraph->cAlone;
1189}
1190
1192{
1193 return pgraph->cEdge;
1194}
1195
1197{
1198 return pgraph->Flags;
1199}
1200
1202{
1203 return pgraph->aOpaqueSet;
1204}
1205
1207{
1208 memcpy(pgraph->aOpaqueSet, pOpaque, sizeof(dglInt32_t) * 16);
1209}
1210
1212{
1213 switch (pgraph->Version) {
1214 case 1:
1215 return DGL_NODE_SIZEOF_v1(pgraph->NodeAttrSize);
1216#ifdef DGL_V2
1217 case 2:
1218 case 3:
1219 return DGL_NODE_SIZEOF_v2(pgraph->NodeAttrSize);
1220#endif
1221 }
1222 pgraph->iErrno = DGL_ERR_BadVersion;
1223 return -pgraph->iErrno;
1224}
1225
1227{
1228 switch (pgraph->Version) {
1229 case 1:
1230 return DGL_EDGE_SIZEOF_v1(pgraph->NodeAttrSize);
1231#ifdef DGL_V2
1232 case 2:
1233 case 3:
1234 return DGL_EDGE_SIZEOF_v2(pgraph->NodeAttrSize);
1235#endif
1236 }
1237 pgraph->iErrno = DGL_ERR_BadVersion;
1238 return -pgraph->iErrno;
1239}
1240
1242{
1243 return pgraph->nnCost;
1244}
1245
1247{
1248 pgraph->nnCost = nnCost;
1249}
1250
1252{
1253 return pgraph->nFamily;
1254}
1255
1257{
1258 pgraph->nFamily = nFamily;
1259}
1260
1262{
1263 return pgraph->nOptions;
1264}
1265
1267{
1268 pgraph->nOptions = nOptions;
1269}
1270
1272{
1273 return &pGraph->edgePrioritizer;
1274}
1275
1277{
1278 return &pGraph->nodePrioritizer;
1279}
1280
1281/*
1282 * Node Traverse
1283 */
1285{
1286 switch (pGraph->Version) {
1287 case 1:
1288 return dgl_node_t_initialize_V1(pGraph, pT);
1289#ifdef DGL_V2
1290 case 2:
1291 case 3:
1292 return dgl_node_t_initialize_V2(pGraph, pT);
1293#endif
1294 }
1295 pGraph->iErrno = DGL_ERR_BadVersion;
1296 return -pGraph->iErrno;
1297}
1298
1300{
1301 switch (pT->pGraph->Version) {
1302 case 1:
1304 return;
1305#ifdef DGL_V2
1306 case 2:
1307 case 3:
1309 return;
1310#endif
1311 }
1312 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1313}
1314
1316{
1317 switch (pT->pGraph->Version) {
1318 case 1:
1319 return dgl_node_t_first_V1(pT);
1320#ifdef DGL_V2
1321 case 2:
1322 case 3:
1323 return dgl_node_t_first_V2(pT);
1324#endif
1325 }
1326 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1327 return NULL;
1328}
1329
1331{
1332 switch (pT->pGraph->Version) {
1333 case 1:
1334 return dgl_node_t_next_V1(pT);
1335#ifdef DGL_V2
1336 case 2:
1337 case 3:
1338 return dgl_node_t_next_V2(pT);
1339#endif
1340 }
1341 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1342 return NULL;
1343}
1344
1346{
1347 switch (pT->pGraph->Version) {
1348 case 1:
1349 return dgl_node_t_find_V1(pT, nNodeId);
1350#ifdef DGL_V2
1351 case 2:
1352 case 3:
1353 return dgl_node_t_find_V2(pT, nNodeId);
1354#endif
1355 }
1356 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1357 return NULL;
1358}
1359
1360/*
1361 * Edge Traverser
1362 */
1364 dglEdgePrioritizer_s *pEdgePrioritizer)
1365{
1366 switch (pGraph->Version) {
1367 case 1:
1368 return dgl_edge_t_initialize_V1(pGraph, pT, pEdgePrioritizer);
1369#ifdef DGL_V2
1370 case 2:
1371 case 3:
1372 return dgl_edge_t_initialize_V2(pGraph, pT, pEdgePrioritizer);
1373#endif
1374 }
1375 pGraph->iErrno = DGL_ERR_BadVersion;
1376 return -pGraph->iErrno;
1377}
1378
1380{
1381 switch (pT->pGraph->Version) {
1382 case 1:
1384 return;
1385#ifdef DGL_V2
1386 case 2:
1387 case 3:
1389 return;
1390#endif
1391 }
1392 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1393}
1394
1396{
1397 switch (pT->pGraph->Version) {
1398 case 1:
1399 return dgl_edge_t_first_V1(pT);
1400#ifdef DGL_V2
1401 case 2:
1402 case 3:
1403 return dgl_edge_t_first_V2(pT);
1404#endif
1405 }
1406 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1407 return NULL;
1408}
1409
1411{
1412 switch (pT->pGraph->Version) {
1413 case 1:
1414 return dgl_edge_t_next_V1(pT);
1415#ifdef DGL_V2
1416 case 2:
1417 case 3:
1418 return dgl_edge_t_next_V2(pT);
1419#endif
1420 }
1421 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1422 return NULL;
1423}
1424
1426 dglInt32_t *pnEdgeset)
1427{
1428 switch (pGraph->Version) {
1429 case 1:
1430 return dgl_edgeset_t_initialize_V1(pGraph, pT, pnEdgeset);
1431#ifdef DGL_V2
1432 case 2:
1433 case 3:
1434 return dgl_edgeset_t_initialize_V2(pGraph, pT, pnEdgeset);
1435#endif
1436 }
1437 pGraph->iErrno = DGL_ERR_BadVersion;
1438 return -pGraph->iErrno;
1439}
1440
1444
1446{
1447 switch (pT->pGraph->Version) {
1448 case 1:
1449 return dgl_edgeset_t_first_V1(pT);
1450#ifdef DGL_V2
1451 case 2:
1452 case 3:
1453 return dgl_edgeset_t_first_V2(pT);
1454#endif
1455 }
1456 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1457 return NULL;
1458}
1459
1461{
1462 switch (pT->pGraph->Version) {
1463 case 1:
1464 return dgl_edgeset_t_next_V1(pT);
1465#ifdef DGL_V2
1466 case 2:
1467 case 3:
1468 return dgl_edgeset_t_next_V2(pT);
1469#endif
1470 }
1471 pT->pGraph->iErrno = DGL_ERR_BadVersion;
1472 return NULL;
1473}
1474
1475/*
1476 * chunked I/O
1477 */
1478
1479#define __CIO_BEGIN 0
1480#define __CIO_W_HEADER 1
1481#define __CIO_W_NODEBUFFER 2
1482#define __CIO_W_EDGEBUFFER 3
1483#define __CIO_R_HEADER 4
1484#define __CIO_R_NODEBUFFER 5
1485#define __CIO_R_EDGEBUFFER 6
1486#define __CIO_END 7
1487
1489{
1490 pIO->pG = pG;
1491 pIO->nState = __CIO_BEGIN;
1492 pIO->cb = 0;
1493 pIO->ib = 0;
1494 pIO->pb = NULL;
1495 return 0;
1496}
1497
1501
1503{
1504 unsigned char *pb;
1505 int cb;
1506
1507 switch (pIO->nState) {
1508 case __CIO_BEGIN:
1509 pIO->pb = pIO->ab;
1510 pb = pIO->pb;
1511 memcpy(pb, &pIO->pG->Version, 1);
1512 pb += 1; /* 1 */
1513 memcpy(pb, &pIO->pG->Endian, 1);
1514 pb += 1; /* 2 */
1515 memcpy(pb, &pIO->pG->NodeAttrSize, 4);
1516 pb += 4; /* 6 */
1517 memcpy(pb, &pIO->pG->EdgeAttrSize, 4);
1518 pb += 4; /* 10 */
1519 memcpy(pb, &pIO->pG->aOpaqueSet, 64);
1520 pb += 64; /* 74 */
1521 memcpy(pb, &pIO->pG->nOptions, 4);
1522 pb += 4; /* 78 */
1523 memcpy(pb, &pIO->pG->nFamily, 4);
1524 pb += 4; /* 82 */
1525 memcpy(pb, &pIO->pG->nnCost, 8);
1526 pb += 8; /* 90 */
1527 memcpy(pb, &pIO->pG->cNode, 4);
1528 pb += 4; /* 94 */
1529 memcpy(pb, &pIO->pG->cHead, 4);
1530 pb += 4; /* 98 */
1531 memcpy(pb, &pIO->pG->cTail, 4);
1532 pb += 4; /* 102 */
1533 memcpy(pb, &pIO->pG->cAlone, 4);
1534 pb += 4; /* 106 */
1535 memcpy(pb, &pIO->pG->cEdge, 4);
1536 pb += 4; /* 110 */
1537 memcpy(pb, &pIO->pG->iNodeBuffer, 4);
1538 pb += 4; /* 114 */
1539 memcpy(pb, &pIO->pG->iEdgeBuffer, 4);
1540 pb += 4; /* 118 */
1541 pIO->cb = 118;
1542 cb = pfn(pIO->pG, pIO->pb, pIO->cb, pv);
1543 if (cb >= 0) {
1544 pIO->ib += cb;
1545 if ((pIO->cb - pIO->ib) == 0) {
1546 pIO->ib = 0;
1547 pIO->cb = pIO->pG->iNodeBuffer;
1548 pIO->pb = pIO->pG->pNodeBuffer;
1549 pIO->nState = __CIO_W_NODEBUFFER;
1550 }
1551 else {
1552 pIO->nState = __CIO_W_HEADER;
1553 }
1554 }
1555 return cb;
1556 case __CIO_W_HEADER:
1557 cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
1558 if (cb > 0) {
1559 pIO->ib += cb;
1560 if ((pIO->cb - pIO->ib) == 0) {
1561 if (pIO->pG->iNodeBuffer > 0) {
1562 pIO->ib = 0;
1563 pIO->cb = pIO->pG->iNodeBuffer;
1564 pIO->pb = pIO->pG->pNodeBuffer;
1565 pIO->nState = __CIO_W_NODEBUFFER;
1566 }
1567 else if (pIO->pG->iEdgeBuffer > 0) {
1568 pIO->ib = 0;
1569 pIO->cb = pIO->pG->iEdgeBuffer;
1570 pIO->pb = pIO->pG->pEdgeBuffer;
1571 pIO->nState = __CIO_W_EDGEBUFFER;
1572 }
1573 else {
1574 pIO->nState = __CIO_END;
1575 }
1576 }
1577 else {
1578 pIO->nState = __CIO_W_HEADER;
1579 }
1580 }
1581 return cb;
1582 case __CIO_W_NODEBUFFER:
1583 cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
1584 if (cb > 0) {
1585 pIO->ib += cb;
1586 if ((pIO->cb - pIO->ib) == 0) {
1587 if (pIO->pG->iEdgeBuffer > 0) {
1588 pIO->ib = 0;
1589 pIO->cb = pIO->pG->iEdgeBuffer;
1590 pIO->pb = pIO->pG->pEdgeBuffer;
1591 pIO->nState = __CIO_W_EDGEBUFFER;
1592 }
1593 else {
1594 pIO->nState = __CIO_END;
1595 }
1596 }
1597 }
1598 return cb;
1599 case __CIO_W_EDGEBUFFER:
1600 cb = pfn(pIO->pG, pIO->pb + pIO->ib, pIO->cb - pIO->ib, pv);
1601 if (cb > 0) {
1602 pIO->ib += cb;
1603 if ((pIO->cb - pIO->ib) == 0) {
1604 pIO->nState = __CIO_END;
1605 }
1606 }
1607 return cb;
1608 case __CIO_END:
1609 pfn(pIO->pG, NULL, 0, pv); /* notify end of graph */
1610 return 0;
1611 }
1612 return 0;
1613}
1614
1616{
1617 int i, c;
1618 unsigned char *pb;
1619
1620 switch (pIO->nState) {
1621 case __CIO_BEGIN:
1622 pIO->cb = 118;
1623 pIO->ib = 0;
1624 pIO->pb = pIO->ab;
1625
1626 c = MIN(cbChunk, 118);
1627 memcpy(pIO->pb, pbChunk, c);
1628 pIO->ib += c;
1629 if ((pIO->cb - pIO->ib) == 0)
1630 goto init_nodebuffer;
1631 pIO->nState = __CIO_R_HEADER;
1632 return c;
1633
1634 case __CIO_R_HEADER:
1635 c = MIN(cbChunk, pIO->cb - pIO->ib);
1636 memcpy(pIO->pb + pIO->ib, pbChunk, c);
1637 pIO->ib += c;
1639 if ((pIO->cb - pIO->ib) == 0) {
1640 pb = pIO->pb;
1641 memcpy(&pIO->pG->Version, pb, 1);
1642 pb += 1; /* 1 */
1643 memcpy(&pIO->pG->Endian, pb, 1);
1644 pb += 1; /* 2 */
1645 memcpy(&pIO->pG->NodeAttrSize, pb, 4);
1646 pb += 4; /* 6 */
1647 memcpy(&pIO->pG->EdgeAttrSize, pb, 4);
1648 pb += 4; /* 10 */
1649 memcpy(&pIO->pG->aOpaqueSet, pb, 64);
1650 pb += 64; /* 74 */
1651 memcpy(&pIO->pG->nOptions, pb, 4);
1652 pb += 4; /* 78 */
1653 memcpy(&pIO->pG->nFamily, pb, 4);
1654 pb += 4; /* 82 */
1655 memcpy(&pIO->pG->nnCost, pb, 8);
1656 pb += 8; /* 90 */
1657 memcpy(&pIO->pG->cNode, pb, 4);
1658 pb += 4; /* 94 */
1659 memcpy(&pIO->pG->cHead, pb, 4);
1660 pb += 4; /* 98 */
1661 memcpy(&pIO->pG->cTail, pb, 4);
1662 pb += 4; /* 102 */
1663 memcpy(&pIO->pG->cAlone, pb, 4);
1664 pb += 4; /* 106 */
1665 memcpy(&pIO->pG->cEdge, pb, 4);
1666 pb += 4; /* 110 */
1667 memcpy(&pIO->pG->iNodeBuffer, pb, 4);
1668 pb += 4; /* 114 */
1669 memcpy(&pIO->pG->iEdgeBuffer, pb, 4);
1670 pb += 4; /* 118 */
1671
1672 pIO->fSwap = 0;
1673#ifdef DGL_ENDIAN_BIG
1674 if (pIO->pG->Endian == DGL_ENDIAN_LITTLE)
1675 pIO->fSwap = 1;
1676#else
1677 if (pIO->pG->Endian == DGL_ENDIAN_BIG)
1678 pIO->fSwap = 1;
1679#endif
1680 if (pIO->fSwap) {
1681 dgl_swapInt32Bytes(&pIO->pG->NodeAttrSize);
1682 dgl_swapInt32Bytes(&pIO->pG->EdgeAttrSize);
1683 dgl_swapInt32Bytes(&pIO->pG->nOptions);
1684 dgl_swapInt32Bytes(&pIO->pG->nFamily);
1685 dgl_swapInt64Bytes(&pIO->pG->nnCost);
1686 dgl_swapInt32Bytes(&pIO->pG->cNode);
1687 dgl_swapInt32Bytes(&pIO->pG->cHead);
1688 dgl_swapInt32Bytes(&pIO->pG->cTail);
1689 dgl_swapInt32Bytes(&pIO->pG->cAlone);
1690 dgl_swapInt32Bytes(&pIO->pG->cEdge);
1691 dgl_swapInt32Bytes(&pIO->pG->iNodeBuffer);
1692 dgl_swapInt32Bytes(&pIO->pG->iEdgeBuffer);
1693
1694 for (i = 0; i < 16; i++) {
1695 dgl_swapInt32Bytes(&pIO->pG->aOpaqueSet[i]);
1696 }
1697
1698#ifdef DGL_ENDIAN_BIG
1699 pIO->pG->Endian = DGL_ENDIAN_BIG;
1700#else
1701 pIO->pG->Endian = DGL_ENDIAN_LITTLE;
1702#endif
1703 }
1704
1705 if (pIO->pG->iNodeBuffer > 0) {
1706 pIO->pG->pNodeBuffer = malloc(pIO->pG->iNodeBuffer);
1707 if (pIO->pG->pNodeBuffer == NULL) {
1708 return -1;
1709 }
1710 pIO->cb = pIO->pG->iNodeBuffer;
1711 pIO->pb = pIO->pG->pNodeBuffer;
1712 pIO->ib = 0;
1713 pIO->nState = __CIO_R_NODEBUFFER;
1714 }
1715 else {
1716 goto init_edgebuffer;
1717 }
1718 }
1719 return c;
1720 case __CIO_R_NODEBUFFER:
1721 c = MIN(cbChunk, pIO->cb - pIO->ib);
1722 memcpy(pIO->pb + pIO->ib, pbChunk, c);
1723 pIO->ib += c;
1725 if ((pIO->cb - pIO->ib) == 0) {
1726 if (pIO->pG->iEdgeBuffer > 0) {
1727 pIO->pG->pEdgeBuffer = malloc(pIO->pG->iEdgeBuffer);
1728 if (pIO->pG->pEdgeBuffer == NULL) {
1729 return -1;
1730 }
1731 pIO->cb = pIO->pG->iEdgeBuffer;
1732 pIO->pb = pIO->pG->pEdgeBuffer;
1733 pIO->ib = 0;
1734 pIO->nState = __CIO_R_EDGEBUFFER;
1735 }
1736 else {
1737 pIO->nState = __CIO_END;
1738 }
1739 }
1740 return c;
1741 case __CIO_R_EDGEBUFFER:
1742 c = MIN(cbChunk, pIO->cb - pIO->ib);
1743 memcpy(pIO->pb + pIO->ib, pbChunk, c);
1744 pIO->ib += c;
1745 if ((pIO->cb - pIO->ib) == 0) {
1746 pIO->nState = __CIO_END;
1747 }
1748 return c;
1749 case __CIO_END: {
1750 /* switch on FLAT bit */
1751 pIO->pG->Flags |= DGL_GS_FLAT;
1752
1753 /* nodebuffer and edgebuffer are both arrays on 32 bit integer
1754 * byte order swapping is straightforward
1755 */
1756 if (pIO->fSwap && pIO->pG->iNodeBuffer > 0) {
1757 int in, cn;
1758 dglInt32_t *pn;
1759
1760 for (cn = pIO->pG->iNodeBuffer / sizeof(dglInt32_t),
1761 pn = (dglInt32_t *)pIO->pG->pNodeBuffer, in = 0;
1762 in < cn; in++) {
1763 dgl_swapInt32Bytes(&pn[in]);
1764 }
1765 }
1766 if (pIO->fSwap && pIO->pG->iEdgeBuffer > 0) {
1767 int in, cn;
1768 dglInt32_t *pn;
1769
1770 for (cn = pIO->pG->iEdgeBuffer / sizeof(dglInt32_t),
1771 pn = (dglInt32_t *)pIO->pG->pEdgeBuffer, in = 0;
1772 in < cn; in++) {
1773 dgl_swapInt32Bytes(&pn[in]);
1774 }
1775 }
1776 }
1777 return 0;
1778 default:
1779 return 0;
1780 }
1781}
#define NULL
Definition ccmath.h:32
#define MIN(a, b)
Definition gis.h:150
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:43
#define DGL_ERR_VersionNotSupported
Definition graph.h:257
int(* dglSPClip_fn)(dglGraph_s *, dglSPClipInput_s *, dglSPClipOutput_s *, void *)
Definition graph.h:167
#define DGL_ERR_BadOnTreeGraph
Definition graph.h:253
#define DGL_ERR_Write
Definition graph.h:245
#define DGL_ERR_BadNodeType
Definition graph.h:241
#define DGL_ERR_NodeIsAComponent
Definition graph.h:260
#define DGL_ERR_UndefinedMethod
Definition graph.h:244
#define DGL_NS_ALONE
Definition graph.h:49
#define DGL_ERR_BadArgument
Definition graph.h:262
#define DGL_ERR_BadVersion
Definition graph.h:240
#define DGL_ERR_TreeSearchError
Definition graph.h:255
int(* dglWriteChunk_fn)(dglGraph_s *, unsigned char *pbChunk, int cbChunk, void *pvArg)
Definition graph.h:339
#define DGL_ENDIAN_LITTLE
Definition graph.h:60
#define DGL_ERR_MemoryExhausted
Definition graph.h:242
#define DGL_ERR_BadOnFlatGraph
Definition graph.h:252
#define DGL_NS_HEAD
Definition graph.h:47
#define DGL_ERR_EdgeAlreadyExist
Definition graph.h:261
#define DGL_ERR_NotSupported
Definition graph.h:247
#define DGL_GS_FLAT
Definition graph.h:24
#define DGL_ERR_Read
Definition graph.h:246
#define DGL_ENDIAN_BIG
Definition graph.h:59
#define DGL_ERR_UnknownByteOrder
Definition graph.h:248
#define DGL_ERR_HeadNodeNotFound
Definition graph.h:249
#define DGL_ERR_UnexpectedNullPointer
Definition graph.h:256
#define DGL_ERR_BadEdge
Definition graph.h:251
#define DGL_ERR_NodeAlreadyExist
Definition graph.h:259
int(* dglSpanClip_fn)(dglGraph_s *, dglGraph_s *, dglSpanClipInput_s *, dglSpanClipOutput_s *, void *)
Definition graph.h:173
#define DGL_ERR_HeapError
Definition graph.h:243
#define DGL_ERR_EdgeNotFound
Definition graph.h:258
#define DGL_ERR_NodeNotFound
Definition graph.h:254
#define DGL_ERR_TailNodeNotFound
Definition graph.h:250
int dgl_initialize_V1(dglGraph_s *pgraph)
Definition graph_v1.c:92
int dgl_write_V1(dglGraph_s *pgraph, int fd)
Definition graph_v1.c:125
int dgl_read_V1(dglGraph_s *pgraph, int fd)
Definition graph_v1.c:220
int dgl_depthfirst_spanning_V1(dglGraph_s *pgraphIn, dglGraph_s *pgraphOut, dglInt32_t nVertex, void *pvVisited, dglSpanClip_fn fnClip, void *pvClipArg)
Definition graph_v1.c:64
int dgl_dijkstra_V1(dglGraph_s *pgraph, dglSPReport_s **ppReport, dglInt32_t *pDistance, dglInt32_t nStart, dglInt32_t nDestination, dglSPClip_fn fnClip, void *pvClipArg, dglSPCache_s *pCache)
Definition graph_v1.c:49
int dgl_minimum_spanning_V1(dglGraph_s *pgraphIn, dglGraph_s *pgraphOut, dglInt32_t nVertex, dglSpanClip_fn fnClip, void *pvClipArg)
Definition graph_v1.c:78
int dgl_release_V1(dglGraph_s *pgraph)
Definition graph_v1.c:105
void dgl_node_t_release_V1(dglNodeTraverser_s *pT)
dglInt32_t * dgl_node_t_first_V1(dglNodeTraverser_s *pT)
dglInt32_t * dgl_edge_t_first_V1(dglEdgeTraverser_s *pT)
int dgl_add_node_V1(dglGraph_s *pgraph, dglInt32_t nId, void *pvNodeAttr, dglInt32_t nFlags)
int dgl_unflatten_V1(dglGraph_s *pgraph)
#define DGL_EDGE_ATTR_PTR_v1(p)
Definition graph_v1.h:78
int dgl_edgeset_t_initialize_V1(dglGraph_s *pGraph, dglEdgesetTraverser_s *pTraverser, dglInt32_t *pnEdgeset)
void dgl_sp_cache_release_V1(dglGraph_s *pgraph, dglSPCache_s *pCache)
#define DGL_NODEBUFFER_SHIFT_v1(pgrp, o)
Definition graph_v1.h:107
dglInt32_t * dgl_node_t_next_V1(dglNodeTraverser_s *pT)
#define DGL_NODE_SIZEOF_v1(nattr)
Definition graph_v1.h:27
#define DGL_EDGE_COST_v1(p)
Definition graph_v1.h:76
dglInt32_t * dgl_edgeset_t_first_V1(dglEdgesetTraverser_s *pTraverser)
dglInt32_t * dgl_get_node_V1(dglGraph_s *pgraph, dglInt32_t nId)
#define DGL_EDGESET_EDGECOUNT_v1(p)
Definition graph_v1.h:53
#define DGL_NODE_STATUS_v1(p)
Definition graph_v1.h:34
#define DGL_NODE_ATTR_PTR_v1(p)
Definition graph_v1.h:36
dglInt32_t * dgl_getnode_outedgeset_V1(dglGraph_s *pgraph, dglInt32_t *pnode)
dglInt32_t * dgl_node_t_find_V1(dglNodeTraverser_s *pT, dglInt32_t nId)
int dgl_node_t_initialize_V1(dglGraph_s *pGraph, dglNodeTraverser_s *pT)
int dgl_sp_cache_initialize_V1(dglGraph_s *pgraph, dglSPCache_s *pCache, dglInt32_t nStart)
int dgl_add_edge_V1(dglGraph_s *pgraph, dglInt32_t nHead, dglInt32_t nTail, dglInt32_t nCost, dglInt32_t nEdge, void *pvHeadAttr, void *pvTailAttr, void *pvEdgeAttr, dglInt32_t nFlags)
#define DGL_EDGE_SIZEOF_v1(lattr)
Definition graph_v1.h:68
int dgl_flatten_V1(dglGraph_s *pgraph)
#define DGL_EDGE_TAILNODE_OFFSET_v1(p)
Definition graph_v1.h:75
#define DGL_EDGE_HEADNODE_OFFSET_v1(p)
Definition graph_v1.h:74
int dgl_edge_t_initialize_V1(dglGraph_s *pGraph, dglEdgeTraverser_s *pTraverser, dglEdgePrioritizer_s *pEP)
dglInt32_t * dgl_edge_t_next_V1(dglEdgeTraverser_s *pT)
dglInt32_t * dgl_edgeset_t_next_V1(dglEdgesetTraverser_s *pTraverser)
dglInt32_t * dgl_get_edge_V1(dglGraph_s *pgraph, dglInt32_t nId)
#define DGL_EDGE_ID_v1(p)
Definition graph_v1.h:77
int dgl_del_edge_V1(dglGraph_s *pgraph, dglInt32_t nId)
int dgl_del_node_V1(dglGraph_s *pgraph, dglInt32_t nId)
#define DGL_NODE_ID_v1(p)
Definition graph_v1.h:33
void dgl_edge_t_release_V1(dglEdgeTraverser_s *pTraverser)
int dgl_dijkstra_V2(dglGraph_s *pgraph, dglSPReport_s **ppReport, dglInt32_t *pDistance, dglInt32_t nStart, dglInt32_t nDestination, dglSPClip_fn fnClip, void *pvClipArg, dglSPCache_s *pCache)
Definition graph_v2.c:49
int dgl_write_V2(dglGraph_s *pgraph, int fd)
Definition graph_v2.c:131
int dgl_release_V2(dglGraph_s *pgraph)
Definition graph_v2.c:111
int dgl_depthfirst_spanning_V2(dglGraph_s *pgraphIn, dglGraph_s *pgraphOut, dglInt32_t nVertex, void *pvVisited, dglSpanClip_fn fnClip, void *pvClipArg)
Definition graph_v2.c:64
int dgl_initialize_V2(dglGraph_s *pgraph)
Definition graph_v2.c:92
int dgl_read_V2(dglGraph_s *pgraph, int fd, int version)
Definition graph_v2.c:226
int dgl_minimum_spanning_V2(dglGraph_s *pgraphIn, dglGraph_s *pgraphOut, dglInt32_t nVertex, dglSpanClip_fn fnClip, void *pvClipArg)
Definition graph_v2.c:78
dglInt32_t * dgl_get_edge_V2(dglGraph_s *pgraph, dglInt32_t nId)
dglInt32_t * dgl_edgeset_t_next_V2(dglEdgesetTraverser_s *pTraverser)
int dgl_edgeset_t_initialize_V2(dglGraph_s *pGraph, dglEdgesetTraverser_s *pTraverser, dglInt32_t *pnEdgeset)
#define DGL_NODE_ID_v2(p)
Definition graph_v2.h:33
int dgl_add_edge_V2(dglGraph_s *pgraph, dglInt32_t nHead, dglInt32_t nTail, dglInt32_t nCost, dglInt32_t nEdge, void *pvHeadAttr, void *pvTailAttr, void *pvEdgeAttr, dglInt32_t nFlags)
#define DGL_NODEBUFFER_SHIFT_v2(pgrp, o)
Definition graph_v2.h:107
int dgl_flatten_V2(dglGraph_s *pgraph)
int dgl_node_t_initialize_V2(dglGraph_s *pGraph, dglNodeTraverser_s *pT)
#define DGL_EDGE_SIZEOF_v2(lattr)
Definition graph_v2.h:68
int dgl_edge_t_initialize_V2(dglGraph_s *pGraph, dglEdgeTraverser_s *pTraverser, dglEdgePrioritizer_s *pEP)
#define DGL_EDGE_TAILNODE_OFFSET_v2(p)
Definition graph_v2.h:75
#define DGL_EDGE_ATTR_PTR_v2(p)
Definition graph_v2.h:79
dglInt32_t * dgl_node_t_first_V2(dglNodeTraverser_s *pT)
dglInt32_t * dgl_get_node_V2(dglGraph_s *pgraph, dglInt32_t nId)
#define DGL_NODE_SIZEOF_v2(nattr)
Definition graph_v2.h:27
void dgl_sp_cache_release_V2(dglGraph_s *pgraph, dglSPCache_s *pCache)
dglInt32_t * dgl_node_t_find_V2(dglNodeTraverser_s *pT, dglInt32_t nId)
int dgl_unflatten_V2(dglGraph_s *pgraph)
#define DGL_EDGESET_EDGECOUNT_v2(p)
Definition graph_v2.h:52
dglInt32_t * dgl_edge_t_first_V2(dglEdgeTraverser_s *pT)
#define DGL_NODE_ATTR_PTR_v2(p)
Definition graph_v2.h:36
#define DGL_EDGE_COST_v2(p)
Definition graph_v2.h:77
dglInt32_t * dgl_node_t_next_V2(dglNodeTraverser_s *pT)
dglInt32_t * dgl_edge_t_next_V2(dglEdgeTraverser_s *pT)
dglInt32_t * dgl_edgeset_t_first_V2(dglEdgesetTraverser_s *pTraverser)
int dgl_del_edge_V2(dglGraph_s *pgraph, dglInt32_t nId)
int dgl_del_node_V2(dglGraph_s *pgraph, dglInt32_t nId)
#define DGL_EDGE_HEADNODE_OFFSET_v2(p)
Definition graph_v2.h:74
int dgl_sp_cache_initialize_V2(dglGraph_s *pgraph, dglSPCache_s *pCache, dglInt32_t nStart)
void dgl_node_t_release_V2(dglNodeTraverser_s *pT)
dglInt32_t * dgl_getnode_inedgeset_V2(dglGraph_s *pgraph, dglInt32_t *pnode)
int dgl_add_node_V2(dglGraph_s *pgraph, dglInt32_t nId, void *pvNodeAttr, dglInt32_t nFlags)
#define DGL_EDGE_ID_v2(p)
Definition graph_v2.h:78
#define DGL_NODE_STATUS_v2(p)
Definition graph_v2.h:34
void dgl_edge_t_release_V2(dglEdgeTraverser_s *pTraverser)
dglInt32_t * dgl_getnode_outedgeset_V2(dglGraph_s *pgraph, dglInt32_t *pnode)
void dgl_swapInt64Bytes(dglInt64_t *pn)
Definition helpers.c:55
void dgl_swapInt32Bytes(dglInt32_t *pn)
Definition helpers.c:42
void * malloc(unsigned)
void free(void *)
dglInt32_t NodeAttrSize
Definition graph.h:130
dglByte_t Endian
Definition graph.h:129
dglInt32_t EdgeAttrSize
Definition graph.h:131
dglEdgePrioritizer_s edgePrioritizer
Definition graph.h:152
int iErrno
Definition graph.h:126
dglInt32_t aOpaqueSet[16]
Definition graph.h:132
dglByte_t Version
Definition graph.h:128
dglNodePrioritizer_s nodePrioritizer
Definition graph.h:153
dglInt32_t Flags
Definition graph.h:141
int dglTreeNodeCompare(const void *pvNodeA, const void *pvNodeB, void *pvParam)
Definition tree.c:42
void * dglTreeGetAllocator(void)
Definition tree.c:394
void dglTreeNodeCancel(void *pvNode, void *pvParam)
Definition tree.c:33
#define avl_find
Definition tree.h:26
#define avl_create
Definition tree.h:19
#define avl_destroy
Definition tree.h:21
long long dglInt64_t
Definition type.h:25
unsigned char dglByte_t
Definition type.h:23
long dglInt32_t
Definition type.h:24
#define read
Definition unistd.h:5
dglInt32_t * dglNode_T_Next(dglNodeTraverser_s *pT)
dglInt32_t * dglEdge_T_First(dglEdgeTraverser_s *pT)
dglInt32_t * dglNode_T_First(dglNodeTraverser_s *pT)
dglInt32_t * dglGetNode(dglGraph_s *pGraph, dglInt32_t nNodeId)
void dglFreeSPReport(dglGraph_s *pgraph, dglSPReport_s *pSPReport)
dglInt32_t * dglEdge_T_Next(dglEdgeTraverser_s *pT)
void dglSet_Family(dglGraph_s *pgraph, dglInt32_t nFamily)
int dglRead(dglGraph_s *pGraph, int fd)
int dglGet_NodeAttrSize(dglGraph_s *pgraph)
dglInt32_t dglGet_Family(dglGraph_s *pgraph)
int dglWriteChunk(dglIOContext_s *pIO, dglWriteChunk_fn pfn, void *pv)
dglInt32_t * dglGet_Opaque(dglGraph_s *pgraph)
void dglSet_Version(dglGraph_s *pgraph, int nVersion)
#define __CIO_W_NODEBUFFER
dglInt32_t * dglNodeGet_OutEdgeset(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglAddEdgeX(dglGraph_s *pGraph, dglInt32_t nHead, dglInt32_t nTail, dglInt32_t nCost, dglInt32_t nEdge, void *pvHeadAttr, void *pvTailAttr, void *pvEdgeAttr, dglInt32_t nFlags)
int dglGet_EdgeAttrSize(dglGraph_s *pgraph)
#define __CIO_R_EDGEBUFFER
dglInt32_t dglNodeGet_Status(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglReadChunk(dglIOContext_s *pIO, dglByte_t *pbChunk, int cbChunk)
int dglErrno(dglGraph_s *pgraph)
int dglAddEdge(dglGraph_s *pGraph, dglInt32_t nHead, dglInt32_t nTail, dglInt32_t nCost, dglInt32_t nEdge)
int dglEdgeset_T_Initialize(dglEdgesetTraverser_s *pT, dglGraph_s *pGraph, dglInt32_t *pnEdgeset)
int dglShortestPath(dglGraph_s *pGraph, dglSPReport_s **ppReport, dglInt32_t nStart, dglInt32_t nDestination, dglSPClip_fn fnClip, void *pvClipArg, dglSPCache_s *pCache)
void dglSet_Cost(dglGraph_s *pgraph, dglInt64_t nnCost)
#define __CIO_END
dglInt32_t * dglNodeGet_InEdgeset(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglNode_T_Initialize(dglNodeTraverser_s *pT, dglGraph_s *pGraph)
dglInt32_t dglEdgeGet_Id(dglGraph_s *pGraph, dglInt32_t *pnEdge)
void dglSet_Options(dglGraph_s *pgraph, dglInt32_t nOptions)
dglInt32_t * dglEdgeset_T_First(dglEdgesetTraverser_s *pT)
dglInt32_t * dglNode_T_Find(dglNodeTraverser_s *pT, dglInt32_t nNodeId)
int dglDepthSpanning(dglGraph_s *pgraphInput, dglGraph_s *pgraphOutput, dglInt32_t nVertexNode, dglSpanClip_fn fnClip, void *pvClipArg)
void dglNodeSet_Attr(dglGraph_s *pGraph, dglInt32_t *pnNode, dglInt32_t *pnAttr)
int dglRelease(dglGraph_s *pGraph)
dglNodePrioritizer_s * dglGet_NodePrioritizer(dglGraph_s *pGraph)
int dglEdgeSet_Attr(dglGraph_s *pGraph, dglInt32_t *pnAttr, dglInt32_t *pnEdge)
#define __CIO_BEGIN
dglEdgePrioritizer_s * dglGet_EdgePrioritizer(dglGraph_s *pGraph)
#define __CIO_W_EDGEBUFFER
int dglInitialize(dglGraph_s *pGraph, dglByte_t Version, dglInt32_t NodeAttrSize, dglInt32_t EdgeAttrSize, dglInt32_t *pOpaqueSet)
#define __CIO_W_HEADER
int dglGet_Endianess(dglGraph_s *pgraph)
int dglGet_EdgeSize(dglGraph_s *pgraph)
int dglGet_EdgeCount(dglGraph_s *pgraph)
int dglMinimumSpanning(dglGraph_s *pgraphInput, dglGraph_s *pgraphOutput, dglInt32_t nVertexNode, dglSpanClip_fn fnClip, void *pvClipArg)
char * dglStrerror(dglGraph_s *pgraph)
int dglShortestDistance(dglGraph_s *pGraph, dglInt32_t *pnDistance, dglInt32_t nStart, dglInt32_t nDestination, dglSPClip_fn fnClip, void *pvClipArg, dglSPCache_s *pCache)
int dglNodeGet_OutDegree(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglEdge_T_Initialize(dglEdgeTraverser_s *pT, dglGraph_s *pGraph, dglEdgePrioritizer_s *pEdgePrioritizer)
int dglDelEdge(dglGraph_s *pGraph, dglInt32_t nEdgeId)
dglInt32_t * dglEdgeset_T_Next(dglEdgesetTraverser_s *pT)
int dglNodeGet_Valence(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglNodeGet_InDegree(dglGraph_s *pGraph, dglInt32_t *pnNode)
dglInt32_t * dglNodeGet_Attr(dglGraph_s *pGraph, dglInt32_t *pnNode)
dglInt32_t * dglGetEdge(dglGraph_s *pGraph, dglInt32_t nEdgeId)
int dglInitializeSPCache(dglGraph_s *pGraph, dglSPCache_s *pCache)
int dglGet_NodeCount(dglGraph_s *pgraph)
int dglGet_Version(dglGraph_s *pgraph)
int dglWrite(dglGraph_s *pGraph, int fd)
dglInt32_t * dglEdgeGet_Attr(dglGraph_s *pGraph, dglInt32_t *pnEdge)
int dglGet_AloneNodeCount(dglGraph_s *pgraph)
int dglFlatten(dglGraph_s *pGraph)
dglInt32_t dglEdgeGet_Cost(dglGraph_s *pGraph, dglInt32_t *pnEdge)
int dglDepthComponents(dglGraph_s *pgraphInput, dglGraph_s *pgraphComponents, int cgraphComponents, dglSpanClip_fn fnClip, void *pvClipArg)
void dglNode_T_Release(dglNodeTraverser_s *pT)
dglInt32_t dglEdgesetGet_EdgeCount(dglGraph_s *pGraph, dglInt32_t *pnEdgeset)
int dglUnflatten(dglGraph_s *pGraph)
dglInt32_t dglGet_Options(dglGraph_s *pgraph)
void dglEdgeset_T_Release(dglEdgesetTraverser_s *pT)
int dglGet_NodeSize(dglGraph_s *pgraph)
void dglEdge_T_Release(dglEdgeTraverser_s *pT)
int dglGet_TailNodeCount(dglGraph_s *pgraph)
void dglReleaseSPCache(dglGraph_s *pGraph, dglSPCache_s *pCache)
void dglResetStats(dglGraph_s *pgraph)
void dglSet_Opaque(dglGraph_s *pgraph, dglInt32_t *pOpaque)
int dglIOContextInitialize(dglGraph_s *pG, dglIOContext_s *pIO)
dglInt32_t * dglEdgeGet_Head(dglGraph_s *pGraph, dglInt32_t *pnEdge)
dglInt32_t * dglEdgeGet_Tail(dglGraph_s *pGraph, dglInt32_t *pnEdge)
#define __CIO_R_NODEBUFFER
void dglIOContextRelease(dglIOContext_s *pIO)
int dglDelNode(dglGraph_s *pGraph, dglInt32_t nNodeId)
#define __CIO_R_HEADER
dglInt64_t dglGet_Cost(dglGraph_s *pgraph)
dglInt32_t dglNodeGet_Id(dglGraph_s *pGraph, dglInt32_t *pnNode)
int dglGet_HeadNodeCount(dglGraph_s *pgraph)
int dglGet_State(dglGraph_s *pgraph)
int dglAddNode(dglGraph_s *pGraph, dglInt32_t nNodeId, void *pvNodeAttr, dglInt32_t nFlags)