|  | // Copyright 2018 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_H_ | 
|  | #define BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <limits> | 
|  |  | 
|  | namespace base { | 
|  | namespace sequence_manager { | 
|  |  | 
|  | namespace internal { | 
|  | class EnqueueOrderGenerator; | 
|  | } | 
|  |  | 
|  | // 64-bit number which is used to order tasks. | 
|  | // SequenceManager assumes this number will never overflow. | 
|  | class EnqueueOrder { | 
|  | public: | 
|  | EnqueueOrder() : value_(kNone) {} | 
|  | ~EnqueueOrder() = default; | 
|  |  | 
|  | static EnqueueOrder none() { return EnqueueOrder(kNone); } | 
|  | static EnqueueOrder blocking_fence() { return EnqueueOrder(kBlockingFence); } | 
|  |  | 
|  | // Returns an EnqueueOrder that compares greater than any other EnqueueOrder. | 
|  | static EnqueueOrder max() { | 
|  | return EnqueueOrder(std::numeric_limits<uint64_t>::max()); | 
|  | } | 
|  |  | 
|  | // It's okay to use EnqueueOrder in boolean expressions keeping in mind | 
|  | // that some non-zero values have a special meaning. | 
|  | operator uint64_t() const { return value_; } | 
|  |  | 
|  | static EnqueueOrder FromIntForTesting(uint64_t value) { | 
|  | return EnqueueOrder(value); | 
|  | } | 
|  |  | 
|  | private: | 
|  | // EnqueueOrderGenerator is the only class allowed to create an EnqueueOrder | 
|  | // with a non-default constructor. | 
|  | friend class internal::EnqueueOrderGenerator; | 
|  |  | 
|  | explicit EnqueueOrder(uint64_t value) : value_(value) {} | 
|  |  | 
|  | enum SpecialValues : uint64_t { | 
|  | kNone = 0, | 
|  | kBlockingFence = 1, | 
|  | kFirst = 2, | 
|  | }; | 
|  |  | 
|  | uint64_t value_; | 
|  | }; | 
|  |  | 
|  | }  // namespace sequence_manager | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_H_ |