Tpetra Matrix/Vector Services Version of the Day
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 "MatrixMarket_split.hpp"
00043 #include <algorithm>
00044 #include <cctype> // tolower
00045 #include <utility> // std::pair
00046 
00047 namespace Tpetra {
00048   namespace MatrixMarket {
00049     namespace details {
00050 
00051       std::string 
00052       trim (const std::string& in)
00053       {
00054   size_t start = in.find_first_not_of(" \t");
00055   size_t end = in.find_last_not_of(" \t");
00056   if (start == std::string::npos)
00057     return std::string("");
00058   else
00059     return in.substr (start, end-start+1);
00060       }
00061 
00062       std::string 
00063       lowercase (const std::string& in)
00064       {
00065   std::string out (in);
00066   std::transform (in.begin(), in.end(), out.begin(), tolower);
00067   return out;
00068       }
00069 
00070       std::string 
00071       trim_and_lowercase (const std::string& in)
00072       {
00073   std::string out = trim (in);
00074   std::string out2 (out);
00075   std::transform (out.begin(), out.end(), out2.begin(), tolower);
00076   return out2;
00077       }
00078 
00080       static bool
00081       endToken (const std::pair<size_t, size_t>& range)
00082       {
00083   return range.first == std::string::npos && range.second == std::string::npos;
00084       }
00085 
00091       static std::pair<size_t, size_t>
00092       nextToken (const std::string& str, 
00093      const std::string& delimiters, 
00094      const size_t start,
00095      const size_t size)
00096       {
00097   using std::make_pair;
00098   using std::string;
00099 
00100   if (start >= size)
00101     return make_pair (string::npos, string::npos);
00102 
00103   // First index of a non-delimiter character
00104   const size_t first = str.find_first_not_of (delimiters, start);
00105   if (first == string::npos)
00106     // There are only delimiter characters left
00107     return make_pair (string::npos, string::npos);
00108   else if (first == size-1)
00109     // There's only one non-delimiter character left
00110     return make_pair (first, 1);
00111   else
00112     { // Next index of a delimiter character
00113       const size_t next = str.find_first_of (delimiters, start+1);
00114       return make_pair (first, next - first);
00115     }
00116       }
00117 
00118       std::vector<std::string>
00119       split (const std::string& str, const std::string& delimiters, const size_t start)
00120       {
00121   size_t curStart = start;
00122   size_t size = str.size();
00123   std::vector<std::string> tokens;
00124   while (true) 
00125     {
00126       std::pair<size_t, size_t> token = nextToken (str, delimiters, curStart, size);
00127       if (endToken (token))
00128         break;
00129       tokens.push_back (str.substr (token.first, token.second));
00130       curStart = token.first + token.second;
00131     }
00132   return tokens;
00133       }
00134     } // namespace details
00135   } // namespace MatrixMarket
00136 } // namespace Tpetra
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines