История изменений
Исправление a--, (текущая версия) :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки (которую можно и округлить в операторе сравнения), но все же различаются по реальному адресу timer. Нормально сделанная unorderered_multimap должна позволять сравнивать элементы с возможностью получения дубликатов по равенству, но удалять элементы точно — т.е. именно тот из дубликатов, который был запрошен (т.е. либо по адресу timer, либо по адресу refcounted<timer>).
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки (которую можно и округлить в операторе сравнения), но все же различаются по реальному адресу timer. Нормально сделанная unorderered_multimap должна позволять сравнивать элементы с возможностью получения дубликатов по равенству, но удалять элементы точно — т.е. именно тот из дубликатов, который был запрошен.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки (которую можно и округлить в операторе сравнения), но все же различаются по реальному адресу timer. Нормально сделанная unorderered_multimap должна позволять сравнивать элементы с возможностью получения дубликатов по равенству, но удалять элементы точно — т.е. именно тот из дубликатов, который был запрошен.
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки (которую можно и округлить в операторе сравнения), но все же различаются по реальному адресу timer. Нормально сделанная unorderered_multimap должна позволять сравнивать с возможностью получения дубликатов по равенству, но удалять точно — т.е. именно тот из дубликатов, который был запрошен.
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки (которую можно и округлить в операторе сравнения), но все же различаются по реальному адресу timer. Нормально сделанная unorderered_multimap должна позволять сравнивать с возможностью дубликатов, но удалять точно — т.е. именно тот из дубликатов, который был попрошен.
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
Тут важный момент, что таймеры сортируются по времени ближайшей отработки, но различаются по реальному адресу timer. Т.е. такой вот надо написать оператор сравнения таймеров для контейнера.
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исправление a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>, который я называю контейнером. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера. Сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново. Таймер, который надо канселнуть, тоже удаляем из контейнера.
Я ничего не забыл что надо делать?
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.
Исходная версия a--, :
А еще абстрактный timer_id крайне полезен для периодических таймеров. Тогда время срабатывания периодически меняется, а вот timer_id нужно оставить дабы иметь возможность отменить таймер.
Можно все таймеры (и периодические, и одноразовые) сложить в unorderered_multimap<refcounted<timer>>. Вместо timer_id используем refcounted<timer>. Сработавший одноразовый таймер сразу удаляем из контейнера, сработавший периодический таймер удаляем, меняем время следующей отработки на новое, вставляем заново.
id вообще-то из той оперы, когда нам нужно сравнивать на равенство, что для таймеров выглядит странно.
unorderered_multimap вроде пишется в терминах владения на расте-без-ансейф. Правда там дополнительные указатели вне-модели-владения могут дать удобство в интерфейсе — это можно обсудить.