// 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 #include 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::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_