Eclipse SUMO - Simulation of Urban MObility
FileHelpers.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // Functions for an easier usage of files
21 /****************************************************************************/
22 #pragma once
23 #include <config.h>
24 #include <cassert>
25 #include <fstream>
26 #include <string>
27 #include <vector>
28 #include "SUMOTime.h"
29 
30 
31 // ===========================================================================
32 // class definitions
33 // ===========================================================================
38 class FileHelpers {
39 public:
42 
48  static bool isReadable(std::string path);
49 
55  static bool isDirectory(std::string path);
57 
60 
66  static std::string getFilePath(const std::string& path);
67 
74  static std::string addExtension(const std::string& path, const std::string& extension);
75 
88  static std::string getConfigurationRelative(const std::string& configPath, const std::string& path);
89 
98  static bool isSocket(const std::string& name);
99 
110  static bool isAbsolute(const std::string& path);
111 
123  static std::string checkForRelativity(const std::string& filename, const std::string& basePath);
124 
126  static std::string prependToLastPathComponent(const std::string& prefix, const std::string& path);
127 
129 
132 
139  static std::ostream& writeInt(std::ostream& strm, int value);
140 
149  static std::ostream& writeFloat(std::ostream& strm, double value);
150 
157  static std::ostream& writeByte(std::ostream& strm, unsigned char value);
158 
169  static std::ostream& writeString(std::ostream& strm, const std::string& value);
170 
180  static std::ostream& writeTime(std::ostream& strm, SUMOTime value);
181 
188  template <typename E>
189  static std::ostream& writeEdgeVector(std::ostream& os, const std::vector<E>& edges);
190 
197  template <typename E>
198  static void readEdgeVector(std::istream& in, std::vector<const E*>& edges, const std::string& rid);
200 };
201 
202 
203 template <typename E>
204 std::ostream& FileHelpers::writeEdgeVector(std::ostream& os, const std::vector<E>& edges) {
205  FileHelpers::writeInt(os, (int)edges.size());
206  std::vector<int> follow;
207  int maxFollow = 0;
208  E prev = edges.front();
209  for (typename std::vector<E>::const_iterator i = edges.begin() + 1; i != edges.end(); ++i) {
210  int idx = 0;
211  for (; idx < prev->getNumSuccessors(); ++idx) {
212  if (idx > 15) {
213  break;
214  }
215  if (prev->getSuccessors()[idx] == (*i)) {
216  follow.push_back(idx);
217  if (idx > maxFollow) {
218  maxFollow = idx;
219  }
220  break;
221  }
222  }
223  if (idx > 15 || idx == prev->getNumSuccessors()) {
224  follow.clear();
225  break;
226  }
227  prev = *i;
228  }
229  if (follow.empty()) {
230  for (typename std::vector<E>::const_iterator i = edges.begin(); i != edges.end(); ++i) {
231  FileHelpers::writeInt(os, (*i)->getNumericalID());
232  }
233  } else {
234  const int bits = maxFollow > 3 ? 4 : 2;
235  const int numFields = 8 * sizeof(int) / bits;
236  FileHelpers::writeInt(os, -bits);
237  FileHelpers::writeInt(os, edges.front()->getNumericalID());
238  int data = 0;
239  int field = 0;
240  for (std::vector<int>::const_iterator i = follow.begin(); i != follow.end(); ++i) {
241  data |= *i;
242  field++;
243  if (field == numFields) {
244  FileHelpers::writeInt(os, data);
245  data = 0;
246  field = 0;
247  } else {
248  data <<= bits;
249  }
250  }
251  if (field > 0) {
252  FileHelpers::writeInt(os, data << ((numFields - field - 1) * bits));
253  }
254  }
255  return os;
256 }
257 
258 
259 template <typename E>
260 void FileHelpers::readEdgeVector(std::istream& in, std::vector<const E*>& edges, const std::string& rid) {
261  int size;
262  in.read((char*) &size, sizeof(int));
263  edges.reserve(size);
264  int bitsOrEntry;
265  in.read((char*) &bitsOrEntry, sizeof(int));
266  if (bitsOrEntry < 0) {
267  const int bits = -bitsOrEntry;
268  const int numFields = 8 * sizeof(int) / bits;
269  const int mask = (1 << bits) - 1;
270  int edgeID;
271  in.read((char*) &edgeID, sizeof(int));
272  const E* prev = E::getAllEdges()[edgeID];
273  assert(prev != 0);
274  edges.push_back(prev);
275  size--;
276  int data = 0;
277  int field = numFields;
278  for (; size > 0; size--) {
279  if (field == numFields) {
280  in.read((char*) &data, sizeof(int));
281  field = 0;
282  }
283  int followIndex = (data >> ((numFields - field - 1) * bits)) & mask;
284  if (followIndex >= prev->getNumSuccessors()) {
285  throw ProcessError("Invalid follower index in route '" + rid + "'!");
286  }
287  prev = prev->getSuccessors()[followIndex];
288  edges.push_back(prev);
289  field++;
290  }
291  } else {
292  while (size > 0) {
293  const E* edge = E::getAllEdges()[bitsOrEntry];
294  if (edge == 0) {
295  throw ProcessError("An edge within the route '" + rid + "' is not known!");
296  }
297  edges.push_back(edge);
298  size--;
299  if (size > 0) {
300  in.read((char*) &bitsOrEntry, sizeof(int));
301  }
302  }
303  }
304 }
long long int SUMOTime
Definition: SUMOTime.h:32
Functions for an easier usage of files and paths.
Definition: FileHelpers.h:38
static bool isAbsolute(const std::string &path)
Returns the information whether the given path is absolute.
static std::ostream & writeFloat(std::ostream &strm, double value)
Writes a float binary.
static std::string getConfigurationRelative(const std::string &configPath, const std::string &path)
Returns the second path as a relative path to the first file.
static void readEdgeVector(std::istream &in, std::vector< const E * > &edges, const std::string &rid)
Reads an edge vector binary.
Definition: FileHelpers.h:260
static std::string checkForRelativity(const std::string &filename, const std::string &basePath)
Returns the path from a configuration so that it is accessable from the current working directory.
static std::string addExtension(const std::string &path, const std::string &extension)
Add an extension to the given file path.
Definition: FileHelpers.cpp:91
static std::ostream & writeString(std::ostream &strm, const std::string &value)
Writes a string binary.
static bool isReadable(std::string path)
Checks whether the given file is readable.
Definition: FileHelpers.cpp:49
static std::string getFilePath(const std::string &path)
Removes the file information from the given path.
Definition: FileHelpers.cpp:81
static std::ostream & writeTime(std::ostream &strm, SUMOTime value)
Writes a time description binary.
static std::ostream & writeInt(std::ostream &strm, int value)
Writes an integer binary.
static std::ostream & writeEdgeVector(std::ostream &os, const std::vector< E > &edges)
Writes an edge vector binary.
Definition: FileHelpers.h:204
static bool isSocket(const std::string &name)
Returns the information whether the given name represents a socket.
static bool isDirectory(std::string path)
Checks whether the given file is a directory.
Definition: FileHelpers.cpp:63
static std::ostream & writeByte(std::ostream &strm, unsigned char value)
Writes a byte binary.
static std::string prependToLastPathComponent(const std::string &prefix, const std::string &path)
prepend the given prefix to the last path component of the given file path