/***************************************
- $Header: /home/amb/routino/src/RCS/superx.c,v 1.38 2010/07/05 19:05:51 amb Exp $
+ $Header: /home/amb/routino/src/RCS/superx.c,v 1.44 2010/10/09 14:14:42 amb Exp $
Super-Segment data type functions.
***************************************/
-#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
-#include "results.h"
-#include "functions.h"
+#include "ways.h"
+
#include "nodesx.h"
#include "segmentsx.h"
#include "waysx.h"
#include "superx.h"
-#include "ways.h"
+#include "files.h"
+#include "results.h"
-/* Variables */
-
-/*+ The command line '--slim' option. +*/
-extern int option_slim;
/* Local Functions */
index_t i;
int nnodes=0;
- /* Check the start conditions */
-
- assert(segmentsx->firstnode); /* Must have firstnode filled in => segments are updated */
+ if(nodesx->number==0 || segmentsx->number==0 || waysx->number==0)
+ return;
/* Print the start message */
/* Map into memory */
- if(!option_slim)
- {
- segmentsx->xdata=MapFile(segmentsx->filename);
- waysx->xdata=MapFile(waysx->filename);
- }
+#if !SLIM
+ nodesx->xdata=MapFile(nodesx->filename);
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ waysx->xdata=MapFile(waysx->filename);
+#endif
/* Find super-nodes */
for(i=0;i<nodesx->number;i++)
{
+ NodeX *nodex=LookupNodeX(nodesx,i,1);
int difference=0;
index_t index1,index2;
index1=IndexNextSegmentX(segmentsx,index1,i);
index2=index1;
+ /* If the node allows less traffic types than any connecting way ... */
+
+ if((wayx1->way.allow&nodex->allow)!=wayx1->way.allow)
+ {
+ difference=1;
+ break;
+ }
+
while(index2!=NO_SEGMENT)
{
SegmentX *segmentx2=LookupSegmentX(segmentsx,index2,2);
WayX *wayx2=LookupWayX(waysx,segmentx2->way,2);
- /* If the ways are different in any way and there is a type of traffic that can use both ... */
+ /* If the ways are different in any attribute and there is a type of traffic that can use both ... */
if(WaysCompare(&wayx1->way,&wayx2->way))
if(wayx1->way.allow & wayx2->way.allow)
/* Unmap from memory */
- if(!option_slim)
- {
- segmentsx->xdata=UnmapFile(segmentsx->filename);
- waysx->xdata=UnmapFile(waysx->filename);
- }
+#if !SLIM
+ nodesx->xdata=UnmapFile(nodesx->filename);
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ waysx->xdata=UnmapFile(waysx->filename);
+#endif
/* Print the final message */
SegmentsX *supersegmentsx;
int sn=0,ss=0;
- /* Check the start conditions */
+ supersegmentsx=NewSegmentList(0);
- assert(segmentsx->firstnode); /* Must have firstnode filled in => segments are updated */
+ if(segmentsx->number==0 || waysx->number==0)
+ return(supersegmentsx);
/* Print the start message */
/* Map into memory */
- if(!option_slim)
- {
- segmentsx->xdata=MapFile(segmentsx->filename);
- waysx->xdata=MapFile(waysx->filename);
- }
+#if !SLIM
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ waysx->xdata=MapFile(waysx->filename);
+#endif
/* Create super-segments for each super-node. */
- supersegmentsx=NewSegmentList(0);
-
for(i=0;i<nodesx->number;i++)
{
if(nodesx->super[i]>iteration)
/* Unmap from memory */
- if(!option_slim)
- {
- segmentsx->xdata=UnmapFile(segmentsx->filename);
- waysx->xdata=UnmapFile(waysx->filename);
- }
+#if !SLIM
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ waysx->xdata=UnmapFile(waysx->filename);
+#endif
/* Print the final message */
int m=0,a=0;
SegmentsX* mergedsegmentsx;
+ mergedsegmentsx=NewSegmentList(0);
+
+ if(segmentsx->number==0 || supersegmentsx->number==0)
+ return(mergedsegmentsx);
+
/* Print the start message */
printf("Merging: Segments=0 Super-Segments=0 Merged=0 Added=0");
/* Map into memory */
- if(!option_slim)
- {
- segmentsx->xdata=MapFile(segmentsx->filename);
- supersegmentsx->xdata=MapFile(supersegmentsx->filename);
- }
+#if !SLIM
+ segmentsx->xdata=MapFile(segmentsx->filename);
+ supersegmentsx->xdata=MapFile(supersegmentsx->filename);
+#endif
/* Loop through and create a new list of combined segments */
- mergedsegmentsx=NewSegmentList(0);
-
for(i=0,j=0;i<segmentsx->number;i++)
{
int super=0;
/* Unmap from memory */
- if(!option_slim)
- {
- segmentsx->xdata=UnmapFile(segmentsx->filename);
- supersegmentsx->xdata=UnmapFile(supersegmentsx->filename);
- }
+#if !SLIM
+ segmentsx->xdata=UnmapFile(segmentsx->filename);
+ supersegmentsx->xdata=UnmapFile(supersegmentsx->filename);
+#endif
/* Print the final message */