6. Encapsulating DbU

While Hurricane::DbU is a class, the Hurricane::DbU::Unit is only a typedef over uint64_t. The DbU class only provides a set of static methods to manipulate and convert to and from other units. At Python level, DbU::Unit will be stored in plain long long.

When a DbU::Unit argument is expected in a Python functions, just use the DbU::Unit  PyAny_AsLong( PyObject* ) function to convert it.

For example, if we explicit the expension of:

DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point)

We would get:

static PyObject* PyPoint_setX ( PyPoint *self, PyObject* args )
{
  Point* cobject = static_cast<Point*>( self->_object );
  if (cobject == NULL) {
    PyErr_SetString( ProxyError
                   , "Attempt to call Point.setX() on an unbound Hurricane object" );
    return NULL;
  }

  HTRY
    PyObject* arg0 = NULL;
    if (not PyArg_ParseTuple( args, "O:Point.setX()", &arg0 ))
      return ( NULL );
    cobject->setX( Isobar::PyAny_AsLong(arg0) );
  HCATCH
  Py_RETURN_NONE;
}

For the other way around, use PyObject* PyDbU_FromLong( DbU::Unit ).

DirectGetLongAttribute(PyPoint_GetX,getX,PyPoint,Point)

We would get:

static PyObject* PyPoint_GetX ( PyPoint *self, PyObject* args )
{
  Point* cobject = static_cast<Point*>( self->_object );
  if (cobject == NULL) {
    PyErr_SetString( ProxyError
                   , "Attempt to call Point.getX() on an unbound Hurricane object" );
    return NULL;
  }
  return Isobar::PyDbU_FromLong(cobject->getX());
}