<div dir="ltr"><div>[An answer to my own posting - I hope this is helpful for others with similar problems]<br></div><div><br></div><div>Hi,</div><div><br></div><div>Here how I finally solved the problem and wrapped the C++ class (sorry for the long delay):</div>
<div><br></div><div>The C++ class:</div><div><br></div><div>---</div><div>/*</div><div>  Cube.h, Dietrich Bollmann, Kamakura 2013/06/15</div><div>*/ </div><div><br></div><div>#ifndef CUBE_H</div><div>#define CUBE_H</div><div>
<br></div><div>class Cube {</div><div>private:</div><div>  double _size;</div><div>public:</div><div>  Cube();</div><div>  Cube(const double size);</div><div>  void setSize(const double size);</div><div>  double getSize() const;</div>
<div>};</div><div><br></div><div>#endif</div><div><br></div><div>// fin.</div><div>---</div><div><br></div><div>and</div><div><br></div><div>---</div><div>/*</div><div>  Cube.cpp, Dietrich Bollmann, Kamakura 2013/06/15</div>
<div>*/ </div><div><br></div><div>#include "StdAfx.h"</div><div>#include "Cube.h"</div><div><br></div><div>#include <iostream></div><div><br></div><div>using namespace std;</div><div><br></div><div>
Cube::Cube(): _size(1.0) {}</div><div>Cube::Cube(const double size): _size(size) {}</div><div><br></div><div>void Cube::setSize(const double size) { _size = size; }</div><div>double Cube::getSize() const { return _size; }</div>
<div><br></div><div>// fin.</div><div>---</div><div><br></div><div>Here the lisp wrapper:</div><div><br></div><div>---</div><div>(defclass cube ()</div><div>  ((c++-instance</div><div>   :initarg :c++-instance</div><div>   :reader c++-instance)))</div>
<div><br></div><div>(defun finalize-cube (cube)</div><div>  (format t "~&;;; [DEBUG] Deleting C++ Cube instance ~a~%" (c++-instance cube))</div><div>  (ffi:c-inline ((c++-instance cube)) (:pointer-void) :void "delete ((Cube*) #0)" :one-liner t))</div>
<div><br></div><div>(defmethod initialize-instance :before ((cube cube) &rest args)</div><div>  (declare (ignore args))</div><div>  (ext:set-finalizer cube #'finalize-cube))</div><div><br></div><div>(defun make-cube (&key (size 1.0))</div>
<div>  (let ((c++-instance (ffi:c-inline (size) (:double) :pointer-void "new Cube(#0)" :one-liner t)))</div><div>    (make-instance 'cube :c++-instance c++-instance)))</div><div><br></div><div>(defmethod get-size ((cube cube))</div>
<div>  (ffi:c-inline ((c++-instance cube)) (:pointer-void) :double "((Cube*) #0)->getSize()" :one-liner t))</div><div><br></div><div>(defmethod set-size ((cube cube) size)</div><div>  (ffi:c-inline ((c++-instance cube) size) (:pointer-void :double) :void "((Cube*) #0)->setSize(#1)" :one-liner t))</div>
<div>---</div><div><br></div><div>Testing the CLOS wrapper for the C++ 'Cube':</div><div><br></div><div>---</div><div>;;; A fist cube:</div><div>(setf cube (make-cube))</div><div>(format t "instance: ~a~%" (c++-instance cube))</div>
<div>(format t "size: ~a~%" (get-size cube))</div><div>(set-size cube 2)</div><div>(format t "new size: ~a~%" (get-size cube))</div><div><br></div><div>;;; Deleting the reference to the first cube instance:</div>
<div>(setf cube nil)</div><div><br></div><div>;;; Experimenting with a second cube instance:</div><div>(setf cube (make-cube :size 3))</div><div>(format t "size: ~a~%" (get-size cube))</div><div><br></div><div>;;; Deleting the reference to the second cube instance</div>
<div>(setf cube nil)</div><div><br></div><div>;;; Waiting 3 seconds</div><div>(loop for i from 1 to 3 do (format t ".") (sleep 1) finally (format t "~%"))</div><div><br></div><div>;;; Initiating the garbage collector:</div>
<div>(si::gc t)</div><div>---</div><div><br></div><div>And here the protocol:</div><div><br></div><div>---</div><div>instance: #<foreign VOID></div><div>size: 1.0d0</div><div>new size: 2.0d0</div><div>size: 3.0d0</div>
<div>...</div><div>;;; [DEBUG] Deleting C++ Cube instance #<foreign VOID></div><div>;;; [DEBUG] Deleting C++ Cube instance #<foreign VOID></div><div>---</div><div><br></div><div>I hope this is helpful, all the best,</div>
<div><br></div><div>Dietrich</div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 11, 2013 at 12:05 PM, Juan Jose Garcia-Ripoll <span dir="ltr"><<a href="mailto:juanjose.garciaripoll@gmail.com" target="_blank">juanjose.garciaripoll@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 10, 2013 at 7:57 PM, Dietrich Bollmann <span dir="ltr"><<a href="mailto:dietrich@formgames.org" target="_blank">dietrich@formgames.org</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>So concerning the simple C++ example I gave before in this thread, which FFI version do you advice me to use? Which one is easier to use for wrapping a whole C++ API?</div>


</blockquote><div><br></div><div>ECL's with embedded C++ code.</div><div class="im"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Which one would result in the faster code?</div>


</blockquote><div><br></div></div><div>Definitely embedding C++ code because the CFFI/UFFI wrappers are not always optimal.</div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div>Blender 3D generates their Python API mostly automatically from the C and C++ sources.  Is something like this thinkable with ECL? </div></blockquote><div><br></div></div><div>I do not know how Blender does it. Even the most sophisticated approach discussed here in the mailing list and based on Boost's template library for Python demands hand-writing the wrapper declarations.</div>


</div><div class="gmail_extra"><br></div>Juanjo<div class="im"><br clear="all"><div><br></div>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br><a href="http://juanjose.garciaripoll.googlepages.com" target="_blank">http://juanjose.garciaripoll.googlepages.com</a>
</div></div></div>
</blockquote></div><br></div>