C++ YT Wrapper
C++ library for working with YT clusters
Loading...
Searching...
No Matches
mpl.h
1#pragma once
2
3#include "fwd.h"
4
5#include <tuple>
6#include <type_traits>
7
8namespace NYT {
9
11
13
14template <class TBase, class TDerived>
15struct TIsBaseOf
16{
17 static constexpr bool Value = std::is_base_of_v<TBase, TDerived> && !std::is_same_v<TBase, TDerived>;
18};
19
21
22namespace NDetail {
23
24template <class T, class Tuple>
25struct TIndexInTuple;
26
27template <class T, class... Types>
28struct TIndexInTuple<T, std::tuple<T, Types...>>
29{
30 static constexpr int Value = 0;
31};
32
33template <class T>
34struct TIndexInTuple<T, std::tuple<>>
35{
36 static constexpr int Value = 0;
37};
38
39template <class T, class U, class... Types>
40struct TIndexInTuple<T, std::tuple<U, Types...>>
41{
42 static constexpr int Value = 1 + TIndexInTuple<T, std::tuple<Types...>>::Value;
43};
44
45template <class T, class TTuple>
46constexpr bool DoesTupleContainType = (TIndexInTuple<T, TTuple>::Value < std::tuple_size<TTuple>{});
47
48template <class TOut, class TIn = std::tuple<>>
49struct TUniqueTypes;
50
51template <class... TOut, class TInCar, class... TInCdr>
52struct TUniqueTypes<std::tuple<TOut...>, std::tuple<TInCar, TInCdr...>>
53{
54 using TType = std::conditional_t<
55 DoesTupleContainType<TInCar, std::tuple<TOut...>>,
56 typename TUniqueTypes<std::tuple<TOut...>, std::tuple<TInCdr...>>::TType,
57 typename TUniqueTypes<std::tuple<TOut..., TInCar>, std::tuple<TInCdr...>>::TType
58 >;
59};
60
61template <class TOut>
62struct TUniqueTypes<TOut, std::tuple<>>
63{
64 using TType = TOut;
65};
66
67} // namespace NDetail
68
70
72
73}
Main namespace of YT client.
Definition abortable_stream.h:7