// @(#)root/pyroot:$Id$
// Author: Wim Lavrijsen, Aug 2013

// Bindings
#include "PyROOT.h"
#include "TPyArg.h"

// ROOT
#include "TObject.h"


//______________________________________________________________________________
//                        Generic wrapper for arguments
//                        =============================
//
// Transport class for bringing C++ values and objects from Cling to Python. It
// provides, from the selected constructor, the proper conversion to a PyObject.
// In principle, there should be no need to use this class directly: it relies
// on implicit conversions.


//- data ---------------------------------------------------------------------
ClassImp(TPyArg)

//- constructor dispatcher ---------------------------------------------------
void TPyArg::CallConstructor( PyObject*& pyself, PyObject* pyclass, const std::vector<TPyArg>& args )
{
   int nArgs = args.size();
   PyObject* pyargs = PyTuple_New( nArgs );
   for ( int i = 0; i < nArgs; ++i )
      PyTuple_SET_ITEM( pyargs, i, (PyObject*)args[i] );
   pyself = PyObject_Call( pyclass, pyargs, NULL );
   Py_DECREF( pyargs );
}

//____________________________________________________________________________
void CallConstructor( PyObject*& pyself, PyObject* pyclass )
{
   PyObject* pyargs = PyTuple_New( 0 );
   pyself = PyObject_Call( pyclass, pyargs, NULL );
   Py_DECREF( pyargs );
}

//- generic dispatcher -------------------------------------------------------
PyObject* TPyArg::CallMethod( PyObject* pymeth, const std::vector<TPyArg>& args )
{
   int nArgs = args.size();
   PyObject* pyargs = PyTuple_New( nArgs );
   for ( int i = 0; i < nArgs; ++i )
      PyTuple_SET_ITEM( pyargs, i, (PyObject*)args[i] );
   PyObject* result = PyObject_Call( pymeth, pyargs, NULL );
   Py_DECREF( pyargs );
   return result;
}

//- constructors/destructor --------------------------------------------------
TPyArg::TPyArg( PyObject* pyobject )
{
// Construct a TPyArg from a python object.
   Py_XINCREF( pyobject );
   fPyObject = pyobject;
}

//____________________________________________________________________________
TPyArg::TPyArg( Int_t value )
{
// Construct a TPyArg from an integer value.
   fPyObject = PyInt_FromLong( value );
}

//____________________________________________________________________________
TPyArg::TPyArg( Long_t value )
{
// Construct a TPyArg from an integer value.
   fPyObject = PyLong_FromLong( value );
}

//____________________________________________________________________________
TPyArg::TPyArg( Double_t value )
{
// Construct a TPyArg from a double value.
   fPyObject = PyFloat_FromDouble( value );
}

//____________________________________________________________________________
TPyArg::TPyArg( const char* value )
{
// Construct a TPyArg from a C-string.
   fPyObject = PyROOT_PyUnicode_FromString( value );
}

//____________________________________________________________________________
TPyArg::TPyArg( const TPyArg& s )
{
// Copy constructor.
   Py_XINCREF( s.fPyObject );
   fPyObject = s.fPyObject;
}

//____________________________________________________________________________
TPyArg& TPyArg::operator=( const TPyArg& s )
{
// Assignment operator.
   if ( &s != this ) {
      Py_XINCREF( s.fPyObject );
      fPyObject = s.fPyObject;
   }
   return *this;
}

//____________________________________________________________________________
TPyArg::~TPyArg()
{
// Done with held PyObject.
   Py_XDECREF( fPyObject );
   fPyObject = NULL;
}

