fadapter.h revision e46c9386c4f79aa40185f79a19fc5b2a7ef528b3
1#ifndef _fadapter_h_ 2#define _fadapter_h_ 3 4#include <functional> 5 6// used as adaptor's return/argument type, 7// to allow binders/composers usage 8struct __void_tag {}; 9 10#if !defined (STLPORT) || defined (_STLP_USE_NAMESPACES) 11using std::unary_function; 12#endif 13 14template <class Result> 15class pointer_to_void_function { 16protected: 17 Result (*ptr)(); 18public: 19 explicit pointer_to_void_function(Result (*x)()) : ptr(x) {} 20 Result operator()() const { return ptr(); } 21 Result operator()(__void_tag) const { return ptr(); } 22}; 23 24// to feed composers 25template <class Arg1> 26struct projectvoid : public unary_function<Arg1,__void_tag> { 27 __void_tag operator()(const Arg1& x) const { return __void_tag(); } 28}; 29 30#if !defined (_STLP_MEMBER_POINTER_PARAM_BUG) 31 32template <class Result> 33pointer_to_void_function<Result> ptr_fun(Result (*x)()) { 34 return pointer_to_void_function<Result>(x); 35} 36 37// alternate name 38template <class Result> 39pointer_to_void_function<Result> ptr_gen(Result (*x)()) { 40 return pointer_to_void_function<Result>(x); 41} 42 43#endif /* !defined (_STLP_MEMBER_POINTER_PARAM_BUG) */ 44 45template <class Arg> 46class pointer_to_unary_procedure /* :public unary_function<Arg, __void_tag> */ { 47protected: 48 typedef void (*fun_type)(Arg); 49 fun_type ptr; 50public: 51 typedef Arg argument_type; 52 pointer_to_unary_procedure() {} 53 pointer_to_unary_procedure(fun_type x) : ptr(x) {} 54 void operator() (Arg x) const { ptr(x); } 55}; 56 57template <class Arg> 58inline pointer_to_unary_procedure<Arg> ptr_proc(void (*x)(Arg)) { 59 return pointer_to_unary_procedure<Arg>(x); 60} 61 62template <class Arg1, class Arg2> 63class pointer_to_binary_procedure /* : public unary_function<Arg1, Arg2, __void_tag> */ { 64protected: 65 typedef void (*fun_type)(Arg1, Arg2); 66 fun_type ptr; 67public: 68 typedef Arg1 first_argument_type; 69 typedef Arg2 second_argument_type; 70 pointer_to_binary_procedure() {} 71 pointer_to_binary_procedure(fun_type x) : ptr(x) {} 72 void operator() (Arg1 x, Arg2 y) const { ptr(x, y); } 73}; 74 75template <class Arg1, class Arg2> 76inline pointer_to_binary_procedure<Arg1, Arg2> ptr_proc(void (*x)(Arg1, Arg2)) { 77 return pointer_to_binary_procedure<Arg1, Arg2>(x); 78} 79 80#endif 81