1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/task/sequence_manager/task_order.h"
6
7 #include <functional>
8
9 #include "base/task/sequence_manager/enqueue_order.h"
10 #include "base/task/sequence_manager/tasks.h"
11
12 namespace base {
13 namespace sequence_manager {
14
15 namespace {
16
17 // Returns true iff `task_order1` Comparator{} `task_order2`. Used to
18 // implement other comparison operators.
19 template <typename Comparator>
Compare(const base::sequence_manager::TaskOrder & task_order1,const base::sequence_manager::TaskOrder & task_order2)20 static bool Compare(const base::sequence_manager::TaskOrder& task_order1,
21 const base::sequence_manager::TaskOrder& task_order2) {
22 Comparator cmp{};
23
24 if (task_order1.enqueue_order() != task_order2.enqueue_order())
25 return cmp(task_order1.enqueue_order(), task_order2.enqueue_order());
26
27 if (task_order1.delayed_run_time() != task_order2.delayed_run_time())
28 return cmp(task_order1.delayed_run_time(), task_order2.delayed_run_time());
29
30 // If the times happen to match, then we use the sequence number to decide.
31 // Compare the difference to support integer roll-over.
32 return cmp(task_order1.sequence_num() - task_order2.sequence_num(), 0);
33 }
34
35 } // namespace
36
37 // Static
CreateForTesting(EnqueueOrder enqueue_order,TimeTicks delayed_run_time,int sequence_num)38 TaskOrder TaskOrder::CreateForTesting(EnqueueOrder enqueue_order,
39 TimeTicks delayed_run_time,
40 int sequence_num) {
41 return TaskOrder(enqueue_order, delayed_run_time, sequence_num);
42 }
43
44 // Static
CreateForTesting(EnqueueOrder enqueue_order)45 TaskOrder TaskOrder::CreateForTesting(EnqueueOrder enqueue_order) {
46 return TaskOrder(enqueue_order, TimeTicks(), 0);
47 }
48
TaskOrder(EnqueueOrder enqueue_order,TimeTicks delayed_run_time,int sequence_num)49 TaskOrder::TaskOrder(EnqueueOrder enqueue_order,
50 TimeTicks delayed_run_time,
51 int sequence_num)
52 : enqueue_order_(enqueue_order),
53 delayed_run_time_(delayed_run_time),
54 sequence_num_(sequence_num) {}
55
56 TaskOrder::TaskOrder(const TaskOrder& other) = default;
57
58 TaskOrder& TaskOrder::operator=(const TaskOrder& other) = default;
59
60 TaskOrder::~TaskOrder() = default;
61
operator >(const TaskOrder & other) const62 bool TaskOrder::operator>(const TaskOrder& other) const {
63 return Compare<std::greater<>>(*this, other);
64 }
65
operator <(const TaskOrder & other) const66 bool TaskOrder::operator<(const TaskOrder& other) const {
67 return Compare<std::less<>>(*this, other);
68 }
69
operator <=(const TaskOrder & other) const70 bool TaskOrder::operator<=(const TaskOrder& other) const {
71 return Compare<std::less_equal<>>(*this, other);
72 }
73
operator >=(const TaskOrder & other) const74 bool TaskOrder::operator>=(const TaskOrder& other) const {
75 return Compare<std::greater_equal<>>(*this, other);
76 }
77
operator ==(const TaskOrder & other) const78 bool TaskOrder::operator==(const TaskOrder& other) const {
79 return enqueue_order_ == other.enqueue_order_ &&
80 delayed_run_time_ == other.delayed_run_time_ &&
81 sequence_num_ == other.sequence_num_;
82 }
83
operator !=(const TaskOrder & other) const84 bool TaskOrder::operator!=(const TaskOrder& other) const {
85 return !(*this == other);
86 }
87
88 } // namespace sequence_manager
89 } // namespace base
90