[C++-sig] Raw constructor (i.e. combination of make_constructor and raw_function)
Hans Meine
meine at kogs1.informatik.uni-hamburg.de
Thu Aug 25 12:25:02 CEST 2005
On Thursday 25 August 2005 02:07, Ralf W. Grosse-Kunstleve wrote:
> I recommend against doing it that way. It is not compatible with the C++
> interface:
>
> std::vector<double> a(1, 2);
>
> initializes a vector of size 1 with a value of 2.
OK, you're right. I think it's a little bit misleading because I made up this
testcase. My original work was on a 'Pixel' class for images with possibly
multiple bands, so I like to write Pixel(red,green,blue) and not
Pixel([red,green,blue]).
> Here is a full wrapper which works that way:
>
> http://cvs.sourceforge.net/viewcvs.py/cctbx/scitbx/include/scitbx/stl/vecto
>r_wrapper.h?view=markup
Thanks. BTW: For another vector-like class (Polygons consisting of points), I
already chose your proposed interface. I tried vector_indexing_suite, but
it's __getitem__ was around 100 times(!) slower than that of a python Polygon
class storing a list of points! I found out that this is due to:
- the support for slices (probably not very much slower)
- the fact that python lists are optimized and already contain wrapped
objects, whereas boost::python has to wrap each return value
- the fact that vector_indexing_suite *proxies* the entries (IIUC, and then
this is surely the biggest slowdown).
Can you make a guess on the vector_wrapper performance in that respect?
(I can live with a *small* slowdown on __getitem__ which is evened out
elsewhere by much faster C++ algorithms like length() of a polygon.)
Thanks again for your scitbx-links, I will try them out for my next
vector-like class. Concerning my Pixel class, I will probably add some
__init__s of varying arity (up to e.g. 5) by hand.
--
Ciao, / /
/--/
/ / ANS
More information about the Cplusplus-sig
mailing list