Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/importio/NamedColumnsParser.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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
/****************************************************************************/
14
/// @file NamedColumnsParser.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Michael Behrisch
17
/// @date Fri, 19 Jul 2002
18
///
19
// A parser to retrieve information from a table with known column
20
/****************************************************************************/
21
#include <config.h>
22
23
#include <map>
24
#include <string>
25
#include <utils/common/UtilExceptions.h>
26
#include <utils/common/StringUtils.h>
27
#include "NamedColumnsParser.h"
28
29
30
// ===========================================================================
31
// method definitions
32
// ===========================================================================
33
NamedColumnsParser::NamedColumnsParser() {}
34
35
36
NamedColumnsParser::NamedColumnsParser(const std::string& def,
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
45
NamedColumnsParser::~NamedColumnsParser() {}
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) {
61
myLineParser = StringTokenizer(line, myLineDelimiter);
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) {
70
i = myDefinitionsMap.find(StringUtils::to_lower_case(name));
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) {
91
i = myDefinitionsMap.find(StringUtils::to_lower_case(name));
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
103
NamedColumnsParser::hasFullDefinition() const {
104
return (int)myDefinitionsMap.size() == myLineParser.size();
105
}
106
107
108
void
109
NamedColumnsParser::reinitMap(std::string s,
110
const std::string& delim,
111
bool prune) {
112
if (myAmCaseInsensitive) {
113
s = StringUtils::to_lower_case(s);
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
/****************************************************************************/
143
144