mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-06 22:48:25 +01:00
Squashed 'externals/mcl/' content from commit a86a53843
git-subtree-dir: externals/mcl git-subtree-split: a86a53843f82e4d6ca2f2e1437824495acad2712
This commit is contained in:
commit
7eb1d05f63
70 changed files with 2902 additions and 0 deletions
19
include/mcl/mp/metavalue/bit_and.hpp
Normal file
19
include/mcl/mp/metavalue/bit_and.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Bitwise and of metavalues Vs
|
||||
template<class... Vs>
|
||||
using bit_and = lift_value<(Vs::value & ...)>;
|
||||
|
||||
/// Bitwise and of metavalues Vs
|
||||
template<class... Vs>
|
||||
constexpr auto bit_and_v = (Vs::value & ...);
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/bit_not.hpp
Normal file
19
include/mcl/mp/metavalue/bit_not.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Bitwise not of metavalue V
|
||||
template<class V>
|
||||
using bit_not = lift_value<~V::value>;
|
||||
|
||||
/// Bitwise not of metavalue V
|
||||
template<class V>
|
||||
constexpr auto bit_not_v = ~V::value;
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/bit_or.hpp
Normal file
19
include/mcl/mp/metavalue/bit_or.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Bitwise or of metavalues Vs
|
||||
template<class... Vs>
|
||||
using bit_or = lift_value<(Vs::value | ...)>;
|
||||
|
||||
/// Bitwise or of metavalues Vs
|
||||
template<class... Vs>
|
||||
constexpr auto bit_or_v = (Vs::value | ...);
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/bit_xor.hpp
Normal file
19
include/mcl/mp/metavalue/bit_xor.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Bitwise xor of metavalues Vs
|
||||
template<class... Vs>
|
||||
using bit_xor = lift_value<(Vs::value ^ ...)>;
|
||||
|
||||
/// Bitwise xor of metavalues Vs
|
||||
template<class... Vs>
|
||||
constexpr auto bit_xor_v = (Vs::value ^ ...);
|
||||
|
||||
} // namespace mcl::mp
|
||||
42
include/mcl/mp/metavalue/conjunction.hpp
Normal file
42
include/mcl/mp/metavalue/conjunction.hpp
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/logic_if.hpp"
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template<class...>
|
||||
struct conjunction_impl;
|
||||
|
||||
template<>
|
||||
struct conjunction_impl<> {
|
||||
using type = false_type;
|
||||
};
|
||||
|
||||
template<class V>
|
||||
struct conjunction_impl<V> {
|
||||
using type = V;
|
||||
};
|
||||
|
||||
template<class V1, class... Vs>
|
||||
struct conjunction_impl<V1, Vs...> {
|
||||
using type = logic_if<V1, typename conjunction_impl<Vs...>::type, V1>;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/// Conjunction of metavalues Vs with short-circuiting and type preservation.
|
||||
template<class... Vs>
|
||||
using conjunction = typename detail::conjunction_impl<Vs...>::type;
|
||||
|
||||
/// Conjunction of metavalues Vs with short-circuiting and type preservation.
|
||||
template<class... Vs>
|
||||
constexpr auto conjunction_v = conjunction<Vs...>::value;
|
||||
|
||||
} // namespace mcl::mp
|
||||
42
include/mcl/mp/metavalue/disjunction.hpp
Normal file
42
include/mcl/mp/metavalue/disjunction.hpp
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/logic_if.hpp"
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template<class...>
|
||||
struct disjunction_impl;
|
||||
|
||||
template<>
|
||||
struct disjunction_impl<> {
|
||||
using type = false_type;
|
||||
};
|
||||
|
||||
template<class V>
|
||||
struct disjunction_impl<V> {
|
||||
using type = V;
|
||||
};
|
||||
|
||||
template<class V1, class... Vs>
|
||||
struct disjunction_impl<V1, Vs...> {
|
||||
using type = logic_if<V1, V1, typename disjunction_impl<Vs...>::type>;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/// Disjunction of metavalues Vs with short-circuiting and type preservation.
|
||||
template<class... Vs>
|
||||
using disjunction = typename detail::disjunction_impl<Vs...>::type;
|
||||
|
||||
/// Disjunction of metavalues Vs with short-circuiting and type preservation.
|
||||
template<class... Vs>
|
||||
constexpr auto disjunction_v = disjunction<Vs...>::value;
|
||||
|
||||
} // namespace mcl::mp
|
||||
15
include/mcl/mp/metavalue/lift_value.hpp
Normal file
15
include/mcl/mp/metavalue/lift_value.hpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Lifts a value into a type (a metavalue)
|
||||
template<auto V>
|
||||
using lift_value = std::integral_constant<decltype(V), V>;
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/logic_and.hpp
Normal file
19
include/mcl/mp/metavalue/logic_and.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Logical conjunction of metavalues Vs without short-circuiting or type presevation.
|
||||
template<class... Vs>
|
||||
using logic_and = bool_value<(true && ... && Vs::value)>;
|
||||
|
||||
/// Logical conjunction of metavalues Vs without short-circuiting or type presevation.
|
||||
template<class... Vs>
|
||||
constexpr bool logic_and_v = (true && ... && Vs::value);
|
||||
|
||||
} // namespace mcl::mp
|
||||
21
include/mcl/mp/metavalue/logic_if.hpp
Normal file
21
include/mcl/mp/metavalue/logic_if.hpp
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Conditionally select between types T and F based on boolean metavalue V
|
||||
template<class V, class T, class F>
|
||||
using logic_if = std::conditional_t<bool(V::value), T, F>;
|
||||
|
||||
/// Conditionally select between metavalues T and F based on boolean metavalue V
|
||||
template<class V, class TV, class FV>
|
||||
constexpr auto logic_if_v = logic_if<V, TV, FV>::value;
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/logic_not.hpp
Normal file
19
include/mcl/mp/metavalue/logic_not.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Logical negation of metavalue V.
|
||||
template<class V>
|
||||
using logic_not = bool_value<!bool(V::value)>;
|
||||
|
||||
/// Logical negation of metavalue V.
|
||||
template<class V>
|
||||
constexpr bool logic_not_v = !bool(V::value);
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/logic_or.hpp
Normal file
19
include/mcl/mp/metavalue/logic_or.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Logical disjunction of metavalues Vs without short-circuiting or type presevation.
|
||||
template<class... Vs>
|
||||
using logic_or = bool_value<(false || ... || Vs::value)>;
|
||||
|
||||
/// Logical disjunction of metavalues Vs without short-circuiting or type presevation.
|
||||
template<class... Vs>
|
||||
constexpr bool logic_or_v = (false || ... || Vs::value);
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/product.hpp
Normal file
19
include/mcl/mp/metavalue/product.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Product of metavalues Vs
|
||||
template<class... Vs>
|
||||
using product = lift_value<(Vs::value * ...)>;
|
||||
|
||||
/// Product of metavalues Vs
|
||||
template<class... Vs>
|
||||
constexpr auto product_v = (Vs::value * ...);
|
||||
|
||||
} // namespace mcl::mp
|
||||
19
include/mcl/mp/metavalue/sum.hpp
Normal file
19
include/mcl/mp/metavalue/sum.hpp
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "mcl/mp/metavalue/lift_value.hpp"
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Sum of metavalues Vs
|
||||
template<class... Vs>
|
||||
using sum = lift_value<(Vs::value + ...)>;
|
||||
|
||||
/// Sum of metavalues Vs
|
||||
template<class... Vs>
|
||||
constexpr auto sum_v = (Vs::value + ...);
|
||||
|
||||
} // namespace mcl::mp
|
||||
30
include/mcl/mp/metavalue/value.hpp
Normal file
30
include/mcl/mp/metavalue/value.hpp
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// A metavalue (of type VT and value v).
|
||||
template<class VT, VT v>
|
||||
using value = std::integral_constant<VT, v>;
|
||||
|
||||
/// A metavalue of type size_t (and value v).
|
||||
template<size_t v>
|
||||
using size_value = value<size_t, v>;
|
||||
|
||||
/// A metavalue of type bool (and value v). (Aliases to std::bool_constant.)
|
||||
template<bool v>
|
||||
using bool_value = value<bool, v>;
|
||||
|
||||
/// true metavalue (Aliases to std::true_type).
|
||||
using true_type = bool_value<true>;
|
||||
|
||||
/// false metavalue (Aliases to std::false_type).
|
||||
using false_type = bool_value<false>;
|
||||
|
||||
} // namespace mcl::mp
|
||||
15
include/mcl/mp/metavalue/value_cast.hpp
Normal file
15
include/mcl/mp/metavalue/value_cast.hpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Casts a metavalue from one type to another
|
||||
template<class T, class V>
|
||||
using value_cast = std::integral_constant<T, static_cast<T>(V::value)>;
|
||||
|
||||
} // namespace mcl::mp
|
||||
15
include/mcl/mp/metavalue/value_equal.hpp
Normal file
15
include/mcl/mp/metavalue/value_equal.hpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// This file is part of the mcl project.
|
||||
// Copyright (c) 2022 merryhime
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace mcl::mp {
|
||||
|
||||
/// Do two metavalues contain the same value?
|
||||
template<class V1, class V2>
|
||||
using value_equal = std::bool_constant<V1::value == V2::value>;
|
||||
|
||||
} // namespace mcl::mp
|
||||
Loading…
Add table
Add a link
Reference in a new issue