llvm/lldb/include/lldb/Utility/Timeout.h

//===-- Timeout.h -----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_UTILITY_TIMEOUT_H
#define LLDB_UTILITY_TIMEOUT_H

#include "llvm/Support/Chrono.h"
#include "llvm/Support/FormatProviders.h"
#include <optional>

namespace lldb_private {

// A general purpose class for representing timeouts for various APIs. It's
// basically an std::optional<std::chrono::duration<int64_t, Ratio>>, but we
// customize it a bit to enable the standard chrono implicit conversions (e.g.
// from Timeout<std::milli> to Timeout<std::micro>.
//
// The intended meaning of the values is:
// - std::nullopt - no timeout, the call should wait forever - 0 - poll, only
// complete the call if it will not block - >0 - wait for a given number of
// units for the result
template <typename Ratio>
class Timeout : public std::optional<std::chrono::duration<int64_t, Ratio>> {};

} // namespace lldb_private

namespace llvm {
format_provider<lldb_private::Timeout<Ratio>, void>;
}

#endif // LLDB_UTILITY_TIMEOUT_H