opCast, c bindings and normal casts.

Johannes Pfau spam at example.com
Tue Jul 12 01:57:35 PDT 2011


Johannes Pfau wrote:
>Hi,
>
>I have a wrapper for a "object aware" c library (cairo). Take for
>example two classes, Surface and a subclass, ImageSurface. Now this
>code has to be valid:
>-----------------------
>auto ptr = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 512, 512);
>Surface s = new Surface(ptr);
>ImageSurface imgs = cast(ImageSurface)s;
>-----------------------
>
>As D cannot know that 's' really should be an ImageSurface, I have
>implemented opCast to get this example working:
>-----------------------
>class Surface
>{
>    static Surface castFrom(Surface other)
>    {
>        return other;
>    }
>    
>    T opCast(T)() if(isImplicitlyConvertible!(T, Surface))
>    {
>        return T.castFrom(this);
>    }
>}
>class ImageSurface : Surface
>{
>    static ImageSurface castFrom(Surface other)
>    {
>        auto type = cairo_surface_get_type(other.nativePointer);
>        if(type == cairo_surface_type_t.CAIRO_SURFACE_TYPE_IMAGE)
>        {
>            return new ImageSurface(other.nativePointer);
>        }
>        else
>            return null;
>    }
>}
>-----------------------
>
>This code works quite well. But it performs unnecessary calls to
>cairo_surface_get_type (and allocates unnecessary objects) for simple
>cases:
>-----------------------
>auto surface = new ImageSurface(Format.CAIRO_FORMAT_ARGB32, 400, 400);
>Surface tmp = cast(Surface)surface;
>ImageSurface test = cast(ImageSurface)as;
>-----------------------
>
>In this case, the first D object already is an ImageSurface so the
>custom opCast code isn't needed for the last line.
>
>So the question is: Is there some way to check in the opCast function
>if a normal D object cast would succeed and then just return it's
>result?
>

In case anyone's interested:
I think this could be done with _d_dynamic_cast from rt.cast_
(druntime).
I've dropped the opCast/castFrom approach though (not working in some
cases), so I haven't tested this.

-- 
Johannes Pfau



More information about the Digitalmars-d-learn mailing list