19 #ifndef SEARCHTOURNAMENTS_H 20 #define SEARCHTOURNAMENTS_H 67 template <
typename Iter>
69 : begin_(begin), minDateGame_(begin) {
72 n_games_ =
static_cast<gamenumT>(std::distance(begin, end));
74 for (
auto it = begin; it != end; it++) {
75 auto& white = add_player(it->whiteID_, it->wElo_);
77 auto& black = add_player(it->blackID_, it->bElo_);
80 if (it->date_ < minDateGame_->date_) minDateGame_ = it;
82 std::sort(players_.begin(), players_.end(),
83 [](
auto& a,
auto& b) {
return a.score > b.score; });
85 const auto eloSum = std::accumulate(players_.begin(), players_.end(),
87 [](
auto res,
const auto& player) {
88 if (player.elo != 0) {
89 res.first += player.elo;
94 avgElo_ = (eloSum.second == 0)
96 : static_cast<unsigned>(eloSum.first / eloSum.second);
105 unsigned nPlayers()
const {
return static_cast<unsigned>(players_.size()); }
115 ASSERT(position < players_.size());
116 return players_[position];
120 std::vector<TourneyGame>::const_iterator begin_;
121 std::vector<TourneyGame>::const_iterator minDateGame_;
122 std::vector<Player> players_;
127 auto it =
std::find(players_.begin(), players_.end(), nameID);
128 if (it != players_.end()) {
133 players_.push_back({nameID, 0, elo});
134 return players_.back();
167 std::vector<TourneyGame> games_;
168 std::vector<Tourney> tourney_;
176 games_.reserve(filter->
size());
177 for (
auto gnum : filter) {
188 dateT d2 = b.eventDate_ != 0 ? b.eventDate_ : b.date_;
192 auto it = games_.begin();
193 const auto it_end = games_.end();
194 while (it != it_end) {
195 const auto start = it;
209 tourney_.emplace_back(
start, it);
213 typedef std::vector<Tourney>::const_iterator
Iter;
214 Iter
begin()
const {
return tourney_.begin(); }
215 Iter
end()
const {
return tourney_.end(); }
219 std::remove_if(tourney_.begin(), tourney_.end(),
220 Filter<& Tourney::getAvgElo>(range)),
226 std::remove_if(tourney_.begin(), tourney_.end(),
227 Filter<& Tourney::nPlayers>(range)),
233 std::remove_if(tourney_.begin(), tourney_.end(),
234 Filter<& Tourney::nGames>(range)),
240 std::remove_if(tourney_.begin(), tourney_.end(),
246 bool sort(
const char* criteria,
size_t max);
249 template <u
int (Tourney::* f)() const>
254 Filter(
const StrRange& range) : range_(range) {}
256 bool operator()(
const Tourney& t) {
257 return ! range_.inRange((t.*f)());
261 class FilterByPlayer {
267 : name_(name), nb_(nb) {}
269 bool operator()(
const Tourney& t) {
270 for (
size_t i = 0, n = t.
nPlayers(); i < n; i++) {
285 template <u
int (Tourney::* f)() const>
288 return (a.*f)() > (b.*f)();
292 template <nameT nt,
idNumberT (Tourney::* f)() const>
296 SortId(
const NameBase* nb) : nb_(nb) {}
298 const char* nameA = nb_->GetName(nt, (a.*f)());
299 const char* nameB = nb_->GetName(nt, (b.*f)());
306 static const char* criterions [] = {
307 "Date",
"Elo",
"Event",
"Games",
"Players",
"Site", NULL
309 enum { DATE, ELO, EVENT, GAMES, PLAYERS, SITE };
311 std::vector<Tourney>::iterator begin = tourney_.begin();
312 std::vector<Tourney>::iterator it = (nOrdered < tourney_.size()) ?
313 tourney_.begin() + nOrdered : tourney_.end();
314 std::vector<Tourney>::iterator end = tourney_.end();
318 std::partial_sort(begin, it, end, SortDate());
321 std::partial_sort(begin, it, end, SortDesc<& Tourney::getAvgElo>());
324 std::partial_sort(begin, it, end,
325 SortId<NAME_EVENT, & Tourney::getEventId>(dbase_->getNameBase()));
328 std::partial_sort(begin, it, end, SortDesc<& Tourney::nGames>());
331 std::partial_sort(begin, it, end, SortDesc<& Tourney::nPlayers>());
334 std::partial_sort(begin, it, end,
335 SortId<NAME_SITE, & Tourney::getSiteId>(dbase_->getNameBase()));
const IndexEntry * getIndexEntry(gamenumT g) const
unsigned getAvgElo() const
dateT getStartDate() const
std::vector< Tourney >::const_iterator Iter
resultT GetResult() const
idNumberT GetSite() const
class SearchTournamens - Search tournaments in a database
idNumberT GetEvent() const
gamenumT getStartGameNum() const
int strUniqueMatch(const char *keyStr, const char **strTable)
class StrRange - parse a string interpreting its content as 1 or 2 integers separated by whitespace...
const resultT RESULT_OPPOSITE[4]
idNumberT getEventId() const
void filterByNPlayers(const StrRange &range)
const char * GetName(nameT nt, idNumberT id) const
Retrieve a name.
idNumberT getSiteId() const
bool sort(const char *criteria, size_t max)
int find(const char *filename)
find() - search for a database.
This class stores the database's names (players, events, sites and rounds).
void filterByPlayer(const char *name)
class Tourney - Calculate information about a tournament
bool operator==(idNumberT id) const
class TourneyGame - Private class used by Tourney and SearchTournaments
void filterByNGames(const StrRange &range)
idNumberT GetWhite() const
TourneyGame(const IndexEntry *ie, gamenumT gnum)
SearchTournaments(const scidBaseT *dbase, const HFilter &filter)
bool strAlphaContains(const char *longStr, const char *keyStr)
const Player & getPlayer(size_t position) const
int strCaseCompare(const char *str1, const char *str2)
Tourney(Iter begin, Iter end)
idNumberT GetBlack() const
void filterByAvgElo(const StrRange &range)
const uint RESULT_SCORE[4]
unsigned nPlayers() const
const NameBase * getNameBase() const
dateT GetEventDate() const