ALib C++ Framework
by
Library Version: 2605 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
boxstrap.cpp
1
2//##################################################################################################
3// Anonymous methods needed for Bootstrap()
4//##################################################################################################
5#if !DOXYGEN
6
7namespace alib::boxing {
8namespace {
9
10bool FIsNotNull_Default( const Box& box ) {
11 return !( (box.IsArray() && box.UnboxLength() == 0 )
12 || (box.IsPointer() && box.Data().PointerPair.P1 == nullptr )
13 );
14}
15
16std::size_t FHashcode_Default( const Box& self ) {
17 if( self.IsPointer() ) {
18 return size_t(0xa814e72cUL)
19 + size_t( self.TypeID().hash_code() )
20 + self.Data().Integrals.UArray[0] * 89047023;
21 }
22
23 if( self.IsEnum() ) {
24 return size_t(0x49a024efUL)
25 + size_t( self.TypeID().hash_code() )
26 + self.Data().Integrals.UArray[0] * 79204799;
27 }
28
29 if( self.IsArray() ) {
30 std::size_t result= 0xa925eb91L
31 + std::size_t( self.ElementTypeID().hash_code() );
32
33 // do different loops depending on array element size
34 auto size = self.ArrayElementSize();
35 auto length= self.UnboxLength();
36 if( size == 2 || size == 6 ) {
37 if (size == 6)
38 length*= 3;
39
40 std::span<uint16_t> array= {self.Data().GetPointer<uint16_t>(), size_t(length) };
41 for( uint16_t v : array )
42 result = 67 * result + v;
43
44 return size_t( result );
45 }
46
47 if( size == 4 ) {
48 std::span<uint32_t> array= {self.Data().GetPointer<uint32_t>(), size_t(length) };
49 for( uint32_t v : array )
50 result = 67*result + v;
51
52 return size_t( result );
53 }
54
55 if( size == 8 ) {
56 std::span<uint64_t> array= {self.Data().GetPointer<uint64_t>(), size_t(length) };
57 for( uint64_t v : array )
58 result = std::size_t( 67 * result + v );
59
60 return std::size_t( result );
61 }
62
63 // any other size
64 {
65 length*= size;
66 std::span<unsigned char> array= {self.Data().GetPointer<unsigned char>(), size_t(length) };
67 for( unsigned char v : array )
68 result = 67 * result + v;
69
70 return size_t( result );
71 } }
72
73 //--- default (value types) ---
74 size_t result= size_t(0xcf670957UL)
75 + size_t( self.TypeID().hash_code() );
76
77 unsigned usedLen= self.GetPlaceholderUsageLength();
78
79 constexpr uinteger Bit1= 1;
80
81 // smaller than first "word"
82 if( usedLen < sizeof( uinteger ) )
83 return size_t( ( self.Data().Integrals.UArray[0]
84 & ((Bit1 << (usedLen * 8) )- 1) ) * 32194735 )
85 + result;
86
87 // add first word
88 result+= self.Data().Integrals.UArray[0] * 32194735;
89
90 if( usedLen == sizeof(uinteger) )
91 return result;
92
93 // tests if smaller than second "word"
94 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) ) {
95 return size_t( ( self.Data().Integrals.UArray[1]
96 & ((Bit1 << ((usedLen - sizeof(uinteger)) * 8) )- 1) ) * 321947 )
97 + result;
98 }
99
100 return result + self.Data().Integrals.UArray[1] * 321947;
101
102
103}
104
105bool FEquals_Default( const Box& self, const Box& rhs ) {
106 if( !self.IsSameType( rhs ) )
107 return false;
108
109 // array types?
110 if( self.IsArray() ) {
111 // different in type, length or nulled?
112 if( self.UnboxLength() != rhs.UnboxLength()
113 || ( ( self.Data().GetPointer<char>() == nullptr)
114 != ( rhs .Data().GetPointer<char>() == nullptr ) ) )
115 return false;
116
117 return self.Data().GetPointer<char>() == nullptr
118 || self.UnboxLength() == 0
119 || self.Data().GetPointer<char>() == rhs.Data().GetPointer<char>()
120 || memcmp( self.Data().GetPointer<char>(),
121 rhs .Data().GetPointer<char>(),
122 static_cast <size_t>( self.UnboxLength() ) * self.ArrayElementSize()
123 ) == 0;
124 }
125
126 // non-array types
127 unsigned usedLen= self.GetPlaceholderUsageLength();
128
129 constexpr uinteger Bit1= uinteger( 1 );
130 // tests if smaller than first "word"
131 if( usedLen < sizeof( uinteger ) ) {
132 uinteger mask= (Bit1 << (usedLen * 8) )- 1;
133 return ( self.Data().Integrals.UArray[0] & mask )
134 == ( rhs .Data().Integrals.UArray[0] & mask );
135 }
136
137 // test first word
138 if( self.Data().Integrals.UArray[0] != rhs.Data().Integrals.UArray[0] )
139 return false;
140
141 if( usedLen == sizeof( uinteger ) )
142 return true;
143
144 // tests if smaller than second "word"
145 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) ) {
146 uinteger mask= (Bit1 << (usedLen - sizeof(uinteger)) * 8 )- 1;
147 return ( self.Data().Integrals.UArray[1] & mask )
148 == ( rhs .Data().Integrals.UArray[1] & mask );
149 }
150
151 return self.Data().Integrals.UArray[1] == rhs.Data().Integrals.UArray[1];
152}
153
154
155bool FEquals_double( const Box& self, const Box& rhsBox ) {
156 double lhs= self.UnboxFloatingPoint();
157 double rhs;
158 if( rhsBox.IsFloatingPoint () ) rhs= rhsBox.UnboxFloatingPoint () ;
159 else if( rhsBox.IsSignedIntegral () ) rhs= double( rhsBox.UnboxSignedIntegral () );
160 else if( rhsBox.IsUnsignedIntegral() ) rhs= double( rhsBox.UnboxUnsignedIntegral() );
161 else return false;
162
163 // we can ignore this warning, because we fixed it with the second test
164 #if defined(__clang__)
165 #pragma clang diagnostic push
166 #pragma clang diagnostic ignored "-Wfloat-equal"
167 #endif
168
169 return lhs == rhs
170 // take rounding errors into account.
171 // We use the "float-epsilon" and double it to be even a little weaker!
172 || std::fabs( lhs - rhs ) <= double( 2.0f * std::numeric_limits<float>::epsilon() );
173
174 #if defined(__clang__)
175 #pragma clang diagnostic pop
176 #endif
177}
178
179bool FEquals_integer( const Box& self, const Box& rhsBox ) {
180 if( rhsBox.IsFloatingPoint() )
181 return FEquals_double( rhsBox, self );
182
183 integer rhs;
184 if( rhsBox.IsSignedIntegral () ) rhs= rhsBox.UnboxSignedIntegral () ;
185 else if( rhsBox.IsUnsignedIntegral() ) rhs= static_cast< integer>( rhsBox.UnboxUnsignedIntegral() );
186 else return false;
187
188 return self.UnboxSignedIntegral() == rhs;
189}
190
191bool FEquals_uinteger( const Box& self, const Box& rhsBox ) {
192 if( rhsBox.IsFloatingPoint() )
193 return FEquals_double( rhsBox, self );
194
195 uinteger rhs;
196 if( rhsBox.IsSignedIntegral () ) rhs= uinteger( rhsBox.UnboxSignedIntegral () );
197 else if( rhsBox.IsUnsignedIntegral() ) rhs= rhsBox.UnboxUnsignedIntegral() ;
198 else return false;
199
200 return self.UnboxUnsignedIntegral() == rhs;
201}
202
203bool FEquals_char( const Box& self, const Box& rhs ) {
204 if( !rhs.IsCharacter() )
205 return false;
206 return self.UnboxCharacter() == rhs.UnboxCharacter();
207}
208
209
210template<typename TChar>
211bool FEquals_TChar_Arr( const Box& lhs, const Box& rhs ) {
212 if ( !rhs.IsArrayOf<TChar>() )
213 return false;
214
215 const TChar* compBuf= rhs.Data().GetPointer<TChar>();
216 const TChar* boxBuf= lhs.Data().GetPointer<TChar>();
217 if ( (boxBuf == nullptr) != (compBuf == nullptr) )
218 return false;
219
220 integer compLen= rhs.UnboxLength();
221 integer boxLen= lhs.UnboxLength();
222 if ( boxLen != compLen )
223 return false;
224
225 return 0 == characters::Compare <TChar>( boxBuf, compBuf, boxLen );
226}
227
228bool FIsLess_Default( const Box& box, const Box& comp ) {
229 return std::type_index( box.TypeID() ) < std::type_index(comp.TypeID() )
230 || ( box.TypeID() == comp.TypeID()
231 &&box.Data().Integrals.UArray[0] < comp.Data().Integrals.UArray[0] );
232
233}
234
235#if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
236bool FIsLess_integer( const Box& self, const Box& rhs ) {
237 auto lhs= self.Data().Integrals.Array[0];
238 if( rhs.IsSameType( self ) ) return lhs < rhs.Unbox<integer > ();
239 if( rhs.IsType<uinteger>() ) return lhs < integer(rhs.Unbox<uinteger> ());
240 if( rhs.IsFloatingPoint() ) return double( lhs ) < rhs.UnboxFloatingPoint();
241
242 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
243}
244
245bool FIsLess_uinteger( const Box& self, const Box& rhs ) {
246 auto lhs= self.Data().Integrals.UArray[0];
247 if( rhs.IsSameType( self ) ) return lhs < rhs.Data().Integrals.UArray[0] ;
248 if( rhs.IsType<integer> () ) return integer( lhs ) < rhs.Unbox<integer>();
249 if( rhs.IsFloatingPoint() ) return double ( lhs ) < rhs.UnboxFloatingPoint();
250
251 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
252}
253
254#else
255
256bool helperBijectiveLessS( integer selfVal, const Box& selfType, const Box& rhs )
257{
258 if( rhs.IsSignedIntegral () ) return selfVal < rhs.UnboxSignedIntegral () ;
259 if( rhs.IsUnsignedIntegral() ) return selfVal < integer(rhs.UnboxUnsignedIntegral());
260 if( rhs.IsFloatingPoint () ) return double( selfVal ) < rhs.UnboxFloatingPoint () ;
261
262 // no number?
263 return std::type_index( selfType.TypeID() ) < std::type_index( rhs.TypeID() );
264}
265
266bool helperBijectiveLessU( uinteger selfVal, const Box& selfType, const Box& rhs )
267{
268 if( rhs.IsSignedIntegral () ) return selfVal < uinteger(rhs.UnboxSignedIntegral ());
269 if( rhs.IsUnsignedIntegral() ) return selfVal < rhs.UnboxUnsignedIntegral() ;
270 if( rhs.IsFloatingPoint () ) return double(selfVal) < rhs.UnboxFloatingPoint () ;
271
272 // no number?
273 return std::type_index( selfType.TypeID() ) < std::type_index( rhs.TypeID() );
274}
275
276bool FIsLess_int8_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int8_t >() ), self, rhs ); }
277bool FIsLess_int16_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int16_t >() ), self, rhs ); }
278bool FIsLess_int32_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int32_t >() ), self, rhs ); }
279bool FIsLess_int64_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< int64_t >() ), self, rhs ); }
280bool FIsLess_intGap_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessS( integer( self.Unbox< intGap_t>() ), self, rhs ); }
281
282bool FIsLess_uint8_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint8_t >() ), self, rhs ); }
283bool FIsLess_uint16_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint16_t >() ), self, rhs ); }
284bool FIsLess_uint32_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint32_t >() ), self, rhs ); }
285bool FIsLess_uint64_t ( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uint64_t >() ), self, rhs ); }
286bool FIsLess_uintGap_t( const Box& self, const Box& rhs ) { return helperBijectiveLessU( uinteger( self.Unbox<uintGap_t>() ), self, rhs ); }
287
288#endif
289
290bool FIsLess_char( const Box& self, const Box& rhs ) {
291 if( rhs.IsCharacter () )
292 return self.UnboxCharacter() < rhs.UnboxCharacter () ;
293
294 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
295}
296
297
298
299bool FIsLess_double( const Box& self, const Box& rhs ) {
300 double lhs= self.Unbox<double>();
301 if( rhs.IsFloatingPoint () ) return lhs < rhs.UnboxFloatingPoint () ;
302 if( rhs.IsSignedIntegral () ) return lhs < double( rhs.UnboxSignedIntegral () );
303 if( rhs.IsUnsignedIntegral() ) return lhs < double( rhs.UnboxUnsignedIntegral() );
304
305 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
306}
307
308#if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
309 bool FIsLess_float( const Box& self, const Box& rhs )
310 {
311 float lhs= self.Unbox<float>();
312 if( rhs.IsType<float >() ) return lhs < rhs.Unbox<float >() ;
313 if( rhs.IsType<double >() ) return lhs < float( rhs.Unbox<double>() );
314 if( rhs.IsSignedIntegral () ) return lhs < float( rhs.UnboxSignedIntegral () );
315 if( rhs.IsUnsignedIntegral() ) return lhs < float( rhs.UnboxUnsignedIntegral() );
316
317 return std::type_index( self.TypeID() ) < std::type_index( rhs.TypeID() );
318 }
319#endif
320
321
322
323#if ALIB_MONOMEM
324
325void FClone_Default( Box& self, MonoAllocator& memory) {
326 if ( !self.IsArray() || self.UnboxLength() == 0)
327 return;
328
329 Placeholder& placeHolder= self.Data();
330 auto* src= placeHolder.GetPointer<char>();
331 if( src== nullptr || placeHolder.Integrals.Array[1] < 0 )
332 return;
333
334 size_t alignment= self.ArrayElementSize();
335 if( alignment > sizeof(std::ptrdiff_t) )
336 alignment= sizeof(std::ptrdiff_t);
337
338
339 placeHolder.SetPointer( memory().Alloc( self.ArrayElementSize() * placeHolder.Integrals.UArray[1],
340 alignment ) );
341 memcpy( placeHolder.GetPointer<char>(), src, self.ArrayElementSize() * placeHolder.Integrals.UArray[1] );
342}
343#endif
344
345//##################################################################################################
346bool FIsTrue_Default( const Box& self ) {
347 if( self.IsArray() )
348 return self.UnboxLength() != 0;
349
350 // non-array types
351 unsigned usedLen= self.GetPlaceholderUsageLength();
352
353 constexpr uinteger Bit1= uinteger( 1 );
354 // tests if smaller than first "word"
355 if( usedLen < sizeof( uinteger ) )
356 return ( self.Data().Integrals.UArray[0]
357 & ((Bit1 << (usedLen * 8) )- 1) ) != 0;
358
359 // test first word
360 if( self.Data().Integrals.UArray[0] != 0 )
361 return true;
362
363 if( usedLen == sizeof( uinteger ) )
364 return false;
365
366 // tests if smaller than second "word"
367 if( usedLen - sizeof( uinteger ) < sizeof( uinteger ) ) {
368 return ( self.Data().Integrals.UArray[1]
369 & ((Bit1 << (usedLen - sizeof(uinteger)) * 8 )- 1) ) != 0;
370 }
371
372 return self.Data().Integrals.UArray[1] != 0;
373}
374
375
376#if ALIB_STRINGS
377template<typename TChar>
378bool FIsLess_TChar_arr( const Box& lhs, const Box& rhs ) {
379 if( rhs.IsArrayOf<TChar>() )
380 return lhs.Unbox<strings::TString<TChar>>() < rhs.Unbox<strings::TString<TChar>>();
381
382 return std::type_index( lhs.TypeID() ) < std::type_index(rhs.TypeID() );
383}
384
385
386template<typename TChar, typename TAllocator>
387void FAppend_Default( const Box& self, strings::TAString<TChar,TAllocator>& target) {
388 if( self.IsPointer() ) {
389 target << ALIB_REL_DBG( "PointerType", self.TypeID() )
391 << strings::THex<TChar>( self.Data().Integrals.UArray[0] )
392 << ')';
393 return;
394 }
395
396 if( self.IsEnum() ) {
397 target << ALIB_REL_DBG( "EnumType", self.TypeID() ) << '(' << self.Data().Integrals.Array[0] << ')';
398 return;
399 }
400
401 if( self.IsArray() ) {
402 target << ALIB_REL_DBG( "ArrayType", self.ElementTypeID() ) << '[' << self.UnboxLength() << ']';
403 return;
404 }
405
406 // value type
407 target << ALIB_REL_DBG( "ValueType", self.TypeID() ) << "(Size: " << self.GetPlaceholderUsageLength() << " bytes)";
408}
409
410
411template<typename TCharSrc, typename TChar, typename TAllocator>
412void FAppend_TcharArr( const Box& box, strings::TAString<TChar,TAllocator>& target )
413{ target.template Append<NC>( box.UnboxArray<TCharSrc>(), box.UnboxLength() ); }
414
415#endif
416
417} // anonymous namespace
418} // namespace [alib::boxing]
419#endif //!DOXYGEN
420
421//##################################################################################################
422// Bootstrap()
423//##################################################################################################
424# include "ALib.Lang.CIFunctions.H"
425
426namespace alib::boxing{
427#if ALIB_DEBUG && !DOXYGEN
428namespace{ unsigned initFlag= 0; }
429#endif // !DOXYGEN
430
431void shutdown() {
432 ALIB_ASSERT_ERROR( initFlag == 0x92A3EF61, "BOXING", "Not initialized when calling shutdown." )
433 ALIB_DBG(initFlag= 1);
436}
437
438void bootstrap() {
439 ALIB_ASSERT_ERROR( initFlag == 0, "BOXING", "This method must not be invoked twice." )
440 ALIB_DBG(initFlag= 0x92A3EF61);
441
442 //#################################### Debug-compilation checks ##################################
443 #if ALIB_DEBUG
444 // check size of long double
445 {
446 debug::LongDoubleTrueLengthSet();
447 debug::LONGDOUBLE_WRITE_TEST_MEM[0]= 0.0L;
448 ALIB_ASSERT_ERROR( debug::LongDoubleTrueLengthTest(), "BOXING",
449 "Platform not supported. SizeTraits<long double> contains wrong size" )
450 }
451 #endif
452
453 //################################ BootstrapRegister Static VTables ##############################
456#if ALIB_MONOMEM
458#endif
460
461DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_1])
463DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_1])
464
465 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
468 #else
477 #if ALIB_SIZEOF_INTEGER == 8
480 #endif
481 #endif // !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
482
484 #if ALIB_SIZEOF_LONGDOUBLE_REPORTED <= 2 * ALIB_SIZEOF_INTEGER
486 #endif
487 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
489 #endif
490
491
492 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
494 #else
500 #endif
501
502DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_2])
504DOX_MARKER([DOX_BOXING_OPTIMIZE_REGISTER_2])
505
510
511 // Static VTables for standard types
514
515 // CodeMarker_CommonEnums
516 // Static VTables for low-level ALib types
521 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_ContainerOp )
522 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CreateDefaults )
523 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CreateIfNotExists )
524 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_CurrentData )
526 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Initialization )
529 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Propagation )
531 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Responsibility )
539 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_ValueReference )
540 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_Whitespaces )
541
543 #if !ALIB_SINGLE_THREADED
545 #endif
547 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_time_ticks_duration )
549 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_time_datetime_duration )
550
551
552 #if ALIB_STRINGS
553 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_tanstring )
554 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_tawstring )
555 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_wrapped_taxstring )
556 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_alib_strings_token )
557 #endif
558
560
561 #if ALIB_BITBUFFER
563 #endif
564 #if ALIB_SYSTEM
566 #endif
567 #if ALIB_EXCEPTIONS
569 #endif
570 #if ALIB_VARIABLES
571 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_priorities )
572 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_exceptions )
574 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_config_constcursor )
575 #endif
576 #if ALIB_FORMAT
577 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_system_fmtexceptions )
578 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_iec )
579 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_si )
580 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lang_format_bytesize_units )
581 #endif
582
583 #if ALIB_APP
585 #endif
586
587 #if ALIB_ALOX
591 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_lox_pair_verby_prio )
592 #endif
593
594 #if ALIB_EXPRESSIONS
595 ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER( vt_expressions_exceptions )
596 #endif
597
598 #if ALIB_FILETREE
607 #endif
608
609 //################################ Register default implementations ##############################
610 BootstrapRegisterDefault<FIsTrue >( FIsTrue_Default );
611 BootstrapRegisterDefault<FIsNotNull >( FIsNotNull_Default );
612 BootstrapRegisterDefault<FIsLess >( FIsLess_Default );
613 BootstrapRegisterDefault<FHashcode >( FHashcode_Default );
614 BootstrapRegisterDefault<FEquals >( FEquals_Default );
616 BootstrapRegisterDefault<FClone >( FClone_Default ); )
617
618 //########################################### IsNotNull ##########################################
620 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
623 #else
634 #endif
635
636 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
638 #else
644 #endif
645
646
647 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
649 #endif
651
652 //############################################ Hashcode ##########################################
654 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
657 #else
668 #endif
669
670 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
672 #else
678 #endif
679
680
681 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
683 #endif
686
687
688 //############################################# Equals ###########################################
690
691 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
692 BootstrapRegister<FEquals , integer >( FEquals_integer );
693 BootstrapRegister<FEquals , uinteger >( FEquals_uinteger );
694 #else
695 BootstrapRegister<FEquals , int8_t >( FEquals_integer );
696 BootstrapRegister<FEquals , uint8_t >( FEquals_uinteger );
697 BootstrapRegister<FEquals , int16_t >( FEquals_integer );
698 BootstrapRegister<FEquals , uint16_t >( FEquals_uinteger );
699 BootstrapRegister<FEquals , int32_t >( FEquals_integer );
700 BootstrapRegister<FEquals , uint32_t >( FEquals_uinteger );
701 BootstrapRegister<FEquals , int64_t >( FEquals_integer );
702 BootstrapRegister<FEquals , uint64_t >( FEquals_uinteger );
704 BootstrapRegister<FEquals , uintGap_t >( FEquals_uinteger );
705 #endif
706
707 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
708 BootstrapRegister<FEquals , float >( FEquals_double );
709 #endif
710 BootstrapRegister<FEquals , double >( FEquals_double );
712
713
714 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
716 #else
722 #endif
723
724 BootstrapRegister<FEquals , nchar,true >( FEquals_TChar_Arr<nchar>);
725 BootstrapRegister<FEquals , wchar,true >( FEquals_TChar_Arr<wchar>);
726 BootstrapRegister<FEquals , xchar,true >( FEquals_TChar_Arr<xchar>);
727
728 //############################################# IsLess ###########################################
729 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
730 BootstrapRegister<FIsLess , integer >( FIsLess_integer );
732 #else
733 BootstrapRegister<FIsLess , int8_t >( FIsLess_int8_t );
734 BootstrapRegister<FIsLess , uint8_t >( FIsLess_uint8_t );
735 BootstrapRegister<FIsLess , int16_t >( FIsLess_int16_t );
736 BootstrapRegister<FIsLess , uint16_t >( FIsLess_uint16_t );
737 BootstrapRegister<FIsLess , int32_t >( FIsLess_int32_t );
738 BootstrapRegister<FIsLess , uint32_t >( FIsLess_uint32_t );
739 BootstrapRegister<FIsLess , int64_t >( FIsLess_int64_t );
740 BootstrapRegister<FIsLess , uint64_t >( FIsLess_uint64_t );
741 BootstrapRegister<FIsLess , intGap_t >( FIsLess_intGap_t );
742 BootstrapRegister<FIsLess , uintGap_t >( FIsLess_uintGap_t);
743 #endif
744
745 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
747 #endif
748 BootstrapRegister<FIsLess , double >( FIsLess_double );
750
751 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
753 #else
759 #endif
760
761
762 //################################################################################################
763 //####################################### Strings And Boxing #####################################
764 //################################################################################################
765#if ALIB_STRINGS
766 // register functions interface implementations
767 BootstrapRegister<FIsLess, nchar,true >( FIsLess_TChar_arr<nchar> );
768 BootstrapRegister<FIsLess, wchar,true >( FIsLess_TChar_arr<wchar> );
769 BootstrapRegister<FIsLess, xchar,true >( FIsLess_TChar_arr<xchar> );
770
771 // register functions of type FAppend
772 BootstrapRegisterDefault<FAppend<character , lang::HeapAllocator>>( FAppend_Default<character , lang::HeapAllocator> );
773 BootstrapRegisterDefault<FAppend<complementChar, lang::HeapAllocator>>( FAppend_Default<complementChar, lang::HeapAllocator> );
774 BootstrapRegisterDefault<FAppend<strangeChar , lang::HeapAllocator>>( FAppend_Default<strangeChar , lang::HeapAllocator> );
775
778
779 #if !ALIB_FEAT_BOXING_BIJECTIVE_CHARACTERS
782 #else
789 #endif
790
791 #if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
796 #else
817 #endif
818
821 #if ALIB_FEAT_BOXING_BIJECTIVE_FLOATS
824 #endif
825 if constexpr (sizeof(long double) <= sizeof(Placeholder) ) {
828 }
829 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, nchar, lang::HeapAllocator>);
830 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, nchar, lang::HeapAllocator>);
831 BootstrapRegister<FAppend<nchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, nchar, lang::HeapAllocator>);
832 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, wchar, lang::HeapAllocator>);
833 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, wchar, lang::HeapAllocator>);
834 BootstrapRegister<FAppend<wchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, wchar, lang::HeapAllocator>);
835 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, nchar ,true>(FAppend_TcharArr<nchar, xchar, lang::HeapAllocator>);
836 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, wchar ,true>(FAppend_TcharArr<wchar, xchar, lang::HeapAllocator>);
837 BootstrapRegister<FAppend<xchar, lang::HeapAllocator>, xchar ,true>(FAppend_TcharArr<xchar, xchar, lang::HeapAllocator>);
838
848
855
856 // CodeMarker_CommonEnums
857 #if ALIB_ENUMRECORDS
883 #endif
884
886
887 #if ALIB_VARIABLES
888 # if ALIB_CAMP
890 # endif
893 #endif
894
895 #if ALIB_DEBUG
897 #if ALIB_EXT_LIB_THREADS_AVAILABLE
899 #endif
901 #endif
904
905 #if ALIB_FORMAT
915 #endif
916
917 #if ALIB_SYSTEM && ALIB_EXCEPTIONS
919 #endif
920
921 #if ALIB_ALOX
926 #endif
927
928 #if ALIB_APP
930 #endif
931 #if ALIB_EXPRESSIONS
933 #endif
934
935 #if ALIB_FILETREE
944 #endif
945
946
947 #if !ALIB_SINGLE_THREADED
949 alib::threads::Thread* >(alib::boxing::FAppend_thread);
950 #if ALIB_ENUMRECORDS
952 #endif
953 #endif
954 #if ALIB_BITBUFFER
956 #endif
957
958#endif // ALIB_STRINGS
959}
960
961// Box::dbgCheckRegistration
962// Note: this method has to go here, to be able to check if boxing was bootstrapped already.
963// If not, no check is performed.
964#if ALIB_DEBUG_BOXING
965
967 // ERROR: A global or static instance of class Box is created and initialized to a
968 // mapped type that uses a dynamic vtable. This is forbidden.
969 // See chapter "12.4 Global And Static Box Instances" of the Programmer's Manual
970 // of module ALib Boxing, for more information.
971 assert( initFlag == 0x92A3EF61 ); // magic number
972}
973
974void debug::DbgCheckRegistration( detail::VTable* vtable, bool increaseUsageCounter ) {
975 if( vtable==nullptr)
976 return;
977
978 if( increaseUsageCounter )
979 ++vtable->DbgCntUsage;
980
981 if( initFlag== 0 || vtable->DbgProduction != detail::VTable::DbgFactoryType::Unregistered )
982 return;
983
984 if( !vtable->IsArray() )
985 ALIB_ERROR( "BOXING", "Static VTable of mapped type <{}> not registered.\n"
986 "Use the macro ALIB_BOXING_BOOTSTRAP_VTABLE_DBG_REGISTER with bootstrapping.",
987 &vtable->Type )
988 else
989 ALIB_ERROR( "BOXING", "Static VTable of mapped type <{}[]> not registered.\n"
990 "Use the macro ALIB_BOXING_REGISTER_MAPPED_ARRAY_TYPE with bootstrapping.",
991 &vtable->ElementType)
992}
993#endif
994
995
996} // namespace [alib::boxing]
#define ALIB_ERROR(domain,...)
#define ALIB_DBG(...)
#define IF_ALIB_MONOMEM(...)
#define ALIB_ASSERT_ERROR(cond, domain,...)
#define ALIB_REL_DBG(releaseCode,...)
#define ALIB_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE_X(TAppendable)
#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_BOXING_BOOTSTRAP_REGISTER_FAPPEND_FOR_APPENDABLE_TYPE_W(TAppendable)
PHTypes
Denotes the type of placeholders (respectively the values they represent).
ScanStates
Per-entry information about how a node was scanned.
This namespace exposes entities of module ALib Assert.
Definition assert.cpp:4
void DbgCheckIsInitialized()
Definition boxstrap.cpp:966
void DbgCheckRegistration(detail::VTable *vtable, bool increaseUsageCounter)
Definition boxstrap.cpp:974
DOXYGEN.
Definition box.cpp:17
void BootstrapRegisterDefault(typename TFDecl::Signature function)
Definition box.hpp:1203
void shutdown()
Definition boxstrap.cpp:431
void bootstrap()
Definition boxstrap.cpp:438
void BootstrapRegister(typename TFDecl::Signature function)
Definition box.hpp:1166
constexpr unsigned SizeTraits
int Compare(const TChar *lhs, const TChar *rhs, integer cmpLength)
void FFormat_File(const Box &box, const String &formatSpec, NumberFormat &nf, AString &target)
Definition ftfile.cpp:417
void FFormat_DateTime(const Box &self, const String &formatSpec, NumberFormat &nf, AString &target)
void FFormat_CallerInfo(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.
LineFeeds
Denotes line-feed encoding sequences "\n" and "\r\n".
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.
Exceptions
Exception codes of namespace #"alib::variables;2".
Definition vmeta.hpp:17
monomem::TMonoAllocator< lang::HeapAllocator > MonoAllocator
lang::intGap_t intGap_t
Type alias in namespace #"%alib".
Definition integers.hpp:155
strings::TAString< nchar, lang::HeapAllocator > NAString
Type alias in namespace #"%alib".
characters::wchar wchar
Type alias in namespace #"%alib".
lang::integer integer
Type alias in namespace #"%alib".
Definition integers.hpp:149
strings::TAString< xchar, lang::HeapAllocator > XAString
Type alias in namespace #"%alib".
lang::uintGap_t uintGap_t
Type alias in namespace #"%alib".
Definition integers.hpp: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< wchar, lang::HeapAllocator > WAString
Type alias in namespace #"%alib".
lang::uinteger uinteger
Type alias in namespace #"%alib".
Definition integers.hpp: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 bool ConstantTrue(const Box &)
Definition box.cpp:138
static void Shutdown()
Needs to be called only in debug versions to shut down internal hashtables cleanly.
Definition vtable.cpp:56
The custom function hash.
Definition vtable.hpp:226
const std::type_info & ElementType
Definition vtable.hpp:243
DbgFactoryType DbgProduction
Debug information.
Definition vtable.hpp:271
const std::type_info & Type
Definition vtable.hpp:239
static TNumberFormat Computational
TCString< TChar > HexLiteralPrefix