blob: b78875b0f0d2ae26ceb9a4c7fd5b506f03e77885 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBHWSEC_FOUNDATION_SIGNATURE_TRAITS_H_
#define LIBHWSEC_FOUNDATION_SIGNATURE_TRAITS_H_
#include <functional>
#include <tuple>
#include <type_traits>
#include <base/callback.h>
namespace hwsec_foundation {
template <class Signature>
struct signature_trait;
template <class ReturnType, class... Args>
struct signature_trait<ReturnType(Args...)> {
using type = std::tuple<ReturnType, Args...>;
};
template <class ReturnType, class... Args>
struct signature_trait<ReturnType (*)(Args...)> {
using type = std::tuple<ReturnType, Args...>;
};
template <class ReturnType, class C, class... Args>
struct signature_trait<ReturnType (C::*)(Args...)> {
using type = std::tuple<ReturnType, Args...>;
};
template <class ReturnType, class... Args>
struct signature_trait<std::function<ReturnType(Args...)>> {
using type = std::tuple<ReturnType, Args...>;
};
template <class ReturnType, class... Args>
struct signature_trait<base::RepeatingCallback<ReturnType(Args...)>> {
using type = std::tuple<ReturnType, Args...>;
};
template <class ReturnType, class... Args>
struct signature_trait<base::OnceCallback<ReturnType(Args...)>> {
using type = std::tuple<ReturnType, Args...>;
};
template <class Signature>
using signature_trait_t = typename signature_trait<Signature>::type;
template <class Signature1, class Signature2>
using is_same_signature =
std::is_same<signature_trait_t<Signature1>, signature_trait_t<Signature2>>;
template <class Signature1, class Signature2>
constexpr bool is_same_signature_v =
is_same_signature<Signature1, Signature2>::value;
} // namespace hwsec_foundation
#endif // LIBHWSEC_FOUNDATION_SIGNATURE_TRAITS_H_