ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/utils/StringTokenizer.cpp
Revision: 2045
Committed: Fri Nov 28 20:10:17 2014 UTC (10 years, 5 months ago) by gezelter
File size: 6915 byte(s)
Log Message:
Starting to get ready for 2.3 release.
Separating type parsers from io routines.
Fixing old samples to use newer syntax.

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 507 bool StringTokenizer::nextTokenAsBool() {
153 gezelter 246 std::string token = nextToken();
154     std::istringstream iss(token);
155     bool result;
156    
157     if (iss >> result) {
158 gezelter 507 return result;
159 gezelter 246 } else {
160 gezelter 507 std::cerr << "unable to convert " << token << " to a bool" << std::endl;
161     return false;
162 gezelter 246 }
163 gezelter 507 }
164 tim 261
165 gezelter 507 //Since libstdc++(GCC 3.2) has an i/ostream::operator>>/<<(streambuf*) bug (Bug 9318)
166     //Instead of using iostream facility, we use C library
167     int StringTokenizer::nextTokenAsInt() {
168 gezelter 246 std::string token = nextToken();
169 tim 261
170     return atoi(token.c_str());
171 gezelter 507 }
172 gezelter 246
173 gezelter 507 float StringTokenizer::nextTokenAsFloat() {
174 gezelter 246 std::string token = nextToken();
175 tim 261 convertFortranNumber(token);
176     return (float) (atof(token.c_str()));
177 gezelter 507 }
178 gezelter 246
179 tim 963 RealType StringTokenizer::nextTokenAsDouble() {
180 gezelter 246 std::string token = nextToken();
181 tim 261 convertFortranNumber(token);
182     return atof(token.c_str());
183 gezelter 507 }
184 gezelter 246
185 gezelter 507 std::string StringTokenizer::peekNextToken() {
186 gezelter 246 std::string result;
187     std::string::const_iterator tmpIter = currentPos_;
188    
189     if(tmpIter != end_) {
190 gezelter 507 std::insert_iterator<std::string> insertIter(result, result.begin());
191 gezelter 246
192 gezelter 507 while(tmpIter != end_ && isDelimiter(*tmpIter)) {
193 gezelter 246
194 gezelter 507 if (returnTokens_) {
195     *insertIter++ = *tmpIter++;
196     return result;
197     }
198 gezelter 246
199 gezelter 507 ++tmpIter;
200     }
201 gezelter 246
202 gezelter 507 while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
203     *insertIter++ = *tmpIter++;
204     }
205 gezelter 246 }
206    
207     return result;
208 gezelter 507 }
209 gezelter 246
210 gezelter 2045 std::vector<std::string> StringTokenizer::getAllTokens() {
211 tim 770 std::vector<std::string> tokens;
212     while (hasMoreTokens()) {
213 gezelter 2045 tokens.push_back(nextToken());
214 tim 770 }
215     return tokens;
216 gezelter 2045 }
217 gezelter 507 void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
218 tim 261 std::string::iterator i;
219     for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) {
220 gezelter 507 if (*i == 'd' || *i == 'D') {
221     *i = 'E';
222     }
223 tim 261 }
224 gezelter 507 }
225 tim 261
226 gezelter 2045 std::string StringTokenizer::getRemainingString() {
227     std::string result;
228     std::string::const_iterator tmpIter = currentPos_;
229     if(tmpIter != end_) {
230     std::insert_iterator<std::string> insertIter(result, result.begin());
231    
232     while (tmpIter != end_) {
233     *insertIter++ = *tmpIter++;
234     }
235     }
236    
237     return result;
238     }
239    
240    
241 gezelter 1390 }//end namespace OpenMD
242 gezelter 246

Properties

Name Value
svn:keywords Author Id Revision Date