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 261 by tim, Fri Jan 14 16:49:46 2005 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 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 non-delimeter or not
118 >      while(i != end_ && isDelimiter(*i)) {
119 >        ++i;
120 >      }
121  
122 <         return i != end_ ? true : false;
122 >      return i != end_ ? true : false;
123      }
124 < }
124 >  }
125  
126 < std::string StringTokenizer::nextToken() {
126 >  std::string StringTokenizer::nextToken() {
127      std::string result;
128      
129      if(currentPos_ != end_) {
130 <        std::insert_iterator<std::string> insertIter(result, result.begin());
130 >      std::insert_iterator<std::string> insertIter(result, result.begin());
131  
132 <        while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
132 >      while( currentPos_ != end_ && isDelimiter(*currentPos_)) {
133  
134 <            if (returnTokens_) {
135 <                *insertIter++ = *currentPos_++;
136 <                return result;
137 <            }
134 >        if (returnTokens_) {
135 >          *insertIter++ = *currentPos_++;
136 >          return result;
137 >        }
138              
139 <            ++currentPos_;
140 <        }
139 >        ++currentPos_;
140 >      }
141  
142 <        while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
143 <            *insertIter++ = *currentPos_++;
144 <        }
142 >      while (currentPos_ != end_ && !isDelimiter(*currentPos_)) {
143 >        *insertIter++ = *currentPos_++;
144 >      }
145          
146      }
147      
148      return result;
149 < }
149 >  }
150  
151 < bool StringTokenizer::nextTokenAsBool() {
151 >  bool StringTokenizer::nextTokenAsBool() {
152      std::string token = nextToken();
153      std::istringstream iss(token);
154      bool result;
155      
156      if (iss >> result) {
157 <        return result;
157 >      return result;
158      } else {
159 <        std::cerr << "unable to convert " << token << " to a bool" << std::endl;
160 <        return false;
159 >      std::cerr << "unable to convert " << token << " to a bool" << std::endl;
160 >      return false;
161      }
162 < }
162 >  }
163  
164 < //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() {
164 >  //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      std::string token = nextToken();
168    
169      return atoi(token.c_str());
170 < }
170 >  }
171  
172 < float StringTokenizer::nextTokenAsFloat() {
172 >  float StringTokenizer::nextTokenAsFloat() {
173      std::string token = nextToken();
174      convertFortranNumber(token);
175      return (float) (atof(token.c_str()));
176 < }
176 >  }
177  
178 < double StringTokenizer::nextTokenAsDouble() {
178 >  RealType StringTokenizer::nextTokenAsDouble() {
179      std::string token = nextToken();
180      convertFortranNumber(token);
181      return atof(token.c_str());
182 < }
182 >  }
183  
184 < std::string  StringTokenizer::peekNextToken() {
184 >  std::string  StringTokenizer::peekNextToken() {
185      std::string result;
186      std::string::const_iterator tmpIter = currentPos_;
187      
188      if(tmpIter != end_) {
189 <        std::insert_iterator<std::string> insertIter(result, result.begin());
189 >      std::insert_iterator<std::string> insertIter(result, result.begin());
190  
191 <        while(tmpIter != end_ && isDelimiter(*tmpIter)) {
191 >      while(tmpIter != end_ && isDelimiter(*tmpIter)) {
192  
193 <            if (returnTokens_) {
194 <                *insertIter++ = *tmpIter++;
195 <                return result;
196 <            }
193 >        if (returnTokens_) {
194 >          *insertIter++ = *tmpIter++;
195 >          return result;
196 >        }
197              
198 <            ++tmpIter;
199 <        }
198 >        ++tmpIter;
199 >      }
200  
201 <        while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
202 <            *insertIter++ = *tmpIter++;
203 <        }
201 >      while (tmpIter != end_ && !isDelimiter(*tmpIter)) {
202 >        *insertIter++ = *tmpIter++;
203 >      }
204      }
205      
206      return result;    
207 < }
207 >  }
208  
209 < void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
209 > 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 >  void StringTokenizer::convertFortranNumber(std::string& fortranNumber) {
217      std::string::iterator i;
218      for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) {
219 <        if (*i == 'd' || *i == 'D') {
220 <            *i = 'E';
221 <        }
219 >      if (*i == 'd' || *i == 'D') {
220 >        *i = 'E';
221 >      }
222      }
223 < }
223 >  }
224  
225 < }//end namespace oopse
225 > }//end namespace OpenMD
226  

Comparing trunk/src/utils/StringTokenizer.cpp (property svn:keywords):
Revision 261 by tim, Fri Jan 14 16:49:46 2005 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines