Changes in / [c08c3cf:467c8b7]
- Files:
-
- 146 edited
-
libcfa/prelude/builtins.c (modified) (7 diffs)
-
libcfa/prelude/prelude-gen.cc (modified) (6 diffs)
-
libcfa/prelude/prelude.old.cf (modified) (11 diffs)
-
libcfa/prelude/sync-builtins.cf (modified) (6 diffs)
-
libcfa/src/bitmanip.hfa (modified) (2 diffs)
-
libcfa/src/bits/algorithm.hfa (modified) (7 diffs)
-
libcfa/src/bits/collection.hfa (modified) (2 diffs)
-
libcfa/src/bits/containers.hfa (modified) (10 diffs)
-
libcfa/src/bits/defs.hfa (modified) (2 diffs)
-
libcfa/src/bits/locks.hfa (modified) (3 diffs)
-
libcfa/src/bits/queue.hfa (modified) (2 diffs)
-
libcfa/src/bits/sequence.hfa (modified) (3 diffs)
-
libcfa/src/bits/stack.hfa (modified) (2 diffs)
-
libcfa/src/common.cfa (modified) (1 diff)
-
libcfa/src/common.hfa (modified) (4 diffs)
-
libcfa/src/concurrency/coroutine.cfa (modified) (4 diffs)
-
libcfa/src/concurrency/coroutine.hfa (modified) (5 diffs)
-
libcfa/src/concurrency/future.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/io/types.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/kernel.cfa (modified) (4 diffs)
-
libcfa/src/concurrency/kernel.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/kernel/fwd.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (3 diffs)
-
libcfa/src/concurrency/locks.cfa (modified) (4 diffs)
-
libcfa/src/concurrency/locks.hfa (modified) (4 diffs)
-
libcfa/src/concurrency/monitor.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/monitor.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/mutex.cfa (modified) (3 diffs)
-
libcfa/src/concurrency/mutex.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/preemption.cfa (modified) (1 diff)
-
libcfa/src/concurrency/thread.cfa (modified) (7 diffs)
-
libcfa/src/concurrency/thread.hfa (modified) (8 diffs)
-
libcfa/src/containers/list.hfa (modified) (4 diffs)
-
libcfa/src/containers/maybe.cfa (modified) (7 diffs)
-
libcfa/src/containers/maybe.hfa (modified) (2 diffs)
-
libcfa/src/containers/pair.cfa (modified) (4 diffs)
-
libcfa/src/containers/pair.hfa (modified) (1 diff)
-
libcfa/src/containers/result.cfa (modified) (10 diffs)
-
libcfa/src/containers/result.hfa (modified) (3 diffs)
-
libcfa/src/containers/stackLockFree.hfa (modified) (2 diffs)
-
libcfa/src/containers/vector.cfa (modified) (13 diffs)
-
libcfa/src/containers/vector.hfa (modified) (15 diffs)
-
libcfa/src/exception.h (modified) (4 diffs)
-
libcfa/src/executor.cfa (modified) (1 diff)
-
libcfa/src/gmp.hfa (modified) (2 diffs)
-
libcfa/src/interpose.cfa (modified) (5 diffs)
-
libcfa/src/iostream.cfa (modified) (18 diffs)
-
libcfa/src/iostream.hfa (modified) (16 diffs)
-
libcfa/src/iterator.cfa (modified) (2 diffs)
-
libcfa/src/iterator.hfa (modified) (3 diffs)
-
libcfa/src/math.hfa (modified) (4 diffs)
-
libcfa/src/memory.cfa (modified) (11 diffs)
-
libcfa/src/memory.hfa (modified) (6 diffs)
-
libcfa/src/parseargs.hfa (modified) (2 diffs)
-
libcfa/src/rational.cfa (modified) (5 diffs)
-
libcfa/src/rational.hfa (modified) (4 diffs)
-
libcfa/src/stdlib.cfa (modified) (5 diffs)
-
libcfa/src/stdlib.hfa (modified) (13 diffs)
-
libcfa/src/time.cfa (modified) (2 diffs)
-
libcfa/src/vec/vec.hfa (modified) (7 diffs)
-
libcfa/src/vec/vec2.hfa (modified) (3 diffs)
-
libcfa/src/vec/vec3.hfa (modified) (3 diffs)
-
libcfa/src/vec/vec4.hfa (modified) (3 diffs)
-
src/Parser/parser.yy (modified) (1 diff)
-
tests/avltree/avl-private.cfa (modified) (8 diffs)
-
tests/avltree/avl-private.h (modified) (1 diff)
-
tests/avltree/avl.h (modified) (3 diffs)
-
tests/avltree/avl0.cfa (modified) (1 diff)
-
tests/avltree/avl1.cfa (modified) (3 diffs)
-
tests/avltree/avl2.cfa (modified) (3 diffs)
-
tests/avltree/avl3.cfa (modified) (6 diffs)
-
tests/avltree/avl4.cfa (modified) (2 diffs)
-
tests/bugs/10.cfa (modified) (1 diff)
-
tests/bugs/104.cfa (modified) (1 diff)
-
tests/bugs/194.cfa (modified) (1 diff)
-
tests/bugs/196.cfa (modified) (2 diffs)
-
tests/bugs/203-2.cfa (modified) (1 diff)
-
tests/bugs/203-7.cfa (modified) (1 diff)
-
tests/bugs/203-9.cfa (modified) (1 diff)
-
tests/bugs/7.cfa (modified) (2 diffs)
-
tests/castError.cfa (modified) (1 diff)
-
tests/concurrent/examples/boundedBufferEXT.cfa (modified) (1 diff)
-
tests/concurrent/examples/boundedBufferINT.cfa (modified) (1 diff)
-
tests/concurrent/examples/quickSort.generic.cfa (modified) (1 diff)
-
tests/concurrent/multi-monitor.cfa (modified) (1 diff)
-
tests/concurrent/thread.cfa (modified) (1 diff)
-
tests/errors/completeType.cfa (modified) (4 diffs)
-
tests/exceptions/defaults.cfa (modified) (1 diff)
-
tests/exceptions/polymorphic.cfa (modified) (2 diffs)
-
tests/exceptions/virtual-poly.cfa (modified) (2 diffs)
-
tests/forall.cfa (modified) (11 diffs)
-
tests/function-operator.cfa (modified) (7 diffs)
-
tests/genericUnion.cfa (modified) (3 diffs)
-
tests/global-monomorph.cfa (modified) (1 diff)
-
tests/identity.cfa (modified) (1 diff)
-
tests/init1.cfa (modified) (1 diff)
-
tests/nested-types.cfa (modified) (1 diff)
-
tests/poly-d-cycle.cfa (modified) (1 diff)
-
tests/poly-o-cycle.cfa (modified) (1 diff)
-
tests/poly-selection.cfa (modified) (2 diffs)
-
tests/polymorphism.cfa (modified) (4 diffs)
-
tests/raii/ctor-autogen.cfa (modified) (4 diffs)
-
tests/simpleGenericTriple.cfa (modified) (1 diff)
-
tests/sum.cfa (modified) (4 diffs)
-
tests/tuple/tuplePolymorphism.cfa (modified) (2 diffs)
-
tests/tuple/tupleVariadic.cfa (modified) (3 diffs)
-
tests/zombies/ArrayN.c (modified) (1 diff)
-
tests/zombies/Members.c (modified) (1 diff)
-
tests/zombies/Rank2.c (modified) (2 diffs)
-
tests/zombies/abstype.c (modified) (1 diff)
-
tests/zombies/context.cfa (modified) (1 diff)
-
tests/zombies/gc_no_raii/bug-repro/blockers/explicit_cast.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/blockers/recursive_realloc.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/deref.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/field.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/malloc.c (modified) (4 diffs)
-
tests/zombies/gc_no_raii/bug-repro/oddtype.c (modified) (1 diff)
-
tests/zombies/gc_no_raii/bug-repro/push_back.h (modified) (8 diffs)
-
tests/zombies/gc_no_raii/bug-repro/realloc.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/return.c (modified) (3 diffs)
-
tests/zombies/gc_no_raii/bug-repro/return_template.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/bug-repro/slow_malloc.c (modified) (1 diff)
-
tests/zombies/gc_no_raii/bug-repro/zero.c (modified) (3 diffs)
-
tests/zombies/gc_no_raii/src/gc.h (modified) (1 diff)
-
tests/zombies/gc_no_raii/src/gcpointers.c (modified) (2 diffs)
-
tests/zombies/gc_no_raii/src/gcpointers.h (modified) (3 diffs)
-
tests/zombies/gc_no_raii/src/tools.h (modified) (2 diffs)
-
tests/zombies/hashtable.cfa (modified) (5 diffs)
-
tests/zombies/hashtable2.cfa (modified) (8 diffs)
-
tests/zombies/huge.c (modified) (1 diff)
-
tests/zombies/it_out.c (modified) (3 diffs)
-
tests/zombies/new.c (modified) (1 diff)
-
tests/zombies/occursError.cfa (modified) (1 diff)
-
tests/zombies/prolog.c (modified) (1 diff)
-
tests/zombies/quad.c (modified) (1 diff)
-
tests/zombies/scope.cfa (modified) (1 diff)
-
tests/zombies/simplePoly.c (modified) (1 diff)
-
tests/zombies/simpler.c (modified) (1 diff)
-
tests/zombies/specialize.c (modified) (1 diff)
-
tests/zombies/square.c (modified) (1 diff)
-
tests/zombies/structMember.cfa (modified) (1 diff)
-
tests/zombies/subrange.cfa (modified) (5 diffs)
-
tests/zombies/twice.c (modified) (1 diff)
-
tests/zombies/typeGenerator.cfa (modified) (2 diffs)
-
tests/zombies/withStatement.cfa (modified) (2 diffs)
-
tests/zombies/wrapper/src/pointer.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/prelude/builtins.c
rc08c3cf r467c8b7 18 18 // type that wraps a pointer and a destructor-like function - used in generating implicit destructor calls for struct members in user-defined functions 19 19 // Note: needs to occur early, because it is used to generate destructor calls during code generation 20 forall( T &)20 forall(dtype T) 21 21 struct __Destructor { 22 22 T * object; … … 25 25 26 26 // defined destructor in the case that non-generated code wants to use __Destructor 27 forall( T &)27 forall(dtype T) 28 28 static inline void ^?{}(__Destructor(T) & x) { 29 29 if (x.object && x.dtor) { … … 34 34 // easy interface into __Destructor's destructor for easy codegen purposes 35 35 extern "C" { 36 forall( T &)36 forall(dtype T) 37 37 static inline void __destroy_Destructor(__Destructor(T) * dtor) { 38 38 ^(*dtor){}; … … 51 51 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 52 52 53 forall( T &)53 forall(dtype T) 54 54 static inline T & identity(T & i) { 55 55 return i; … … 64 64 static inline void ^?{}($generator &) {} 65 65 66 trait is_generator( T &) {66 trait is_generator(dtype T) { 67 67 void main(T & this); 68 68 $generator * get_generator(T & this); 69 69 }; 70 70 71 forall( T &| is_generator(T))71 forall(dtype T | is_generator(T)) 72 72 static inline T & resume(T & gen) { 73 73 main(gen); … … 78 78 79 79 static inline { 80 forall( DT &| { DT & ?+=?( DT &, one_t ); } )80 forall( dtype DT | { DT & ?+=?( DT &, one_t ); } ) 81 81 DT & ++?( DT & x ) { return x += 1; } 82 82 83 forall( DT &| sized(DT) | { void ?{}( DT &, DT ); void ^?{}( DT & ); DT & ?+=?( DT &, one_t ); } )83 forall( dtype DT | sized(DT) | { void ?{}( DT &, DT ); void ^?{}( DT & ); DT & ?+=?( DT &, one_t ); } ) 84 84 DT & ?++( DT & x ) { DT tmp = x; x += 1; return tmp; } 85 85 86 forall( DT &| { DT & ?-=?( DT &, one_t ); } )86 forall( dtype DT | { DT & ?-=?( DT &, one_t ); } ) 87 87 DT & --?( DT & x ) { return x -= 1; } 88 88 89 forall( DT &| sized(DT) | { void ?{}( DT &, DT ); void ^?{}( DT & ); DT & ?-=?( DT &, one_t ); } )89 forall( dtype DT | sized(DT) | { void ?{}( DT &, DT ); void ^?{}( DT & ); DT & ?-=?( DT &, one_t ); } ) 90 90 DT & ?--( DT & x ) { DT tmp = x; x -= 1; return tmp; } 91 91 92 forall( DT &| { int ?!=?( const DT &, zero_t ); } )92 forall( dtype DT | { int ?!=?( const DT &, zero_t ); } ) 93 93 int !?( const DT & x ) { return !( x != 0 ); } 94 94 } // distribution 95 95 96 96 // universal typed pointer constant 97 static inline forall( DT &) DT * intptr( uintptr_t addr ) { return (DT *)addr; }97 static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; } 98 98 static inline forall( ftype FT ) FT * intptr( uintptr_t addr ) { return (FT *)addr; } 99 99 … … 156 156 #define __CFA_EXP_OVERFLOW__() 157 157 158 static inline forall( OT | { void ?{}( OT & this, one_t ); OT ?*?( OT, OT ); } ) {158 static inline forall( otype OT | { void ?{}( OT & this, one_t ); OT ?*?( OT, OT ); } ) { 159 159 OT ?\?( OT ep, unsigned int y ) { __CFA_EXP__(); } 160 160 OT ?\?( OT ep, unsigned long int y ) { __CFA_EXP__(); } -
libcfa/prelude/prelude-gen.cc
rc08c3cf r467c8b7 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 << "trait sized(dtype T) {};" << endl; 162 162 163 163 cout << "//////////////////////////" << endl; … … 264 264 for (auto cvq : qualifiersPair) { 265 265 for (auto is_vol : { " ", "volatile" }) { 266 cout << "forall( DT &) void ?{}(" << cvq.first << type << " * " << is_vol << " &, " << cvq.second << "DT *);" << endl;266 cout << "forall(dtype DT) void ?{}(" << cvq.first << type << " * " << is_vol << " &, " << cvq.second << "DT *);" << endl; 267 267 } 268 268 } … … 279 279 for (auto cvq : qualifiersSingle) { 280 280 for (auto is_vol : { " ", "volatile" }) { 281 cout << "forall( DT &) void ?{}(" << cvq << " DT" << " * " << is_vol << " &);" << endl;281 cout << "forall(dtype DT) void ?{}(" << cvq << " DT" << " * " << is_vol << " &);" << endl; 282 282 } 283 283 for (auto is_vol : { " ", "volatile" }) { 284 cout << "forall( DT &) void ^?{}(" << cvq << " DT" << " * " << is_vol << " &);" << endl;284 cout << "forall(dtype DT) void ^?{}(" << cvq << " DT" << " * " << is_vol << " &);" << endl; 285 285 } 286 286 } … … 290 290 for (auto is_vol : { " ", "volatile" }) { 291 291 for (auto cvq : qualifiersSingle) { 292 cout << "forall( DT &) void ?{}( " << cvq << type << " * " << is_vol << " &, zero_t);" << endl;292 cout << "forall(dtype DT) void ?{}( " << cvq << type << " * " << is_vol << " &, zero_t);" << endl; 293 293 } 294 294 } … … 317 317 for (auto op : pointerOperators) { 318 318 auto forall = [&op]() { 319 cout << "forall( DT &" << op.sized << ") ";319 cout << "forall(dtype DT" << op.sized << ") "; 320 320 }; 321 321 for (auto type : { "DT"/*, "void"*/ } ) { … … 408 408 for (auto is_vol : { " ", "volatile" }) { 409 409 for (auto cvq : qualifiersPair) { 410 cout << "forall( DT &) " << cvq.first << "void * ?=?( " << cvq.first << "void * " << is_vol << " &, " << cvq.second << "DT *);" << endl;410 cout << "forall(dtype DT) " << cvq.first << "void * ?=?( " << cvq.first << "void * " << is_vol << " &, " << cvq.second << "DT *);" << endl; 411 411 } 412 412 for (auto cvq : qualifiersSingle) { 413 cout << "forall( DT &) " << cvq << " DT * ?=?( " << cvq << " DT * " << is_vol << " &, zero_t);" << endl;413 cout << "forall(dtype DT) " << cvq << " DT * ?=?( " << cvq << " DT * " << is_vol << " &, zero_t);" << endl; 414 414 } 415 415 } -
libcfa/prelude/prelude.old.cf
rc08c3cf r467c8b7 23 23 // ------------------------------------------------------------ 24 24 25 trait sized( T &) {};25 trait sized(dtype T) {}; 26 26 27 27 // ------------------------------------------------------------ … … 68 68 long double _Complex ?--( long double _Complex & ), ?--( volatile long double _Complex & ); 69 69 70 forall( T &| sized(T) ) T * ?++( T *& );71 forall( T &| sized(T) ) const T * ?++( const T *& );72 forall( T &| sized(T) ) volatile T * ?++( volatile T *& );73 forall( T &| sized(T) ) const volatile T * ?++( const volatile T *& );74 forall( T &| sized(T) ) T * ?--( T *& );75 forall( T &| sized(T) ) const T * ?--( const T *& );76 forall( T &| sized(T) ) volatile T * ?--( volatile T *& );77 forall( T &| sized(T) ) const volatile T * ?--( const volatile T *& );78 79 forall( T &| sized(T) ) T & ?[?]( T *, ptrdiff_t );80 forall( T &| sized(T) ) const T & ?[?]( const T *, ptrdiff_t );81 forall( T &| sized(T) ) volatile T & ?[?]( volatile T *, ptrdiff_t );82 forall( T &| sized(T) ) const volatile T & ?[?]( const volatile T *, ptrdiff_t );83 forall( T &| sized(T) ) T & ?[?]( ptrdiff_t, T * );84 forall( T &| sized(T) ) const T & ?[?]( ptrdiff_t, const T * );85 forall( T &| sized(T) ) volatile T & ?[?]( ptrdiff_t, volatile T * );86 forall( T &| sized(T) ) const volatile T & ?[?]( ptrdiff_t, const volatile T * );70 forall( dtype T | sized(T) ) T * ?++( T *& ); 71 forall( dtype T | sized(T) ) const T * ?++( const T *& ); 72 forall( dtype T | sized(T) ) volatile T * ?++( volatile T *& ); 73 forall( dtype T | sized(T) ) const volatile T * ?++( const volatile T *& ); 74 forall( dtype T | sized(T) ) T * ?--( T *& ); 75 forall( dtype T | sized(T) ) const T * ?--( const T *& ); 76 forall( dtype T | sized(T) ) volatile T * ?--( volatile T *& ); 77 forall( dtype T | sized(T) ) const volatile T * ?--( const volatile T *& ); 78 79 forall( dtype T | sized(T) ) T & ?[?]( T *, ptrdiff_t ); 80 forall( dtype T | sized(T) ) const T & ?[?]( const T *, ptrdiff_t ); 81 forall( dtype T | sized(T) ) volatile T & ?[?]( volatile T *, ptrdiff_t ); 82 forall( dtype T | sized(T) ) const volatile T & ?[?]( const volatile T *, ptrdiff_t ); 83 forall( dtype T | sized(T) ) T & ?[?]( ptrdiff_t, T * ); 84 forall( dtype T | sized(T) ) const T & ?[?]( ptrdiff_t, const T * ); 85 forall( dtype T | sized(T) ) volatile T & ?[?]( ptrdiff_t, volatile T * ); 86 forall( dtype T | sized(T) ) const volatile T & ?[?]( ptrdiff_t, const volatile T * ); 87 87 88 88 // ------------------------------------------------------------ … … 107 107 long double _Complex ++?( long double _Complex & ), --?( long double _Complex & ); 108 108 109 forall( T &| sized(T) ) T * ++?( T *& );110 forall( T &| sized(T) ) const T * ++?( const T *& );111 forall( T &| sized(T) ) volatile T * ++?( volatile T *& );112 forall( T &| sized(T) ) const volatile T * ++?( const volatile T *& );113 forall( T &| sized(T) ) T * --?( T *& );114 forall( T &| sized(T) ) const T * --?( const T *& );115 forall( T &| sized(T) ) volatile T * --?( volatile T *& );116 forall( T &| sized(T) ) const volatile T * --?( const volatile T *& );117 118 forall( T &| sized(T) ) T & *?( T * );119 forall( T &| sized(T) ) const T & *?( const T * );120 forall( T &| sized(T) ) volatile T & *?( volatile T * );121 forall( T &| sized(T) ) const volatile T & *?( const volatile T * );109 forall( dtype T | sized(T) ) T * ++?( T *& ); 110 forall( dtype T | sized(T) ) const T * ++?( const T *& ); 111 forall( dtype T | sized(T) ) volatile T * ++?( volatile T *& ); 112 forall( dtype T | sized(T) ) const volatile T * ++?( const volatile T *& ); 113 forall( dtype T | sized(T) ) T * --?( T *& ); 114 forall( dtype T | sized(T) ) const T * --?( const T *& ); 115 forall( dtype T | sized(T) ) volatile T * --?( volatile T *& ); 116 forall( dtype T | sized(T) ) const volatile T * --?( const volatile T *& ); 117 118 forall( dtype T | sized(T) ) T & *?( T * ); 119 forall( dtype T | sized(T) ) const T & *?( const T * ); 120 forall( dtype T | sized(T) ) volatile T & *?( volatile T * ); 121 forall( dtype T | sized(T) ) const volatile T & *?( const volatile T * ); 122 122 forall( ftype FT ) FT & *?( FT * ); 123 123 … … 142 142 !?( float _Complex ), !?( double _Complex ), !?( long double _Complex ); 143 143 144 forall( DT &) int !?( DT * );145 forall( DT &) int !?( const DT * );146 forall( DT &) int !?( volatile DT * );147 forall( DT &) int !?( const volatile DT * );144 forall( dtype DT ) int !?( DT * ); 145 forall( dtype DT ) int !?( const DT * ); 146 forall( dtype DT ) int !?( volatile DT * ); 147 forall( dtype DT ) int !?( const volatile DT * ); 148 148 forall( ftype FT ) int !?( FT * ); 149 149 … … 191 191 long double _Complex ?+?( long double _Complex, long double _Complex ), ?-?( long double _Complex, long double _Complex ); 192 192 193 forall( T &| sized(T) ) T * ?+?( T *, ptrdiff_t );194 forall( T &| sized(T) ) T * ?+?( ptrdiff_t, T * );195 forall( T &| sized(T) ) const T * ?+?( const T *, ptrdiff_t );196 forall( T &| sized(T) ) const T * ?+?( ptrdiff_t, const T * );197 forall( T &| sized(T) ) volatile T * ?+?( volatile T *, ptrdiff_t );198 forall( T &| sized(T) ) volatile T * ?+?( ptrdiff_t, volatile T * );199 forall( T &| sized(T) ) const volatile T * ?+?( const volatile T *, ptrdiff_t );200 forall( T &| sized(T) ) const volatile T * ?+?( ptrdiff_t, const volatile T * );201 forall( T &| sized(T) ) T * ?-?( T *, ptrdiff_t );202 forall( T &| sized(T) ) const T * ?-?( const T *, ptrdiff_t );203 forall( T &| sized(T) ) volatile T * ?-?( volatile T *, ptrdiff_t );204 forall( T &| sized(T) ) const volatile T * ?-?( const volatile T *, ptrdiff_t );205 forall( T &| sized(T) ) ptrdiff_t ?-?( const volatile T *, const volatile T * );193 forall( dtype T | sized(T) ) T * ?+?( T *, ptrdiff_t ); 194 forall( dtype T | sized(T) ) T * ?+?( ptrdiff_t, T * ); 195 forall( dtype T | sized(T) ) const T * ?+?( const T *, ptrdiff_t ); 196 forall( dtype T | sized(T) ) const T * ?+?( ptrdiff_t, const T * ); 197 forall( dtype T | sized(T) ) volatile T * ?+?( volatile T *, ptrdiff_t ); 198 forall( dtype T | sized(T) ) volatile T * ?+?( ptrdiff_t, volatile T * ); 199 forall( dtype T | sized(T) ) const volatile T * ?+?( const volatile T *, ptrdiff_t ); 200 forall( dtype T | sized(T) ) const volatile T * ?+?( ptrdiff_t, const volatile T * ); 201 forall( dtype T | sized(T) ) T * ?-?( T *, ptrdiff_t ); 202 forall( dtype T | sized(T) ) const T * ?-?( const T *, ptrdiff_t ); 203 forall( dtype T | sized(T) ) volatile T * ?-?( volatile T *, ptrdiff_t ); 204 forall( dtype T | sized(T) ) const volatile T * ?-?( const volatile T *, ptrdiff_t ); 205 forall( dtype T | sized(T) ) ptrdiff_t ?-?( const volatile T *, const volatile T * ); 206 206 207 207 // ------------------------------------------------------------ … … 255 255 ?>?( long double, long double ), ?>=?( long double, long double ); 256 256 257 forall( DT &) signed int ?<?( DT *, DT * );258 forall( DT &) signed int ?<?( const DT *, const DT * );259 forall( DT &) signed int ?<?( volatile DT *, volatile DT * );260 forall( DT &) signed int ?<?( const volatile DT *, const volatile DT * );261 262 forall( DT &) signed int ?>?( DT *, DT * );263 forall( DT &) signed int ?>?( const DT *, const DT * );264 forall( DT &) signed int ?>?( volatile DT *, volatile DT * );265 forall( DT &) signed int ?>?( const volatile DT *, const volatile DT * );266 267 forall( DT &) signed int ?<=?( DT *, DT * );268 forall( DT &) signed int ?<=?( const DT *, const DT * );269 forall( DT &) signed int ?<=?( volatile DT *, volatile DT * );270 forall( DT &) signed int ?<=?( const volatile DT *, const volatile DT * );271 272 forall( DT &) signed int ?>=?( DT *, DT * );273 forall( DT &) signed int ?>=?( const DT *, const DT * );274 forall( DT &) signed int ?>=?( volatile DT *, volatile DT * );275 forall( DT &) signed int ?>=?( const volatile DT *, const volatile DT * );257 forall( dtype DT ) signed int ?<?( DT *, DT * ); 258 forall( dtype DT ) signed int ?<?( const DT *, const DT * ); 259 forall( dtype DT ) signed int ?<?( volatile DT *, volatile DT * ); 260 forall( dtype DT ) signed int ?<?( const volatile DT *, const volatile DT * ); 261 262 forall( dtype DT ) signed int ?>?( DT *, DT * ); 263 forall( dtype DT ) signed int ?>?( const DT *, const DT * ); 264 forall( dtype DT ) signed int ?>?( volatile DT *, volatile DT * ); 265 forall( dtype DT ) signed int ?>?( const volatile DT *, const volatile DT * ); 266 267 forall( dtype DT ) signed int ?<=?( DT *, DT * ); 268 forall( dtype DT ) signed int ?<=?( const DT *, const DT * ); 269 forall( dtype DT ) signed int ?<=?( volatile DT *, volatile DT * ); 270 forall( dtype DT ) signed int ?<=?( const volatile DT *, const volatile DT * ); 271 272 forall( dtype DT ) signed int ?>=?( DT *, DT * ); 273 forall( dtype DT ) signed int ?>=?( const DT *, const DT * ); 274 forall( dtype DT ) signed int ?>=?( volatile DT *, volatile DT * ); 275 forall( dtype DT ) signed int ?>=?( const volatile DT *, const volatile DT * ); 276 276 277 277 // ------------------------------------------------------------ … … 302 302 signed int ?==?( one_t, one_t ), ?!=?( one_t, one_t ); 303 303 304 forall( DT &) signed int ?==?( DT *, DT * );305 forall( DT &) signed int ?==?( const DT *, const DT * );306 forall( DT &) signed int ?==?( volatile DT *, volatile DT * );307 forall( DT &) signed int ?==?( const volatile DT *, const volatile DT * );304 forall( dtype DT ) signed int ?==?( DT *, DT * ); 305 forall( dtype DT ) signed int ?==?( const DT *, const DT * ); 306 forall( dtype DT ) signed int ?==?( volatile DT *, volatile DT * ); 307 forall( dtype DT ) signed int ?==?( const volatile DT *, const volatile DT * ); 308 308 forall( ftype FT ) signed int ?==?( FT *, FT * ); 309 forall( DT &) signed int ?!=?( DT *, DT * );310 forall( DT &) signed int ?!=?( const DT *, const DT * );311 forall( DT &) signed int ?!=?( volatile DT *, volatile DT * );312 forall( DT &) signed int ?!=?( const volatile DT *, const volatile DT * );309 forall( dtype DT ) signed int ?!=?( DT *, DT * ); 310 forall( dtype DT ) signed int ?!=?( const DT *, const DT * ); 311 forall( dtype DT ) signed int ?!=?( volatile DT *, volatile DT * ); 312 forall( dtype DT ) signed int ?!=?( const volatile DT *, const volatile DT * ); 313 313 forall( ftype FT ) signed int ?!=?( FT *, FT * ); 314 314 … … 376 376 377 377 forall( ftype FT ) FT * ?=?( FT *&, FT * ); 378 forall( fty epFT ) FT * ?=?( FT * volatile &, FT * );379 380 forall( DT &) DT * ?=?( DT * &, DT * );381 forall( DT &) DT * ?=?( DT * volatile &, DT * );382 forall( DT &) const DT * ?=?( const DT * &, DT * );383 forall( DT &) const DT * ?=?( const DT * volatile &, DT * );384 forall( DT &) const DT * ?=?( const DT * &, const DT * );385 forall( DT &) const DT * ?=?( const DT * volatile &, const DT * );386 forall( DT &) volatile DT * ?=?( volatile DT * &, DT * );387 forall( DT &) volatile DT * ?=?( volatile DT * volatile &, DT * );388 forall( DT &) volatile DT * ?=?( volatile DT * &, volatile DT * );389 forall( DT &) volatile DT * ?=?( volatile DT * volatile &, volatile DT * );390 391 forall( DT &) const volatile DT * ?=?( const volatile DT * &, DT * );392 forall( DT &) const volatile DT * ?=?( const volatile DT * volatile &, DT * );393 forall( DT &) const volatile DT * ?=?( const volatile DT * &, const DT * );394 forall( DT &) const volatile DT * ?=?( const volatile DT * volatile &, const DT * );395 forall( DT &) const volatile DT * ?=?( const volatile DT * &, volatile DT * );396 forall( DT &) const volatile DT * ?=?( const volatile DT * volatile &, volatile DT * );397 forall( DT &) const volatile DT * ?=?( const volatile DT * &, const volatile DT * );398 forall( DT &) const volatile DT * ?=?( const volatile DT * volatile &, const volatile DT * );399 400 forall( DT &) void * ?=?( void * &, DT * );401 forall( DT &) void * ?=?( void * volatile &, DT * );402 forall( DT &) const void * ?=?( const void * &, DT * );403 forall( DT &) const void * ?=?( const void * volatile &, DT * );404 forall( DT &) const void * ?=?( const void * &, const DT * );405 forall( DT &) const void * ?=?( const void * volatile &, const DT * );406 forall( DT &) volatile void * ?=?( volatile void * &, DT * );407 forall( DT &) volatile void * ?=?( volatile void * volatile &, DT * );408 forall( DT &) volatile void * ?=?( volatile void * &, volatile DT * );409 forall( DT &) volatile void * ?=?( volatile void * volatile &, volatile DT * );410 forall( DT &) const volatile void * ?=?( const volatile void * &, DT * );411 forall( DT &) const volatile void * ?=?( const volatile void * volatile &, DT * );412 forall( DT &) const volatile void * ?=?( const volatile void * &, const DT * );413 forall( DT &) const volatile void * ?=?( const volatile void * volatile &, const DT * );414 forall( DT &) const volatile void * ?=?( const volatile void * &, volatile DT * );415 forall( DT &) const volatile void * ?=?( const volatile void * volatile &, volatile DT * );416 forall( DT &) const volatile void * ?=?( const volatile void * &, const volatile DT * );417 forall( DT &) const volatile void * ?=?( const volatile void * volatile &, const volatile DT * );378 forall( ftype FT ) FT * ?=?( FT * volatile &, FT * ); 379 380 forall( dtype DT ) DT * ?=?( DT * &, DT * ); 381 forall( dtype DT ) DT * ?=?( DT * volatile &, DT * ); 382 forall( dtype DT ) const DT * ?=?( const DT * &, DT * ); 383 forall( dtype DT ) const DT * ?=?( const DT * volatile &, DT * ); 384 forall( dtype DT ) const DT * ?=?( const DT * &, const DT * ); 385 forall( dtype DT ) const DT * ?=?( const DT * volatile &, const DT * ); 386 forall( dtype DT ) volatile DT * ?=?( volatile DT * &, DT * ); 387 forall( dtype DT ) volatile DT * ?=?( volatile DT * volatile &, DT * ); 388 forall( dtype DT ) volatile DT * ?=?( volatile DT * &, volatile DT * ); 389 forall( dtype DT ) volatile DT * ?=?( volatile DT * volatile &, volatile DT * ); 390 391 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * &, DT * ); 392 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * volatile &, DT * ); 393 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * &, const DT * ); 394 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * volatile &, const DT * ); 395 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * &, volatile DT * ); 396 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * volatile &, volatile DT * ); 397 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * &, const volatile DT * ); 398 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * volatile &, const volatile DT * ); 399 400 forall( dtype DT ) void * ?=?( void * &, DT * ); 401 forall( dtype DT ) void * ?=?( void * volatile &, DT * ); 402 forall( dtype DT ) const void * ?=?( const void * &, DT * ); 403 forall( dtype DT ) const void * ?=?( const void * volatile &, DT * ); 404 forall( dtype DT ) const void * ?=?( const void * &, const DT * ); 405 forall( dtype DT ) const void * ?=?( const void * volatile &, const DT * ); 406 forall( dtype DT ) volatile void * ?=?( volatile void * &, DT * ); 407 forall( dtype DT ) volatile void * ?=?( volatile void * volatile &, DT * ); 408 forall( dtype DT ) volatile void * ?=?( volatile void * &, volatile DT * ); 409 forall( dtype DT ) volatile void * ?=?( volatile void * volatile &, volatile DT * ); 410 forall( dtype DT ) const volatile void * ?=?( const volatile void * &, DT * ); 411 forall( dtype DT ) const volatile void * ?=?( const volatile void * volatile &, DT * ); 412 forall( dtype DT ) const volatile void * ?=?( const volatile void * &, const DT * ); 413 forall( dtype DT ) const volatile void * ?=?( const volatile void * volatile &, const DT * ); 414 forall( dtype DT ) const volatile void * ?=?( const volatile void * &, volatile DT * ); 415 forall( dtype DT ) const volatile void * ?=?( const volatile void * volatile &, volatile DT * ); 416 forall( dtype DT ) const volatile void * ?=?( const volatile void * &, const volatile DT * ); 417 forall( dtype DT ) const volatile void * ?=?( const volatile void * volatile &, const volatile DT * ); 418 418 419 419 //forall( dtype DT ) DT * ?=?( DT * &, zero_t ); 420 420 //forall( dtype DT ) DT * ?=?( DT * volatile &, zero_t ); 421 forall( DT &) const DT * ?=?( const DT * &, zero_t );422 forall( DT &) const DT * ?=?( const DT * volatile &, zero_t );421 forall( dtype DT ) const DT * ?=?( const DT * &, zero_t ); 422 forall( dtype DT ) const DT * ?=?( const DT * volatile &, zero_t ); 423 423 //forall( dtype DT ) volatile DT * ?=?( volatile DT * &, zero_t ); 424 424 //forall( dtype DT ) volatile DT * ?=?( volatile DT * volatile &, zero_t ); 425 forall( DT &) const volatile DT * ?=?( const volatile DT * &, zero_t );426 forall( DT &) const volatile DT * ?=?( const volatile DT * volatile &, zero_t );425 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * &, zero_t ); 426 forall( dtype DT ) const volatile DT * ?=?( const volatile DT * volatile &, zero_t ); 427 427 428 428 forall( ftype FT ) FT * ?=?( FT * &, zero_t ); 429 429 forall( ftype FT ) FT * ?=?( FT * volatile &, zero_t ); 430 430 431 forall( T &| sized(T) ) T * ?+=?( T * &, ptrdiff_t );432 forall( T &| sized(T) ) T * ?+=?( T * volatile &, ptrdiff_t );433 forall( T &| sized(T) ) const T * ?+=?( const T * &, ptrdiff_t );434 forall( T &| sized(T) ) const T * ?+=?( const T * volatile &, ptrdiff_t );435 forall( T &| sized(T) ) volatile T * ?+=?( volatile T * &, ptrdiff_t );436 forall( T &| sized(T) ) volatile T * ?+=?( volatile T * volatile &, ptrdiff_t );437 forall( T &| sized(T) ) const volatile T * ?+=?( const volatile T * &, ptrdiff_t );438 forall( T &| sized(T) ) const volatile T * ?+=?( const volatile T * volatile &, ptrdiff_t );439 forall( T &| sized(T) ) T * ?-=?( T * &, ptrdiff_t );440 forall( T &| sized(T) ) T * ?-=?( T * volatile &, ptrdiff_t );441 forall( T &| sized(T) ) const T * ?-=?( const T * &, ptrdiff_t );442 forall( T &| sized(T) ) const T * ?-=?( const T * volatile &, ptrdiff_t );443 forall( T &| sized(T) ) volatile T * ?-=?( volatile T * &, ptrdiff_t );444 forall( T &| sized(T) ) volatile T * ?-=?( volatile T * volatile &, ptrdiff_t );445 forall( T &| sized(T) ) const volatile T * ?-=?( const volatile T * &, ptrdiff_t );446 forall( T &| sized(T) ) const volatile T * ?-=?( const volatile T * volatile &, ptrdiff_t );431 forall( dtype T | sized(T) ) T * ?+=?( T * &, ptrdiff_t ); 432 forall( dtype T | sized(T) ) T * ?+=?( T * volatile &, ptrdiff_t ); 433 forall( dtype T | sized(T) ) const T * ?+=?( const T * &, ptrdiff_t ); 434 forall( dtype T | sized(T) ) const T * ?+=?( const T * volatile &, ptrdiff_t ); 435 forall( dtype T | sized(T) ) volatile T * ?+=?( volatile T * &, ptrdiff_t ); 436 forall( dtype T | sized(T) ) volatile T * ?+=?( volatile T * volatile &, ptrdiff_t ); 437 forall( dtype T | sized(T) ) const volatile T * ?+=?( const volatile T * &, ptrdiff_t ); 438 forall( dtype T | sized(T) ) const volatile T * ?+=?( const volatile T * volatile &, ptrdiff_t ); 439 forall( dtype T | sized(T) ) T * ?-=?( T * &, ptrdiff_t ); 440 forall( dtype T | sized(T) ) T * ?-=?( T * volatile &, ptrdiff_t ); 441 forall( dtype T | sized(T) ) const T * ?-=?( const T * &, ptrdiff_t ); 442 forall( dtype T | sized(T) ) const T * ?-=?( const T * volatile &, ptrdiff_t ); 443 forall( dtype T | sized(T) ) volatile T * ?-=?( volatile T * &, ptrdiff_t ); 444 forall( dtype T | sized(T) ) volatile T * ?-=?( volatile T * volatile &, ptrdiff_t ); 445 forall( dtype T | sized(T) ) const volatile T * ?-=?( const volatile T * &, ptrdiff_t ); 446 forall( dtype T | sized(T) ) const volatile T * ?-=?( const volatile T * volatile &, ptrdiff_t ); 447 447 448 448 _Bool ?=?( _Bool &, _Bool ), ?=?( volatile _Bool &, _Bool ); … … 723 723 forall( ftype FT ) void ?{}( FT * volatile &, FT * ); 724 724 725 forall( DT &) void ?{}( DT * &, DT * );726 forall( DT &) void ?{}( const DT * &, DT * );727 forall( DT &) void ?{}( const DT * &, const DT * );728 forall( DT &) void ?{}( volatile DT * &, DT * );729 forall( DT &) void ?{}( volatile DT * &, volatile DT * );730 forall( DT &) void ?{}( const volatile DT * &, DT * );731 forall( DT &) void ?{}( const volatile DT * &, const DT * );732 forall( DT &) void ?{}( const volatile DT * &, volatile DT * );733 forall( DT &) void ?{}( const volatile DT * &, const volatile DT * );734 735 forall( DT &) void ?{}( void * &, DT * );736 forall( DT &) void ?{}( const void * &, DT * );737 forall( DT &) void ?{}( const void * &, const DT * );738 forall( DT &) void ?{}( volatile void * &, DT * );739 forall( DT &) void ?{}( volatile void * &, volatile DT * );740 forall( DT &) void ?{}( const volatile void * &, DT * );741 forall( DT &) void ?{}( const volatile void * &, const DT * );742 forall( DT &) void ?{}( const volatile void * &, volatile DT * );743 forall( DT &) void ?{}( const volatile void * &, const volatile DT * );725 forall( dtype DT ) void ?{}( DT * &, DT * ); 726 forall( dtype DT ) void ?{}( const DT * &, DT * ); 727 forall( dtype DT ) void ?{}( const DT * &, const DT * ); 728 forall( dtype DT ) void ?{}( volatile DT * &, DT * ); 729 forall( dtype DT ) void ?{}( volatile DT * &, volatile DT * ); 730 forall( dtype DT ) void ?{}( const volatile DT * &, DT * ); 731 forall( dtype DT ) void ?{}( const volatile DT * &, const DT * ); 732 forall( dtype DT ) void ?{}( const volatile DT * &, volatile DT * ); 733 forall( dtype DT ) void ?{}( const volatile DT * &, const volatile DT * ); 734 735 forall( dtype DT ) void ?{}( void * &, DT * ); 736 forall( dtype DT ) void ?{}( const void * &, DT * ); 737 forall( dtype DT ) void ?{}( const void * &, const DT * ); 738 forall( dtype DT ) void ?{}( volatile void * &, DT * ); 739 forall( dtype DT ) void ?{}( volatile void * &, volatile DT * ); 740 forall( dtype DT ) void ?{}( const volatile void * &, DT * ); 741 forall( dtype DT ) void ?{}( const volatile void * &, const DT * ); 742 forall( dtype DT ) void ?{}( const volatile void * &, volatile DT * ); 743 forall( dtype DT ) void ?{}( const volatile void * &, const volatile DT * ); 744 744 745 745 //forall( dtype DT ) void ?{}( DT * &, zero_t ); 746 746 //forall( dtype DT ) void ?{}( DT * volatile &, zero_t ); 747 forall( DT &) void ?{}( const DT * &, zero_t );747 forall( dtype DT ) void ?{}( const DT * &, zero_t ); 748 748 //forall( dtype DT ) void ?{}( volatile DT * &, zero_t ); 749 749 //forall( dtype DT ) void ?{}( volatile DT * volatile &, zero_t ); 750 forall( DT &) void ?{}( const volatile DT * &, zero_t );750 forall( dtype DT ) void ?{}( const volatile DT * &, zero_t ); 751 751 752 752 forall( ftype FT ) void ?{}( FT * &, zero_t ); … … 755 755 forall( ftype FT ) void ?{}( FT * & ); 756 756 757 forall( DT &) void ?{}( DT * &);758 forall( DT &) void ?{}( const DT * &);759 forall( DT &) void ?{}( volatile DT * &);760 forall( DT &) void ?{}( const volatile DT * &);757 forall( dtype DT ) void ?{}( DT * &); 758 forall( dtype DT ) void ?{}( const DT * &); 759 forall( dtype DT ) void ?{}( volatile DT * &); 760 forall( dtype DT ) void ?{}( const volatile DT * &); 761 761 762 762 void ?{}( void * &); … … 768 768 forall( ftype FT ) void ^?{}( FT * & ); 769 769 770 forall( DT &) void ^?{}( DT * &);771 forall( DT &) void ^?{}( const DT * &);772 forall( DT &) void ^?{}( volatile DT * &);773 forall( DT &) void ^?{}( const volatile DT * &);770 forall( dtype DT ) void ^?{}( DT * &); 771 forall( dtype DT ) void ^?{}( const DT * &); 772 forall( dtype DT ) void ^?{}( volatile DT * &); 773 forall( dtype DT ) void ^?{}( const volatile DT * &); 774 774 775 775 void ^?{}( void * &); -
libcfa/prelude/sync-builtins.cf
rc08c3cf r467c8b7 206 206 _Bool __sync_bool_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...); 207 207 #endif 208 forall( T &) _Bool __sync_bool_compare_and_swap(T * volatile *, T *, T*, ...);208 forall(dtype T) _Bool __sync_bool_compare_and_swap(T * volatile *, T *, T*, ...); 209 209 210 210 char __sync_val_compare_and_swap(volatile char *, char, char,...); … … 223 223 unsigned __int128 __sync_val_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...); 224 224 #endif 225 forall( T &) T * __sync_val_compare_and_swap(T * volatile *, T *, T*,...);225 forall(dtype T) T * __sync_val_compare_and_swap(T * volatile *, T *, T*,...); 226 226 227 227 char __sync_lock_test_and_set(volatile char *, char,...); … … 326 326 void __atomic_exchange(volatile unsigned __int128 *, volatile unsigned __int128 *, volatile unsigned __int128 *, int); 327 327 #endif 328 forall( T &) T * __atomic_exchange_n(T * volatile *, T *, int);329 forall( T &) void __atomic_exchange(T * volatile *, T * volatile *, T * volatile *, int);328 forall(dtype T) T * __atomic_exchange_n(T * volatile *, T *, int); 329 forall(dtype T) void __atomic_exchange(T * volatile *, T * volatile *, T * volatile *, int); 330 330 331 331 _Bool __atomic_load_n(const volatile _Bool *, int); … … 359 359 void __atomic_load(const volatile unsigned __int128 *, volatile unsigned __int128 *, int); 360 360 #endif 361 forall( T &) T * __atomic_load_n(T * const volatile *, int);362 forall( T &) void __atomic_load(T * const volatile *, T **, int);361 forall(dtype T) T * __atomic_load_n(T * const volatile *, int); 362 forall(dtype T) void __atomic_load(T * const volatile *, T **, int); 363 363 364 364 _Bool __atomic_compare_exchange_n(volatile char *, char *, char, _Bool, int, int); … … 390 390 _Bool __atomic_compare_exchange (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128 *, _Bool, int, int); 391 391 #endif 392 forall( T &) _Bool __atomic_compare_exchange_n (T * volatile *, T **, T*, _Bool, int, int);393 forall( T &) _Bool __atomic_compare_exchange (T * volatile *, T **, T**, _Bool, int, int);392 forall(dtype T) _Bool __atomic_compare_exchange_n (T * volatile *, T **, T*, _Bool, int, int); 393 forall(dtype T) _Bool __atomic_compare_exchange (T * volatile *, T **, T**, _Bool, int, int); 394 394 395 395 void __atomic_store_n(volatile _Bool *, _Bool, int); … … 423 423 void __atomic_store(volatile unsigned __int128 *, unsigned __int128 *, int); 424 424 #endif 425 forall( T &) void __atomic_store_n(T * volatile *, T *, int);426 forall( T &) void __atomic_store(T * volatile *, T **, int);425 forall(dtype T) void __atomic_store_n(T * volatile *, T *, int); 426 forall(dtype T) void __atomic_store(T * volatile *, T **, int); 427 427 428 428 char __atomic_add_fetch (volatile char *, char, int); -
libcfa/src/bitmanip.hfa
rc08c3cf r467c8b7 100 100 unsigned long long int floor2( unsigned long long int n, unsigned long long int align ) { verify( is_pow2( align ) ); return n & -align; } 101 101 102 // forall( T | { T ?&?( T, T ); T -?( T ); } )102 // forall( otype T | { T ?&?( T, T ); T -?( T ); } ) 103 103 // T floor2( T n, T align ) { verify( is_pow2( align ) ); return n & -align; } 104 104 … … 115 115 unsigned long long int ceiling2( unsigned long long int n, unsigned long long int align ) { verify( is_pow2( align ) ); return -floor2( -n, align ); } 116 116 117 // forall( T | { T floor2( T, T ); T -?( T ); } )117 // forall( otype T | { T floor2( T, T ); T -?( T ); } ) 118 118 // T ceiling2( T n, T align ) { verify( is_pow2( align ) ); return -floor2( -n, align ); } 119 119 } // distribution -
libcfa/src/bits/algorithm.hfa
rc08c3cf r467c8b7 17 17 18 18 #ifdef SAFE_SORT 19 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort2( T * arr );20 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort3( T * arr );21 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort4( T * arr );22 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort5( T * arr );23 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort6( T * arr );24 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sortN( T * arr, size_t dim );19 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort2( T * arr ); 20 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort3( T * arr ); 21 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort4( T * arr ); 22 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort5( T * arr ); 23 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sort6( T * arr ); 24 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) static inline void __libcfa_small_sortN( T * arr, size_t dim ); 25 25 26 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )26 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 27 27 static inline void __libcfa_small_sort( T * arr, size_t dim ) { 28 28 switch( dim ) { … … 41 41 #define SWAP(x,y) { T a = min(arr[x], arr[y]); T b = max(arr[x], arr[y]); arr[x] = a; arr[y] = b;} 42 42 43 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )43 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 44 44 static inline void __libcfa_small_sort2( T * arr ) { 45 45 SWAP(0, 1); 46 46 } 47 47 48 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )48 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 49 49 static inline void __libcfa_small_sort3( T * arr ) { 50 50 SWAP(1, 2); … … 53 53 } 54 54 55 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )55 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 56 56 static inline void __libcfa_small_sort4( T * arr ) { 57 57 SWAP(0, 1); … … 62 62 } 63 63 64 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )64 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 65 65 static inline void __libcfa_small_sort5( T * arr ) { 66 66 SWAP(0, 1); … … 75 75 } 76 76 77 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )77 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 78 78 static inline void __libcfa_small_sort6( T * arr ) { 79 79 SWAP(1, 2); … … 91 91 } 92 92 93 forall( T | { int ?<?( T, T ); int ?>?( T, T ); } )93 forall( otype T | { int ?<?( T, T ); int ?>?( T, T ); } ) 94 94 static inline void __libcfa_small_sortN( T * arr, size_t dim ) { 95 95 int i, j; … … 112 112 static inline void __libcfa_small_sortN( void* * arr, size_t dim ); 113 113 114 forall( T &)114 forall( dtype T ) 115 115 static inline void __libcfa_small_sort( T* * arr, size_t dim ) { 116 116 switch( dim ) { -
libcfa/src/bits/collection.hfa
rc08c3cf r467c8b7 31 31 32 32 // // wrappers to make Collection have T 33 // forall( T &) {33 // forall( dtype T ) { 34 34 // T *& Next( T * n ) { 35 35 // return (T *)Next( (Colable *)n ); … … 76 76 } // post: elts = null 77 77 78 forall( T &) {78 forall( dtype T ) { 79 79 T * Curr( ColIter & ci ) with( ci ) { 80 80 return (T *)curr; -
libcfa/src/bits/containers.hfa
rc08c3cf r467c8b7 23 23 24 24 #ifdef __cforall 25 forall( T &)25 forall(dtype T) 26 26 #else 27 27 #define T void … … 40 40 41 41 #ifdef __cforall 42 // forall( T | sized(T))42 // forall(otype T | sized(T)) 43 43 // static inline void ?{}(__small_array(T) & this) {} 44 44 45 forall( T &| sized(T))45 forall(dtype T | sized(T)) 46 46 static inline T & ?[?]( __small_array(T) & this, __lock_size_t idx ) { 47 47 return ((typeof(this.data))this.data)[idx]; 48 48 } 49 49 50 forall( T &| sized(T))50 forall(dtype T | sized(T)) 51 51 static inline T & ?[?]( const __small_array(T) & this, __lock_size_t idx ) { 52 52 return ((typeof(this.data))this.data)[idx]; 53 53 } 54 54 55 forall( T &)55 forall(dtype T) 56 56 static inline T * begin( const __small_array(T) & this ) { 57 57 return ((typeof(this.data))this.data); 58 58 } 59 59 60 forall( T &| sized(T))60 forall(dtype T | sized(T)) 61 61 static inline T * end( const __small_array(T) & this ) { 62 62 return ((typeof(this.data))this.data) + this.size; … … 69 69 70 70 #ifdef __cforall 71 trait is_node( T &) {71 trait is_node(dtype T) { 72 72 T *& get_next( T & ); 73 73 }; … … 78 78 //----------------------------------------------------------------------------- 79 79 #ifdef __cforall 80 forall( TYPE &)80 forall(dtype TYPE) 81 81 #define T TYPE 82 82 #else … … 95 95 96 96 #ifdef __cforall 97 forall( T &)97 forall(dtype T) 98 98 static inline void ?{}( __stack(T) & this ) { 99 99 (this.top){ 0p }; 100 100 } 101 101 102 static inline forall( T &| is_node(T) ) {102 static inline forall( dtype T | is_node(T) ) { 103 103 void push( __stack(T) & this, T * val ) { 104 104 verify( !get_next( *val ) ); … … 126 126 //----------------------------------------------------------------------------- 127 127 #ifdef __cforall 128 forall( TYPE &)128 forall(dtype TYPE) 129 129 #define T TYPE 130 130 #else … … 144 144 145 145 #ifdef __cforall 146 static inline forall( T &| is_node(T) ) {146 static inline forall( dtype T | is_node(T) ) { 147 147 void ?{}( __queue(T) & this ) with( this ) { 148 148 (this.head){ 1p }; … … 215 215 //----------------------------------------------------------------------------- 216 216 #ifdef __cforall 217 forall( TYPE &)217 forall(dtype TYPE) 218 218 #define T TYPE 219 219 #define __getter_t * [T * & next, T * & prev] ( T & ) … … 237 237 238 238 #ifdef __cforall 239 forall( T &)239 forall(dtype T ) 240 240 static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) { 241 241 (this.head){ 0p }; … … 245 245 #define next 0 246 246 #define prev 1 247 static inline forall( T &) {247 static inline forall(dtype T) { 248 248 void push_front( __dllist(T) & this, T & node ) with( this ) { 249 249 verify(__get); -
libcfa/src/bits/defs.hfa
rc08c3cf r467c8b7 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // defs.hfa -- Commen macros, functions and typedefs 8 // Most files depend on them and they are always useful to have. 9 // 10 // *** Must not contain code specific to libcfathread *** 7 // defs.hfa -- 11 8 // 12 9 // Author : Thierry Delisle … … 65 62 #endif 66 63 } 67 68 // pause to prevent excess processor bus usage69 #if defined( __i386 ) || defined( __x86_64 )70 #define Pause() __asm__ __volatile__ ( "pause" : : : )71 #elif defined( __ARM_ARCH )72 #define Pause() __asm__ __volatile__ ( "YIELD" : : : )73 #else74 #error unsupported architecture75 #endif -
libcfa/src/bits/locks.hfa
rc08c3cf r467c8b7 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // bits/locks.hfa -- Basic spinlocks that are reused in the system. 8 // Used for locks that aren't specific to cforall threads and can be used anywhere 9 // 10 // *** Must not contain code specific to libcfathread *** 7 // bits/locks.hfa -- Fast internal locks. 11 8 // 12 9 // Author : Thierry Delisle … … 22 19 #include "bits/defs.hfa" 23 20 #include <assert.h> 21 22 #ifdef __cforall 23 extern "C" { 24 #include <pthread.h> 25 } 26 #endif 27 28 // pause to prevent excess processor bus usage 29 #if defined( __i386 ) || defined( __x86_64 ) 30 #define Pause() __asm__ __volatile__ ( "pause" : : : ) 31 #elif defined( __ARM_ARCH ) 32 #define Pause() __asm__ __volatile__ ( "YIELD" : : : ) 33 #else 34 #error unsupported architecture 35 #endif 24 36 25 37 struct __spinlock_t { … … 92 104 enable_interrupts_noPoll(); 93 105 } 106 107 108 #ifdef __CFA_WITH_VERIFY__ 109 extern bool __cfaabi_dbg_in_kernel(); 110 #endif 111 112 extern "C" { 113 char * strerror(int); 114 } 115 #define CHECKED(x) { int err = x; if( err != 0 ) abort("KERNEL ERROR: Operation \"" #x "\" return error %d - %s\n", err, strerror(err)); } 116 117 struct __bin_sem_t { 118 pthread_mutex_t lock; 119 pthread_cond_t cond; 120 int val; 121 }; 122 123 static inline void ?{}(__bin_sem_t & this) with( this ) { 124 // Create the mutex with error checking 125 pthread_mutexattr_t mattr; 126 pthread_mutexattr_init( &mattr ); 127 pthread_mutexattr_settype( &mattr, PTHREAD_MUTEX_ERRORCHECK_NP); 128 pthread_mutex_init(&lock, &mattr); 129 130 pthread_cond_init (&cond, (const pthread_condattr_t *)0p); // workaround trac#208: cast should not be required 131 val = 0; 132 } 133 134 static inline void ^?{}(__bin_sem_t & this) with( this ) { 135 CHECKED( pthread_mutex_destroy(&lock) ); 136 CHECKED( pthread_cond_destroy (&cond) ); 137 } 138 139 static inline void wait(__bin_sem_t & this) with( this ) { 140 verify(__cfaabi_dbg_in_kernel()); 141 CHECKED( pthread_mutex_lock(&lock) ); 142 while(val < 1) { 143 pthread_cond_wait(&cond, &lock); 144 } 145 val -= 1; 146 CHECKED( pthread_mutex_unlock(&lock) ); 147 } 148 149 static inline bool post(__bin_sem_t & this) with( this ) { 150 bool needs_signal = false; 151 152 CHECKED( pthread_mutex_lock(&lock) ); 153 if(val < 1) { 154 val += 1; 155 pthread_cond_signal(&cond); 156 needs_signal = true; 157 } 158 CHECKED( pthread_mutex_unlock(&lock) ); 159 160 return needs_signal; 161 } 162 163 #undef CHECKED 164 165 struct $thread; 166 extern void park( void ); 167 extern void unpark( struct $thread * this ); 168 static inline struct $thread * active_thread (); 169 170 // Semaphore which only supports a single thread 171 struct single_sem { 172 struct $thread * volatile ptr; 173 }; 174 175 static inline { 176 void ?{}(single_sem & this) { 177 this.ptr = 0p; 178 } 179 180 void ^?{}(single_sem &) {} 181 182 bool wait(single_sem & this) { 183 for() { 184 struct $thread * expected = this.ptr; 185 if(expected == 1p) { 186 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 187 return false; 188 } 189 } 190 else { 191 /* paranoid */ verify( expected == 0p ); 192 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 193 park(); 194 return true; 195 } 196 } 197 198 } 199 } 200 201 bool post(single_sem & this) { 202 for() { 203 struct $thread * expected = this.ptr; 204 if(expected == 1p) return false; 205 if(expected == 0p) { 206 if(__atomic_compare_exchange_n(&this.ptr, &expected, 1p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 207 return false; 208 } 209 } 210 else { 211 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 212 unpark( expected ); 213 return true; 214 } 215 } 216 } 217 } 218 } 219 220 // Synchronozation primitive which only supports a single thread and one post 221 // Similar to a binary semaphore with a 'one shot' semantic 222 // is expected to be discarded after each party call their side 223 struct oneshot { 224 // Internal state : 225 // 0p : is initial state (wait will block) 226 // 1p : fulfilled (wait won't block) 227 // any thread : a thread is currently waiting 228 struct $thread * volatile ptr; 229 }; 230 231 static inline { 232 void ?{}(oneshot & this) { 233 this.ptr = 0p; 234 } 235 236 void ^?{}(oneshot &) {} 237 238 // Wait for the post, return immidiately if it already happened. 239 // return true if the thread was parked 240 bool wait(oneshot & this) { 241 for() { 242 struct $thread * expected = this.ptr; 243 if(expected == 1p) return false; 244 /* paranoid */ verify( expected == 0p ); 245 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 246 park(); 247 /* paranoid */ verify( this.ptr == 1p ); 248 return true; 249 } 250 } 251 } 252 253 // Mark as fulfilled, wake thread if needed 254 // return true if a thread was unparked 255 bool post(oneshot & this) { 256 struct $thread * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 257 if( got == 0p ) return false; 258 unpark( got ); 259 return true; 260 } 261 } 262 263 // base types for future to build upon 264 // It is based on the 'oneshot' type to allow multiple futures 265 // to block on the same instance, permitting users to block a single 266 // thread on "any of" [a given set of] futures. 267 // does not support multiple threads waiting on the same future 268 struct future_t { 269 // Internal state : 270 // 0p : is initial state (wait will block) 271 // 1p : fulfilled (wait won't block) 272 // 2p : in progress () 273 // 3p : abandoned, server should delete 274 // any oneshot : a context has been setup to wait, a thread could wait on it 275 struct oneshot * volatile ptr; 276 }; 277 278 static inline { 279 void ?{}(future_t & this) { 280 this.ptr = 0p; 281 } 282 283 void ^?{}(future_t &) {} 284 285 void reset(future_t & this) { 286 // needs to be in 0p or 1p 287 __atomic_exchange_n( &this.ptr, 0p, __ATOMIC_SEQ_CST); 288 } 289 290 // check if the future is available 291 bool available( future_t & this ) { 292 return this.ptr == 1p; 293 } 294 295 // Prepare the future to be waited on 296 // intented to be use by wait, wait_any, waitfor, etc. rather than used directly 297 bool setup( future_t & this, oneshot & wait_ctx ) { 298 /* paranoid */ verify( wait_ctx.ptr == 0p ); 299 // The future needs to set the wait context 300 for() { 301 struct oneshot * expected = this.ptr; 302 // Is the future already fulfilled? 303 if(expected == 1p) return false; // Yes, just return false (didn't block) 304 305 // The future is not fulfilled, try to setup the wait context 306 /* paranoid */ verify( expected == 0p ); 307 if(__atomic_compare_exchange_n(&this.ptr, &expected, &wait_ctx, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 308 return true; 309 } 310 } 311 } 312 313 // Stop waiting on a future 314 // When multiple futures are waited for together in "any of" pattern 315 // futures that weren't fulfilled before the thread woke up 316 // should retract the wait ctx 317 // intented to be use by wait, wait_any, waitfor, etc. rather than used directly 318 void retract( future_t & this, oneshot & wait_ctx ) { 319 // Remove the wait context 320 struct oneshot * got = __atomic_exchange_n( &this.ptr, 0p, __ATOMIC_SEQ_CST); 321 322 // got == 0p: future was never actually setup, just return 323 if( got == 0p ) return; 324 325 // got == wait_ctx: since fulfil does an atomic_swap, 326 // if we got back the original then no one else saw context 327 // It is safe to delete (which could happen after the return) 328 if( got == &wait_ctx ) return; 329 330 // got == 1p: the future is ready and the context was fully consumed 331 // the server won't use the pointer again 332 // It is safe to delete (which could happen after the return) 333 if( got == 1p ) return; 334 335 // got == 2p: the future is ready but the context hasn't fully been consumed 336 // spin until it is safe to move on 337 if( got == 2p ) { 338 while( this.ptr != 1p ) Pause(); 339 return; 340 } 341 342 // got == any thing else, something wen't wrong here, abort 343 abort("Future in unexpected state"); 344 } 345 346 // Mark the future as abandoned, meaning it will be deleted by the server 347 bool abandon( future_t & this ) { 348 /* paranoid */ verify( this.ptr != 3p ); 349 350 // Mark the future as abandonned 351 struct oneshot * got = __atomic_exchange_n( &this.ptr, 3p, __ATOMIC_SEQ_CST); 352 353 // If the future isn't already fulfilled, let the server delete it 354 if( got == 0p ) return false; 355 356 // got == 2p: the future is ready but the context hasn't fully been consumed 357 // spin until it is safe to move on 358 if( got == 2p ) { 359 while( this.ptr != 1p ) Pause(); 360 got = 1p; 361 } 362 363 // The future is completed delete it now 364 /* paranoid */ verify( this.ptr != 1p ); 365 free( &this ); 366 return true; 367 } 368 369 // from the server side, mark the future as fulfilled 370 // delete it if needed 371 bool fulfil( future_t & this ) { 372 for() { 373 struct oneshot * expected = this.ptr; 374 // was this abandoned? 375 #if defined(__GNUC__) && __GNUC__ >= 7 376 #pragma GCC diagnostic push 377 #pragma GCC diagnostic ignored "-Wfree-nonheap-object" 378 #endif 379 if( expected == 3p ) { free( &this ); return false; } 380 #if defined(__GNUC__) && __GNUC__ >= 7 381 #pragma GCC diagnostic pop 382 #endif 383 384 /* paranoid */ verify( expected != 1p ); // Future is already fulfilled, should not happen 385 /* paranoid */ verify( expected != 2p ); // Future is bein fulfilled by someone else, this is even less supported then the previous case. 386 387 // If there is a wait context, we need to consume it and mark it as consumed after 388 // If there is no context then we can skip the in progress phase 389 struct oneshot * want = expected == 0p ? 1p : 2p; 390 if(__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 391 if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return false; } 392 bool ret = post( *expected ); 393 __atomic_store_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 394 return ret; 395 } 396 } 397 398 } 399 400 // Wait for the future to be fulfilled 401 bool wait( future_t & this ) { 402 oneshot temp; 403 if( !setup(this, temp) ) return false; 404 405 // Wait context is setup, just wait on it 406 bool ret = wait( temp ); 407 408 // Wait for the future to tru 409 while( this.ptr == 2p ) Pause(); 410 // Make sure the state makes sense 411 // Should be fulfilled, could be in progress but it's out of date if so 412 // since if that is the case, the oneshot was fulfilled (unparking this thread) 413 // and the oneshot should not be needed any more 414 __attribute__((unused)) struct oneshot * was = this.ptr; 415 /* paranoid */ verifyf( was == 1p, "Expected this.ptr to be 1p, was %p\n", was ); 416 417 // Mark the future as fulfilled, to be consistent 418 // with potential calls to avail 419 // this.ptr = 1p; 420 return ret; 421 } 422 } 94 423 #endif -
libcfa/src/bits/queue.hfa
rc08c3cf r467c8b7 9 9 // instead of being null. 10 10 11 forall( T &| { T *& Next ( T * ); } ) {11 forall( dtype T | { T *& Next ( T * ); } ) { 12 12 struct Queue { 13 13 inline Collection; // Plan 9 inheritance … … 151 151 } // distribution 152 152 153 forall( T &| { T *& Next ( T * ); } ) {153 forall( dtype T | { T *& Next ( T * ); } ) { 154 154 struct QueueIter { 155 155 inline ColIter; // Plan 9 inheritance -
libcfa/src/bits/sequence.hfa
rc08c3cf r467c8b7 29 29 30 30 // // wrappers to make Collection have T 31 // forall( T &) {31 // forall( dtype T ) { 32 32 // T *& Back( T * n ) { 33 33 // return (T *)Back( (Seqable *)n ); … … 43 43 // and the back field of the last node points at the first node (circular). 44 44 45 forall( T &| { T *& Back ( T * ); T *& Next ( T * ); } ) {45 forall( dtype T | { T *& Back ( T * ); T *& Next ( T * ); } ) { 46 46 struct Sequence { 47 47 inline Collection; // Plan 9 inheritance … … 231 231 } // distribution 232 232 233 forall( T &| { T *& Back ( T * ); T *& Next ( T * ); } ) {233 forall( dtype T | { T *& Back ( T * ); T *& Next ( T * ); } ) { 234 234 // SeqIter(T) is used to iterate over a Sequence(T) in head-to-tail order. 235 235 struct SeqIter { -
libcfa/src/bits/stack.hfa
rc08c3cf r467c8b7 9 9 // instead of being null. 10 10 11 forall( T &| { T *& Next ( T * ); } ) {11 forall( dtype T | { T *& Next ( T * ); } ) { 12 12 struct Stack { 13 13 inline Collection; // Plan 9 inheritance … … 67 67 // order returned by drop(). 68 68 69 forall( T &| { T *& Next ( T * ); } ) {69 forall( dtype T | { T *& Next ( T * ); } ) { 70 70 struct StackIter { 71 71 inline ColIter; // Plan 9 inheritance -
libcfa/src/common.cfa
rc08c3cf r467c8b7 23 23 [ long int, long int ] div( long int num, long int denom ) { ldiv_t qr = ldiv( num, denom ); return [ qr.quot, qr.rem ]; } 24 24 [ long long int, long long int ] div( long long int num, long long int denom ) { lldiv_t qr = lldiv( num, denom ); return [ qr.quot, qr.rem ]; } 25 forall( T | { T ?/?( T, T ); T ?%?( T, T ); } )25 forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } ) 26 26 [ T, T ] div( T num, T denom ) { return [ num / denom, num % denom ]; } 27 27 -
libcfa/src/common.hfa
rc08c3cf r467c8b7 21 21 [ long int, long int ] div( long int num, long int denom ); 22 22 [ long long int, long long int ] div( long long int num, long long int denom ); 23 forall( T | { T ?/?( T, T ); T ?%?( T, T ); } )23 forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } ) 24 24 [ T, T ] div( T num, T demon ); 25 25 … … 61 61 } // distribution 62 62 63 forall( T | { void ?{}( T &, zero_t ); int ?<?( T, T ); T -?( T ); } )63 forall( otype T | { void ?{}( T &, zero_t ); int ?<?( T, T ); T -?( T ); } ) 64 64 T abs( T ); 65 65 … … 70 70 intptr_t min( intptr_t t1, intptr_t t2 ) { return t1 < t2 ? t1 : t2; } // optimization 71 71 uintptr_t min( uintptr_t t1, uintptr_t t2 ) { return t1 < t2 ? t1 : t2; } // optimization 72 forall( T | { int ?<?( T, T ); } )72 forall( otype T | { int ?<?( T, T ); } ) 73 73 T min( T t1, T t2 ) { return t1 < t2 ? t1 : t2; } 74 74 … … 76 76 intptr_t max( intptr_t t1, intptr_t t2 ) { return t1 > t2 ? t1 : t2; } // optimization 77 77 uintptr_t max( uintptr_t t1, uintptr_t t2 ) { return t1 > t2 ? t1 : t2; } // optimization 78 forall( T | { int ?>?( T, T ); } )78 forall( otype T | { int ?>?( T, T ); } ) 79 79 T max( T t1, T t2 ) { return t1 > t2 ? t1 : t2; } 80 80 81 forall( T | { T min( T, T ); T max( T, T ); } )81 forall( otype T | { T min( T, T ); T max( T, T ); } ) 82 82 T clamp( T value, T min_val, T max_val ) { return max( min_val, min( value, max_val ) ); } 83 83 84 forall( T )84 forall( otype T ) 85 85 void swap( T & v1, T & v2 ) { T temp = v1; v1 = v2; v2 = temp; } 86 86 } // distribution -
libcfa/src/concurrency/coroutine.cfa
rc08c3cf r467c8b7 46 46 47 47 //----------------------------------------------------------------------------- 48 FORALL_DATA_INSTANCE(CoroutineCancelled, ( coroutine_t &), (coroutine_t))49 50 forall( T &)48 FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) 49 50 forall(dtype T) 51 51 void mark_exception(CoroutineCancelled(T) *) {} 52 52 53 forall( T &)53 forall(dtype T) 54 54 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) { 55 55 dst->virtual_table = src->virtual_table; … … 58 58 } 59 59 60 forall( T &)60 forall(dtype T) 61 61 const char * msg(CoroutineCancelled(T) *) { 62 62 return "CoroutineCancelled(...)"; … … 64 64 65 65 // This code should not be inlined. It is the error path on resume. 66 forall( T &| is_coroutine(T))66 forall(dtype T | is_coroutine(T)) 67 67 void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc ) { 68 68 verify( desc->cancellation ); … … 148 148 // Part of the Public API 149 149 // Not inline since only ever called once per coroutine 150 forall( T &| is_coroutine(T))150 forall(dtype T | is_coroutine(T)) 151 151 void prime(T& cor) { 152 152 $coroutine* this = get_coroutine(cor); -
libcfa/src/concurrency/coroutine.hfa
rc08c3cf r467c8b7 22 22 //----------------------------------------------------------------------------- 23 23 // Exception thrown from resume when a coroutine stack is cancelled. 24 FORALL_DATA_EXCEPTION(CoroutineCancelled, ( coroutine_t &), (coroutine_t)) (24 FORALL_DATA_EXCEPTION(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) ( 25 25 coroutine_t * the_coroutine; 26 26 exception_t * the_exception; 27 27 ); 28 28 29 forall( T &)29 forall(dtype T) 30 30 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src); 31 31 32 forall( T &)32 forall(dtype T) 33 33 const char * msg(CoroutineCancelled(T) *); 34 34 … … 37 37 // Anything that implements this trait can be resumed. 38 38 // Anything that is resumed is a coroutine. 39 trait is_coroutine( T &| IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) {39 trait is_coroutine(dtype T | IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) { 40 40 void main(T & this); 41 41 $coroutine * get_coroutine(T & this); … … 60 60 //----------------------------------------------------------------------------- 61 61 // Public coroutine API 62 forall( T &| is_coroutine(T))62 forall(dtype T | is_coroutine(T)) 63 63 void prime(T & cor); 64 64 … … 72 72 void __cfactx_invoke_coroutine(void (*main)(void *), void * this); 73 73 74 forall( T &)74 forall(dtype T) 75 75 void __cfactx_start(void (*main)(T &), struct $coroutine * cor, T & this, void (*invoke)(void (*main)(void *), void *)); 76 76 … … 129 129 } 130 130 131 forall( T &| is_coroutine(T))131 forall(dtype T | is_coroutine(T)) 132 132 void __cfaehm_cancelled_coroutine( T & cor, $coroutine * desc ); 133 133 134 134 // Resume implementation inlined for performance 135 forall( T &| is_coroutine(T))135 forall(dtype T | is_coroutine(T)) 136 136 static inline T & resume(T & cor) { 137 137 // optimization : read TLS once and reuse it -
libcfa/src/concurrency/future.hfa
rc08c3cf r467c8b7 19 19 #include "monitor.hfa" 20 20 21 forall( T ) {21 forall( otype T ) { 22 22 struct future { 23 23 inline future_t; … … 58 58 } 59 59 60 forall( T ) {60 forall( otype T ) { 61 61 monitor multi_future { 62 62 inline future_t; -
libcfa/src/concurrency/io/types.hfa
rc08c3cf r467c8b7 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // io/types.hfa -- PRIVATE 8 // Types used by the I/O subsystem 7 // io/types.hfa -- 9 8 // 10 9 // Author : Thierry Delisle … … 22 21 23 22 #include "bits/locks.hfa" 24 #include "kernel/fwd.hfa"25 23 26 24 #if defined(CFA_HAVE_LINUX_IO_URING_H) -
libcfa/src/concurrency/kernel.cfa
rc08c3cf r467c8b7 224 224 } 225 225 226 post( this->terminated );226 V( this->terminated ); 227 227 228 228 if(this == mainProcessor) { … … 624 624 // Unexpected Terminating logic 625 625 //============================================================================================= 626 void __kernel_abort_msg( char * abort_text, int abort_text_size ) { 627 $thread * thrd = __cfaabi_tls.this_thread; 626 627 extern "C" { 628 extern void __cfaabi_real_abort(void); 629 } 630 static volatile bool kernel_abort_called = false; 631 632 void * kernel_abort(void) __attribute__ ((__nothrow__)) { 633 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 634 // the globalAbort flag is true. 635 bool first = !__atomic_test_and_set( &kernel_abort_called, __ATOMIC_SEQ_CST); 636 637 // first task to abort ? 638 if ( !first ) { 639 // We aren't the first to abort. 640 // I give up, just let C handle it 641 __cfaabi_real_abort(); 642 } 643 644 // disable interrupts, it no longer makes sense to try to interrupt this processor 645 disable_interrupts(); 646 647 return __cfaabi_tls.this_thread; 648 } 649 650 void kernel_abort_msg( void * kernel_data, char * abort_text, int abort_text_size ) { 651 $thread * thrd = ( $thread * ) kernel_data; 628 652 629 653 if(thrd) { … … 645 669 } 646 670 647 int __kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) {648 return get_coroutine( __cfaabi_tls.this_thread) == get_coroutine(mainThread) ? 4 : 2;671 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__)) { 672 return get_coroutine(kernelTLS().this_thread) == get_coroutine(mainThread) ? 4 : 2; 649 673 } 650 674 … … 664 688 // Kernel Utilities 665 689 //============================================================================================= 690 //----------------------------------------------------------------------------- 691 // Locks 692 void ?{}( semaphore & this, int count = 1 ) { 693 (this.lock){}; 694 this.count = count; 695 (this.waiting){}; 696 } 697 void ^?{}(semaphore & this) {} 698 699 bool P(semaphore & this) with( this ){ 700 lock( lock __cfaabi_dbg_ctx2 ); 701 count -= 1; 702 if ( count < 0 ) { 703 // queue current task 704 append( waiting, active_thread() ); 705 706 // atomically release spin lock and block 707 unlock( lock ); 708 park(); 709 return true; 710 } 711 else { 712 unlock( lock ); 713 return false; 714 } 715 } 716 717 bool V(semaphore & this) with( this ) { 718 $thread * thrd = 0p; 719 lock( lock __cfaabi_dbg_ctx2 ); 720 count += 1; 721 if ( count <= 0 ) { 722 // remove task at head of waiting list 723 thrd = pop_head( waiting ); 724 } 725 726 unlock( lock ); 727 728 // make new owner 729 unpark( thrd ); 730 731 return thrd != 0p; 732 } 733 734 bool V(semaphore & this, unsigned diff) with( this ) { 735 $thread * thrd = 0p; 736 lock( lock __cfaabi_dbg_ctx2 ); 737 int release = max(-count, (int)diff); 738 count += diff; 739 for(release) { 740 unpark( pop_head( waiting ) ); 741 } 742 743 unlock( lock ); 744 745 return thrd != 0p; 746 } 747 666 748 //----------------------------------------------------------------------------- 667 749 // Debug -
libcfa/src/concurrency/kernel.hfa
rc08c3cf r467c8b7 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // kernel -- Header containing the core of the kernel API7 // kernel -- 8 8 // 9 9 // Author : Thierry Delisle … … 24 24 extern "C" { 25 25 #include <bits/pthreadtypes.h> 26 #include <pthread.h>27 26 #include <linux/types.h> 28 27 } 29 28 30 29 //----------------------------------------------------------------------------- 31 // Underlying Locks 32 #ifdef __CFA_WITH_VERIFY__ 33 extern bool __cfaabi_dbg_in_kernel(); 34 #endif 35 36 extern "C" { 37 char * strerror(int); 38 } 39 #define CHECKED(x) { int err = x; if( err != 0 ) abort("KERNEL ERROR: Operation \"" #x "\" return error %d - %s\n", err, strerror(err)); } 40 41 struct __bin_sem_t { 42 pthread_mutex_t lock; 43 pthread_cond_t cond; 44 int val; 45 }; 46 47 static inline void ?{}(__bin_sem_t & this) with( this ) { 48 // Create the mutex with error checking 49 pthread_mutexattr_t mattr; 50 pthread_mutexattr_init( &mattr ); 51 pthread_mutexattr_settype( &mattr, PTHREAD_MUTEX_ERRORCHECK_NP); 52 pthread_mutex_init(&lock, &mattr); 53 54 pthread_cond_init (&cond, (const pthread_condattr_t *)0p); // workaround trac#208: cast should not be required 55 val = 0; 56 } 57 58 static inline void ^?{}(__bin_sem_t & this) with( this ) { 59 CHECKED( pthread_mutex_destroy(&lock) ); 60 CHECKED( pthread_cond_destroy (&cond) ); 61 } 62 63 static inline void wait(__bin_sem_t & this) with( this ) { 64 verify(__cfaabi_dbg_in_kernel()); 65 CHECKED( pthread_mutex_lock(&lock) ); 66 while(val < 1) { 67 pthread_cond_wait(&cond, &lock); 68 } 69 val -= 1; 70 CHECKED( pthread_mutex_unlock(&lock) ); 71 } 72 73 static inline bool post(__bin_sem_t & this) with( this ) { 74 bool needs_signal = false; 75 76 CHECKED( pthread_mutex_lock(&lock) ); 77 if(val < 1) { 78 val += 1; 79 pthread_cond_signal(&cond); 80 needs_signal = true; 81 } 82 CHECKED( pthread_mutex_unlock(&lock) ); 83 84 return needs_signal; 85 } 86 87 #undef CHECKED 30 // Locks 31 struct semaphore { 32 __spinlock_t lock; 33 int count; 34 __queue_t($thread) waiting; 35 }; 36 37 void ?{}(semaphore & this, int count = 1); 38 void ^?{}(semaphore & this); 39 bool P (semaphore & this); 40 bool V (semaphore & this); 41 bool V (semaphore & this, unsigned count); 88 42 89 43 … … 137 91 138 92 // Termination synchronisation (user semaphore) 139 oneshotterminated;93 semaphore terminated; 140 94 141 95 // pthread Stack -
libcfa/src/concurrency/kernel/fwd.hfa
rc08c3cf r467c8b7 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // kernel/fwd.hfa -- PUBLIC 8 // Fundamental code needed to implement threading M.E.S. algorithms. 7 // kernel/fwd.hfa -- 9 8 // 10 9 // Author : Thierry Delisle … … 135 134 extern uint64_t thread_rand(); 136 135 137 // Semaphore which only supports a single thread138 struct single_sem {139 struct $thread * volatile ptr;140 };141 142 static inline {143 void ?{}(single_sem & this) {144 this.ptr = 0p;145 }146 147 void ^?{}(single_sem &) {}148 149 bool wait(single_sem & this) {150 for() {151 struct $thread * expected = this.ptr;152 if(expected == 1p) {153 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {154 return false;155 }156 }157 else {158 /* paranoid */ verify( expected == 0p );159 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {160 park();161 return true;162 }163 }164 165 }166 }167 168 bool post(single_sem & this) {169 for() {170 struct $thread * expected = this.ptr;171 if(expected == 1p) return false;172 if(expected == 0p) {173 if(__atomic_compare_exchange_n(&this.ptr, &expected, 1p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {174 return false;175 }176 }177 else {178 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {179 unpark( expected );180 return true;181 }182 }183 }184 }185 }186 187 // Synchronozation primitive which only supports a single thread and one post188 // Similar to a binary semaphore with a 'one shot' semantic189 // is expected to be discarded after each party call their side190 struct oneshot {191 // Internal state :192 // 0p : is initial state (wait will block)193 // 1p : fulfilled (wait won't block)194 // any thread : a thread is currently waiting195 struct $thread * volatile ptr;196 };197 198 static inline {199 void ?{}(oneshot & this) {200 this.ptr = 0p;201 }202 203 void ^?{}(oneshot &) {}204 205 // Wait for the post, return immidiately if it already happened.206 // return true if the thread was parked207 bool wait(oneshot & this) {208 for() {209 struct $thread * expected = this.ptr;210 if(expected == 1p) return false;211 /* paranoid */ verify( expected == 0p );212 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {213 park();214 /* paranoid */ verify( this.ptr == 1p );215 return true;216 }217 }218 }219 220 // Mark as fulfilled, wake thread if needed221 // return true if a thread was unparked222 bool post(oneshot & this) {223 struct $thread * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);224 if( got == 0p ) return false;225 unpark( got );226 return true;227 }228 }229 230 // base types for future to build upon231 // It is based on the 'oneshot' type to allow multiple futures232 // to block on the same instance, permitting users to block a single233 // thread on "any of" [a given set of] futures.234 // does not support multiple threads waiting on the same future235 struct future_t {236 // Internal state :237 // 0p : is initial state (wait will block)238 // 1p : fulfilled (wait won't block)239 // 2p : in progress ()240 // 3p : abandoned, server should delete241 // any oneshot : a context has been setup to wait, a thread could wait on it242 struct oneshot * volatile ptr;243 };244 245 static inline {246 void ?{}(future_t & this) {247 this.ptr = 0p;248 }249 250 void ^?{}(future_t &) {}251 252 void reset(future_t & this) {253 // needs to be in 0p or 1p254 __atomic_exchange_n( &this.ptr, 0p, __ATOMIC_SEQ_CST);255 }256 257 // check if the future is available258 bool available( future_t & this ) {259 return this.ptr == 1p;260 }261 262 // Prepare the future to be waited on263 // intented to be use by wait, wait_any, waitfor, etc. rather than used directly264 bool setup( future_t & this, oneshot & wait_ctx ) {265 /* paranoid */ verify( wait_ctx.ptr == 0p );266 // The future needs to set the wait context267 for() {268 struct oneshot * expected = this.ptr;269 // Is the future already fulfilled?270 if(expected == 1p) return false; // Yes, just return false (didn't block)271 272 // The future is not fulfilled, try to setup the wait context273 /* paranoid */ verify( expected == 0p );274 if(__atomic_compare_exchange_n(&this.ptr, &expected, &wait_ctx, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {275 return true;276 }277 }278 }279 280 // Stop waiting on a future281 // When multiple futures are waited for together in "any of" pattern282 // futures that weren't fulfilled before the thread woke up283 // should retract the wait ctx284 // intented to be use by wait, wait_any, waitfor, etc. rather than used directly285 void retract( future_t & this, oneshot & wait_ctx ) {286 // Remove the wait context287 struct oneshot * got = __atomic_exchange_n( &this.ptr, 0p, __ATOMIC_SEQ_CST);288 289 // got == 0p: future was never actually setup, just return290 if( got == 0p ) return;291 292 // got == wait_ctx: since fulfil does an atomic_swap,293 // if we got back the original then no one else saw context294 // It is safe to delete (which could happen after the return)295 if( got == &wait_ctx ) return;296 297 // got == 1p: the future is ready and the context was fully consumed298 // the server won't use the pointer again299 // It is safe to delete (which could happen after the return)300 if( got == 1p ) return;301 302 // got == 2p: the future is ready but the context hasn't fully been consumed303 // spin until it is safe to move on304 if( got == 2p ) {305 while( this.ptr != 1p ) Pause();306 return;307 }308 309 // got == any thing else, something wen't wrong here, abort310 abort("Future in unexpected state");311 }312 313 // Mark the future as abandoned, meaning it will be deleted by the server314 bool abandon( future_t & this ) {315 /* paranoid */ verify( this.ptr != 3p );316 317 // Mark the future as abandonned318 struct oneshot * got = __atomic_exchange_n( &this.ptr, 3p, __ATOMIC_SEQ_CST);319 320 // If the future isn't already fulfilled, let the server delete it321 if( got == 0p ) return false;322 323 // got == 2p: the future is ready but the context hasn't fully been consumed324 // spin until it is safe to move on325 if( got == 2p ) {326 while( this.ptr != 1p ) Pause();327 got = 1p;328 }329 330 // The future is completed delete it now331 /* paranoid */ verify( this.ptr != 1p );332 free( &this );333 return true;334 }335 336 // from the server side, mark the future as fulfilled337 // delete it if needed338 bool fulfil( future_t & this ) {339 for() {340 struct oneshot * expected = this.ptr;341 // was this abandoned?342 #if defined(__GNUC__) && __GNUC__ >= 7343 #pragma GCC diagnostic push344 #pragma GCC diagnostic ignored "-Wfree-nonheap-object"345 #endif346 if( expected == 3p ) { free( &this ); return false; }347 #if defined(__GNUC__) && __GNUC__ >= 7348 #pragma GCC diagnostic pop349 #endif350 351 /* paranoid */ verify( expected != 1p ); // Future is already fulfilled, should not happen352 /* paranoid */ verify( expected != 2p ); // Future is bein fulfilled by someone else, this is even less supported then the previous case.353 354 // If there is a wait context, we need to consume it and mark it as consumed after355 // If there is no context then we can skip the in progress phase356 struct oneshot * want = expected == 0p ? 1p : 2p;357 if(__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {358 if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return false; }359 bool ret = post( *expected );360 __atomic_store_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);361 return ret;362 }363 }364 365 }366 367 // Wait for the future to be fulfilled368 bool wait( future_t & this ) {369 oneshot temp;370 if( !setup(this, temp) ) return false;371 372 // Wait context is setup, just wait on it373 bool ret = wait( temp );374 375 // Wait for the future to tru376 while( this.ptr == 2p ) Pause();377 // Make sure the state makes sense378 // Should be fulfilled, could be in progress but it's out of date if so379 // since if that is the case, the oneshot was fulfilled (unparking this thread)380 // and the oneshot should not be needed any more381 __attribute__((unused)) struct oneshot * was = this.ptr;382 /* paranoid */ verifyf( was == 1p, "Expected this.ptr to be 1p, was %p\n", was );383 384 // Mark the future as fulfilled, to be consistent385 // with potential calls to avail386 // this.ptr = 1p;387 return ret;388 }389 }390 391 136 //----------------------------------------------------------------------- 392 137 // Statics call at the end of each thread to register statistics -
libcfa/src/concurrency/kernel/startup.cfa
rc08c3cf r467c8b7 199 199 void ?{}(processor & this) with( this ) { 200 200 ( this.idle ){}; 201 ( this.terminated ){ };201 ( this.terminated ){ 0 }; 202 202 ( this.runner ){}; 203 203 init( this, "Main Processor", *mainCluster ); … … 528 528 void ?{}(processor & this, const char name[], cluster & _cltr) { 529 529 ( this.idle ){}; 530 ( this.terminated ){ };530 ( this.terminated ){ 0 }; 531 531 ( this.runner ){}; 532 532 … … 549 549 __wake_proc( &this ); 550 550 551 wait( terminated );551 P( terminated ); 552 552 /* paranoid */ verify( active_processor() != &this); 553 553 } -
libcfa/src/concurrency/locks.cfa
rc08c3cf r467c8b7 7 7 //----------------------------------------------------------------------------- 8 8 // info_thread 9 forall( L &| is_blocking_lock(L)) {9 forall(dtype L | is_blocking_lock(L)) { 10 10 struct info_thread { 11 11 // used to put info_thread on a dl queue (aka sequence) … … 195 195 //----------------------------------------------------------------------------- 196 196 // alarm node wrapper 197 forall( L &| is_blocking_lock(L)) {197 forall(dtype L | is_blocking_lock(L)) { 198 198 struct alarm_node_wrap { 199 199 alarm_node_t alarm_node; … … 239 239 //----------------------------------------------------------------------------- 240 240 // condition variable 241 forall( L &| is_blocking_lock(L)) {241 forall(dtype L | is_blocking_lock(L)) { 242 242 243 243 void ?{}( condition_variable(L) & this ){ … … 356 356 bool wait( condition_variable(L) & this, L & l, uintptr_t info, Time time ) with(this) { WAIT_TIME( info, &l , time ) } 357 357 } 358 359 //-----------------------------------------------------------------------------360 // Semaphore361 void ?{}( semaphore & this, int count = 1 ) {362 (this.lock){};363 this.count = count;364 (this.waiting){};365 }366 void ^?{}(semaphore & this) {}367 368 bool P(semaphore & this) with( this ){369 lock( lock __cfaabi_dbg_ctx2 );370 count -= 1;371 if ( count < 0 ) {372 // queue current task373 append( waiting, active_thread() );374 375 // atomically release spin lock and block376 unlock( lock );377 park();378 return true;379 }380 else {381 unlock( lock );382 return false;383 }384 }385 386 bool V(semaphore & this) with( this ) {387 $thread * thrd = 0p;388 lock( lock __cfaabi_dbg_ctx2 );389 count += 1;390 if ( count <= 0 ) {391 // remove task at head of waiting list392 thrd = pop_head( waiting );393 }394 395 unlock( lock );396 397 // make new owner398 unpark( thrd );399 400 return thrd != 0p;401 }402 403 bool V(semaphore & this, unsigned diff) with( this ) {404 $thread * thrd = 0p;405 lock( lock __cfaabi_dbg_ctx2 );406 int release = max(-count, (int)diff);407 count += diff;408 for(release) {409 unpark( pop_head( waiting ) );410 }411 412 unlock( lock );413 414 return thrd != 0p;415 } -
libcfa/src/concurrency/locks.hfa
rc08c3cf r467c8b7 13 13 //----------------------------------------------------------------------------- 14 14 // is_blocking_lock 15 trait is_blocking_lock( L &| sized(L)) {15 trait is_blocking_lock(dtype L | sized(L)) { 16 16 // For synchronization locks to use when acquiring 17 17 void on_notify( L &, struct $thread * ); … … 31 31 // the info thread is a wrapper around a thread used 32 32 // to store extra data for use in the condition variable 33 forall( L &| is_blocking_lock(L)) {33 forall(dtype L | is_blocking_lock(L)) { 34 34 struct info_thread; 35 35 … … 120 120 //----------------------------------------------------------------------------- 121 121 // Synchronization Locks 122 forall( L &| is_blocking_lock(L)) {122 forall(dtype L | is_blocking_lock(L)) { 123 123 struct condition_variable { 124 124 // Spin lock used for mutual exclusion … … 157 157 bool wait( condition_variable(L) & this, L & l, uintptr_t info, Time time ); 158 158 } 159 160 //-----------------------------------------------------------------------------161 // Semaphore162 struct semaphore {163 __spinlock_t lock;164 int count;165 __queue_t($thread) waiting;166 };167 168 void ?{}(semaphore & this, int count = 1);169 void ^?{}(semaphore & this);170 bool P (semaphore & this);171 bool V (semaphore & this);172 bool V (semaphore & this, unsigned count); -
libcfa/src/concurrency/monitor.cfa
rc08c3cf r467c8b7 50 50 static inline [$thread *, int] search_entry_queue( const __waitfor_mask_t &, $monitor * monitors [], __lock_size_t count ); 51 51 52 forall( T &| sized( T ))52 forall(dtype T | sized( T )) 53 53 static inline __lock_size_t insert_unique( T * array [], __lock_size_t & size, T * val ); 54 54 static inline __lock_size_t count_max ( const __waitfor_mask_t & mask ); … … 949 949 } 950 950 951 forall( T &| sized( T ))951 forall(dtype T | sized( T )) 952 952 static inline __lock_size_t insert_unique( T * array [], __lock_size_t & size, T * val ) { 953 953 if( !val ) return size; -
libcfa/src/concurrency/monitor.hfa
rc08c3cf r467c8b7 22 22 #include "stdlib.hfa" 23 23 24 trait is_monitor( T &) {24 trait is_monitor(dtype T) { 25 25 $monitor * get_monitor( T & ); 26 26 void ^?{}( T & mutex ); … … 59 59 void ^?{}( monitor_dtor_guard_t & this ); 60 60 61 static inline forall( T &| sized(T) | { void ^?{}( T & mutex ); } )61 static inline forall( dtype T | sized(T) | { void ^?{}( T & mutex ); } ) 62 62 void delete( T * th ) { 63 63 ^(*th){}; -
libcfa/src/concurrency/mutex.cfa
rc08c3cf r467c8b7 164 164 } 165 165 166 forall( L &| is_lock(L))166 forall(dtype L | is_lock(L)) 167 167 void wait(condition_variable & this, L & l) { 168 168 lock( this.lock __cfaabi_dbg_ctx2 ); … … 176 176 //----------------------------------------------------------------------------- 177 177 // Scopes 178 forall( L &| is_lock(L))178 forall(dtype L | is_lock(L)) 179 179 void lock_all ( L * locks[], size_t count) { 180 180 // Sort locks based on addresses … … 188 188 } 189 189 190 forall( L &| is_lock(L))190 forall(dtype L | is_lock(L)) 191 191 void unlock_all( L * locks[], size_t count) { 192 192 // Lock all -
libcfa/src/concurrency/mutex.hfa
rc08c3cf r467c8b7 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 trait is_lock(dtype L | sized(L)) { 73 73 void lock (L &); 74 74 void unlock(L &); … … 94 94 void wait(condition_variable & this) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 95 95 96 forall( L &| is_lock(L))96 forall(dtype L | is_lock(L)) 97 97 void wait(condition_variable & this, L & l) __attribute__((deprecated("use concurrency/locks.hfa instead"))); 98 98 99 99 //----------------------------------------------------------------------------- 100 100 // Scopes 101 forall( L &| is_lock(L)) {101 forall(dtype L | is_lock(L)) { 102 102 #if !defined( __TUPLE_ARRAYS_EXIST__ ) 103 103 void lock ( L * locks [], size_t count); -
libcfa/src/concurrency/preemption.cfa
rc08c3cf r467c8b7 616 616 } 617 617 618 // Prevent preemption since we are about to start terminating things619 void __kernel_abort_lock(void) {620 signal_block( SIGUSR1 );621 }622 623 618 // Raii ctor/dtor for the preemption_scope 624 619 // Used by thread to control when they want to receive preemption signals -
libcfa/src/concurrency/thread.cfa
rc08c3cf r467c8b7 62 62 } 63 63 64 FORALL_DATA_INSTANCE(ThreadCancelled, ( thread_t &), (thread_t))64 FORALL_DATA_INSTANCE(ThreadCancelled, (dtype thread_t), (thread_t)) 65 65 66 forall( T &)66 forall(dtype T) 67 67 void copy(ThreadCancelled(T) * dst, ThreadCancelled(T) * src) { 68 68 dst->virtual_table = src->virtual_table; … … 71 71 } 72 72 73 forall( T &)73 forall(dtype T) 74 74 const char * msg(ThreadCancelled(T) *) { 75 75 return "ThreadCancelled"; 76 76 } 77 77 78 forall( T &)78 forall(dtype T) 79 79 static void default_thread_cancel_handler(ThreadCancelled(T) & ) { 80 80 abort( "Unhandled thread cancellation.\n" ); 81 81 } 82 82 83 forall( T &| is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T)))83 forall(dtype T | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))) 84 84 void ?{}( thread_dtor_guard_t & this, 85 85 T & thrd, void(*cancelHandler)(ThreadCancelled(T) &)) { … … 124 124 //----------------------------------------------------------------------------- 125 125 // Starting and stopping threads 126 forall( T &| is_thread(T) )126 forall( dtype T | is_thread(T) ) 127 127 void __thrd_start( T & this, void (*main_p)(T &) ) { 128 128 $thread * this_thrd = get_thread(this); … … 140 140 //----------------------------------------------------------------------------- 141 141 // Support for threads that don't ues the thread keyword 142 forall( T &| sized(T) | is_thread(T) | { void ?{}(T&); } )142 forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } ) 143 143 void ?{}( scoped(T)& this ) with( this ) { 144 144 handle{}; … … 146 146 } 147 147 148 forall( T &, P...| sized(T) | is_thread(T) | { void ?{}(T&, P); } )148 forall( dtype T, ttype P | sized(T) | is_thread(T) | { void ?{}(T&, P); } ) 149 149 void ?{}( scoped(T)& this, P params ) with( this ) { 150 150 handle{ params }; … … 152 152 } 153 153 154 forall( T &| sized(T) | is_thread(T) )154 forall( dtype T | sized(T) | is_thread(T) ) 155 155 void ^?{}( scoped(T)& this ) with( this ) { 156 156 ^handle{}; … … 158 158 159 159 //----------------------------------------------------------------------------- 160 forall( T &| is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T)))160 forall(dtype T | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))) 161 161 T & join( T & this ) { 162 162 thread_dtor_guard_t guard = { this, defaultResumptionHandler }; -
libcfa/src/concurrency/thread.hfa
rc08c3cf r467c8b7 26 26 //----------------------------------------------------------------------------- 27 27 // thread trait 28 trait is_thread( T &) {28 trait is_thread(dtype T) { 29 29 void ^?{}(T& mutex this); 30 30 void main(T& this); … … 32 32 }; 33 33 34 FORALL_DATA_EXCEPTION(ThreadCancelled, ( thread_t &), (thread_t)) (34 FORALL_DATA_EXCEPTION(ThreadCancelled, (dtype thread_t), (thread_t)) ( 35 35 thread_t * the_thread; 36 36 exception_t * the_exception; 37 37 ); 38 38 39 forall( T &)39 forall(dtype T) 40 40 void copy(ThreadCancelled(T) * dst, ThreadCancelled(T) * src); 41 41 42 forall( T &)42 forall(dtype T) 43 43 const char * msg(ThreadCancelled(T) *); 44 44 … … 47 47 48 48 // Inline getters for threads/coroutines/monitors 49 forall( T &| is_thread(T) )49 forall( dtype T | is_thread(T) ) 50 50 static inline $coroutine* get_coroutine(T & this) __attribute__((const)) { return &get_thread(this)->self_cor; } 51 51 52 forall( T &| is_thread(T) )52 forall( dtype T | is_thread(T) ) 53 53 static inline $monitor * get_monitor (T & this) __attribute__((const)) { return &get_thread(this)->self_mon; } 54 54 … … 60 60 extern struct cluster * mainCluster; 61 61 62 forall( T &| is_thread(T) )62 forall( dtype T | is_thread(T) ) 63 63 void __thrd_start( T & this, void (*)(T &) ); 64 64 … … 82 82 }; 83 83 84 forall( T &| is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T)) )84 forall( dtype T | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T)) ) 85 85 void ?{}( thread_dtor_guard_t & this, T & thrd, void(*)(ThreadCancelled(T) &) ); 86 86 void ^?{}( thread_dtor_guard_t & this ); … … 89 89 // thread runner 90 90 // Structure that actually start and stop threads 91 forall( T &| sized(T) | is_thread(T) )91 forall( dtype T | sized(T) | is_thread(T) ) 92 92 struct scoped { 93 93 T handle; 94 94 }; 95 95 96 forall( T &| sized(T) | is_thread(T) | { void ?{}(T&); } )96 forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } ) 97 97 void ?{}( scoped(T)& this ); 98 98 99 forall( T &, P...| sized(T) | is_thread(T) | { void ?{}(T&, P); } )99 forall( dtype T, ttype P | sized(T) | is_thread(T) | { void ?{}(T&, P); } ) 100 100 void ?{}( scoped(T)& this, P params ); 101 101 102 forall( T &| sized(T) | is_thread(T) )102 forall( dtype T | sized(T) | is_thread(T) ) 103 103 void ^?{}( scoped(T)& this ); 104 104 … … 115 115 void unpark( $thread * this ); 116 116 117 forall( T &| is_thread(T) )117 forall( dtype T | is_thread(T) ) 118 118 static inline void unpark( T & this ) { if(!&this) return; unpark( get_thread( this ) );} 119 119 … … 128 128 //---------- 129 129 // join 130 forall( T &| is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T)) )130 forall( dtype T | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T)) ) 131 131 T & join( T & this ); 132 132 -
libcfa/src/containers/list.hfa
rc08c3cf r467c8b7 66 66 #define __DLISTED_MGD_JUSTIMPL(STRUCT) 67 67 68 forall( tE &) {68 forall( dtype tE ) { 69 69 struct $mgd_link { 70 70 tE *elem; … … 83 83 (this.is_terminator){ 1 }; 84 84 } 85 forall ( tInit | { void ?{}( $mgd_link(tE) &, tInit); } )85 forall ( otype tInit | { void ?{}( $mgd_link(tE) &, tInit); } ) 86 86 static inline void ?=?( $mgd_link(tE) &this, tInit i ) { 87 87 ^?{}( this ); … … 115 115 __DLISTED_MGD_COMMON(STRUCT, STRUCT, $links) 116 116 117 trait $dlistable( Tnode &, Telem &) {117 trait $dlistable(dtype Tnode, dtype Telem) { 118 118 $mgd_link(Telem) & $prev_link(Tnode &); 119 119 $mgd_link(Telem) & $next_link(Tnode &); … … 125 125 }; 126 126 127 forall ( Tnode &, Telem &| $dlistable(Tnode, Telem)) {127 forall (dtype Tnode, dtype Telem | $dlistable(Tnode, Telem)) { 128 128 129 129 // implemented as a sentinel item in an underlying cicrular list -
libcfa/src/containers/maybe.cfa
rc08c3cf r467c8b7 18 18 19 19 20 forall( T)20 forall(otype T) 21 21 void ?{}(maybe(T) & this) { 22 22 this.has_value = false; 23 23 } 24 24 25 forall( T)25 forall(otype T) 26 26 void ?{}(maybe(T) & this, T value) { 27 27 this.has_value = true; … … 29 29 } 30 30 31 forall( T)31 forall(otype T) 32 32 void ?{}(maybe(T) & this, maybe(T) other) { 33 33 this.has_value = other.has_value; … … 37 37 } 38 38 39 forall( T)39 forall(otype T) 40 40 maybe(T) ?=?(maybe(T) & this, maybe(T) that) { 41 41 if (this.has_value && that.has_value) { … … 51 51 } 52 52 53 forall( T)53 forall(otype T) 54 54 void ^?{}(maybe(T) & this) { 55 55 if (this.has_value) { … … 58 58 } 59 59 60 forall( T)60 forall(otype T) 61 61 bool ?!=?(maybe(T) this, zero_t) { 62 62 return this.has_value; 63 63 } 64 64 65 forall( T)65 forall(otype T) 66 66 maybe(T) maybe_value(T value) { 67 67 return (maybe(T)){value}; 68 68 } 69 69 70 forall( T)70 forall(otype T) 71 71 maybe(T) maybe_none() { 72 72 return (maybe(T)){}; 73 73 } 74 74 75 forall( T)75 forall(otype T) 76 76 bool has_value(maybe(T) * this) { 77 77 return this->has_value; 78 78 } 79 79 80 forall( T)80 forall(otype T) 81 81 T get(maybe(T) * this) { 82 82 assertf(this->has_value, "attempt to get from maybe without value"); … … 84 84 } 85 85 86 forall( T)86 forall(otype T) 87 87 void set(maybe(T) * this, T value) { 88 88 if (this->has_value) { … … 94 94 } 95 95 96 forall( T)96 forall(otype T) 97 97 void set_none(maybe(T) * this) { 98 98 if (this->has_value) { -
libcfa/src/containers/maybe.hfa
rc08c3cf r467c8b7 19 19 20 20 // DO NOT USE DIRECTLY! 21 forall( T)21 forall(otype T) 22 22 struct maybe { 23 23 bool has_value; … … 26 26 27 27 28 forall( T)28 forall(otype T) 29 29 void ?{}(maybe(T) & this); 30 30 31 forall( T)31 forall(otype T) 32 32 void ?{}(maybe(T) & this, T value); 33 33 34 forall( T)34 forall(otype T) 35 35 void ?{}(maybe(T) & this, maybe(T) other); 36 36 37 forall( T)37 forall(otype T) 38 38 void ^?{}(maybe(T) & this); 39 39 40 forall( T)40 forall(otype T) 41 41 maybe(T) ?=?(maybe(T) & this, maybe(T) other); 42 42 43 forall( T)43 forall(otype T) 44 44 bool ?!=?(maybe(T) this, zero_t); 45 45 46 46 /* Waiting for bug#11 to be fixed. 47 forall( T)47 forall(otype T) 48 48 maybe(T) maybe_value(T value); 49 49 50 forall( T)50 forall(otype T) 51 51 maybe(T) maybe_none(); 52 52 */ 53 53 54 forall( T)54 forall(otype T) 55 55 bool has_value(maybe(T) * this); 56 56 57 forall( T)57 forall(otype T) 58 58 T get(maybe(T) * this); 59 59 60 forall( T)60 forall(otype T) 61 61 void set(maybe(T) * this, T value); 62 62 63 forall( T)63 forall(otype T) 64 64 void set_none(maybe(T) * this); 65 65 -
libcfa/src/containers/pair.cfa
rc08c3cf r467c8b7 13 13 #include <containers/pair.hfa> 14 14 15 forall( R,S15 forall(otype R, otype S 16 16 | { int ?==?(R, R); int ?<?(R, R); int ?<?(S, S); }) 17 17 int ?<?(pair(R, S) p, pair(R, S) q) { … … 19 19 } 20 20 21 forall( R,S21 forall(otype R, otype S 22 22 | { int ?==?(R, R); int ?<?(R, R); int ?<=?(S, S); }) 23 23 int ?<=?(pair(R, S) p, pair(R, S) q) { … … 25 25 } 26 26 27 forall( R,S | { int ?==?(R, R); int ?==?(S, S); })27 forall(otype R, otype S | { int ?==?(R, R); int ?==?(S, S); }) 28 28 int ?==?(pair(R, S) p, pair(R, S) q) { 29 29 return p.first == q.first && p.second == q.second; 30 30 } 31 31 32 forall( R,S | { int ?!=?(R, R); int ?!=?(S, S); })32 forall(otype R, otype S | { int ?!=?(R, R); int ?!=?(S, S); }) 33 33 int ?!=?(pair(R, S) p, pair(R, S) q) { 34 34 return p.first != q.first || p.second != q.second; 35 35 } 36 36 37 forall( R,S37 forall(otype R, otype S 38 38 | { int ?==?(R, R); int ?>?(R, R); int ?>?(S, S); }) 39 39 int ?>?(pair(R, S) p, pair(R, S) q) { … … 41 41 } 42 42 43 forall( R,S43 forall(otype R, otype S 44 44 | { int ?==?(R, R); int ?>?(R, R); int ?>=?(S, S); }) 45 45 int ?>=?(pair(R, S) p, pair(R, S) q) { -
libcfa/src/containers/pair.hfa
rc08c3cf r467c8b7 16 16 #pragma once 17 17 18 forall( R,S) struct pair {18 forall(otype R, otype S) struct pair { 19 19 R first; 20 20 S second; 21 21 }; 22 22 23 forall( R,S23 forall(otype R, otype S 24 24 | { int ?==?(R, R); int ?<?(R, R); int ?<?(S, S); }) 25 25 int ?<?(pair(R, S) p, pair(R, S) q); 26 26 27 forall( R,S27 forall(otype R, otype S 28 28 | { int ?==?(R, R); int ?<?(R, R); int ?<=?(S, S); }) 29 29 int ?<=?(pair(R, S) p, pair(R, S) q); 30 30 31 forall( R,S | { int ?==?(R, R); int ?==?(S, S); })31 forall(otype R, otype S | { int ?==?(R, R); int ?==?(S, S); }) 32 32 int ?==?(pair(R, S) p, pair(R, S) q); 33 33 34 forall( R,S | { int ?!=?(R, R); int ?!=?(S, S); })34 forall(otype R, otype S | { int ?!=?(R, R); int ?!=?(S, S); }) 35 35 int ?!=?(pair(R, S) p, pair(R, S) q); 36 36 37 forall( R,S37 forall(otype R, otype S 38 38 | { int ?==?(R, R); int ?>?(R, R); int ?>?(S, S); }) 39 39 int ?>?(pair(R, S) p, pair(R, S) q); 40 40 41 forall( R,S41 forall(otype R, otype S 42 42 | { int ?==?(R, R); int ?>?(R, R); int ?>=?(S, S); }) 43 43 int ?>=?(pair(R, S) p, pair(R, S) q); -
libcfa/src/containers/result.cfa
rc08c3cf r467c8b7 18 18 19 19 20 forall( T,E)20 forall(otype T, otype E) 21 21 void ?{}(result(T, E) & this) { 22 22 this.has_value = false; … … 24 24 } 25 25 26 forall( T,E)26 forall(otype T, otype E) 27 27 void ?{}(result(T, E) & this, one_t, T value) { 28 28 this.has_value = true; … … 30 30 } 31 31 32 forall( T,E)32 forall(otype T, otype E) 33 33 void ?{}(result(T, E) & this, zero_t, E error) { 34 34 this.has_value = false; … … 36 36 } 37 37 38 forall( T,E)38 forall(otype T, otype E) 39 39 void ?{}(result(T, E) & this, result(T, E) other) { 40 40 this.has_value = other.has_value; … … 46 46 } 47 47 48 forall( T,E)48 forall(otype T, otype E) 49 49 result(T, E) ?=?(result(T, E) & this, result(T, E) that) { 50 50 if (this.has_value && that.has_value) { … … 63 63 } 64 64 65 forall( T,E)65 forall(otype T, otype E) 66 66 void ^?{}(result(T, E) & this) { 67 67 if (this.has_value) { … … 72 72 } 73 73 74 forall( T,E)74 forall(otype T, otype E) 75 75 bool ?!=?(result(T, E) this, zero_t) { 76 76 return this.has_value; 77 77 } 78 78 79 forall( T,E)79 forall(otype T, otype E) 80 80 result(T, E) result_value(T value) { 81 81 return (result(T, E)){1, value}; 82 82 } 83 83 84 forall( T,E)84 forall(otype T, otype E) 85 85 result(T, E) result_error(E error) { 86 86 return (result(T, E)){0, error}; 87 87 } 88 88 89 forall( T,E)89 forall(otype T, otype E) 90 90 bool has_value(result(T, E) * this) { 91 91 return this->has_value; 92 92 } 93 93 94 forall( T,E)94 forall(otype T, otype E) 95 95 T get(result(T, E) * this) { 96 96 assertf(this->has_value, "attempt to get from result without value"); … … 98 98 } 99 99 100 forall( T,E)100 forall(otype T, otype E) 101 101 E get_error(result(T, E) * this) { 102 102 assertf(!this->has_value, "attempt to get from result without error"); … … 104 104 } 105 105 106 forall( T,E)106 forall(otype T, otype E) 107 107 void set(result(T, E) * this, T value) { 108 108 if (this->has_value) { … … 115 115 } 116 116 117 forall( T,E)117 forall(otype T, otype E) 118 118 void set_error(result(T, E) * this, E error) { 119 119 if (this->has_value) { -
libcfa/src/containers/result.hfa
rc08c3cf r467c8b7 19 19 20 20 // DO NOT USE DIRECTLY! 21 forall( T,E)21 forall(otype T, otype E) 22 22 union inner_result{ 23 23 T value; … … 25 25 }; 26 26 27 forall( T,E)27 forall(otype T, otype E) 28 28 struct result { 29 29 bool has_value; … … 32 32 33 33 34 forall( T,E)34 forall(otype T, otype E) 35 35 void ?{}(result(T, E) & this); 36 36 37 forall( T,E)37 forall(otype T, otype E) 38 38 void ?{}(result(T, E) & this, one_t, T value); 39 39 40 forall( T,E)40 forall(otype T, otype E) 41 41 void ?{}(result(T, E) & this, zero_t, E error); 42 42 43 forall( T,E)43 forall(otype T, otype E) 44 44 void ?{}(result(T, E) & this, result(T, E) other); 45 45 46 forall( T,E)46 forall(otype T, otype E) 47 47 void ^?{}(result(T, E) & this); 48 48 49 forall( T,E)49 forall(otype T, otype E) 50 50 result(T, E) ?=?(result(T, E) & this, result(T, E) other); 51 51 52 forall( T,E)52 forall(otype T, otype E) 53 53 bool ?!=?(result(T, E) this, zero_t); 54 54 55 55 /* Wating for bug#11 to be fixed. 56 forall( T,E)56 forall(otype T, otype E) 57 57 result(T, E) result_value(T value); 58 58 59 forall( T,E)59 forall(otype T, otype E) 60 60 result(T, E) result_error(E error); 61 61 */ 62 62 63 forall( T,E)63 forall(otype T, otype E) 64 64 bool has_value(result(T, E) * this); 65 65 66 forall( T,E)66 forall(otype T, otype E) 67 67 T get(result(T, E) * this); 68 68 69 forall( T,E)69 forall(otype T, otype E) 70 70 E get_error(result(T, E) * this); 71 71 72 forall( T,E)72 forall(otype T, otype E) 73 73 void set(result(T, E) * this, T value); 74 74 75 forall( T,E)75 forall(otype T, otype E) 76 76 void set_error(result(T, E) * this, E error); 77 77 -
libcfa/src/containers/stackLockFree.hfa
rc08c3cf r467c8b7 17 17 #include <stdint.h> 18 18 19 forall( T &)19 forall( dtype T ) 20 20 union Link { 21 21 struct { // 32/64-bit x 2 … … 31 31 }; // Link 32 32 33 forall( T | sized(T) | { Link(T) * ?`next( T * ); } ) {33 forall( otype T | sized(T) | { Link(T) * ?`next( T * ); } ) { 34 34 struct StackLF { 35 35 Link(T) stack; -
libcfa/src/containers/vector.cfa
rc08c3cf r467c8b7 18 18 #include <stdlib.hfa> 19 19 20 forall( T,allocator_t | allocator_c(T, allocator_t))20 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 21 21 void copy_internal(vector(T, allocator_t)* this, vector(T, allocator_t)* other); 22 22 23 23 //------------------------------------------------------------------------------ 24 24 //Initialization 25 forall( T,allocator_t | allocator_c(T, allocator_t))25 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 26 26 void ?{}(vector(T, allocator_t)& this) 27 27 { … … 30 30 } 31 31 32 forall( T,allocator_t | allocator_c(T, allocator_t))32 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 33 33 void ?{}(vector(T, allocator_t)& this, vector(T, allocator_t) rhs) 34 34 { … … 37 37 } 38 38 39 // forall( T,allocator_t | allocator_c(T, allocator_t))39 // forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 40 40 // vector(T, allocator_t) ?=?(vector(T, allocator_t)* this, vector(T, allocator_t) rhs) 41 41 // { … … 45 45 // } 46 46 47 forall( T,allocator_t | allocator_c(T, allocator_t))47 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 48 48 void ^?{}(vector(T, allocator_t)& this) 49 49 { … … 54 54 //------------------------------------------------------------------------------ 55 55 //Modifiers 56 forall( T,allocator_t | allocator_c(T, allocator_t))56 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 57 57 void push_back(vector(T, allocator_t)* this, T value) 58 58 { … … 62 62 } 63 63 64 forall( T,allocator_t | allocator_c(T, allocator_t))64 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 65 65 void pop_back(vector(T, allocator_t)* this) 66 66 { … … 69 69 } 70 70 71 forall( T,allocator_t | allocator_c(T, allocator_t))71 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 72 72 void clear(vector(T, allocator_t)* this) 73 73 { … … 82 82 //Internal Helpers 83 83 84 forall( T,allocator_t | allocator_c(T, allocator_t))84 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 85 85 void copy_internal(vector(T, allocator_t)* this, vector(T, allocator_t)* other) 86 86 { … … 93 93 //------------------------------------------------------------------------------ 94 94 //Allocator 95 forall( T)95 forall(otype T) 96 96 void ?{}(heap_allocator(T)& this) 97 97 { … … 100 100 } 101 101 102 forall( T)102 forall(otype T) 103 103 void ?{}(heap_allocator(T)& this, heap_allocator(T) rhs) 104 104 { … … 107 107 } 108 108 109 forall( T)109 forall(otype T) 110 110 heap_allocator(T) ?=?(heap_allocator(T)& this, heap_allocator(T) rhs) 111 111 { … … 115 115 } 116 116 117 forall( T)117 forall(otype T) 118 118 void ^?{}(heap_allocator(T)& this) 119 119 { … … 121 121 } 122 122 123 forall( T)123 forall(otype T) 124 124 inline void realloc_storage(heap_allocator(T)* this, size_t size) 125 125 { -
libcfa/src/containers/vector.hfa
rc08c3cf r467c8b7 20 20 //------------------------------------------------------------------------------ 21 21 //Allocator 22 forall( T)22 forall(otype T) 23 23 struct heap_allocator 24 24 { … … 27 27 }; 28 28 29 forall( T)29 forall(otype T) 30 30 void ?{}(heap_allocator(T)& this); 31 31 32 forall( T)32 forall(otype T) 33 33 void ?{}(heap_allocator(T)& this, heap_allocator(T) rhs); 34 34 35 forall( T)35 forall(otype T) 36 36 heap_allocator(T) ?=?(heap_allocator(T)& this, heap_allocator(T) rhs); 37 37 38 forall( T)38 forall(otype T) 39 39 void ^?{}(heap_allocator(T)& this); 40 40 41 forall( T)41 forall(otype T) 42 42 void realloc_storage(heap_allocator(T)* this, size_t size); 43 43 44 forall( T)44 forall(otype T) 45 45 static inline T* data(heap_allocator(T)* this) 46 46 { … … 50 50 //------------------------------------------------------------------------------ 51 51 //Declaration 52 trait allocator_c( T,allocator_t)52 trait allocator_c(otype T, otype allocator_t) 53 53 { 54 54 void realloc_storage(allocator_t*, size_t); … … 56 56 }; 57 57 58 forall( T,allocator_t = heap_allocator(T) | allocator_c(T, allocator_t))58 forall(otype T, otype allocator_t = heap_allocator(T) | allocator_c(T, allocator_t)) 59 59 struct vector; 60 60 61 61 //------------------------------------------------------------------------------ 62 62 //Initialization 63 forall( T,allocator_t | allocator_c(T, allocator_t))63 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 64 64 void ?{}(vector(T, allocator_t)& this); 65 65 66 forall( T,allocator_t | allocator_c(T, allocator_t))66 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 67 67 void ?{}(vector(T, allocator_t)& this, vector(T, allocator_t) rhs); 68 68 69 forall( T,allocator_t | allocator_c(T, allocator_t))69 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 70 70 vector(T, allocator_t) ?=?(vector(T, allocator_t)& this, vector(T, allocator_t) rhs); 71 71 72 forall( T,allocator_t | allocator_c(T, allocator_t))72 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 73 73 void ^?{}(vector(T, allocator_t)& this); 74 74 75 forall( T,allocator_t = heap_allocator(T) | allocator_c(T, allocator_t))75 forall(otype T, otype allocator_t = heap_allocator(T) | allocator_c(T, allocator_t)) 76 76 struct vector 77 77 { … … 82 82 //------------------------------------------------------------------------------ 83 83 //Capacity 84 forall( T,allocator_t | allocator_c(T, allocator_t))84 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 85 85 static inline bool empty(vector(T, allocator_t)* this) 86 86 { … … 88 88 } 89 89 90 forall( T,allocator_t | allocator_c(T, allocator_t))90 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 91 91 static inline size_t size(vector(T, allocator_t)* this) 92 92 { … … 94 94 } 95 95 96 forall( T,allocator_t | allocator_c(T, allocator_t))96 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 97 97 static inline void reserve(vector(T, allocator_t)* this, size_t size) 98 98 { … … 102 102 //------------------------------------------------------------------------------ 103 103 //Element access 104 forall( T,allocator_t | allocator_c(T, allocator_t))104 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 105 105 static inline T at(vector(T, allocator_t)* this, size_t index) 106 106 { … … 108 108 } 109 109 110 forall( T,allocator_t | allocator_c(T, allocator_t))110 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 111 111 static inline T ?[?](vector(T, allocator_t)* this, size_t index) 112 112 { … … 114 114 } 115 115 116 forall( T,allocator_t | allocator_c(T, allocator_t))116 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 117 117 static inline T front(vector(T, allocator_t)* this) 118 118 { … … 120 120 } 121 121 122 forall( T,allocator_t | allocator_c(T, allocator_t))122 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 123 123 static inline T back(vector(T, allocator_t)* this) 124 124 { … … 128 128 //------------------------------------------------------------------------------ 129 129 //Modifiers 130 forall( T,allocator_t | allocator_c(T, allocator_t))130 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 131 131 void push_back(vector(T, allocator_t)* this, T value); 132 132 133 forall( T,allocator_t | allocator_c(T, allocator_t))133 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 134 134 void pop_back(vector(T, allocator_t)* this); 135 135 136 forall( T,allocator_t | allocator_c(T, allocator_t))136 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 137 137 void clear(vector(T, allocator_t)* this); 138 138 139 139 //------------------------------------------------------------------------------ 140 140 //Iterators 141 forall( T,allocator_t | allocator_c(T, allocator_t))141 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 142 142 static inline T* begin(vector(T, allocator_t)* this) 143 143 { … … 145 145 } 146 146 147 // forall( T,allocator_t | allocator_c(T, allocator_t))147 // forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 148 148 // static inline const T* cbegin(const vector(T, allocator_t)* this) 149 149 // { … … 151 151 // } 152 152 153 forall( T,allocator_t | allocator_c(T, allocator_t))153 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 154 154 static inline T* end(vector(T, allocator_t)* this) 155 155 { … … 157 157 } 158 158 159 // forall( T,allocator_t | allocator_c(T, allocator_t))159 // forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 160 160 // static inline const T* cend(const vector(T, allocator_t)* this) 161 161 // { -
libcfa/src/exception.h
rc08c3cf r467c8b7 101 101 // implemented in the .c file either so they all have to be inline. 102 102 103 trait is_exception( exceptT &, virtualT &) {103 trait is_exception(dtype exceptT, dtype virtualT) { 104 104 /* The first field must be a pointer to a virtual table. 105 105 * That virtual table must be a decendent of the base exception virtual table. … … 109 109 }; 110 110 111 trait is_termination_exception( exceptT &, virtualT &| is_exception(exceptT, virtualT)) {111 trait is_termination_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 112 112 void defaultTerminationHandler(exceptT &); 113 113 }; 114 114 115 trait is_resumption_exception( exceptT &, virtualT &| is_exception(exceptT, virtualT)) {115 trait is_resumption_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 116 116 void defaultResumptionHandler(exceptT &); 117 117 }; 118 118 119 forall( exceptT &, virtualT &| is_termination_exception(exceptT, virtualT))119 forall(dtype exceptT, dtype virtualT | is_termination_exception(exceptT, virtualT)) 120 120 static inline void $throw(exceptT & except) { 121 121 __cfaehm_throw_terminate( … … 125 125 } 126 126 127 forall( exceptT &, virtualT &| is_resumption_exception(exceptT, virtualT))127 forall(dtype exceptT, dtype virtualT | is_resumption_exception(exceptT, virtualT)) 128 128 static inline void $throwResume(exceptT & except) { 129 129 __cfaehm_throw_resume( … … 133 133 } 134 134 135 forall( exceptT &, virtualT &| is_exception(exceptT, virtualT))135 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 136 136 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) { 137 137 __cfaehm_cancel_stack( (exception_t *)&except ); 138 138 } 139 139 140 forall( exceptT &, virtualT &| is_exception(exceptT, virtualT))140 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 141 141 static inline void defaultTerminationHandler(exceptT & except) { 142 142 return cancel_stack( except ); 143 143 } 144 144 145 forall( exceptT &, virtualT &| is_exception(exceptT, virtualT))145 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 146 146 static inline void defaultResumptionHandler(exceptT & except) { 147 147 throw except; -
libcfa/src/executor.cfa
rc08c3cf r467c8b7 7 7 #include <containers/list.hfa> 8 8 9 forall( T &| $dlistable(T, T) ) {9 forall( dtype T | $dlistable(T, T) ) { 10 10 monitor Buffer { // unbounded buffer 11 11 dlist( T, T ) queue; // unbounded list of work requests -
libcfa/src/gmp.hfa
rc08c3cf r467c8b7 255 255 256 256 // I/O 257 forall( istype &| istream( istype ) )257 forall( dtype istype | istream( istype ) ) 258 258 istype & ?|?( istype & is, Int & mp ) { 259 259 gmp_scanf( "%Zd", &mp ); … … 261 261 } // ?|? 262 262 263 forall( ostype &| ostream( ostype ) ) {263 forall( dtype ostype | ostream( ostype ) ) { 264 264 ostype & ?|?( ostype & os, Int mp ) { 265 265 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); -
libcfa/src/interpose.cfa
rc08c3cf r467c8b7 125 125 126 126 // Failure handler 127 // internal errors 128 __cfaabi_sigaction( SIGSEGV, sigHandler_segv, SA_SIGINFO | SA_ONSTACK ); // Invalid memory reference (default: Core) 129 __cfaabi_sigaction( SIGBUS , sigHandler_segv, SA_SIGINFO | SA_ONSTACK ); // Bus error, bad memory access (default: Core) 130 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO | SA_ONSTACK ); // Illegal Instruction (default: Core) 131 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO | SA_ONSTACK ); // Floating-point exception (default: Core) 132 133 // handlers to outside errors 134 // reset in-case they insist and send it over and over 135 __cfaabi_sigaction( SIGTERM, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // Termination signal (default: Term) 136 __cfaabi_sigaction( SIGINT , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // Interrupt from keyboard (default: Term) 137 __cfaabi_sigaction( SIGHUP , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // Hangup detected on controlling terminal or death of controlling process (default: Term) 138 __cfaabi_sigaction( SIGQUIT, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // Quit from keyboard (default: Core) 139 __cfaabi_sigaction( SIGABRT, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // Abort signal from abort(3) (default: Core) 127 __cfaabi_sigaction( SIGSEGV, sigHandler_segv, SA_SIGINFO | SA_ONSTACK ); 128 __cfaabi_sigaction( SIGBUS , sigHandler_segv, SA_SIGINFO | SA_ONSTACK ); 129 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO | SA_ONSTACK ); 130 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO | SA_ONSTACK ); 131 __cfaabi_sigaction( SIGTERM, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // one shot handler, return to default 132 __cfaabi_sigaction( SIGINT , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); 133 __cfaabi_sigaction( SIGABRT, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); 134 __cfaabi_sigaction( SIGHUP , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // terminal hangup 140 135 } 141 136 } … … 168 163 } 169 164 170 // See concurrency/kernel.cfa and concurrency/preemption.cfa for strong definition used in multi-processor mode. 171 void __kernel_abort_lock( void) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}172 void __kernel_abort_msg( char buffer[], int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {} 173 int __kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; }165 void * kernel_abort( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 0p; } 166 void kernel_abort_msg( void * data, char buffer[], int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {} 167 // See concurrency/kernel.cfa for strong definition used in multi-processor mode. 168 int kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; } 174 169 175 170 enum { abort_text_size = 1024 }; … … 178 173 static void __cfaabi_backtrace( int start ) { 179 174 enum { Frames = 50, }; // maximum number of stack frames 180 int last = __kernel_abort_lastframe(); // skip last N stack frames175 int last = kernel_abort_lastframe(); // skip last N stack frames 181 176 182 177 void * array[Frames]; … … 225 220 } 226 221 227 static volatile bool __abort_first= 0;222 static volatile int __abort_stage = 0; 228 223 229 224 // Cannot forward va_list. 230 225 void __abort( bool signalAbort, const char fmt[], va_list args ) { 231 // Multiple threads can come here from multiple paths 232 // To make sure this is safe any concurrent/subsequent call to abort is redirected to libc-abort 233 bool first = ! __atomic_test_and_set( &__abort_first, __ATOMIC_SEQ_CST); 234 235 // Prevent preemption from kicking-in and messing with the abort 236 __kernel_abort_lock(); 237 238 // first to abort ? 239 if ( !first ) { 240 // We aren't the first to abort just let C handle it 241 signal( SIGABRT, SIG_DFL ); // restore default in case we came here through the function. 226 int stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST ); 227 228 // First stage: stop the cforall kernel and print 229 if(stage == 1) { 230 // increment stage 231 stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST ); 232 233 // must be done here to lock down kernel 234 void * kernel_data = kernel_abort(); 235 int len; 236 237 signal( SIGABRT, SIG_DFL ); // prevent final "real" abort from recursing to handler 238 239 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid) 240 __cfaabi_bits_write( STDERR_FILENO, abort_text, len ); 241 242 assert( fmt ); 243 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 244 __cfaabi_bits_write( STDERR_FILENO, abort_text, len ); 245 246 // add optional newline if missing at the end of the format text 247 if ( fmt[strlen( fmt ) - 1] != '\n' ) { 248 __cfaabi_bits_write( STDERR_FILENO, "\n", 1 ); 249 } // if 250 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 251 } 252 253 // Second stage: print the backtrace 254 if(stage == 2) { 255 // increment stage 256 stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST ); 257 258 // print stack trace in handler 259 __cfaabi_backtrace( signalAbort ? 4 : 2 ); 260 } 261 262 do { 263 // Finally call abort 242 264 __cabi_libc.abort(); 243 } 244 245 int len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid) 246 __cfaabi_bits_write( STDERR_FILENO, abort_text, len ); 247 248 // print the cause of the error 249 assert( fmt ); 250 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 251 __cfaabi_bits_write( STDERR_FILENO, abort_text, len ); 252 253 // add optional newline if missing at the end of the format text 254 if ( fmt[strlen( fmt ) - 1] != '\n' ) { 255 __cfaabi_bits_write( STDERR_FILENO, "\n", 1 ); 256 } // if 257 258 // Give the kernel the chance to add some data in here 259 __kernel_abort_msg( abort_text, abort_text_size ); 260 261 // print stack trace in handler 262 __cfaabi_backtrace( signalAbort ? 4 : 2 ); 263 264 // Finally call abort 265 __cabi_libc.abort(); 266 265 266 // Loop so that we never return 267 } while(true); 267 268 } 268 269 … … 281 282 // CONTROL NEVER REACHES HERE! 282 283 va_end( args ); 284 } 285 286 extern "C" { 287 void __cfaabi_real_abort(void) { 288 __cabi_libc.abort(); 289 } 283 290 } 284 291 -
libcfa/src/iostream.cfa
rc08c3cf r467c8b7 36 36 37 37 38 forall( ostype &| ostream( ostype ) ) {38 forall( dtype ostype | ostream( ostype ) ) { 39 39 ostype & ?|?( ostype & os, bool b ) { 40 40 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); … … 407 407 408 408 // tuples 409 forall( ostype &, T, Params...| writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) {409 forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) { 410 410 ostype & ?|?( ostype & os, T arg, Params rest ) { 411 411 (ostype &)(os | arg); // print first argument … … 426 426 427 427 // writes the range [begin, end) to the given stream 428 forall( ostype &, elt_type | writeable( elt_type, ostype ),iterator_type | iterator( iterator_type, elt_type ) ) {428 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) { 429 429 void write( iterator_type begin, iterator_type end, ostype & os ) { 430 430 void print( elt_type i ) { os | i; } … … 447 447 // Default prefix for non-decimal prints is 0b, 0, 0x. 448 448 #define IntegralFMTImpl( T, IFMTNP, IFMTP ) \ 449 forall( ostype &| ostream( ostype ) ) { \449 forall( dtype ostype | ostream( ostype ) ) { \ 450 450 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \ 451 451 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \ … … 540 540 // Default prefix for non-decimal prints is 0b, 0, 0x. 541 541 #define IntegralFMTImpl128( T, SIGNED, CODE, IFMTNP, IFMTP ) \ 542 forall( ostype &| ostream( ostype ) ) \542 forall( dtype ostype | ostream( ostype ) ) \ 543 543 static void base10_128( ostype & os, _Ostream_Manip(T) f ) { \ 544 544 if ( f.val > UINT64_MAX ) { \ … … 557 557 } /* if */ \ 558 558 } /* base10_128 */ \ 559 forall( ostype &| ostream( ostype ) ) { \559 forall( dtype ostype | ostream( ostype ) ) { \ 560 560 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \ 561 561 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \ … … 659 659 #if defined( __SIZEOF_INT128__ ) 660 660 // Default prefix for non-decimal prints is 0b, 0, 0x. 661 forall( ostype &| ostream( ostype ) )661 forall( dtype ostype | ostream( ostype ) ) 662 662 static inline void base_128( ostype & os, unsigned int128 val, unsigned int128 power, _Ostream_Manip(uint64_t) & f, unsigned int maxdig, unsigned int bits, unsigned int cnt = 0 ) { 663 663 int wd = 1; // f.wd is never 0 because 0 implies left-pad … … 724 724 725 725 #define IntegralFMTImpl128( T ) \ 726 forall( ostype &| ostream( ostype ) ) { \726 forall( dtype ostype | ostream( ostype ) ) { \ 727 727 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \ 728 728 _Ostream_Manip(uint64_t) fmt; \ … … 772 772 773 773 #define FloatingPointFMTImpl( T, DFMTNP, DFMTP ) \ 774 forall( ostype &| ostream( ostype ) ) { \774 forall( dtype ostype | ostream( ostype ) ) { \ 775 775 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \ 776 776 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \ … … 806 806 // *********************************** character *********************************** 807 807 808 forall( ostype &| ostream( ostype ) ) {808 forall( dtype ostype | ostream( ostype ) ) { 809 809 ostype & ?|?( ostype & os, _Ostream_Manip(char) f ) { 810 810 if ( f.base != 'c' ) { // bespoke binary/octal/hex format … … 839 839 // *********************************** C string *********************************** 840 840 841 forall( ostype &| ostream( ostype ) ) {841 forall( dtype ostype | ostream( ostype ) ) { 842 842 ostype & ?|?( ostype & os, _Ostream_Manip(const char *) f ) { 843 843 if ( ! f.val ) return os; // null pointer ? … … 887 887 888 888 889 forall( istype &| istream( istype ) ) {889 forall( dtype istype | istream( istype ) ) { 890 890 istype & ?|?( istype & is, bool & b ) { 891 891 char val[6]; … … 1053 1053 // *********************************** manipulators *********************************** 1054 1054 1055 forall( istype &| istream( istype ) )1055 forall( dtype istype | istream( istype ) ) 1056 1056 istype & ?|?( istype & is, _Istream_Cstr f ) { 1057 1057 // skip xxx … … 1088 1088 } // ?|? 1089 1089 1090 forall( istype &| istream( istype ) )1090 forall( dtype istype | istream( istype ) ) 1091 1091 istype & ?|?( istype & is, _Istream_Char f ) { 1092 1092 fmt( is, "%*c" ); // argument variable unused … … 1095 1095 1096 1096 #define InputFMTImpl( T, CODE ) \ 1097 forall( istype &| istream( istype ) ) \1097 forall( dtype istype | istream( istype ) ) \ 1098 1098 istype & ?|?( istype & is, _Istream_Manip(T) f ) { \ 1099 1099 enum { size = 16 }; \ … … 1124 1124 InputFMTImpl( long double, "Lf" ) 1125 1125 1126 forall( istype &| istream( istype ) )1126 forall( dtype istype | istream( istype ) ) 1127 1127 istype & ?|?( istype & is, _Istream_Manip(float _Complex) fc ) { 1128 1128 float re, im; … … 1135 1135 } // ?|? 1136 1136 1137 forall( istype &| istream( istype ) )1137 forall( dtype istype | istream( istype ) ) 1138 1138 istype & ?|?( istype & is, _Istream_Manip(double _Complex) dc ) { 1139 1139 double re, im; … … 1146 1146 } // ?|? 1147 1147 1148 forall( istype &| istream( istype ) )1148 forall( dtype istype | istream( istype ) ) 1149 1149 istype & ?|?( istype & is, _Istream_Manip(long double _Complex) ldc ) { 1150 1150 long double re, im; -
libcfa/src/iostream.hfa
rc08c3cf r467c8b7 22 22 23 23 24 trait ostream( ostype &) {24 trait ostream( dtype ostype ) { 25 25 // private 26 26 bool $sepPrt( ostype & ); // get separator state (on/off) … … 57 57 }; // ostream 58 58 59 // trait writeable( T ) {60 // forall( ostype &| ostream( ostype ) ) ostype & ?|?( ostype &, T );59 // trait writeable( otype T ) { 60 // forall( dtype ostype | ostream( ostype ) ) ostype & ?|?( ostype &, T ); 61 61 // }; // writeable 62 62 63 trait writeable( T, ostype &| ostream( ostype ) ) {63 trait writeable( otype T, dtype ostype | ostream( ostype ) ) { 64 64 ostype & ?|?( ostype &, T ); 65 65 }; // writeable … … 67 67 // implement writable for intrinsic types 68 68 69 forall( ostype &| ostream( ostype ) ) {69 forall( dtype ostype | ostream( ostype ) ) { 70 70 ostype & ?|?( ostype &, bool ); 71 71 void ?|?( ostype &, bool ); … … 142 142 143 143 // tuples 144 forall( ostype &, T, Params...| writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) {144 forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype & ?|?( ostype &, Params ); } ) { 145 145 ostype & ?|?( ostype & os, T arg, Params rest ); 146 146 void ?|?( ostype & os, T arg, Params rest ); … … 148 148 149 149 // writes the range [begin, end) to the given stream 150 forall( ostype &, elt_type | writeable( elt_type, ostype ),iterator_type | iterator( iterator_type, elt_type ) ) {150 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) ) { 151 151 void write( iterator_type begin, iterator_type end, ostype & os ); 152 152 void write_reverse( iterator_type begin, iterator_type end, ostype & os ); … … 155 155 // *********************************** manipulators *********************************** 156 156 157 forall( T )157 forall( otype T ) 158 158 struct _Ostream_Manip { 159 159 T val; // polymorphic base-type … … 195 195 _Ostream_Manip(T) & sign( _Ostream_Manip(T) & fmt ) { fmt.flags.sign = true; return fmt; } \ 196 196 } /* distribution */ \ 197 forall( ostype &| ostream( ostype ) ) { \197 forall( dtype ostype | ostream( ostype ) ) { \ 198 198 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \ 199 199 void ?|?( ostype & os, _Ostream_Manip(T) f ); \ … … 236 236 _Ostream_Manip(T) & nodp( _Ostream_Manip(T) & fmt ) { fmt.flags.nobsdp = true; return fmt; } \ 237 237 } /* distribution */ \ 238 forall( ostype &| ostream( ostype ) ) { \238 forall( dtype ostype | ostream( ostype ) ) { \ 239 239 ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \ 240 240 void ?|?( ostype & os, _Ostream_Manip(T) f ); \ … … 256 256 _Ostream_Manip(char) & nobase( _Ostream_Manip(char) & fmt ) { fmt.flags.nobsdp = true; return fmt; } 257 257 } // distribution 258 forall( ostype &| ostream( ostype ) ) {258 forall( dtype ostype | ostream( ostype ) ) { 259 259 ostype & ?|?( ostype & os, _Ostream_Manip(char) f ); 260 260 void ?|?( ostype & os, _Ostream_Manip(char) f ); … … 274 274 _Ostream_Manip(const char *) & nobase( _Ostream_Manip(const char *) & fmt ) { fmt.flags.nobsdp = true; return fmt; } 275 275 } // distribution 276 forall( ostype &| ostream( ostype ) ) {276 forall( dtype ostype | ostream( ostype ) ) { 277 277 ostype & ?|?( ostype & os, _Ostream_Manip(const char *) f ); 278 278 void ?|?( ostype & os, _Ostream_Manip(const char *) f ); … … 283 283 284 284 285 trait istream( istype &) {285 trait istream( dtype istype ) { 286 286 void nlOn( istype & ); // read newline 287 287 void nlOff( istype & ); // scan newline … … 296 296 }; // istream 297 297 298 trait readable( T ) {299 forall( istype &| istream( istype ) ) istype & ?|?( istype &, T );298 trait readable( otype T ) { 299 forall( dtype istype | istream( istype ) ) istype & ?|?( istype &, T ); 300 300 }; // readable 301 301 302 forall( istype &| istream( istype ) ) {302 forall( dtype istype | istream( istype ) ) { 303 303 istype & ?|?( istype &, bool & ); 304 304 … … 365 365 _Istream_Cstr & wdi( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; } 366 366 } // distribution 367 forall( istype &| istream( istype ) ) istype & ?|?( istype & is, _Istream_Cstr f );367 forall( dtype istype | istream( istype ) ) istype & ?|?( istype & is, _Istream_Cstr f ); 368 368 369 369 struct _Istream_Char { … … 375 375 _Istream_Char & ignore( _Istream_Char & fmt ) { fmt.ignore = true; return fmt; } 376 376 } // distribution 377 forall( istype &| istream( istype ) ) istype & ?|?( istype & is, _Istream_Char f );378 379 forall( T &| sized( T ) )377 forall( dtype istype | istream( istype ) ) istype & ?|?( istype & is, _Istream_Char f ); 378 379 forall( dtype T | sized( T ) ) 380 380 struct _Istream_Manip { 381 381 T & val; // polymorphic base-type … … 391 391 _Istream_Manip(T) & wdi( unsigned int w, _Istream_Manip(T) & fmt ) { fmt.wd = w; return fmt; } \ 392 392 } /* distribution */ \ 393 forall( istype &| istream( istype ) ) { \393 forall( dtype istype | istream( istype ) ) { \ 394 394 istype & ?|?( istype & is, _Istream_Manip(T) f ); \ 395 395 } // ?|? … … 420 420 #include <time_t.hfa> // Duration (constructors) / Time (constructors) 421 421 422 forall( ostype &| ostream( ostype ) ) {422 forall( dtype ostype | ostream( ostype ) ) { 423 423 ostype & ?|?( ostype & os, Duration dur ); 424 424 void ?|?( ostype & os, Duration dur ); -
libcfa/src/iterator.cfa
rc08c3cf r467c8b7 16 16 #include "iterator.hfa" 17 17 18 forall( iterator_type,elt_type | iterator( iterator_type, elt_type ) )18 forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) ) 19 19 void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) { 20 20 for ( iterator_type i = begin; i != end; ++i ) { … … 23 23 } // for_each 24 24 25 forall( iterator_type,elt_type | iterator( iterator_type, elt_type ) )25 forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) ) 26 26 void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) { 27 27 for ( iterator_type i = end; i != begin; ) { -
libcfa/src/iterator.hfa
rc08c3cf r467c8b7 17 17 18 18 // An iterator can be used to traverse a data structure. 19 trait iterator( iterator_type,elt_type ) {19 trait iterator( otype iterator_type, otype elt_type ) { 20 20 // point to the next element 21 21 // iterator_type ?++( iterator_type & ); … … 31 31 }; 32 32 33 trait iterator_for( iterator_type, collection_type,elt_type | iterator( iterator_type, elt_type ) ) {33 trait iterator_for( otype iterator_type, otype collection_type, otype elt_type | iterator( iterator_type, elt_type ) ) { 34 34 // [ iterator_type begin, iterator_type end ] get_iterators( collection_type ); 35 35 iterator_type begin( collection_type ); … … 37 37 }; 38 38 39 forall( iterator_type,elt_type | iterator( iterator_type, elt_type ) )39 forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) ) 40 40 void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) ); 41 41 42 forall( iterator_type,elt_type | iterator( iterator_type, elt_type ) )42 forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) ) 43 43 void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) ); 44 44 -
libcfa/src/math.hfa
rc08c3cf r467c8b7 286 286 unsigned long long int floor( unsigned long long int n, unsigned long long int align ) { return n / align * align; } 287 287 288 // forall( T | { T ?/?( T, T ); T ?*?( T, T ); } )288 // forall( otype T | { T ?/?( T, T ); T ?*?( T, T ); } ) 289 289 // T floor( T n, T align ) { return n / align * align; } 290 290 … … 300 300 unsigned long long int ceiling_div( unsigned long long int n, unsigned long long int align ) { return (n + (align - 1)) / align; } 301 301 302 // forall( T | { T ?+?( T, T ); T ?-?( T, T ); T ?%?( T, T ); } )302 // forall( otype T | { T ?+?( T, T ); T ?-?( T, T ); T ?%?( T, T ); } ) 303 303 // T ceiling_div( T n, T align ) { verify( is_pow2( align ) );return (n + (align - 1)) / align; } 304 304 … … 315 315 unsigned long long int ceiling( unsigned long long int n, unsigned long long int align ) { return floor( n + (n % align != 0 ? align - 1 : 0), align ); } 316 316 317 // forall( T | { void ?{}( T &, one_t ); T ?+?( T, T ); T ?-?( T, T ); T ?/?( T, T ); } )317 // forall( otype T | { void ?{}( T &, one_t ); T ?+?( T, T ); T ?-?( T, T ); T ?/?( T, T ); } ) 318 318 // T ceiling( T n, T align ) { return return floor( n + (n % align != 0 ? align - 1 : 0), align ); *} 319 319 … … 414 414 415 415 static inline { 416 forall( T | { void ?{}( T &, one_t ); T ?+?( T, T ); T ?-?( T, T );T ?*?( T, T ); } )416 forall( otype T | { void ?{}( T &, one_t ); T ?+?( T, T ); T ?-?( T, T );T ?*?( T, T ); } ) 417 417 T lerp( T x, T y, T a ) { return x * ((T){1} - a) + y * a; } 418 418 419 forall( T | { void ?{}( T &, zero_t ); void ?{}( T &, one_t ); int ?<?( T, T ); } )419 forall( otype T | { void ?{}( T &, zero_t ); void ?{}( T &, one_t ); int ?<?( T, T ); } ) 420 420 T step( T edge, T x ) { return x < edge ? (T){0} : (T){1}; } 421 421 422 forall( T | { void ?{}( T &, int ); T clamp( T, T, T ); T ?-?( T, T ); T ?*?( T, T ); T ?/?( T, T ); } )422 forall( otype T | { void ?{}( T &, int ); T clamp( T, T, T ); T ?-?( T, T ); T ?*?( T, T ); T ?/?( T, T ); } ) 423 423 T smoothstep( T edge0, T edge1, T x ) { T t = clamp( (x - edge0) / (edge1 - edge0), (T){0}, (T){1} ); return t * t * ((T){3} - (T){2} * t); } 424 424 } // distribution -
libcfa/src/memory.cfa
rc08c3cf r467c8b7 18 18 19 19 // Internal data object. 20 forall( T & | sized(T), Args...| { void ?{}(T &, Args); })20 forall(dtype T | sized(T), ttype Args | { void ?{}(T &, Args); }) 21 21 void ?{}(counter_data(T) & this, Args args) { 22 22 (this.counter){1}; … … 24 24 } 25 25 26 forall( T &| sized(T) | { void ^?{}(T &); })26 forall(dtype T | sized(T) | { void ^?{}(T &); }) 27 27 void ^?{}(counter_data(T) & this) { 28 28 assert(0 == this.counter); … … 31 31 32 32 // This is one of many pointers keeping this alive. 33 forall( T &| sized(T))33 forall(dtype T | sized(T)) 34 34 void ?{}(counter_ptr(T) & this) { 35 35 this.data = 0p; 36 36 } 37 37 38 forall( T &| sized(T))38 forall(dtype T | sized(T)) 39 39 void ?{}(counter_ptr(T) & this, zero_t) { 40 40 this.data = 0p; 41 41 } 42 42 43 forall( T &| sized(T) | { void ^?{}(T &); })43 forall(dtype T | sized(T) | { void ^?{}(T &); }) 44 44 static void internal_decrement(counter_ptr(T) & this) { 45 45 if (this.data && 0 == --this.data->counter) { … … 48 48 } 49 49 50 forall( T &| sized(T))50 forall(dtype T | sized(T)) 51 51 static void internal_copy(counter_ptr(T) & this, counter_ptr(T) & that) { 52 52 this.data = that.data; … … 56 56 } 57 57 58 forall( T &| sized(T) | { void ^?{}(T &); })58 forall(dtype T | sized(T) | { void ^?{}(T &); }) 59 59 void ?{}(counter_ptr(T) & this, counter_ptr(T) that) { 60 60 // `that` is a copy but it should have neither a constructor … … 64 64 } 65 65 66 forall( T & | sized(T), Args...| { void ?{}(T&, Args); })66 forall(dtype T | sized(T), ttype Args | { void ?{}(T&, Args); }) 67 67 void ?{}(counter_ptr(T) & this, Args args) { 68 68 this.data = (counter_data(T)*)new(args); 69 69 } 70 70 71 forall( T &| sized(T) | { void ^?{}(T &); })71 forall(dtype T | sized(T) | { void ^?{}(T &); }) 72 72 void ^?{}(counter_ptr(T) & this) { 73 73 internal_decrement(this); 74 74 } 75 75 76 forall( T &| sized(T))76 forall(dtype T | sized(T)) 77 77 T & *?(counter_ptr(T) & this) { 78 78 return *((this.data) ? &this.data->object : 0p); 79 79 } 80 80 81 forall( T &| sized(T) | { void ^?{}(T &); })81 forall(dtype T | sized(T) | { void ^?{}(T &); }) 82 82 void ?=?(counter_ptr(T) & this, counter_ptr(T) that) { 83 83 if (this.data != that.data) { … … 87 87 } 88 88 89 forall( T &| sized(T) | { void ^?{}(T &); })89 forall(dtype T | sized(T) | { void ^?{}(T &); }) 90 90 void ?=?(counter_ptr(T) & this, zero_t) { 91 91 internal_decrement(this); … … 93 93 } 94 94 95 forall( T &| sized(T))95 forall(dtype T | sized(T)) 96 96 int ?==?(counter_ptr(T) const & this, counter_ptr(T) const & that) { 97 97 return this.data == that.data; 98 98 } 99 99 100 forall( T &| sized(T))100 forall(dtype T | sized(T)) 101 101 int ?!=?(counter_ptr(T) const & this, counter_ptr(T) const & that) { 102 102 return !?==?(this, that); 103 103 } 104 104 105 forall( T &| sized(T))105 forall(dtype T | sized(T)) 106 106 int ?==?(counter_ptr(T) const & this, zero_t) { 107 107 return this.data == 0; 108 108 } 109 109 110 forall( T &| sized(T))110 forall(dtype T | sized(T)) 111 111 int ?!=?(counter_ptr(T) const & this, zero_t) { 112 112 return !?==?(this, (zero_t)0); … … 114 114 115 115 // This is the only pointer that keeps this alive. 116 forall( T &)116 forall(dtype T) 117 117 void ?{}(unique_ptr(T) & this) { 118 118 this.data = 0p; 119 119 } 120 120 121 forall( T &)121 forall(dtype T) 122 122 void ?{}(unique_ptr(T) & this, zero_t) { 123 123 this.data = 0p; 124 124 } 125 125 126 forall( T & | sized(T), Args...| { void ?{}(T &, Args); })126 forall(dtype T | sized(T), ttype Args | { void ?{}(T &, Args); }) 127 127 void ?{}(unique_ptr(T) & this, Args args) { 128 128 this.data = (T *)new(args); 129 129 } 130 130 131 forall( T &| { void ^?{}(T &); })131 forall(dtype T | { void ^?{}(T &); }) 132 132 void ^?{}(unique_ptr(T) & this) { 133 133 delete(this.data); 134 134 } 135 135 136 forall( T &)136 forall(dtype T) 137 137 T & *?(unique_ptr(T) & this) { 138 138 return *this.data; 139 139 } 140 140 141 forall( T &| { void ^?{}(T &); })141 forall(dtype T | { void ^?{}(T &); }) 142 142 void ?=?(unique_ptr(T) & this, zero_t) { 143 143 delete(this.data); … … 145 145 } 146 146 147 forall( T &| { void ^?{}(T &); })147 forall(dtype T | { void ^?{}(T &); }) 148 148 void move(unique_ptr(T) & this, unique_ptr(T) & that) { 149 149 delete(this.data); … … 152 152 } 153 153 154 forall( T &)154 forall(dtype T) 155 155 int ?==?(unique_ptr(T) const & this, unique_ptr(T) const & that) { 156 156 return this.data == that.data; 157 157 } 158 158 159 forall( T &)159 forall(dtype T) 160 160 int ?!=?(unique_ptr(T) const & this, unique_ptr(T) const & that) { 161 161 return !?==?(this, that); 162 162 } 163 163 164 forall( T &)164 forall(dtype T) 165 165 int ?==?(unique_ptr(T) const & this, zero_t) { 166 166 return this.data == 0; 167 167 } 168 168 169 forall( T &)169 forall(dtype T) 170 170 int ?!=?(unique_ptr(T) const & this, zero_t) { 171 171 return !?==?(this, (zero_t)0); -
libcfa/src/memory.hfa
rc08c3cf r467c8b7 17 17 18 18 // Internal data object. 19 forall( T &| sized(T)) {19 forall(dtype T | sized(T)) { 20 20 struct counter_data { 21 21 unsigned int counter; … … 23 23 }; 24 24 25 forall( Args...| { void ?{}(T &, Args); })25 forall(ttype Args | { void ?{}(T &, Args); }) 26 26 void ?{}(counter_data(T) & this, Args args); 27 27 … … 31 31 32 32 // This is one of many pointers keeping this alive. 33 forall( T &| sized(T)) {33 forall(dtype T | sized(T)) { 34 34 struct counter_ptr { 35 35 counter_data(T) * data; … … 40 40 forall( | { void ^?{}(T &); }) 41 41 void ?{}(counter_ptr(T) & this, counter_ptr(T) that); 42 forall( Args...| { void ?{}(T&, Args); })42 forall(ttype Args | { void ?{}(T&, Args); }) 43 43 void ?{}(counter_ptr(T) & this, Args args); 44 44 … … 60 60 61 61 // This is the only pointer that keeps this alive. 62 forall( T &) {62 forall(dtype T) { 63 63 struct unique_ptr { 64 64 T * data; … … 68 68 void ?{}(unique_ptr(T) & this, zero_t); 69 69 void ?{}(unique_ptr(T) & this, unique_ptr(T) that) = void; 70 forall( | sized(T), Args...| { void ?{}(T &, Args); })70 forall( | sized(T), ttype Args | { void ?{}(T &, Args); }) 71 71 void ?{}(unique_ptr(T) & this, Args args); 72 72 -
libcfa/src/parseargs.hfa
rc08c3cf r467c8b7 14 14 static inline void ?{}( cfa_option & this ) {} 15 15 16 forall( T &| { bool parse(const char *, T & ); })16 forall(dtype T | { bool parse(const char *, T & ); }) 17 17 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable ) { 18 18 this.val = 0; … … 24 24 } 25 25 26 forall( T &)26 forall(dtype T) 27 27 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable, bool (*parse)(const char *, T & )) { 28 28 this.val = 0; -
libcfa/src/rational.cfa
rc08c3cf r467c8b7 18 18 #include "stdlib.hfa" 19 19 20 forall( RationalImpl | arithmetic( RationalImpl ) ) {20 forall( otype RationalImpl | arithmetic( RationalImpl ) ) { 21 21 // helper routines 22 22 … … 159 159 // I/O 160 160 161 forall( istype &| istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )161 forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } ) 162 162 istype & ?|?( istype & is, Rational(RationalImpl) & r ) { 163 163 is | r.numerator | r.denominator; … … 168 168 } // ?|? 169 169 170 forall( ostype &| ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) {170 forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) { 171 171 ostype & ?|?( ostype & os, Rational(RationalImpl) r ) { 172 172 return os | r.numerator | '/' | r.denominator; … … 179 179 } // distribution 180 180 181 forall( RationalImpl | arithmetic( RationalImpl ) | { RationalImpl ?\?( RationalImpl, unsigned long ); } )181 forall( otype RationalImpl | arithmetic( RationalImpl ) | { RationalImpl ?\?( RationalImpl, unsigned long ); } ) 182 182 Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y ) { 183 183 if ( y < 0 ) { … … 190 190 // conversion 191 191 192 forall( RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )192 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } ) 193 193 double widen( Rational(RationalImpl) r ) { 194 194 return convert( r.numerator ) / convert( r.denominator ); 195 195 } // widen 196 196 197 forall( RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double ); } )197 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double ); } ) 198 198 Rational(RationalImpl) narrow( double f, RationalImpl md ) { 199 199 // http://www.ics.uci.edu/~eppstein/numth/frap.c -
libcfa/src/rational.hfa
rc08c3cf r467c8b7 20 20 #include "iostream.hfa" 21 21 22 trait scalar( T ) {22 trait scalar( otype T ) { 23 23 }; 24 24 25 trait arithmetic( T | scalar( T ) ) {25 trait arithmetic( otype T | scalar( T ) ) { 26 26 int !?( T ); 27 27 int ?==?( T, T ); … … 46 46 // implementation 47 47 48 forall( RationalImpl | arithmetic( RationalImpl ) ) {48 forall( otype RationalImpl | arithmetic( RationalImpl ) ) { 49 49 struct Rational { 50 50 RationalImpl numerator, denominator; // invariant: denominator > 0 … … 89 89 90 90 // I/O 91 forall( istype &| istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )91 forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } ) 92 92 istype & ?|?( istype &, Rational(RationalImpl) & ); 93 93 94 forall( ostype &| ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) {94 forall( dtype ostype | ostream( ostype ) | { ostype & ?|?( ostype &, RationalImpl ); } ) { 95 95 ostype & ?|?( ostype &, Rational(RationalImpl) ); 96 96 void ?|?( ostype &, Rational(RationalImpl) ); … … 98 98 } // distribution 99 99 100 forall( RationalImpl | arithmetic( RationalImpl ) |{RationalImpl ?\?( RationalImpl, unsigned long );} )100 forall( otype RationalImpl | arithmetic( RationalImpl ) |{RationalImpl ?\?( RationalImpl, unsigned long );} ) 101 101 Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y ); 102 102 103 103 // conversion 104 forall( RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )104 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } ) 105 105 double widen( Rational(RationalImpl) r ); 106 forall( RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} )106 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} ) 107 107 Rational(RationalImpl) narrow( double f, RationalImpl md ); 108 108 -
libcfa/src/stdlib.cfa
rc08c3cf r467c8b7 28 28 // Cforall allocation/deallocation and constructor/destructor, array types 29 29 30 forall( T & | sized(T), TT...| { void ?{}( T &, TT ); } )30 forall( dtype T | sized(T), ttype TT | { void ?{}( T &, TT ); } ) 31 31 T * anew( size_t dim, TT p ) { 32 32 T * arr = alloc( dim ); … … 37 37 } // anew 38 38 39 forall( T &| sized(T) | { void ^?{}( T & ); } )39 forall( dtype T | sized(T) | { void ^?{}( T & ); } ) 40 40 void adelete( T arr[] ) { 41 41 if ( arr ) { // ignore null … … 48 48 } // adelete 49 49 50 forall( T & | sized(T) | { void ^?{}( T & ); }, TT...| { void adelete( TT ); } )50 forall( dtype T | sized(T) | { void ^?{}( T & ); }, ttype TT | { void adelete( TT ); } ) 51 51 void adelete( T arr[], TT rest ) { 52 52 if ( arr ) { // ignore null … … 97 97 //--------------------------------------- 98 98 99 forall( E | { int ?<?( E, E ); } ) {99 forall( otype E | { int ?<?( E, E ); } ) { 100 100 E * bsearch( E key, const E * vals, size_t dim ) { 101 101 int cmp( const void * t1, const void * t2 ) { … … 156 156 157 157 158 forall( K,E | { int ?<?( K, K ); K getKey( const E & ); } ) {158 forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } ) { 159 159 E * bsearch( K key, const E * vals, size_t dim ) { 160 160 int cmp( const void * t1, const void * t2 ) { -
libcfa/src/stdlib.hfa
rc08c3cf r467c8b7 48 48 else return (T *)alignment( _Alignof(T), dim, sizeof(T) ) 49 49 50 static inline forall( T &| sized(T) ) {50 static inline forall( dtype T | sized(T) ) { 51 51 // CFA safe equivalents, i.e., implicit size specification 52 52 … … 108 108 109 109 1. Replace the current forall-block that contains defintions of S_fill and S_realloc with following: 110 forall( T &| sized(T) ) {110 forall( dtype T | sized(T) ) { 111 111 union U_fill { char c; T * a; T t; }; 112 112 struct S_fill { char tag; U_fill(T) fill; }; … … 151 151 typedef struct S_resize { inline void *; } T_resize; 152 152 153 forall( T &) {153 forall( dtype T ) { 154 154 struct S_fill { char tag; char c; size_t size; T * at; char t[50]; }; 155 155 struct S_realloc { inline T *; }; … … 159 159 static inline T_resize ?`resize ( void * a ) { return (T_resize){a}; } 160 160 161 static inline forall( T &| sized(T) ) {161 static inline forall( dtype T | sized(T) ) { 162 162 S_fill(T) ?`fill ( T t ) { 163 163 S_fill(T) ret = { 't' }; … … 207 207 } // $alloc_internal 208 208 209 forall( TT...| { T * $alloc_internal( void *, T *, size_t, size_t, S_fill(T), TT ); } ) {209 forall( ttype TT | { T * $alloc_internal( void *, T *, size_t, size_t, S_fill(T), TT ); } ) { 210 210 211 211 T * $alloc_internal( void * , T * Realloc, size_t Align, size_t Dim, S_fill(T) Fill, T_resize Resize, TT rest) { … … 236 236 } // distribution T 237 237 238 static inline forall( T &| sized(T) ) {238 static inline forall( dtype T | sized(T) ) { 239 239 // CFA safe initialization/copy, i.e., implicit size specification, non-array types 240 240 T * memset( T * dest, char fill ) { … … 257 257 258 258 // CFA deallocation for multiple objects 259 static inline forall( T &) // FIX ME, problems with 0p in list259 static inline forall( dtype T ) // FIX ME, problems with 0p in list 260 260 void free( T * ptr ) { 261 261 free( (void *)ptr ); // C free 262 262 } // free 263 static inline forall( T &, TT...| { void free( TT ); } )263 static inline forall( dtype T, ttype TT | { void free( TT ); } ) 264 264 void free( T * ptr, TT rest ) { 265 265 free( ptr ); … … 268 268 269 269 // CFA allocation/deallocation and constructor/destructor, non-array types 270 static inline forall( T & | sized(T), TT...| { void ?{}( T &, TT ); } )270 static inline forall( dtype T | sized(T), ttype TT | { void ?{}( T &, TT ); } ) 271 271 T * new( TT p ) { 272 272 return &(*(T *)malloc()){ p }; // run constructor 273 273 } // new 274 274 275 static inline forall( T &| { void ^?{}( T & ); } )275 static inline forall( dtype T | { void ^?{}( T & ); } ) 276 276 void delete( T * ptr ) { 277 277 // special case for 0-sized object => always call destructor … … 281 281 free( ptr ); // always call free 282 282 } // delete 283 static inline forall( T &, TT...| { void ^?{}( T & ); void delete( TT ); } )283 static inline forall( dtype T, ttype TT | { void ^?{}( T & ); void delete( TT ); } ) 284 284 void delete( T * ptr, TT rest ) { 285 285 delete( ptr ); … … 288 288 289 289 // CFA allocation/deallocation and constructor/destructor, array types 290 forall( T & | sized(T), TT...| { void ?{}( T &, TT ); } ) T * anew( size_t dim, TT p );291 forall( T &| sized(T) | { void ^?{}( T & ); } ) void adelete( T arr[] );292 forall( T & | sized(T) | { void ^?{}( T & ); }, TT...| { void adelete( TT ); } ) void adelete( T arr[], TT rest );290 forall( dtype T | sized(T), ttype TT | { void ?{}( T &, TT ); } ) T * anew( size_t dim, TT p ); 291 forall( dtype T | sized(T) | { void ^?{}( T & ); } ) void adelete( T arr[] ); 292 forall( dtype T | sized(T) | { void ^?{}( T & ); }, ttype TT | { void adelete( TT ); } ) void adelete( T arr[], TT rest ); 293 293 294 294 //--------------------------------------- … … 330 330 //--------------------------------------- 331 331 332 forall( E | { int ?<?( E, E ); } ) {332 forall( otype E | { int ?<?( E, E ); } ) { 333 333 E * bsearch( E key, const E * vals, size_t dim ); 334 334 size_t bsearch( E key, const E * vals, size_t dim ); … … 339 339 } // distribution 340 340 341 forall( K,E | { int ?<?( K, K ); K getKey( const E & ); } ) {341 forall( otype K, otype E | { int ?<?( K, K ); K getKey( const E & ); } ) { 342 342 E * bsearch( K key, const E * vals, size_t dim ); 343 343 size_t bsearch( K key, const E * vals, size_t dim ); … … 348 348 } // distribution 349 349 350 forall( E | { int ?<?( E, E ); } ) {350 forall( otype E | { int ?<?( E, E ); } ) { 351 351 void qsort( E * vals, size_t dim ); 352 352 } // distribution -
libcfa/src/time.cfa
rc08c3cf r467c8b7 31 31 32 32 33 forall( ostype &| ostream( ostype ) ) {33 forall( dtype ostype | ostream( ostype ) ) { 34 34 ostype & ?|?( ostype & os, Duration dur ) with( dur ) { 35 35 (ostype &)(os | tn / TIMEGRAN); // print seconds … … 136 136 } // strftime 137 137 138 forall( ostype &| ostream( ostype ) ) {138 forall( dtype ostype | ostream( ostype ) ) { 139 139 ostype & ?|?( ostype & os, Time time ) with( time ) { 140 140 char buf[32]; // at least 26 -
libcfa/src/vec/vec.hfa
rc08c3cf r467c8b7 18 18 #include <math.hfa> 19 19 20 trait fromint( T) {20 trait fromint(otype T) { 21 21 void ?{}(T&, int); 22 22 }; 23 trait zeroinit( T) {23 trait zeroinit(otype T) { 24 24 void ?{}(T&, zero_t); 25 25 }; 26 trait zero_assign( T) {26 trait zero_assign(otype T) { 27 27 T ?=?(T&, zero_t); 28 28 }; 29 trait subtract( T) {29 trait subtract(otype T) { 30 30 T ?-?(T, T); 31 31 }; 32 trait negate( T) {32 trait negate(otype T) { 33 33 T -?(T); 34 34 }; 35 trait add( T) {35 trait add(otype T) { 36 36 T ?+?(T, T); 37 37 }; 38 trait multiply( T) {38 trait multiply(otype T) { 39 39 T ?*?(T, T); 40 40 }; 41 trait divide( T) {41 trait divide(otype T) { 42 42 T ?/?(T, T); 43 43 }; 44 trait lessthan( T) {44 trait lessthan(otype T) { 45 45 int ?<?(T, T); 46 46 }; 47 trait equality( T) {47 trait equality(otype T) { 48 48 int ?==?(T, T); 49 49 }; 50 trait sqrt( T) {50 trait sqrt(otype T) { 51 51 T sqrt(T); 52 52 }; … … 68 68 } 69 69 70 trait dottable( V,T) {70 trait dottable(otype V, otype T) { 71 71 T dot(V, V); 72 72 }; … … 74 74 static inline { 75 75 76 forall( T | sqrt(T),V | dottable(V, T))76 forall(otype T | sqrt(T), otype V | dottable(V, T)) 77 77 T length(V v) { 78 78 return sqrt(dot(v, v)); 79 79 } 80 80 81 forall( T,V | dottable(V, T))81 forall(otype T, otype V | dottable(V, T)) 82 82 T length_squared(V v) { 83 83 return dot(v, v); 84 84 } 85 85 86 forall( T,V | { T length(V); } | subtract(V))86 forall(otype T, otype V | { T length(V); } | subtract(V)) 87 87 T distance(V v1, V v2) { 88 88 return length(v1 - v2); 89 89 } 90 90 91 forall( T,V | { T length(V); V ?/?(V, T); })91 forall(otype T, otype V | { T length(V); V ?/?(V, T); }) 92 92 V normalize(V v) { 93 93 return v / length(v); … … 95 95 96 96 // Project vector u onto vector v 97 forall( T,V | dottable(V, T) | { V normalize(V); V ?*?(V, T); })97 forall(otype T, otype V | dottable(V, T) | { V normalize(V); V ?*?(V, T); }) 98 98 V project(V u, V v) { 99 99 V v_norm = normalize(v); … … 102 102 103 103 // Reflect incident vector v with respect to surface with normal n 104 forall( T | fromint(T),V | { V project(V, V); V ?*?(T, V); V ?-?(V,V); })104 forall(otype T | fromint(T), otype V | { V project(V, V); V ?*?(T, V); V ?-?(V,V); }) 105 105 V reflect(V v, V n) { 106 106 return v - (T){2} * project(v, n); … … 111 111 // entering material (i.e., from air to water, eta = 1/1.33) 112 112 // v and n must already be normalized 113 forall( T | fromint(T) | subtract(T) | multiply(T) | add(T) | lessthan(T) | sqrt(T),114 V | dottable(V, T) | { V ?*?(T, V); V ?-?(V,V); void ?{}(V&, zero_t); })113 forall(otype T | fromint(T) | subtract(T) | multiply(T) | add(T) | lessthan(T) | sqrt(T), 114 otype V | dottable(V, T) | { V ?*?(T, V); V ?-?(V,V); void ?{}(V&, zero_t); }) 115 115 V refract(V v, V n, T eta) { 116 116 T dotValue = dot(n, v); … … 128 128 // i is the incident vector 129 129 // ng is the geometric normal of the surface 130 forall( T | lessthan(T) | zeroinit(T),V | dottable(V, T) | negate(V))130 forall(otype T | lessthan(T) | zeroinit(T), otype V | dottable(V, T) | negate(V)) 131 131 V faceforward(V n, V i, V ng) { 132 132 return dot(ng, i) < (T){0} ? n : -n; -
libcfa/src/vec/vec2.hfa
rc08c3cf r467c8b7 19 19 #include "vec.hfa" 20 20 21 forall ( T) {21 forall (otype T) { 22 22 struct vec2 { 23 23 T x, y; … … 25 25 } 26 26 27 forall ( T) {27 forall (otype T) { 28 28 static inline { 29 29 … … 279 279 } 280 280 281 forall( ostype &,T | writeable(T, ostype)) {281 forall(dtype ostype, otype T | writeable(T, ostype)) { 282 282 ostype & ?|?(ostype & os, vec2(T) v) with (v) { 283 283 return os | '<' | x | ',' | y | '>'; -
libcfa/src/vec/vec3.hfa
rc08c3cf r467c8b7 19 19 #include "vec.hfa" 20 20 21 forall ( T) {21 forall (otype T) { 22 22 struct vec3 { 23 23 T x, y, z; … … 25 25 } 26 26 27 forall ( T) {27 forall (otype T) { 28 28 static inline { 29 29 … … 288 288 } 289 289 290 forall( ostype &,T | writeable(T, ostype)) {290 forall(dtype ostype, otype T | writeable(T, ostype)) { 291 291 ostype & ?|?(ostype & os, vec3(T) v) with (v) { 292 292 return os | '<' | x | ',' | y | ',' | z | '>'; -
libcfa/src/vec/vec4.hfa
rc08c3cf r467c8b7 19 19 #include "vec.hfa" 20 20 21 forall ( T) {21 forall (otype T) { 22 22 struct vec4 { 23 23 T x, y, z, w; … … 25 25 } 26 26 27 forall ( T) {27 forall (otype T) { 28 28 static inline { 29 29 … … 283 283 } 284 284 285 forall( ostype &,T | writeable(T, ostype)) {285 forall(dtype ostype, otype T | writeable(T, ostype)) { 286 286 ostype & ?|?(ostype & os, vec4(T) v) with (v) { 287 287 return os | '<' | x | ',' | y | ',' | z | ',' | w | '>'; -
src/Parser/parser.yy
rc08c3cf r467c8b7 2441 2441 type_parameter: // CFA 2442 2442 type_class identifier_or_type_name 2443 { typedefTable.addToScope( *$2, TYPEDEFname, "9" ); 2444 if ( $1 == TypeDecl::Otype ) { SemanticError( yylloc, "otype keyword is deprecated" ); } 2445 if ( $1 == TypeDecl::Dtype ) { SemanticError( yylloc, "dtype keyword is deprecated" ); } 2446 if ( $1 == TypeDecl::Ttype ) { SemanticError( yylloc, "ttype keyword is deprecated" ); } 2447 } 2443 { typedefTable.addToScope( *$2, TYPEDEFname, "9" ); } 2448 2444 type_initializer_opt assertion_list_opt 2449 2445 { $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); } -
tests/avltree/avl-private.cfa
rc08c3cf r467c8b7 11 11 // an AVL tree's height is easy to compute 12 12 // just follow path with the larger balance 13 forall( K | Comparable(K),V)13 forall(otype K | Comparable(K), otype V) 14 14 int height(tree(K, V) * t){ 15 15 int helper(tree(K, V) * t, int ht){ … … 27 27 } 28 28 29 forall( K | Comparable(K),V)29 forall(otype K | Comparable(K), otype V) 30 30 int calcBalance(tree(K, V) * t){ 31 31 int l = height(t->left); … … 36 36 37 37 // re-establish the link between parent and child 38 forall( K | Comparable(K),V)38 forall(otype K | Comparable(K), otype V) 39 39 void relinkToParent(tree(K, V) * t){ 40 40 tree(K, V) * parent = t->parent; // FIX ME!! … … 49 49 50 50 // rotate left from t 51 forall( K | Comparable(K),V)51 forall(otype K | Comparable(K), otype V) 52 52 tree(K, V) * rotateLeft(tree(K, V) * t){ 53 53 tree(K, V) * newRoot = t->right; … … 68 68 69 69 // rotate right from t 70 forall( K | Comparable(K),V)70 forall(otype K | Comparable(K), otype V) 71 71 tree(K, V) * rotateRight(tree(K, V) * t){ 72 72 tree(K, V) * newRoot = t->left; … … 87 87 88 88 // balances a node that has balance factor -2 or 2 89 forall( K | Comparable(K),V)89 forall(otype K | Comparable(K), otype V) 90 90 tree(K, V) * fix(tree(K, V) * t){ 91 91 // ensure that t's balance factor is one of … … 113 113 114 114 // attempt to fix the tree, if necessary 115 forall( K | Comparable(K),V)115 forall(otype K | Comparable(K), otype V) 116 116 tree(K, V) * tryFix(tree(K, V) * t){ 117 117 int b = calcBalance(t); … … 126 126 127 127 // sets parent field of c to be p 128 forall( K | Comparable(K),V)128 forall(otype K | Comparable(K), otype V) 129 129 void setParent(tree(K, V) * c, tree(K, V) * p){ 130 130 if (! empty(c)){ -
tests/avltree/avl-private.h
rc08c3cf r467c8b7 5 5 6 6 // attempt to fix the tree, if necessary 7 forall( K | Comparable(K),V)7 forall(otype K | Comparable(K), otype V) 8 8 tree(K, V) * tryFix(tree(K, V) * t); 9 9 10 10 // sets parent field of c to be p 11 forall( K | Comparable(K),V)11 forall(otype K | Comparable(K), otype V) 12 12 void setParent(tree(K, V) * c, tree(K, V) * p); 13 13 14 forall( K | Comparable(K),V)14 forall(otype K | Comparable(K), otype V) 15 15 int height(tree(K, V) * t); -
tests/avltree/avl.h
rc08c3cf r467c8b7 9 9 // #include <lib.h> 10 10 11 trait Comparable( T) {11 trait Comparable(otype T) { 12 12 int ?<?(T, T); 13 13 }; 14 14 15 forall( T | Comparable(T))15 forall(otype T | Comparable(T)) 16 16 int ?==?(T t1, T t2); 17 17 18 forall( T | Comparable(T))18 forall(otype T | Comparable(T)) 19 19 int ?>?(T t1, T t2); 20 20 … … 41 41 42 42 // temporary: need forward decl to get around typedef problem 43 forall( K | Comparable(K),V)43 forall(otype K | Comparable(K), otype V) 44 44 struct tree; 45 45 46 forall( K | Comparable(K),V)46 forall(otype K | Comparable(K), otype V) 47 47 struct tree { 48 48 K key; … … 54 54 }; 55 55 56 forall( K | Comparable(K),V)56 forall(otype K | Comparable(K), otype V) 57 57 void ?{}(tree(K, V) &t, K key, V value); 58 58 59 forall( K | Comparable(K),V)59 forall(otype K | Comparable(K), otype V) 60 60 void ^?{}(tree(K, V) & t); 61 61 62 forall( K | Comparable(K),V)62 forall(otype K | Comparable(K), otype V) 63 63 tree(K, V) * create(K key, V value); 64 64 65 forall( K | Comparable(K),V)65 forall(otype K | Comparable(K), otype V) 66 66 V * find(tree(K, V) * t, K key); 67 67 68 forall( K | Comparable(K),V)68 forall(otype K | Comparable(K), otype V) 69 69 int empty(tree(K, V) * t); 70 70 71 71 // returns the root of the tree 72 forall( K | Comparable(K),V)72 forall(otype K | Comparable(K), otype V) 73 73 int insert(tree(K, V) ** t, K key, V value); 74 74 75 forall( K | Comparable(K),V)75 forall(otype K | Comparable(K), otype V) 76 76 int remove(tree(K, V) ** t, K key); 77 77 78 forall( K | Comparable(K),V)78 forall(otype K | Comparable(K), otype V) 79 79 void copy(tree(K, V) * src, tree(K, V) ** ret); 80 80 81 forall( K | Comparable(K),V)81 forall(otype K | Comparable(K), otype V) 82 82 void for_each(tree(K, V) * t, void (*func)(V)); 83 83 -
tests/avltree/avl0.cfa
rc08c3cf r467c8b7 1 1 #include "avl.h" 2 2 3 forall( T | Comparable(T))3 forall(otype T | Comparable(T)) 4 4 int ?==?(T t1, T t2) { 5 5 return !(t1 < t2) && !(t2 < t1); 6 6 } 7 7 8 forall( T | Comparable(T))8 forall(otype T | Comparable(T)) 9 9 int ?>?(T t1, T t2) { 10 10 return t2 < t1; -
tests/avltree/avl1.cfa
rc08c3cf r467c8b7 3 3 #include <stdlib.hfa> 4 4 5 forall( K | Comparable(K),V)5 forall(otype K | Comparable(K), otype V) 6 6 void ?{}(tree(K, V) &t, K key, V value){ 7 7 (t.key) { key }; … … 13 13 } 14 14 15 forall( K| Comparable(K),V)15 forall(otype K| Comparable(K), otype V) 16 16 void ^?{}(tree(K, V) & t){ 17 17 delete(t.left); … … 21 21 } 22 22 23 forall( K | Comparable(K),V)23 forall(otype K | Comparable(K), otype V) 24 24 tree(K, V) * create(K key, V value) { 25 25 // infinite loop trying to resolve ... t = malloc(); -
tests/avltree/avl2.cfa
rc08c3cf r467c8b7 2 2 #include "avl-private.h" 3 3 4 forall( K | Comparable(K),V)4 forall(otype K | Comparable(K), otype V) 5 5 V * find(tree(K, V) * t, K key){ 6 6 if (empty(t)){ … … 18 18 } 19 19 20 forall( K | Comparable(K),V)20 forall(otype K | Comparable(K), otype V) 21 21 int empty(tree(K, V) * t){ 22 22 return t == NULL; … … 24 24 25 25 // returns the root of the tree 26 forall( K | Comparable(K),V)26 forall(otype K | Comparable(K), otype V) 27 27 int insert(tree(K, V) ** t, K key, V value) { 28 28 // handles a non-empty tree -
tests/avltree/avl3.cfa
rc08c3cf r467c8b7 4 4 5 5 // swaps the data within two tree nodes 6 forall( K | Comparable(K),V)6 forall(otype K | Comparable(K), otype V) 7 7 void node_swap(tree(K, V) * t, tree(K, V) * t2){ 8 8 swap( t->key, t2->key); … … 11 11 12 12 // go left as deep as possible from within the right subtree 13 forall( K | Comparable(K),V)13 forall(otype K | Comparable(K), otype V) 14 14 tree(K, V) * find_successor(tree(K, V) * t){ 15 15 tree(K, V) * find_successor_helper(tree(K, V) * t){ … … 25 25 26 26 // cleanup - don't want to deep delete, so set children to NULL first. 27 forall( K | Comparable(K),V)27 forall(otype K | Comparable(K), otype V) 28 28 void deleteSingleNode(tree(K, V) * t) { 29 29 t->left = NULL; … … 33 33 34 34 // does the actual remove operation once we've found the node in question 35 forall( K | Comparable(K),V)35 forall(otype K | Comparable(K), otype V) 36 36 tree(K, V) * remove_node(tree(K, V) * t){ 37 37 // is the node a leaf? … … 85 85 86 86 // finds the node that needs to be removed 87 forall( K | Comparable(K),V)87 forall(otype K | Comparable(K), otype V) 88 88 tree(K, V) * remove_helper(tree(K, V) * t, K key, int * worked){ 89 89 if (empty(t)){ … … 106 106 } 107 107 108 forall( K | Comparable(K),V)108 forall(otype K | Comparable(K), otype V) 109 109 int remove(tree(K, V) ** t, K key){ 110 110 int worked = 0; -
tests/avltree/avl4.cfa
rc08c3cf r467c8b7 4 4 // Perform a shallow copy of src, return the 5 5 // new tree in ret 6 forall( K | Comparable(K),V)6 forall(otype K | Comparable(K), otype V) 7 7 int copy(tree(K, V) * src, tree(K, V) ** ret){ 8 8 tree(K, V) * helper(tree(K, V) * t, int * worked){ … … 35 35 36 36 // Apply func to every value element in t, using an in order traversal 37 forall( K | Comparable(K),V)37 forall(otype K | Comparable(K), otype V) 38 38 void for_each(tree(K, V) * t, int (*func)(V)) { 39 39 if (t == NULL) { -
tests/bugs/10.cfa
rc08c3cf r467c8b7 2 2 // https://cforall.uwaterloo.ca/trac/ticket/10 3 3 4 forall( T)4 forall(otype T) 5 5 struct result { 6 6 union { -
tests/bugs/104.cfa
rc08c3cf r467c8b7 4 4 [ float, float ] modf_( float x ); 5 5 6 forall( T | { [T, T] modf_(T); })6 forall(otype T | { [T, T] modf_(T); }) 7 7 void modf(T); 8 8 -
tests/bugs/194.cfa
rc08c3cf r467c8b7 2 2 // https://cforall.uwaterloo.ca/trac/ticket/194 3 3 4 forall( T &| sized(T) ) T * foo( void ) {4 forall( dtype T | sized(T) ) T * foo( void ) { 5 5 printf( "foo1\n" ); 6 6 return (T *)0; 7 7 } 8 forall( T &| sized(T) ) T & foo( void ) {8 forall( dtype T | sized(T) ) T & foo( void ) { 9 9 printf( "foo2\n" ); 10 10 return (T &)*(T *)0; -
tests/bugs/196.cfa
rc08c3cf r467c8b7 2 2 // https://cforall.uwaterloo.ca/trac/ticket/196 3 3 4 forall( T &)4 forall(dtype T) 5 5 struct link; 6 6 7 forall( T &)7 forall(dtype T) 8 8 struct link { 9 9 link(T) * next; … … 12 12 // ----- 13 13 14 forall( T &)14 forall(dtype T) 15 15 struct foo; 16 16 17 forall( U &)17 forall(dtype U) 18 18 struct bar { 19 19 foo(U) * data; 20 20 }; 21 21 22 forall( T &)22 forall(dtype T) 23 23 struct foo {}; 24 24 -
tests/bugs/203-2.cfa
rc08c3cf r467c8b7 1 1 // Trac ticket: https://cforall.uwaterloo.ca/trac/ticket/203 2 2 3 forall( A &)3 forall(dtype A) 4 4 struct empty { 5 5 // Nothing. 6 6 }; 7 7 8 forall( C &)8 forall(dtype C) 9 9 struct wrap_e { 10 10 empty(C) field; -
tests/bugs/203-7.cfa
rc08c3cf r467c8b7 1 1 // Trac ticket: https://cforall.uwaterloo.ca/trac/ticket/203 2 2 3 forall( A &)3 forall(dtype A) 4 4 struct empty { 5 5 // Nothing. 6 6 }; 7 7 8 forall( C &)8 forall(dtype C) 9 9 struct wrap_e { 10 10 empty(C) field; -
tests/bugs/203-9.cfa
rc08c3cf r467c8b7 1 1 // Trac ticket: https://cforall.uwaterloo.ca/trac/ticket/203 2 2 3 forall( A &)3 forall(dtype A) 4 4 struct empty { 5 5 // Nothing. 6 6 }; 7 7 8 forall( C &)8 forall(dtype C) 9 9 struct wrap_e { 10 10 empty(C) field; -
tests/bugs/7.cfa
rc08c3cf r467c8b7 8 8 9 9 // (Bug 1 unresolved as of this test.) 10 forall( T)10 forall(otype T) 11 11 struct stack_node; 12 12 13 forall( T)13 forall(otype T) 14 14 struct stack_node { 15 15 stack_node(T) * next; … … 17 17 }; 18 18 19 forall( T)19 forall(otype T) 20 20 struct stack { 21 21 stack_node(T) * head; 22 22 }; 23 23 24 trait stack_errors( T) {24 trait stack_errors(otype T) { 25 25 T emptyStackHandler (stack(T) * this); 26 26 }; 27 27 28 forall( T | stack_errors(T))28 forall(otype T | stack_errors(T)) 29 29 T pop (stack(T) * this) { 30 30 return (T){}; -
tests/castError.cfa
rc08c3cf r467c8b7 14 14 // 15 15 16 forall( T) struct S { T p; };16 forall(otype T) struct S { T p; }; 17 17 int f; 18 18 S(int) sint; -
tests/concurrent/examples/boundedBufferEXT.cfa
rc08c3cf r467c8b7 24 24 enum { BufferSize = 50 }; 25 25 26 forall( T ) {26 forall( otype T ) { 27 27 monitor Buffer { 28 28 int front, back, count; -
tests/concurrent/examples/boundedBufferINT.cfa
rc08c3cf r467c8b7 24 24 enum { BufferSize = 50 }; 25 25 26 forall( T ) {26 forall( otype T ) { 27 27 monitor Buffer { 28 28 condition full, empty; -
tests/concurrent/examples/quickSort.generic.cfa
rc08c3cf r467c8b7 21 21 #include <string.h> // strcmp 22 22 23 forall( T | { int ?<?( T, T ); } ) {23 forall( otype T | { int ?<?( T, T ); } ) { 24 24 thread Quicksort { 25 25 T * values; // communication variables -
tests/concurrent/multi-monitor.cfa
rc08c3cf r467c8b7 38 38 } 39 39 40 forall( T &| sized(T) | { void ^?{}(T & mutex); })40 forall(dtype T | sized(T) | { void ^?{}(T & mutex); }) 41 41 void delete_mutex(T * x) { 42 42 ^(*x){}; -
tests/concurrent/thread.cfa
rc08c3cf r467c8b7 1 1 #include <fstream.hfa> 2 2 #include <kernel.hfa> 3 #include <locks.hfa>4 3 #include <stdlib.hfa> 5 4 #include <thread.hfa> -
tests/errors/completeType.cfa
rc08c3cf r467c8b7 1 1 void foo(int *) {} 2 2 void bar(void *) {} 3 forall( T) void baz(T *);4 forall( T &) void qux(T *);5 forall( T &| sized(T)) void quux(T *);3 forall(otype T) void baz(T *); 4 forall(dtype T) void qux(T *); 5 forall(dtype T | sized(T)) void quux(T *); 6 6 7 7 struct A; // incomplete … … 39 39 40 40 41 forall( T)41 forall(otype T) 42 42 void baz(T * x) { 43 43 // okay … … 49 49 } 50 50 51 forall( T &)51 forall(dtype T) 52 52 void qux(T * y) { 53 53 // okay … … 61 61 } 62 62 63 forall( T &| sized(T))63 forall(dtype T | sized(T)) 64 64 void quux(T * z) { 65 65 // okay -
tests/exceptions/defaults.cfa
rc08c3cf r467c8b7 55 55 56 56 void unhandled_test(void) { 57 forall( T &, V &| is_exception(T, V))57 forall(dtype T, dtype V | is_exception(T, V)) 58 58 void defaultTerminationHandler(T &) { 59 59 throw (unhandled_exception){}; -
tests/exceptions/polymorphic.cfa
rc08c3cf r467c8b7 3 3 #include <exception.hfa> 4 4 5 FORALL_TRIVIAL_EXCEPTION(proxy, ( T), (T));6 FORALL_TRIVIAL_INSTANCE(proxy, ( U), (U))5 FORALL_TRIVIAL_EXCEPTION(proxy, (otype T), (T)); 6 FORALL_TRIVIAL_INSTANCE(proxy, (otype U), (U)) 7 7 8 8 const char * msg(proxy(int) * this) { return "proxy(int)"; } … … 33 33 } 34 34 35 FORALL_DATA_EXCEPTION(cell, ( T), (T))(35 FORALL_DATA_EXCEPTION(cell, (otype T), (T))( 36 36 T data; 37 37 ); 38 38 39 FORALL_DATA_INSTANCE(cell, ( T), (T))39 FORALL_DATA_INSTANCE(cell, (otype T), (T)) 40 40 41 41 const char * msg(cell(int) * this) { return "cell(int)"; } -
tests/exceptions/virtual-poly.cfa
rc08c3cf r467c8b7 16 16 }; 17 17 18 forall( T)18 forall(otype T) 19 19 struct mono_child_vtable { 20 20 mono_base_vtable const * const parent; 21 21 }; 22 22 23 forall( T)23 forall(otype T) 24 24 struct mono_child { 25 25 mono_child_vtable(T) const * virtual_table; … … 37 37 } 38 38 39 forall( U)39 forall(otype U) 40 40 struct poly_base_vtable { 41 41 poly_base_vtable(U) const * const parent; 42 42 }; 43 43 44 forall( U)44 forall(otype U) 45 45 struct poly_base { 46 46 poly_base_vtable(U) const * virtual_table; 47 47 }; 48 48 49 forall( V)49 forall(otype V) 50 50 struct poly_child_vtable { 51 51 poly_base_vtable(V) const * const parent; 52 52 }; 53 53 54 forall( V)54 forall(otype V) 55 55 struct poly_child { 56 56 poly_child_vtable(V) const * virtual_table; -
tests/forall.cfa
rc08c3cf r467c8b7 15 15 16 16 void g1() { 17 forall( T ) T f( T ) {};17 forall( otype T ) T f( T ) {}; 18 18 void f( int ) {}; 19 19 void h( void (*p)(void) ) {}; … … 32 32 33 33 void g2() { 34 forall( T ) void f( T, T ) {}35 forall( T,U ) void f( T, U ) {}34 forall( otype T ) void f( T, T ) {} 35 forall( otype T, otype U ) void f( T, U ) {} 36 36 37 37 int x; … … 45 45 } 46 46 47 typedef forall ( T ) int (* f)( int );48 49 forall( T )47 typedef forall ( otype T ) int (* f)( int ); 48 49 forall( otype T ) 50 50 void swap( T left, T right ) { 51 51 T temp = left; … … 54 54 } 55 55 56 trait sumable( T ) {56 trait sumable( otype T ) { 57 57 void ?{}( T &, zero_t ); // 0 literal constructor 58 58 T ?+?( T, T ); // assortment of additions … … 62 62 }; // sumable 63 63 64 forall( T | sumable( T ) ) // use trait64 forall( otype T | sumable( T ) ) // use trait 65 65 T sum( size_t size, T a[] ) { 66 66 T total = 0; // initialize by 0 constructor … … 70 70 } // sum 71 71 72 forall( T | { T ?+?( T, T ); T ?++( T & ); [T] ?+=?( T &,T ); } )72 forall( otype T | { T ?+?( T, T ); T ?++( T & ); [T] ?+=?( T &,T ); } ) 73 73 T twice( T t ) { 74 74 return t + t; 75 75 } 76 76 77 forall( T | { int ?<?(T, T); } )77 forall( otype T | { int ?<?(T, T); } ) 78 78 T min( T t1, T t2 ) { 79 79 return t1 < t2 ? t1 : t2; … … 91 91 92 92 // Multiple forall 93 forall( T ) forall(S ) struct { int i; };94 forall( T ) struct { int i; } forall(S );95 struct { int i; } forall( T ) forall(S );96 forall( W ) struct { int i; } forall( T ) forall(S );93 forall( otype T ) forall( otype S ) struct { int i; }; 94 forall( otype T ) struct { int i; } forall( otype S ); 95 struct { int i; } forall( otype T ) forall( otype S ); 96 forall( otype W ) struct { int i; } forall( otype T ) forall( otype S ); 97 97 98 98 // Distribution 99 99 struct P { int i; }; 100 forall( T ) struct Q { T i; };101 forall( T ) struct { int i; };100 forall( otype T ) struct Q { T i; }; 101 forall( otype T ) struct { int i; }; 102 102 struct KK { int i; }; 103 103 inline static { 104 104 void RT1() {} 105 105 } 106 forall( T ) {106 forall( otype T ) { 107 107 T RT2( T ) { 108 108 typedef int TD1; 109 109 struct S1 { T t; }; 110 110 } 111 forall( X ) {111 forall( otype X ) { 112 112 typedef int TD2; 113 113 struct S2 {}; … … 117 117 } 118 118 extern "C" { 119 forall( W ) {119 forall( otype W ) { 120 120 W RT3( W ) {} 121 121 struct S3 {}; … … 123 123 } 124 124 void RT4() { 125 forall( W ) struct S4 {};125 forall( otype W ) struct S4 {}; 126 126 typedef int TD3; 127 127 } … … 147 147 148 148 static inline { 149 forall( T ) {149 forall( otype T ) { 150 150 int RT6( T p ); 151 151 } 152 forall( T,U ) {152 forall( otype T, otype U ) { 153 153 int RT7( T, U ); 154 154 } 155 155 } 156 static forall( T ) {156 static forall( otype T ) { 157 157 int RT8( T ); 158 158 } 159 forall( T ) inline static {159 forall( otype T ) inline static { 160 160 int RT9( T ) { T t; return 3; } 161 161 } 162 162 163 forall( T | { T ?+?( T, T ); } ) {164 forall( S | { T ?+?( T, S ); } ) {165 forall( W ) T bar( T t, S s ) { return t + s; }166 forall( W | { W ?+?( T, W ); } ) W baz( T t, S s, W w ) { return t + s + w; }163 forall( otype T | { T ?+?( T, T ); } ) { 164 forall( otype S | { T ?+?( T, S ); } ) { 165 forall( otype W ) T bar( T t, S s ) { return t + s; } 166 forall( otype W | { W ?+?( T, W ); } ) W baz( T t, S s, W w ) { return t + s + w; } 167 167 struct W { T t; } (int,int) ww; 168 168 struct P pp; … … 170 170 } 171 171 172 forall( T | { T ?+?( T, T ); } ) forall(S | { T ?+?( T, S ); } )172 forall( otype T | { T ?+?( T, T ); } ) forall( otype S | { T ?+?( T, S ); } ) 173 173 struct XW { T t; }; 174 174 XW(int,int) xww; 175 175 176 forall( T ) struct S { T t; } (int) x, y, z;177 forall( T ) struct { T t; } (int) a, b, c;178 179 forall( T ) static forall(S ) {180 forall( X ) struct U {176 forall( otype T ) struct S { T t; } (int) x, y, z; 177 forall( otype T ) struct { T t; } (int) a, b, c; 178 179 forall( otype T ) static forall( otype S ) { 180 forall( otype X ) struct U { 181 181 T x; 182 182 }; 183 183 } 184 184 185 forall( T ) {185 forall( otype T ) { 186 186 extern "C" { 187 187 struct SS { T t; }; -
tests/function-operator.cfa
rc08c3cf r467c8b7 22 22 23 23 // STL-like Algorithms 24 trait Assignable( T &, U &) { T ?=?(T &, U); };25 trait Copyable( T &) { void ?{}(T &, T); };26 trait Destructable( T &) { void ^?{}(T &); };24 trait Assignable(dtype T, dtype U) { T ?=?(T &, U); }; 25 trait Copyable(dtype T) { void ?{}(T &, T); }; 26 trait Destructable(dtype T) { void ^?{}(T &); }; 27 27 28 trait Iterator( iter & | sized(iter) | Copyable(iter) | Destructable(iter),T) {28 trait Iterator(dtype iter | sized(iter) | Copyable(iter) | Destructable(iter), otype T) { 29 29 T & *?(iter); 30 30 iter ++?(iter &); … … 32 32 }; 33 33 34 forall( Tin, Input & | Iterator(Input, Tin), Tout, Output &| Iterator(Output, Tout) | Assignable(Tout, Tin))34 forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout) | Assignable(Tout, Tin)) 35 35 Output copy(Input first, Input last, Output result) { 36 36 while (first != last) { … … 42 42 43 43 // test ?()(T *, ...) -- ?() with function call-by-pointer 44 forall( Tin, Input & | Iterator(Input, Tin), Tout, Output & | Iterator(Output, Tout), FuncRet, Func &| { FuncRet ?()(Func *, Tin); } | Assignable(Tout, FuncRet))44 forall(otype Tin, dtype Input | Iterator(Input, Tin), otype Tout, dtype Output | Iterator(Output, Tout), otype FuncRet, dtype Func | { FuncRet ?()(Func *, Tin); } | Assignable(Tout, FuncRet)) 45 45 Output transform (Input first, Input last, Output result, Func * op) { 46 46 while (first != last) { … … 52 52 53 53 // test ?()(T, ...) -- ?() with function call-by-value 54 forall( Iter &, T | Iterator(Iter, T),Pred | { int ?()(Pred, T); })54 forall(dtype Iter, otype T | Iterator(Iter, T), otype Pred | { int ?()(Pred, T); }) 55 55 Iter find_if (Iter first, Iter last, Pred pred) { 56 56 while (first != last) { … … 62 62 63 63 // test ?()(T, ...) -- ?() with function call-by-reference 64 forall( Generator, GenRet | { GenRet ?()(Generator &); }, Iter &,T | Iterator(Iter, T) | Assignable(T, GenRet))64 forall(otype Generator, otype GenRet | { GenRet ?()(Generator &); }, dtype Iter, otype T | Iterator(Iter, T) | Assignable(T, GenRet)) 65 65 void generate(Iter first, Iter last, Generator & gen) { 66 66 int i = 0; … … 108 108 } 109 109 110 forall( T | { int ?==?(T, T); })110 forall(otype T | { int ?==?(T, T); }) 111 111 struct Equals { 112 112 T val; 113 113 }; 114 114 115 forall( T | { int ?==?(T, T); })115 forall(otype T | { int ?==?(T, T); }) 116 116 int ?()(Equals(T) eq, T x) { 117 117 return eq.val == x; 118 118 } 119 119 120 forall( T | { T ?*?(T, T); })120 forall(otype T | { T ?*?(T, T); }) 121 121 struct Multiply { 122 122 T val; 123 123 }; 124 124 125 forall( T | { T ?*?(T, T); })125 forall(otype T | { T ?*?(T, T); }) 126 126 T ?()(Multiply(T) * mult, T x) { 127 127 return mult->val * x; … … 130 130 // TODO: generalize to ttype return; doesn't work yet 131 131 // like std::function 132 forall( Return, Args...)132 forall(otype Return, ttype Args) 133 133 struct function { 134 134 Return (*f)(Args); -
tests/genericUnion.cfa
rc08c3cf r467c8b7 16 16 #include <limits.hfa> 17 17 18 forall( T)18 forall(otype T) 19 19 union ByteView { 20 20 T val; … … 22 22 }; 23 23 24 forall( T)24 forall(otype T) 25 25 void print(ByteView(T) x) { 26 26 for (int i = 0; i < sizeof(int); i++) { // want to change to sizeof(T) … … 29 29 } 30 30 31 forall( T)31 forall(otype T) 32 32 void f(ByteView(T) x, T val) { 33 33 print(x); -
tests/global-monomorph.cfa
rc08c3cf r467c8b7 1 1 // Create monomorphic instances of polymorphic types at global scope. 2 2 3 forall( T &)3 forall(dtype T) 4 4 void poly0(T &) {} 5 5 6 forall( T &| sized(T))6 forall(dtype T | sized(T)) 7 7 void poly1(T &) {} 8 8 9 forall( T)9 forall(otype T) 10 10 void poly2(T &) {} 11 11 -
tests/identity.cfa
rc08c3cf r467c8b7 16 16 #include <fstream.hfa> 17 17 18 forall( T )18 forall( otype T ) 19 19 T identity( T t ) { 20 20 return t; -
tests/init1.cfa
rc08c3cf r467c8b7 120 120 } 121 121 122 forall ( T &, S &)122 forall (dtype T, dtype S) 123 123 T & anycvt( S & s ) { 124 124 return s; // mismatched referenced type 125 125 } 126 126 127 forall ( T &, S &)127 forall (dtype T, dtype S) 128 128 T * anycvt( S * s ) { 129 129 return s; // mismatched referenced type -
tests/nested-types.cfa
rc08c3cf r467c8b7 16 16 typedef int N; 17 17 struct A { 18 forall( T)18 forall(otype T) 19 19 struct N { 20 20 T x; -
tests/poly-d-cycle.cfa
rc08c3cf r467c8b7 1 1 // Check that a cycle of polymorphic dtype structures can be instancated. 2 2 3 forall( T &)3 forall(dtype T) 4 4 struct func_table; 5 5 6 forall( U &)6 forall(dtype U) 7 7 struct object { 8 8 func_table(U) * virtual_table; 9 9 }; 10 10 11 forall( T &)11 forall(dtype T) 12 12 struct func_table { 13 13 void (*object_func)(object(T) *); -
tests/poly-o-cycle.cfa
rc08c3cf r467c8b7 1 1 // Check that a cycle of polymorphic otype structures can be instancated. 2 2 3 forall( T)3 forall(otype T) 4 4 struct func_table; 5 5 6 forall( U)6 forall(otype U) 7 7 struct object { 8 8 func_table(U) * virtual_table; 9 9 }; 10 10 11 forall( T)11 forall(otype T) 12 12 struct func_table { 13 13 void (*object_func)(object(T) *); -
tests/poly-selection.cfa
rc08c3cf r467c8b7 16 16 17 17 void testSpecializationFromGenericOverBareTyvar() { 18 forall( T &)18 forall( dtype T ) 19 19 void friend( T & ) { 20 20 printf("friending generically\n"); 21 21 } 22 22 23 forall( T &)23 forall(dtype T) 24 24 struct thing { 25 25 int x; 26 26 }; 27 27 28 forall( T &)28 forall( dtype T ) 29 29 void friend( thing(T) & ) { 30 30 printf("friending specifically\n"); … … 37 37 void testSpecializationFromGenericAccessibleWithExtraTyvars() { 38 38 39 forall( T &, U &)39 forall( dtype T, dtype U ) 40 40 struct map {}; 41 41 42 forall( T &)42 forall( dtype T ) 43 43 void f( T & ) { 44 44 printf("f-generic\n"); 45 45 } 46 46 47 forall( T &)47 forall( dtype T ) 48 48 void f( map(T, T) & ) { 49 49 printf("f-specific\n"); -
tests/polymorphism.cfa
rc08c3cf r467c8b7 18 18 #include <fstream.hfa> 19 19 20 forall( T)20 forall(otype T) 21 21 T f(T x, T y) { 22 22 x = y; … … 24 24 } 25 25 26 forall( T) T ident(T x) {26 forall(otype T) T ident(T x) { 27 27 return x; 28 28 } 29 29 30 forall( T,U )30 forall( otype T, otype U ) 31 31 size_t struct_size( T i, U j ) { 32 32 struct S { T i; U j; }; … … 34 34 } 35 35 36 forall( T,U )36 forall( otype T, otype U ) 37 37 size_t union_size( T i, U j ) { 38 38 union B { T i; U j; }; … … 41 41 42 42 // perform some simple operations on aggregates of T and U 43 forall( T | { void print(T); int ?==?(T, T); },U | { void print(U); U ?=?(U&, zero_t); } )43 forall( otype T | { void print(T); int ?==?(T, T); }, otype U | { void print(U); U ?=?(U&, zero_t); } ) 44 44 U foo(T i, U j) { 45 45 struct S { T i; U j; }; -
tests/raii/ctor-autogen.cfa
rc08c3cf r467c8b7 33 33 34 34 // dtype-static generic type is otype 35 forall( T &)35 forall(dtype T) 36 36 struct DtypeStaticStruct { 37 37 T * data; … … 39 39 }; 40 40 41 forall( T &)41 forall(dtype T) 42 42 union DtypeStaticUnion { 43 43 T * data; … … 46 46 47 47 // dynamic generic type is otype 48 forall( T)48 forall(otype T) 49 49 struct DynamicStruct { 50 50 T x; 51 51 }; 52 52 53 forall( T)53 forall(otype T) 54 54 union DynamicUnion { 55 55 T x; … … 80 80 81 81 82 forall( T)82 forall(otype T) 83 83 T identity(T x) { return x; } 84 84 -
tests/simpleGenericTriple.cfa
rc08c3cf r467c8b7 14 14 // 15 15 16 forall( T)16 forall(otype T) 17 17 struct T3 { 18 18 T f0, f1, f2; 19 19 }; 20 20 21 forall( T | { T ?+?(T, T); })21 forall(otype T | { T ?+?(T, T); }) 22 22 T3(T) ?+?(T3(T) x, T3(T) y) { 23 23 T3(T) z = { x.f0+y.f0, x.f1+y.f1, x.f2+y.f2 }; -
tests/sum.cfa
rc08c3cf r467c8b7 18 18 #include <stdlib.hfa> 19 19 20 trait sumable( T ) {20 trait sumable( otype T ) { 21 21 void ?{}( T &, zero_t ); // 0 literal constructor 22 22 T ?+?( T, T ); // assortment of additions … … 26 26 }; // sumable 27 27 28 forall( T | sumable( T ) ) // use trait28 forall( otype T | sumable( T ) ) // use trait 29 29 T sum( size_t size, T a[] ) { 30 30 T total = 0; // initialize by 0 constructor … … 107 107 | sum( size, (S *)a ) | ", check" | (S)s; 108 108 109 forall( Impl | sumable( Impl ) )109 forall( otype Impl | sumable( Impl ) ) 110 110 struct GS { 111 111 Impl * x, * y; … … 194 194 sum( size, (S *)a ).[i, j], s.[i, j] ); 195 195 196 forall( Impl | sumable( Impl ) )196 forall( otype Impl | sumable( Impl ) ) 197 197 struct GS { 198 198 Impl * x, * y; -
tests/tuple/tuplePolymorphism.cfa
rc08c3cf r467c8b7 29 29 // ensure that f is a viable candidate for g, even though its parameter structure does not exactly match 30 30 [A] f([A, B] x, B y) { printf("%g %c %g %lld %c %lld %lld %c %lld\n", x.0.[x,y,z], x.1.[x,y,z], y.[x,y,z]); return x.0; } 31 forall( T,U | { T f(T, U, U); })31 forall(otype T, otype U | { T f(T, U, U); }) 32 32 void g(T x, U y) { f(x, y, y); } 33 33 34 34 // add two triples 35 forall( T | { T ?+?(T, T); })35 forall(otype T | { T ?+?(T, T); }) 36 36 [T, T, T] ?+?([T, T, T] x, [T, T, T] y) { 37 37 return [x.0+y.0, x.1+y.1, x.2+y.2]; … … 64 64 } 65 65 66 forall( T)66 forall(otype T) 67 67 [T, T] foo([T, T] y) { 68 68 [T, T] x; -
tests/tuple/tupleVariadic.cfa
rc08c3cf r467c8b7 19 19 printf("called func(void)\n"); 20 20 } 21 forall( T, Params...| { void process(T); void func(Params); })21 forall(otype T, ttype Params | { void process(T); void func(Params); }) 22 22 void func(T arg1, Params p) { 23 23 process(arg1); … … 92 92 } 93 93 94 forall( T)94 forall(otype T) 95 95 T * copy(T x) { 96 96 // test calling new inside a polymorphic function … … 98 98 } 99 99 100 forall( T...| { void foo(T); }) void bar(T x) {}100 forall(ttype T | { void foo(T); }) void bar(T x) {} 101 101 void foo(int) {} 102 102 -
tests/zombies/ArrayN.c
rc08c3cf r467c8b7 6 6 // } 7 7 8 forall( index_t)8 forall(otype index_t) 9 9 index_t offset_to_index(unsigned offset, index_t size) { 10 10 return [offset / size.0, offset % size.1]; -
tests/zombies/Members.c
rc08c3cf r467c8b7 2 2 int ?=?( int*, int ); 3 3 float ?=?( float*, float ); 4 forall( DT &) DT * ?=?( DT**, DT* );5 forall( T) lvalue T *?( T* );4 forall( dtype DT ) DT * ?=?( DT**, DT* ); 5 forall(otype T) lvalue T *?( T* ); 6 6 char *__builtin_memcpy(); 7 7 -
tests/zombies/Rank2.c
rc08c3cf r467c8b7 1 1 int ?=?( int &, int ); 2 forall( DT &) DT * ?=?( DT *&, DT * );2 forall(dtype DT) DT * ?=?( DT *&, DT * ); 3 3 4 4 void a() { 5 forall( T ) void f( T );6 void g( forall( U ) void p( U ) );5 forall( otype T ) void f( T ); 6 void g( forall( otype U ) void p( U ) ); 7 7 g( f ); 8 8 } … … 10 10 void g() { 11 11 void h( int *null ); 12 forall( T ) T id( T );12 forall( otype T ) T id( T ); 13 13 // forall( dtype T ) T *0; 14 14 // int 0; -
tests/zombies/abstype.c
rc08c3cf r467c8b7 21 21 } 22 22 23 forall( T ) T *?( T * );23 forall( otype T ) T *?( T * ); 24 24 int ?++( int * ); 25 25 int ?=?( int *, int ); 26 forall( DT &) DT * ?=?( DT **, DT * );26 forall( dtype DT ) DT * ?=?( DT **, DT * ); 27 27 28 28 otype U = int *; -
tests/zombies/context.cfa
rc08c3cf r467c8b7 1 1 // trait declaration 2 2 3 trait has_q( T ) {3 trait has_q( otype T ) { 4 4 T q( T ); 5 5 }; 6 6 7 forall( z | has_q( z ) ) void f() {8 trait has_r( T,U ) {7 forall( otype z | has_q( z ) ) void f() { 8 trait has_r( otype T, otype U ) { 9 9 T r( T, T (T,U) ); 10 10 }; -
tests/zombies/gc_no_raii/bug-repro/blockers/explicit_cast.c
rc08c3cf r467c8b7 9 9 }; 10 10 11 forall( T)11 forall(otype T) 12 12 struct gcpointer 13 13 { … … 15 15 }; 16 16 17 forall( T)17 forall(otype T) 18 18 static inline gcpointer(T) gcmalloc() 19 19 { -
tests/zombies/gc_no_raii/bug-repro/blockers/recursive_realloc.c
rc08c3cf r467c8b7 3 3 #include <stdlib.hfa> 4 4 5 trait allocator_c( T,allocator_t)5 trait allocator_c(otype T, otype allocator_t) 6 6 { 7 7 void realloc(allocator_t* const, size_t); 8 8 }; 9 9 10 forall( T)10 forall(otype T) 11 11 struct heap_allocator 12 12 { … … 15 15 }; 16 16 17 forall( T)17 forall(otype T) 18 18 inline void realloc(heap_allocator(T) *const this, size_t size) 19 19 { -
tests/zombies/gc_no_raii/bug-repro/deref.c
rc08c3cf r467c8b7 1 forall( T)1 forall(otype T) 2 2 struct wrap 3 3 { … … 5 5 }; 6 6 7 forall( T)7 forall(otype T) 8 8 T *? (wrap(T) rhs) 9 9 { -
tests/zombies/gc_no_raii/bug-repro/field.c
rc08c3cf r467c8b7 8 8 //------------------------------------------------------------------------------ 9 9 //Declaration 10 trait allocator_c( T,allocator_t)10 trait allocator_c(otype T, otype allocator_t) 11 11 { 12 12 void ctor(allocator_t* const); … … 16 16 }; 17 17 18 forall( T,allocator_t | allocator_c(T, allocator_t))18 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 19 19 struct vector 20 20 { -
tests/zombies/gc_no_raii/bug-repro/malloc.c
rc08c3cf r467c8b7 1 forall( T)1 forall(otype T) 2 2 struct wrapper 3 3 { … … 5 5 }; 6 6 7 forall( T)7 forall(otype T) 8 8 void ctor(wrapper(T)* this) 9 9 { … … 11 11 } 12 12 13 forall( T)13 forall(otype T) 14 14 wrapper(T) gcmalloc() 15 15 { … … 19 19 } 20 20 21 forall( T)21 forall(otype T) 22 22 wrapper(T)* ?=? (wrapper(T)* lhs, wrapper(T)* rhs) 23 23 { -
tests/zombies/gc_no_raii/bug-repro/oddtype.c
rc08c3cf r467c8b7 1 forall( T &)1 forall(dtype T) 2 2 struct wrap { 3 3 int i; 4 4 }; 5 5 6 forall( T) void ?{}(wrap(T)* this) {}7 forall( T) void ?=?(wrap(T)* this) {}8 forall( T) void ^?{}(wrap(T)* this) {}6 forall(otype T) void ?{}(wrap(T)* this) {} 7 forall(otype T) void ?=?(wrap(T)* this) {} 8 forall(otype T) void ^?{}(wrap(T)* this) {} 9 9 10 10 struct List_t { -
tests/zombies/gc_no_raii/bug-repro/push_back.h
rc08c3cf r467c8b7 1 1 //------------------------------------------------------------------------------ 2 2 //Declaration 3 trait allocator_c( T,allocator_t) {3 trait allocator_c(otype T, otype allocator_t) { 4 4 void ctor(allocator_t* const); 5 5 void dtor(allocator_t* const); … … 8 8 }; 9 9 10 forall( T,allocator_t | allocator_c(T, allocator_t))10 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 11 11 struct vector 12 12 { … … 17 17 //------------------------------------------------------------------------------ 18 18 //Initialization 19 forall( T,allocator_t | allocator_c(T, allocator_t))19 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 20 20 void vector_ctor(vector(T, allocator_t) *const this); 21 21 22 forall( T,allocator_t | allocator_c(T, allocator_t))22 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 23 23 void dtor(vector(T, allocator_t) *const this); 24 24 25 25 //------------------------------------------------------------------------------ 26 26 //Allocator 27 forall( T)27 forall(otype T) 28 28 struct heap_allocator 29 29 { … … 32 32 }; 33 33 34 forall( T)34 forall(otype T) 35 35 void ctor(heap_allocator(T) *const this); 36 36 37 forall( T)37 forall(otype T) 38 38 void dtor(heap_allocator(T) *const this); 39 39 40 forall( T)40 forall(otype T) 41 41 void realloc(heap_allocator(T) *const this, size_t size); 42 42 43 forall( T)43 forall(otype T) 44 44 inline T* data(heap_allocator(T) *const this) 45 45 { … … 49 49 //------------------------------------------------------------------------------ 50 50 //Capacity 51 forall( T,allocator_t | allocator_c(T, allocator_t))51 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 52 52 inline bool empty(vector(T, allocator_t) *const this) 53 53 { … … 55 55 } 56 56 57 forall( T,allocator_t | allocator_c(T, allocator_t))57 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 58 58 inline bool size(vector(T, allocator_t) *const this) 59 59 { … … 61 61 } 62 62 63 forall( T,allocator_t | allocator_c(T, allocator_t))63 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 64 64 inline void reserve(vector(T, allocator_t) *const this, size_t size) 65 65 { … … 69 69 //------------------------------------------------------------------------------ 70 70 //Modifiers 71 forall( T,allocator_t | allocator_c(T, allocator_t))71 forall(otype T, otype allocator_t | allocator_c(T, allocator_t)) 72 72 void push_back(vector(T, allocator_t) *const this, T value); -
tests/zombies/gc_no_raii/bug-repro/realloc.c
rc08c3cf r467c8b7 1 1 void* realloc(void*, unsigned long int); 2 2 3 forall( T)3 forall(otype T) 4 4 struct wrap 5 5 { … … 7 7 }; 8 8 9 forall( T)9 forall(otype T) 10 10 static inline void realloc(wrap(T) *const this, unsigned long int size) 11 11 { -
tests/zombies/gc_no_raii/bug-repro/return.c
rc08c3cf r467c8b7 1 forall( T)1 forall(otype T) 2 2 struct wrapper 3 3 { … … 5 5 }; 6 6 7 forall( T)7 forall(otype T) 8 8 wrapper(T) create() 9 9 { … … 12 12 } 13 13 14 forall( T)14 forall(otype T) 15 15 wrapper(T)* ?=?(wrapper(T)* lhs, wrapper(T)* rhs) 16 16 { -
tests/zombies/gc_no_raii/bug-repro/return_template.c
rc08c3cf r467c8b7 1 forall( T)1 forall(otype T) 2 2 struct wrap 3 3 { … … 5 5 }; 6 6 7 forall( T) void ?{}(wrap(T)* this);8 forall( T) void ?{}(wrap(T)* this, wrap(T)* rhs);9 forall( T) void ^?{}(wrap(T)* this);10 forall( T) void ?=?(wrap(T)* this, wrap(T)* rhs);7 forall(otype T) void ?{}(wrap(T)* this); 8 forall(otype T) void ?{}(wrap(T)* this, wrap(T)* rhs); 9 forall(otype T) void ^?{}(wrap(T)* this); 10 forall(otype T) void ?=?(wrap(T)* this, wrap(T)* rhs); 11 11 12 forall( T)12 forall(otype T) 13 13 wrap(T) test() 14 14 { -
tests/zombies/gc_no_raii/bug-repro/slow_malloc.c
rc08c3cf r467c8b7 1 1 #include <stdlib.hfa> 2 2 3 forall( T)3 forall(otype T) 4 4 struct heap_allocator 5 5 { -
tests/zombies/gc_no_raii/bug-repro/zero.c
rc08c3cf r467c8b7 1 forall( T)1 forall(otype T) 2 2 struct wrap 3 3 { … … 5 5 }; 6 6 7 forall( T)7 forall(otype T) 8 8 int ?==? (wrap(T) lhs, wrap(T) rhs) 9 9 { … … 14 14 struct wrap(int) 0; 15 15 /*/ 16 forall( T)16 forall(otype T) 17 17 struct wrap(T) 0; 18 18 //*/ -
tests/zombies/gc_no_raii/src/gc.h
rc08c3cf r467c8b7 13 13 // } 14 14 15 forall( T)15 forall(otype T) 16 16 static inline void gcmalloc(gcpointer(T)* ptr) 17 17 { -
tests/zombies/gc_no_raii/src/gcpointers.c
rc08c3cf r467c8b7 113 113 #endif 114 114 115 forall( T) void ?{}(gcpointer(T)* this) {115 forall(otype T) void ?{}(gcpointer(T)* this) { 116 116 (&this->internal) {}; 117 117 } 118 118 119 forall( T) void ?{}(gcpointer(T)* this, void* address) {119 forall(otype T) void ?{}(gcpointer(T)* this, void* address) { 120 120 (&this->internal) { address }; 121 121 } 122 122 123 forall( T) void ?{}(gcpointer(T)* this, gcpointer(T) other) {123 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other) { 124 124 (&this->internal) { other.internal }; 125 125 } 126 126 127 forall( T) void ^?{}(gcpointer(T)* this) {127 forall(otype T) void ^?{}(gcpointer(T)* this) { 128 128 ^?{}(&this->internal); 129 129 } 130 130 131 forall( T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs) {131 forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs) { 132 132 this->internal = rhs.internal; 133 133 return *this; … … 136 136 // forall(otype T) T *?(gcpointer(T) this); 137 137 138 forall( T) T* get(gcpointer(T)* this) {138 forall(otype T) T* get(gcpointer(T)* this) { 139 139 return (T*)this->internal.ptr; 140 140 } 141 141 // 142 142 // //Logical operators 143 forall( T) int ?!=?(gcpointer(T) this, int zero) {143 forall(otype T) int ?!=?(gcpointer(T) this, int zero) { 144 144 return this.internal.ptr != 0; 145 145 } -
tests/zombies/gc_no_raii/src/gcpointers.h
rc08c3cf r467c8b7 4 4 #include <stdint.h> 5 5 6 forall( T &)6 forall(dtype T) 7 7 struct gcpointer; 8 8 … … 29 29 #endif 30 30 31 forall( T &)31 forall(dtype T) 32 32 struct gcpointer 33 33 { … … 36 36 37 37 // 38 forall( T) void ?{}(gcpointer(T)* this);39 forall( T) void ?{}(gcpointer(T)* this, void* address);40 forall( T) void ?{}(gcpointer(T)* this, gcpointer(T) other);41 forall( T) void ^?{}(gcpointer(T)* this);42 forall( T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs);38 forall(otype T) void ?{}(gcpointer(T)* this); 39 forall(otype T) void ?{}(gcpointer(T)* this, void* address); 40 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other); 41 forall(otype T) void ^?{}(gcpointer(T)* this); 42 forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs); 43 43 44 44 45 45 // forall(otype T) T *?(gcpointer(T) this); 46 forall( T) T* get(gcpointer(T)* this);46 forall(otype T) T* get(gcpointer(T)* this); 47 47 48 48 //Logical operators 49 forall( T) int ?!=?(gcpointer(T) this, int zero);50 forall( T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs);51 forall( T) int ?==?(gcpointer(T) this, gcpointer(T) rhs);49 forall(otype T) int ?!=?(gcpointer(T) this, int zero); 50 forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs); 51 forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs); -
tests/zombies/gc_no_raii/src/tools.h
rc08c3cf r467c8b7 12 12 // } 13 13 14 trait has_equal( T)14 trait has_equal(otype T) 15 15 { 16 16 signed int ?==?(T a, T b); 17 17 }; 18 18 19 trait InputIterator_t( T,InputIterator)19 trait InputIterator_t(otype T, otype InputIterator) 20 20 { 21 21 signed int ?==?(InputIterator a, InputIterator b); … … 26 26 }; 27 27 28 forall( T | has_equal(T),InputIterator | InputIterator_t(T, InputIterator))28 forall(otype T | has_equal(T), otype InputIterator | InputIterator_t(T, InputIterator)) 29 29 static inline InputIterator find( InputIterator first, const InputIterator* const last, T val) 30 30 { -
tests/zombies/hashtable.cfa
rc08c3cf r467c8b7 14 14 15 15 16 trait has_hash( K ) {16 trait has_hash( otype K ) { 17 17 size_t hash(K); 18 18 int ?==?( K, K ); 19 19 }; 20 20 21 trait hkey( K, tN &| has_hash(K) ) {21 trait hkey( otype K, dtype tN | has_hash(K) ) { 22 22 K key(tN &); 23 23 }; 24 24 25 forall( K, tN &, tE &| $dlistable(tN, tE) | hkey(K, tN) ) {25 forall( otype K, dtype tN, dtype tE | $dlistable(tN, tE) | hkey(K, tN) ) { 26 26 27 27 struct hashtable { … … 39 39 } 40 40 41 forall( K, tN &, tE &| $dlistable(tN, tE) | hkey(K, tN) | { void defaultResumptionHandler(ht_fill_limit_crossed &); } ) {41 forall( otype K, dtype tN, dtype tE | $dlistable(tN, tE) | hkey(K, tN) | { void defaultResumptionHandler(ht_fill_limit_crossed &); } ) { 42 42 43 43 void ?{}( hashtable(K, tN, tE) & this, size_t n_buckets, dlist(tN, tE) *buckets ) { … … 57 57 } 58 58 59 forall( K, tN &, tE &| $dlistable(tN, tE) | hkey(K, tN) ) {59 forall( otype K, dtype tN, dtype tE | $dlistable(tN, tE) | hkey(K, tN) ) { 60 60 61 61 float fill_frac( hashtable(K, tN, tE) & this ) with(this) { … … 124 124 125 125 126 trait heaped( T &) {126 trait heaped(dtype T) { 127 127 T * alloc( size_t ); 128 128 void free( void * ); … … 133 133 } 134 134 135 forall( K, tN &, tE &| $dlistable(tN, tE) | hkey(K, tN) | heaped( dlist(tN, tE) ) ) {135 forall( otype K, dtype tN, dtype tE | $dlistable(tN, tE) | hkey(K, tN) | heaped( dlist(tN, tE) ) ) { 136 136 137 137 struct hashtable_dynamic { -
tests/zombies/hashtable2.cfa
rc08c3cf r467c8b7 69 69 70 70 71 trait pretendsToMatter( TTT &) {71 trait pretendsToMatter( dtype TTT ) { 72 72 void actsmart(TTT &); 73 73 }; 74 74 75 forall( TTTx &)75 forall( dtype TTTx ) 76 76 void actsmart(TTTx &) {} 77 77 … … 86 86 // 2. shows up in -CFA output as hashtable_rbs(), which is bad C; expecting hashtable_rbs* 87 87 88 forall( Tt_unused | pretendsToMatter(Tt_unused) ) {88 forall( otype Tt_unused | pretendsToMatter(Tt_unused) ) { 89 89 90 90 // hashtable of request by source … … 104 104 } 105 105 106 forall( Tt_unused | pretendsToMatter(Tt_unused) | { void defaultResumptionHandler(ht_fill_limit_crossed &); } ) {106 forall( otype Tt_unused | pretendsToMatter(Tt_unused) | { void defaultResumptionHandler(ht_fill_limit_crossed &); } ) { 107 107 108 108 void ?{}( hashtable_rbs(Tt_unused) & this, size_t n_buckets, dlist(request_in_ht_by_src, request) *buckets, … … 135 135 void defaultResumptionHandler( ht_auto_resize_pending & ex ); 136 136 137 forall( Tt_unused | pretendsToMatter(Tt_unused) ) {137 forall( otype Tt_unused | pretendsToMatter(Tt_unused) ) { 138 138 139 139 float fill_frac( hashtable_rbs(Tt_unused) & this ) with(this) { … … 221 221 222 222 223 trait heaped( T &) {223 trait heaped(dtype T) { 224 224 T * alloc( size_t ); 225 225 void free( void * ); … … 228 228 void __dynamic_defaultResumptionHandler(ht_fill_limit_crossed &); 229 229 230 forall( Tt_unused ) {230 forall( otype Tt_unused ) { 231 231 232 232 struct hashtable_rbs_dynamic { … … 263 263 264 264 265 forall( Tt_unused | heaped( dlist(request_in_ht_by_src, request) ) ) {265 forall( otype Tt_unused | heaped( dlist(request_in_ht_by_src, request) ) ) { 266 266 267 267 void ?{}( hashtable_rbs_dynamic(Tt_unused).resize_policy & this, size_t nbuckets_floor ) { … … 325 325 } 326 326 327 forall( Tt_unused ) {327 forall( otype Tt_unused ) { 328 328 void rehashToLarger_STEP( hashtable_rbs_dynamic(Tt_unused) & this, size_t new_n_buckets ) with (this) { 329 329 rehashToLarger( this, new_n_buckets ); -
tests/zombies/huge.c
rc08c3cf r467c8b7 14 14 // 15 15 16 int huge( int n, forall( T ) T (*f)( T ) ) {16 int huge( int n, forall( otype T ) T (*f)( T ) ) { 17 17 if ( n <= 0 ) 18 18 return f( 0 ); -
tests/zombies/it_out.c
rc08c3cf r467c8b7 16 16 typedef unsigned long streamsize_type; 17 17 18 trait ostream( os_type &) {18 trait ostream( dtype os_type ) { 19 19 os_type *write( os_type *, const char *, streamsize_type ); 20 20 int fail( os_type * ); 21 21 }; 22 22 23 trait writeable( T ) {24 forall( os_type &| ostream( os_type ) ) os_type * ?<<?( os_type *, T );23 trait writeable( otype T ) { 24 forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, T ); 25 25 }; 26 26 27 forall( os_type &| ostream( os_type ) ) os_type * ?<<?( os_type *, char );28 forall( os_type &| ostream( os_type ) ) os_type * ?<<?( os_type *, int );29 forall( os_type &| ostream( os_type ) ) os_type * ?<<?( os_type *, const char * );27 forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, char ); 28 forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, int ); 29 forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, const char * ); 30 30 31 trait istream( is_type &) {31 trait istream( dtype is_type ) { 32 32 is_type *read( is_type *, char *, streamsize_type ); 33 33 is_type *unread( is_type *, char ); … … 36 36 }; 37 37 38 trait readable( T ) {39 forall( is_type &| istream( is_type ) ) is_type * ?<<?( is_type *, T );38 trait readable( otype T ) { 39 forall( dtype is_type | istream( is_type ) ) is_type * ?<<?( is_type *, T ); 40 40 }; 41 41 42 forall( is_type &| istream( is_type ) ) is_type * ?>>?( is_type *, char* );43 forall( is_type &| istream( is_type ) ) is_type * ?>>?( is_type *, int* );42 forall( dtype is_type | istream( is_type ) ) is_type * ?>>?( is_type *, char* ); 43 forall( dtype is_type | istream( is_type ) ) is_type * ?>>?( is_type *, int* ); 44 44 45 trait iterator( iterator_type,elt_type ) {45 trait iterator( otype iterator_type, otype elt_type ) { 46 46 iterator_type ?++( iterator_type* ); 47 47 iterator_type ++?( iterator_type* ); … … 52 52 }; 53 53 54 forall( elt_type | writeable( elt_type ),55 iterator_type | iterator( iterator_type, elt_type ),56 os_type &| ostream( os_type ) )54 forall( otype elt_type | writeable( elt_type ), 55 otype iterator_type | iterator( iterator_type, elt_type ), 56 dtype os_type | ostream( os_type ) ) 57 57 void write_all( iterator_type begin, iterator_type end, os_type *os ); 58 58 59 forall( elt_type | writeable( elt_type ),60 iterator_type | iterator( iterator_type, elt_type ),61 os_type &| ostream( os_type ) )59 forall( otype elt_type | writeable( elt_type ), 60 otype iterator_type | iterator( iterator_type, elt_type ), 61 dtype os_type | ostream( os_type ) ) 62 62 void write_all( elt_type begin, iterator_type end, os_type *os ) { 63 63 os << begin; -
tests/zombies/new.c
rc08c3cf r467c8b7 14 14 // 15 15 16 forall( T )16 forall( otype T ) 17 17 void f( T *t ) { 18 18 t--; -
tests/zombies/occursError.cfa
rc08c3cf r467c8b7 1 forall( T ) void f( void (*)( T, T * ) );2 forall( U ) void g( U, U * );3 forall( U ) void h( U *, U );1 forall( otype T ) void f( void (*)( T, T * ) ); 2 forall( otype U ) void g( U, U * ); 3 forall( otype U ) void h( U *, U ); 4 4 5 5 void test() { -
tests/zombies/prolog.c
rc08c3cf r467c8b7 25 25 void is_integer( int x ) {} 26 26 27 trait ArithmeticType( T ) {27 trait ArithmeticType( otype T ) { 28 28 void is_arithmetic( T ); 29 29 }; 30 30 31 trait IntegralType( T | ArithmeticType( T ) ) {31 trait IntegralType( otype T | ArithmeticType( T ) ) { 32 32 void is_integer( T ); 33 33 }; 34 34 35 forall( T | IntegralType( T ) | { void printResult( T ); } )35 forall( otype T | IntegralType( T ) | { void printResult( T ); } ) 36 36 void hornclause( T param ) { 37 37 printResult( param ); -
tests/zombies/quad.c
rc08c3cf r467c8b7 16 16 #include <fstream.hfa> 17 17 18 forall( T | { T ?*?( T, T ); } )18 forall( otype T | { T ?*?( T, T ); } ) 19 19 T square( T t ) { 20 20 return t * t; 21 21 } 22 22 23 forall( U | { U square( U ); } )23 forall( otype U | { U square( U ); } ) 24 24 U quad( U u ) { 25 25 return square( square( u ) ); -
tests/zombies/scope.cfa
rc08c3cf r467c8b7 20 20 y p; 21 21 22 trait has_u( z ) {22 trait has_u( otype z ) { 23 23 z u(z); 24 24 }; 25 25 26 forall( t | has_u( t ) )26 forall( otype t | has_u( t ) ) 27 27 y q( t the_t ) { 28 28 t y = u( the_t ); -
tests/zombies/simplePoly.c
rc08c3cf r467c8b7 14 14 // 15 15 16 forall( T,U | { T f( T, U ); } )16 forall( otype T, otype U | { T f( T, U ); } ) 17 17 T q( T t, U u ) { 18 18 return f( t, u ); -
tests/zombies/simpler.c
rc08c3cf r467c8b7 14 14 // 15 15 16 forall( T ) T id( T, T );16 forall( otype T ) T id( T, T ); 17 17 18 18 int main() { -
tests/zombies/specialize.c
rc08c3cf r467c8b7 39 39 } 40 40 41 forall( T ) T f( T t )41 forall( otype T ) T f( T t ) 42 42 { 43 43 printf( "in f; sizeof T is %d\n", sizeof( T ) ); -
tests/zombies/square.c
rc08c3cf r467c8b7 16 16 #include <fstream.hfa> 17 17 18 forall( T | { T ?*?( T, T ); } )18 forall( otype T | { T ?*?( T, T ); } ) 19 19 T square( T t ) { 20 20 return t * t; -
tests/zombies/structMember.cfa
rc08c3cf r467c8b7 66 66 S.T; 67 67 .S.T; 68 forall( S,T ) struct W {68 forall( otype S, otype T ) struct W { 69 69 struct X {}; 70 70 }; -
tests/zombies/subrange.cfa
rc08c3cf r467c8b7 1 1 // A small context defining the notion of an ordered otype. (The standard 2 2 // library should probably contain a context for this purpose.) 3 trait ordered( T) {3 trait ordered(otype T) { 4 4 int ?<?(T, T), ?<=?(T, T); 5 5 }; … … 7 7 // A subrange otype resembling an Ada subotype with a base otype and a range 8 8 // constraint. 9 otype subrange( base_t | ordered(base_t), base_t low = 0, base_t high = 8) = base_t;9 otype subrange(otype base_t | ordered(base_t), base_t low = 0, base_t high = 8) = base_t; 10 10 11 11 // Note that subrange() can be applied to floating-point and pointer otypes, not … … 28 28 29 29 // Convenient access to subrange bounds, for instance for iteration: 30 forall ( T, T low, T high)30 forall (otype T, T low, T high) 31 31 T lbound( subrange(T, low, high) v) { 32 32 return low; 33 33 } 34 34 35 forall ( T, T low, T high)35 forall (otype T, T low, T high) 36 36 T hbound( subrange(T, low, high) v) { 37 37 return high; … … 44 44 // of exception handling here. Inlining allows the compiler to eliminate 45 45 // bounds checks. 46 forall ( T | ordered(T), T low, T high)46 forall (otype T | ordered(T), T low, T high) 47 47 inline subrange(T, low, high) ?=?(subrange(T, low, high)* target, T source) { 48 48 if (low <= source && source <= high) *((T*)target) = source; … … 54 54 // compares range bounds so that the compiler can optimize checks away when the 55 55 // ranges are known to overlap. 56 forall ( T | ordered(T), T t_low, T t_high, T s_low, T s_high)56 forall (otype T | ordered(T), T t_low, T t_high, T s_low, T s_high) 57 57 inline subrange(T, t_low, t_high) ?=?(subrange(T, t_low, t_high)* target, 58 58 subrange(T, s_low, s_high) source) { -
tests/zombies/twice.c
rc08c3cf r467c8b7 16 16 #include <fstream.hfa> 17 17 18 forall( T | { T ?+?( T, T ); } )18 forall( otype T | { T ?+?( T, T ); } ) 19 19 T twice( const T t ) { 20 20 return t + t; -
tests/zombies/typeGenerator.cfa
rc08c3cf r467c8b7 1 context addable( T ) {1 context addable( otype T ) { 2 2 T ?+?( T,T ); 3 3 T ?=?( T*, T); 4 4 }; 5 5 6 otype List1( T | addable( T ) ) = struct { T data; List1( T ) *next; } *;6 otype List1( otype T | addable( T ) ) = struct { T data; List1( T ) *next; } *; 7 7 typedef List1( int ) ListOfIntegers; 8 8 //List1( int ) li; … … 11 11 [int] h( * List1( int ) p ); // new declaration syntax 12 12 13 struct( T ) S2 { T i; }; // actual definition13 struct( otype T ) S2 { T i; }; // actual definition 14 14 struct( int ) S3 v1, *p; // expansion and instantiation 15 struct( T )( int ) S24 { T i; } v2; // actual definition, expansion and instantiation16 struct( T )( int ) { T i; } v2; // anonymous actual definition, expansion and instantiation15 struct( otype T )( int ) S24 { T i; } v2; // actual definition, expansion and instantiation 16 struct( otype T )( int ) { T i; } v2; // anonymous actual definition, expansion and instantiation 17 17 18 struct( T | addable( T ) ) node { T data; struct( T ) node *next; };19 otype List( T ) = struct( T ) node *;18 struct( otype T | addable( T ) ) node { T data; struct( T ) node *next; }; 19 otype List( otype T ) = struct( T ) node *; 20 20 List( int ) my_list; 21 21 -
tests/zombies/withStatement.cfa
rc08c3cf r467c8b7 54 54 } 55 55 56 forall( T )56 forall( otype T ) 57 57 struct Box { 58 58 T x; 59 59 }; 60 60 61 forall( T )61 forall( otype T ) 62 62 void ?{}( Box(T) & this ) with( this ) { // with clause in polymorphic function 63 63 x{}; … … 66 66 void print( int i ) { sout | i; } 67 67 68 forall( T | { void print( T ); })68 forall( otype T | { void print( T ); }) 69 69 void foo( T t ) { 70 70 Box( T ) b = { t }; -
tests/zombies/wrapper/src/pointer.h
rc08c3cf r467c8b7 8 8 // type safe malloc / free 9 9 10 forall( T)10 forall(otype T) 11 11 T* new() 12 12 { … … 16 16 } 17 17 18 forall( T)18 forall(otype T) 19 19 void delete(T* p) 20 20 {
Note:
See TracChangeset
for help on using the changeset viewer.