--- trunk/src/utils/StringTokenizer.cpp 2005/01/12 22:41:40 246 +++ trunk/src/utils/StringTokenizer.cpp 2015/03/07 23:52:07 2073 @@ -1,4 +1,4 @@ - /* +/* * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. * * The University of Notre Dame grants you ("Licensee") a @@ -6,19 +6,10 @@ * redistribute this software in source and binary code form, provided * that the following conditions are met: * - * 1. Acknowledgement of the program authors must be made in any - * publication of scientific results based in part on use of the - * program. An acceptable form of acknowledgement is citation of - * the article in which the program was described (Matthew - * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher - * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented - * Parallel Simulation Engine for Molecular Dynamics," - * J. Comput. Chem. 26, pp. 252-271 (2005)) - * - * 2. Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - * 3. Redistributions in binary form must reproduce the above copyright + * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. @@ -37,6 +28,16 @@ * arising out of the use of or inability to use software, even if the * University of Notre Dame has been advised of the possibility of * such damages. + * + * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your + * research, please cite the appropriate papers when you publish your + * work. Good starting points are: + * + * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). + * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). + * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). + * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ #include @@ -44,185 +45,217 @@ #include #include "utils/StringTokenizer.hpp" -namespace oopse { +namespace OpenMD { -StringTokenizer::StringTokenizer(const std::string & str, const std::string & delim) - : tokenString_(str), delim_(delim), returnTokens_(false), - currentPos_(tokenString_.begin()), end_(tokenString_.end()){ + StringTokenizer::StringTokenizer(const std::string & str, const std::string & delim) + : tokenString_(str), delim_(delim), returnTokens_(false), + currentPos_(tokenString_.begin()), end_(tokenString_.end()){ -} + } -StringTokenizer::StringTokenizer(std::string::const_iterator& first, std::string::const_iterator& last, - const std::string & delim) - : tokenString_(first, last) , delim_(delim), returnTokens_(false), - currentPos_(tokenString_.begin()), end_(tokenString_.end()) { + StringTokenizer::StringTokenizer(std::string::const_iterator& first, std::string::const_iterator& last, + const std::string & delim) + : tokenString_(first, last) , delim_(delim), returnTokens_(false), + currentPos_(tokenString_.begin()), end_(tokenString_.end()) { -} + } -StringTokenizer::StringTokenizer(const std::string&str, const std::string&delim, - bool returnTokens) - : tokenString_(str), delim_(delim), returnTokens_(returnTokens), - currentPos_(tokenString_.begin()), end_(tokenString_.end()) { + StringTokenizer::StringTokenizer(const std::string&str, const std::string&delim, + bool returnTokens) + : tokenString_(str), delim_(delim), returnTokens_(returnTokens), + currentPos_(tokenString_.begin()), end_(tokenString_.end()) { -} + } -bool StringTokenizer::isDelimiter(const char c) { + bool StringTokenizer::isDelimiter(const char c) { return delim_.find(c) == std::string::npos ? false : true; -} + } -int StringTokenizer::countTokens() { + int StringTokenizer::countTokens() { std::string::const_iterator tmpIter = currentPos_; int numToken = 0; while (true) { - //skip delimiter first - while( tmpIter != end_ && isDelimiter(*tmpIter)) { - ++tmpIter; + //skip delimiter first + while( tmpIter != end_ && isDelimiter(*tmpIter)) { + ++tmpIter; - if (returnTokens_) { - //if delimiter is consider as token - ++numToken; - } - } + if (returnTokens_) { + //if delimiter is consider as token + ++numToken; + } + } - if (tmpIter == end_) { - break; - } + if (tmpIter == end_) { + break; + } - //encount a token here - while ( tmpIter != end_ && !isDelimiter(*tmpIter) ) { - ++tmpIter; - } + //encount a token here + while ( tmpIter != end_ && !isDelimiter(*tmpIter) ) { + ++tmpIter; + } - ++numToken; + ++numToken; } return numToken; -} + } -bool StringTokenizer::hasMoreTokens() { + bool StringTokenizer::hasMoreTokens() { if (currentPos_ == end_) { - return false; + return false; } else if (returnTokens_) { - return true; + return true; } else { - std::string::const_iterator i = currentPos_; + std::string::const_iterator i = currentPos_; - //walk through the remaining string to check whether it contains non-delimeter or not - while(i != end_ && isDelimiter(*i)) { - ++i; - } + //walk through the remaining string to check whether it contains + //non-delimeter or not + while(i != end_ && isDelimiter(*i)) { + ++i; + } - return i != end_ ? true : false; + return i != end_ ? true : false; } -} + } -std::string StringTokenizer::nextToken() { + std::string StringTokenizer::nextToken() { std::string result; if(currentPos_ != end_) { - std::insert_iterator insertIter(result, result.begin()); + std::insert_iterator insertIter(result, result.begin()); - while( currentPos_ != end_ && isDelimiter(*currentPos_)) { + while( currentPos_ != end_ && isDelimiter(*currentPos_)) { - if (returnTokens_) { - *insertIter++ = *currentPos_++; - return result; - } + if (returnTokens_) { + *insertIter++ = *currentPos_++; + return result; + } - ++currentPos_; - } + ++currentPos_; + } - while (currentPos_ != end_ && !isDelimiter(*currentPos_)) { - *insertIter++ = *currentPos_++; - } + while (currentPos_ != end_ && !isDelimiter(*currentPos_)) { + *insertIter++ = *currentPos_++; + } } return result; -} + } -bool StringTokenizer::nextTokenAsBool() { - std::string token = nextToken(); - std::istringstream iss(token); - bool result; - - if (iss >> result) { - return result; - } else { - std::cerr << "unable to convert " << token << " to a bool" << std::endl; - return false; + void StringTokenizer::skipToken() { + + if(currentPos_ != end_) { + while( currentPos_ != end_ && isDelimiter(*currentPos_)) { + + if (returnTokens_) { + *currentPos_++; + return; + } + + ++currentPos_; + } + + while (currentPos_ != end_ && !isDelimiter(*currentPos_)) { + *currentPos_++; + } } -} + } -int StringTokenizer::nextTokenAsInt() { + bool StringTokenizer::nextTokenAsBool() { std::string token = nextToken(); std::istringstream iss(token); - int result; + bool result; if (iss >> result) { - return result; + return result; } else { - std::cerr << "unable to convert " << token << " to an integer" << std::endl; - return 0; + std::cerr << "unable to convert " << token << " to a bool" << std::endl; + return false; } -} + } + + //Since libstdc++(GCC 3.2) has an i/ostream::operator>>/<<(streambuf*) bug (Bug 9318) + //Instead of using iostream facility, we use C library + int StringTokenizer::nextTokenAsInt() { + std::string token = nextToken(); + + return atoi(token.c_str()); + } -float StringTokenizer::nextTokenAsFloat() { + float StringTokenizer::nextTokenAsFloat() { std::string token = nextToken(); - std::istringstream iss(token); - float result; - - if (iss >> result) { - return result; - } else { - std::cerr << "unable to convert " << token << " to a float" << std::endl; - return 0.0; - } -} + convertFortranNumber(token); + return (float) (atof(token.c_str())); + } -double StringTokenizer::nextTokenAsDouble() { + RealType StringTokenizer::nextTokenAsDouble() { std::string token = nextToken(); - std::istringstream iss(token); - double result; - - if (iss >> result) { - return result; - } else { - std::cerr << "unable to convert " << token << " to a double" << std::endl; - return 0.0; - } -} + convertFortranNumber(token); + return atof(token.c_str()); + } -std::string StringTokenizer::peekNextToken() { + std::string StringTokenizer::peekNextToken() { std::string result; std::string::const_iterator tmpIter = currentPos_; if(tmpIter != end_) { - std::insert_iterator insertIter(result, result.begin()); + std::insert_iterator insertIter(result, result.begin()); - while(tmpIter != end_ && isDelimiter(*tmpIter)) { + while(tmpIter != end_ && isDelimiter(*tmpIter)) { - if (returnTokens_) { - *insertIter++ = *tmpIter++; - return result; - } + if (returnTokens_) { + *insertIter++ = *tmpIter++; + return result; + } - ++tmpIter; - } + ++tmpIter; + } - while (tmpIter != end_ && !isDelimiter(*tmpIter)) { - *insertIter++ = *tmpIter++; - } + while (tmpIter != end_ && !isDelimiter(*tmpIter)) { + *insertIter++ = *tmpIter++; + } } return result; -} + } -}//end namespace oopse + std::vector StringTokenizer::getAllTokens() { + std::vector tokens; + while (hasMoreTokens()) { + tokens.push_back(nextToken()); + } + return tokens; + } + void StringTokenizer::convertFortranNumber(std::string& fortranNumber) { + std::string::iterator i; + for(i = fortranNumber.begin(); i != fortranNumber.end(); ++i) { + if (*i == 'd' || *i == 'D') { + *i = 'E'; + } + } + } + std::string StringTokenizer::getRemainingString() { + std::string result; + std::string::const_iterator tmpIter = currentPos_; + if(tmpIter != end_) { + std::insert_iterator insertIter(result, result.begin()); + + while (tmpIter != end_) { + *insertIter++ = *tmpIter++; + } + } + + return result; + } + + +}//end namespace OpenMD +