/***************************************
- $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 */
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
};
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);
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 */