Zivid C++ API  2.4.2+1a2e8cfb-1
Defining the Future of 3D Machine Vision
TypeTraits.h
Go to the documentation of this file.
1 
2 
3 /*******************************************************************************
4 
5  * This file is part of the Zivid 3D Camera API
6 
7  *
8 
9  * Copyright 2015-2021 (C) Zivid AS
10 
11  * All rights reserved.
12 
13  *
14 
15  * Zivid Software License, v1.0
16 
17  *
18 
19  * Redistribution and use in source and binary forms, with or without
20 
21  * modification, are permitted provided that the following conditions are met:
22 
23  *
24 
25  * 1. Redistributions of source code must retain the above copyright notice,
26 
27  * this list of conditions and the following disclaimer.
28 
29  *
30 
31  * 2. Redistributions in binary form must reproduce the above copyright notice,
32 
33  * this list of conditions and the following disclaimer in the documentation
34 
35  * and/or other materials provided with the distribution.
36 
37  *
38 
39  * 3. Neither the name of Zivid AS nor the names of its contributors may be used
40 
41  * to endorse or promote products derived from this software without specific
42 
43  * prior written permission.
44 
45  *
46 
47  * 4. This software, with or without modification, must not be used with any
48 
49  * other 3D camera than from Zivid AS.
50 
51  *
52 
53  * 5. Any software provided in binary form under this license must not be
54 
55  * reverse engineered, decompiled, modified and/or disassembled.
56 
57  *
58 
59  * THIS SOFTWARE IS PROVIDED BY ZIVID AS "AS IS" AND ANY EXPRESS OR IMPLIED
60 
61  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
62 
63  * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
64 
65  * DISCLAIMED. IN NO EVENT SHALL ZIVID AS OR CONTRIBUTORS BE LIABLE FOR ANY
66 
67  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68 
69  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
70 
71  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
72 
73  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
74 
75  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
76 
77  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
78 
79  *
80 
81  * Contact: Zivid Customer Success Team <customersuccess@zivid.com>
82 
83  * Info: http://www.zivid.com
84 
85  ******************************************************************************/
86 
87 
88 
89 #pragma once
90 
91 #include <type_traits>
92 #include <utility>
93 
94 namespace Zivid
95 {
96 #ifndef NO_DOC
98  namespace Detail
99  {
100  namespace TypeTraits
101  {
102  // This file is intended to be used in public headers only. Internally use
103  // Traits.h exclusively (the traits in this file are available via Traits.h)
104 
105  template<typename T, typename...>
106  struct IsInList : std::false_type
107  {};
108 
109  template<typename T, typename First, typename... Rest>
110  struct IsInList<T, First, Rest...>
111  : std::integral_constant<bool, std::is_same<T, First>::value || IsInList<T, Rest...>::value>
112  {};
113 
114  template<typename T, typename Tuple>
115  struct IsInTuple;
116 
117  template<typename T, typename... Ts>
118  struct IsInTuple<T, std::tuple<Ts...>> : IsInList<T, Ts...>
119  {};
120 
121  template<typename Tuple, typename... Args>
122  struct AllArgsAreInTuple : std::true_type
123  {};
124 
125  template<typename Tuple, typename Arg, typename... Args>
126  struct AllArgsAreInTuple<Tuple, Arg, Args...>
127  : std::integral_constant<bool, IsInTuple<Arg, Tuple>::value && AllArgsAreInTuple<Tuple, Args...>::value>
128  {};
129 
130  template<typename... Args>
131  struct AllArgsDecayedAreUnique : std::true_type
132  {};
133 
134  template<typename Head, typename... Tail>
135  struct AllArgsDecayedAreUnique<Head, Tail...>
136  : std::integral_constant<
137  bool,
138  !IsInList<typename std::decay<Head>::type, typename std::decay<Tail>::type...>::value
139  && AllArgsDecayedAreUnique<Tail...>::value>
140  {};
141 
142  template<typename... Ts>
143  struct Concatenate;
144 
145  template<typename... T1s, typename... T2s, typename... Rest>
146  struct Concatenate<std::tuple<T1s...>, std::tuple<T2s...>, Rest...>
147  : Concatenate<std::tuple<T1s..., T2s...>, Rest...>
148  {};
149 
150  template<typename... T1s>
151  struct Concatenate<std::tuple<T1s...>>
152  {
153  using Type = std::tuple<T1s...>;
154  };
155 
156  template<typename T>
157  struct TypeIdentity
158  {
159  using Type = T;
160  };
161  } // namespace TypeTraits
162  } // namespace Detail
163 #endif
164 } // namespace Zivid
The main Zivid namespace. All Zivid code is found here
Definition: Application.h:99