ALib C++ Library
Library Version: 2510 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
boxstrap.cpp
1// #################################################################################################
2// ALib C++ Library
3//
4// Copyright 2013-2025 A-Worx GmbH, Germany
5// Published under 'Boost Software License' (a free software license, see LICENSE.txt)
6// #################################################################################################
7#include "alib_precompile.hpp"
8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
10#endif
11#if ALIB_C20_MODULES
12 module;
13#endif
14// ====================================== Global Fragment ======================================
15#include <cmath>
16#include <functional>
17#include <cstring>
18#include <typeindex>
19#include <span>
20
21# include "ALib.Lang.H"
23# include "ALib.Time.H"
24# include "ALib.Threads.H"
25# include "ALib.Monomem.H"
26# include "ALib.Strings.H"
27# include "ALib.Strings.Token.H"
28# include "ALib.Singletons.H"
29# include "ALib.Boxing.H"
31# include "ALib.ThreadModel.H"
32# include "ALib.Exceptions.H"
33# include "ALib.System.H"
34# include "ALib.Format.H"
38# include "ALib.Variables.H"
40# include "ALib.BitBuffer.H"
41# include "ALib.Camp.H"
42# include "ALib.Camp.Base.H"
43# include "ALib.Bootstrap.H"
44# include "ALib.CLI.H"
45# include "ALib.Expressions.H"
46# include "ALib.ALox.Impl.H"
47# include "ALib.Files.H"
48
49#if ALIB_DEBUG && !DOXYGEN
50namespace alib::boxing::debug {
51 // This is used by boxing::Bootstrap to do a runtime-check for compatibility of boxing
52 // and long double values.
53 // It was put here to prevent the compiler to optimize and remove the code.
54 extern long double LONGDOUBLE_WRITE_TEST_MEM[2];
55 extern void LongDoubleTrueLengthSet();
56 extern bool LongDoubleTrueLengthTest();
57}
58#endif
59
60// =========================================== Module ==========================================
61#if ALIB_C20_MODULES
62 module ALib.Boxing;
63#endif
64// ====================================== Implementation =======================================
65
66// #################################################################################################
67// Anonymous methods needed for Bootstrap()
68// #################################################################################################
69#if !DOXYGEN
70
71namespace alib::boxing {
72namespace {
73
74bool FIsNotNull_Default( const Box& box )
75{
76 return !( (box.IsArray() && box.UnboxLength() == 0 )
77 || (box.IsPointer() && box.Data().PointerPair.P1 == nullptr )
78 );
79}
80
81std::size_t FHashcode_Default( const Box& self )
82{
83 if( self.IsPointer() )
84 {
85 return size_t(0xa814e72cUL)
86 + size_t( self.TypeID().hash_code() )
87 + self.Data().Integrals.UArray[0] * 89047023;
88 }
89
90 if( self.IsEnum() )
91 {
92 return size_t(0x49a024efUL)
93 + size_t( self.TypeID().hash_code() )
94 + self.Data().Integrals.UArray[0] * 79204799;
95 }
96
97 if( self.IsArray() )
98 {
99 std::size_t result= 0xa925eb91L
100 + std::size_t( self.ElementTypeID().hash_code() );
101
102 // do different loops depending on array element size
103 auto size = self.ArrayElementSize();
104 auto length= self.UnboxLength();
105 if( size == 2 || size == 6 )
106 {
107 if (size == 6)
108 length*= 3;
109
110 std::span<uint16_t> array= {self.Data().GetPointer<uint16_t>(), size_t(length) };
111 for( uint16_t v : array )
112 result = 67 * result + v;
113
114 return size_t( result );
115 }
116
117 if( size == 4 )
118 {
119 std::span<uint32_t> array= {self.Data().GetPointer<uint32_t>(), size_t(length) };
120 for( uint32_t v : array )
121 result = 67*result + v;
122
123 return size_t( result );
124 }
125
126 if( size == 8 )
127 {
128 std::span<uint64_t> array= {self.Data().GetPointer<uint64_t>(), size_t(length) };
129 for( uint64_t v : array )
130 result = std::size_t( 67 * result + v );
131
132 return std::size_t( result );
133 }
134
135 // any other size
136 {
137 length*= size;
138 std::span<unsigned char> array= {self.Data().GetPointer<unsigned char>(), size_t(length) };
139 for( unsigned char v : array )
140 result = 67 * result + v;
141
142 return size_t( result );
143 }
144 }
145
146 //--- default (value types) ---
147 size_t result= size_t(0xcf670957UL)
148 + size_t( self.TypeID().hash_code() );
149
150 unsigned int usedLen= self.GetPlaceholderUsageLength();
151
152 constexpr uinteger Bit1= 1;
153
154 // smaller than first "word"
155 if( usedLen < sizeof( uinteger ) )
156 return size_t( ( self.Data().Integrals.UArray[0]
157 & ((Bit1 << (usedLen * 8) )- 1) ) * 32194735 )
158 + result;
159
160 // add first word
161 result+= self.Data().Integrals.UArray[0] * 32194735;
162
163 if( usedLen == sizeof(uinteger) )
164 return result;
165
166 // tests if smaller than second "word"
167 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) )
168 {
169 return size_t( ( self.Data().Integrals.UArray[1]
170 & ((Bit1 << ((usedLen - sizeof(uinteger)) * 8) )- 1) ) * 321947 )
171 + result;
172 }
173
174 return result + self.Data().Integrals.UArray[1] * 321947;
175
176
177}
178
179bool FEquals_Default( const Box& self, const Box& rhs )
180{
181 if( !self.IsSameType( rhs ) )
182 return false;
183
184 // array types?
185 if( self.IsArray() )
186 {
187 // different in type, length or nulled?
188 if( self.UnboxLength() != rhs.UnboxLength()
189 || ( ( self.Data().GetPointer<char>() == nullptr)
190 != ( rhs .Data().GetPointer<char>() == nullptr ) ) )
191 return false;
192
193 return self.Data().GetPointer<char>() == nullptr
194 || self.UnboxLength() == 0
195 || self.Data().GetPointer<char>() == rhs.Data().GetPointer<char>()
196 || memcmp( self.Data().GetPointer<char>(),
197 rhs .Data().GetPointer<char>(),
198 static_cast <size_t>( self.UnboxLength() ) * self.ArrayElementSize()
199 ) == 0;
200 }
201
202 // non-array types
203 unsigned int usedLen= self.GetPlaceholderUsageLength();
204
205 constexpr uinteger Bit1= uinteger( 1 );
206 // tests if smaller than first "word"
207 if( usedLen < sizeof( uinteger ) )
208 {
209 uinteger mask= (Bit1 << (usedLen * 8) )- 1;
210 return ( self.Data().Integrals.UArray[0] & mask )
211 == ( rhs .Data().Integrals.UArray[0] & mask );
212 }
213
214 // test first word
215 if( self.Data().Integrals.UArray[0] != rhs.Data().Integrals.UArray[0] )
216 return false;
217
218 if( usedLen == sizeof( uinteger ) )
219 return true;
220
221 // tests if smaller than second "word"
222 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) )
223 {
224 uinteger mask= (Bit1 << (usedLen - sizeof(uinteger)) * 8 )- 1;
225 return ( self.Data().Integrals.UArray[1] & mask )
226 == ( rhs .Data().Integrals.UArray[1] & mask );
227 }
228
229 return self.Data().Integrals.UArray[1] == rhs.Data().Integrals.UArray[1];
230}
231
232
233bool FEquals_double( const Box& self, const Box& rhsBox )
234{
235 double lhs= self.UnboxFloatingPoint();
236 double rhs;
237 if( rhsBox.IsFloatingPoint () ) rhs= rhsBox.UnboxFloatingPoint () ;
238 else if( rhsBox.IsSignedIntegral () ) rhs= double( rhsBox.UnboxSignedIntegral () );
239 else if( rhsBox.IsUnsignedIntegral() ) rhs= double( rhsBox.UnboxUnsignedIntegral() );
240 else return false;
241
242 // we can ignore this warning, because we fixed it with the second test
243 #if defined(__clang__)
244 #pragma clang diagnostic push
245 #pragma clang diagnostic ignored "-Wfloat-equal"
246 #endif
247
248 return lhs == rhs
249 // take rounding errors into account.
250 // We use the "float-epsilon" and double it to be even a little weaker!
251 || std::fabs( lhs - rhs ) <= double( 2.0f * std::numeric_limits<float>::epsilon() );
252
253 #if defined(__clang__)
254 #pragma clang diagnostic pop
255 #endif
256}
257
258bool FEquals_integer( const Box& self, const Box& rhsBox )
259{
260 if( rhsBox.IsFloatingPoint() )
261 return FEquals_double( rhsBox, self );
262
263 integer rhs;
264 if( rhsBox.IsSignedIntegral () ) rhs= rhsBox.UnboxSignedIntegral () ;
265 else if( rhsBox.IsUnsignedIntegral() ) rhs= static_cast< integer>( rhsBox.UnboxUnsignedIntegral() );
266 else return false;
267
268 return self.UnboxSignedIntegral() == rhs;
269}
270
271bool FEquals_uinteger( const Box& self, const Box& rhsBox )
272{
273 if( rhsBox.IsFloatingPoint() )
274 return FEquals_double( rhsBox, self );
275
276 uinteger rhs;
277 if( rhsBox.IsSignedIntegral () ) rhs= uinteger( rhsBox.UnboxSignedIntegral () );
278 else if( rhsBox.IsUnsignedIntegral() ) rhs= rhsBox.UnboxUnsignedIntegral() ;
279 else return false;
280
281 return self.UnboxUnsignedIntegral() == rhs;
282}
283
284bool FEquals_char( const Box& self, const Box& rhs )
285{
286 if( !rhs.IsCharacter() )
287 return false;
288 return self.UnboxCharacter() == rhs.UnboxCharacter();
289}
290
291
292template<typename TChar>
293bool FEquals_TChar_Arr( const Box& lhs, const Box& rhs )
294{
295 if ( !rhs.IsArrayOf<TChar>() )
296 return false;
297
298 const TChar* compBuf= rhs.Data().GetPointer<TChar>();
299 const TChar* boxBuf= lhs.Data().GetPointer<TChar>();
300 if ( (boxBuf == nullptr) != (compBuf == nullptr) )
301 return false;
302
303 integer compLen= rhs.UnboxLength();
304 integer boxLen= lhs.UnboxLength();
305 if ( boxLen != compLen )
306 return false;
307
308 return 0 == characters::Compare <TChar>( boxBuf, compBuf, boxLen );
309}
310
311bool FIsLess_Default( const Box& box, const Box& comp )
312{
313 return std::type_index( box.TypeID() ) < std::type_index(comp.TypeID() )
314 || ( box.TypeID() == comp.TypeID()
315 &&box.Data().Integrals.UArray[0] < comp.Data().Integrals.UArray[0] );
316
317}
318
319#if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
320bool FIsLess_integer( const Box& self, const Box& rhs )
321{
322 auto lhs= self.Data().Integrals.Array[0];
323 if( rhs.IsSameType( self ) ) return lhs < rhs.Unbox<integer > ();
324 if( rhs.IsType<uinteger>() ) return lhs < integer(rhs.Unbox<uinteger> ());
325 if( rhs.IsFloatingPoint() ) return double( lhs ) < rhs.UnboxFloatingPoint();
326
327 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
328}
329
330bool FIsLess_uinteger( const Box& self, const Box& rhs )
331{
332 auto lhs= self.Data().Integrals.UArray[0];
333 if( rhs.IsSameType( self ) ) return lhs < rhs.Data().Integrals.UArray[0] ;
334 if( rhs.IsType<integer> () ) return integer( lhs ) < rhs.Unbox<integer>();
335 if( rhs.IsFloatingPoint() ) return double ( lhs ) < rhs.UnboxFloatingPoint();
336
337 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
338}
339
340#else
341
342bool helperBijectiveLessS( integer selfVal, const Box& selfType, const Box& rhs )
343{
344 if( rhs.IsSignedIntegral () ) return selfVal < rhs.UnboxSignedIntegral () ;
345 if( rhs.IsUnsignedIntegral() ) return selfVal < integer(rhs.UnboxUnsignedIntegral());
346 if( rhs.IsFloatingPoint () ) return double( selfVal ) < rhs.UnboxFloatingPoint () ;
347
348 // no number?
349 return std::type_index( selfType.TypeID() ) < std::type_index( rhs.TypeID() );
350}
351
352bool helperBijectiveLessU( uinteger selfVal, const Box& selfType, const Box& rhs )
353{
354 if( rhs.IsSignedIntegral () ) return selfVal < uinteger(rhs.UnboxSignedIntegral ());
355 if( rhs.IsUnsignedIntegral() ) return selfVal < rhs.UnboxUnsignedIntegral() ;
356 if( rhs.IsFloatingPoint () ) return double(selfVal) < rhs.UnboxFloatingPoint () ;
357
358 // no number?
359 return std::type_index( selfType.TypeID() ) < std::type_index( rhs.TypeID() );
360}
361
362bool FIsLess_int8_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int8_t >() ), self, rhs ); }
363bool FIsLess_int16_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int16_t >() ), self, rhs ); }
364bool FIsLess_int32_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int32_t >() ), self, rhs ); }
365bool FIsLess_int64_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int64_t >() ), self, rhs ); }
366bool FIsLess_intGap_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< intGap_t>() ), self, rhs ); }
367
368bool FIsLess_uint8_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint8_t >() ), self, rhs ); }
369bool FIsLess_uint16_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint16_t >() ), self, rhs ); }
370bool FIsLess_uint32_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint32_t >() ), self, rhs ); }
371bool FIsLess_uint64_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint64_t >() ), self, rhs ); }
372bool FIsLess_uintGap_t( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uintGap_t>() ), self, rhs ); }
373
374#endif
375
376bool FIsLess_char( const Box& self, const Box& rhs )
377{
378 if( rhs.IsCharacter () )
379 return self.UnboxCharacter() < rhs.UnboxCharacter () ;
380
381 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
382}
383
384
385
386bool FIsLess_double( const Box& self, const Box& rhs )
387{
388 double lhs= self.Unbox<double>();
389 if( rhs.IsFloatingPoint () ) return lhs < rhs.UnboxFloatingPoint () ;
390 if( rhs.IsSignedIntegral () ) return lhs < double( rhs.UnboxSignedIntegral () );
391 if( rhs.IsUnsignedIntegral() ) return lhs < double( rhs.UnboxUnsignedIntegral() );
392
393 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
394}
395
396#if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
397 bool FIsLess_float( const Box& self, const Box& rhs )
398 {
399 float lhs= self.Unbox<float>();
400 if( rhs.IsType<float >() ) return lhs < rhs.Unbox<float >() ;
401 if( rhs.IsType<double >() ) return lhs < float( rhs.Unbox<double>() );
402 if( rhs.IsSignedIntegral () ) return lhs < float( rhs.UnboxSignedIntegral () );
403 if( rhs.IsUnsignedIntegral() ) return lhs < float( rhs.UnboxUnsignedIntegral() );
404
405 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
406 }
407#endif
408
409
410
411#if ALIB_MONOMEM
412
413void FClone_Default( Box& self, MonoAllocator& memory)
414{
415 if ( !self.IsArray() || self.UnboxLength() == 0)
416 return;
417
418 Placeholder& placeHolder= self.Data();
419 auto* src= placeHolder.GetPointer<char>();
420 if( src== nullptr || placeHolder.Integrals.Array[1] < 0 )
421 return;
422
423 size_t alignment= self.ArrayElementSize();
424 if( alignment > sizeof(std::ptrdiff_t) )
425 alignment= sizeof(std::ptrdiff_t);
426
427
428 placeHolder.SetPointer( memory().Alloc( self.ArrayElementSize() * placeHolder.Integrals.UArray[1],
429 alignment ) );
430 memcpy( placeHolder.GetPointer<char>(), src, self.ArrayElementSize() * placeHolder.Integrals.UArray[1] );
431}
432#endif
433
434// #################################################################################################
435bool FIsTrue_Default( const Box& self )
436{
437 if( self.IsArray() )
438 return self.UnboxLength() != 0;
439
440 // non-array types
441 unsigned int usedLen= self.GetPlaceholderUsageLength();
442
443 constexpr uinteger Bit1= uinteger( 1 );
444 // tests if smaller than first "word"
445 if( usedLen < sizeof( uinteger ) )
446 return ( self.Data().Integrals.UArray[0]
447 & ((Bit1 << (usedLen * 8) )- 1) ) != 0;
448
449 // test first word
450 if( self.Data().Integrals.UArray[0] != 0 )
451 return true;
452
453 if( usedLen == sizeof( uinteger ) )
454 return false;
455
456 // tests if smaller than second "word"
457 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) )
458 {
459 return ( self.Data().Integrals.UArray[1]
460 & ((Bit1 << (usedLen - sizeof(uinteger)) * 8 )- 1) ) != 0;
461 }
462
463 return self.Data().Integrals.UArray[1] != 0;
464}
465
466
467#if ALIB_STRINGS
468template<typename TChar>
469bool FIsLess_TChar_arr( const Box& lhs, const Box& rhs )
470{
471 if( rhs.IsArrayOf<TChar>() )
472 return lhs.Unbox<strings::TString<TChar>>() < rhs.Unbox<strings::TString<TChar>>();
473
474 return std::type_index( lhs.TypeID() ) < std::type_index(rhs.TypeID() );
475}
476
477
478template<typename TChar, typename TAllocator>
479void FAppend_Default( const Box& self, strings::TAString<TChar,TAllocator>& target)
480{
481 if( self.IsPointer() )
482 {
483 target << ALIB_REL_DBG( "PointerType", self.TypeID() )
485 << strings::THex<TChar>( self.Data().Integrals.UArray[0] )
486 << ')';
487 return;
488 }
489
490 if( self.IsEnum() )
491 {
492 target << ALIB_REL_DBG( "EnumType", self.TypeID() ) << '(' << self.Data().Integrals.Array[0] << ')';
493 return;
494 }
495
496 if( self.IsArray() )
497 {
498 target << ALIB_REL_DBG( "ArrayType", self.ElementTypeID() ) << '[' << self.UnboxLength() << ']';
499 return;
500 }
501
502 // value type
503 target << ALIB_REL_DBG( "ValueType", self.TypeID() ) << "(Size: " << self.GetPlaceholderUsageLength() << " bytes)";
504}
505
506
507template<typename TCharSrc, typename TChar, typename TAllocator>
508void FAppend_TcharArr( const Box& box, strings::TAString<TChar,TAllocator>& target )
509{
510 target.template Append<NC>( box.UnboxArray<TCharSrc>(), box.UnboxLength() );
511}
512
513#endif
514
515} // anonymous namespace
516} // namespace [alib::boxing]
517#endif //!DOXYGEN
518
519// #################################################################################################
520// Bootstrap()
521// #################################################################################################
522# include "ALib.Lang.CIFunctions.H"
523
524namespace alib::boxing{
525#if ALIB_DEBUG && !DOXYGEN
526namespace{ unsigned int initFlag= 0; }
527#endif // !DOXYGEN
528
529void shutdown() {
530 ALIB_ASSERT_ERROR( initFlag == 0x92A3EF61, "BOXING", "Not initialized when calling shutdown." )
531 ALIB_DBG(initFlag= 1);
534}
535
537{
538 ALIB_ASSERT_ERROR( initFlag == 0, "BOXING", "This method must not be invoked twice." )
539 ALIB_DBG(initFlag= 0x92A3EF61);
540
541 //############### Debug-compilation checks ################
542 #if ALIB_DEBUG
543 // check size of long double
544 {
545 debug::LongDoubleTrueLengthSet();
546 debug::LONGDOUBLE_WRITE_TEST_MEM[0]= 0.0L;
547 ALIB_ASSERT_ERROR( debug::LongDoubleTrueLengthTest(), "BOXING",
548 "Platform not supported. SizeTraits<long double> contains wrong size" )
549 }
550 #endif
551
552 //############################# BootstrapRegister Static VTables #################################
555#if ALIB_MONOMEM
557#endif
559
560DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_1])
562DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_1])
563
564 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
567 #else
576 #if ALIB_SIZEOF_INTEGER == 8
579 #endif
580 #endif // !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
581
583 #if ALIB_SIZEOF_LONGDOUBLE_REPORTED <= 2 * ALIB_SIZEOF_INTEGER
585 #endif
586 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
588 #endif
589
590
591 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
593 #else
599 #endif
600
601DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_2])
603DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_2])
604
609
610 // Static VTables for standard types
612
613 // CodeMarker_CommonEnums
614 // Static VTables for low-level ALib types
619 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_ContainerOp )
620 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CreateDefaults )
621 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CreateIfNotExists )
622 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CurrentData )
624 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Initialization )
626 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Propagation )
628 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Responsibility )
636 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_ValueReference )
637 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Whitespaces )
638
640 #if !ALIB_SINGLE_THREADED
642 #endif
644 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_time_ticks_duration )
646 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_time_datetime_duration )
647
648
649 #if ALIB_STRINGS
650 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_tanstring )
651 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_tawstring )
652 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_taxstring )
653 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_strings_token )
654 #endif
655
656 #if ALIB_SYSTEM
657 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_system_systemerrors )
659 #endif
660 #if ALIB_EXCEPTIONS
662 #endif
663 #if ALIB_VARIABLES
664 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_priorities )
665 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_exceptions )
667 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_constcursor )
668 #endif
669 #if ALIB_FORMAT
670 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_system_fmtexceptions)
671 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_iec )
672 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_si )
673 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_units )
674 #endif
675
676 #if ALIB_CLI
678 #endif
679
680 #if ALIB_ALOX
684 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lox_pair_verby_prio )
685 #endif
686
687 #if ALIB_EXPRESSIONS
688 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_expressions_exceptions )
689 #endif
690
691 #if ALIB_FILES
700 #endif
701
702 //######################## Register default implementations #######################
703 BootstrapRegisterDefault<FIsTrue >( FIsTrue_Default );
704 BootstrapRegisterDefault<FIsNotNull >( FIsNotNull_Default );
705 BootstrapRegisterDefault<FIsLess >( FIsLess_Default );
706 BootstrapRegisterDefault<FHashcode >( FHashcode_Default );
707 BootstrapRegisterDefault<FEquals >( FEquals_Default );
709 BootstrapRegisterDefault<FClone >( FClone_Default ); )
710
711 // ################################ IsNotNull ##########################################
713 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
716 #else
727 #endif
728
729 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
731 #else
737 #endif
738
739
740 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
742 #endif
744
745 // ################################ Hashcode ##########################################
747 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
750 #else
761 #endif
762
763 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
765 #else
771 #endif
772
773
774 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
776 #endif
779
780
781 // ################################ Equals ###########################################
783
784 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
785 BootstrapRegister<FEquals , integer >( FEquals_integer );
786 BootstrapRegister<FEquals , uinteger >( FEquals_uinteger );
787 #else
788 BootstrapRegister<FEquals , int8_t >( FEquals_integer );
789 BootstrapRegister<FEquals , uint8_t >( FEquals_uinteger );
790 BootstrapRegister<FEquals , int16_t >( FEquals_integer );
791 BootstrapRegister<FEquals , uint16_t >( FEquals_uinteger );
792 BootstrapRegister<FEquals , int32_t >( FEquals_integer );
793 BootstrapRegister<FEquals , uint32_t >( FEquals_uinteger );
794 BootstrapRegister<FEquals , int64_t >( FEquals_integer );
795 BootstrapRegister<FEquals , uint64_t >( FEquals_uinteger );
797 BootstrapRegister<FEquals , uintGap_t >( FEquals_uinteger );
798 #endif
799
800 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
801 BootstrapRegister<FEquals , float >( FEquals_double );
802 #endif
803 BootstrapRegister<FEquals , double >( FEquals_double );
805
806
807 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
809 #else
815 #endif
816
817 BootstrapRegister<FEquals , nchar,true >( FEquals_TChar_Arr<nchar>);
818 BootstrapRegister<FEquals , wchar,true >( FEquals_TChar_Arr<wchar>);
819 BootstrapRegister<FEquals , xchar,true >( FEquals_TChar_Arr<xchar>);
820
821 // ################################ IsLess ###########################################
822 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
823 BootstrapRegister<FIsLess , integer >( FIsLess_integer );
825 #else
826 BootstrapRegister<FIsLess , int8_t >( FIsLess_int8_t );
827 BootstrapRegister<FIsLess , uint8_t >( FIsLess_uint8_t );
828 BootstrapRegister<FIsLess , int16_t >( FIsLess_int16_t );
829 BootstrapRegister<FIsLess , uint16_t >( FIsLess_uint16_t );
830 BootstrapRegister<FIsLess , int32_t >( FIsLess_int32_t );
831 BootstrapRegister<FIsLess , uint32_t >( FIsLess_uint32_t );
832 BootstrapRegister<FIsLess , int64_t >( FIsLess_int64_t );
833 BootstrapRegister<FIsLess , uint64_t >( FIsLess_uint64_t );
834 BootstrapRegister<FIsLess , intGap_t >( FIsLess_intGap_t );
835 BootstrapRegister<FIsLess , uintGap_t >( FIsLess_uintGap_t);
836 #endif
837
838 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
840 #endif
841 BootstrapRegister<FIsLess , double >( FIsLess_double );
843
844 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
846 #else
852 #endif
853
854
855 // #############################################################################################
856 // ########################## Strings And Boxing ###################################
857 // #############################################################################################
858#if ALIB_STRINGS
859 // register functions interface implementations
860 BootstrapRegister<FIsLess, nchar,true >( FIsLess_TChar_arr<nchar> );
861 BootstrapRegister<FIsLess, wchar,true >( FIsLess_TChar_arr<wchar> );
862 BootstrapRegister<FIsLess, xchar,true >( FIsLess_TChar_arr<xchar> );
863
864 // register functions of type FAppend
865 BootstrapRegisterDefault<FAppend<character , lang::HeapAllocator>>( FAppend_Default<character , lang::HeapAllocator> );
866 BootstrapRegisterDefault<FAppend<complementChar, lang::HeapAllocator>>( FAppend_Default<complementChar, lang::HeapAllocator> );
867 BootstrapRegisterDefault<FAppend<strangeChar , lang::HeapAllocator>>( FAppend_Default<strangeChar , lang::HeapAllocator> );
868
871
872 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
875 #else
882 #endif
883
884 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
889 #else
910 #endif
911
914 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
917 #endif
918 if constexpr (sizeof(long double) <= sizeof(Placeholder) )
919 {
922 }
923 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, nchar, lang::HeapAllocator>);
924 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, nchar, lang::HeapAllocator>);
925 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, nchar, lang::HeapAllocator>);
926 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, wchar, lang::HeapAllocator>);
927 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, wchar, lang::HeapAllocator>);
928 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, wchar, lang::HeapAllocator>);
929 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, xchar, lang::HeapAllocator>);
930 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, xchar, lang::HeapAllocator>);
931 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, xchar, lang::HeapAllocator>);
932
942
949
950 // CodeMarker_CommonEnums
951 #if ALIB_ENUMRECORDS
976 #endif
977
979
980 #if ALIB_VARIABLES
981 # if ALIB_CAMP
983 # endif
986 #endif
987
988 #if ALIB_DEBUG
990 #if ALIB_EXT_LIB_THREADS_AVAILABLE
992 #endif
994 #endif
995
996 #if ALIB_FORMAT
1006 #endif
1007
1008 #if ALIB_SYSTEM && ALIB_EXCEPTIONS
1011 #endif
1012
1013 #if ALIB_ALOX
1018 #endif
1019
1020 #if ALIB_CLI
1022 #endif
1023 #if ALIB_EXPRESSIONS
1025 #endif
1026
1027 #if ALIB_FILES
1036 #endif
1037
1038
1039 #if !ALIB_SINGLE_THREADED
1041 alib::threads::Thread* >(alib::boxing::FAppend_thread);
1042 #if ALIB_ENUMRECORDS
1044 #endif
1045 #endif
1046 #if ALIB_BITBUFFER
1048 #endif
1049
1050#endif // ALIB_STRINGS
1051}
1052
1053// Box::dbgCheckRegistration
1054// Note: this method has to go here, to be able to check if boxing was bootstrapped already.
1055// If not, no check is performed.
1056#if ALIB_DEBUG_BOXING
1057
1059{
1060 // ERROR: A global or static instance of class Box is created and initialized to a
1061 // mapped type that uses a dynamic vtable. This is forbidden.
1062 // See chapter "12.4 Global And Static Box Instances" of the Programmer's Manual
1063 // of module ALib Boxing, for more information.
1064 assert( initFlag == 0x92A3EF61 ); // magic number
1065}
1066
1067void debug::DbgCheckRegistration( detail::VTable* vtable, bool increaseUsageCounter )
1068{
1069 if( vtable==nullptr)
1070 return;
1071
1072 if( increaseUsageCounter )
1073 ++vtable->DbgCntUsage;
1074
1075 if( initFlag== 0 || vtable->DbgProduction != detail::VTable::DbgFactoryType::Unregistered )
1076 return;
1077
1078 if( !vtable->IsArray() )
1079 ALIB_ERROR( "BOXING", "Static VTable of mapped type <{}> not registered.\n"
1080 "Use Macro ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER with bootstrapping.",
1081 &vtable->Type )
1082 else
1083 ALIB_ERROR( "BOXING", "Static VTable of mapped type <{}[]> not registered.\n"
1084 "Use Macro ALIB_BOXING_REGISTER_MAPPED_ARRAY_TYPE with bootstrapping.",
1085 &vtable->ElementType)
1086}
1087#endif
1088
1089
1090} // namespace [alib::boxing]
1091
Qualities
Per-entry information about how a node was scanned.
Definition finfo.inl:123
PHTypes
Denotes the type of placeholders (respectively the values they represent).
#define ALIB_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE_X(TAppendable)
#define ALIB_ERROR(domain,...)
Definition alib.inl:1045
#define ALIB_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE(TAppendable)
#define ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER(Identifier)
#define ALIB_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE_N(TAppendable)
#define ALIB_DBG(...)
Definition alib.inl:836
#define IF_ALIB_MONOMEM(...)
Definition alib.inl:361
#define ALIB_ASSERT_ERROR(cond, domain,...)
Definition alib.inl:1049
#define ALIB_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE_W(TAppendable)
#define ALIB_REL_DBG(releaseCode,...)
Definition alib.inl:838
This namespace exposes entities of module ALib Assert.
Definition assert.cpp:105
ALIB_DLL void DbgCheckIsInitialized()
ALIB_DLL void DbgCheckRegistration(detail::VTable *vtable, bool increaseUsageCounter)
void BootstrapRegisterDefault(typename TFDecl::Signature function)
Definition box.inl:1292
void shutdown()
Definition boxstrap.cpp:529
constexpr unsigned int SizeTraits
void BootstrapRegister(typename TFDecl::Signature function)
Definition box.inl:1254
void bootstrap()
Definition boxstrap.cpp:536
int Compare(const TChar *lhs, const TChar *rhs, integer cmpLength)
void FFormat_File(const alib::Box &box, const alib::String &formatSpec, alib::NumberFormat &nf, alib::AString &target)
Definition file.cpp:424
ALIB_DLL void FFormat_CallerInfo(const Box &self, const String &formatSpec, NumberFormat &nf, AString &target)
ALIB_DLL void FFormat_DateTime(const Box &self, const String &formatSpec, NumberFormat &nf, AString &target)
SortOrder
Denotes sort order.
Side
Denotes if something is left or right.
SourceData
Denotes if the source data should be moved or copied.
Reach
Denotes the reach of something.
Recursive
Denotes whether recursion is performed/allowed or not.
Timing
Denotes if asynchronous tasks become synchronized.
Alignment
Denotes Alignments.
ContainerOp
Denotes standard container operations.
Switch
Denotes if sth. is switched on or off.
Phase
Denotes a phase, e.g.,of a transaction.
CreateIfNotExists
Denotes whether something should be created if it does not exist.
Case
Denotes upper and lower case character treatment.
CreateDefaults
Denotes whether default entities should be created or not.
Whitespaces
Denotes whether a string is trimmed or not.
Caching
Denotes if a cache mechanism is enabled or disabled.
Propagation
Denotes whether a e.g a setting should be propagated.
ValueReference
Denotes if a value is interpreted as an absolute or relative number.
Safeness
Denotes whether something should be performed in a safe or unsafe fashion.
Initialization
Used for example with constructors that allow to suppress initialization of members.
Inclusion
Denotes how members of a set something should be taken into account.
Timezone
Denotes whether a time value represents local time or UTC.
strings::TAString< wchar, lang::HeapAllocator > WAString
Type alias in namespace alib.
lang::intGap_t intGap_t
Type alias in namespace alib.
Definition integers.inl:155
characters::wchar wchar
Type alias in namespace alib.
lang::integer integer
Type alias in namespace alib.
Definition integers.inl:149
strings::TAString< nchar, lang::HeapAllocator > NAString
Type alias in namespace alib.
monomem::TMonoAllocator< lang::HeapAllocator > MonoAllocator
lang::uintGap_t uintGap_t
Type alias in namespace alib.
Definition integers.inl:158
boxing::Pair< T, U > Pair
Type alias in namespace alib.
characters::nchar nchar
Type alias in namespace alib.
characters::xchar xchar
Type alias in namespace alib.
strings::TAString< xchar, lang::HeapAllocator > XAString
Type alias in namespace alib.
lang::uinteger uinteger
Type alias in namespace alib.
Definition integers.inl:152
static void Appendable(const Box &self, strings::TAString< TChar, TAllocator > &target)
static void WrappedAppendable(const Box &self, strings::TAString< TChar, TAllocator > &target)
static bool ComparableTypes(const Box &self, const Box &rhs)
static size_t UsePlaceholderBytes(const Box &self)
static ALIB_DLL bool ConstantTrue(const Box &)
Definition box.cpp:175
static ALIB_DLL void Shutdown()
Needs to be called only in debug versions to shut down internal hashtables cleanly.
Definition vtable.cpp:99
The custom function hash.
Definition vtable.inl:227
const std::type_info & ElementType
Definition vtable.inl:245
DbgFactoryType DbgProduction
Debug information.
Definition vtable.inl:274
const std::type_info & Type
Definition vtable.inl:241
static TNumberFormat Computational
TCString< TChar > HexLiteralPrefix