00001 #ifndef RFL_CFUNCTIONTYPE_HH
00002 #define RFL_CFUNCTIONTYPE_HH
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "FunctionType.hh"
00025
00026 namespace rfl {
00027
00028 class CFunctionType : public FunctionType {
00029 public:
00030
00031 CFunctionType( const Type& returnType ) :
00032 FunctionType( returnType )
00033 {}
00034
00035 void addArg( const Type& argumentType );
00036
00037 void vCall( void* retObj, void* fnPtr, va_list ap );
00038 void vaCall( void* retObj, void* fnPtr, ... );
00039
00040 template<typename InputIter>
00041 void call( void* retObj,
00042 void* fnPtr,
00043 InputIter begin, const InputIter& end );
00044
00045 virtual void avStartCall( av_alist& avList,
00046 void* fnPtr,
00047 void *retVal ) const;
00048
00049 virtual void avPutArg( av_alist& avList, void* arg ) const;
00050
00051 virtual const Type& getElmType( std::size_t idx ) const;
00052 virtual void* getElmAddr( void* obj, std::size_t idx ) const;
00053 };
00054
00055 template<typename InputIter>
00056 void
00057 CFunctionType::call( void* retObj,
00058 void* fnPtr,
00059 InputIter begin, const InputIter& end )
00060 {
00061 av_alist fnCall;
00062
00063 assert( ret_ != 0 );
00064 ret_->avStartCall( fnCall, fnPtr, retObj );
00065
00066 unsigned int i = 0;
00067 while ( begin != end ) {
00068 assert( i < argv_.size() );
00069 argv_[ i ]->avPutArg( fnCall, *begin );
00070 ++begin;
00071 i++;
00072 }
00073
00074 av_call( fnCall );
00075 }
00076
00077 }
00078 #endif // RFL_CFUNCTIONTYPE_HH