X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fnodesx.h;h=35908af745701f8c12ff35c21adc588b0a7f23ee;hb=a5b34ad069a52ff6cf981f01667d102292988811;hp=2dc40a45db595081d3b1943b7a87af8bd0deb13a;hpb=20283c6cf5c6951cc1f2787492c67a7fb72aee9a;p=routino diff --git a/src/nodesx.h b/src/nodesx.h index 2dc40a4..35908af 100644 --- a/src/nodesx.h +++ b/src/nodesx.h @@ -1,5 +1,5 @@ /*************************************** - $Header: /home/amb/routino/src/RCS/nodesx.h,v 1.23 2010/03/19 19:47:09 amb Exp $ + $Header: /home/amb/routino/src/RCS/nodesx.h,v 1.30 2010/08/02 18:44:54 amb Exp $ A header file for the extended nodes. @@ -27,8 +27,12 @@ #include -#include "typesx.h" #include "types.h" +#include "nodes.h" + +#include "typesx.h" + +#include "files.h" /* Data structures */ @@ -41,6 +45,8 @@ struct _NodeX latlong_t latitude; /*+ The node latitude. +*/ latlong_t longitude; /*+ The node longitude. +*/ + + allow_t allow; /*+ The node allowed traffic. +*/ }; /*+ A structure containing a set of nodes (memory format). +*/ @@ -49,26 +55,44 @@ struct _NodesX 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 NodeX *xdata; /*+ The extended node data (sorted). +*/ - NodeX cached[2]; /*+ Two cached nodes read from the file in slim mode. +*/ - uint32_t number; /*+ How many entries are still useful? +*/ +#else + + NodeX xcached[2]; /*+ Two cached nodes read from the file in slim mode. +*/ + +#endif + + index_t number; /*+ How many entries are still useful? +*/ node_t *idata; /*+ The extended node IDs (sorted by ID). +*/ uint8_t *super; /*+ A marker for super nodes (same order sorted nodes). +*/ +#if !SLIM + Node *ndata; /*+ The actual nodes (same order as geographically sorted nodes). +*/ - uint32_t latbins; /*+ The number of bins containing latitude. +*/ - uint32_t lonbins; /*+ The number of bins containing longitude. +*/ +#else + + char *nfilename; /*+ The name of the temporary file for nodes in slim mode. +*/ + int nfd; /*+ The file descriptor of the temporary file. +*/ + + Node ncached[2]; /*+ Two cached nodes read from the file in slim mode. +*/ + +#endif + + index_t latbins; /*+ The number of bins containing latitude. +*/ + index_t lonbins; /*+ The number of bins containing longitude. +*/ ll_bin_t latzero; /*+ The bin number of the furthest south bin. +*/ ll_bin_t lonzero; /*+ The bin number of the furthest west bin. +*/ - uint32_t latlonbin; /*+ A temporary index into the offsets array. +*/ + index_t latlonbin; /*+ A temporary index into the offsets array. +*/ index_t *offsets; /*+ An array of offset to the first node in each bin. +*/ }; @@ -82,9 +106,8 @@ void FreeNodeList(NodesX *nodesx,int keep); void SaveNodeList(NodesX *nodesx,const char *filename); index_t IndexNodeX(NodesX* nodesx,node_t id); -NodeX *LookupNodeX(NodesX* nodesx,index_t index,int position); -void AppendNode(NodesX* nodesx,node_t id,double latitude,double longitude); +void AppendNode(NodesX* nodesx,node_t id,double latitude,double longitude,allow_t allow); void SortNodeList(NodesX *nodesx); @@ -97,4 +120,85 @@ void CreateRealNodes(NodesX *nodesx,int iteration); void IndexNodes(NodesX *nodesx,SegmentsX *segmentsx); +/* Macros / inline functions */ + +#if !SLIM + +#define LookupNodeX(nodesx,index,position) &(nodesx)->xdata[index] + +#define LookupNodeXNode(nodesx,index,position) &(nodesx)->ndata[index] + +#else + +static NodeX *LookupNodeX(NodesX* nodesx,index_t index,int position); + +static Node *LookupNodeXNode(NodesX* nodesx,index_t index,int position); + +static void PutBackNodeXNode(NodesX* nodesx,index_t index,int position); + + +/*++++++++++++++++++++++++++++++++++++++ + Lookup a particular extended node. + + NodeX *LookupNodeX Returns a pointer to the extended node with the specified id. + + NodesX* nodesx The set of nodes to process. + + index_t index The node index to look for. + + int position The position in the cache to use. + ++++++++++++++++++++++++++++++++++++++*/ + +static inline NodeX *LookupNodeX(NodesX* nodesx,index_t index,int position) +{ + SeekFile(nodesx->fd,(off_t)index*sizeof(NodeX)); + + ReadFile(nodesx->fd,&nodesx->xcached[position-1],sizeof(NodeX)); + + return(&nodesx->xcached[position-1]); +} + + +/*++++++++++++++++++++++++++++++++++++++ + Lookup a particular extended node's normal node. + + Node *LookupNodeXNode Returns a pointer to the node with the specified id. + + NodesX* nodesx The set of nodes to process. + + index_t index The node index to look for. + + int position The position in the cache to use. + ++++++++++++++++++++++++++++++++++++++*/ + +static inline Node *LookupNodeXNode(NodesX* nodesx,index_t index,int position) +{ + SeekFile(nodesx->nfd,(off_t)index*sizeof(Node)); + + ReadFile(nodesx->nfd,&nodesx->ncached[position-1],sizeof(Node)); + + return(&nodesx->ncached[position-1]); +} + + +/*++++++++++++++++++++++++++++++++++++++ + Put back an extended node's normal node. + + NodesX* nodesx The set of nodes to process. + + index_t index The node index to look for. + + int position The position in the cache to use. + ++++++++++++++++++++++++++++++++++++++*/ + +static inline void PutBackNodeXNode(NodesX* nodesx,index_t index,int position) +{ + SeekFile(nodesx->nfd,(off_t)index*sizeof(Node)); + + WriteFile(nodesx->nfd,&nodesx->ncached[position-1],sizeof(Node)); +} + +#endif /* SLIM */ + + #endif /* NODESX_H */