TrinityCore
TaskScheduler.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITYCORE_TASK_SCHEDULER_H
19#define TRINITYCORE_TASK_SCHEDULER_H
20
21#include "Duration.h"
22#include "Optional.h"
23#include "Random.h"
24#include <algorithm>
25#include <functional>
26#include <vector>
27#include <queue>
28#include <memory>
29#include <utility>
30#include <set>
31
32class TaskContext;
33
48{
49 friend class TaskContext;
50
51 // Time definitions (use steady clock)
52 typedef std::chrono::steady_clock clock_t;
53 typedef clock_t::time_point timepoint_t;
54 typedef clock_t::duration duration_t;
55
56 // Task group type
57 typedef uint32 group_t;
58 // Task repeated type
60 // Task handle type
61 typedef std::function<void(TaskContext)> task_handler_t;
62 // Predicate type
63 typedef std::function<bool()> predicate_t;
64 // Success handle type
65 typedef std::function<void()> success_t;
66
67 class Task
68 {
69 friend class TaskContext;
70 friend class TaskScheduler;
71
77
78 public:
79 // All Argument construct
81 repeated_t const repeated, task_handler_t task)
82 : _end(end), _duration(duration), _group(group), _repeated(repeated), _task(std::move(task)) { }
83
84 // Minimal Argument construct
86 : _end(end), _duration(duration), _group(std::nullopt), _repeated(0), _task(std::move(task)) { }
87
88 // Copy construct
89 Task(Task const&) = delete;
90 // Move construct
91 Task(Task&&) = delete;
92 // Copy Assign
93 Task& operator= (Task const&) = default;
94 // Move Assign
95 Task& operator= (Task&& right) = delete;
96
97 ~Task() = default;
98
99 // Order tasks by its end
100 std::weak_ordering operator<=> (Task const& other) const
101 {
102 return std::compare_weak_order_fallback(_end, other._end);
103 }
104
105 // Compare tasks with its end
106 bool operator== (Task const& other) const
107 {
108 return _end == other._end;
109 }
110
111 // Returns true if the task is in the given group
112 inline bool IsInGroup(group_t const group) const
113 {
114 return _group == group;
115 }
116 };
117
118 typedef std::shared_ptr<Task> TaskContainer;
119
121 struct Compare
122 {
123 bool operator() (TaskContainer const& left, TaskContainer const& right) const
124 {
125 return (*left.get()) < (*right.get());
126 }
127 };
128
130 {
131 std::multiset<TaskContainer, Compare> container;
132
133 public:
134 // Pushes the task in the container
135 void Push(TaskContainer&& task);
136
138 TaskContainer Pop();
139
140 TaskContainer const& First() const;
141
142 void Clear();
143
144 void RemoveIf(std::function<bool(TaskContainer const&)> const& filter);
145
146 void ModifyIf(std::function<bool(TaskContainer const&)> const& filter);
147
148 bool IsEmpty() const;
149 };
150
152 std::shared_ptr<TaskScheduler> self_reference;
153
156
159
160 typedef std::queue<std::function<void()>> AsyncHolder;
161
165
167
168 static bool EmptyValidator()
169 {
170 return true;
171 }
172
173public:
175 : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(EmptyValidator) { }
176
177 template<typename P>
178 TaskScheduler(P&& predicate)
179 : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(std::forward<P>(predicate)) { }
180
181 TaskScheduler(TaskScheduler const&) = delete;
183 TaskScheduler& operator= (TaskScheduler const&) = delete;
184 TaskScheduler& operator= (TaskScheduler&&) = delete;
185
186 ~TaskScheduler() = default;
187
189 template<typename P>
191 {
192 _predicate = std::forward<P>(predicate);
193 return *this;
194 }
195
197 TaskScheduler& ClearValidator();
198
201 TaskScheduler& Update(success_t const& callback = nullptr);
202
205 TaskScheduler& Update(size_t milliseconds, success_t const& callback = nullptr);
206
209 template<class Rep, class Period>
210 TaskScheduler& Update(std::chrono::duration<Rep, Period> difftime,
211 success_t const& callback = nullptr)
212 {
213 _now += difftime;
214 Dispatch(callback);
215 return *this;
216 }
217
220 TaskScheduler& Async(std::function<void()> callable);
221
224 template<class Rep, class Period>
225 TaskScheduler& Schedule(std::chrono::duration<Rep, Period> time,
226 task_handler_t task)
227 {
228 return this->ScheduleAt(_now, time, std::move(task));
229 }
230
233 template<class Rep, class Period>
234 TaskScheduler& Schedule(std::chrono::duration<Rep, Period> time,
235 group_t const group, task_handler_t task)
236 {
237 return this->ScheduleAt(_now, time, group, std::move(task));
238 }
239
242 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
243 TaskScheduler& Schedule(std::chrono::duration<RepLeft, PeriodLeft> min,
244 std::chrono::duration<RepRight, PeriodRight> max, task_handler_t task)
245 {
246 return this->Schedule(::randtime(min, max), std::move(task));
247 }
248
251 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
252 TaskScheduler& Schedule(std::chrono::duration<RepLeft, PeriodLeft> min,
253 std::chrono::duration<RepRight, PeriodRight> max, group_t const group,
254 task_handler_t task)
255 {
256 return this->Schedule(::randtime(min, max), group, std::move(task));
257 }
258
261 TaskScheduler& CancelAll();
262
265 TaskScheduler& CancelGroup(group_t group);
266
269 TaskScheduler& CancelGroupsOf(std::vector<group_t> const& groups);
270
272 template<class Rep, class Period>
273 TaskScheduler& DelayAll(std::chrono::duration<Rep, Period> duration)
274 {
275 _task_holder.ModifyIf([&duration](TaskContainer const& task) -> bool
276 {
277 task->_end += duration;
278 return true;
279 });
280 return *this;
281 }
282
284 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
285 TaskScheduler& DelayAll(std::chrono::duration<RepLeft, PeriodLeft> min,
286 std::chrono::duration<RepRight, PeriodRight> max)
287 {
288 return this->DelayAll(::randtime(min, max));
289 }
290
292 template<class Rep, class Period>
293 TaskScheduler& DelayGroup(group_t const group, std::chrono::duration<Rep, Period> duration)
294 {
295 _task_holder.ModifyIf([&duration, group](TaskContainer const& task) -> bool
296 {
297 if (task->IsInGroup(group))
298 {
299 task->_end += duration;
300 return true;
301 }
302 else
303 return false;
304 });
305 return *this;
306 }
307
309 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
311 std::chrono::duration<RepLeft, PeriodLeft> min,
312 std::chrono::duration<RepRight, PeriodRight> max)
313 {
314 return this->DelayGroup(group, ::randtime(min, max));
315 }
316
318 template<class Rep, class Period>
319 TaskScheduler& RescheduleAll(std::chrono::duration<Rep, Period> duration)
320 {
321 auto const end = _now + duration;
322 _task_holder.ModifyIf([end](TaskContainer const& task) -> bool
323 {
324 task->_end = end;
325 return true;
326 });
327 return *this;
328 }
329
331 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
332 TaskScheduler& RescheduleAll(std::chrono::duration<RepLeft, PeriodLeft> min,
333 std::chrono::duration<RepRight, PeriodRight> max)
334 {
335 return this->RescheduleAll(::randtime(min, max));
336 }
337
339 template<class Rep, class Period>
340 TaskScheduler& RescheduleGroup(group_t const group, std::chrono::duration<Rep, Period> duration)
341 {
342 auto const end = _now + duration;
343 _task_holder.ModifyIf([end, group](TaskContainer const& task) -> bool
344 {
345 if (task->IsInGroup(group))
346 {
347 task->_end = end;
348 return true;
349 }
350 else
351 return false;
352 });
353 return *this;
354 }
355
357 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
359 std::chrono::duration<RepLeft, PeriodLeft> min,
360 std::chrono::duration<RepRight, PeriodRight> max)
361 {
362 return this->RescheduleGroup(group, ::randtime(min, max));
363 }
364
365private:
367 TaskScheduler& InsertTask(TaskContainer task);
368
369 template<class Rep, class Period>
371 std::chrono::duration<Rep, Period> time, task_handler_t task)
372 {
373 return InsertTask(TaskContainer(new Task(end + time, time, std::move(task))));
374 }
375
378 template<class Rep, class Period>
380 std::chrono::duration<Rep, Period> time,
381 group_t const group, task_handler_t task)
382 {
383 static constexpr repeated_t DEFAULT_REPEATED = 0;
384 return InsertTask(TaskContainer(new Task(end + time, time, group, DEFAULT_REPEATED, std::move(task))));
385 }
386
388 void Dispatch(success_t const& callback);
389};
390
392{
393 friend class TaskScheduler;
394
397
399 std::weak_ptr<TaskScheduler> _owner;
400
402 std::shared_ptr<bool> _consumed;
403
405 TaskContext& Dispatch(std::function<TaskScheduler&(TaskScheduler&)> const& apply);
406
407public:
408 // Empty constructor
410 : _task(), _owner(), _consumed(std::make_shared<bool>(true)) { }
411
412 // Construct from task and owner
413 explicit TaskContext(TaskScheduler::TaskContainer&& task, std::weak_ptr<TaskScheduler>&& owner)
414 : _task(std::move(task)), _owner(std::move(owner)), _consumed(std::make_shared<bool>(false)) { }
415
416 // Copy construct
418 : _task(right._task), _owner(right._owner), _consumed(right._consumed) { }
419
420 // Move construct
421 TaskContext(TaskContext&& right) noexcept
422 : _task(std::move(right._task)), _owner(std::move(right._owner)), _consumed(std::move(right._consumed)) { }
423
424 // Copy assign
426 {
427 if (this != &right)
428 {
429 _task = right._task;
430 _owner = right._owner;
431 _consumed = right._consumed;
432 }
433 return *this;
434 }
435
436 // Move assign
438 {
439 if (this != &right)
440 {
441 _task = std::move(right._task);
442 _owner = std::move(right._owner);
443 _consumed = std::move(right._consumed);
444 }
445 return *this;
446 }
447
448 ~TaskContext() = default;
449
451 bool IsExpired() const;
452
454 bool IsInGroup(TaskScheduler::group_t const group) const;
455
457 TaskContext& SetGroup(TaskScheduler::group_t const group);
458
460 TaskContext& ClearGroup();
461
463 TaskScheduler::repeated_t GetRepeatCounter() const;
464
469 template<class Rep, class Period>
470 TaskContext& Repeat(std::chrono::duration<Rep, Period> duration)
471 {
472 AssertOnConsumed();
473
474 // Set new duration, in-context timing and increment repeat counter
475 _task->_duration = duration;
476 _task->_end += duration;
477 _task->_repeated += 1;
478 (*_consumed) = true;
479 return this->Dispatch([this](TaskScheduler& scheduler) -> TaskScheduler&
480 {
481 return scheduler.InsertTask(_task);
482 });
483 }
484
489 {
490 return Repeat(_task->_duration);
491 }
492
497 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
498 TaskContext& Repeat(std::chrono::duration<RepLeft, PeriodLeft> min,
499 std::chrono::duration<RepRight, PeriodRight> max)
500 {
501 return this->Repeat(::randtime(min, max));
502 }
503
506 TaskContext& Async(std::function<void()> const& callable);
507
512 template<class Rep, class Period>
513 TaskContext& Schedule(std::chrono::duration<Rep, Period> time,
515 {
516 auto const end = _task->_end;
517 return this->Dispatch([end, time, task = std::move(task)](TaskScheduler& scheduler) -> TaskScheduler&
518 {
519 return scheduler.ScheduleAt<Rep, Period>(end, time, std::move(task));
520 });
521 }
522
527 template<class Rep, class Period>
528 TaskContext& Schedule(std::chrono::duration<Rep, Period> time,
530 {
531 auto const end = _task->_end;
532 return this->Dispatch([end, time, group, task = std::move(task)](TaskScheduler& scheduler) -> TaskScheduler&
533 {
534 return scheduler.ScheduleAt<Rep, Period>(end, time, group, std::move(task));
535 });
536 }
537
542 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
543 TaskContext& Schedule(std::chrono::duration<RepLeft, PeriodLeft> min,
544 std::chrono::duration<RepRight, PeriodRight> max, TaskScheduler::task_handler_t task)
545 {
546 return this->Schedule(::randtime(min, max), std::move(task));
547 }
548
553 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
554 TaskContext& Schedule(std::chrono::duration<RepLeft, PeriodLeft> min,
555 std::chrono::duration<RepRight, PeriodRight> max, TaskScheduler::group_t const group,
557 {
558 return this->Schedule(::randtime(min, max), group, std::move(task));
559 }
560
563
566
569 TaskContext& CancelGroupsOf(std::vector<TaskScheduler::group_t> const& groups);
570
572 template<class Rep, class Period>
573 TaskContext& DelayAll(std::chrono::duration<Rep, Period> duration)
574 {
575 return this->Dispatch([=](TaskScheduler& scheduler) -> TaskScheduler&
576 {
577 return scheduler.DelayAll(duration);
578 });
579 }
580
582 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
583 TaskContext& DelayAll(std::chrono::duration<RepLeft, PeriodLeft> min,
584 std::chrono::duration<RepRight, PeriodRight> max)
585 {
586 return this->DelayAll(::randtime(min, max));
587 }
588
590 template<class Rep, class Period>
591 TaskContext& DelayGroup(TaskScheduler::group_t const group, std::chrono::duration<Rep, Period> duration)
592 {
593 return this->Dispatch([=](TaskScheduler& scheduler) -> TaskScheduler&
594 {
595 return scheduler.DelayGroup(group, duration);
596 });
597 }
598
600 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
602 std::chrono::duration<RepLeft, PeriodLeft> min,
603 std::chrono::duration<RepRight, PeriodRight> max)
604 {
605 return this->DelayGroup(group, ::randtime(min, max));
606 }
607
609 template<class Rep, class Period>
610 TaskContext& RescheduleAll(std::chrono::duration<Rep, Period> duration)
611 {
612 return this->Dispatch([=](TaskScheduler& scheduler) -> TaskScheduler&
613 {
614 return scheduler.RescheduleAll(duration);
615 });
616 }
617
619 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
620 TaskContext& RescheduleAll(std::chrono::duration<RepLeft, PeriodLeft> min,
621 std::chrono::duration<RepRight, PeriodRight> max)
622 {
623 return this->RescheduleAll(::randtime(min, max));
624 }
625
627 template<class Rep, class Period>
628 TaskContext& RescheduleGroup(TaskScheduler::group_t const group, std::chrono::duration<Rep, Period> duration)
629 {
630 return this->Dispatch([=](TaskScheduler& scheduler) -> TaskScheduler&
631 {
632 return scheduler.RescheduleGroup(group, duration);
633 });
634 }
635
637 template<class RepLeft, class PeriodLeft, class RepRight, class PeriodRight>
639 std::chrono::duration<RepLeft, PeriodLeft> min,
640 std::chrono::duration<RepRight, PeriodRight> max)
641 {
642 return this->RescheduleGroup(group, ::randtime(min, max));
643 }
644
645private:
647 void AssertOnConsumed() const;
648
650 void Invoke();
651};
652
653#endif
#define TC_COMMON_API
Definition: Define.h:99
uint32_t uint32
Definition: Define.h:142
static bool EmptyValidator()
Definition: MotionMaster.h:91
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
std::strong_ordering operator<=>(WowTime const &left, WowTime const &right)
Definition: WowTime.cpp:142
TaskContext & Schedule(std::chrono::duration< Rep, Period > time, TaskScheduler::task_handler_t task)
TaskContext & Schedule(std::chrono::duration< Rep, Period > time, TaskScheduler::group_t const group, TaskScheduler::task_handler_t task)
TaskContext & operator=(TaskContext &&right) noexcept
TaskContext & RescheduleAll(std::chrono::duration< Rep, Period > duration)
Reschedule all tasks with the given duration.
TaskContext & DelayGroup(TaskScheduler::group_t const group, std::chrono::duration< Rep, Period > duration)
Delays all tasks of a group with the given duration from within the context.
TaskContext & DelayGroup(TaskScheduler::group_t const group, std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Delays all tasks of a group with a random duration between min and max from within the context.
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
~TaskContext()=default
TaskContext & RescheduleAll(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Reschedule all tasks with a random duration between min and max.
TaskContext & RescheduleGroup(TaskScheduler::group_t const group, std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Reschedule all tasks of a group with a random duration between min and max.
TaskContext(TaskContext &&right) noexcept
TaskScheduler::TaskContainer _task
Associated task.
TaskContext & Schedule(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max, TaskScheduler::task_handler_t task)
std::weak_ptr< TaskScheduler > _owner
Owner.
std::shared_ptr< bool > _consumed
Marks the task as consumed.
TaskContext & operator=(TaskContext const &right)
TaskContext & RescheduleGroup(TaskScheduler::group_t const group, std::chrono::duration< Rep, Period > duration)
Reschedule all tasks of a group with the given duration.
TaskContext & DelayAll(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Delays all tasks with a random duration between min and max from within the context.
TaskContext(TaskContext const &right)
TaskContext & Repeat(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
TaskContext & DelayAll(std::chrono::duration< Rep, Period > duration)
Delays all tasks with the given duration from within the context.
TaskContext & Repeat()
TaskContext(TaskScheduler::TaskContainer &&task, std::weak_ptr< TaskScheduler > &&owner)
TaskContext & Schedule(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max, TaskScheduler::group_t const group, TaskScheduler::task_handler_t task)
void ModifyIf(std::function< bool(TaskContainer const &)> const &filter)
std::multiset< TaskContainer, Compare > container
bool IsInGroup(group_t const group) const
task_handler_t _task
Definition: TaskScheduler.h:76
Task(timepoint_t end, duration_t duration, task_handler_t task)
Definition: TaskScheduler.h:85
Optional< group_t > _group
Definition: TaskScheduler.h:74
Task(Task const &)=delete
repeated_t _repeated
Definition: TaskScheduler.h:75
Task(Task &&)=delete
Task(timepoint_t end, duration_t duration, Optional< group_t > group, repeated_t const repeated, task_handler_t task)
Definition: TaskScheduler.h:80
duration_t _duration
Definition: TaskScheduler.h:73
TaskScheduler & CancelGroup(group_t group)
TaskScheduler & CancelAll()
std::shared_ptr< Task > TaskContainer
TaskScheduler & operator=(TaskScheduler const &)=delete
TaskScheduler & RescheduleAll(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Reschedule all tasks with a random duration between min and max.
clock_t::time_point timepoint_t
Definition: TaskScheduler.h:53
TaskScheduler & ScheduleAt(timepoint_t end, std::chrono::duration< Rep, Period > time, group_t const group, task_handler_t task)
TaskScheduler & CancelGroupsOf(std::vector< group_t > const &groups)
void Dispatch(success_t const &callback)
Dispatch remaining tasks.
TaskScheduler & RescheduleAll(std::chrono::duration< Rep, Period > duration)
Reschedule all tasks with a given duration.
TaskScheduler & Schedule(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max, group_t const group, task_handler_t task)
TaskScheduler(TaskScheduler &&)=delete
std::function< void()> success_t
Definition: TaskScheduler.h:65
TaskScheduler & DelayAll(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Delays all tasks with a random duration between min and max.
TaskScheduler & DelayAll(std::chrono::duration< Rep, Period > duration)
Delays all tasks with the given duration.
TaskScheduler & Update(std::chrono::duration< Rep, Period > difftime, success_t const &callback=nullptr)
std::shared_ptr< TaskScheduler > self_reference
Contains a self reference to track if this object was deleted or not.
std::function< void(TaskContext)> task_handler_t
Definition: TaskScheduler.h:61
std::function< bool()> predicate_t
Definition: TaskScheduler.h:63
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, group_t const group, task_handler_t task)
TaskScheduler & Schedule(std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max, task_handler_t task)
~TaskScheduler()=default
AsyncHolder _asyncHolder
TaskScheduler(P &&predicate)
TaskScheduler & ScheduleAt(timepoint_t end, std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & DelayGroup(group_t const group, std::chrono::duration< Rep, Period > duration)
Delays all tasks of a group with the given duration.
predicate_t _predicate
clock_t::duration duration_t
Definition: TaskScheduler.h:54
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & InsertTask(TaskContainer task)
Insert a new task to the enqueued tasks.
TaskScheduler(TaskScheduler const &)=delete
TaskScheduler & RescheduleGroup(group_t const group, std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Reschedule all tasks of a group with a random duration between min and max.
TaskScheduler & DelayGroup(group_t const group, std::chrono::duration< RepLeft, PeriodLeft > min, std::chrono::duration< RepRight, PeriodRight > max)
Delays all tasks of a group with a random duration between min and max.
timepoint_t _now
The current time point (now)
std::queue< std::function< void()> > AsyncHolder
TaskScheduler & Async(std::function< void()> callable)
std::chrono::steady_clock clock_t
Definition: TaskScheduler.h:52
TaskScheduler & RescheduleGroup(group_t const group, std::chrono::duration< Rep, Period > duration)
Reschedule all tasks of a group with the given duration.
static bool EmptyValidator()
TaskQueue _task_holder
The Task Queue which contains all task objects.
TaskScheduler & SetValidator(P &&predicate)
Sets a validator which is asked if tasks are allowed to be executed.
uint32 repeated_t
Definition: TaskScheduler.h:59
void apply(T *val)
Definition: ByteConverter.h:41
bool operator==(unique_trackable_ptr< T1 > const &left, unique_trackable_ptr< T2 > const &right)
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:90
STL namespace.
Container which provides Task order, insert and reschedule operations.