Executors.h

Go to the documentation of this file.
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

Generated on Tue Jul 5 14:10:12 2011 for ROOT_528-00b_version by  doxygen 1.5.1