Imported Upstream version 1.5
[routino] / src / segmentsx.h
index ac19a77..a843900 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************
- $Header: /home/amb/routino/src/RCS/segmentsx.h,v 1.20 2010/03/19 19:47:09 amb Exp $
+ $Header: /home/amb/routino/src/RCS/segmentsx.h,v 1.26 2010/07/31 14:36:15 amb Exp $
 
  A header file for the extended segments.
 
 
 #include <stdint.h>
 
-#include "typesx.h"
 #include "types.h"
+#include "segments.h"
+
+#include "typesx.h"
+
+#include "files.h"
 
 
 /* Data structures */
@@ -52,17 +56,35 @@ struct _SegmentsX
  char      *filename;           /*+ The name of the temporary file. +*/
  int        fd;                 /*+ The file descriptor of the temporary file. +*/
 
- uint32_t   xnumber;            /*+ The number of unsorted extended nodes. +*/
+ index_t    xnumber;            /*+ The number of unsorted extended nodes. +*/
+
+#if !SLIM
 
  SegmentX  *xdata;              /*+ The extended segment data (unsorted). +*/
- SegmentX   cached[2];          /*+ Two cached segments read from the file in slim mode. +*/
 
- uint32_t   number;             /*+ How many entries are still useful? +*/
+#else
+
+ SegmentX   xcached[2];         /*+ Two cached segments read from the file in slim mode. +*/
+
+#endif
+
+ index_t    number;             /*+ How many entries are still useful? +*/
 
  node_t   *idata;               /*+ The extended segment data (sorted by node1 then node2). +*/
  index_t  *firstnode;           /*+ The first segment index for each node. +*/
 
+#if !SLIM
+
  Segment   *sdata;              /*+ The segment data (same order as n1data). +*/
+
+#else
+
+ char     *sfilename;           /*+ The name of the temporary file for segments in slim mode. +*/
+ int       sfd;                 /*+ The file descriptor of the temporary file. +*/
+
+ Segment   scached[2];          /*+ Two cached segments read from the file in slim mode. +*/
+
+#endif
 };
 
 
@@ -74,8 +96,6 @@ void FreeSegmentList(SegmentsX *segmentsx,int keep);
 
 void SaveSegmentList(SegmentsX *segmentsx,const char *filename);
 
-SegmentX *LookupSegmentX(SegmentsX* segmentsx,index_t index,int position);
-
 index_t IndexFirstSegmentX(SegmentsX* segmentsx,node_t node);
 
 index_t IndexNextSegmentX(SegmentsX* segmentsx,index_t segindex,index_t nodeindex);
@@ -97,4 +117,86 @@ void CreateRealSegments(SegmentsX *segmentsx,WaysX *waysx);
 void IndexSegments(SegmentsX* segmentsx,NodesX *nodesx);
 
 
+/* Macros / inline functions */
+
+
+#if !SLIM
+
+#define LookupSegmentX(segmentsx,index,position)         &(segmentsx)->xdata[index]
+  
+#define LookupSegmentXSegment(segmentsx,index,position)  &(segmentsx)->sdata[index]
+
+#else
+
+static SegmentX *LookupSegmentX(SegmentsX* segmentsx,index_t index,int position);
+
+static Segment *LookupSegmentXSegment(SegmentsX* segmentsx,index_t index,int position);
+
+static void PutBackSegmentXSegment(SegmentsX* segmentsx,index_t index,int position);
+
+
+/*++++++++++++++++++++++++++++++++++++++
+  Lookup a particular extended segment.
+
+  SegmentX *LookupSegmentX Returns a pointer to the extended segment with the specified id.
+
+  SegmentsX* segmentsx The set of segments to process.
+
+  index_t index The segment index to look for.
+
+  int position The position in the cache to use.
+  ++++++++++++++++++++++++++++++++++++++*/
+
+static inline SegmentX *LookupSegmentX(SegmentsX* segmentsx,index_t index,int position)
+{
+ SeekFile(segmentsx->fd,(off_t)index*sizeof(SegmentX));
+
+ ReadFile(segmentsx->fd,&segmentsx->xcached[position-1],sizeof(SegmentX));
+
+ return(&segmentsx->xcached[position-1]);
+}
+
+
+/*++++++++++++++++++++++++++++++++++++++
+  Lookup a particular extended segment's normal segment.
+
+  Segment *LookupSegmentXSegment Returns a pointer to the segment with the specified id.
+
+  SegmentsX* segmentsx The set of segments to process.
+
+  index_t index The segment index to look for.
+
+  int position The position in the cache to use.
+  ++++++++++++++++++++++++++++++++++++++*/
+
+static inline Segment *LookupSegmentXSegment(SegmentsX* segmentsx,index_t index,int position)
+{
+ SeekFile(segmentsx->sfd,(off_t)index*sizeof(Segment));
+
+ ReadFile(segmentsx->sfd,&segmentsx->scached[position-1],sizeof(Segment));
+
+ return(&segmentsx->scached[position-1]);
+}
+
+
+/*++++++++++++++++++++++++++++++++++++++
+  Put back an extended segment's normal segment.
+
+  SegmentsX* segmentsx The set of segments to process.
+
+  index_t index The segment index to look for.
+
+  int position The position in the cache to use.
+  ++++++++++++++++++++++++++++++++++++++*/
+
+static inline void PutBackSegmentXSegment(SegmentsX* segmentsx,index_t index,int position)
+{
+ SeekFile(segmentsx->sfd,(off_t)index*sizeof(Segment));
+
+ WriteFile(segmentsx->sfd,&segmentsx->scached[position-1],sizeof(Segment));
+}
+
+#endif /* SLIM */
+
+
 #endif /* SEGMENTSX_H */