From: William S F. <ws...@fu...> - 2008-11-03 22:50:06
|
Sorry for the hastily written email, I did indeed mean -E. William Gerwin de Haan wrote: > William, thanks for your response. We mainly focus on Python, so this > is my target for now. I'm a bit puzzled by your remark on running SWIG > -i on std_vector.i , as I cannot find anything on the "-i" parameter. > I did look at what the -E (preprocessing only) returns. I will try > some of the copy/paste actions you suggest and see how far this brings > me. > Gerwin > > > On Sat, Nov 1, 2008 at 10:43 PM, William S Fulton > <ws...@fu...> wrote: >> Gerwin de Haan wrote: >>> Dear list, >>> >>> For a while I have been working on SWIG wrappings for the >>> OpenSceneGraph graphics library. In a newer revision of this library, >>> some functionality involving std::vector was changed (a MixinVector >>> class was introduced which mimics the interface of std::vector). >>> Question in short: Does anyone have experience in wrapping classes >>> that "derive" from std::vector (or classes with similiar style)? Can >>> I apply "macros" that are used to wrap std_vector.i on other/derived >>> classes directly? >>> If this triggers anything, please read on for an extended description >>> of my problem. >>> >>> >>> >>> Before, I was happily using the std_vector.i constructions to allow >>> direct access to std::vector types, e.g. I could use arrays of the >>> Vec2 type: >>> >>> --- osg C++ --- >>> template<typename T, Array::Type ARRAYTYPE, int DataSize, int DataType> >>> class TemplateArray : public Array, public std::vector<T> >>> {...} >>> --- SWIG --- >>> %template(vectorVec2) std::vector<osg::Vec2>; >>> %template(Vec2Array) >>> osg::TemplateArray<osg::Vec2,osg::Array::Vec2ArrayType,2,GL_FLOAT>; >>> --- Python --- >>> v2a = osg.Vec2Array() >>> v2a.push_back(osg.Vec2(1,2)) >>> >>> In the newer revision of OpenSceneGraph, a MixinVector class was >>> introduced which mimics the interface of std::vector by passing almost >>> all functionality to a std::vector member. >>> >>> --- osg C++ --- >>> template<typename T, Array::Type ARRAYTYPE, int DataSize, int DataType> >>> class TemplateArray : public Array, public MixinVector<T> >>> {...} >>> template<class ValueT> >>> class MixinVector >>> { >>> typedef typename std::vector<ValueT> vector_type; >>> public: >>> typedef typename vector_type::allocator_type allocator_type; >>> typedef typename vector_type::value_type value_type; >>> const_reference operator[](size_type index) const { return >>> _impl[index]; } >>> reference operator[](size_type index) { return _impl[index]; } >>> const_reference at(size_type index) const { return _impl.at(index); } >>> ...} >>> --- SWIG ---- >>> %template(mixinVectorVec2) osg::MixinVector<osg::Vec2>;, >>> >>> After SWIGging, the compiler complains a lot, mainly at >>> const_reference functions and operators: >>> python/osgPYTHON_wrap.cxx: In function \u2018PyObject* >>> _wrap_mixinVectorVec2_at__SWIG_0(PyObject*, PyObject*) >>> python/osgPYTHON_wrap.cxx:166534: error: \u2018result\u2019 declared >>> as reference but not initialized >>> python/osgPYTHON_wrap.cxx:166563: error: passing \u2018const >>> osg::Vec2f\u2019 as \u2018this\u2019 argument of \u2018osg::Vec2f& >>> osg::Vec2f::operator=(const osg::Vec2f&)\u2019 discards qualifiers >>> python/osgPYTHON_wrap.cxx:166574: error: cannot declare reference to >>> const class osg::Vec2f& >>> python/osgPYTHON_wrap.cxx:166574: error: new cannot be applied to a >>> reference type >>> python/osgPYTHON_wrap.cxx:166574: error: invalid conversion from const >>> void* to void* >>> python/osgPYTHON_wrap.cxx:166574: error: initializing argument 1 of >>> PyObject* SWIG_Python_NewPointerObj(void*, swig_type_info*, int) >>> ... >>> >>> As this new MixinVector class is so similar to std::vector, I was >>> hoping this could be solved "elegantly": >>> I was wondering if anyone has experience in wrapping classes that >>> "derive" from std::vector (or classes with similiar style)? >>> Should I manually remove/fix the const problems or can I reuse some of >>> the std_vector.i present in SWIG? >>> Or, can I apply "macros" that are used to wrap std_vector.i on >>> other/derived classes directly? >>> >>> any thoughts are welcome, >>> Gerwin >>> code.google.com/p/osgswig >> From your link above you are supporting Python, Ruby, Java and Lua. The >> std::vector library files are quite different for each and support different >> aspects of std::vector. Replicating all could be quite hard unless you just >> do a copy paste kind of approach of the SWIG std::vector library for each of >> these target languages. The easiest is probably to run SWIG -i on >> std_vector.i and copy paste and change std to osg and vector to MixinVector. >> You'll see that there is a lot of code developed for some of these target >> languages and you could provide a much simpler cut down api, something >> similar to the Java approach, see Lib/java/std_vector.i. >> >> William >> > |