ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/utils/StringTokenizer.cpp
(Generate patch)

Comparing trunk/src/utils/StringTokenizer.cpp (file contents):
Revision 246 by gezelter, Wed Jan 12 22:41:40 2005 UTC vs.
Revision 2073 by gezelter, Sat Mar 7 23:52:07 2015 UTC

# Line 1 | Line 1
1 < /*
1 > /*
2   * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
# Line 6 | Line 6
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
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 + *
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, 234107 (2008).          
39 + * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 + * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43   #include <iostream>
# Line 44 | Line 45
45   #include <sstream>
46   #include "utils/StringTokenizer.hpp"
47  
48 < namespace oopse {
48 > namespace OpenMD {
49  
50  
51 < StringTokenizer::StringTokenizer(const std::string & str, const std::string & delim)
52 <                        : tokenString_(str), delim_(delim), returnTokens_(false),
53 <                          currentPos_(tokenString_.begin()), end_(tokenString_.end()){
51 >  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  
55 < }
55 >  }
56  
57 < 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()) {
57 >  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  
62 < }
62 >  }
63  
64 < 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()) {
64 >  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  
69 < }
69 >  }
70  
71 < bool StringTokenizer::isDelimiter(const char c) {
71 >  bool StringTokenizer::isDelimiter(const char c) {
72      return delim_.find(c) == std::string::npos ? false : true;
73 < }
73 >  }
74  
75 < int StringTokenizer::countTokens() {
75 >  int StringTokenizer::countTokens() {
76      
77      std::string::const_iterator tmpIter = currentPos_;    
78      int numToken = 0;
79  
80      while (true) {
81  
82 <        //skip delimiter first
83 <        while( tmpIter != end_ && isDelimiter(*tmpIter)) {
84 <            ++tmpIter;
82 >      //skip delimiter first
83 >      while( tmpIter != end_ && isDelimiter(*tmpIter)) {
84 >        ++tmpIter;
85  
86 <            if (returnTokens_) {
87 <                //if delimiter is consider as token
88 <                ++numToken;
89 <            }
90 <        }
86 >        if (returnTokens_) {
87 >          //if delimiter is consider as token
88 >          ++numToken;
89 >        }
90 >      }
91          
92 <        if (tmpIter == end_) {
93 <            break;
94 <        }
92 >      if (tmpIter == end_) {
93 >        break;
94 >      }
95          
96 <        //encount a token here
97 <        while ( tmpIter != end_ && !isDelimiter(*tmpIter) ) {
98 <            ++tmpIter;
99 <        }
96 >      //encount a token here
97 >      while ( tmpIter != end_ && !isDelimiter(*tmpIter) ) {
98 >        ++tmpIter;
99 >      }
100  
101 <        ++numToken;
101 >      ++numToken;
102  
103      }
104  
105      return numToken;
106 < }
106 >  }
107  
108 < bool StringTokenizer::hasMoreTokens() {
108 >  bool StringTokenizer::hasMoreTokens() {
109      
110      if (currentPos_ == end_) {
111 <        return false;
111 >      return false;
112      } else if (returnTokens_) {
113 <        return true;
113 >      return true;
114      } else {
115 <        std::string::const_iterator i = currentPos_;
115 >      std::string::const_iterator i = currentPos_;
116  
117 <        //walk through the remaining string to check whether it contains non-delimeter or not
118 <        while(i != end_ && isDelimiter(*i)) {
119 <            ++i;
120 <        }
117 >      //walk through the remaining string to check whether it contains
118 >      //non-delimeter or not
119 >      while(i != end_ && isDelimiter(*i)) {
120 >        ++i;
121 >      }
122  
123 <         return i != end_ ? true : false;
123 >      return i != end_ ? true : false;
124      }
125 < }
125 >  }
126  
127 < std::string StringTokenizer::nextToken() {
127 >  std::string StringTokenizer::nextToken() {
128      std::string result;
129      
130      if(currentPos_ != end_) {
131 <        std::insert_iterator<std::string> insertIter(result, result.begin());
131 >      std::insert_iterator<std::string> insertIter(result, result.begin());
132  
133 <        while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
133 >      while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
134  
135 <            if (returnTokens_) {
136 <                *insertIter++ = *currentPos_++;
137 <                return result;
138 <            }
135 >        if (returnTokens_) {
136 >          *insertIter++ = *currentPos_++;
137 >          return result;
138 >        }
139              
140 <            ++currentPos_;
141 <        }
140 >        ++currentPos_;
141 >      }
142  
143 <        while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
144 <            *insertIter++ = *currentPos_++;
145 <        }
143 >      while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
144 >        *insertIter++ = *currentPos_++;
145 >      }
146          
147      }
148      
149      return result;
150 < }
150 >  }
151  
152 < bool StringTokenizer::nextTokenAsBool() {
153 <    std::string token = nextToken();
154 <    std::istringstream iss(token);
155 <    bool result;
156 <    
157 <    if (iss >> result) {
158 <        return result;
159 <    } else {
160 <        std::cerr << "unable to convert " << token << " to a bool" << std::endl;
161 <        return false;
152 >  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 < }
169 >  }
170  
171 < int StringTokenizer::nextTokenAsInt() {
171 >  bool StringTokenizer::nextTokenAsBool() {
172      std::string token = nextToken();
173      std::istringstream iss(token);
174 <    int result;
174 >    bool result;
175      
176      if (iss >> result) {
177 <        return result;
177 >      return result;
178      } else {
179 <        std::cerr << "unable to convert " << token << " to an integer" << std::endl;
180 <        return 0;
179 >      std::cerr << "unable to convert " << token << " to a bool" << std::endl;
180 >      return false;
181      }
182 < }
182 >  }
183 >
184 >  //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 >    std::string token = nextToken();
188 >  
189 >    return atoi(token.c_str());
190 >  }
191  
192 < float StringTokenizer::nextTokenAsFloat() {
192 >  float StringTokenizer::nextTokenAsFloat() {
193      std::string token = nextToken();
194 <    std::istringstream iss(token);
195 <    float result;
196 <    
181 <    if (iss >> result) {
182 <        return result;
183 <    } else {
184 <        std::cerr << "unable to convert " << token << " to a float" << std::endl;
185 <        return 0.0;
186 <    }
187 < }
194 >    convertFortranNumber(token);
195 >    return (float) (atof(token.c_str()));
196 >  }
197  
198 < double StringTokenizer::nextTokenAsDouble() {
198 >  RealType StringTokenizer::nextTokenAsDouble() {
199      std::string token = nextToken();
200 <    std::istringstream iss(token);
201 <    double result;
202 <    
194 <    if (iss >> result) {
195 <        return result;
196 <    } else {
197 <        std::cerr << "unable to convert " << token << " to a double" << std::endl;
198 <        return 0.0;
199 <    }
200 < }
200 >    convertFortranNumber(token);
201 >    return atof(token.c_str());
202 >  }
203  
204 < std::string  StringTokenizer::peekNextToken() {
204 >  std::string  StringTokenizer::peekNextToken() {
205      std::string result;
206      std::string::const_iterator tmpIter = currentPos_;
207      
208      if(tmpIter != end_) {
209 <        std::insert_iterator<std::string> insertIter(result, result.begin());
209 >      std::insert_iterator<std::string> insertIter(result, result.begin());
210  
211 <        while(tmpIter != end_ && isDelimiter(*tmpIter)) {
211 >      while(tmpIter != end_ && isDelimiter(*tmpIter)) {
212  
213 <            if (returnTokens_) {
214 <                *insertIter++ = *tmpIter++;
215 <                return result;
216 <            }
213 >        if (returnTokens_) {
214 >          *insertIter++ = *tmpIter++;
215 >          return result;
216 >        }
217              
218 <            ++tmpIter;
219 <        }
218 >        ++tmpIter;
219 >      }
220  
221 <        while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
222 <            *insertIter++ = *tmpIter++;
223 <        }
221 >      while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
222 >        *insertIter++ = *tmpIter++;
223 >      }
224      }
225      
226      return result;    
227 < }
227 >  }
228  
229 < }//end namespace oopse
229 >  std::vector<std::string>  StringTokenizer::getAllTokens() {
230 >    std::vector<std::string> tokens;
231 >    while (hasMoreTokens()) {
232 >      tokens.push_back(nextToken());
233 >    }
234 >    return tokens;
235 >  }
236 >  void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
237 >    std::string::iterator i;
238 >    for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) {
239 >      if (*i == 'd' || *i == 'D') {
240 >        *i = 'E';
241 >      }
242 >    }
243 >  }
244  
245 +  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 + }//end namespace OpenMD
261 +

Comparing trunk/src/utils/StringTokenizer.cpp (property svn:keywords):
Revision 246 by gezelter, Wed Jan 12 22:41:40 2005 UTC vs.
Revision 2073 by gezelter, Sat Mar 7 23:52:07 2015 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines