|
Teuchos - Trilinos Tools Package
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Tpetra: Templated Linear Algebra Services Package 00005 // Copyright (2008) Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // ************************************************************************ 00040 // @HEADER 00041 00042 #include "Teuchos_MatrixMarket_split.hpp" 00043 #include <algorithm> 00044 #include <cctype> // tolower 00045 #include <utility> // std::pair 00046 00047 00048 namespace Teuchos { 00049 namespace MatrixMarket { 00050 namespace details { 00051 00052 std::string 00053 trim (const std::string& in) 00054 { 00055 size_t start = in.find_first_not_of(" \t"); 00056 size_t end = in.find_last_not_of(" \t"); 00057 if (start == std::string::npos) 00058 return std::string(""); 00059 else 00060 return in.substr (start, end-start+1); 00061 } 00062 00063 std::string 00064 lowercase (const std::string& in) 00065 { 00066 std::string out (in); 00067 std::transform (in.begin(), in.end(), out.begin(), tolower); 00068 return out; 00069 } 00070 00071 std::string 00072 trim_and_lowercase (const std::string& in) 00073 { 00074 std::string out = trim (in); 00075 std::string out2 (out); 00076 std::transform (out.begin(), out.end(), out2.begin(), tolower); 00077 return out2; 00078 } 00079 00081 static bool 00082 endToken (const std::pair<size_t, size_t>& range) 00083 { 00084 return range.first == std::string::npos && range.second == std::string::npos; 00085 } 00086 00092 static std::pair<size_t, size_t> 00093 nextToken (const std::string& str, 00094 const std::string& delimiters, 00095 const size_t start, 00096 const size_t size) 00097 { 00098 using std::make_pair; 00099 using std::string; 00100 00101 if (start >= size) 00102 return make_pair (string::npos, string::npos); 00103 00104 // First index of a non-delimiter character 00105 const size_t first = str.find_first_not_of (delimiters, start); 00106 if (first == string::npos) 00107 // There are only delimiter characters left 00108 return make_pair (string::npos, string::npos); 00109 else if (first == size-1) 00110 // There's only one non-delimiter character left 00111 return make_pair (first, 1); 00112 else 00113 { // Next index of a delimiter character 00114 const size_t next = str.find_first_of (delimiters, start+1); 00115 return make_pair (first, next - first); 00116 } 00117 } 00118 00119 std::vector<std::string> 00120 split (const std::string& str, const std::string& delimiters, const size_t start) 00121 { 00122 size_t curStart = start; 00123 size_t size = str.size(); 00124 std::vector<std::string> tokens; 00125 while (true) { 00126 std::pair<size_t, size_t> token = nextToken (str, delimiters, curStart, size); 00127 if (endToken (token)) { 00128 break; 00129 } 00130 tokens.push_back (str.substr (token.first, token.second)); 00131 curStart = token.first + token.second; 00132 } 00133 return tokens; 00134 } 00135 } // namespace details 00136 } // namespace MatrixMarket 00137 } // namespace Teuchos
1.7.6.1