X-Git-Url: http://git.maemo.org/git/?p=routino;a=blobdiff_plain;f=src%2Fsegments.h;h=464d6a3b76cf45a8d3482cc82cb40b8e7f796046;hp=8b6554f30f19b51d1341e8e0e107f4cc5045a02e;hb=a5b34ad069a52ff6cf981f01667d102292988811;hpb=20283c6cf5c6951cc1f2787492c67a7fb72aee9a diff --git a/src/segments.h b/src/segments.h index 8b6554f..464d6a3 100644 --- a/src/segments.h +++ b/src/segments.h @@ -1,11 +1,11 @@ /*************************************** - $Header: /home/amb/routino/src/RCS/segments.h,v 1.34 2009/11/14 19:39:20 amb Exp $ + $Header: /home/amb/routino/src/RCS/segments.h,v 1.37 2010/07/31 14:36:15 amb Exp $ A header file for the segments. Part of the Routino routing software. ******************/ /****************** - This file Copyright 2008,2009 Andrew M. Bishop + This file Copyright 2008-2010 Andrew M. Bishop This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by @@ -28,6 +28,8 @@ #include #include "types.h" + +#include "files.h" #include "profiles.h" @@ -48,27 +50,50 @@ struct _Segment }; -/*+ A structure containing a set of segments (mmap format). +*/ +/*+ A structure containing the header from the file. +*/ +typedef struct _SegmentsFile +{ + index_t number; /*+ How many segments in total? +*/ + index_t snumber; /*+ How many super-segments? +*/ + index_t nnumber; /*+ How many normal segments? +*/ +} + SegmentsFile; + + +/*+ A structure containing a set of segments (and pointers to mmap file). +*/ struct _Segments { - uint32_t number; /*+ How many segments in total? +*/ - uint32_t snumber; /*+ How many super-segments? +*/ - uint32_t nnumber; /*+ How many normal segments? +*/ + SegmentsFile file; /*+ The header data from the file. +*/ + +#if !SLIM + + void *data; /*+ The memory mapped data. +*/ - Segment *segments; /*+ An array of segments. +*/ + Segment *segments; /*+ An array of segments. +*/ - void *data; /*+ The memory mapped data. +*/ +#else + + int fd; /*+ The file descriptor for the file. +*/ + + Segment cached[3]; /*+ The cached segments. +*/ + index_t incache[3]; /*+ The indexes of the cached segments. +*/ + +#endif }; -/* Macros */ +/* Functions */ +Segments *LoadSegmentList(const char *filename); -/*+ Return a segment pointer given a set of segments and an index. +*/ -#define LookupSegment(xxx,yyy) (&(xxx)->segments[yyy]) +Segment *NextSegment(Segments* segments,Segment *segment,index_t node); + +distance_t Distance(double lat1,double lon1,double lat2,double lon2); + +duration_t Duration(Segment *segment,Way *way,Profile *profile); -/*+ Return a segment index given a set of segments and a pointer. +*/ -#define IndexSegment(xxx,yyy) ((yyy)-&(xxx)->segments[0]) + +/* Macros and inline functions */ /*+ Return true if this is a normal segment. +*/ #define IsNormalSegment(xxx) (((xxx)->distance)&SEGMENT_NORMAL) @@ -86,16 +111,67 @@ struct _Segments #define OtherNode(xxx,yyy) ((xxx)->node1==(yyy)?(xxx)->node2:(xxx)->node1) -/* Functions */ +#if !SLIM +/*+ Return a segment pointer given a set of segments and an index. +*/ +#define LookupSegment(xxx,yyy,zzz) (&(xxx)->segments[yyy]) -Segments *LoadSegmentList(const char *filename); +/*+ Return a segment index given a set of segments and a pointer. +*/ +#define IndexSegment(xxx,yyy) ((yyy)-&(xxx)->segments[0]) -Segment *NextSegment(Segments* segments,Segment *segment,index_t node); +#else -distance_t Distance(double lat1,double lon1,double lat2,double lon2); +static Segment *LookupSegment(Segments *segments,index_t index,int position); -duration_t Duration(Segment *segment,Way *way,Profile *profile); +static index_t IndexSegment(Segments *segments,Segment *segment); + + +/*++++++++++++++++++++++++++++++++++++++ + Find the Segment information for a particular segment. + + Segment *LookupSegment Returns a pointer to the cached segment information. + + Segments *segments The segments structure to use. + + index_t index The index of the segment. + + int position The position in the cache to store the value. + ++++++++++++++++++++++++++++++++++++++*/ + +static inline Segment *LookupSegment(Segments *segments,index_t index,int position) +{ + SeekFile(segments->fd,sizeof(SegmentsFile)+(off_t)index*sizeof(Segment)); + + ReadFile(segments->fd,&segments->cached[position-1],sizeof(Segment)); + + segments->incache[position-1]=index; + + return(&segments->cached[position-1]); +} + + +/*++++++++++++++++++++++++++++++++++++++ + Find the segment index for a particular segment pointer. + + index_t IndexSegment Returns the index of the segment in the list. + + Segments *segments The segments structure to use. + + Segment *segment The segment whose index is to be found. + ++++++++++++++++++++++++++++++++++++++*/ + +static inline index_t IndexSegment(Segments *segments,Segment *segment) +{ + int i; + + for(i=0;icached)/sizeof(segments->cached[0]);i++) + if(&segments->cached[i]==segment) + return(segments->incache[i]); + + return(NO_SEGMENT); +} + +#endif #endif /* SEGMENTS_H */