SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
Loading...
Searching...
No Matches
lazy_conditional.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2006-2024 Knut Reinert & Freie Universität Berlin
2// SPDX-FileCopyrightText: 2016-2024 Knut Reinert & MPI für molekulare Genetik
3// SPDX-License-Identifier: BSD-3-Clause
4
10#pragma once
11
12#include <type_traits>
13
15
16namespace seqan3::detail
17{
18
19// ----------------------------------------------------------------------------
20// lazy
21// ----------------------------------------------------------------------------
22
28template <template <typename...> typename template_t, typename... spec_t>
29struct lazy
30{};
31
32// ----------------------------------------------------------------------------
33// instantiate
34// ----------------------------------------------------------------------------
35
41template <typename t>
42struct instantiate : std::type_identity<t>
43{};
44
51template <template <typename...> typename template_t, typename... spec_t>
52struct instantiate<lazy<template_t, spec_t...>>
53{
55 using type = template_t<spec_t...>;
56};
57
62template <typename t>
63 requires requires { typename instantiate<t>::type; }
64using instantiate_t = typename instantiate<t>::type;
65
66// ----------------------------------------------------------------------------
67// instantiate_if
68// ----------------------------------------------------------------------------
69
76template <typename t, bool condition>
77struct instantiate_if : std::false_type
78{};
79
86template <typename t>
87struct instantiate_if<t, true> : std::type_identity<t>
88{};
89
97template <template <typename...> typename template_t, typename... spec_t>
98struct instantiate_if<lazy<template_t, spec_t...>, true>
99{
101 using type = template_t<spec_t...>;
102};
103
108template <typename t, bool condition>
109 requires requires { typename instantiate_if<t, condition>::type; }
110using instantiate_if_t = typename instantiate_if<t, condition>::type;
111
116template <typename t, bool condition>
117 requires requires { instantiate_if_t<t, condition>::value; }
118inline constexpr auto instantiate_if_v = instantiate_if_t<t, condition>::value;
119
120// ----------------------------------------------------------------------------
121// lazy_conditional
122// ----------------------------------------------------------------------------
123
137template <bool decision, typename on_true_t, typename on_false_t>
138struct lazy_conditional : instantiate<std::conditional_t<decision, on_true_t, on_false_t>>
139{};
140
147template <bool decision, typename on_true_t, typename on_false_t>
148 requires requires { typename instantiate_t<std::conditional_t<decision, on_true_t, on_false_t>>; }
149using lazy_conditional_t = instantiate_t<std::conditional_t<decision, on_true_t, on_false_t>>;
150
151} // namespace seqan3::detail
Provides platform and dependency checks.
Hide me