From cfa936b48dfb9a8bb850ff0d3600f8860345db4a Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Sat, 19 Nov 2011 19:14:29 +0000 Subject: added Boltun git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@181 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- Boltun/Engine/UnrecentChooser.cpp | 100 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 Boltun/Engine/UnrecentChooser.cpp (limited to 'Boltun/Engine/UnrecentChooser.cpp') diff --git a/Boltun/Engine/UnrecentChooser.cpp b/Boltun/Engine/UnrecentChooser.cpp new file mode 100644 index 0000000..069d84f --- /dev/null +++ b/Boltun/Engine/UnrecentChooser.cpp @@ -0,0 +1,100 @@ +//*********************************************************** +// Copyright © 2008 Valentin Pavlyuchenko +// +// This file is part of Boltun. +// +// Boltun is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 2 of the License, or +// (at your option) any later version. +// +// Boltun is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Boltun. If not, see . +// +//*********************************************************** + +#include "UnrecentChooser.h" + +using namespace std; + +UnRecentChooser::UnRecentChooser() + :last(-1), min(-1), newItemsPrio(-1), maxOldPrio(-1) +{ +} + +void UnRecentChooser::AddChoice(tstring value, float prio) +{ + if (items.count(value) != 0) + { + int val = items[value]; + oldItems.insert(make_pair(val, value)); + oldPrios.insert(make_pair(value, prio)); + if (min > val || min == -1) + min = val; + if (maxOldPrio < prio) + maxOldPrio = prio; + } + else + { + if (prio > newItemsPrio) + { + newItems.push_back(value); + newItemsPrio = prio; + } + } +} + +tstring UnRecentChooser::Choose() +{ + tstring res; + //Find answer + if (newItemsPrio != -1) + { + int num = rand() % newItems.size(); + res = newItems[num]; + } + else + if (min == -1) + res = _T(""); + else + { + float minprio = maxOldPrio / 1.5F; + while (oldPrios[oldItems[min]] < minprio) + min++; + res = oldItems[min]; + } + //Clean items + min = -1; + newItemsPrio = -1; + maxOldPrio = -1; + oldItems.clear(); + oldPrios.clear(); + newItems.clear(); + return res; +} + +void UnRecentChooser::SaveChoice(tstring choice) +{ + //Add answer + if (items.find(choice) != items.end()) + { + for (vector::iterator it = itemsList.begin(); it != itemsList.end(); it++) + if (*it == choice) + { + itemsList.erase(it); + break; + } + } + items[choice] = ++last; + itemsList.push_back(choice); + if (itemsList.size() > maxItems) + { + items.erase(*itemsList.begin()); + itemsList.erase(itemsList.begin()); + } +} \ No newline at end of file -- cgit v1.2.3