Teuchos - Trilinos Tools Package Version of the Day
Teuchos_MatrixMarket_split.cpp
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines