NVIDIA DeepStream SDK API Reference

9.2 Release
includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef OTABSL_BASE_INTERNAL_INVOKE_H_
19 #define OTABSL_BASE_INTERNAL_INVOKE_H_
20 
21 #include <algorithm>
22 #include <type_traits>
23 #include <utility>
24 
25 #include "../../meta/type_traits.h"
26 
27 // The following code is internal implementation detail. See the comment at the
28 // top of this file for the API documentation.
29 
30 namespace absl {
32 namespace base_internal {
33 
34 // The five classes below each implement one of the clauses from the definition
35 // of INVOKE. The inner class template Accept<F, Args...> checks whether the
36 // clause is applicable; static function template Invoke(f, args...) does the
37 // invocation.
38 //
39 // By separating the clause selection logic from invocation we make sure that
40 // Invoke() does exactly what the standard says.
41 
42 template <typename Derived>
44  template <typename... Args>
45  struct Accept : Derived::template AcceptImpl<typename std::remove_cv<
46  typename std::remove_reference<Args>::type>::type...> {};
47 };
48 
49 // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T
50 // and t1 is an object of type T or a reference to an object of type T or a
51 // reference to an object of a type derived from T.
52 struct MemFunAndRef : StrippedAccept<MemFunAndRef> {
53  template <typename... Args>
55 
56  template <typename MemFunType, typename C, typename Obj, typename... Args>
57  struct AcceptImpl<MemFunType C::*, Obj, Args...>
58  : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
59  absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<MemFunType>::value> {
60  };
61 
62  template <typename MemFun, typename Obj, typename... Args>
63  static decltype((std::declval<Obj>().*
64  std::declval<MemFun>())(std::declval<Args>()...))
65  Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) {
66  return (std::forward<Obj>(obj).*
67  std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
68  }
69 };
70 
71 // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a
72 // class T and t1 is not one of the types described in the previous item.
73 struct MemFunAndPtr : StrippedAccept<MemFunAndPtr> {
74  template <typename... Args>
76 
77  template <typename MemFunType, typename C, typename Ptr, typename... Args>
78  struct AcceptImpl<MemFunType C::*, Ptr, Args...>
79  : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
80  absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<MemFunType>::value> {
81  };
82 
83  template <typename MemFun, typename Ptr, typename... Args>
84  static decltype(((*std::declval<Ptr>()).*
85  std::declval<MemFun>())(std::declval<Args>()...))
86  Invoke(MemFun&& mem_fun, Ptr&& ptr, Args&&... args) {
87  return ((*std::forward<Ptr>(ptr)).*
88  std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
89  }
90 };
91 
92 // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is
93 // an object of type T or a reference to an object of type T or a reference
94 // to an object of a type derived from T.
95 struct DataMemAndRef : StrippedAccept<DataMemAndRef> {
96  template <typename... Args>
98 
99  template <typename R, typename C, typename Obj>
100  struct AcceptImpl<R C::*, Obj>
101  : std::integral_constant<bool, std::is_base_of<C, Obj>::value &&
102  !absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<R>::value> {};
103 
104  template <typename DataMem, typename Ref>
105  static decltype(std::declval<Ref>().*std::declval<DataMem>()) Invoke(
106  DataMem&& data_mem, Ref&& ref) {
107  return std::forward<Ref>(ref).*std::forward<DataMem>(data_mem);
108  }
109 };
110 
111 // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1
112 // is not one of the types described in the previous item.
113 struct DataMemAndPtr : StrippedAccept<DataMemAndPtr> {
114  template <typename... Args>
116 
117  template <typename R, typename C, typename Ptr>
118  struct AcceptImpl<R C::*, Ptr>
119  : std::integral_constant<bool, !std::is_base_of<C, Ptr>::value &&
120  !absl::OTABSL_OPTION_NAMESPACE_NAME::is_function<R>::value> {};
121 
122  template <typename DataMem, typename Ptr>
123  static decltype((*std::declval<Ptr>()).*std::declval<DataMem>()) Invoke(
124  DataMem&& data_mem, Ptr&& ptr) {
125  return (*std::forward<Ptr>(ptr)).*std::forward<DataMem>(data_mem);
126  }
127 };
128 
129 // f(t1, t2, ..., tN) in all other cases.
130 struct Callable {
131  // Callable doesn't have Accept because it's the last clause that gets picked
132  // when none of the previous clauses are applicable.
133  template <typename F, typename... Args>
134  static decltype(std::declval<F>()(std::declval<Args>()...)) Invoke(
135  F&& f, Args&&... args) {
136  return std::forward<F>(f)(std::forward<Args>(args)...);
137  }
138 };
139 
140 // Resolves to the first matching clause.
141 template <typename... Args>
142 struct Invoker {
143  typedef typename std::conditional<
144  MemFunAndRef::Accept<Args...>::value, MemFunAndRef,
145  typename std::conditional<
146  MemFunAndPtr::Accept<Args...>::value, MemFunAndPtr,
147  typename std::conditional<
148  DataMemAndRef::Accept<Args...>::value, DataMemAndRef,
149  typename std::conditional<DataMemAndPtr::Accept<Args...>::value,
151  type>::type type;
152 };
153 
154 // The result type of Invoke<F, Args...>.
155 template <typename F, typename... Args>
157  std::declval<F>(), std::declval<Args>()...));
158 
159 // Invoke(f, args...) is an implementation of INVOKE(f, args...) from section
160 // [func.require] of the C++ standard.
161 template <typename F, typename... Args>
162 InvokeT<F, Args...> Invoke(F&& f, Args&&... args) {
163  return Invoker<F, Args...>::type::Invoke(std::forward<F>(f),
164  std::forward<Args>(args)...);
165 }
166 
167 } // namespace base_internal
169 } // namespace absl
170 
171 #endif // OTABSL_BASE_INTERNAL_INVOKE_H_
absl::base_internal::DataMemAndPtr::AcceptImpl
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:115
half_float::detail::false_type
bool_type< false > false_type
Definition: includes/half.hpp:489
absl::base_internal::MemFunAndPtr::Invoke
static decltype(((*std::declval< Ptr >()).*std::declval< MemFun >())(std::declval< Args >()...)) Invoke(MemFun &&mem_fun, Ptr &&ptr, Args &&... args)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:86
absl::base_internal::InvokeT
decltype(Invoker< F, Args... >::type::Invoke(std::declval< F >(), std::declval< Args >()...)) InvokeT
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:157
absl::base_internal::DataMemAndRef::AcceptImpl
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:97
absl::base_internal::Invoke
InvokeT< F, Args... > Invoke(F &&f, Args &&... args)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:162
absl::base_internal::MemFunAndPtr
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:73
absl::base_internal::DataMemAndRef
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:95
absl::base_internal::DataMemAndPtr::Invoke
static decltype((*std::declval< Ptr >()).*std::declval< DataMem >() Invoke)(DataMem &&data_mem, Ptr &&ptr)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:123
OTABSL_NAMESPACE_BEGIN
#define OTABSL_NAMESPACE_BEGIN
Definition: includes/opentelemetry/nostd/internal/absl/base/config.h:91
absl::base_internal::MemFunAndRef::Invoke
static decltype((std::declval< Obj >().*std::declval< MemFun >())(std::declval< Args >()...)) Invoke(MemFun &&mem_fun, Obj &&obj, Args &&... args)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:65
absl::base_internal::Invoker
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:142
absl::base_internal::MemFunAndRef
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:52
absl::base_internal::MemFunAndRef::AcceptImpl
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:54
absl::base_internal::DataMemAndRef::Invoke
static decltype(std::declval< Ref >().*std::declval< DataMem >()) Invoke(DataMem &&data_mem, Ref &&ref)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:105
absl::base_internal::StrippedAccept
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:43
absl::base_internal::Callable
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:130
absl::base_internal::StrippedAccept::Accept
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:45
absl::base_internal::Invoker::type
std::conditional< MemFunAndRef::Accept< Args... >::value, MemFunAndRef, typename std::conditional< MemFunAndPtr::Accept< Args... >::value, MemFunAndPtr, typename std::conditional< DataMemAndRef::Accept< Args... >::value, DataMemAndRef, typename std::conditional< DataMemAndPtr::Accept< Args... >::value, DataMemAndPtr, Callable >::type >::type >::type >::type type
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:151
ds3d::Ptr
ShrdPtr< T > Ptr
Definition: includes/ds3d/common/hpp/obj.hpp:37
absl::base_internal::DataMemAndPtr
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:113
absl
Definition: includes/opentelemetry/nostd/variant.h:54
OTABSL_NAMESPACE_END
#define OTABSL_NAMESPACE_END
Definition: includes/opentelemetry/nostd/internal/absl/base/config.h:92
absl::base_internal::Callable::Invoke
static decltype(std::declval< F >()(std::declval< Args >()...)) Invoke(F &&f, Args &&... args)
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:134
absl::base_internal::MemFunAndPtr::AcceptImpl
Definition: includes/opentelemetry/nostd/internal/absl/base/internal/invoke.h:75