Commit 8bf0e003 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Rewritten String::split to return std::vector<String>

Return values are nicer than modifiable parameters. This also avoids the
circular dependency between TNL::String and List.
parent 06b8db3b
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@
#pragma once

#include <iomanip>
#include <TNL/Containers/List.h>
#include <TNL/String.h>
#include <TNL/Containers/Vector.h>
#include <TNL/Timer.h>
@@ -166,9 +165,8 @@ template< typename Matrix >
bool MatrixReader< Matrix >::checkMtxHeader( const String& header,
                                                bool& symmetric )
{
   Containers::List< String > parsedLine;
   header.split( parsedLine );
   if( parsedLine.getSize() < 5 )
   std::vector< String > parsedLine = header.split();
   if( (int) parsedLine.size() < 5 )
      return false;
   if( parsedLine[ 0 ] != "%%MatrixMarket" )
      return false;
@@ -212,7 +210,7 @@ bool MatrixReader< Matrix >::readMtxHeader( std::istream& file,
   file.seekg( 0, std::ios::beg );
   String line;
   bool headerParsed( false );
   Containers::List< String > parsedLine;
   std::vector< String > parsedLine;
   while( true )
   {
      line.getLine( file );
@@ -233,9 +231,8 @@ bool MatrixReader< Matrix >::readMtxHeader( std::istream& file,
         return false;
      }

      parsedLine.reset();
      line.split( parsedLine );
      if( parsedLine. getSize() != 3 )
      parsedLine = line.split();
      if( (int) parsedLine.size() != 3 )
      {
         std::cerr << "Wrong number of parameters in the matrix header." << std::endl;
         return false;
@@ -389,9 +386,8 @@ bool MatrixReader< Matrix >::parseMtxLineWithElement( const String& line,
                                                         IndexType& column,
                                                         RealType& value )
{
   Containers::List< String > parsedLine;
   line.split( parsedLine );
   if( parsedLine.getSize() != 3 )
   std::vector< String > parsedLine = line.split();
   if( (int) parsedLine.size() != 3 )
   {
      std::cerr << "Wrong number of parameters in the matrix row at line:" << line << std::endl;
      return false;
+7 −12
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@
#include <string.h>
#include <TNL/String.h>
#include <TNL/Assert.h>
#include <TNL/Containers/List.h>
#include <TNL/File.h>
#include <TNL/Math.h>
#ifdef USE_MPI
@@ -335,25 +334,21 @@ String::strip( char strip ) const
   return "";
}

int String::split( Containers::List< String >& list,
                   const char separator,
                   bool skipEmpty ) const
std::vector< String > String::split( const char separator, bool skipEmpty ) const
{
   list.reset();
   std::vector< String > parts;
   String s;
   for( int i = 0; i < this->getLength(); i ++ )
   {
      if( ( *this )[ i ] == separator )
      {
   for( int i = 0; i < this->getLength(); i++ ) {
      if( ( *this )[ i ] == separator ) {
         if( ! skipEmpty || s != "" )
            list.Append( s );
            parts.push_back( s );
         s = "";
      }
      else s += ( *this )[ i ];
   }
   if( ! skipEmpty || s != "" )
      list.Append( s );
   return list.getSize();
      parts.push_back( s );
   return parts;
}


+2 −6
Original line number Diff line number Diff line
@@ -12,14 +12,11 @@

#include <iostream>
#include <sstream>
#include <vector>

namespace TNL {

class File;
namespace Containers {
   template< class T > class List;
}

class String;

template< typename T >
@@ -237,10 +234,9 @@ class String
      /// and returs list of those strings. When \e separator does not appear
      /// anywhere in the given string, this function returns a single-element list
      /// containing given sting.
      /// @param list Name of list.
      /// @param separator Character, which separates substrings in given string.
      /// Empty character can not be used.
      int split( Containers::List< String >& list, const char separator = ' ', bool skipEmpty = false ) const;
      std::vector< String > split( const char separator = ' ', bool skipEmpty = false ) const;

      /////
      /// \brief Function for saving file.
+40 −41
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

#include <TNL/String.h>
#include <TNL/File.h>
#include <TNL/Containers/List.h>

using namespace TNL;

@@ -286,46 +285,46 @@ TEST( StringTest, strip )

TEST( StringTest, split )
{
   Containers::List< String > list;

   String( "A B C" ).split( list, ' ' );
   ASSERT_EQ( list.getSize(), 3 );
   EXPECT_EQ( list[ 0 ], "A" );
   EXPECT_EQ( list[ 1 ], "B" );
   EXPECT_EQ( list[ 2 ], "C" );

   String( "abracadabra" ).split( list, 'a' );
   ASSERT_EQ( list.getSize(), 6 );
   EXPECT_EQ( list[ 0 ], "" );
   EXPECT_EQ( list[ 1 ], "br" );
   EXPECT_EQ( list[ 2 ], "c" );
   EXPECT_EQ( list[ 3 ], "d" );
   EXPECT_EQ( list[ 4 ], "br" );
   EXPECT_EQ( list[ 5 ], "" );
   
   String( "abracadabra" ).split( list, 'a', true );
   ASSERT_EQ( list.getSize(), 4 );
   EXPECT_EQ( list[ 0 ], "br" );
   EXPECT_EQ( list[ 1 ], "c" );
   EXPECT_EQ( list[ 2 ], "d" );
   EXPECT_EQ( list[ 3 ], "br" );

   String( "abracadabra" ).split( list, 'b' );
   ASSERT_EQ( list.getSize(), 3 );
   EXPECT_EQ( list[ 0 ], "a" );
   EXPECT_EQ( list[ 1 ], "racada" );
   EXPECT_EQ( list[ 2 ], "ra" );

   String( "abracadabra" ).split( list, 'A' );
   ASSERT_EQ( list.getSize(), 1 );
   EXPECT_EQ( list[ 0 ], "abracadabra" );

   String( "a,,b,c" ).split( list, ',' );
   ASSERT_EQ( list.getSize(), 4 );
   EXPECT_EQ( list[ 0 ], "a" );
   EXPECT_EQ( list[ 1 ], "" );
   EXPECT_EQ( list[ 2 ], "b" );
   EXPECT_EQ( list[ 3 ], "c" );
   std::vector< String > parts;

   parts = String( "A B C" ).split( ' ' );
   ASSERT_EQ( (int) parts.size(), 3 );
   EXPECT_EQ( parts[ 0 ], "A" );
   EXPECT_EQ( parts[ 1 ], "B" );
   EXPECT_EQ( parts[ 2 ], "C" );

   parts = String( "abracadabra" ).split( 'a' );
   ASSERT_EQ( (int) parts.size(), 6 );
   EXPECT_EQ( parts[ 0 ], "" );
   EXPECT_EQ( parts[ 1 ], "br" );
   EXPECT_EQ( parts[ 2 ], "c" );
   EXPECT_EQ( parts[ 3 ], "d" );
   EXPECT_EQ( parts[ 4 ], "br" );
   EXPECT_EQ( parts[ 5 ], "" );

   parts = String( "abracadabra" ).split( 'a', true );
   ASSERT_EQ( (int) parts.size(), 4 );
   EXPECT_EQ( parts[ 0 ], "br" );
   EXPECT_EQ( parts[ 1 ], "c" );
   EXPECT_EQ( parts[ 2 ], "d" );
   EXPECT_EQ( parts[ 3 ], "br" );

   parts = String( "abracadabra" ).split( 'b' );
   ASSERT_EQ( (int) parts.size(), 3 );
   EXPECT_EQ( parts[ 0 ], "a" );
   EXPECT_EQ( parts[ 1 ], "racada" );
   EXPECT_EQ( parts[ 2 ], "ra" );

   parts = String( "abracadabra" ).split( 'A' );
   ASSERT_EQ( (int) parts.size(), 1 );
   EXPECT_EQ( parts[ 0 ], "abracadabra" );

   parts = String( "a,,b,c" ).split( ',' );
   ASSERT_EQ( (int) parts.size(), 4 );
   EXPECT_EQ( parts[ 0 ], "a" );
   EXPECT_EQ( parts[ 1 ], "" );
   EXPECT_EQ( parts[ 2 ], "b" );
   EXPECT_EQ( parts[ 3 ], "c" );
}

TEST( StringTest, SaveLoad )