Open alexey-malov opened 7 years ago
void RegisterObserver(ObserverType & observer, unsigned int priority = 0) override
{
for (auto iter = m_priority.begin(); iter != m_priority.end(); ++iter)
{
if (iter->second == &observer)
{
break;
}
}
m_observers.emplace(&observer);
m_priority.emplace(priority, &observer);
}
[x] Использовать find_if
[ ] Тут если выбросится исключение при вставке в мультимап, наблюдатель останется в m_observers. Надо удалять вставленного наблюдателя, если было исключение. Не ясно, зачем тут поиск, если результат не испольузется. Либо try/catch заворачивать, либо BOOST_SCOPE_EXIT использовать.
[x] есть возможноть дважды добавить наблюдателя
[x] Если последовательный поиск можнол заменить на поиск логарифмический, то лучше это сделать
void RemoveObserver(ObserverType & observer) override
{
auto iterObserver = std::find(m_observers.begin(), m_observers.end(), &observer);
if (iterObserver != m_observers.end())
{
m_observers.erase(iterObserver);
for (auto iter = m_priority.begin(); iter != m_priority.end(); ++iter)
{
if (iter->second == &observer)
{
m_priority.erase(iter);
break;
}
}
}
}
auto priorityIter = std::find_if(m_priority.begin()
, m_priority.end()
, [&](std::pair<unsigned int, ObserverType *> pair)
{
if (pair.second == &observer)
{
return true;
}
return false;
}
);
auto iterObserver = std::find_if(
m_observers.begin()
, m_observers.end()
, [&](ObserverType * pObserver)
{
if (pObserver == &observer)
{
return true;
}
return false;
}
);
CWeatherData(const std::string name = "")
: m_nameStation(name)
{
}
[x] принимать по константной ссылке
[x] Имя станции по-англискйи station name