[C++-sig] automatic conversion of boost date_time to Python date

Quant Mind quant.mind at gmail.com
Wed Apr 11 17:56:38 CEST 2007


OK, I managed to have this working, see the attached file.
Is this the correct way of doing it? Especially in the static member
"construct" of struct "DateFromPy".
Thank You
Luca

On 10/04/07, Luca Sbardella <luca.sbardella at gmail.com> wrote:
>
> sorry missing
>
> typedef  boost::gregorian::date  qm_date
>
> in the code
>
>
>
>
> On 10/04/07, Luca Sbardella < luca.sbardella at gmail.com> wrote:
> >
> > Thanks Roman, it was useful, however I'm getting some specific problem
> > in the implementation (I cannot debug the code since I cannot load the
> > PyDateTime static library).  the Python documentation says I should declare
> > PyDateTime_IMPORT but this does not compile!!!!
> > Still trying at the moment but this is what I have done, any comment
> > would be welcome.
> > Best
> > Luca
> >
> >
> >     template<class T, class TfromPy>
> >     struct ObjFromPy
> >     {
> >       ObjFromPy()
> >       {
> >
> > boost::python::converter::registry::push_back(&TfromPy::convertible,
> >
> >                                  &TfromPy::construct,
> >
> >               boost::python::type_id<T>());
> >       }
> >     };
> >     //
> >     template<class T, class TtoPy, class TfromPy>
> >     struct register_python_conversion
> >     {
> >       register_python_conversion()
> >       {
> >         boost::python::to_python_converter<T,TtoPy>();
> >         ObjFromPy<T,TfromPy>();
> >       }
> >     };
> >     //
> >     // IMPLEMENTATION
> >     //
> >     struct DateToPy
> >     {
> >       static PyObject* convert(const qm_date& dte)
> >       {
> >         return PyDate_FromDate( dte.year(), dte.month(), dte.day());
> >       }
> >     };
> >     //
> >     struct DateFromPy
> >     {
> >       //
> >       static void* convertible(PyObject* obj_ptr)
> >       {
> >         if(!PyDate_Check(obj_ptr)) return 0;
> >         return obj_ptr;
> >       }
> >       //
> >       static void construct(PyObject* obj_ptr,
> >
> > boost::python::converter::rvalue_from_python_stage1_data* data)
> >       {
> >         int y = PyDateTime_GET_YEAR(obj_ptr);
> >         int m = PyDateTime_GET_MONTH(obj_ptr);
> >         int d = PyDateTime_GET_DAY(obj_ptr);
> >         qm_date* dte = new qm_date(y,m,d);
> >         data->convertible = (void*)dte;
> >       }
> >     };
> >     //
> >     //
> >     typedef register_python_conversion<qm_date, DateToPy, DateFromPy>
> > date_python_conversion;
> >     //
> >
> > On 10/04/07, Roman Yakovenko <roman.yakovenko at gmail.com> wrote:
> >
> > >  On 4/10/07, Quant Mind <quant.mind at gmail.com > wrote:
> > >
> > > > Here is the problem.
> > > > I'm using boost date_time library for a calendar C++ application. I
> > > > exposed my C++ Calendar class to Python using boost python and everything is
> > > > going smoothly.
> > > > The class contains several functions which have
> > > > boost::gregorian::date as arguments.
> > > > Obviously, this class is not know to Python and I would like to
> > > > implement a custom converter between boost::gregorian::date and Python
> > > > datetime.date.
> > > > What would be the correct way to deal with this problem?
> > >
> > >
> > > Let me know if next link helped you: http://language-binding.net/pyplusplus/troubleshooting_guide/automatic_conversion/automatic_conversion.html
> > >
> > >
> > >
> > > --
> > > Roman Yakovenko
> > > C++ Python language binding
> > > http://www.language-binding.net/
> > > _______________________________________________
> > > C++-sig mailing list
> > > C++-sig at python.org
> > > http://mail.python.org/mailman/listinfo/c++-sig
> > >
> > >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20070411/99057aff/attachment.htm>
-------------- next part --------------
    
    typedef boost::gregorian::date  qm_date;    


    template<class T, class TfromPy>
    struct ObjFromPy
    {
      ObjFromPy()
      {
        boost::python::converter::registry::push_back(&TfromPy::convertible,
                                                      &TfromPy::construct,
                                                       boost::python::type_id<T>());
      }
    };

    template<class T, class TtoPy, class TfromPy>
    struct register_python_conversion
    {
      register_python_conversion()
      {
        boost::python::to_python_converter<T,TtoPy>();
        ObjFromPy<T,TfromPy>();
      }
    };


    //	IMPLEMENTATION

	
    struct DateToPy
    {
      static PyObject* convert(const qm_date& dte)
      {
        PyDateTime_IMPORT;
        return PyDate_FromDate(dte.year(), dte.month(), dte.day());
      }
    };

	
    struct DateFromPy
    {
      //
      static void* convertible(PyObject* obj_ptr)
      {
        PyDateTime_IMPORT;
        if(PyDate_Check(obj_ptr) || PyDateTime_Check(obj_ptr)) return obj_ptr;
        return 0;
      }
      //
      static void construct(PyObject* obj_ptr,
                            boost::python::converter::rvalue_from_python_stage1_data* data)
      {
        PyDateTime_IMPORT;
        int y = PyDateTime_GET_YEAR(obj_ptr);
        int m = PyDateTime_GET_MONTH(obj_ptr);
        int d = PyDateTime_GET_DAY(obj_ptr);
        qm_date* dte = new qm_date(y,m,d);
        data->convertible = (void*)dte;
      }
    };

    typedef register_python_conversion<qm_date, DateToPy, DateFromPy>  date_python_conversion;


More information about the Cplusplus-sig mailing list