xref: /aosp_15_r20/external/cronet/base/task/sequence_manager/task_order.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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