Eclipse SUMO - Simulation of Urban MObility
NamedColumnsParser.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 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 /****************************************************************************/
19 // A parser to retrieve information from a table with known column
20 /****************************************************************************/
21 #include <config.h>
22 
23 #include <map>
24 #include <string>
27 #include "NamedColumnsParser.h"
28 
29 
30 // ===========================================================================
31 // method definitions
32 // ===========================================================================
34 
35 
37  const std::string& defDelim,
38  const std::string& lineDelim,
39  bool prune, bool ignoreCase)
40  : myLineDelimiter(lineDelim), myAmCaseInsensitive(ignoreCase) {
41  reinitMap(def, defDelim, prune);
42 }
43 
44 
46 
47 
48 void
49 NamedColumnsParser::reinit(const std::string& def,
50  const std::string& defDelim,
51  const std::string& lineDelim,
52  bool prune, bool ignoreCase) {
53  myAmCaseInsensitive = ignoreCase;
54  reinitMap(def, defDelim, prune);
55  myLineDelimiter = lineDelim;
56 }
57 
58 
59 void
60 NamedColumnsParser::parseLine(const std::string& line) {
62 }
63 
64 
65 std::string
66 NamedColumnsParser::get(const std::string& name, bool prune) const {
67  PosMap::const_iterator i = myDefinitionsMap.find(name);
68  if (i == myDefinitionsMap.end()) {
69  if (myAmCaseInsensitive) {
71  }
72  if (i == myDefinitionsMap.end()) {
73  throw UnknownElement("Element '" + name + "' is missing");
74  }
75  }
76  int pos = (*i).second;
77  if (myLineParser.size() <= pos) {
78  throw OutOfBoundsException();
79  }
80  std::string ret = myLineParser.get(pos);
81  checkPrune(ret, prune);
82  return ret;
83 }
84 
85 
86 bool
87 NamedColumnsParser::know(const std::string& name) const {
88  PosMap::const_iterator i = myDefinitionsMap.find(name);
89  if (i == myDefinitionsMap.end()) {
90  if (myAmCaseInsensitive) {
92  }
93  }
94  if (i == myDefinitionsMap.end()) {
95  return false;
96  }
97  int pos = (*i).second;
98  return myLineParser.size() > pos;
99 }
100 
101 
102 bool
104  return (int)myDefinitionsMap.size() == myLineParser.size();
105 }
106 
107 
108 void
110  const std::string& delim,
111  bool prune) {
112  if (myAmCaseInsensitive) {
114  }
115  myDefinitionsMap.clear();
116  int pos = 0;
117  StringTokenizer st(s, delim);
118  while (st.hasNext()) {
119  std::string next = st.next();
120  checkPrune(next, prune);
121  myDefinitionsMap.insert(std::map<std::string, int>::value_type(next, pos++));
122  }
123 }
124 
125 
126 void
127 NamedColumnsParser::checkPrune(std::string& str, bool prune) const {
128  if (!prune) {
129  return;
130  }
131  std::string::size_type idx = str.find_first_not_of(" ");
132  if (idx != std::string::npos) {
133  str = str.substr(idx);
134  }
135  idx = str.find_last_not_of(" ");
136  if (idx != std::string::npos && idx != str.length() - 1) {
137  str = str.substr(0, idx + 1);
138  }
139 }
140 
141 
142 /****************************************************************************/
bool hasFullDefinition() const
Returns whether the number of named columns matches the actual number.
void reinit(const std::string &def, const std::string &defDelim=";", const std::string &lineDelim=";", bool chomp=false, bool ignoreCase=true)
Reinitialises the parser.
bool know(const std::string &name) const
Returns the information whether the named column is known.
void parseLine(const std::string &line)
Parses the contents of the line.
void reinitMap(std::string def, const std::string &delim=";", bool chomp=false)
Rebuilds the map of attribute names to their positions in a table.
PosMap myDefinitionsMap
The map of column item names to their positions within the table.
std::string myLineDelimiter
The delimiter to split the column items on.
bool myAmCaseInsensitive
Information whether case insensitive match shall be done.
std::string get(const std::string &name, bool prune=false) const
Returns the named information.
NamedColumnsParser()
Constructor.
StringTokenizer myLineParser
The contents of the current line.
~NamedColumnsParser()
Destructor.
void checkPrune(std::string &str, bool prune) const
Prunes the given string if it shall be done.
int size() const
returns the number of existing substrings
std::string get(int pos) const
returns the item at the given position
bool hasNext()
returns the information whether further substrings exist
std::string next()
returns the next substring when it exists. Otherwise the behaviour is undefined
static std::string to_lower_case(const std::string &str)
Transfers the content to lower case.
Definition: StringUtils.cpp:77