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>
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; }
65
66// ----------------------------------------------------------------------------
67// instantiate_if
68// ----------------------------------------------------------------------------
69
76template <typename t, bool condition>
79
86template <typename 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; }
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>>; }
150
151} // namespace seqan3::detail
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
Provides platform and dependency checks.
template_t< spec_t... > type
Return type of the trait [instantiates the template arguments].
Definition lazy_conditional.hpp:55
template_t< spec_t... > type
Return type of the trait [instantiates the template arguments].
Definition lazy_conditional.hpp:101
A transformation trait that instantiates seqan3::lazy types given a boolean condition....
Definition lazy_conditional.hpp:78
typename instantiate_if< t, condition >::type instantiate_if_t
A transformation trait that instantiates seqan3::lazy types, conditionally. Transformation trait shor...
Definition lazy_conditional.hpp:110
A transformation trait that instantiates seqan3::lazy types. Base template is the identity transforma...
Definition lazy_conditional.hpp:43
typename instantiate< t >::type instantiate_t
A transformation trait that instantiates seqan3::lazy types. Transformation trait shortcut.
Definition lazy_conditional.hpp:64
Behaves like std::conditional, but instantiates types wrapped in seqan3::lazy.
Definition lazy_conditional.hpp:139
instantiate_t< std::conditional_t< decision, on_true_t, on_false_t > > lazy_conditional_t
Behaves like std::conditional_t, but instantiates types wrapped in seqan3::lazy. Transformation trait...
Definition lazy_conditional.hpp:149
An empty type whose only purpose is to hold an uninstantiated template plus its arguments.
Definition lazy_conditional.hpp:30
Hide me