Loading [MathJax]/extensions/tex2jax.js
Iros
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
Loading...
Searching...
No Matches
tuple_like.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/algorithm.h"
4#include "di/meta/core.h"
5#include "di/meta/vocab.h"
6#include "di/util/as_const.h"
7#include "di/util/forward.h"
8#include "di/util/get.h"
9#include "di/util/move.h"
12
13namespace di::concepts {
14namespace detail {
15 template<typename T, typename Indices>
17
18 template<typename T, types::size_t index>
19 concept HasTupleElement = requires { typename meta::TupleElement<T, index>; };
20
21 template<typename T, types::size_t index>
22 concept HasTupleGet = requires(T tuple) {
23 util::get<index>(tuple);
24 util::get<index>(util::as_const(tuple));
25 util::get<index>(util::move(tuple));
26 util::get<index>(util::move(util::as_const(tuple)));
27 };
28
29 template<typename T, types::size_t... indices>
30 struct TupleLikeHelper<T, meta::ListV<indices...>> {
31 constexpr static bool value = ((HasTupleElement<T, indices> && HasTupleGet<T, indices>) && ...);
32 };
33}
34
35// NOTE: The TupleSize must be less than 256 in this definition because clang has a maximum limit of 256 when expanding
36// fold expressions. This can happen in reasonable scenarios because a fixed-size array is a tuple-like type.
37template<typename T>
38concept TupleLike =
39 concepts::Tuple<T> || (requires {
42}
Definition tuple_like.h:38
Definition vocab.h:149
Definition tuple_like.h:19
Definition tuple_like.h:22
Definition impl.h:7
Definition any_storable.h:9
Definition merge_interfaces.h:6
constexpr auto TupleSize
Definition tuple_size.h:23
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
decltype(vocab::tuple_element(types::in_place_type< meta::RemoveReference< T > >, c_< index >))::Type TupleElement
Definition tuple_element.h:21
constexpr auto in_place_type
Definition in_place_type.h:12
std::size_t size_t
Definition size_t.h:12
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto tuple_size
Definition tuple_size.h:17
Definition tuple_like.h:16
static constexpr bool value
Definition tuple_like.h:31