Changeset 8cbe732 for libcfa/src
- Timestamp:
- Oct 13, 2023, 7:13:21 PM (2 years ago)
- Branches:
- master
- Children:
- a97b9ed, bab2917
- Parents:
- 85034ed (diff), 0bf0b978 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- libcfa/src
- Files:
-
- 13 edited
-
collections/string_res.cfa (modified) (3 diffs)
-
concurrency/channel.hfa (modified) (2 diffs)
-
concurrency/cofor.cfa (modified) (4 diffs)
-
concurrency/cofor.hfa (modified) (2 diffs)
-
concurrency/coroutine.cfa (modified) (1 diff)
-
concurrency/coroutine.hfa (modified) (1 diff)
-
concurrency/kernel/fwd.hfa (modified) (16 diffs)
-
heap.cfa (modified) (5 diffs)
-
iostream.cfa (modified) (7 diffs)
-
iostream.hfa (modified) (2 diffs)
-
rational.cfa (modified) (2 diffs)
-
rational.hfa (modified) (2 diffs)
-
stdlib.hfa (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/collections/string_res.cfa
r85034ed r8cbe732 218 218 // Read in chunks. Often, one chunk is enough. Keep the string that accumulates chunks last in the heap, 219 219 // so available room is rest of heap. When a chunk fills the heap, force growth then take the next chunk. 220 for (;;) { 220 for (bool cont = true; cont; ) { 221 cont = false; 222 221 223 // Append dummy content to temp, forcing expansion when applicable (occurs always on subsequent loops) 222 224 // length 2 ensures room for at least one real char, plus scanf/pipe-cstr's null terminator … … 228 230 temp.Handle.ulink->EndVbyte -= 2; 229 231 230 // rest of heap , less 1 byte for null terminator,is available to read into231 int lenReadable = (char*)temp.Handle.ulink->ExtVbyte - temp.Handle.ulink->EndVbyte - 1;232 assert (lenReadable >= 1);232 // rest of heap is available to read into 233 int lenReadable = (char*)temp.Handle.ulink->ExtVbyte - temp.Handle.ulink->EndVbyte; 234 assert (lenReadable >= 2); 233 235 234 236 // get bytes 235 in | wdi( lenReadable + 1, lenReadable, temp.Handle.ulink->EndVbyte ); 237 try { 238 in | wdi( lenReadable, temp.Handle.ulink->EndVbyte ); 239 } catch (cstring_length*) { 240 cont = true; 241 } 236 242 int lenWasRead = strlen(temp.Handle.ulink->EndVbyte); 237 243 … … 239 245 temp.Handle.lnth += lenWasRead; 240 246 temp.Handle.ulink->EndVbyte += lenWasRead; 241 242 if (lenWasRead < lenReadable) break;243 247 } 244 248 -
libcfa/src/concurrency/channel.hfa
r85034ed r8cbe732 130 130 static inline void __cons_handoff( channel(T) & chan, T & elem ) with(chan) { 131 131 memcpy( cons`first.extra, (void *)&elem, sizeof(T) ); // do waiting consumer work 132 __atomic_thread_fence( __ATOMIC_SEQ_CST ); 132 133 wake_one( cons ); 133 134 } … … 136 137 static inline void __prods_handoff( channel(T) & chan, T & retval ) with(chan) { 137 138 memcpy( (void *)&retval, prods`first.extra, sizeof(T) ); 139 __atomic_thread_fence( __ATOMIC_SEQ_CST ); 138 140 wake_one( prods ); 139 141 } -
libcfa/src/concurrency/cofor.cfa
r85034ed r8cbe732 4 4 // cofor ( uC++ COFOR ) 5 5 6 thread co _runner {6 thread cofor_runner { 7 7 ssize_t low, high; 8 8 __cofor_body_t loop_body; 9 9 }; 10 10 11 static void ?{}( co _runner & this, ssize_t low, ssize_t high, __cofor_body_t loop_body ) {11 static void ?{}( cofor_runner & this, ssize_t low, ssize_t high, __cofor_body_t loop_body ) { 12 12 this.low = low; 13 13 this.high = high; … … 15 15 } 16 16 17 void main( co _runner & this ) with( this ) {17 void main( cofor_runner & this ) with( this ) { 18 18 for ( ssize_t i = low; i < high; i++ ) 19 19 loop_body(i); 20 20 } 21 21 22 void cofor( ssize_t low, ssize_t high, __cofor_body_t loop_body ) libcfa_public {22 void __Cofor__( ssize_t low, ssize_t high, __cofor_body_t loop_body ) libcfa_public { 23 23 ssize_t range = high - low; 24 24 if ( range <= 0 ) return; … … 29 29 ssize_t i = 0; 30 30 ssize_t stride_iter = low; 31 co _runner * runners[ threads ];31 cofor_runner * runners[ threads ]; 32 32 for ( i; threads ) { 33 33 runners[i] = alloc(); … … 45 45 } 46 46 47 //////////////////////////////////////////////////////////////////////////////////////////48 // parallel (COBEGIN/COEND)49 47 50 thread para_runner {51 parallel_stmt_t body;52 void * arg;53 };54 55 static void ?{}( para_runner & this, parallel_stmt_t body, void * arg ) {56 this.body = body;57 this.arg = arg;58 }59 60 void main( para_runner & this ) with( this ) { body( arg ); }61 62 void parallel( parallel_stmt_t * stmts, void ** args, size_t num ) libcfa_public {63 para_runner * runners[ num ];64 for ( i; num )65 (*(runners[i] = malloc())){ stmts[i], args[i] };66 for ( i; num )67 delete( runners[i] );68 }69 -
libcfa/src/concurrency/cofor.hfa
r85034ed r8cbe732 5 5 typedef void (*__cofor_body_t)( ssize_t ); 6 6 7 void cofor( ssize_t low, ssize_t high, __cofor_body_t loop_body );7 void __Cofor__( ssize_t low, ssize_t high, __cofor_body_t loop_body ); 8 8 9 9 #define COFOR( lidname, low, high, loopbody ) \ … … 12 12 loopbody \ 13 13 } \ 14 cofor( low, high, __CFA_loopLambda__ ); \14 __Cofor__( low, high, __CFA_loopLambda__ ); \ 15 15 } 16 16 17 17 ////////////////////////////////////////////////////////////////////////////////////////// 18 // parallel (COBEGIN/COEND) 19 typedef void (*parallel_stmt_t)( void * ); 18 // corun 20 19 21 void parallel( parallel_stmt_t * stmts, void ** args, size_t num ); 20 // 21 typedef void (*__CFA_corun_lambda_t)( void ); 22 23 // used to run a corun statement in parallel 24 thread co_runner { 25 __CFA_corun_lambda_t body; 26 }; 27 28 // wraps a co_runner to provide RAII deallocation 29 struct runner_block { 30 co_runner * runner; 31 }; 32 static inline void ?{}( co_runner & this, __CFA_corun_lambda_t body ) { this.body = body; } 33 34 void main( co_runner & this ) with( this ) { body(); } 35 36 static inline void ?{}( runner_block & this ) {} 37 static inline void ?{}( runner_block & this, __CFA_corun_lambda_t body ) { 38 (*(this.runner = malloc())){ body }; 39 } 40 41 static inline void ^?{}( runner_block & this ) { 42 delete( this.runner ); 43 } 44 -
libcfa/src/concurrency/coroutine.cfa
r85034ed r8cbe732 343 343 344 344 bool poll() libcfa_public { return poll( active_coroutine() ); } 345 void enable_ehm() libcfa_public { active_coroutine()->ehm_state.ehm_enabled = true; } 346 void disable_ehm() libcfa_public { active_coroutine()->ehm_state.ehm_enabled = false; } 347 bool checked_poll() libcfa_public { return active_coroutine()->ehm_state.ehm_enabled ? poll( active_coroutine() ) : false; } 345 348 coroutine$ * resumer() libcfa_public { return active_coroutine()->last; } 346 349 coroutine$ * first_resumer() libcfa_public { return active_coroutine()->starter; } -
libcfa/src/concurrency/coroutine.hfa
r85034ed r8cbe732 224 224 225 225 // non local ehm and coroutine utility routines 226 void enable_ehm(); 227 void disable_ehm(); 226 228 bool poll( coroutine$ * cor ); 227 229 bool poll(); 230 bool checked_poll(); 228 231 coroutine$ * resumer(); 229 232 coroutine$ * first_resumer(); 230 233 231 234 forall(T & | is_coroutine(T)) { 232 void enable_ehm( T & cor ); 233 void disable_ehm( T & cor ); 235 void enable_ehm( T & cor ); // enable checking non-local exceptions for cor via checked_poll 236 void disable_ehm( T & cor ); // disable checking non-local exceptions for cor via checked_poll 234 237 bool poll( T & cor ); 235 bool checked_poll( T & cor ); 238 bool checked_poll( T & cor ); // check for non-local exceptions while respecting enable/disable 236 239 coroutine$ * resumer( T & cor ); 237 240 coroutine$ * first_resumer( T & cor ); -
libcfa/src/concurrency/kernel/fwd.hfa
r85034ed r8cbe732 118 118 // Yield: yield N times 119 119 static inline void yield( size_t times ) { 120 for ( times ) {120 for ( times ) { 121 121 yield(); 122 122 } … … 136 136 137 137 bool wait(single_sem & this) { 138 for () {138 for () { 139 139 struct thread$ * expected = this.ptr; 140 if (expected == 1p) {141 if (__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {140 if (expected == 1p) { 141 if (__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 142 142 return false; 143 143 } … … 145 145 else { 146 146 /* paranoid */ verify( expected == 0p ); 147 if (__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {147 if (__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 148 148 park(); 149 149 return true; … … 155 155 156 156 bool post(single_sem & this) { 157 for () {157 for () { 158 158 struct thread$ * expected = this.ptr; 159 if (expected == 1p) return false;160 if (expected == 0p) {161 if (__atomic_compare_exchange_n(&this.ptr, &expected, 1p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {159 if (expected == 1p) return false; 160 if (expected == 0p) { 161 if (__atomic_compare_exchange_n(&this.ptr, &expected, 1p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 162 162 return false; 163 163 } 164 164 } 165 165 else { 166 if (__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {166 if (__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 167 167 unpark( expected ); 168 168 return true; … … 195 195 // return true if the thread was parked 196 196 bool wait(oneshot & this) { 197 for () {197 for () { 198 198 struct thread$ * expected = this.ptr; 199 if (expected == oneshot_FULFILLED) return false;200 if (__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {199 if (expected == oneshot_FULFILLED) return false; 200 if (__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 201 201 park(); 202 202 /* paranoid */ verify( this.ptr == oneshot_FULFILLED ); … … 210 210 thread$ * post(oneshot & this, bool do_unpark = true) { 211 211 struct thread$ * got = __atomic_exchange_n( &this.ptr, oneshot_FULFILLED, __ATOMIC_SEQ_CST); 212 if ( got == oneshot_ARMED || got == oneshot_FULFILLED ) return 0p;213 if (do_unpark) unpark( got );212 if ( got == oneshot_ARMED || got == oneshot_FULFILLED ) return 0p; 213 if (do_unpark) unpark( got ); 214 214 return got; 215 215 } … … 255 255 /* paranoid */ verify( wait_ctx.ptr == oneshot_ARMED || wait_ctx.ptr == oneshot_FULFILLED ); 256 256 // The future needs to set the wait context 257 for () {257 for () { 258 258 struct oneshot * expected = this.ptr; 259 259 // Is the future already fulfilled? 260 if (expected == future_FULFILLED) return false; // Yes, just return false (didn't block)260 if (expected == future_FULFILLED) return false; // Yes, just return false (didn't block) 261 261 262 262 // The future is not fulfilled, try to setup the wait context 263 if (__atomic_compare_exchange_n(&this.ptr, &expected, &wait_ctx, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {263 if (__atomic_compare_exchange_n(&this.ptr, &expected, &wait_ctx, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 264 264 return true; 265 265 } … … 276 276 277 277 // attempt to remove the context so it doesn't get consumed. 278 if (__atomic_compare_exchange_n( &this.ptr, &expected, future_ARMED, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {278 if (__atomic_compare_exchange_n( &this.ptr, &expected, future_ARMED, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 279 279 // we still have the original context, then no one else saw it 280 280 return false; … … 282 282 283 283 // expected == ARMED: future was never actually setup, just return 284 if ( expected == future_ARMED ) return false;284 if ( expected == future_ARMED ) return false; 285 285 286 286 // expected == FULFILLED: the future is ready and the context was fully consumed 287 287 // the server won't use the pointer again 288 288 // It is safe to delete (which could happen after the return) 289 if ( expected == future_FULFILLED ) return true;289 if ( expected == future_FULFILLED ) return true; 290 290 291 291 // expected == PROGRESS: the future is ready but the context hasn't fully been consumed 292 292 // spin until it is safe to move on 293 if ( expected == future_PROGRESS ) {293 if ( expected == future_PROGRESS ) { 294 294 while( this.ptr != future_FULFILLED ) Pause(); 295 295 /* paranoid */ verify( this.ptr == future_FULFILLED ); … … 310 310 311 311 // If the future isn't already fulfilled, let the server delete it 312 if ( got == future_ARMED ) return false;312 if ( got == future_ARMED ) return false; 313 313 314 314 // got == PROGRESS: the future is ready but the context hasn't fully been consumed 315 315 // spin until it is safe to move on 316 if ( got == future_PROGRESS ) {316 if ( got == future_PROGRESS ) { 317 317 while( this.ptr != future_FULFILLED ) Pause(); 318 318 got = future_FULFILLED; … … 327 327 // from the server side, mark the future as fulfilled 328 328 // delete it if needed 329 329 330 thread$ * fulfil( future_t & this, bool do_unpark = true ) { 330 for () {331 for () { 331 332 struct oneshot * expected = this.ptr; 332 // was this abandoned? 333 333 334 #if defined(__GNUC__) && __GNUC__ >= 7 334 #pragma GCC diagnostic push 335 #pragma GCC diagnostic ignored "-Wfree-nonheap-object" 335 // SKULLDUGGERY: gcc bug does not handle push/pop for -Wfree-nonheap-object 336 //#pragma GCC diagnostic push 337 #pragma GCC diagnostic ignored "-Wfree-nonheap-object" 336 338 #endif 337 if( expected == future_ABANDONED ) { free( &this ); return 0p; } 339 340 if ( expected == future_ABANDONED ) { free( &this ); return 0p; } 341 338 342 #if defined(__GNUC__) && __GNUC__ >= 7 339 #pragma GCC diagnostic pop343 //#pragma GCC diagnostic pop 340 344 #endif 341 345 … … 346 350 // If there is no context then we can skip the in progress phase 347 351 struct oneshot * want = expected == future_ARMED ? future_FULFILLED : future_PROGRESS; 348 if (__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {349 if ( expected == future_ARMED ) { return 0p; }352 if (__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 353 if ( expected == future_ARMED ) { return 0p; } 350 354 thread$ * ret = post( *expected, do_unpark ); 351 355 __atomic_store_n( &this.ptr, future_FULFILLED, __ATOMIC_SEQ_CST); … … 359 363 bool wait( future_t & this ) { 360 364 oneshot temp; 361 if ( !setup(this, temp) ) return false;365 if ( !setup(this, temp) ) return false; 362 366 363 367 // Wait context is setup, just wait on it … … 387 391 // if any are already satisfied return 388 392 for ( i; num_futures ) { 389 if ( !setup(futures[i], temp) ) return futures[i];393 if ( !setup(futures[i], temp) ) return futures[i]; 390 394 } 391 395 … … 413 417 414 418 #define __STATS__(in_kernel, ...) { \ 415 if ( !(in_kernel) ) disable_interrupts(); \416 with ( *__tls_stats() ) { \419 if ( !(in_kernel) ) disable_interrupts(); \ 420 with ( *__tls_stats() ) { \ 417 421 __VA_ARGS__ \ 418 422 } \ 419 if ( !(in_kernel) ) enable_interrupts(); \423 if ( !(in_kernel) ) enable_interrupts(); \ 420 424 } 421 425 #if defined(CFA_HAVE_LINUX_IO_URING_H) 422 426 #define __IO_STATS__(in_kernel, ...) { \ 423 if ( !(in_kernel) ) disable_interrupts(); \424 with ( *__tls_stats() ) { \427 if ( !(in_kernel) ) disable_interrupts(); \ 428 with ( *__tls_stats() ) { \ 425 429 __VA_ARGS__ \ 426 430 } \ 427 if ( !(in_kernel) ) enable_interrupts(); \431 if ( !(in_kernel) ) enable_interrupts(); \ 428 432 } 429 433 #else … … 436 440 } 437 441 } 438 #endif 442 #endif // #endif -
libcfa/src/heap.cfa
r85034ed r8cbe732 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 11 11:21:10202313 // Update Count : 161 512 // Last Modified On : Sat Sep 30 17:31:15 2023 13 // Update Count : 1617 14 14 // 15 15 … … 53 53 #define TLSMODEL __attribute__(( tls_model("initial-exec") )) 54 54 55 //#define __STATISTICS__55 #define __STATISTICS__ 56 56 57 57 enum { … … 681 681 682 682 static HeapStatistics & collectStats( HeapStatistics & stats ) with( heapMaster ) { 683 lock( mgrLock );683 lock( heapMaster.mgrLock ); 684 684 685 685 stats += heapMaster.stats; … … 688 688 } // for 689 689 690 unlock( mgrLock );690 unlock( heapMaster.mgrLock ); 691 691 return stats; 692 692 } // collectStats 693 693 694 694 static inline void clearStats() { 695 lock( mgrLock );695 lock( heapMaster.mgrLock ); 696 696 697 697 // Zero the heap master and all active thread heaps. … … 701 701 } // for 702 702 703 unlock( mgrLock );703 unlock( heapMaster.mgrLock ); 704 704 } // clearStats 705 705 #endif // __STATISTICS__ -
libcfa/src/iostream.cfa
r85034ed r8cbe732 11 11 // Created On : Wed May 27 17:56:53 2015 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : S at Sep 2 14:42:01 202314 // Update Count : 156 113 // Last Modified On : Sun Oct 8 12:10:21 2023 14 // Update Count : 1564 15 15 // 16 16 … … 22 22 #include <float.h> // DBL_DIG, LDBL_DIG 23 23 #include <complex.h> // creal, cimag 24 #include <ctype.h> // isspace 24 25 //#include <stdio.h> 25 26 … … 29 30 extern char *strcpy (char *__restrict __dest, const char *__restrict __src) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))); 30 31 extern void *memcpy (void *__restrict __dest, const void *__restrict __src, size_t __n) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1, 2))); 32 extern char *strchr(const char *str, int ch); 31 33 } // extern "C" 32 34 … … 649 651 exp10 = floor( exp10, 3 ); \ 650 652 value *= pow( 10.0, -exp10 ); \ 651 if ( pc < = 3) pc = 3; \653 if ( pc < 0 ) pc = 3; \ 652 654 } /* eng */ \ 653 655 \ … … 960 962 istype & ?|?( istype & is, _Istream_Cskip f ) { 961 963 // printf( "skip %s %d\n", f.scanset, f.wd ); 962 if ( f.scanset ) fmt( is, f.scanset, "" ); // no input arguments 964 if ( f.scanset ) { 965 int nscanset = strlen(f.scanset); 966 char fmtstr[ sizeof("%*[]") + nscanset ]; 967 int pos = 0; 968 fmtstr[pos] = '%'; pos += 1; 969 fmtstr[pos] = '*'; pos += 1; 970 fmtstr[pos] = '['; pos += 1; 971 strcpy( &fmtstr[pos], f.scanset ); pos += nscanset; 972 fmtstr[pos] = ']'; pos += 1; 973 fmtstr[pos] = '\0'; 974 fmt( is, fmtstr, (void*)0 ); // last arg is dummy: suppress gcc warning 975 } 963 976 else for ( f.wd ) fmt( is, "%*c" ); 964 977 return is; … … 980 993 // wd is buffer bytes available (for input chars + null terminator) 981 994 // rwd is count of input chars 982 int rwd = f.flags.rwd ? f.wd : (f.wd - 1); 995 int rwd; 996 if (f.flags.rwd) { 997 verify (f.wd >= 0); 998 rwd = f.wd; 999 } else { 1000 verify (f.wd >= 1); 1001 rwd = f.wd - 1; 1002 } // if 983 1003 start += sprintf( &fmtstr[start], "%d", rwd ); 984 1004 } … … 1000 1020 1001 1021 int check = f.wd - 2; 1002 if ( ! f.flags.rwd ) f.s[check] = '\0'; // insert sentinel 1022 if (! f.flags.ignore ) { 1023 f.s[0] = '\0'; 1024 if ( ! f.flags.rwd ) f.s[check] = '\0'; // insert sentinel 1025 } 1003 1026 len = fmt( is, fmtstr, f.s ); 1004 1027 //fprintf( stderr, "KK %s %zd %d %c %s\n", fmtstr, len, check, f.s[check], f.s ); 1005 1028 1006 if ( ! f.flags.rwd && f.s[check] != '\0' ) // sentinel overwritten ? 1007 throw (cstring_length){ &cstring_length_vt }; 1029 if ( ! f.flags.ignore && ! f.flags.rwd && f.s[check] != '\0' ) { // sentinel overwritten ? 1030 // buffer filled, but would we have kept going? 1031 if ( ! eof( is ) ) { 1032 char peek; 1033 fmt( is, "%c", &peek ); 1034 ungetc( is, peek ); 1035 bool hasMore; 1036 if (f.flags.delimiter) { // getline 1037 hasMore = (peek != f.delimiter[0]); 1038 } else if (f.scanset) { // incl/excl 1039 bool peekMatch = strchr(f.scanset, peek) != 0p; 1040 hasMore = f.flags.inex ? (!peekMatch) : (peekMatch); 1041 } else { // %s 1042 hasMore = !isspace(peek); 1043 } 1044 if (hasMore) throw (cstring_length){ &cstring_length_vt }; 1045 } // if 1046 } // if 1008 1047 1009 1048 if ( f.flags.delimiter ) { // getline ? -
libcfa/src/iostream.hfa
r85034ed r8cbe732 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : S at Sep 2 14:42:13202313 // Update Count : 56 712 // Last Modified On : Sun Oct 8 12:02:55 2023 13 // Update Count : 568 14 14 // 15 15 … … 243 243 _Ostream_Manip(T) hex( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'a', { .all : 0 } }; } \ 244 244 _Ostream_Manip(T) sci( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'e', { .all : 0 } }; } \ 245 _Ostream_Manip(T) eng( T val ) { return (_Ostream_Manip(T))@{ val, 1, 0, 'g', { .flags.eng : true } }; } \245 _Ostream_Manip(T) eng( T val ) { return (_Ostream_Manip(T))@{ val, 1, -1, 'g', { .flags.eng : true } }; } \ 246 246 _Ostream_Manip(T) wd( unsigned int w, T val ) { return (_Ostream_Manip(T))@{ val, w, 0, 'g', { .all : 0 } }; } \ 247 247 _Ostream_Manip(T) wd( unsigned int w, unsigned int pc, T val ) { return (_Ostream_Manip(T))@{ val, w, pc, 'f', { .flags.pc : true } }; } \ -
libcfa/src/rational.cfa
r85034ed r8cbe732 10 10 // Created On : Wed Apr 6 17:54:28 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 18 11:07:10202313 // Update Count : 19 712 // Last Modified On : Fri Oct 6 07:52:13 2023 13 // Update Count : 198 14 14 // 15 15 … … 76 76 } // denominator 77 77 78 [ T, T ] ?=?( & [ T, T ] d est, rational(T) src ) {79 return d est = src.[ numerator, denominator ];78 [ T, T ] ?=?( & [ T, T ] dst, rational(T) src ) { 79 return dst = src.[ numerator, denominator ]; 80 80 } // ?=? 81 81 -
libcfa/src/rational.hfa
r85034ed r8cbe732 12 12 // Created On : Wed Apr 6 17:56:25 2016 13 13 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Tue Jul 18 11:08:24202315 // Update Count : 12 114 // Last Modified On : Fri Oct 6 07:52:20 2023 15 // Update Count : 122 16 16 // 17 17 … … 40 40 T numerator( rational(T) r ); 41 41 T denominator( rational(T) r ); 42 [ T, T ] ?=?( & [ T, T ] d est, rational(T) src );42 [ T, T ] ?=?( & [ T, T ] dst, rational(T) src ); 43 43 44 44 // numerator/denominator setter -
libcfa/src/stdlib.hfa
r85034ed r8cbe732 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : S at Sep 2 18:29:35202313 // Update Count : 78 012 // Last Modified On : Sun Oct 8 09:18:28 2023 13 // Update Count : 789 14 14 // 15 15 … … 431 431 uint32_t seed; // current seed 432 432 PRNG_STATE_32_T state; // random state 433 }; // PRNG 433 }; // PRNG32 434 434 435 435 static inline { … … 442 442 uint32_t prng( PRNG32 & prng, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng, u - l + 1 ) + l; } // [l,u] 443 443 uint32_t calls( PRNG32 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; } 444 } // distribution 444 void copy( PRNG32 & dst, PRNG32 & src ) { dst = src; } // checkpoint PRNG state, use autogen assignment 445 } // distribution 446 void ?{}( PRNG32 &, PRNG32 & ) = void; // no copy, remove autogen copy constructor 447 PRNG32 & ?=?( PRNG32 &, const PRNG32 ) = void; // no assignment, remove autogen assignment 445 448 446 449 struct PRNG64 { … … 448 451 uint64_t seed; // current seed 449 452 PRNG_STATE_64_T state; // random state 450 }; // PRNG 453 }; // PRNG64 451 454 452 455 static inline { … … 459 462 uint64_t prng( PRNG64 & prng, uint64_t l, uint64_t u ) __attribute__(( warn_unused_result )) { return prng( prng, u - l + 1 ) + l; } // [l,u] 460 463 uint64_t calls( PRNG64 & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; } 461 } // distribution 464 void copy( PRNG64 & dst, PRNG64 & src ) { dst = src; } // checkpoint PRNG state, use autogen assignment 465 } // distribution 466 void ?{}( PRNG64 &, PRNG64 & ) = void; // no copy, remove autogen copy constructor 467 PRNG64 & ?=?( PRNG64 &, const PRNG64 ) = void; // no assignment, remove autogen assignment 462 468 463 469 // Set default random-generator size.
Note:
See TracChangeset
for help on using the changeset viewer.