//: C07:PriorityQueue3.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.
// Pokrořilejší použití priority_queue.
#include <iostream>
#include <queue>
#include <string>
using namespace std;

class PlanovanyUkol {
  char hlavni;
  int vedlejsi;
  string ukol;
public:
  PlanovanyUkol(string td, char pri = 'A', int sec = 1)
  : hlavni(pri), vedlejsi(sec), ukol(td) {}
  friend bool operator<(
    const PlanovanyUkol& x, const PlanovanyUkol& y) {
    if(x.hlavni > y.hlavni)
      return true;
    if(x.hlavni == y.hlavni)
      if(x.vedlejsi > y.vedlejsi)
        return true;
    return false;
  }
  friend ostream&
  operator<<(ostream& os, const PlanovanyUkol& td) {
    return os << td.hlavni << td.vedlejsi
      << ": " << td.ukol;
  }
};

int main() {
  priority_queue<PlanovanyUkol> seznamUkolu;
  seznamUkolu.push(PlanovanyUkol("Vysypat koš", 'C', 4));
  seznamUkolu.push(PlanovanyUkol("Nakrmit psa", 'A', 2));
  seznamUkolu.push(PlanovanyUkol("Namrmit andulku", 'B', 7));
  seznamUkolu.push(PlanovanyUkol("Posekat trávník", 'C', 3));
  seznamUkolu.push(PlanovanyUkol("Zalít trávník", 'A', 1));
  seznamUkolu.push(PlanovanyUkol("Nakrmit kočku", 'B', 1));
  while(!seznamUkolu.empty()) {
    cout << seznamUkolu.top() << endl;
    seznamUkolu.pop();
  }
} ///:~
