52   namespace MatrixMarket {
 
   63       const char* 
const validValues[] = {
"matrix"};
 
   64       const int numValidValues = 1;
 
   68         return std::string (validValues[0]);
 
   69       else if (validValues + numValidValues ==
 
   70                std::find (validValues, validValues + numValidValues, out))
 
   71         throw std::invalid_argument(
"Object type \"" + out + 
"\" is " 
   72                                     "not one of the valid values");
 
   83       const char* 
const validValues[] = {
"coordinate", 
"array"};
 
   84       const int numValidValues = 2;
 
   85       if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
 
   86         throw std::invalid_argument(
"Matrix type \"" + out + 
"\" is not one of the valid values");
 
   97       const char* 
const validValues[] = {
"real", 
"complex", 
"integer", 
"pattern"};
 
   98       const int numValidValues = 4;
 
   99       if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
 
  100         throw std::invalid_argument(
"Data type \"" + out + 
"\" is not one of the valid values");
 
  113           const char* 
const validValues[] =
 
  114             {
"general", 
"nonsymmetric", 
"unsymmetric", 
"symmetric",
 
  115              "skew-symmetric", 
"skew", 
"hermitian"};
 
  116           const int numValidValues = 7;
 
  117           if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
 
  118             throw std::invalid_argument(
"Symmetry type \"" + out + 
"\" is not one of the valid values");
 
  121               if (out == 
"nonsymmetric" || out == 
"unsymmetric")
 
  122                 return std::string(
"general");
 
  123               else if (out == 
"skew")
 
  124                 return std::string(
"skew-symmetric");
 
  131           const char* 
const validValues[] = {
"general", 
"symmetric", 
"skew-symmetric", 
"hermitian"};
 
  132           const int numValidValues = 4;
 
  133           if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
 
  134             throw std::invalid_argument(
"Symmetry type \"" + out + 
"\" is not one of the valid values");
 
  164           throw std::invalid_argument (
"The banner line is empty");
 
  167       start = line.find_first_not_of (
" \t");
 
  168       if (start == std::string::npos) {
 
  174           throw std::invalid_argument (
"The banner line contains only " 
  175                                        "whitespace characters");
 
  178       else if (start != 0 && ! tolerant) {
 
  181         throw std::invalid_argument (
"The banner line is not allowed to start " 
  182                                      "with whitespace characters");
 
  189       size_t ppStart = line.find (
"%%", start);
 
  191       if (ppStart == std::string::npos) {
 
  197             "Market file's banner line should always start with \"%%\".  Here " 
  198             "is the offending line: " << std::endl << line);
 
  202         tokenStart = ppStart + 2;
 
  203         if (tokenStart >= line.size()) {
 
  211               "Market file's banner line needs to contain information after the " 
  212               "\"%%\" marker.  Here is the offending line: " << std::endl << line);
 
  221       std::vector<std::string> tokens = 
split (line, 
" \t", 2);
 
  222       const int numTokens = tokens.size();
 
  230             "Market file's banner line must always begin with the \"Matrix" 
  231             "Market\" keyword.  Here is the offending line: " << std::endl
 
  236       if (! tolerant && tokens[0] != 
"MatrixMarket") {
 
  238           "Market file's banner line must always begin with the \"Matrix" 
  239           "Market\" keyword.  Here is the offending line: " << std::endl
 
  248             "Market file's banner line must always have 5 tokens, but yours " 
  249             "only has " << numTokens << 
"token" << (numTokens != 1 ? 
"s" : 
"")
 
  250             << 
".  Here is the offending line: " << std::endl << line);
 
  253       if (numTokens >= 2) {
 
  256       if (numTokens >= 3) {
 
  259       if (numTokens >= 4) {
 
  262       if (numTokens >= 5) {
 
  270       out << 
"%%MatrixMarket" 
void setDefaults(const int howMany)
Set the last howMany member data to default values. 
 
const std::string & matrixType() const 
Storage type of the matrix. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging. 
 
const std::string & dataType() const 
Data type of matrix entries. 
 
std::vector< std::string > split(const std::string &str, const std::string &delimiters, const size_t start)
Split the given string using the given set of delimiters. 
 
std::ostream & operator<<(std::ostream &out, const Banner &banner)
 
static std::string validateObjectType(const std::string &objectType, const bool tolerant=false)
 
const std::string & symmType() const 
Symmetric storage type. 
 
const std::string & objectType() const 
The object type. 
 
Banner(const std::string &line, const bool tolerant=false)
 
static std::string validateDataType(const std::string &dataType, const bool tolerant=false)
 
std::string trim_and_lowercase(const std::string &in)
Trim whitespace from both sides, and make lowercase. 
 
Standard test and throw macros. 
 
static std::string validateSymmType(const std::string &symmType, const bool tolerant=false)
 
static std::string validateMatrixType(const std::string &matrixType, const bool tolerant=false)
 
Parse a Matrix Market banner line.