//- public members -----------------------------------------------------------
TPyArg::operator PyObject*() const
{
// Extract the python object.
   Py_XINCREF( fPyObject );
   return fPyObject;
}
 TPyArg.cxx:1
 TPyArg.cxx:2
 TPyArg.cxx:3
 TPyArg.cxx:4
 TPyArg.cxx:5
 TPyArg.cxx:6
 TPyArg.cxx:7
 TPyArg.cxx:8
 TPyArg.cxx:9
 TPyArg.cxx:10
 TPyArg.cxx:11
 TPyArg.cxx:12
 TPyArg.cxx:13
 TPyArg.cxx:14
 TPyArg.cxx:15
 TPyArg.cxx:16
 TPyArg.cxx:17
 TPyArg.cxx:18
 TPyArg.cxx:19
 TPyArg.cxx:20
 TPyArg.cxx:21
 TPyArg.cxx:22
 TPyArg.cxx:23
 TPyArg.cxx:24
 TPyArg.cxx:25
 TPyArg.cxx:26
 TPyArg.cxx:27
 TPyArg.cxx:28
 TPyArg.cxx:29
 TPyArg.cxx:30
 TPyArg.cxx:31
 TPyArg.cxx:32
 TPyArg.cxx:33
 TPyArg.cxx:34
 TPyArg.cxx:35
 TPyArg.cxx:36
 TPyArg.cxx:37
 TPyArg.cxx:38
 TPyArg.cxx:39
 TPyArg.cxx:40
 TPyArg.cxx:41
 TPyArg.cxx:42
 TPyArg.cxx:43
 TPyArg.cxx:44
 TPyArg.cxx:45
 TPyArg.cxx:46
 TPyArg.cxx:47
 TPyArg.cxx:48
 TPyArg.cxx:49
 TPyArg.cxx:50
 TPyArg.cxx:51
 TPyArg.cxx:52
 TPyArg.cxx:53
 TPyArg.cxx:54
 TPyArg.cxx:55
 TPyArg.cxx:56
 TPyArg.cxx:57
 TPyArg.cxx:58
 TPyArg.cxx:59
 TPyArg.cxx:60
 TPyArg.cxx:61
 TPyArg.cxx:62
 TPyArg.cxx:63
 TPyArg.cxx:64
 TPyArg.cxx:65
 TPyArg.cxx:66
 TPyArg.cxx:67
 TPyArg.cxx:68
 TPyArg.cxx:69
 TPyArg.cxx:70
 TPyArg.cxx:71
 TPyArg.cxx:72
 TPyArg.cxx:73
 TPyArg.cxx:74
 TPyArg.cxx:75
 TPyArg.cxx:76
 TPyArg.cxx:77
 TPyArg.cxx:78
 TPyArg.cxx:79
 TPyArg.cxx:80
 TPyArg.cxx:81
 TPyArg.cxx:82
 TPyArg.cxx:83
 TPyArg.cxx:84
 TPyArg.cxx:85
 TPyArg.cxx:86
 TPyArg.cxx:87
 TPyArg.cxx:88
 TPyArg.cxx:89
 TPyArg.cxx:90
 TPyArg.cxx:91
 TPyArg.cxx:92
 TPyArg.cxx:93
 TPyArg.cxx:94
 TPyArg.cxx:95
 TPyArg.cxx:96
 TPyArg.cxx:97
 TPyArg.cxx:98
 TPyArg.cxx:99
 TPyArg.cxx:100
 TPyArg.cxx:101
 TPyArg.cxx:102
 TPyArg.cxx:103
 TPyArg.cxx:104
 TPyArg.cxx:105
 TPyArg.cxx:106
 TPyArg.cxx:107
 TPyArg.cxx:108
 TPyArg.cxx:109
 TPyArg.cxx:110
 TPyArg.cxx:111
 TPyArg.cxx:112
 TPyArg.cxx:113
 TPyArg.cxx:114
 TPyArg.cxx:115
 TPyArg.cxx:116
 TPyArg.cxx:117
 TPyArg.cxx:118
 TPyArg.cxx:119
 TPyArg.cxx:120
 TPyArg.cxx:121
 TPyArg.cxx:122
 TPyArg.cxx:123
 TPyArg.cxx:124
 TPyArg.cxx:125