ALib C++ Library
Library Version: 2402 R1
Documentation generated by doxygen
Loading...
Searching...
No Matches
vtable.inl
Go to the documentation of this file.
1/** ************************************************************************************************
2 * \file
3 * This header file is part of module \alib_boxing of the \aliblong.
4 *
5 * \emoji :copyright: 2013-2024 A-Worx GmbH, Germany.
6 * Published under \ref mainpage_license "Boost Software License".
7 **************************************************************************************************/
8#ifndef HPP_ALIB_BOXING_DETAIL_VTABLE
9#define HPP_ALIB_BOXING_DETAIL_VTABLE 1
10
11#if !defined(HPP_ALIB_BOXING_BOXING)
12# error "ALib sources with ending '.inl' must not be included from outside."
13#endif
14
15namespace alib { namespace boxing {
16
17/**
18 * This namespace implements internals of namespace #alib::boxing.
19 */
20namespace detail {
21
22/** ************************************************************************************************
23 * This struct is used internally with \alib_boxing_nl to provide run-time type information
24 * and virtual method invocations to boxed values.
25 * A singleton instance of a derived type of this class is attached to each \alib{boxing;Box}.
26 * Such derived type is generated using templated derived struct \alib{boxing::detail;VTable}.
27 **************************************************************************************************/
29{
30 // #############################################################################################
31 // Fields
32 // #############################################################################################
33 FHashcode ::Signature fHashcode = nullptr; ///< Entry for built-in function \alib{boxing;FHashcode}.
34 FIsNotNull ::Signature fIsNotNull= nullptr; ///< Entry for built-in function \alib{boxing;FIsNotNull}.
35 FEquals ::Signature fEquals = nullptr; ///< Entry for built-in function \alib{boxing;FEquals}.
36 FIsLess ::Signature fIsLess = nullptr; ///< Entry for built-in function \alib{boxing;FIsLess}.
37 FIsTrue ::Signature fIsTrue = nullptr; ///< Entry for built-in function \alib{boxing;FIsTrue}.
38#if ALIB_MONOMEM
39 FClone ::Signature fClone = nullptr; ///< Entry for built-in function \alib{boxing;FClone}.
40#endif
41#if ALIB_STRINGS
42 FAppend<character>::Signature fAppend = nullptr; ///< Entry for built-in function \alib{boxing;FAppend;FAppend<character>}.
43#endif
44#if ALIB_DEBUG
45 mutable uinteger DbgCntInvocationsFHashcode =0; ///< Debug-compilation counter for the number of invocations.
46 mutable uinteger DbgCntInvocationsFIsNotNull=0; ///< Debug-compilation counter for the number of invocations.
47 mutable uinteger DbgCntInvocationsFEquals =0; ///< Debug-compilation counter for the number of invocations.
48 mutable uinteger DbgCntInvocationsFIsLess =0; ///< Debug-compilation counter for the number of invocations.
49 mutable uinteger DbgCntInvocationsFIsTrue =0; ///< Debug-compilation counter for the number of invocations.
50 #if ALIB_MONOMEM
51 mutable uinteger DbgCntInvocationsFClone =0; ///< Debug-compilation counter for the number of invocations.
52 #endif
53 #if ALIB_STRINGS
54 mutable uinteger DbgCntInvocationsFAppend =0; ///< Debug-compilation counter for the number of invocations.
55 #endif
56#endif
57
58 // #############################################################################################
59 // Get
60 // #############################################################################################
61#if defined(ALIB_DOX)
62 /**
63 * Receives the function of type \p{TFDecl}.
64 *
65 * @tparam TFDecl The function type to get.
66 * @param isInvocation If \c true, the invocation counter is increased.
67 * This parameter is defined only in debug-compilations.
68 * @return The function found, or \c nullptr in case it was not defined.
69 */
70 template<typename TFDecl>
71 typename TFDecl::Signature
72 Get( bool isInvocation ) const;
73#else
74 template<typename TFDecl> ATMP_T_IF(FHashcode ::Signature, ATMP_EQ(TFDecl, FHashcode )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFHashcode ; ) return fHashcode ; }
75 template<typename TFDecl> ATMP_T_IF(FIsNotNull ::Signature, ATMP_EQ(TFDecl, FIsNotNull )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFIsNotNull; ) return fIsNotNull; }
76 template<typename TFDecl> ATMP_T_IF(FEquals ::Signature, ATMP_EQ(TFDecl, FEquals )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFEquals ; ) return fEquals ; }
77 template<typename TFDecl> ATMP_T_IF(FIsLess ::Signature, ATMP_EQ(TFDecl, FIsLess )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFIsLess ; ) return fIsLess ; }
78 template<typename TFDecl> ATMP_T_IF(FIsTrue ::Signature, ATMP_EQ(TFDecl, FIsTrue )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFIsTrue ; ) return fIsTrue ; }
80 template<typename TFDecl> ATMP_T_IF(FClone ::Signature, ATMP_EQ(TFDecl, FClone )) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFClone ; ) return fClone ; } )
82 template<typename TFDecl> ATMP_T_IF(FAppend<character>::Signature, ATMP_EQ(TFDecl, FAppend<character>)) Get(ALIB_DBG( bool isInvocation )) const { ALIB_DBG( if(isInvocation) ++DbgCntInvocationsFAppend ; ) return fAppend ; } )
83
84 template<typename TFDecl> ATMP_T_IF(typename TFDecl::Signature, !ATMP_EQ(TFDecl, FHashcode )
85 && !ATMP_EQ(TFDecl, FIsNotNull)
86 && !ATMP_EQ(TFDecl, FEquals )
87 && !ATMP_EQ(TFDecl, FIsLess )
88 && !ATMP_EQ(TFDecl, FIsTrue )
89 ALIB_IF_MONOMEM( && !ATMP_EQ(TFDecl, FClone ) )
90 ALIB_IF_STRINGS( && !ATMP_EQ(TFDecl, FAppend<character>) )
91 )
92 Get(ALIB_DBG( bool isInvocation )) const
93 {
94 return reinterpret_cast<typename TFDecl::Signature>( getCustom( typeid(TFDecl) ALIB_DBG(, isInvocation ) ) );
95 }
96#endif
97
98
99
100 // #############################################################################################
101 // Set
102 // #############################################################################################
103#if defined(ALIB_DOX)
104 /**
105 * Registers an implementation of the function of type \p{TFDecl}.
106 *
107 * @tparam TFDecl The function type to register.
108 * @param implementation The implementation of the function.
109 */
110 template<typename TFDecl>
111 void Set( typename TFDecl::Signature implementation );
112#else
113 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FHashcode )) Set( FHashcode ::Signature impl) { fHashcode = impl; }
114 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FIsNotNull )) Set( FIsNotNull ::Signature impl) { fIsNotNull= impl; }
115 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FEquals )) Set( FEquals ::Signature impl) { fEquals = impl; }
116 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FIsLess )) Set( FIsLess ::Signature impl) { fIsLess = impl; }
117 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FIsTrue )) Set( FIsTrue ::Signature impl) { fIsTrue = impl; }
119 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FClone )) Set( FClone ::Signature impl) { fClone = impl; } )
121 template<typename TFDecl> ATMP_VOID_IF(ATMP_EQ(TFDecl, FAppend<character>)) Set( FAppend<character>::Signature impl) { fAppend = impl; } )
122
123
124 template<typename TFDecl> ATMP_VOID_IF( !ATMP_EQ(TFDecl, FHashcode )
125 && !ATMP_EQ(TFDecl, FIsNotNull)
126 && !ATMP_EQ(TFDecl, FEquals )
127 && !ATMP_EQ(TFDecl, FIsLess )
128 && !ATMP_EQ(TFDecl, FIsTrue )
129 ALIB_IF_MONOMEM( && !ATMP_EQ(TFDecl, FClone ) )
130 ALIB_IF_STRINGS( && !ATMP_EQ(TFDecl, FAppend<character>) )
131 )
132 Set( typename TFDecl::Signature impl )
133 {
134 return setCustom( typeid(TFDecl), reinterpret_cast<void*>( impl ) );
135 }
136#endif
137
138 // #############################################################################################
139 // internals
140 // #############################################################################################
141 protected:
142 #if defined(ALIB_DOX)
143 /**
144 * Non-inline implementation of #Get used in the case of non-built-in functions.
145 * @param rtti The \c typeid of the function to get.
146 * @param isInvocation If \c true, the invocation counter is increased.
147 * This parameter is defined only in debug-compilations.
148 * @return The pointer to the box-function.
149 */
150 ALIB_API void* getCustom( const std::type_info& rtti, bool isInvocation ) const;
151 #else
152
153 ALIB_API void* getCustom( const std::type_info& rtti
154 ALIB_DBG( , bool isInvocation )) const;
155 #endif
156
157 /**
158 * Non-inline implementation of #Set #Get used in the case of non-built-in functions.
159 * @param rtti The \c typeid of the function to register.
160 * @param implementation The implementation of the function.
161 */
162 ALIB_API void setCustom( const std::type_info& rtti, void* implementation );
163
164}; // FunctionTable
165
166/** ************************************************************************************************
167 * The default box-functions set.
168 **************************************************************************************************/
169extern ALIB_API FunctionTable DEFAULT_FUNCTIONS;
170
171
172/** ************************************************************************************************
173 * This struct is used internally with \alib_boxing_nl to provide run-time type information
174 * and virtual method invocations to boxed values.
175 * A singleton instance of a this struct is attached to each \alib{boxing;Box}.
176 **************************************************************************************************/
177struct VTable
178{
179 /**
180 * Denotes if the mapped type is value type, a pointer type, an enum or an array.
181 * The latter is not specified by an enum element, but rather is \c true for all enum
182 * elements that have a value greater than \c 0. The value in this case provides the size
183 * of the array's element type.
184 */
186 {
187 Value = 0, ///< Value boxing.
188 Pointer = -1, ///< Pointer boxing.
189 Enum = -2, ///< Enum type boxing
190 };
191
192 /** Information about the encapsulated type. In case of arrays, this field is
193 * equal to \c typeid(void). */
194 const std::type_info& Type;
195
196 /** In case of array types, information about the element type. Otherwise this field is
197 * equal to \c typeid(void). */
198 const std::type_info& ElementType;
199
200 /**
201 * Denotes if the mapped type is value type, a pointer type, an enum or an array.
202 * In case of array types, the enum element value provides the size of the array's element
203 * type (a value greater than \c 0).
204 */
206
207 /**
208 * The number of relevant bytes used in the placeholder.
209 *
210 * \see
211 * The documentation of TMP struct \alib{boxing;T_SizeInPlaceholder} provides details on
212 * and rationals for the existence of this property.
213 */
214 const unsigned int PlaceholderUsage;
215
216 /** Box-functions attached with \alib{boxing;BootstrapRegister}. */
218
219 #if ALIB_DEBUG
220 /**
221 * These flags are available in debug-compilations only. Denotes whether this vtable
222 * is statically or dynamically created. In case of \b Unregistered, a customized
223 * vtable was not properly registered on bootstrap.
224 */
225 enum class DbgFactoryType
226 {
227 Unregistered, ///< Not registered, yet.
228 Static , ///< A static VTable is in place.
229 Dynamic , ///< The VTable is created dynamically from templated type \b VTableTT.
230 };
231
232 /** Debug information. */
234
235 /**
236 * Counter for the number of unbox operations and function invocations made on boxes
237 * that used this \e vtable. Precisely, the counter is increased with invocations
238 * of
239 * \alib{boxing;Box::Unbox},
240 * \alib{boxing;Box::UnboxArray},
241 * \alib{boxing;Box::UnboxElement},
242 * \alib{boxing;Box::TypeID} and
243 * \alib{boxing;Box::GetFunction}.
244 *
245 * Available only with debug builds.
246 */
248 #endif
249
250 /** ****************************************************************************************
251 * Constructor.
252 *
253 * @param type Type information of the derived \b VTable type.
254 * @param elementType Type information of the elements of the boxed array.
255 * @param mapping The type of boxing: value, pointer, enum or arrays.
256 * @param placeholderUsage The size of elements of the boxed array.
257 ******************************************************************************************/
258 VTable( const std::type_info& type,
259 const std::type_info& elementType,
260 MappingType mapping,
261 unsigned int placeholderUsage )
262 : Type ( type )
263 , ElementType ( elementType )
264 , Mapping ( mapping )
265 , PlaceholderUsage( placeholderUsage )
266 {}
267
268
269 /** ****************************************************************************************
270 * Virtual destructor.<br>
271 * Note: This is not really needed and empty. Because derived class \b %VTable derives from
272 * virtual type \alib{singletons;Singleton}, having this destructor allows to clean memory
273 * on termination "more precisely" and reduce warnings raised by analytics tools like
274 * \b valgrind.
275 ******************************************************************************************/
276 virtual ~VTable()
277 {}
278
279 /** ****************************************************************************************
280 * Returns \c true if this vtable represents boxed array types. In this case, method
281 * \ref alib::boxing::Box::UnboxLength "Box::UnboxLength"
282 * will return the length of the array and
283 * \ref alib::boxing::Box::UnboxElement "Box::UnboxElement" may be used to
284 * access elements of the array.
285 *
286 * @return \c true if this vtable is representing an array type, \c false otherwise.
287 ******************************************************************************************/
288 bool IsArray() const
289 {
290 return Mapping > 0;
291 }
292
293 /** ****************************************************************************************
294 * Returns \c true if this vtable represents mapped pointer type.
295 *
296 * @return \c true if this vtable is representing a pointer type, \c false otherwise.
297 ******************************************************************************************/
298 bool IsPointer() const
299 {
301 }
302
303 /** ****************************************************************************************
304 * Returns \c true if this vtable represents a scoped or non-scoped enum type.
305 *
306 * @return \c true if this vtable is representing an enum type, \c false otherwise.
307 ******************************************************************************************/
308 bool IsEnum() const
309 {
310 return Mapping == MappingType::Enum;
311 }
312}; // struct VTable
313
314
315// #################################################################################################
316// VTable
317// #################################################################################################
318#if ALIB_DEBUG_BOXING
319
320 /** ********************************************************************************************
321 * Registers a virtual table for debug purposes.
322 * This function is invoked internally, when a dynamic \e vtable is created and
323 * when a static \e vtable is registered.
324 *
325 * Statically created \e vtables have to be registered during bootstrap in debug-compilations.
326 * For this, macro \ref ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER is available, which is empty
327 * in release compilations.
328 *
329 * \see
330 * Macros ALIB_BOXING_VTABLE_DECLARE and \ref alib_mod_boxing "Programmer's Manual" chapter
331 * \ref alib_boxing_more_opt_staticvt.
332 *
333 * @param vtable The vtable to register.
334 * @param productionType Denotes whether the \p{vtable} is a static constexpr object or
335 * dynamically created from template type \b VTableTT.
336 **********************************************************************************************/
339
340#endif // ALIB_DEBUG_BOXING
341
342/** ************************************************************************************************
343 * This is a templated derivate of class \b VTable. It is needed to create singletons for arbitrary
344 * mapped types.
345 *
346 * \see
347 * Chapter \ref alib_boxing_more_opt_staticvt_bg
348 * of the \alib_boxing "Programmer's Manual" of module \alib_boxing_nl.
349 *
350 * ## Friends ##
351 * class \alib{singletons;Singleton;Singleton< VTableTT<TPlainOrArray; TMapped> >}
352 *
353 * @tparam TPlainOrArray Either type \alib{boxing;detail::TPlain} or \alib{boxing;detail::TArrayOf}.
354 * @tparam TMapped The mapped type.
355 **************************************************************************************************/
356template<typename TPlainOrArray, typename TMapped>
357class VTableTT : public VTable
358 , public Singleton< VTableTT<TPlainOrArray, TMapped> >
359{
360 #if !defined(ALIB_DOX)
362 #endif
363
364 private:
365 /**
366 * Constructor. Passes parameters as expected by parent class \b VTable.
367 *
368 * This constructor is private and class \b %Singleton is a friend, which makes each
369 * template instance of this class being a 'strict' singleton (only that singleton instance
370 * exists).
371 */
372 constexpr VTableTT()
373 : VTable( ATMP_EQ(TPlainOrArray, TPlain ) ? typeid(TMapped)
374 : typeid(TMapped[1]),
375
376 ATMP_EQ(TPlainOrArray, TPlain ) ? typeid(void)
377 : typeid(TMapped),
378
379 ATMP_EQ(TPlainOrArray, TArrayOf) ? VTable::MappingType(sizeof(TMapped))
380 : ATMP_IS_PTR(TMapped)
382 : ATMP_IS_ENUM(TMapped)
385
386
387 ATMP_EQ(TPlainOrArray, TPlain ) ? T_SizeInPlaceholder<TMapped>::value
388 : sizeof(Placeholder)
389 )
390 {
391 #if ALIB_DEBUG_BOXING
393 #endif
394 }
395};
396
397
398#if ALIB_DEBUG_BOXING || defined(ALIB_DOX)
399
400/**
401 * Checks if \alib_boxing_nl was correctly initialized.
402 * This is done with the creation of \ref alib_boxing_more_opt_staticvt "dynamic vtables",
403 * to detect global or static box objects which are initialized with data that is mapped to
404 * a type that no static \e vtable is defined for.
405 *
406 * Available and used only in debug-compilations.
407 *
408 * \see
409 * Manual chapter \ref alib_boxing_more_static_instances.
410 */
412
413/**
414 * Checks for doubly-defined \e vtables, as well as for unregistered
415 * \ref alib_boxing_more_opt_staticvt "static vtables".
416 *
417 * Available and used only in debug-compilations.
418 * @param vtable The \e vtable to check.
419 * @param increaseUsageCounter Denotes if this is a use of the vtable or just a check.
420 */
421ALIB_API void DbgCheckRegistration( detail::VTable* vtable, bool increaseUsageCounter );
422#else
423inline void DbgCheckIsInitialized() {}
424inline void DbgCheckRegistration (detail::VTable*, bool ) {}
425#endif
426
427
428
429
430/** ************************************************************************************************
431 * Method #Get of the default version of this struct creates a \alib{boxing::detail;VTable}
432 * dynamically.
433 * For this, a corresponding templated \alib{singletons;Singleton} type
434 * \alib{boxing::detail;VTableTT}, according to given template parameter \p{TMapping} is returned.
435 *
436 * For optimization purposes (code size as well as execution performance), this struct might
437 * be specialized for selected a mapped types, to return static singleton object.
438 *
439 * Specializations for all C++ fundamental types are given. Furthermore, various different
440 * \alibmods provide such specializations for types they introduced and that are boxed.
441 *
442 * \see
443 * Chapter \ref alib_boxing_more_opt_staticvt_howto of the Programmer's Manual
444 * of \alib_boxing_nl.
445 *
446 * @tparam TMapping The mapped type to receive a \e vtable for. Has to be of either type
447 * \alib{boxing;TMappedTo<T>} or \alib{boxing;TMappedToArrayOf<T>}.
448 **************************************************************************************************/
449template<typename TMapping>
451{
452 /**
453 * Returns a strict singleton \e vtable responsible for boxing mapped type \p{TMapping}.
454 * @return The requested \e vtable singleton.
455 */
456 static constexpr VTable* Get()
457 {
459
461
462 DbgCheckRegistration( result, false );
463
464 return result;
465 }
466
467};
468
469
470}}} // namespace [alib::boxing::detail]
471
472
473//##################################################################################################
474//####################################### Macros ###########################################
475//##################################################################################################
476
477#define ALIB_BOXING_VTABLE_DECLARE( TMapped, Identifier ) \
478namespace alib::boxing::detail { \
479extern ALIB_API VTable SNGLTN_ ## Identifier; \
480template<> struct T_VTableFactory< TMappedTo<TMapped> > \
481{ static constexpr VTable* Get() { return &SNGLTN_ ## Identifier; } }; } \
482
483#define ALIB_BOXING_VTABLE_DECLARE_ARRAYTYPE( TMapped, Identifier ) \
484namespace alib::boxing::detail { \
485extern ALIB_API VTable SNGLTN_ ## Identifier; \
486template<> struct T_VTableFactory< TMappedToArrayOf<TMapped> > \
487{ static constexpr VTable* Get() { return &SNGLTN_ ## Identifier; } }; } \
488
489
490#define ALIB_BOXING_VTABLE_DEFINE( TMapped, Identifier ) \
491alib::boxing::detail::VTable alib::boxing::detail::SNGLTN_ ## Identifier \
492( typeid(TMapped), typeid(void) , \
493 std::is_pointer<TMapped>::value \
494 ? VTable::MappingType::Pointer \
495 : std::is_enum<TMapped>::value \
496 ? VTable::MappingType::Enum \
497 : VTable::MappingType::Value , \
498 alib::boxing::T_SizeInPlaceholder<TMapped>::value); \
499
500#define ALIB_BOXING_VTABLE_DEFINE_ARRAYTYPE( TMapped, Identifier ) \
501alib::boxing::detail::VTable alib::boxing::detail::SNGLTN_ ## Identifier \
502(typeid(TMapped[1]) , typeid(TMapped), VTable::MappingType(sizeof(TMapped)), sizeof(Placeholder)); \
503
504
505#if ALIB_DEBUG_BOXING
506# define ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( Identifier ) \
507DbgRegisterVTable( &alib::boxing::detail::SNGLTN_ ## Identifier, \
508 alib::boxing::detail::VTable::DbgFactoryType::Static );
509#else
510# define ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( Identifier )
511#endif
512
513#endif // HPP_ALIB_BOXING_DETAIL_VTABLE
static TDerivedClass & GetSingleton()
Definition singleton.hpp:61
#define ATMP_IS_ENUM(T)
Definition tmp.hpp:26
#define ALIB_IF_STRINGS(...)
Definition alib.hpp:287
#define ATMP_VOID_IF(Cond)
Definition tmp.hpp:52
#define ALIB_API
Definition alib.hpp:538
#define ALIB_IF_MONOMEM(...)
Definition alib.hpp:271
#define ATMP_EQ( T, TEqual)
Definition tmp.hpp:32
#define ATMP_IS_PTR(T)
Definition tmp.hpp:27
#define ALIB_DBG(...)
Definition alib.hpp:457
#define ATMP_T_IF(T, Cond)
Definition tmp.hpp:53
ALIB_API void DbgCheckRegistration(detail::VTable *vtable, bool increaseUsageCounter)
Definition boxing.cpp:1130
ALIB_API void DbgCheckIsInitialized()
Definition boxing.cpp:1121
void DbgRegisterVTable(detail::VTable *vtable, detail::VTable::DbgFactoryType productionType)
Definition dbgboxing.cpp:96
FunctionTable DEFAULT_FUNCTIONS
Definition vtable.cpp:128
Definition alib.cpp:57
boxing::FIsLess FIsLess
Type alias in namespace alib.
lang::uinteger uinteger
Type alias in namespace alib.
Definition integers.hpp:289
boxing::FClone FClone
Type alias in namespace alib.
boxing::FIsNotNull FIsNotNull
Type alias in namespace alib.
boxing::FEquals FEquals
Type alias in namespace alib.
boxing::FIsTrue FIsTrue
Type alias in namespace alib.
boxing::FHashcode FHashcode
Type alias in namespace alib.
lang::integer integer
Type alias in namespace alib.
Definition integers.hpp:286
void(*)(const Box &self, strings::TAString< TChar > &target) Signature
uinteger DbgCntInvocationsFHashcode
Debug-compilation counter for the number of invocations.
Definition vtable.inl:45
uinteger DbgCntInvocationsFIsNotNull
Debug-compilation counter for the number of invocations.
Definition vtable.inl:46
FIsLess::Signature fIsLess
Entry for built-in function FIsLess .
Definition vtable.inl:36
TFDecl::Signature Get(bool isInvocation) const
ALIB_API void * getCustom(const std::type_info &rtti, bool isInvocation) const
Definition vtable.cpp:132
uinteger DbgCntInvocationsFIsLess
Debug-compilation counter for the number of invocations.
Definition vtable.inl:48
uinteger DbgCntInvocationsFClone
Debug-compilation counter for the number of invocations.
Definition vtable.inl:51
void Set(typename TFDecl::Signature implementation)
uinteger DbgCntInvocationsFAppend
Debug-compilation counter for the number of invocations.
Definition vtable.inl:54
uinteger DbgCntInvocationsFIsTrue
Debug-compilation counter for the number of invocations.
Definition vtable.inl:49
ALIB_API void setCustom(const std::type_info &rtti, void *implementation)
Definition vtable.cpp:148
uinteger DbgCntInvocationsFEquals
Debug-compilation counter for the number of invocations.
Definition vtable.inl:47
FClone::Signature fClone
Entry for built-in function FClone .
Definition vtable.inl:39
FHashcode::Signature fHashcode
Entry for built-in function FHashcode .
Definition vtable.inl:33
FIsTrue::Signature fIsTrue
Entry for built-in function FIsTrue .
Definition vtable.inl:37
FAppend< character >::Signature fAppend
Entry for built-in function FAppend .
Definition vtable.inl:42
FEquals::Signature fEquals
Entry for built-in function FEquals .
Definition vtable.inl:35
FIsNotNull::Signature fIsNotNull
Entry for built-in function FIsNotNull .
Definition vtable.inl:34
static constexpr VTable * Get()
Definition vtable.inl:456
VTable(const std::type_info &type, const std::type_info &elementType, MappingType mapping, unsigned int placeholderUsage)
Definition vtable.inl:258
DbgFactoryType DbgProduction
Definition vtable.inl:233
const std::type_info & Type
Definition vtable.inl:194
@ Static
A static VTable is in place.
@ Dynamic
The VTable is created dynamically from templated type VTableTT.
const unsigned int PlaceholderUsage
Definition vtable.inl:214
const MappingType Mapping
Definition vtable.inl:205
@ Enum
Enum type boxing.
Definition vtable.inl:189
@ Pointer
Pointer boxing.
Definition vtable.inl:188
const std::type_info & ElementType
Definition vtable.inl:198