//: C03:Rparse.h
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
#ifndef RPARSE_H
#define RPARSE_H
#include <cstddef>
#include <string>
#include <vector>
#include "../TestSuite/Test.h"
using std::size_t;
using std::string;
using std::vector;

class RparseTest : public TestSuite::Test {
  // To store the words:
  vector<string> strings;
public:
  void parseData() {
    // Znak ';' bude oddělovač
    string s("smysl.;pravý;dávat;konečně;bude;to;Teď");
    // Poslední prvek řetězce:
    int posledni = s.size();
    // Začátek aktuálního slova:
    size_t aktualni = s.rfind(';');
    // pozpátku procházet řetězec:
    while(aktualni != string::npos) {
      // Každé slovo vložit do vektoru.
      // Aktualni se inkremntuje předem, 
			// aby se zabránilo kopírování oddělovače
      ++aktualni;
      strings.push_back(s.substr(aktualni, posledni - aktualni));
      // Zpět přes právě nalezený oddělovač
      // a nastavit posledni na konec dalšího slova
      aktualni -= 2;
      posledni = aktualni + 1;
      // Najít další oddělovač:
      aktualni = s.rfind(';', aktualni);
    }
    // Najít první slovo -- není před ním odělovač:
    strings.push_back(s.substr(0, posledni));
  }
  void testData() {
    // Otestovat je v novém pořadí:
    test_(strings[0] == "Teď");
    test_(strings[1] == "to");
    test_(strings[2] == "bude");
    test_(strings[3] == "konečně");
    test_(strings[4] == "dávat");
    test_(strings[5] == "pravý");
    test_(strings[6] == "smysl.");
    string veta;
    for(size_t i = 0; i < strings.size() - 1; i++)
      veta += strings[i] += " ";
    // Ručně vložit poslední slovo aby se zabránilo mezerám navíc:
    veta += strings[strings.size() - 1];
    test_(veta == "Teď to bude konečně dávat pravý smysl.");
  }
  void run() {
    parseData();
    testData();
  }
};
#endif // RPARSE_H ///:~
