//: C07:Tezaurus.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Mapa vektorů.
#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;

typedef map<string, vector<string> > Tezaurus;
typedef pair<string, vector<string> > TZaznam;
typedef Tezaurus::iterator TIter;

// vyhledání jména:
namespace std {
ostream& operator<<(ostream& os,const TZaznam& t) {
  os << t.first << ": ";
  copy(t.second.begin(), t.second.end(),
    ostream_iterator<string>(os, " "));
  return os;
}
}

// Generátor zkušebních položek tezauru:
class TezaurusGen {
  static const string pismena;
  static int pocet;
public:
  int maxVelikost() { return pismena.size(); }
  TZaznam operator()() {
    TZaznam vysledek;
    if(pocet >= maxVelikost()) pocet = 0;
    vysledek.first = pismena[pocet++];
    int zaznamy = (rand() % 5) + 2;
    for(int i = 0; i < zaznamy; i++) {
      int volba = rand() % maxVelikost();
      char cbuf[2] = { 0 };
      cbuf[0] = pismena[volba];
      vysledek.second.push_back(cbuf);
    }
    return vysledek;
  }
};

int TezaurusGen::pocet = 0;
const string TezaurusGen::pismena("ABCDEFGHIJKL"
  "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");

// Vyžádat si slovo, které se má nalézt:
string menu(Tezaurus& tezaurus) {
  while(true) {
    cout << "Vyber \"slovo\", 0 konec: ";
    for(TIter it = tezaurus.begin();
        it != tezaurus.end(); it++)
      cout << (*it).first << ' ';
    cout << endl;
    string odpoved;
    cin >> odpoved;
    if(odpoved.at(0) == '0') exit(0); // Konec
    if(tezaurus.find(odpoved) == tezaurus.end())
      continue; // NEní v seznamu, zkusit znovu
    return odpoved;
  }
}

int main() {
  srand(time(0)); // nastavit generátor náhodných čísel
  Tezaurus tezaurus;
  // Naplnit deset položek:
  generate_n(inserter(tezaurus, tezaurus.begin()),
    10, TezaurusGen());
  // Vytisknout všechno:
  copy(tezaurus.begin(), tezaurus.end(),
    ostream_iterator<TZaznam>(cout, "\n"));
  // Vytvořit seznam klíčů:
  string klice[10];
  int i = 0;
  for(TIter it = tezaurus.begin();
    it != tezaurus.end(); it++)
    klice[i++] = (*it).first;
  for(int pocet = 0; pocet < 10; pocet++) {
    // Zadat z konzole:
    // string odpoved = menu(tezaurus);
    // Generovat náhodně:
    string odpoved = klice[rand() % 10];
    vector<string>& v = tezaurus[odpoved];
    copy(v.begin(), v.end(),
      ostream_iterator<string>(cout, " "));
    cout << endl;
  }
} ///:~
