Imported Upstream version 1.5
[routino] / src / nodesx.h
index 2dc40a4..35908af 100644 (file)
@@ -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.
 
 
 #include <stdint.h>
 
-#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 */