Mercurial > projects > dstress
diff run/mini/funcptr.d @ 1628:c6ef09dfba4d
add mini test set from ldc project
author | Moritz Warning <moritzwarning@web.de> |
---|---|
date | Mon, 10 Jan 2011 19:47:18 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/run/mini/funcptr.d Mon Jan 10 19:47:18 2011 +0100 @@ -0,0 +1,68 @@ +extern(C) int printf(char*, ...); + +int return_six() +{ + return 6; +} + +int add_int(int a, int b) +{ + return a+b; +} + +int sub_int(int a, int b) +{ + return a-b; +} + +alias int function(int,int) binfn_t; + +int binop_int(binfn_t op, int a, int b) +{ + return op(a,b); +} + +binfn_t get_binop_int(char op) +{ + binfn_t fn; + if (op == '+') + fn = &add_int; + else if (op == '-') + fn = &sub_int; + return fn; +} + +extern(C) float mul_float(float a, float b) +{ + return a * b; +} + +void function_pointers() +{ + int function() fn = &return_six; + assert(fn() == 6); + + binfn_t binfn = &add_int; + assert(binfn(4,1045) == 1049); + + assert(binop_int(binfn, 10,656) == 666); + + binfn = get_binop_int('+'); + assert(binop_int(binfn, 10,100) == 110); + binfn = get_binop_int('-'); + assert(binop_int(binfn, 10,100) == -90); + + { + auto ffn = &mul_float; + float ftmp = mul_float(2.5,5); + assert(ftmp == 12.5); + assert(ftmp > 12.49 && ftmp < 12.51); + } +} + +void main() +{ + printf("Function pointer test\n"); + function_pointers(); + printf(" SUCCESS\n"); +}