From: <Coo...@em...> - 2007-06-15 19:58:10
|
Hello again. =20 I'm still trying to reduce my wrapper functions and hit a roadblock. What I'm trying to do sounds possible according to the docs, but I just can't seem to get the syntax right. =20 I have vectors and sets of Smart Pointers. The typemaps for the Smart Pointers work just fine. But when I try to wrap the vector of Smart Pointers I still get the SWIG_* generated along with the class itself. =20 For example I have a Smart Pointer ClassID which holds and instance of an object implementing the IClassID interface and I type map it like this; =20 %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; %typemap(in) const ClassID & { $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > = **)&($input); }; %typemap(out) type { *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D = $1; }; %apply const ClassID & { ClassID * }; =20 This in turn generates: ClassID.java IClassID.java =20 This is good! =20 Then I typemap a vector of ClassIDs =20 %template(Vector_ClassID) std::vector< ClassIDs >; %typemap(out) Vector_ClassID { *(std::vector< ClassIDs > **)&$result =3D $1; }; %typemap(in) Vector_ClassID & { $1 =3D *(std::vector< ClassIDs > **)&($input); }; %apply Vector_ClassID & { Vector_ClassID * }; %apply const Vector_ClassID & { Vector_ClassID * }; =20 This generates: Vector_ClassID.java SWIGTYPE_p_NS1__VectorTNS1__NS2__SmartPointerTNS1__NS3__IClassId_t_std__ allocatoNS2NS1__NS2__SmartPointerTNS1__NS3__IClassId_t_t_t.java =20 This is bad!!=20 =20 I want to make the pointer wrapper go away, but I don't see what I'm doing wrong here. =20 Can any one lend some insight??? =20 =20 Thanks =20 John =20 |
From: Michael P. <puj...@la...> - 2007-06-15 22:28:47
|
Coo...@em... a écrit : > > Hello again. > > I’m still trying to reduce my wrapper functions and hit a roadblock. > What I’m trying to do sounds possible according to the docs, but I > just can’t seem to get the syntax right. > > I have vectors and sets of Smart Pointers. The typemaps for the Smart > Pointers work just fine. But when I try to wrap the vector of Smart > Pointers I still get the SWIG_* generated along with the class itself. > > For example I have a Smart Pointer ClassID which holds and instance of > an object implementing the IClassID interface and I type map it like this; > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > %typemap(in) const ClassID & { > > $1 = *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > }; > > %typemap(out) type { > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result = $1; > > }; > > %apply const ClassID & { ClassID * }; > > This in turn generates: > > ClassID.java > > IClassID.java > > This is good! > > Then I typemap a vector of ClassIDs > > %template(Vector_ClassID) std::vector< ClassIDs >; > > %typemap(out) Vector_ClassID { > > *(std::vector< ClassIDs > **)&$result = $1; > > }; > > %typemap(in) Vector_ClassID & { > > $1 = *(std::vector< ClassIDs > **)&($input); > > }; > > %apply Vector_ClassID & { Vector_ClassID * }; > > %apply const Vector_ClassID & { Vector_ClassID * }; > > This generates: > > Vector_ClassID.java > > SWIGTYPE_p_NS1__VectorTNS1__NS2__SmartPointerTNS1__NS3__IClassId_t_std__allocatoNS2NS1__NS2__SmartPointerTNS1__NS3__IClassId_t_t_t.java > > This is bad!! > > I want to make the pointer wrapper go away, but I don’t see what I’m > doing wrong here. > > Can any one lend some insight??? > > Thanks > > John > If you get SWIGTYPE_*.java opaques classes, it means that for some reason SWIG didn't know anything about that type. What does the function containing this type and that you ar trying to wrap looks like ? Just an idea : did you include std_vector.i ? |
From: <Coo...@em...> - 2007-06-18 13:28:16
|
=20 =20 > -----Original Message----- > From: Michael Pujos [mailto:puj...@la...] > Sent: Friday, June 15, 2007 6:28 PM > To: Cooper, JohnD > Cc: swi...@li... > Subject: Re: [Swig-user] C++ -> Java Wrapping templates within = templates.. >=20 > Coo...@em... a =E9crit : > > > > Hello again. > > > > I'm still trying to reduce my wrapper functions and hit a roadblock. > > What I'm trying to do sounds possible according to the docs, but I > > just can't seem to get the syntax right. > > > > I have vectors and sets of Smart Pointers. The typemaps for the = Smart > > Pointers work just fine. But when I try to wrap the vector of Smart > > Pointers I still get the SWIG_* generated along with the class = itself. > > > > For example I have a Smart Pointer ClassID which holds and instance = of > > an object implementing the IClassID interface and I type map it like > this; > > > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > > > %typemap(in) const ClassID & { > > > > $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > > > }; > > > > %typemap(out) type { > > > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D $1; > > > > }; > > > > %apply const ClassID & { ClassID * }; > > > > This in turn generates: > > > > ClassID.java > > > > IClassID.java > > > > This is good! > > > > Then I typemap a vector of ClassIDs > > > > %template(Vector_ClassID) std::vector< ClassIDs >; > > > > %typemap(out) Vector_ClassID { > > > > *(std::vector< ClassIDs > **)&$result =3D $1; > > > > }; > > > > %typemap(in) Vector_ClassID & { > > > > $1 =3D *(std::vector< ClassIDs > **)&($input); > > > > }; > > > > %apply Vector_ClassID & { Vector_ClassID * }; > > > > %apply const Vector_ClassID & { Vector_ClassID * }; > > > > This generates: > > > > Vector_ClassID.java > > > > > = SWIGTYPE_p_NS1__VectorTNS1__NS2__SmartPointerTNS1__NS3__IClassId_t_std__a= l > locatoNS2NS1__NS2__SmartPointerTNS1__NS3__IClassId_t_t_t.java > > > > This is bad!! > > > > I want to make the pointer wrapper go away, but I don't see what I'm > > doing wrong here. > > > > Can any one lend some insight??? > > > > Thanks > > > > John > > >=20 > If you get SWIGTYPE_*.java opaques classes, it means that for some > reason SWIG didn't know anything about that type. >=20 > What does the function containing this type and that you ar trying to > wrap looks like ? >=20 > Just an idea : did you include std_vector.i ? =20 Thanks for the quick response Michael. =20 First off, yes I am including st_vector.i; I know it's easy to miss, so = I know that's no the issue.=20 =20 I suspect it may have something to do with the fact that this is a = vector of smart pointers, but can't figure out why SWIG can't make the = connect, as I pointer out earlier it has no problem wrapping the smart = pointer ClassID, which is a type def; namespace NS1 { namespace NS3 { class IClassId; } =20 Class ClassID : public NS1::NS3::IClassId { std::string m_name; int m_type; public: ClassID(std::string name, int type){...}; ~ClassID()throw(); std::string getName(){...}; int getType(){...}; }; =20 typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // <=3D- = here is the type Def. NS1_API ClassId createClassId(const std::string & name, int version); NS1_API ClassId parseClassId(const std::string & data); NS1_API bool operator =3D=3D(const NS1::ClassId & lhs, const = NS1::ClassId & rhs); NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId = & rhs); } =20 void SomeFunc(const std:vector<ClassID> &clsid); //<=3D- Here's a = typical call I'm trying to wrap =20 and the Swig rule for this is as follows; =20 %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; =20 %typemap(in) const ClassID & { $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); }; =20 %typemap(out) type { *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D $1; }; =20 %template(Vector_ClassID) std::vector< ClassIDs >; =20 %typemap(out) Vector_ClassID { *(std::vector< ClassIDs > **)&$result =3D $1; }; =20 %typemap(in) Vector_ClassID & { $1 =3D *(std::vector< ClassIDs > **)&($input); }; =20 %apply const ClassID & { ClassID * }; %apply Vector_ClassID & { Vector_ClassID * }; %apply const Vector_ClassID & { Vector_ClassID * }; =20 Should I be using a typdef in the SWIG rule, like? =20 typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> = Vector_ClassID; =20 ?? =20 Thanks for talking time to help with this. =20 John |
From: Michael P. <puj...@la...> - 2007-06-18 22:33:30
|
> Thanks for the quick response Michael. > > First off, yes I am including st_vector.i; I know it's easy to miss, > so I know that's no the issue. > > I suspect it may have something to do with the fact that this is a > vector of smart pointers, but can't figure out why SWIG can't make the > connect, as I pointer out earlier it has no problem wrapping the smart > pointer ClassID, which is a type def; > > namespace NS1 { > > namespace NS3 { > > class IClassId; > > } > > Class ClassID : public NS1::NS3::IClassId > > { > > std::string m_name; > > int m_type; > > public: > > ClassID(std::string name, int type){...}; > > ~ClassID()throw(); > > std::string getName(){...}; > > int getType(){...}; > > }; > > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // <=- > here is the type Def.* > > NS1_API ClassId createClassId(const std::string & name, int version); > > NS1_API ClassId parseClassId(const std::string & data); > > NS1_API bool operator ==(const NS1::ClassId & lhs, const NS1::ClassId > & rhs); > > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > & rhs); > > } > > *void SomeFunc(const std:vector<ClassID> &clsid); //<=- Here’s a > typical call I’m trying to wrap* > > * * > > and the Swig rule for this is as follows; > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > %typemap(in) const ClassID & { > > $1 = *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > }; > > %typemap(out) type { > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result = $1; > > }; > > %template(Vector_ClassID) std::vector< ClassIDs >; > > %typemap(out) Vector_ClassID { > > *(std::vector< ClassIDs > **)&$result = $1; > > }; > > %typemap(in) Vector_ClassID & { > > $1 = *(std::vector< ClassIDs > **)&($input); > > }; > > %apply const ClassID & { ClassID * }; > > %apply Vector_ClassID & { Vector_ClassID * }; > > %apply const Vector_ClassID & { Vector_ClassID * }; > > Should I be using a typdef in the SWIG rule, like? > > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > Vector_ClassID; > > ?? > > Thanks for talking time to help with this. > > John > I don't see a typemap for type "const Vector_ClassID &" or "*const std:vector<ClassID> &" which is equivalent. That could explain why SWIG don't typemap this type. The apply does not count as it try to apply typemap *"const Vector_ClassID &" whoch does not exist to another type. * Also i noticed maybe a typo (the s terminating ClassID: *%template(Vector_ClassID) std::vector< ClassIDs >; * * |
From: <Coo...@em...> - 2007-06-19 15:00:29
|
> -----Original Message----- > From: Michael Pujos [mailto:puj...@la...] > Sent: Monday, June 18, 2007 6:33 PM > To: Cooper, JohnD > Cc: swi...@li... > Subject: Re: [Swig-user] C++ -> Java Wrapping templates within templates.. >=20 >=20 > > Thanks for the quick response Michael. > > > > First off, yes I am including st_vector.i; I know it's easy to miss, > > so I know that's no the issue. > > > > I suspect it may have something to do with the fact that this is a > > vector of smart pointers, but can't figure out why SWIG can't make the > > connect, as I pointer out earlier it has no problem wrapping the smart > > pointer ClassID, which is a type def; > > > > namespace NS1 { > > > > namespace NS3 { > > > > class IClassId; > > > > } > > > > Class ClassID : public NS1::NS3::IClassId > > > > { > > > > std::string m_name; > > > > int m_type; > > > > public: > > > > ClassID(std::string name, int type){...}; > > > > ~ClassID()throw(); > > > > std::string getName(){...}; > > > > int getType(){...}; > > > > }; > > > > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // = <=3D- > > here is the type Def.* > > > > NS1_API ClassId createClassId(const std::string & name, int version); > > > > NS1_API ClassId parseClassId(const std::string & data); > > > > NS1_API bool operator =3D=3D(const NS1::ClassId & lhs, const NS1::ClassId > > & rhs); > > > > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > > & rhs); > > > > } > > > > *void SomeFunc(const std:vector<ClassID> &clsid); //<=3D- Here's a > > typical call I'm trying to wrap* > > > > * * > > > > and the Swig rule for this is as follows; > > > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > > > %typemap(in) const ClassID & { > > > > $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > > > }; > > > > %typemap(out) type { > > > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D $1; > > > > }; > > > > %template(Vector_ClassID) std::vector< ClassIDs >; > > > > %typemap(out) Vector_ClassID { > > > > *(std::vector< ClassIDs > **)&$result =3D $1; > > > > }; > > > > %typemap(in) Vector_ClassID & { > > > > $1 =3D *(std::vector< ClassIDs > **)&($input); > > > > }; > > > > %apply const ClassID & { ClassID * }; > > > > %apply Vector_ClassID & { Vector_ClassID * }; > > > > %apply const Vector_ClassID & { Vector_ClassID * }; > > > > Should I be using a typdef in the SWIG rule, like? > > > > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > > > > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > > Vector_ClassID; > > > > ?? > > > > Thanks for talking time to help with this. > > > > John > > >=20 > I don't see a typemap for type "const Vector_ClassID &" or "*const > std:vector<ClassID> &" which is equivalent. > That could explain why SWIG don't typemap this type. The apply does not > count as it try to apply typemap > *"const Vector_ClassID &" whoch does not exist to another type. > * > Also i noticed maybe a typo (the s terminating ClassID: > *%template(Vector_ClassID) std::vector< ClassIDs >; > * > * Ok Michael, I've built a template to encompass al this, but still no joy. First here is the template and an example call to it %template(Attribute) NS1::NS2::SmartPointer<NS1::NS4::IAttribute >; VECTORHELPER(Vector_Attribute,Attribute); // Vector Macro %define VECTORHELPER(type,intrf) %typedef std::vector<type> NS1::Vector<type>; %template(type) std::vector<intrf>; %template(NS1::Vector<type>) std::vector<intrf>; %typemap(in) NS1::Vector<type> { $1 =3D *(std::vector<type > **)&($input); }; %typemap(in) const NS1::Vector<type> { $1 =3D *(std::vector<type > **)&($input); }; %typemap(in) NS1::Vector<type> & { $1 =3D *(std::vector<type > **)&($input); }; %typemap(in) const NS1::Vector<type> & { $1 =3D *(std::vector<type > **)&($input); }; %typemap(out) NS1::Vector<type> { *(std::vector<type> **)&$result =3D &$1; }; %typemap(out) const NS1::Vector<type> { *(std::vector<type> **)&$result =3D &$1; }; %typemap(out) NS1::Vector<type> & { *(std::vector<type> **)&$result =3D &$1; }; %typemap(out) const NS1::Vector<type> & { *(std::vector<type> **)&$result =3D &$1; }; %apply NS1::Vector<type> & { NS1::Vector<type> * }; %apply const NS1::Vector<type> & { NS1::Vector<type> * }; %apply const NS1::Vector<type> { NS1::Vector<type> }; %apply NS1::Vector<type> { NS1::Vector<type> }; %enddef Here are a couple of functions in my code that need to by wrapped that use this; bool NS1::Attributes::containsAttribute(const QualifiedName & tag, const Vector<Attribute> & attrs); const NS1::Vector<Attribute> & getConstraints() const; BTW: NS1::Vector is defined as: namespace NS1 { template<class _Ty, class _Ax =3D std::allocator<_Ty> > class Vector : public std::vector<_Ty,_Ax> {}; and attribute is namespace NS1 { namespace NS4 { class IAttribute; } =20 typedef NS1::NS1::SmartPointer<NS4::IAttribute> Attribute; typedef NS1::Vector<NS1::Attribute> AttributeVector; CSP_API bool operator =3D=3D(const Attribute & lhs, const Attribute & rhs); CSP_API bool operator < (const Attribute & lhs, const Attribute & rhs); } This is what I have now and it is still generating the darn wrappers, any more thought?=20 Thanks! John |
From: <Coo...@em...> - 2007-06-21 14:57:13
|
=20 =20 > -----Original Message----- > From: Michael Pujos [mailto:puj...@la...] > Sent: Monday, June 18, 2007 6:33 PM > To: Cooper, JohnD > Cc: swi...@li... > Subject: Re: [Swig-user] C++ -> Java Wrapping templates within templates.. >=20 >=20 > > Thanks for the quick response Michael. > > > > First off, yes I am including st_vector.i; I know it's easy to miss, > > so I know that's no the issue. > > > > I suspect it may have something to do with the fact that this is a > > vector of smart pointers, but can't figure out why SWIG can't make the > > connect, as I pointer out earlier it has no problem wrapping the smart > > pointer ClassID, which is a type def; > > > > namespace NS1 { > > > > namespace NS3 { > > > > class IClassId; > > > > } > > > > Class ClassID : public NS1::NS3::IClassId > > > > { > > > > std::string m_name; > > > > int m_type; > > > > public: > > > > ClassID(std::string name, int type){...}; > > > > ~ClassID()throw(); > > > > std::string getName(){...}; > > > > int getType(){...}; > > > > }; > > > > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // = <=3D- > > here is the type Def.* > > > > NS1_API ClassId createClassId(const std::string & name, int version); > > > > NS1_API ClassId parseClassId(const std::string & data); > > > > NS1_API bool operator =3D=3D(const NS1::ClassId & lhs, const NS1::ClassId > > & rhs); > > > > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > > & rhs); > > > > } > > > > *void SomeFunc(const std:vector<ClassID> &clsid); //<=3D- Here's a > > typical call I'm trying to wrap* > > > > * * > > > > and the Swig rule for this is as follows; > > > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > > > %typemap(in) const ClassID & { > > > > $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > > > }; > > > > %typemap(out) type { > > > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D $1; > > > > }; > > > > %template(Vector_ClassID) std::vector< ClassIDs >; > > > > %typemap(out) Vector_ClassID { > > > > *(std::vector< ClassIDs > **)&$result =3D $1; > > > > }; > > > > %typemap(in) Vector_ClassID & { > > > > $1 =3D *(std::vector< ClassIDs > **)&($input); > > > > }; > > > > %apply const ClassID & { ClassID * }; > > > > %apply Vector_ClassID & { Vector_ClassID * }; > > > > %apply const Vector_ClassID & { Vector_ClassID * }; > > > > Should I be using a typdef in the SWIG rule, like? > > > > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > > > > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > > Vector_ClassID; > > > > ?? > > > > Thanks for talking time to help with this. > > > > John > > >=20 > I don't see a typemap for type "const Vector_ClassID &" or "*const > std:vector<ClassID> &" which is equivalent. > That could explain why SWIG don't typemap this type. The apply does not > count as it try to apply typemap > *"const Vector_ClassID &" whoch does not exist to another type. > * > Also i noticed maybe a typo (the s terminating ClassID: > *%template(Vector_ClassID) std::vector< ClassIDs >; > * > * Thanks for all your help Michael. I finally found a way around this issue. What I came up with is the following macro: =20 %template(type) NS1::Vector<intrf>; %template(std_##type) std::vector<intrf>; =20 In the C++ world NS1::Vecotr actually inherits from std::vector, but I can't get swig to recognize that or do any thing about it. =20 Now my question is; all this works great but of the two classes produced; eg Vector_Foo & std_VectorFoo, only the STD version have the vector methods in it.=20 =20 All I really need to have in java is to have Vector_Foo extend std_VectorFoo and all is good, so I tried; =20 %template(type) NS1::Vector<intrf>; %template(std_##type) std::vector<intrf>; =20 %typemap(javabase, replace=3D"1") type "std_##type"; =20 Unfortunately I get these errors " Warning(401): Nothing known about base class 'std::vector<NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >'. Ignored. =20 Warning(401): Maybe you forgot to instantiate 'std::vector< NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >' using %template.=20 " What am I doing wrong now? =20 =20 Thanks =20 John |
From: William S F. <ws...@fu...> - 2007-06-25 20:26:31
|
Coo...@em... wrote: > > > > >> -----Original Message----- > >> From: Michael Pujos [mailto:puj...@la...] > >> Sent: Monday, June 18, 2007 6:33 PM > >> To: Cooper, JohnD > >> Cc: swi...@li... > >> Subject: Re: [Swig-user] C++ -> Java Wrapping templates within templates.. > >> > >> > >> > Thanks for the quick response Michael. > >> > > >> > First off, yes I am including st_vector.i; I know it's easy to miss, > >> > so I know that's no the issue. > >> > > >> > I suspect it may have something to do with the fact that this is a > >> > vector of smart pointers, but can't figure out why SWIG can't make the > >> > connect, as I pointer out earlier it has no problem wrapping the smart > >> > pointer ClassID, which is a type def; > >> > > >> > namespace NS1 { > >> > > >> > namespace NS3 { > >> > > >> > class IClassId; > >> > > >> > } > >> > > >> > Class ClassID : public NS1::NS3::IClassId > >> > > >> > { > >> > > >> > std::string m_name; > >> > > >> > int m_type; > >> > > >> > public: > >> > > >> > ClassID(std::string name, int type){...}; > >> > > >> > ~ClassID()throw(); > >> > > >> > std::string getName(){...}; > >> > > >> > int getType(){...}; > >> > > >> > }; > >> > > >> > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // <=- > >> > here is the type Def.* > >> > > >> > NS1_API ClassId createClassId(const std::string & name, int version); > >> > > >> > NS1_API ClassId parseClassId(const std::string & data); > >> > > >> > NS1_API bool operator ==(const NS1::ClassId & lhs, const NS1::ClassId > >> > & rhs); > >> > > >> > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > >> > & rhs); > >> > > >> > } > >> > > >> > *void SomeFunc(const std:vector<ClassID> &clsid); //<=- Here’s a > >> > typical call I’m trying to wrap* > >> > > >> > * * > >> > > >> > and the Swig rule for this is as follows; > >> > > >> > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > >> > > >> > %typemap(in) const ClassID & { > >> > > >> > $1 = *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > >> > > >> > }; > >> > > >> > %typemap(out) type { > >> > > >> > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result = $1; > >> > > >> > }; > >> > > >> > %template(Vector_ClassID) std::vector< ClassIDs >; > >> > > >> > %typemap(out) Vector_ClassID { > >> > > >> > *(std::vector< ClassIDs > **)&$result = $1; > >> > > >> > }; > >> > > >> > %typemap(in) Vector_ClassID & { > >> > > >> > $1 = *(std::vector< ClassIDs > **)&($input); > >> > > >> > }; > >> > > >> > %apply const ClassID & { ClassID * }; > >> > > >> > %apply Vector_ClassID & { Vector_ClassID * }; > >> > > >> > %apply const Vector_ClassID & { Vector_ClassID * }; > >> > > >> > Should I be using a typdef in the SWIG rule, like? > >> > > >> > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > >> > > >> > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > >> > Vector_ClassID; > >> > > >> > ?? > >> > > >> > Thanks for talking time to help with this. > >> > > >> > John > >> > > >> > >> I don't see a typemap for type "const Vector_ClassID &" or "*const > >> std:vector<ClassID> &" which is equivalent. > >> That could explain why SWIG don't typemap this type. The apply does not > >> count as it try to apply typemap > >> *"const Vector_ClassID &" whoch does not exist to another type. > >> * > >> Also i noticed maybe a typo (the s terminating ClassID: > >> *%template(Vector_ClassID) std::vector< ClassIDs >; > >> * > >> * > > Thanks for all your help Michael. I finally found a way around this > issue. What I came up with is the following macro: > > > > %template(type) NS1::Vector<intrf>; > > %template(std_##type) std::vector<intrf>; > > > > In the C++ world NS1::Vecotr actually inherits from std::vector, but I > can't get swig to recognize that or do any thing about it. > > > > Now my question is; all this works great but of the two classes > produced; eg Vector_Foo & std_VectorFoo, only the STD version have the > vector methods in it. > > > > All I really need to have in java is to have Vector_Foo extend > std_VectorFoo and all is good, so I tried; > > > > %template(type) NS1::Vector<intrf>; > > %template(std_##type) std::vector<intrf>; > > > > %typemap(javabase, replace="1") type "std_##type"; > > > > Unfortunately I get these errors > > */“/* > > */Warning(401): Nothing known about base class > 'std::vector<NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< > NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >'. Ignored./* > > */ /* > > */Warning(401): Maybe you forgot to instantiate 'std::vector< > NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< > NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >' using %template. /* > > “ > > What am I doing wrong now? > Presuming you gave SWIG the information about these types, it is hard to say. The best way to get to the bottom of these problems is to write a small example. If you can't work it out, post the example here and I'll take a look. Please post a single complete cutdown .i file with just the relevant information. Take a look at %inline for the example if you are not familiar with it. William |
From: <Coo...@em...> - 2007-06-26 13:13:17
|
> -----Original Message----- > From: William S Fulton [mailto:ws...@fu...] > Sent: Monday, June 25, 2007 4:27 PM > To: Cooper, JohnD > Cc: puj...@la...; swi...@li... > Subject: Re: [Swig-user] C++ -> Java Wrapping templates within templates.. >=20 > Coo...@em... wrote: > > > > > > > > > >> -----Original Message----- > > > >> From: Michael Pujos [mailto:puj...@la...] > > > >> Sent: Monday, June 18, 2007 6:33 PM > > > >> To: Cooper, JohnD > > > >> Cc: swi...@li... > > > >> Subject: Re: [Swig-user] C++ -> Java Wrapping templates within > templates.. > > > >> > > > >> > > > >> > Thanks for the quick response Michael. > > > >> > > > > >> > First off, yes I am including st_vector.i; I know it's easy to miss, > > > >> > so I know that's no the issue. > > > >> > > > > >> > I suspect it may have something to do with the fact that this is a > > > >> > vector of smart pointers, but can't figure out why SWIG can't make > the > > > >> > connect, as I pointer out earlier it has no problem wrapping the > smart > > > >> > pointer ClassID, which is a type def; > > > >> > > > > >> > namespace NS1 { > > > >> > > > > >> > namespace NS3 { > > > >> > > > > >> > class IClassId; > > > >> > > > > >> > } > > > >> > > > > >> > Class ClassID : public NS1::NS3::IClassId > > > >> > > > > >> > { > > > >> > > > > >> > std::string m_name; > > > >> > > > > >> > int m_type; > > > >> > > > > >> > public: > > > >> > > > > >> > ClassID(std::string name, int type){...}; > > > >> > > > > >> > ~ClassID()throw(); > > > >> > > > > >> > std::string getName(){...}; > > > >> > > > > >> > int getType(){...}; > > > >> > > > > >> > }; > > > >> > > > > >> > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // <=3D- > > > >> > here is the type Def.* > > > >> > > > > >> > NS1_API ClassId createClassId(const std::string & name, int version); > > > >> > > > > >> > NS1_API ClassId parseClassId(const std::string & data); > > > >> > > > > >> > NS1_API bool operator =3D=3D(const NS1::ClassId & lhs, const NS1::ClassId > > > >> > & rhs); > > > >> > > > > >> > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > > > >> > & rhs); > > > >> > > > > >> > } > > > >> > > > > >> > *void SomeFunc(const std:vector<ClassID> &clsid); //<=3D- Here's = a > > > >> > typical call I'm trying to wrap* > > > >> > > > > >> > * * > > > >> > > > > >> > and the Swig rule for this is as follows; > > > >> > > > > >> > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > > >> > > > > >> > %typemap(in) const ClassID & { > > > >> > > > > >> > $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > > >> > > > > >> > }; > > > >> > > > > >> > %typemap(out) type { > > > >> > > > > >> > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D = $1; > > > >> > > > > >> > }; > > > >> > > > > >> > %template(Vector_ClassID) std::vector< ClassIDs >; > > > >> > > > > >> > %typemap(out) Vector_ClassID { > > > >> > > > > >> > *(std::vector< ClassIDs > **)&$result =3D $1; > > > >> > > > > >> > }; > > > >> > > > > >> > %typemap(in) Vector_ClassID & { > > > >> > > > > >> > $1 =3D *(std::vector< ClassIDs > **)&($input); > > > >> > > > > >> > }; > > > >> > > > > >> > %apply const ClassID & { ClassID * }; > > > >> > > > > >> > %apply Vector_ClassID & { Vector_ClassID * }; > > > >> > > > > >> > %apply const Vector_ClassID & { Vector_ClassID * }; > > > >> > > > > >> > Should I be using a typdef in the SWIG rule, like? > > > >> > > > > >> > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > > > >> > > > > >> > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > > > >> > Vector_ClassID; > > > >> > > > > >> > ?? > > > >> > > > > >> > Thanks for talking time to help with this. > > > >> > > > > >> > John > > > >> > > > > >> > > > >> I don't see a typemap for type "const Vector_ClassID &" or "*const > > > >> std:vector<ClassID> &" which is equivalent. > > > >> That could explain why SWIG don't typemap this type. The apply does not > > > >> count as it try to apply typemap > > > >> *"const Vector_ClassID &" whoch does not exist to another type. > > > >> * > > > >> Also i noticed maybe a typo (the s terminating ClassID: > > > >> *%template(Vector_ClassID) std::vector< ClassIDs >; > > > >> * > > > >> * > > > > Thanks for all your help Michael. I finally found a way around this > > issue. What I came up with is the following macro: > > > > > > > > %template(type) NS1::Vector<intrf>; > > > > %template(std_##type) std::vector<intrf>; > > > > > > > > In the C++ world NS1::Vecotr actually inherits from std::vector, but I > > can't get swig to recognize that or do any thing about it. > > > > > > > > Now my question is; all this works great but of the two classes > > produced; eg Vector_Foo & std_VectorFoo, only the STD version have the > > vector methods in it. > > > > > > > > All I really need to have in java is to have Vector_Foo extend > > std_VectorFoo and all is good, so I tried; > > > > > > > > %template(type) NS1::Vector<intrf>; > > > > %template(std_##type) std::vector<intrf>; > > > > > > > > %typemap(javabase, replace=3D"1") type "std_##type"; > > > > > > > > Unfortunately I get these errors > > > > */"/* > > > > */Warning(401): Nothing known about base class > > 'std::vector<NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< > > NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >'. Ignored./* > > > > */ /* > > > > */Warning(401): Maybe you forgot to instantiate 'std::vector< > > NS1::NS2::SmartPointer<NS1::NS4::IFoo >,std::allocator< > > NS1::NS2::SmartPointer<NS1::NS4::IFoo > > >' using %template. /* > > > > " > > > > What am I doing wrong now? > > >=20 > Presuming you gave SWIG the information about these types, it is hard to > say. The best way to get to the bottom of these problems is to write a > small example. If you can't work it out, post the example here and I'll > take a look. Please post a single complete cutdown .i file with just the > relevant information. Take a look at %inline for the example if you are > not familiar with it. >=20 > William Thanks William, I have gotten past these issues, using a solution similar to what you suggested. I have one minor issue now that would be nice to solve via the .i if possible. I now generate 2 classes, 1 Vector_ClassId (C++ type) and 2 std_Vector_ClassId (Swig parable type) both classes are good but only the std_Vector_ClassId has the vector methods in it. If I go into the java code and simply say that Vector_ClassId extends std_Vector_ClassId all is good. Is there a way in the .i file that I can specify, for java generation, that std_Vector_ClassId is the base class for Vector_ClassId and add the super() call into the constructor. Thanks John |
From: Shields, D. P.(Technology) <Dan...@gs...> - 2007-06-26 13:34:17
|
>-----Original Message----- >From: swi...@li...=20 >[mailto:swi...@li...] On Behalf Of=20 >Coo...@em... >Sent: Tuesday, June 26, 2007 2:12 PM >To: ws...@fu... >Cc: swi...@li... >Subject: Re: [Swig-user] C++ -> Java Wrapping templates within=20 >templates.. >Importance: High ...snip... > >> William > >Thanks William, > >I have gotten past these issues, using a solution similar to what you >suggested. > >I have one minor issue now that would be nice to solve via the .i if >possible. > >I now generate 2 classes, 1 Vector_ClassId (C++ type) and 2 >std_Vector_ClassId (Swig parable type) both classes are good but only >the std_Vector_ClassId has the vector methods in it. If I go into the >java code and simply say that Vector_ClassId extends std_Vector_ClassId >all is good. > >Is there a way in the .i file that I can specify, for java generation, >that std_Vector_ClassId is the base class for Vector_ClassId=20 >and add the >super() call into the constructor. > >Thanks > >John > You should be able to add the java code using: %typemap (javacode) YourCppClassName %{ /* put your java code here */ %} Whether this will work for a default constructor I'm not sure. I guess you could always rename this. Daniel. |
From: William S F. <ws...@fu...> - 2007-06-27 08:10:18
|
Shields, Daniel P.(Technology) wrote: > >-----Original Message----- >> From: swi...@li... >> [mailto:swi...@li...] On Behalf Of >> Coo...@em... >> Sent: Tuesday, June 26, 2007 2:12 PM >> To: ws...@fu... >> Cc: swi...@li... >> Subject: Re: [Swig-user] C++ -> Java Wrapping templates within >> templates.. >> Importance: High > > ...snip... > >>> William >> Thanks William, >> >> I have gotten past these issues, using a solution similar to what you >> suggested. >> >> I have one minor issue now that would be nice to solve via the .i if >> possible. >> >> I now generate 2 classes, 1 Vector_ClassId (C++ type) and 2 >> std_Vector_ClassId (Swig parable type) both classes are good but only >> the std_Vector_ClassId has the vector methods in it. If I go into the >> java code and simply say that Vector_ClassId extends std_Vector_ClassId >> all is good. >> >> Is there a way in the .i file that I can specify, for java generation, >> that std_Vector_ClassId is the base class for Vector_ClassId >> and add the >> super() call into the constructor. >> >> Thanks >> >> John >> > > You should be able to add the java code using: > > %typemap (javacode) YourCppClassName > %{ > /* put your java code here */ > %} > > Whether this will work for a default constructor I'm not sure. > I guess you could always rename this. > You can add in a Java base class, by using the javabase typemap (or javainterfaces typemap for implementing interfaces). You can modify the constructor code with the javaconstruct typemap. See the default javaconstruct typemap in java.swg and search the Examples/test-suite/java_*.i files for examples of typemaps. William |
From: <Coo...@em...> - 2007-06-19 15:09:16
|
> -----Original Message----- > From: Cooper, JohnD > Sent: Tuesday, June 19, 2007 11:00 AM > To: 'Michael Pujos' > Cc: swi...@li... > Subject: RE: [Swig-user] C++ -> Java Wrapping templates within templates.. >=20 >=20 >=20 > > -----Original Message----- > > From: Michael Pujos [mailto:puj...@la...] > > Sent: Monday, June 18, 2007 6:33 PM > > To: Cooper, JohnD > > Cc: swi...@li... > > Subject: Re: [Swig-user] C++ -> Java Wrapping templates within > templates.. > > > > > > > Thanks for the quick response Michael. > > > > > > First off, yes I am including st_vector.i; I know it's easy to miss, > > > so I know that's no the issue. > > > > > > I suspect it may have something to do with the fact that this is a > > > vector of smart pointers, but can't figure out why SWIG can't make the > > > connect, as I pointer out earlier it has no problem wrapping the smart > > > pointer ClassID, which is a type def; > > > > > > namespace NS1 { > > > > > > namespace NS3 { > > > > > > class IClassId; > > > > > > } > > > > > > Class ClassID : public NS1::NS3::IClassId > > > > > > { > > > > > > std::string m_name; > > > > > > int m_type; > > > > > > public: > > > > > > ClassID(std::string name, int type){...}; > > > > > > ~ClassID()throw(); > > > > > > std::string getName(){...}; > > > > > > int getType(){...}; > > > > > > }; > > > > > > *typedef NS1::NS2::SmartPointer<NS1::NS3::IClassId> ClassId; // <=3D- > > > here is the type Def.* > > > > > > NS1_API ClassId createClassId(const std::string & name, int version); > > > > > > NS1_API ClassId parseClassId(const std::string & data); > > > > > > NS1_API bool operator =3D=3D(const NS1::ClassId & lhs, const NS1::ClassId > > > & rhs); > > > > > > NS1_API bool operator < (const NS1::ClassId & lhs, const NS1::ClassId > > > & rhs); > > > > > > } > > > > > > *void SomeFunc(const std:vector<ClassID> &clsid); //<=3D- Here's a > > > typical call I'm trying to wrap* > > > > > > * * > > > > > > and the Swig rule for this is as follows; > > > > > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > > > > > %typemap(in) const ClassID & { > > > > > > $1 =3D *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > = **)&($input); > > > > > > }; > > > > > > %typemap(out) type { > > > > > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result =3D = $1; > > > > > > }; > > > > > > %template(Vector_ClassID) std::vector< ClassIDs >; > > > > > > %typemap(out) Vector_ClassID { > > > > > > *(std::vector< ClassIDs > **)&$result =3D $1; > > > > > > }; > > > > > > %typemap(in) Vector_ClassID & { > > > > > > $1 =3D *(std::vector< ClassIDs > **)&($input); > > > > > > }; > > > > > > %apply const ClassID & { ClassID * }; > > > > > > %apply Vector_ClassID & { Vector_ClassID * }; > > > > > > %apply const Vector_ClassID & { Vector_ClassID * }; > > > > > > Should I be using a typdef in the SWIG rule, like? > > > > > > typedef NS1::NS2::SmartPointer<NS1::NS3::IClassID> ClassID; > > > > > > typedef std::vector<NS1::NS2::SmartPointer<NS1::NS3::IClassID>> > > > Vector_ClassID; > > > > > > ?? > > > > > > Thanks for talking time to help with this. > > > > > > John > > > > > > > I don't see a typemap for type "const Vector_ClassID &" or "*const > > std:vector<ClassID> &" which is equivalent. > > That could explain why SWIG don't typemap this type. The apply does not > > count as it try to apply typemap > > *"const Vector_ClassID &" whoch does not exist to another type. > > * > > Also i noticed maybe a typo (the s terminating ClassID: > > *%template(Vector_ClassID) std::vector< ClassIDs >; > > * > > * > Ok Michael, >=20 > I've built a template to encompass al this, but still no joy. >=20 > First here is the template and an example call to it >=20 > %template(Attribute) NS1::NS2::SmartPointer<NS1::NS4::IAttribute >; >=20 > VECTORHELPER(Vector_Attribute,Attribute); >=20 > // Vector Macro > %define VECTORHELPER(type,intrf) > %typedef std::vector<type> NS1::Vector<type>; > %template(type) std::vector<intrf>; > %template(NS1::Vector<type>) std::vector<intrf>; >=20 > %typemap(in) NS1::Vector<type> { > $1 =3D *(std::vector<type > **)&($input); > }; > %typemap(in) const NS1::Vector<type> { > $1 =3D *(std::vector<type > **)&($input); > }; > %typemap(in) NS1::Vector<type> & { > $1 =3D *(std::vector<type > **)&($input); > }; > %typemap(in) const NS1::Vector<type> & { > $1 =3D *(std::vector<type > **)&($input); > }; > %typemap(out) NS1::Vector<type> { > *(std::vector<type> **)&$result =3D &$1; > }; > %typemap(out) const NS1::Vector<type> { > *(std::vector<type> **)&$result =3D &$1; > }; > %typemap(out) NS1::Vector<type> & { > *(std::vector<type> **)&$result =3D &$1; > }; > %typemap(out) const NS1::Vector<type> & { > *(std::vector<type> **)&$result =3D &$1; > }; > %apply NS1::Vector<type> & { NS1::Vector<type> * }; > %apply const NS1::Vector<type> & { NS1::Vector<type> * }; > %apply const NS1::Vector<type> { NS1::Vector<type> }; > %apply NS1::Vector<type> { NS1::Vector<type> }; > %enddef >=20 > Here are a couple of functions in my code that need to by wrapped that use > this; > bool NS1::Attributes::containsAttribute(const QualifiedName & tag, const > Vector<Attribute> & attrs); >=20 > const NS1::Vector<Attribute> & getConstraints() const; >=20 > BTW: NS1::Vector is defined as: >=20 > namespace NS1 { > template<class _Ty, class _Ax =3D std::allocator<_Ty> > > class Vector : public std::vector<_Ty,_Ax> {}; >=20 > and attribute is >=20 > namespace NS1 { > namespace NS4 { > class IAttribute; > } >=20 > typedef NS1::NS1::SmartPointer<NS4::IAttribute> Attribute; > typedef NS1::Vector<NS1::Attribute> AttributeVector; > CSP_API bool operator =3D=3D(const Attribute & lhs, const Attribute & > rhs); > CSP_API bool operator < (const Attribute & lhs, const Attribute & > rhs); > } >=20 > This is what I have now and it is still generating the darn wrappers, any > more thought? >=20 > Thanks! >=20 > John Hi Michael, Quick update, the template I set earlier was the wrong one, this is the correct one %define VECTORHELPER(type,intrf) %typedef std::vector<intrf> NS1::Vector<intrf>; %template(type) std::vector<intrf>; %template(NS1::Vector<intrf>) std::vector<intrf>; %typemap(in) NS1::Vector<intrf> { $1 =3D *(std::vector<intrf > **)&($input); }; %typemap(in) const NS1::Vector<intrf> { $1 =3D *(std::vector<intrf > **)&($input); }; %typemap(in) NS1::Vector<intrf> & { $1 =3D *(std::vector<intrf > **)&($input); }; %typemap(in) const NS1::Vector<intrf> & { $1 =3D *(std::vector<intrf > **)&($input); }; %typemap(out) NS1::Vector<intrf> { *(std::vector<intrf> **)&$result =3D &$1; }; %typemap(out) const NS1::Vector<intrf> { *(std::vector<intrf> **)&$result =3D &$1; }; %typemap(out) NS1::Vector<intrf> & { *(std::vector<intrf> **)&$result =3D &$1; }; %typemap(out) const NS1::Vector<intrf> & { *(std::vector<intrf> **)&$result =3D &$1; }; %apply NS1::Vector<intrf> & { NS1::Vector<intrf> * }; %apply const NS1::Vector<intrf> & { NS1::Vector<intrf> * }; %apply const NS1::Vector<intrf> { NS1::Vector<intrf> }; %apply NS1::Vector<intrf> { NS1::Vector<intrf> }; %enddef Still no change in the generate code though Thanks Again! John |
From: William S F. <ws...@fu...> - 2007-06-25 20:25:21
|
Coo...@em... wrote: > Hello again. > > > > I’m still trying to reduce my wrapper functions and hit a roadblock. > What I’m trying to do sounds possible according to the docs, but I just > can’t seem to get the syntax right. > > > > I have vectors and sets of Smart Pointers. The typemaps for the Smart > Pointers work just fine. But when I try to wrap the vector of Smart > Pointers I still get the SWIG_* generated along with the class itself. > > > > For example I have a Smart Pointer ClassID which holds and instance of > an object implementing the IClassID interface and I type map it like this; > > > > %template(ClassID) NS1::NS2::SmartPointer<NS1::NS3::IClassID>; > > %typemap(in) const ClassID & { > > $1 = *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&($input); > > }; > > %typemap(out) type { > > *( NS1::NS2::SmartPointer< NS1::NS3::IClassID > **)&$result = $1; > > }; > > %apply const ClassID & { ClassID * }; > > > > This in turn generates: > > ClassID.java > > IClassID.java > > > > This is good! > > > > Then I typemap a vector of ClassIDs > > > > %template(Vector_ClassID) std::vector< ClassIDs >; > > %typemap(out) Vector_ClassID { > > *(std::vector< ClassIDs > **)&$result = $1; > > }; > > %typemap(in) Vector_ClassID & { > > $1 = *(std::vector< ClassIDs > **)&($input); > > }; I'm not sure if you figured out your error, but you have incorrectly declared your typemap. You have the C++ type as Vector_ClassID. It is a non-existent C++ type from what I can see. Change it to std::vector<ClassIDs>. Also you should be looking at std_vector.i for std::vector. William |