29#if !defined(DGL_DEFINE_TREE_PROCS) && !defined(DGL_DEFINE_FLAT_PROCS)
215#if defined(DGL_DEFINE_TREE_PROCS) || defined(DGL_DEFINE_FLAT_PROCS)
217#define __EDGELOOP_BODY_1(f) \
219 pDestination = _DGL_EDGE_TAILNODE(pgraph, pEdge); \
222 pDestination = _DGL_EDGE_HEADNODE(pgraph, pEdge); \
224 if (!(DGL_NODE_STATUS(pDestination) & DGL_NS_TAIL) && \
225 pgraph->Version < 3) { \
226 pgraph->iErrno = DGL_ERR_BadEdge; \
229 clipOutput.nEdgeCost = DGL_EDGE_COST(pEdge); \
231 clipInput.pnPrevEdge = NULL; \
232 clipInput.pnNodeFrom = pStart; \
233 clipInput.pnEdge = pEdge; \
234 clipInput.pnNodeTo = pDestination; \
235 clipInput.nFromDistance = 0; \
236 if (fnClip(pgraph, &clipInput, &clipOutput, pvClipArg)) \
239 findPredist.nKey = DGL_NODE_ID(pDestination); \
240 if ((pPredistItem = avl_find(pCache->pvPredist, &findPredist)) == NULL) { \
241 if ((pPredistItem = dglTreePredistAdd( \
242 pCache->pvPredist, DGL_NODE_ID(pDestination))) == NULL) { \
243 pgraph->iErrno = DGL_ERR_MemoryExhausted; \
248 if (pPredistItem->nDistance <= clipOutput.nEdgeCost) { \
252 pPredistItem->nFrom = nStart; \
253 pPredistItem->pnEdge = pEdge; \
254 pPredistItem->nCost = clipOutput.nEdgeCost; \
255 pPredistItem->nDistance = clipOutput.nEdgeCost; \
256 pPredistItem->bFlags = (f); \
257 heapvalue.pv = pEdge; \
258 if (dglHeapInsertMin(&pCache->NodeHeap, pPredistItem->nDistance, f, \
260 pgraph->iErrno = DGL_ERR_HeapError; \
264#define __EDGELOOP_BODY_2(f) \
266 pDestination = _DGL_EDGE_TAILNODE(pgraph, pEdge); \
268 else if (pgraph->Version == 3) { \
269 pDestination = _DGL_EDGE_HEADNODE(pgraph, pEdge); \
271 if (!(DGL_NODE_STATUS(pDestination) & DGL_NS_TAIL) && \
272 pgraph->Version < 3) { \
273 pgraph->iErrno = DGL_ERR_BadEdge; \
276 clipOutput.nEdgeCost = DGL_EDGE_COST(pEdge); \
278 clipInput.pnPrevEdge = pEdge_prev; \
279 clipInput.pnNodeFrom = pStart; \
280 clipInput.pnEdge = pEdge; \
281 clipInput.pnNodeTo = pDestination; \
282 clipInput.nFromDistance = fromDist; \
283 if (fnClip(pgraph, &clipInput, &clipOutput, pvClipArg)) \
286 findPredist.nKey = DGL_NODE_ID(pDestination); \
287 if ((pPredistItem = avl_find(pCache->pvPredist, &findPredist)) == NULL) { \
288 if ((pPredistItem = dglTreePredistAdd( \
289 pCache->pvPredist, DGL_NODE_ID(pDestination))) == NULL) { \
290 pgraph->iErrno = DGL_ERR_MemoryExhausted; \
295 if (pPredistItem->nDistance <= fromDist + clipOutput.nEdgeCost) { \
299 pPredistItem->nFrom = DGL_NODE_ID(pStart); \
300 pPredistItem->pnEdge = pEdge; \
301 pPredistItem->nCost = clipOutput.nEdgeCost; \
302 pPredistItem->nDistance = fromDist + clipOutput.nEdgeCost; \
303 pPredistItem->bFlags = (f); \
304 heapvalue.pv = pEdge; \
305 if (dglHeapInsertMin(&pCache->NodeHeap, pPredistItem->nDistance, f, \
307 pgraph->iErrno = DGL_ERR_HeapError; \
443 if (
pgraph->Version == 3) {
565 if (
pgraph->Version == 3) {
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
int(* dglSPClip_fn)(dglGraph_s *, dglSPClipInput_s *, dglSPClipOutput_s *, void *)
#define DGL_ERR_MemoryExhausted
#define DGL_ERR_HeadNodeNotFound
#define DGL_ERR_UnexpectedNullPointer
#define DGL_ERR_TailNodeNotFound
void dglHeapInit(dglHeap_s *pheap)
void dglHeapFree(dglHeap_s *pheap, dglHeapCancelItem_fn pfnCancelItem)
int dglHeapExtractMin(dglHeap_s *pheap, dglHeapNode_s *pnoderet)
unsigned char * dgl_mempop(unsigned char *pstack, long *istack, long size)
unsigned char * dgl_mempush(unsigned char *pstack, long *istack, long size, void *pv)
void dglTreePredistCancel(void *pvPredist, void *pvParam)
int dglTreeTouchI32Compare(const void *pvTouchI32A, const void *pvTouchI32B, void *pvParam)
int dglTreePredistCompare(const void *pvPredistA, const void *pvPredistB, void *pvParam)
void * dglTreeGetAllocator(void)
dglTreeTouchI32_s * dglTreeTouchI32Add(void *pavl, dglInt32_t nKey)
void dglTreeTouchI32Cancel(void *pvTouchI32, void *pvParam)
#define DGL_SP_CACHE_REPORT_FUNC
#define DGL_EDGESET_T_FIRST_FUNC
#define DGL_SP_CACHE_INITIALIZE_FUNC
#define DGL_SP_CACHE_RELEASE_FUNC
#define DGL_EDGE_TAILNODE_OFFSET
#define DGL_GET_NODE_FUNC
#define DGL_EDGE_STATUS(p)
#define DGL_EDGESET_T_RELEASE_FUNC
#define DGL_EDGESET_T_INITIALIZE_FUNC
#define DGL_SP_CACHE_DISTANCE_FUNC
#define DGL_EDGE_HEADNODE_OFFSET
#define DGL_EDGESET_T_NEXT_FUNC
#define DGL_NODEBUFFER_SHIFT
void dglFreeSPReport(dglGraph_s *pgraph, dglSPReport_s *pSPReport)