ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/utils/StringTokenizer.cpp
Revision: 2073
Committed: Sat Mar 7 23:52:07 2015 UTC (10 years, 1 month ago) by gezelter
File size: 7252 byte(s)
Log Message:
added a skipToken function to StringTokenizer, and used this to 
remove some silly warnings on compilation. 

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 246 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
36     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38 gezelter 1879 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
39 gezelter 1782 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42    
43     #include <iostream>
44     #include <iterator>
45     #include <sstream>
46     #include "utils/StringTokenizer.hpp"
47    
48 gezelter 1390 namespace OpenMD {
49 gezelter 246
50    
51 gezelter 507 StringTokenizer::StringTokenizer(const std::string & str, const std::string & delim)
52     : tokenString_(str), delim_(delim), returnTokens_(false),
53     currentPos_(tokenString_.begin()), end_(tokenString_.end()){
54 gezelter 246
55 gezelter 2045 }
56 gezelter 246
57 gezelter 507 StringTokenizer::StringTokenizer(std::string::const_iterator& first, std::string::const_iterator& last,
58     const std::string & delim)
59     : tokenString_(first, last) , delim_(delim), returnTokens_(false),
60     currentPos_(tokenString_.begin()), end_(tokenString_.end()) {
61 gezelter 246
62 gezelter 2045 }
63 gezelter 246
64 gezelter 507 StringTokenizer::StringTokenizer(const std::string&str, const std::string&delim,
65     bool returnTokens)
66     : tokenString_(str), delim_(delim), returnTokens_(returnTokens),
67     currentPos_(tokenString_.begin()), end_(tokenString_.end()) {
68 gezelter 246
69 gezelter 2045 }
70 gezelter 246
71 gezelter 507 bool StringTokenizer::isDelimiter(const char c) {
72 gezelter 246 return delim_.find(c) == std::string::npos ? false : true;
73 gezelter 507 }
74 gezelter 246
75 gezelter 507 int StringTokenizer::countTokens() {
76 gezelter 246
77     std::string::const_iterator tmpIter = currentPos_;
78     int numToken = 0;
79    
80     while (true) {
81    
82 gezelter 507 //skip delimiter first
83     while( tmpIter != end_ && isDelimiter(*tmpIter)) {
84     ++tmpIter;
85 gezelter 246
86 gezelter 507 if (returnTokens_) {
87     //if delimiter is consider as token
88     ++numToken;
89     }
90     }
91 gezelter 246
92 gezelter 507 if (tmpIter == end_) {
93     break;
94     }
95 gezelter 246
96 gezelter 507 //encount a token here
97     while ( tmpIter != end_ && !isDelimiter(*tmpIter) ) {
98     ++tmpIter;
99     }
100 gezelter 246
101 gezelter 507 ++numToken;
102 gezelter 246
103     }
104    
105     return numToken;
106 gezelter 507 }
107 gezelter 246
108 gezelter 507 bool StringTokenizer::hasMoreTokens() {
109 gezelter 246
110     if (currentPos_ == end_) {
111 gezelter 507 return false;
112 gezelter 246 } else if (returnTokens_) {
113 gezelter 507 return true;
114 gezelter 246 } else {
115 gezelter 507 std::string::const_iterator i = currentPos_;
116 gezelter 246
117 gezelter 2045 //walk through the remaining string to check whether it contains
118     //non-delimeter or not
119 gezelter 507 while(i != end_ && isDelimiter(*i)) {
120     ++i;
121     }
122 gezelter 246
123 gezelter 507 return i != end_ ? true : false;
124 gezelter 246 }
125 gezelter 507 }
126 gezelter 246
127 gezelter 507 std::string StringTokenizer::nextToken() {
128 gezelter 246 std::string result;
129    
130     if(currentPos_ != end_) {
131 gezelter 507 std::insert_iterator<std::string> insertIter(result, result.begin());
132 gezelter 246
133 gezelter 507 while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
134 gezelter 246
135 gezelter 507 if (returnTokens_) {
136     *insertIter++ = *currentPos_++;
137     return result;
138     }
139 gezelter 246
140 gezelter 507 ++currentPos_;
141     }
142 gezelter 246
143 gezelter 507 while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
144     *insertIter++ = *currentPos_++;
145     }
146 gezelter 246
147     }
148    
149     return result;
150 gezelter 507 }
151 gezelter 246
152 gezelter 2073 void StringTokenizer::skipToken() {
153    
154     if(currentPos_ != end_) {
155     while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
156    
157     if (returnTokens_) {
158     *currentPos_++;
159     return;
160     }
161    
162     ++currentPos_;
163     }
164    
165     while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
166     *currentPos_++;
167     }
168     }
169     }
170    
171 gezelter 507 bool StringTokenizer::nextTokenAsBool() {
172 gezelter 246 std::string token = nextToken();
173     std::istringstream iss(token);
174     bool result;
175    
176     if (iss >> result) {
177 gezelter 507 return result;
178 gezelter 246 } else {
179 gezelter 507 std::cerr << "unable to convert " << token << " to a bool" << std::endl;
180     return false;
181 gezelter 246 }
182 gezelter 507 }
183 tim 261
184 gezelter 507 //Since libstdc++(GCC 3.2) has an i/ostream::operator>>/<<(streambuf*) bug (Bug 9318)
185     //Instead of using iostream facility, we use C library
186     int StringTokenizer::nextTokenAsInt() {
187 gezelter 246 std::string token = nextToken();
188 tim 261
189     return atoi(token.c_str());
190 gezelter 507 }
191 gezelter 246
192 gezelter 507 float StringTokenizer::nextTokenAsFloat() {
193 gezelter 246 std::string token = nextToken();
194 tim 261 convertFortranNumber(token);
195     return (float) (atof(token.c_str()));
196 gezelter 507 }
197 gezelter 246
198 tim 963 RealType StringTokenizer::nextTokenAsDouble() {
199 gezelter 246 std::string token = nextToken();
200 tim 261 convertFortranNumber(token);
201     return atof(token.c_str());
202 gezelter 507 }
203 gezelter 246
204 gezelter 507 std::string StringTokenizer::peekNextToken() {
205 gezelter 246 std::string result;
206     std::string::const_iterator tmpIter = currentPos_;
207    
208     if(tmpIter != end_) {
209 gezelter 507 std::insert_iterator<std::string> insertIter(result, result.begin());
210 gezelter 246
211 gezelter 507 while(tmpIter != end_ && isDelimiter(*tmpIter)) {
212 gezelter 246
213 gezelter 507 if (returnTokens_) {
214     *insertIter++ = *tmpIter++;
215     return result;
216     }
217 gezelter 246
218 gezelter 507 ++tmpIter;
219     }
220 gezelter 246
221 gezelter 507 while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
222     *insertIter++ = *tmpIter++;
223     }
224 gezelter 246 }
225    
226     return result;
227 gezelter 507 }
228 gezelter 246
229 gezelter 2045 std::vector<std::string> StringTokenizer::getAllTokens() {
230 tim 770 std::vector<std::string> tokens;
231     while (hasMoreTokens()) {
232 gezelter 2045 tokens.push_back(nextToken());
233 tim 770 }
234     return tokens;
235 gezelter 2045 }
236 gezelter 507 void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
237 tim 261 std::string::iterator i;
238     for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) {
239 gezelter 507 if (*i == 'd' || *i == 'D') {
240     *i = 'E';
241     }
242 tim 261 }
243 gezelter 507 }
244 tim 261
245 gezelter 2045 std::string StringTokenizer::getRemainingString() {
246     std::string result;
247     std::string::const_iterator tmpIter = currentPos_;
248     if(tmpIter != end_) {
249     std::insert_iterator<std::string> insertIter(result, result.begin());
250    
251     while (tmpIter != end_) {
252     *insertIter++ = *tmpIter++;
253     }
254     }
255    
256     return result;
257     }
258    
259    
260 gezelter 1390 }//end namespace OpenMD
261 gezelter 246

Properties

Name Value
svn:keywords Author Id Revision Date