ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/utils/StringTokenizer.cpp
Revision: 1782
Committed: Wed Aug 22 02:28:28 2012 UTC (12 years, 8 months ago) by gezelter
File size: 6562 byte(s)
Log Message:
MERGE OpenMD development branch 1465:1781 into trunk

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     * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (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 507 }
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 507 }
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 507 }
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 507 //walk through the remaining string to check whether it contains non-delimeter or not
118     while(i != end_ && isDelimiter(*i)) {
119     ++i;
120     }
121 gezelter 246
122 gezelter 507 return i != end_ ? true : false;
123 gezelter 246 }
124 gezelter 507 }
125 gezelter 246
126 gezelter 507 std::string StringTokenizer::nextToken() {
127 gezelter 246 std::string result;
128    
129     if(currentPos_ != end_) {
130 gezelter 507 std::insert_iterator<std::string> insertIter(result, result.begin());
131 gezelter 246
132 gezelter 507 while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
133 gezelter 246
134 gezelter 507 if (returnTokens_) {
135     *insertIter++ = *currentPos_++;
136     return result;
137     }
138 gezelter 246
139 gezelter 507 ++currentPos_;
140     }
141 gezelter 246
142 gezelter 507 while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
143     *insertIter++ = *currentPos_++;
144     }
145 gezelter 246
146     }
147    
148     return result;
149 gezelter 507 }
150 gezelter 246
151 gezelter 507 bool StringTokenizer::nextTokenAsBool() {
152 gezelter 246 std::string token = nextToken();
153     std::istringstream iss(token);
154     bool result;
155    
156     if (iss >> result) {
157 gezelter 507 return result;
158 gezelter 246 } else {
159 gezelter 507 std::cerr << "unable to convert " << token << " to a bool" << std::endl;
160     return false;
161 gezelter 246 }
162 gezelter 507 }
163 tim 261
164 gezelter 507 //Since libstdc++(GCC 3.2) has an i/ostream::operator>>/<<(streambuf*) bug (Bug 9318)
165     //Instead of using iostream facility, we use C library
166     int StringTokenizer::nextTokenAsInt() {
167 gezelter 246 std::string token = nextToken();
168 tim 261
169     return atoi(token.c_str());
170 gezelter 507 }
171 gezelter 246
172 gezelter 507 float StringTokenizer::nextTokenAsFloat() {
173 gezelter 246 std::string token = nextToken();
174 tim 261 convertFortranNumber(token);
175     return (float) (atof(token.c_str()));
176 gezelter 507 }
177 gezelter 246
178 tim 963 RealType StringTokenizer::nextTokenAsDouble() {
179 gezelter 246 std::string token = nextToken();
180 tim 261 convertFortranNumber(token);
181     return atof(token.c_str());
182 gezelter 507 }
183 gezelter 246
184 gezelter 507 std::string StringTokenizer::peekNextToken() {
185 gezelter 246 std::string result;
186     std::string::const_iterator tmpIter = currentPos_;
187    
188     if(tmpIter != end_) {
189 gezelter 507 std::insert_iterator<std::string> insertIter(result, result.begin());
190 gezelter 246
191 gezelter 507 while(tmpIter != end_ && isDelimiter(*tmpIter)) {
192 gezelter 246
193 gezelter 507 if (returnTokens_) {
194     *insertIter++ = *tmpIter++;
195     return result;
196     }
197 gezelter 246
198 gezelter 507 ++tmpIter;
199     }
200 gezelter 246
201 gezelter 507 while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
202     *insertIter++ = *tmpIter++;
203     }
204 gezelter 246 }
205    
206     return result;
207 gezelter 507 }
208 gezelter 246
209 tim 770 std::vector<std::string> StringTokenizer::getAllTokens() {
210     std::vector<std::string> tokens;
211     while (hasMoreTokens()) {
212     tokens.push_back(nextToken());
213     }
214     return tokens;
215     }
216 gezelter 507 void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
217 tim 261 std::string::iterator i;
218     for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) {
219 gezelter 507 if (*i == 'd' || *i == 'D') {
220     *i = 'E';
221     }
222 tim 261 }
223 gezelter 507 }
224 tim 261
225 gezelter 1390 }//end namespace OpenMD
226 gezelter 246

Properties

Name Value
svn:keywords Author Id Revision Date