Main Page | Namespace List | Class Hierarchy | Compound List | File List | Namespace Members | Compound Members | File Members | Related Pages

CFunctionType.hh

Go to the documentation of this file.
00001 #ifndef RFL_CFUNCTIONTYPE_HH
00002 #define RFL_CFUNCTIONTYPE_HH
00003 /* C++ Reflection & Serice Library
00004  * Copyright (C) 2003  Marcus Perlick
00005  * mailto: riffraff@users.sf.net
00006  * 
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  * 
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00020  * USA
00021  *
00022  * This file is part of the "C++ Reflection & Serice Library" */
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 } // namespace rfl
00078 #endif // RFL_CFUNCTIONTYPE_HH

Generated on Thu Dec 18 11:32:54 2003 for Reflection&ServiceLibrary by doxygen 1.3.2