00001 // @(#)root/pyroot:$Id: Executors.h 35619 2010-09-23 00:48:33Z wlav $ 00002 // Author: Wim Lavrijsen, Jan 2005 00003 #ifndef PYROOT_EXECUTORS_H 00004 #define PYROOT_EXECUTORS_H 00005 00006 // ROOT 00007 #include "DllImport.h" 00008 #include "TClassRef.h" 00009 00010 // CINT 00011 namespace Cint { 00012 class G__CallFunc; 00013 } 00014 using namespace Cint; 00015 00016 // Standard 00017 #include <string> 00018 #include <map> 00019 00020 00021 namespace PyROOT { 00022 00023 /** Executors of CINT calls and conversions back to python 00024 @author WLAV 00025 @date 01/27/2005 00026 @version 1.0 00027 */ 00028 00029 class TExecutor { 00030 public: 00031 virtual ~TExecutor() {} 00032 virtual PyObject* Execute( G__CallFunc*, void* ) = 0; 00033 }; 00034 00035 #define PYROOT_DECLARE_BASIC_EXECUTOR( name ) \ 00036 class T##name##Executor : public TExecutor { \ 00037 public: \ 00038 virtual PyObject* Execute( G__CallFunc*, void* ); \ 00039 } 00040 00041 // executors for built-ins 00042 PYROOT_DECLARE_BASIC_EXECUTOR( Bool ); 00043 PYROOT_DECLARE_BASIC_EXECUTOR( Long ); 00044 PYROOT_DECLARE_BASIC_EXECUTOR( Char ); 00045 PYROOT_DECLARE_BASIC_EXECUTOR( Int ); 00046 PYROOT_DECLARE_BASIC_EXECUTOR( ULong ); 00047 PYROOT_DECLARE_BASIC_EXECUTOR( LongLong ); 00048 PYROOT_DECLARE_BASIC_EXECUTOR( ULongLong ); 00049 PYROOT_DECLARE_BASIC_EXECUTOR( Double ); 00050 PYROOT_DECLARE_BASIC_EXECUTOR( Void ); 00051 PYROOT_DECLARE_BASIC_EXECUTOR( CString ); 00052 00053 // pointer/array executors 00054 PYROOT_DECLARE_BASIC_EXECUTOR( VoidArray ); 00055 PYROOT_DECLARE_BASIC_EXECUTOR( ShortArray ); 00056 PYROOT_DECLARE_BASIC_EXECUTOR( UShortArray ); 00057 PYROOT_DECLARE_BASIC_EXECUTOR( IntArray ); 00058 PYROOT_DECLARE_BASIC_EXECUTOR( UIntArray ); 00059 PYROOT_DECLARE_BASIC_EXECUTOR( LongArray ); 00060 PYROOT_DECLARE_BASIC_EXECUTOR( ULongArray ); 00061 PYROOT_DECLARE_BASIC_EXECUTOR( FloatArray ); 00062 PYROOT_DECLARE_BASIC_EXECUTOR( DoubleArray ); 00063 00064 // special cases 00065 PYROOT_DECLARE_BASIC_EXECUTOR( STLString ); 00066 PYROOT_DECLARE_BASIC_EXECUTOR( TGlobal ); 00067 00068 class TRootObjectExecutor : public TExecutor { 00069 public: 00070 TRootObjectExecutor( const TClassRef& klass ) : fClass( klass ) {} 00071 virtual PyObject* Execute( G__CallFunc*, void* ); 00072 00073 protected: 00074 TClassRef fClass; 00075 }; 00076 00077 class TRootObjectByValueExecutor : public TRootObjectExecutor { 00078 public: 00079 TRootObjectByValueExecutor( const TClassRef& klass ) : TRootObjectExecutor ( klass ) {} 00080 virtual PyObject* Execute( G__CallFunc*, void* ); 00081 }; 00082 00083 PYROOT_DECLARE_BASIC_EXECUTOR( Constructor ); 00084 PYROOT_DECLARE_BASIC_EXECUTOR( PyObject ); 00085 00086 class TRefExecutor : public TExecutor { 00087 public: 00088 TRefExecutor() : fAssignable( 0 ) {} 00089 00090 public: 00091 virtual Bool_t SetAssignable( PyObject* ); 00092 00093 protected: 00094 PyObject* fAssignable; 00095 }; 00096 00097 #define PYROOT_DECLARE_BASIC_REFEXECUTOR( name ) \ 00098 class T##name##RefExecutor : public TRefExecutor { \ 00099 public: \ 00100 virtual PyObject* Execute( G__CallFunc*, void* ); \ 00101 } 00102 00103 PYROOT_DECLARE_BASIC_REFEXECUTOR( Short ); 00104 PYROOT_DECLARE_BASIC_REFEXECUTOR( UShort ); 00105 PYROOT_DECLARE_BASIC_REFEXECUTOR( Int ); 00106 PYROOT_DECLARE_BASIC_REFEXECUTOR( UInt ); 00107 PYROOT_DECLARE_BASIC_REFEXECUTOR( Long ); 00108 PYROOT_DECLARE_BASIC_REFEXECUTOR( ULong ); 00109 PYROOT_DECLARE_BASIC_REFEXECUTOR( Float ); 00110 PYROOT_DECLARE_BASIC_REFEXECUTOR( Double ); 00111 PYROOT_DECLARE_BASIC_REFEXECUTOR( STLString ); 00112 00113 // special cases 00114 class TRootObjectRefExecutor : public TRefExecutor { 00115 public: 00116 TRootObjectRefExecutor( const TClassRef& klass ) : fClass( klass ) {} 00117 virtual PyObject* Execute( G__CallFunc*, void* ); 00118 00119 protected: 00120 TClassRef fClass; 00121 }; 00122 00123 // factories 00124 typedef TExecutor* (*ExecutorFactory_t) (); 00125 typedef std::map< std::string, ExecutorFactory_t > ExecFactories_t; 00126 R__EXTERN ExecFactories_t gExecFactories; 00127 00128 // create executor from fully qualified type 00129 TExecutor* CreateExecutor( const std::string& fullType ); 00130 00131 } // namespace PyROOT 00132 00133 #endif // !PYROOT_EXECUTORS_H