2020-01-18 05:38:21 -03:00
|
|
|
/*
|
2024-10-04 08:19:50 -03:00
|
|
|
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
|
2020-01-18 05:38:21 -03:00
|
|
|
*
|
2021-04-22 05:24:48 -03:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2020-01-18 05:38:21 -03:00
|
|
|
*/
|
|
|
|
|
|
2019-01-30 15:26:19 -02:00
|
|
|
#pragma once
|
|
|
|
|
|
2024-11-15 19:55:59 -03:00
|
|
|
#include <AK/Noncopyable.h>
|
2022-11-26 08:18:30 -03:00
|
|
|
#include <AK/Platform.h>
|
2026-06-10 08:04:27 -03:00
|
|
|
#include <AK/StdLibExtraDetails.h>
|
2022-11-26 08:18:30 -03:00
|
|
|
|
2019-06-12 03:47:51 -03:00
|
|
|
namespace AK {
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
namespace Detail {
|
|
|
|
|
|
|
|
|
|
template<typename AuthorizedType, typename BadgeType>
|
|
|
|
|
inline constexpr bool IsBadgeType = IsSame<AuthorizedType, BadgeType>
|
|
|
|
|
|| IsBaseOf<AuthorizedType, BadgeType>;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
template<typename...>
|
|
|
|
|
class Badge;
|
|
|
|
|
|
2019-01-30 15:26:19 -02:00
|
|
|
template<typename T>
|
2026-06-10 08:00:44 -03:00
|
|
|
class Badge<T> {
|
2024-11-15 19:55:59 -03:00
|
|
|
AK_MAKE_NONCOPYABLE(Badge);
|
|
|
|
|
AK_MAKE_NONMOVABLE(Badge);
|
|
|
|
|
|
2021-01-14 15:12:44 -03:00
|
|
|
public:
|
|
|
|
|
using Type = T;
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
// Friendship is not inherited, so derived classes mint Badge<Derived> and
|
|
|
|
|
// convert it to Badge<Base>.
|
|
|
|
|
template<typename U>
|
|
|
|
|
requires(IsBaseOf<T, U> && !IsSame<T, U>)
|
|
|
|
|
constexpr Badge(Badge<U> const&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-14 15:12:44 -03:00
|
|
|
private:
|
2019-01-30 15:26:19 -02:00
|
|
|
friend T;
|
2021-01-10 20:29:28 -03:00
|
|
|
constexpr Badge() = default;
|
2019-01-30 15:26:19 -02:00
|
|
|
};
|
2019-06-12 03:47:51 -03:00
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
// FIXME: These overloads are all because compiler support for `friend Ts...;` is limited.
|
|
|
|
|
// Once compilers can do that, we should only need a single variadic template.
|
|
|
|
|
template<typename T, typename U>
|
|
|
|
|
class Badge<T, U> {
|
|
|
|
|
AK_MAKE_NONCOPYABLE(Badge);
|
|
|
|
|
AK_MAKE_NONMOVABLE(Badge);
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
public:
|
|
|
|
|
template<typename V>
|
|
|
|
|
requires(Detail::IsBadgeType<T, V> || Detail::IsBadgeType<U, V>)
|
|
|
|
|
constexpr Badge(Badge<V> const&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
private:
|
|
|
|
|
friend T;
|
|
|
|
|
friend U;
|
|
|
|
|
constexpr Badge() = default;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<typename T, typename U, typename V>
|
|
|
|
|
class Badge<T, U, V> {
|
|
|
|
|
AK_MAKE_NONCOPYABLE(Badge);
|
|
|
|
|
AK_MAKE_NONMOVABLE(Badge);
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
public:
|
|
|
|
|
template<typename W>
|
|
|
|
|
requires(Detail::IsBadgeType<T, W> || Detail::IsBadgeType<U, W>
|
|
|
|
|
|| Detail::IsBadgeType<V, W>)
|
|
|
|
|
constexpr Badge(Badge<W> const&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
private:
|
|
|
|
|
friend T;
|
|
|
|
|
friend U;
|
|
|
|
|
friend V;
|
|
|
|
|
constexpr Badge() = default;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<typename T, typename U, typename V, typename W>
|
|
|
|
|
class Badge<T, U, V, W> {
|
|
|
|
|
AK_MAKE_NONCOPYABLE(Badge);
|
|
|
|
|
AK_MAKE_NONMOVABLE(Badge);
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
public:
|
|
|
|
|
template<typename X>
|
|
|
|
|
requires(Detail::IsBadgeType<T, X> || Detail::IsBadgeType<U, X>
|
|
|
|
|
|| Detail::IsBadgeType<V, X> || Detail::IsBadgeType<W, X>)
|
|
|
|
|
constexpr Badge(Badge<X> const&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
private:
|
|
|
|
|
friend T;
|
|
|
|
|
friend U;
|
|
|
|
|
friend V;
|
|
|
|
|
friend W;
|
|
|
|
|
constexpr Badge() = default;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<typename T, typename U, typename V, typename W, typename X>
|
|
|
|
|
class Badge<T, U, V, W, X> {
|
|
|
|
|
AK_MAKE_NONCOPYABLE(Badge);
|
|
|
|
|
AK_MAKE_NONMOVABLE(Badge);
|
|
|
|
|
|
2026-06-10 08:04:27 -03:00
|
|
|
public:
|
|
|
|
|
template<typename Y>
|
|
|
|
|
requires(Detail::IsBadgeType<T, Y> || Detail::IsBadgeType<U, Y>
|
|
|
|
|
|| Detail::IsBadgeType<V, Y> || Detail::IsBadgeType<W, Y>
|
|
|
|
|
|| Detail::IsBadgeType<X, Y>)
|
|
|
|
|
constexpr Badge(Badge<Y> const&)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-10 08:00:44 -03:00
|
|
|
private:
|
|
|
|
|
friend T;
|
|
|
|
|
friend U;
|
|
|
|
|
friend V;
|
|
|
|
|
friend W;
|
|
|
|
|
friend X;
|
|
|
|
|
constexpr Badge() = default;
|
|
|
|
|
};
|
|
|
|
|
|
2019-06-12 03:47:51 -03:00
|
|
|
}
|
|
|
|
|
|
2022-11-26 08:18:30 -03:00
|
|
|
#if USING_AK_GLOBALLY
|
2019-06-12 03:47:51 -03:00
|
|
|
using AK::Badge;
|
2022-11-26 08:18:30 -03:00
|
|
|
#endif
|