- Timestamp:
- Feb 5, 2023, 11:42:15 AM (3 years ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 8fa77eb
- Parents:
- 9ef5516 (diff), 35d1de5 (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
- Files:
-
- 16 edited
-
prelude/builtins.c (modified) (2 diffs)
-
prelude/prelude-gen.cc (modified) (2 diffs)
-
src/bits/containers.hfa (modified) (2 diffs)
-
src/concurrency/actor.hfa (modified) (14 diffs)
-
src/concurrency/coroutine.hfa (modified) (2 diffs)
-
src/concurrency/locks.hfa (modified) (1 diff)
-
src/concurrency/monitor.hfa (modified) (2 diffs)
-
src/concurrency/mutex.hfa (modified) (2 diffs)
-
src/concurrency/thread.hfa (modified) (2 diffs)
-
src/containers/list.hfa (modified) (2 diffs)
-
src/containers/vector.hfa (modified) (2 diffs)
-
src/exception.h (modified) (3 diffs)
-
src/iostream.hfa (modified) (7 diffs)
-
src/iterator.hfa (modified) (3 diffs)
-
src/math.trait.hfa (modified) (6 diffs)
-
src/stdlib.hfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/prelude/builtins.c
r9ef5516 r6d2af204 10 10 // Created On : Fri Jul 21 16:21:03 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Aug 14 08:45:54 202113 // Update Count : 13 312 // Last Modified On : Thu Feb 2 11:33:56 2023 13 // Update Count : 135 14 14 // 15 15 … … 64 64 static inline void ^?{}(generator$ &) {} 65 65 66 trait is_generator(T &) { 66 forall( T & ) 67 trait is_generator { 67 68 void main(T & this); 68 69 generator$ * get_generator(T & this); -
libcfa/prelude/prelude-gen.cc
r9ef5516 r6d2af204 10 10 // Created On : Sat Feb 16 08:44:58 2019 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Apr 2 17:18:24 201913 // Update Count : 3 712 // Last Modified On : Thu Feb 2 11:40:01 2023 13 // Update Count : 38 14 14 // 15 15 … … 159 159 int main() { 160 160 cout << "# 2 \"prelude.cfa\" // needed for error messages from this file" << endl; 161 cout << " trait sized(T &){};" << endl;161 cout << "forall( T & ) trait sized {};" << endl; 162 162 163 163 cout << "//////////////////////////" << endl; -
libcfa/src/bits/containers.hfa
r9ef5516 r6d2af204 10 10 // Created On : Tue Oct 31 16:38:50 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 15 07:42:35 202013 // Update Count : 2 812 // Last Modified On : Thu Feb 2 11:33:08 2023 13 // Update Count : 29 14 14 15 15 #pragma once … … 69 69 70 70 #ifdef __cforall 71 trait is_node(T &) { 71 forall( T & ) 72 trait is_node { 72 73 T *& get_next( T & ); 73 74 }; -
libcfa/src/concurrency/actor.hfa
r9ef5516 r6d2af204 1 #pragma once 2 1 3 #include <locks.hfa> 2 4 #include <limits.hfa> 3 5 #include <list.hfa> 6 #include <kernel.hfa> 4 7 5 8 #ifdef __CFA_DEBUG__ … … 21 24 // Define if executor is created in a separate cluster 22 25 #define __DEFAULT_EXECUTOR_SEPCLUS__ false 26 27 // when you flip this make sure to recompile compiler and flip the appropriate flag there too in Actors.cpp 28 #define __ALLOC 0 23 29 24 30 // forward decls … … 38 44 P9_EMBEDDED( request, dlink(request) ) 39 45 40 void ?{}( request & this ) { this.stop = true; } // default ctor makes a sentinel41 void ?{}( request & this, actor * receiver, message * msg, __receive_fn fn ) {46 static inline void ?{}( request & this ) { this.stop = true; } // default ctor makes a sentinel 47 static inline void ?{}( request & this, actor * receiver, message * msg, __receive_fn fn ) { 42 48 this.receiver = receiver; 43 49 this.msg = msg; … … 45 51 this.stop = false; 46 52 } 47 53 static inline void ?{}( request & this, request & copy ) { 54 this.receiver = copy.receiver; 55 this.msg = copy.msg; 56 this.fn = copy.fn; 57 this.stop = copy.stop; 58 } 59 60 // hybrid data structure. Copies until buffer is full and then allocates for intrusive list 61 struct copy_queue { 62 dlist( request ) list; 63 #if ! __ALLOC 64 request * buffer; 65 size_t count, buffer_size, index; 66 #endif 67 }; 68 static inline void ?{}( copy_queue & this ) {} 69 static inline void ?{}( copy_queue & this, size_t buf_size ) with(this) { 70 list{}; 71 #if ! __ALLOC 72 buffer_size = buf_size; 73 buffer = aalloc( buffer_size ); 74 count = 0; 75 index = 0; 76 #endif 77 } 78 static inline void ^?{}( copy_queue & this ) with(this) { 79 #if ! __ALLOC 80 adelete(buffer); 81 #endif 82 } 83 84 static inline void insert( copy_queue & this, request & elem ) with(this) { 85 #if ! __ALLOC 86 if ( count < buffer_size ) { // fast path ( no alloc ) 87 buffer[count]{ elem }; 88 count++; 89 return; 90 } 91 request * new_elem = alloc(); 92 (*new_elem){ elem }; 93 insert_last( list, *new_elem ); 94 #else 95 insert_last( list, elem ); 96 #endif 97 } 98 99 // once you start removing you need to remove all elements 100 // it is not supported to call insert() before the list is fully empty 101 // should_delete is an output param 102 static inline request & remove( copy_queue & this, bool & should_delete ) with(this) { 103 #if ! __ALLOC 104 if ( count > 0 ) { 105 count--; 106 should_delete = false; 107 size_t old_idx = index; 108 index = count == 0 ? 0 : index + 1; 109 return buffer[old_idx]; 110 } 111 #endif 112 should_delete = true; 113 return try_pop_front( list ); 114 } 115 116 static inline bool isEmpty( copy_queue & this ) with(this) { 117 #if ! __ALLOC 118 return count == 0 && list`isEmpty; 119 #else 120 return list`isEmpty; 121 #endif 122 } 123 124 static size_t __buffer_size = 10; // C_TODO: rework this to be passed from executor through ctors (no need for global) 48 125 struct work_queue { 49 futex_mutex mutex_lock; 50 dlist( request ) input; // unbounded list of work requests 126 __spinlock_t mutex_lock; 127 copy_queue owned_queue; 128 copy_queue * c_queue; // C_TODO: try putting this on the stack with ptr juggling 129 51 130 }; // work_queue 52 void ?{}( work_queue & this ) with(this) { input{}; mutex_lock{}; } 53 54 void insert( work_queue & this, request & elem ) with(this) { 55 lock( mutex_lock ); 56 insert_last( input, elem ); 131 static inline void ?{}( work_queue & this ) with(this) { 132 // c_queue = alloc(); 133 // (*c_queue){ __buffer_size }; 134 owned_queue{ __buffer_size }; 135 c_queue = &owned_queue; 136 } 137 // static inline void ^?{}( work_queue & this ) with(this) { delete( c_queue ); } 138 139 static inline void insert( work_queue & this, request & elem ) with(this) { 140 lock( mutex_lock __cfaabi_dbg_ctx2 ); 141 insert( *c_queue, elem ); 57 142 unlock( mutex_lock ); 58 143 } // insert 59 144 60 void transfer( work_queue & this, dlist(request) & transferTo ) with(this) { 61 lock( mutex_lock ); 62 63 //C_TODO CHANGE 64 // transferTo->transfer( input ); // transfer input to output 65 66 // this is awfully inefficient but Ill use it until transfer is implemented 67 request * r; 68 while ( ! input`isEmpty ) { 69 r = &try_pop_front( input ); 70 if ( r ) insert_last( transferTo, *r ); 71 } 72 73 // transfer( input, transferTo ); 74 145 static inline void transfer( work_queue & this, copy_queue ** transfer_to ) with(this) { 146 lock( mutex_lock __cfaabi_dbg_ctx2 ); 147 // swap copy queue ptrs 148 copy_queue * temp = *transfer_to; 149 *transfer_to = c_queue; 150 c_queue = temp; 75 151 unlock( mutex_lock ); 76 152 } // transfer 77 153 78 154 thread worker { 155 copy_queue owned_queue; 79 156 work_queue * request_queues; 80 dlist( request )current_queue;157 copy_queue * current_queue; 81 158 request & req; 82 159 unsigned int start, range; … … 86 163 ((thread &)this){ clu }; 87 164 this.request_queues = request_queues; 88 this.current_queue{}; 165 // this.current_queue = alloc(); 166 // (*this.current_queue){ __buffer_size }; 167 this.owned_queue{ __buffer_size }; 168 this.current_queue = &this.owned_queue; 89 169 this.start = start; 90 170 this.range = range; 91 171 } 172 // static inline void ^?{}( worker & mutex this ) with(this) { delete( current_queue ); } 92 173 93 174 struct executor { … … 100 181 }; // executor 101 182 102 static inline void ?{}( executor & this, unsigned int nprocessors, unsigned int nworkers, unsigned int nrqueues, bool seperate_clus ) with(this) {183 static inline void ?{}( executor & this, unsigned int nprocessors, unsigned int nworkers, unsigned int nrqueues, bool seperate_clus, size_t buf_size ) with(this) { 103 184 if ( nrqueues < nworkers ) abort( "nrqueues needs to be >= nworkers\n" ); 185 __buffer_size = buf_size; 104 186 this.nprocessors = nprocessors; 105 187 this.nworkers = nworkers; … … 127 209 } // for 128 210 } 129 211 static inline void ?{}( executor & this, unsigned int nprocessors, unsigned int nworkers, unsigned int nrqueues, bool seperate_clus ) { this{ nprocessors, nworkers, nrqueues, seperate_clus, __buffer_size }; } 130 212 static inline void ?{}( executor & this, unsigned int nprocessors, unsigned int nworkers, unsigned int nrqueues ) { this{ nprocessors, nworkers, nrqueues, __DEFAULT_EXECUTOR_SEPCLUS__ }; } 131 213 static inline void ?{}( executor & this, unsigned int nprocessors, unsigned int nworkers ) { this{ nprocessors, nworkers, __DEFAULT_EXECUTOR_RQUEUES__ }; } … … 147 229 } // for 148 230 149 delete( workers );150 delete( request_queues );151 delete( processors );231 adelete( workers ); 232 adelete( request_queues ); 233 adelete( processors ); 152 234 if ( seperate_clus ) delete( cluster ); 153 235 } … … 170 252 }; 171 253 172 void ?{}( actor & this ) {254 static inline void ?{}( actor & this ) { 173 255 // Once an actor is allocated it must be sent a message or the actor system cannot stop. Hence, its receive 174 256 // member must be called to end it … … 178 260 __atomic_fetch_add( &__num_actors_, 1, __ATOMIC_SEQ_CST ); 179 261 } 180 void ^?{}( actor & this ) {}262 static inline void ^?{}( actor & this ) {} 181 263 182 264 static inline void check_actor( actor & this ) { … … 204 286 }; 205 287 206 void ?{}( message & this ) { this.allocation_ = Nodelete; }207 void ?{}( message & this, Allocation allocation ) { this.allocation_ = allocation; }208 void ^?{}( message & this ) {}288 static inline void ?{}( message & this ) { this.allocation_ = Nodelete; } 289 static inline void ?{}( message & this, Allocation allocation ) { this.allocation_ = allocation; } 290 static inline void ^?{}( message & this ) {} 209 291 210 292 static inline void check_message( message & this ) { … … 217 299 } 218 300 219 void deliver_request( request & this ) {301 static inline void deliver_request( request & this ) { 220 302 Allocation actor_allocation = this.fn( *this.receiver, *this.msg ); 221 303 this.receiver->allocation_ = actor_allocation; … … 225 307 226 308 void main( worker & this ) with(this) { 309 bool should_delete; 227 310 Exit: 228 311 for ( unsigned int i = 0;; i = (i + 1) % range ) { // cycle through set of request buffers 229 transfer( request_queues[i + start], current_queue ); 230 while ( ! current_queue`isEmpty ) { 231 &req = &try_pop_front( current_queue ); 312 // C_TODO: potentially check queue count instead of immediately trying to transfer 313 transfer( request_queues[i + start], ¤t_queue ); 314 while ( ! isEmpty( *current_queue ) ) { 315 &req = &remove( *current_queue, should_delete ); 232 316 if ( !&req ) continue; // possibly add some work stealing/idle sleep here 233 317 if ( req.stop ) break Exit; 234 318 deliver_request( req ); 235 319 236 delete( &req );320 if ( should_delete ) delete( &req ); 237 321 } // while 238 322 } // for … … 250 334 __actor_executor_thd = active_thread(); 251 335 __actor_executor_ = alloc(); 252 (*__actor_executor_){ 0, num_thds, num_thds * 16 };336 (*__actor_executor_){ 0, num_thds, num_thds == 1 ? 1 : num_thds * 16 }; 253 337 } 254 338 -
libcfa/src/concurrency/coroutine.hfa
r9ef5516 r6d2af204 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jan 6 16:33:16 202213 // Update Count : 1 212 // Last Modified On : Thu Feb 2 11:31:42 2023 13 // Update Count : 13 14 14 // 15 15 … … 38 38 // Anything that implements this trait can be resumed. 39 39 // Anything that is resumed is a coroutine. 40 trait is_coroutine(T & | IS_RESUMPTION_EXCEPTION(CoroutineCancelled(T))) { 40 forall( T & | IS_RESUMPTION_EXCEPTION(CoroutineCancelled(T)) ) 41 trait is_coroutine { 41 42 void main(T & this); 42 43 coroutine$ * get_coroutine(T & this); -
libcfa/src/concurrency/locks.hfa
r9ef5516 r6d2af204 640 640 //----------------------------------------------------------------------------- 641 641 // is_blocking_lock 642 trait is_blocking_lock(L & | sized(L)) { 642 forall( L & | sized(L) ) 643 trait is_blocking_lock { 643 644 // For synchronization locks to use when acquiring 644 645 void on_notify( L &, struct thread$ * ); -
libcfa/src/concurrency/monitor.hfa
r9ef5516 r6d2af204 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Dec 4 07:55:32 201913 // Update Count : 1 112 // Last Modified On : Thu Feb 2 11:29:21 2023 13 // Update Count : 12 14 14 // 15 15 … … 22 22 #include "stdlib.hfa" 23 23 24 trait is_monitor(T &) { 24 forall( T & ) 25 trait is_monitor { 25 26 monitor$ * get_monitor( T & ); 26 27 void ^?{}( T & mutex ); -
libcfa/src/concurrency/mutex.hfa
r9ef5516 r6d2af204 12 12 // Created On : Fri May 25 01:24:09 2018 13 13 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Wed Dec 4 09:16:53 201915 // Update Count : 114 // Last Modified On : Thu Feb 2 11:46:08 2023 15 // Update Count : 2 16 16 // 17 17 … … 70 70 void unlock(recursive_mutex_lock & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 71 71 72 trait is_lock(L & | sized(L)) { 72 forall( L & | sized(L) ) 73 trait is_lock { 73 74 void lock (L &); 74 75 void unlock(L &); -
libcfa/src/concurrency/thread.hfa
r9ef5516 r6d2af204 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Nov 22 22:18:34 202213 // Update Count : 3 512 // Last Modified On : Thu Feb 2 11:27:59 2023 13 // Update Count : 37 14 14 // 15 15 … … 27 27 //----------------------------------------------------------------------------- 28 28 // thread trait 29 trait is_thread(T &) { 29 forall( T & ) 30 trait is_thread { 30 31 void ^?{}(T& mutex this); 31 32 void main(T& this); -
libcfa/src/containers/list.hfa
r9ef5516 r6d2af204 9 9 // Author : Michael Brooks 10 10 // Created On : Wed Apr 22 18:00:00 2020 11 // Last Modified By : Michael Brooks12 // Last Modified On : Wed Apr 22 18:00:00 202013 // Update Count : 111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 2 11:32:26 2023 13 // Update Count : 2 14 14 // 15 15 … … 23 23 }; 24 24 25 trait embedded( tOuter &, tMid &, tInner & ) { 25 forall( tOuter &, tMid &, tInner & ) 26 trait embedded { 26 27 tytagref( tMid, tInner ) ?`inner( tOuter & ); 27 28 }; -
libcfa/src/containers/vector.hfa
r9ef5516 r6d2af204 10 10 // Created On : Tue Jul 5 18:00:07 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 17 11:02:46 202013 // Update Count : 412 // Last Modified On : Thu Feb 2 11:41:24 2023 13 // Update Count : 5 14 14 // 15 15 … … 50 50 //------------------------------------------------------------------------------ 51 51 //Declaration 52 trait allocator_c(T, allocator_t)53 {52 forall( T, allocator_t ) 53 trait allocator_c { 54 54 void realloc_storage(allocator_t*, size_t); 55 55 T* data(allocator_t*); -
libcfa/src/exception.h
r9ef5516 r6d2af204 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jun 26 15:11:00 2017 11 // Last Modified By : Andrew Beach12 // Last Modified On : Th r Apr 8 15:20:00 202113 // Update Count : 1 211 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 2 11:20:19 2023 13 // Update Count : 13 14 14 // 15 15 … … 101 101 // implemented in the .c file either so they all have to be inline. 102 102 103 trait is_exception(exceptT &, virtualT &) { 103 forall( exceptT &, virtualT & ) 104 trait is_exception { 104 105 /* The first field must be a pointer to a virtual table. 105 106 * That virtual table must be a decendent of the base exception virtual table. … … 109 110 }; 110 111 111 trait is_termination_exception(exceptT &, virtualT & | is_exception(exceptT, virtualT)) { 112 forall( exceptT &, virtualT & | is_exception(exceptT, virtualT) ) 113 trait is_termination_exception { 112 114 void defaultTerminationHandler(exceptT &); 113 115 }; 114 116 115 trait is_resumption_exception(exceptT &, virtualT & | is_exception(exceptT, virtualT)) { 117 forall( exceptT &, virtualT & | is_exception(exceptT, virtualT) ) 118 trait is_resumption_exception { 116 119 void defaultResumptionHandler(exceptT &); 117 120 }; -
libcfa/src/iostream.hfa
r9ef5516 r6d2af204 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Oct 10 10:02:07 202113 // Update Count : 4 0712 // Last Modified On : Thu Feb 2 11:25:39 2023 13 // Update Count : 410 14 14 // 15 15 … … 22 22 23 23 24 trait basic_ostream( ostype & ) { 24 forall( ostype & ) 25 trait basic_ostream { 25 26 // private 26 27 bool sepPrt$( ostype & ); // get separator state (on/off) … … 51 52 }; // basic_ostream 52 53 53 trait ostream( ostype & | basic_ostream( ostype ) ) { 54 forall( ostype & | basic_ostream( ostype ) ) 55 trait ostream { 54 56 bool fail( ostype & ); // operation failed? 55 57 void clear( ostype & ); … … 60 62 }; // ostream 61 63 62 // trait writeable( T ) { 64 // forall( T ) 65 // trait writeable { 63 66 // forall( ostype & | ostream( ostype ) ) ostype & ?|?( ostype &, T ); 64 67 // }; // writeable 65 68 66 trait writeable( T, ostype & | ostream( ostype ) ) { 69 forall( T, ostype & | ostream( ostype ) ) 70 trait writeable { 67 71 ostype & ?|?( ostype &, T ); 68 72 }; // writeable … … 290 294 291 295 292 trait basic_istream( istype & ) { 296 forall( istype & ) 297 trait basic_istream { 293 298 // private 294 299 bool getANL$( istype & ); // get scan newline (on/off) … … 302 307 }; // basic_istream 303 308 304 trait istream( istype & | basic_istream( istype ) ) { 309 forall( istype & | basic_istream( istype ) ) 310 trait istream { 305 311 bool fail( istype & ); 306 312 void clear( istype & ); … … 310 316 }; // istream 311 317 312 trait readable( T ) { 318 forall( T ) 319 trait readable { 313 320 forall( istype & | istream( istype ) ) istype & ?|?( istype &, T ); 314 321 }; // readable -
libcfa/src/iterator.hfa
r9ef5516 r6d2af204 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 7 08:37:25 201713 // Update Count : 1 012 // Last Modified On : Thu Feb 2 11:21:50 2023 13 // Update Count : 11 14 14 // 15 15 … … 17 17 18 18 // An iterator can be used to traverse a data structure. 19 trait iterator( iterator_type, elt_type ) { 19 forall( iterator_type, elt_type ) 20 trait iterator { 20 21 // point to the next element 21 22 // iterator_type ?++( iterator_type & ); … … 31 32 }; 32 33 33 trait iterator_for( iterator_type, collection_type, elt_type | iterator( iterator_type, elt_type ) ) { 34 forall( iterator_type, collection_type, elt_type | iterator( iterator_type, elt_type ) ) 35 trait iterator_for { 34 36 // [ iterator_type begin, iterator_type end ] get_iterators( collection_type ); 35 37 iterator_type begin( collection_type ); -
libcfa/src/math.trait.hfa
r9ef5516 r6d2af204 10 10 // Created On : Fri Jul 16 15:40:52 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Jul 20 17:47:19 202113 // Update Count : 1912 // Last Modified On : Thu Feb 2 11:36:56 2023 13 // Update Count : 20 14 14 // 15 15 16 16 #pragma once 17 17 18 trait Not( U ) { 18 forall( U ) 19 trait Not { 19 20 void ?{}( U &, zero_t ); 20 21 int !?( U ); 21 22 }; // Not 22 23 23 trait Equality( T | Not( T ) ) { 24 forall( T | Not( T ) ) 25 trait Equality { 24 26 int ?==?( T, T ); 25 27 int ?!=?( T, T ); 26 28 }; // Equality 27 29 28 trait Relational( U | Equality( U ) ) { 30 forall( U | Equality( U ) ) 31 trait Relational { 29 32 int ?<?( U, U ); 30 33 int ?<=?( U, U ); … … 33 36 }; // Relational 34 37 35 trait Signed( T ) { 38 forall ( T ) 39 trait Signed { 36 40 T +?( T ); 37 41 T -?( T ); … … 39 43 }; // Signed 40 44 41 trait Additive( U | Signed( U ) ) { 45 forall( U | Signed( U ) ) 46 trait Additive { 42 47 U ?+?( U, U ); 43 48 U ?-?( U, U ); … … 46 51 }; // Additive 47 52 48 trait Incdec( T | Additive( T ) ) { 53 forall( T | Additive( T ) ) 54 trait Incdec { 49 55 void ?{}( T &, one_t ); 50 56 // T ?++( T & ); … … 54 60 }; // Incdec 55 61 56 trait Multiplicative( U | Incdec( U ) ) { 62 forall( U | Incdec( U ) ) 63 trait Multiplicative { 57 64 U ?*?( U, U ); 58 65 U ?/?( U, U ); … … 61 68 }; // Multiplicative 62 69 63 trait Arithmetic( T | Relational( T ) | Multiplicative( T ) ) { 70 forall( T | Relational( T ) | Multiplicative( T ) ) 71 trait Arithmetic { 64 72 }; // Arithmetic 65 73 -
libcfa/src/stdlib.hfa
r9ef5516 r6d2af204 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Dec 11 18:25:53 202213 // Update Count : 76 512 // Last Modified On : Thu Feb 2 11:30:04 2023 13 // Update Count : 766 14 14 // 15 15 … … 404 404 // calls( sprng ); 405 405 406 trait basic_prng( PRNG &, R ) { 406 forall( PRNG &, R ) 407 trait basic_prng { 407 408 void set_seed( PRNG & prng, R seed ); // set seed 408 409 R get_seed( PRNG & prng ); // get seed
Note:
See TracChangeset
for help on using the changeset viewer.