From: Zhong R. <re...@uc...> - 2007-05-16 17:27:45
|
OK. Thanks. Why should not this work? %rename(__pow__) operator->*;= Zhong ---- Original message ---- >Date: Wed, 16 May 2007 13:= 56:01 -0300 >From: gga <gg...@ad...> = >Subject: Re: [Swig-user] rename = >To: re...@uc..., swi...@li... > >Zhong Ren w= rote: >> I found several of my problems are due to that %rename and >>= %ignore do not work as I expected. My C++ code is below. Say >> I wa= nt to rename the function test to Test. These two worked: >> = >> %rename(Test) test; >> %rename(Test) test() const; > >And this sho= uld also work (and it is a tad safer, as only test within a >class wil= l match it): > >%rename(Test) *::test() const; > > >> = >> These do not work, and no error message either: >> = >> %rename(Test) vector::test; >> %rename(Test) vector<T>::test; >> %r= ename(Test) mac::vector<T>::test; >> %rename(Test) mac::vector<T>::test= (); >> %rename(Test) mac::vector<T>::test() const; > >These are proba= bly all correct. They should not work, unless they are >part of the t= emplate definition. No warnings or messages are given for >neither go= od or bad renames, currently. > >> %rename(Test) mac::vector<double>::= test; >> %rename(Test) mac::vector<double>::test() const; > >Assuming= of course you are doing %template(dvector) mac::vector<double>; >some= where, this is indeed a known bug. >It is a known bug in the current re= name matching for templates. Bug is, >basically, hashed renames are n= ot working on templates. The global >renames just happen to work main= ly due to a big hack in the source code, >which keeps the basic rename= around as the template is expanded. > >> = >> I would expect these should work: >> = >> %rename(Test) vector<T>::test; >> %rename(Test) mac::vector<T>::test= ; >> %rename(Test) mac::vector<T>::test() const; >> = >> Why not? >> = > >T is a template parameter, so it is unknown to the %rename directiv= e. >It will try to match, literally, just that, the letter T inside a = >vector, assuming T is a class type. > > >-- = >Gonzalo Garramu=F1o >gg...@ad... > >AMD4400 - ASUS48N-E= >GeForce7300GT >Kubuntu Edgy |
From: Zhong R. <re...@uc...> - 2007-05-16 17:53:38
|
Sure it is, according to my reference. Zhong ---- Original mes= sage ---- >Date: Wed, 16 May 2007 14:49:46 -0300 >From: gga <ggarra@ad= vancedsl.com.ar> = >Subject: Re: [Swig-user] rename = >To: re...@uc..., swi...@li... > >Zhong Ren w= rote: >> OK. Thanks. Why should not this work? >> = >> %rename(__pow__) operator->*; >> = > >AFAIK, that's not a valid C++ operator. You probably mean either: > >operator->() // pointer operator > >or: > >operator*() // m= ultiplication/dereference > >There's no power function operator in C/C= ++ ( the pow() function is used >instead ). > > > >-- = >Gonzalo Garramu=F1o >gg...@ad... > >AMD4400 - ASUS48N-E= >GeForce7300GT >Kubuntu Edgy |
From: gga <gg...@ad...> - 2007-05-16 19:05:21
|
Zhong Ren wrote: > Sure it is, according to my reference. > > Zhong > Well, yes, you are right, there is such an operator, but it makes no sense for wrapping it. That operator returns a function pointer to one of the class member functions or an lvalue pointer to a variable member. Why would you want to wrap that? Just wrap the function or variable directly, no need to mess with an additional pointer. -- Gonzalo Garramuño gg...@ad... AMD4400 - ASUS48N-E GeForce7300GT Kubuntu Edgy |
From: gga <gg...@ad...> - 2007-05-16 19:07:10
|
Zhong Ren wrote: > Sure it is, according to my reference. > > Zhong > Well, yes, you are right, there is such an operator, but it does not make much sense wrapping it. That operator returns a function pointer to one of the class member functions or an lvalue pointer to a variable member. Why would you want to wrap that? Just wrap the function or variable directly, no need to mess with an additional pointer. I think you are hitting your head against something else. Can you post a simplified sample of what you are trying to wrap? -- Gonzalo Garramuño gg...@ad... AMD4400 - ASUS48N-E GeForce7300GT Kubuntu Edgy |
From: Zhong R. <re...@uc...> - 2007-05-16 18:00:43
|
I miss two. These also work, but I wouldn't expect them to work: %re= name(Test) mac::vector::test; %rename(Test) mac::vector::test() const; Zhong ---- Original message ---- >Date: Wed, 16 May 2007 12:27:3= 3 -0500 (CDT) >From: Zhong Ren <re...@uc...> = >Subject: Re: [Swig-user] rename = >To: swi...@li... > >OK. Thanks. Why should not t= his work? > >%rename(__pow__) operator->*; > >Zhong > > > >---- = Original message ---- >>Date: Wed, 16 May 2007 13:56:01 -0300 >>From: = gga <gg...@ad...> = >>Subject: Re: [Swig-user] rename = >>To: re...@uc..., swi...@li... >> >>Zhong Re= n wrote: >>> I found several of my problems are due to that %rename and= >>> %ignore do not work as I expected. My C++ code is below. Say >>= > I want to rename the function test to Test. These two worked: >>> = >>> %rename(Test) test; >>> %rename(Test) test() const; >> >>And this= should also work (and it is a tad safer, as only >test within a >>cla= ss will match it): >> >>%rename(Test) *::test() const; >> >> >>> = >>> These do not work, and no error message either: >>> = >>> %rename(Test) vector::test; >>> %rename(Test) vector<T>::test; >>>= %rename(Test) mac::vector<T>::test; >>> %rename(Test) mac::vector<T>::= test(); >>> %rename(Test) mac::vector<T>::test() const; >> >>These ar= e probably all correct. They should not work, unless >they are >>part= of the template definition. No warnings or messages are >given for >= >neither good or bad renames, currently. >> >>> %rename(Test) mac::vec= tor<double>::test; >>> %rename(Test) mac::vector<double>::test() const;= >> >>Assuming of course you are doing %template(dvector) >mac::vecto= r<double>; >>somewhere, this is indeed a known bug. >>It is a known bu= g in the current rename matching for >templates. Bug is, >>basically,= hashed renames are not working on templates. The >global >>renames j= ust happen to work mainly due to a big hack in the >source code, >>whi= ch keeps the basic rename around as the template is expanded. >> >>> >>> I would expect these should work: >>> = >>> %rename(Test) vector<T>::test; >>> %rename(Test) mac::vector<T>::te= st; >>> %rename(Test) mac::vector<T>::test() const; >>> = >>> Why not? >>> = >> >>T is a template parameter, so it is unknown to the %rename >direc= tive. >>It will try to match, literally, just that, the letter T insid= e a >>vector, assuming T is a class type. >> >> >>-- = >>Gonzalo Garramu=F1o >>gg...@ad... >> >>AMD4400 - ASUS4= 8N-E >>GeForce7300GT >>Kubuntu Edgy > >-----------------------------= -------------------------------------------- >This SF.net email is spon= sored by DB2 Express >Download DB2 Express C - the FREE version of DB2 = express and take >control of your XML. No limits. Just data. Click to g= et it now. >http://sourceforge.net/powerbar/db2/ >____________________= ___________________________ >Swig-user mailing list >Swig-user@lists.s= ourceforge.net >https://lists.sourceforge.net/lists/listinfo/swig-user |
From: Zhong R. <re...@uc...> - 2007-05-16 18:44:14
|
More on rename. These worked half way. The wapper is generated, but = cannot compile unless mac:: is added to vector<double> in _wrap.c++. %rename(VectorDBL) *::operator vector<double>() const; %rename(VectorDB= L) mac::vector::operator vector<double>() const; However, These do no= t work at all: %rename(VectorDBL) *::operator mac::vector<double>() c= onst; %rename(VectorDBL) mac::vector::operator mac::vector<double>() c= onst; According to the end of 6.19 of Swig documentation, they shoul= d work. Zhong ---- Original message ---- >Date: Wed, 16 May 200= 7 13:00:38 -0500 (CDT) >From: Zhong Ren <re...@uc...> = >Subject: Re: [Swig-user] rename = >To: swi...@li... > >I miss two. These also work, = but I wouldn't expect them to work: > >%rename(Test) mac::vector::test= ; >%rename(Test) mac::vector::test() const; > >Zhong > > >---- Ori= ginal message ---- >>Date: Wed, 16 May 2007 12:27:33 -0500 (CDT) >>Fro= m: Zhong Ren <re...@uc...> = >>Subject: Re: [Swig-user] rename = >>To: swi...@li... >> >>OK. Thanks. Why should no= t this work? >> >>%rename(__pow__) operator->*; >> >>Zhong >> >> = >> >>---- Original message ---- >>>Date: Wed, 16 May 2007 13:56:01 -03= 00 >>>From: gga <gg...@ad...> = >>>Subject: Re: [Swig-user] rename = >>>To: re...@uc..., swi...@li... >>> >>>Zhong= Ren wrote: >>>> I found several of my problems are due to that %rename= and >>>> %ignore do not work as I expected. My C++ code is below. S= ay >>>> I want to rename the function test to Test. These two worked:= >>>> = >>>> %rename(Test) test; >>>> %rename(Test) test() const; >>> >>>And = this should also work (and it is a tad safer, as only >>test within a = >>>class will match it): >>> >>>%rename(Test) *::test() const; >>> >= >> >>>> = >>>> These do not work, and no error message either: >>>> = >>>> %rename(Test) vector::test; >>>> %rename(Test) vector<T>::test; >= >>> %rename(Test) mac::vector<T>::test; >>>> %rename(Test) mac::vector<= T>::test(); >>>> %rename(Test) mac::vector<T>::test() const; >>> >>>T= hese are probably all correct. They should not work, unless >>they are= >>>part of the template definition. No warnings or messages are >>gi= ven for >>>neither good or bad renames, currently. >>> >>>> %rename(T= est) mac::vector<double>::test; >>>> %rename(Test) mac::vector<double>:= :test() const; >>> >>>Assuming of course you are doing %template(dvect= or) >>mac::vector<double>; >>>somewhere, this is indeed a known bug. = >>>It is a known bug in the current rename matching for >>templates. B= ug is, >>>basically, hashed renames are not working on templates. The >>global >>>renames just happen to work mainly due to a big hack in the= >>source code, >>>which keeps the basic rename around as the template= is expanded. >>> >>>> = >>>> I would expect these should work: >>>> = >>>> %rename(Test) vector<T>::test; >>>> %rename(Test) mac::vector<T>::= test; >>>> %rename(Test) mac::vector<T>::test() const; >>>> = >>>> Why not? >>>> = >>> >>>T is a template parameter, so it is unknown to the %rename >>di= rective. >>>It will try to match, literally, just that, the letter T >= inside a >>>vector, assuming T is a class type. >>> >>> >>>-- = >>>Gonzalo Garramu=F1o >>>gg...@ad... >>> >>>AMD4400 - A= SUS48N-E >>>GeForce7300GT >>>Kubuntu Edgy >> >>---------------------= ---------------------------------------------------- >>This SF.net emai= l is sponsored by DB2 Express >>Download DB2 Express C - the FREE versi= on of DB2 express and take >>control of your XML. No limits. Just data= . Click to get it now. >>http://sourceforge.net/powerbar/db2/ >>______= _________________________________________ >>Swig-user mailing list >>S= wig...@li... >>https://lists.sourceforge.net/lists/li= stinfo/swig-user > >--------------------------------------------------= ----------------------- >This SF.net email is sponsored by DB2 Express >Download DB2 Express C - the FREE version of DB2 express and take >con= trol of your XML. No limits. Just data. Click to get it now. >http://so= urceforge.net/powerbar/db2/ >__________________________________________= _____ >Swig-user mailing list >Swi...@li... >https= ://lists.sourceforge.net/lists/listinfo/swig-user |
From: David B. <dav...@da...> - 2007-05-16 18:55:55
|
On May 16, 2007, at 1:44 PM, Zhong Ren wrote: > More on rename. > > These worked half way. The wapper is generated, but cannot > compile unless mac:: is added to vector<double> in _wrap.c++. > > %rename(VectorDBL) *::operator vector<double>() const; > %rename(VectorDBL) mac::vector::operator vector<double>() const; > > However, These do not work at all: > > %rename(VectorDBL) *::operator mac::vector<double>() const; > %rename(VectorDBL) mac::vector::operator mac::vector<double>() > const; > > According to the end of 6.19 of Swig documentation, they > should work. I don't know what's going on with all of this rename "not working" business, but please make sure that all %rename directives appear *before* all declarations of classes, templates, and functions that are supposed to be renamed and that the prototypes exactly match those declarations that are supposed to be renamed. Also, you may want to try putting the rename directives in a proper namespace; namespace mac { %rename(VectorDBL) vector::operator vector<double>(); ... } --Dave |
From: Zhong R. <re...@uc...> - 2007-05-16 18:54:12
|
Well, I did this: %rename(__pow__) *::operator->*; since this does not work: %rename(__pow__) operator->*; Then, I got what I want. I just don't understand why %rename above does not work. >>> import vector >>> v1=vector.vectorDBL(2,3,4) >>> v2=vector.vectorDBL(5,6,7) >>> print v1**v2 <-3 6 -3> >>> v1**v2 <vector.vectorDBL; proxy of <Swig Object of type 'mac::vector<double > *' at 0x6079b0> > Zhong ---- Original message ---- >Date: Wed, 16 May 2007 14:35:36 -0400 >From: "Stewart, Robert" <Rob...@si...> >Subject: RE: [Swig-user] rename >To: <re...@uc...> > >From: swi...@li... >> >> Sure it is, according to my reference. > >operator ->* is the pointer to member operator. However, I don't see >how you can overload it for use as the power operator since 5.5/3 (C++ >standard) defines its binding behavior quite strictly. The right hand >operand must be a pointer to member, not a value, so it couldn't be a >power to apply to some state of the object. > >Based upon the above, what would SWIG do with operator ->*? > >_____ >Rob > >> ---- Original message ---- >> >Date: Wed, 16 May 2007 14:49:46 -0300 >> >From: gga <gg...@ad...> >> >Subject: Re: [Swig-user] rename >> >To: re...@uc..., swi...@li... >> > >> >Zhong Ren wrote: >> >> OK. Thanks. Why should not this work? >> >> >> >> %rename(__pow__) operator->*; >> >> >> > >> >AFAIK, that's not a valid C++ operator. You probably mean >> either: >> > >> >operator->() // pointer operator >> > >> >or: >> > >> >operator*() // multiplication/dereference >> > >> >There's no power function operator in C/C++ ( the pow() >> function is used >> >instead ). > > >IMPORTANT: The information contained in this email and/or its attachments is confidential. If you are not the intended recipient, please notify the sender immediately by reply and immediately delete this message and all its attachments. Any review, use, reproduction, disclosure or dissemination of this message or any attachment by an unintended recipient is strictly prohibited. Neither this message nor any attachment is intended as or should be construed as an offer, solicitation or recommendation to buy or sell any security or other financial instrument. Neither the sender, his or her employer nor any of their respective affiliates makes any warranties as to the completeness or accuracy of any of the information contained herein or that this message or any of its attachments is free of viruses. |
From: Zhong R. <re...@uc...> - 2007-05-16 19:46:39
|
There are two problems. Let me present one at a time, and give you a specific example. This is a .i file: // op.i %module op %{ #include "op.h" %} //%rename(iA) mac::A::operator A<int>() const; // Works half way %rename(iA) mac::A::operator mac::A<int>() const; // Does not work %include "op.h" %template(dA) mac::A<double>; where op.h is: // op.h namespace mac { template <class T> class A { public: A() {} operator A<int>() const {return A<int>();} }; } If I use: %rename(iA) mac::A::operator mac::A<int>() const; according to Section 6.19 of Swig document, there is no wrapper generated: op.h:7: Warning(503): Can't wrap 'operator A<int>' unless renamed to a valid identifier. If I use: %rename(iA) mac::A::operator A<int>() const; wrapper is indeed generated, but cannot compile: op_wrap.c++: In function 'PyObject* _wrap_dA_iA(PyObject*, PyObject*)': op_wrap.c++:2594: error: expected type-specifier before 'A' op_wrap.c++:2594: error: expected `;' before 'A' make: *** [_op.so] Error 1 This can be fixed by editing line 2594 of op_wrap.c++: result = ((mac::A<double > const *)arg1)->operator mac::A<int>(); ^^^^^ It runs correctly: >>> import op >>> a=op.dA() >>> a.iA() <Swig Object of type 'mac::A<int > *' at 0x60ac90> Anything I did wrong? Zhong ---- Original message ---- >Date: Wed, 16 May 2007 13:55:34 -0500 >From: David Beazley <dav...@da...> >Subject: Re: [Swig-user] rename >To: re...@uc... >Cc: swi...@li... > > >On May 16, 2007, at 1:44 PM, Zhong Ren wrote: > >> More on rename. >> >> These worked half way. The wapper is generated, but cannot >> compile unless mac:: is added to vector<double> in _wrap.c++. >> >> %rename(VectorDBL) *::operator vector<double>() const; >> %rename(VectorDBL) mac::vector::operator vector<double>() const; >> >> However, These do not work at all: >> >> %rename(VectorDBL) *::operator mac::vector<double>() const; >> %rename(VectorDBL) mac::vector::operator mac::vector<double>() >> const; >> >> According to the end of 6.19 of Swig documentation, they >> should work. > >I don't know what's going on with all of this rename "not working" >business, but please make sure that all %rename directives appear >*before* all declarations of classes, templates, and functions that >are supposed to be renamed and that the prototypes exactly match >those declarations that are supposed to be renamed. Also, you may >want to try putting the rename directives in a proper namespace; > >namespace mac { > %rename(VectorDBL) vector::operator vector<double>(); > ... >} > >--Dave > > |
From: Josh C. <jc...@nc...> - 2007-05-16 20:09:03
|
On Wed, 16 May 2007, Zhong Ren wrote: > This can be fixed by editing line 2594 of op_wrap.c++: > > result = ((mac::A<double > const *)arg1)->operator mac::A<int>(); > ^^^^^ I presume from the context that the "^^^^" should be pointing at one or the other instance of "mac::". For a long time I've used SWIG's code insertion capability to add "using" directives to the generated code because of various problems like this. You could do %{ using namespace mac; %} I'm not saying that there isn't a problem that needs to be fixed, just offering a possible work-around. Josh |
From: Josh C. <jc...@nc...> - 2007-05-16 20:17:39
|
On Wed, 16 May 2007, Zhong Ren wrote: > There are two problems. Let me present one at a time, and > give you a specific example. > > This is a .i file: > > // op.i > %module op > %{ > #include "op.h" > %} > //%rename(iA) mac::A::operator A<int>() const; // Works half way > %rename(iA) mac::A::operator mac::A<int>() const; // Does not work > %include "op.h" > %template(dA) mac::A<double>; Perhaps I missed it, but have you established 1. whether the problem is specific to templates and 2. whether the problem is specific to operator overloading (as opposed to %rename on an ordinary method)? Josh |
From: William S F. <ws...@fu...> - 2007-05-16 20:23:49
|
Zhong Ren wrote: > There are two problems. Let me present one at a time, and > give you a specific example. > > This is a .i file: > > // op.i > %module op > %{ > #include "op.h" > %} > //%rename(iA) mac::A::operator A<int>() const; // Works half way > %rename(iA) mac::A::operator mac::A<int>() const; // Does not work This might more sense if you realise that: %rename(foof) mac::A::foo(mac::A a) const; // does not match %rename(foof) mac::A::foo(A a) const; // does match namespace mac { template <class T> class A { public: A() {} operator A<int>() const {return A<int>();} void foo(A a) const {} }; } Features don't do full type look up on the parameters in order to match. Maybe SWIG should be doing a full type lookup for the operators though. There is a definite bug though as when you do successfully rename the operator, it should produce compilable code. Please log the test case into the bug tracker. William |
From: Zhong R. <re...@uc...> - 2007-05-16 21:21:40
|
I think it is specific to template. Zhong ---- Original message ---- >Date: Wed, 16 May 2007 16:17:31 -0400 (EDT) >From: Josh Cherry <jc...@nc...> >Subject: Re: [Swig-user] rename >To: Zhong Ren <re...@uc...> >Cc: swi...@li... > > > >On Wed, 16 May 2007, Zhong Ren wrote: > >> There are two problems. Let me present one at a time, and >> give you a specific example. >> >> This is a .i file: >> >> // op.i >> %module op >> %{ >> #include "op.h" >> %} >> //%rename(iA) mac::A::operator A<int>() const; // Works half way >> %rename(iA) mac::A::operator mac::A<int>() const; // Does not work >> %include "op.h" >> %template(dA) mac::A<double>; > >Perhaps I missed it, but have you established 1. whether the problem is >specific to templates and 2. whether the problem is specific to operator >overloading (as opposed to %rename on an ordinary method)? > >Josh |
From: Zhong R. <re...@uc...> - 2007-05-16 23:07:27
|
Here is my second problem with rename. First, the .i file: // ban.i %module ban %{ #include "ban.h" %} %rename(bar) mac::A::operator||; // ignored %rename(reg) mac::A::regularfunc; // OK //%rename(bar) operator||; // OK //%rename(reg) regularfunc; // OK %include "ban.h" %template(iA) mac::A<int>; where ban.h is: // ban.h namespace mac { template <class T> class A { public: A() {} bool operator||(const A<T>& a) const {return 0;} bool regularfunc(const A<T>& a) const {return 0;} }; } The problem is: %rename(bar) mac::A::operator||; // ignored is not working, but these two work: %rename(reg) mac::A::regularfunc; // OK %rename(bar) operator||; // OK The %rename syntax seems different for a regular function and an operator. Do I get something wrong? Zhong |
From: Zhong R. <re...@uc...> - 2007-05-17 14:45:29
|
No, it does not work. I have to use %{ using namespace mac; %} to insert the line. Thanks anyway. Zhong ---- Original message ---- >Date: Thu, 17 May 2007 09:39:16 -0400 >From: "Stewart, Robert" <Rob...@si...> >Subject: RE: [Swig-user] rename >To: <re...@uc...> > >From: swi...@li... >> >> There are two problems. Let me present one at a time, and >> give you a specific example. >> >> This is a .i file: >> >> // op.i >> %module op >> %{ >> #include "op.h" >> %} >> //%rename(iA) mac::A::operator A<int>() const; // Works half way >> %rename(iA) mac::A::operator mac::A<int>() const; // Does not work >> %include "op.h" >> %template(dA) mac::A<double>; >> >> where op.h is: >> >> // op.h >> namespace mac >> { >> template <class T> class A >> { >> public: >> A() {} >> operator A<int>() const {return A<int>();} >> }; >> } > >You were given a suggestion to try putting the %rename in the namespace. >Did you try that? I think that means you'd want the following: > > namespace mac > { > %rename(iA) A::operator A<int>() const; > } > >_____ >Rob > > >IMPORTANT: The information contained in this email and/or its attachments is confidential. If you are not the intended recipient, please notify the sender immediately by reply and immediately delete this message and all its attachments. Any review, use, reproduction, disclosure or dissemination of this message or any attachment by an unintended recipient is strictly prohibited. Neither this message nor any attachment is intended as or should be construed as an offer, solicitation or recommendation to buy or sell any security or other financial instrument. Neither the sender, his or her employer nor any of their respective affiliates makes any warranties as to the completeness or accuracy of any of the information contained herein or that this message or any of its attachments is free of viruses. |
From: Monty T. <mo...@in...> - 2007-05-23 21:09:18
|
I'm having a similar problem with rename, although not 100% related probably. I have to wrap something that uses nested classes, so I'm using rename to work around that. I've got this: %rename(NdbDictObject) NdbDictionary::Object; %rename(NdbDictTable) NdbDictionary::Table; %rename(NdbDictColumn) NdbDictionary::Column; %rename(NdbDictIndex) NdbDictionary::Index; %rename(NdbDictDictionary) NdbDictionary::Dictionary; %rename(NdbDictObjectType) NdbDictionary::Object::Type; And then: (snipped for brevity) class NdbDictionary { }; class NdbDictionary::Object { virtual int getObjectVersion() const = 0; } class NdbDictionary::Column { const NdbDictionary::Table * getBlobTable() const; } %extend NdbDictionary::Column { public: const char * getCharsetName() { const CHARSET_INFO * csinfo = self->getCharset(); return csinfo->csname; } } class NdbDictionary::Table : public NdbDictionary::Object { const NdbDictionary::Column* getColumn(const char * name) const; NdbDictionary::Column* getColumn(const int attributeId); } First off, I get these errors: ../swig/NdbDictionary.i:182: Warning(303): %extend defined for an undeclared class NdbDictionary::Column. ../swig/NdbDictionary.i:186: Warning(401): Nothing known about base class 'NdbDictionary::Object'. Ignored. ../swig/NdbDictionary.i:230: Warning(401): Nothing known about base class 'NdbDictionary::Object'. Ignored. And then (for Java), I get the NdbDictObject, NdbDictTable, NdbDictColumn classes defined, but any of the methods that use those objects (like NdbDictionary::Table::getColumn, for instance) use the SWIGTYPE_p_NdbDictionary__Column object instead. Is there something I'm doing wrong here? Is this a possible workaround at all? It seems to work on in Python and Perl... (although I get the case class ndbDictionary::Object error everywhere) Monty |
From: William S F. <ws...@fu...> - 2007-05-24 22:03:42
|
Monty Taylor wrote: > I'm having a similar problem with rename, although not 100% related > probably. > > I have to wrap something that uses nested classes, so I'm using rename > to work around that. I've got this: > > > %rename(NdbDictObject) NdbDictionary::Object; > %rename(NdbDictTable) NdbDictionary::Table; > %rename(NdbDictColumn) NdbDictionary::Column; > %rename(NdbDictIndex) NdbDictionary::Index; > %rename(NdbDictDictionary) NdbDictionary::Dictionary; > %rename(NdbDictObjectType) NdbDictionary::Object::Type; > > > And then: (snipped for brevity) > > class NdbDictionary { }; > > > class NdbDictionary::Object { > virtual int getObjectVersion() const = 0; > } > > class NdbDictionary::Column { > const NdbDictionary::Table * getBlobTable() const; > } > %extend NdbDictionary::Column { > public: > const char * getCharsetName() { > const CHARSET_INFO * csinfo = self->getCharset(); > return csinfo->csname; > } > } > > class NdbDictionary::Table : public NdbDictionary::Object { > const NdbDictionary::Column* getColumn(const char * name) const; > NdbDictionary::Column* getColumn(const int attributeId); > } > > First off, I get these errors: > > ../swig/NdbDictionary.i:182: Warning(303): %extend defined for an > undeclared class NdbDictionary::Column. > ../swig/NdbDictionary.i:186: Warning(401): Nothing known about base > class 'NdbDictionary::Object'. Ignored. > ../swig/NdbDictionary.i:230: Warning(401): Nothing known about base > class 'NdbDictionary::Object'. Ignored. > > > And then (for Java), I get the NdbDictObject, NdbDictTable, > NdbDictColumn classes defined, but any of the methods that use those > objects (like NdbDictionary::Table::getColumn, for instance) use the > SWIGTYPE_p_NdbDictionary__Column object instead. > > Is there something I'm doing wrong here? Is this a possible workaround > at all? It seems to work on in Python and Perl... (although I get the > case class ndbDictionary::Object error everywhere) > I'm afraid that nested classes are the one c++ feature that is not supported. Please see the documentation for workarounds. William |
From: Monty T. <mo...@in...> - 2007-05-25 00:08:22
|
William S Fulton wrote: > > I'm afraid that nested classes are the one c++ feature that is not > supported. Please see the documentation for workarounds. > Somewhere I had gotten it in my head that I use using one of the workarounds. Sigh. As should be expected, going back to the manual and looking again did the trick. All now works exactly as I want it to. Thanks! Monty |
From: William S F. <ws...@fu...> - 2007-05-26 00:12:26
|
I've fixed the %rename bugs for conversion operators. There was an inconsistency when the conversion operator used the same type as the class that the operator was defined in. To make this consitent, the rules for matching %rename within a namespace have been changed. From the CHANGES entry file I added: The matching is now done on the operator name in the same way as it is done for parameters. For example: %rename(opABC) Space::ABC::operator ABC() const; %rename(methodABC) Space::ABC::method(ABC a) const; namespace Space { class ABC { public: void method(ABC a) const {} operator ABC() const { ABC a; return a; } }; } Note that qualifying the conversion operator previously may or may not have matched. Now it definitely won't, so this will not match: %rename(opABC) Space::ABC::operator Space::ABC() const; in the same that this does not match: %rename(methodABC) Space::ABC::method(Space::ABC a) const; The documentation has been improved with respect to %rename, namespaces and templates. Conversion operators documentation too. William Zhong Ren wrote: > No, it does not work. I have to use > > %{ > using namespace mac; > %} > > to insert the line. Thanks anyway. > > Zhong > > > > ---- Original message ---- >> Date: Thu, 17 May 2007 09:39:16 -0400 >> From: "Stewart, Robert" <Rob...@si...> >> Subject: RE: [Swig-user] rename >> To: <re...@uc...> >> >> From: swi...@li... >>> There are two problems. Let me present one at a time, and >>> give you a specific example. >>> >>> This is a .i file: >>> >>> // op.i >>> %module op >>> %{ >>> #include "op.h" >>> %} >>> //%rename(iA) mac::A::operator A<int>() const; // Works > half way >>> %rename(iA) mac::A::operator mac::A<int>() const; // Does > not work >>> %include "op.h" >>> %template(dA) mac::A<double>; >>> >>> where op.h is: >>> >>> // op.h >>> namespace mac >>> { >>> template <class T> class A >>> { >>> public: >>> A() {} >>> operator A<int>() const {return A<int>();} >>> }; >>> } >> You were given a suggestion to try putting the %rename in the > namespace. >> Did you try that? I think that means you'd want the following: >> >> namespace mac >> { >> %rename(iA) A::operator A<int>() const; >> } >> >> _____ >> Rob >> >> >> IMPORTANT: The information contained in this email and/or its > attachments is confidential. If you are not the intended > recipient, please notify the sender immediately by reply and > immediately delete this message and all its attachments. Any > review, use, reproduction, disclosure or dissemination of this > message or any attachment by an unintended recipient is > strictly prohibited. Neither this message nor any attachment > is intended as or should be construed as an offer, > solicitation or recommendation to buy or sell any security or > other financial instrument. Neither the sender, his or her > employer nor any of their respective affiliates makes any > warranties as to the completeness or accuracy of any of the > information contained herein or that this message or any of > its attachments is free of viruses. > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user > |
From: gga <gg...@ad...> - 2007-05-16 17:48:46
|
Zhong Ren wrote: > OK. Thanks. Why should not this work? > > %rename(__pow__) operator->*; > AFAIK, that's not a valid C++ operator. You probably mean either: operator->() // pointer operator or: operator*() // multiplication/dereference There's no power function operator in C/C++ ( the pow() function is used instead ). -- Gonzalo Garramuño gg...@ad... AMD4400 - ASUS48N-E GeForce7300GT Kubuntu Edgy |