Re: Howto override the argument names of certain class member functions

Terry Barnaby <[email protected]>
Newsgroups gmane.comp.programming.swig
Message-ID <[email protected]>
On 27/06/2020 14:41, William S Fulton wrote:
>
>
> On Sat, 27 Jun 2020 at 12:13, Terry Barnaby <[email protected] 
> <mailto:[email protected]>> wrote:
>
>     Hi William,
>
>     Thanks for the reply. Notes below in the text.
>
>     Terry
>     On 27/06/2020 11:52, William S Fulton wrote:
>>     Hi Terry
>>
>>
>>     On Sat, 27 Jun 2020 at 10:42, Terry Barnaby <[email protected]
>>     <mailto:[email protected]>> wrote:
>>
>>         Hi William,
>>
>>         I have a large class library. There are multiple functions
>>         that have a, say, "(Channel& chan)" argument. In most cases
>>         these are used to return values, but in some cases the
>>         functions modify the contents of the object who's reference
>>         is passed. So I cannot generically use the %template
>>
>>
>>     I think you meant %apply.
>
>     Yes, sorry, I meant %apply.
>
>
>>
>>         system as that only applies to the type and names of
>>         arguments passes, there is not ability to say a particular
>>         function is just using that argument as an output return. A
>>         lot of this libraries code is auto generated from a IDL and I
>>         generate a set of modified *.h files with the argument names
>>         changed to OUTPUT at the appropriate places but quite a few
>>         class member functions are not like that.
>>
>>     So I think you are saying you want to %apply these typemaps for
>>     parameters with the same name and type, but only on a select few
>>     functions and you don't want to modify the header files. The best
>>     solution SWIG has is to use %apply and %clear as Rui alluded to.
>>     This will work to some degree as the %apply will apply for all
>>     the functions in a header file you have include with %include.
>>     You can then use %clear after the %include. If you want to
>>     selectively apply the typemaps to parameters with the same type
>>     and name in one header file, then the next best solution is to
>>     use %ignore and then add the functions back in with %extend,
>>     renaming the parameters to something else. You imply that you
>>     only have a few of these that you don't want the typemaps to
>>     apply to, so this might be workable for you.
>
>     Unfortunately this is a large library and within header files
>     there are multiple functions which I would need to do this on, so
>     it can't be done using %apply and %clear unless a re-write the
>     header file into SWIG. I could use %ignore and %extent but I think
>     this would get quite messy especially as most of the functions are
>     members of classes. I will have a play with that.
>
> Use a macro which does the %ignore and %extend in a simple call. 
> That'll be easy to use unless you have a huge number and variety of 
> function signatures.
>
>
>>
>>     Looking at the original post, you have this in a header file:
>>
>>       class DataFile {
>>        public:
>>            Error setInfo(const Info& info);    // Input only reference
>>            Error getInfo(Info& info);        // Output only reference
>>        };
>>
>>     the types are NOT the same as one is const and the other is not
>>     const. If you look at the typemap rules, you'll see that if you
>>     have a typemap for const Info&, it will not apply to non-const
>>     Info&. However a non-const Info& typemap it wil apply to const
>>     Info&. So if you want to consistently apply typemaps to const and
>>     non-const, then solution is easy, something like:
>>
>>     %typemap(argout) const Info& OUTPUT "" // does nothing
>>     (effectively clears the typemap)
>>     %typemap(argout) Info& OUTPUT "/* some code for argout*/"
>>     %apply Info& OUTPUT { Info& info };
>>     %apply const Info& OUTPUT { const Info& info };
>>
>>     The main reason SWIG does not have function and parameter name
>>     combinations for typemaps is there is no C++ scoping syntax to
>>     get at the scope of a parameter name from outside of the
>>     function. I can elaborate more if anyone is really interested.
>
>     That was a bit of a simplification, and as you say didn't show the
>     issue! In effect there are multiple functions like getInfo. I do
>     have many functions that use the "const Type&" which as you say
>     the %typemap, %apply system works well on.
>
> Perhaps your API needs to be improved. I can't see why you would want 
> to use the OUTPUT typemaps on a non-const reference type. Are you 
> needing to have OUTPUT typemaps for non-const references?
>
>     Well I would have thought it would be possible in SWIG even if at
>     a simple pre-processing regular expression string replacement
>     level which is how I have effectively handled it now ? I would
>     have thought though that SWIG could do this internally it must
>     know: <Namespace>::<class>::functionName::[Arg Type/name list]
>     from its C++ parsing to nodes ?
>
> Something like that would indeed be possible and would be a powerful 
> extension to SWIG. I think if there was valid C++ syntax and scoping 
> for specifing a parameter, it would have been implemented ages ago. I 
> can think of various approaches to providing this matching capability. 
> If you'd like to discuss and contribute to an implementation of it, 
> please raise a Github issue.
>
> Regards
> William

Ok, will try and find the time to have a look at the SWIG code a bit 
more to try and understand how it works to see if I can see a way to do 
this.

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.