X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fsegmentsx.h;fp=src%2Fsegmentsx.h;h=a8439009ead220888c26c42f7fe47ca0456f590c;hb=a5b34ad069a52ff6cf981f01667d102292988811;hp=ac19a773883063ad82ddd692a9f392a668469918;hpb=20283c6cf5c6951cc1f2787492c67a7fb72aee9a;p=routino diff --git a/src/segmentsx.h b/src/segmentsx.h index ac19a77..a843900 100644 --- a/src/segmentsx.h +++ b/src/segmentsx.h @@ -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. @@ -27,8 +27,12 @@ #include -#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 */