From 78d71d2cad6f243c6ff31d41380b8c5b58407de5 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Thu, 17 May 2012 17:37:22 +0000 Subject: added some plugins git-svn-id: http://svn.miranda-ng.org/main/trunk@20 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Boltun/Engine/UnrecentChooser.cpp | 100 ++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 plugins/Boltun/Engine/UnrecentChooser.cpp (limited to 'plugins/Boltun/Engine/UnrecentChooser.cpp') diff --git a/plugins/Boltun/Engine/UnrecentChooser.cpp b/plugins/Boltun/Engine/UnrecentChooser.cpp new file mode 100644 index 0000000000..069d84f377 --- /dev/null +++ b/plugins/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