Default arguments updated

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6499 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2004-10-25 20:40:41 +00:00
commit d70f04e660
5 changed files with 187 additions and 104 deletions

View file

@ -46,6 +46,7 @@
<li><a href="#null_pointers">Null pointers</a>
</ul>
<li><a href="#overloaded_functions">C++ overloaded functions</a>
<li><a href="#java_default_arguments">C++ default arguments</a>
<li><a href="#namespaces">C++ namespaces</a>
<li><a href="#templates">C++ templates</a>
<li><a href="#smart_pointers">C++ Smart Pointers</a>
@ -1493,6 +1494,8 @@ if you have two functions like this:
<blockquote>
<pre>
%module example
void foo(int);
void foo(char *c);
</pre>
@ -1502,8 +1505,8 @@ You can use them in Java in a straightforward manner:
<blockquote>
<pre>
foo(3); // foo(int)
foo("Hello"); // foo(char *c)
example.foo(3); // foo(int)
example.foo("Hello"); // foo(char *c)
</pre>
</blockquote>
@ -1580,7 +1583,46 @@ void spam(short); // Ignored
</pre>
</blockquote>
<H3><a name="namespaces"></a>19.3.12 C++ namespaces</H3>
<H3><a name="java_default_arguments"></a>19.3.12 C++ default arguments</H3>
Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted.
For example, if we have the following C++:
<blockquote>
<pre>
%module example
void defaults(double d=10.0, int i=0);
</pre>
</blockquote>
The following methods are generated in the Java module class:
<blockquote>
<pre>
public class example {
public static void defaults(double d, int i) { ... }
public static void defaults(double d) { ... }
public static void defaults() { ... }
}
</pre>
</blockquote>
<p>
It is as if SWIG had parsed three separate overloaded methods.
The same approach is taken for static methods, constructors and member methods.
</p>
<p>
<b>Compatibility note:</b> Versions of SWIG prior to SWIG-1.3.23 wrapped these with a
single wrapper method and so the default values could not be taken advantage of from Java.
Further details on default arguments and how to restore this approach are given in the more general
<a href="SWIGPlus.html#SWIGPlus_default_args">Default arguments</a> section.
</p>
<H3><a name="namespaces"></a>19.3.13 C++ namespaces</H3>
SWIG is aware of C++ namespaces, but namespace names do not appear in
@ -1628,11 +1670,11 @@ namespace Bar {
</pre>
</blockquote>
If you have more than one namespace and your want to keep their
If you have more than one namespace and you want to keep their
symbols separate, consider wrapping them as separate SWIG modules.
Each SWIG module can be placed into a separate package.
<H3><a name="templates"></a>19.3.13 C++ templates</H3>
<H3><a name="templates"></a>19.3.14 C++ templates</H3>
C++ templates don't present a huge problem for SWIG. However, in order
@ -1675,7 +1717,7 @@ int second = p.getSecond();
Obviously, there is more to template wrapping than shown in this example.
More details can be found in the <a href="SWIGPlus.html#SWIGPlus">SWIG and C++</a> chapter.
<H3><a name="smart_pointers"></a>19.3.14 C++ Smart Pointers</H3>
<H3><a name="smart_pointers"></a>19.3.15 C++ Smart Pointers</H3>
In certain C++ programs, it is common to use classes that have been wrapped by

View file

@ -89,7 +89,7 @@ an outside reference. John Levine's "Linkers and Loaders" is highly recommended
<p>
Using multiple modules with the <tt>%import</tt> directive is the most common approach to modularising large projects.
In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file.
There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options.
There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.
</p>
<b>-fcompact</b><br>
@ -120,5 +120,10 @@ Normally wrappers are generated for both methods, whereas this command line opti
Normal polymorphic behaviour remains as <tt>Derived::method</tt> will still be called should you have
a <tt>Derived</tt> instance and call the wrapper for <tt>Base::method</tt>.
<p>
<b>%feature("compactdefaultargs")</b><br>
This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on <a href="SWIGPlus.html#SWIGPlus_default_args">default arguments</a> discusses the feature and it's limitations.
</p>
</body>
</html>

View file

@ -42,7 +42,7 @@
<li><a href="#SWIG_nn26">Arrays</a>
<li><a href="#SWIG_nn27">Creating read-only variables</a>
<li><a href="#SWIG_nn28">Renaming and ignoring declarations</a>
<li><a href="#SWIG_nn29">Default/optional arguments</a>
<li><a href="#SWIG_default_args">Default/optional arguments</a>
<li><a href="#SWIG_nn30">Pointers to functions and callbacks</a>
</ul>
<li><a href="#SWIG_nn31">Structures and unions</a>
@ -1581,7 +1581,7 @@ For example:
This directive is still supported, but it is deprecated and should probably be avoided. The <tt>%rename</tt>
directive is more powerful and better supports wrapping of raw header file information.
<H3><a name="SWIG_nn29"></a>5.4.8 Default/optional arguments</H3>
<H3><a name="SWIG_default_args"></a>5.4.8 Default/optional arguments</H3>
<p>
@ -1609,10 +1609,11 @@ arguments specified in a SWIG interface work with both C and C++.
<p>
<b>Note:</b> There is a subtle semantic issue concerning the use
of default arguments and the SWIG generated wrapper code. When default
arguments are used, the default values are emitted into the wrappers and the
function is invoked with a full set of arguments. This behavior is not
100% compatible with all uses of default arguments in C++. Please refer to
the C++ chapter for further details.
arguments are used in C code, the default values are emitted into the wrappers and the
function is invoked with a full set of arguments. This is different to when wrapping C++
where an overloaded wrapper method is generated for each defaulted argument.
Please refer to the section on <a href="SWIGPlus.html#SWIGPlus_default_args">default arguments</a>
in the C++ chapter for further details.
</p>
<H3><a name="SWIG_nn30"></a>5.4.9 Pointers to functions and callbacks</H3>

View file

@ -20,9 +20,9 @@
<li><a href="#SWIGPlus_nn10">Copy constructors</a>
<li><a href="#SWIGPlus_nn11">Member functions</a>
<li><a href="#SWIGPlus_nn12">Static members</a>
<li><a href="#SWIGPlus_nn13">Member functions and default arguments</a>
<li><a href="#SWIGPlus_nn14">Member data</a>
<li><a href="#SWIGPlus_nn13">Member data</a>
</ul>
<li><a href="#SWIGPlus_default_args">Default arguments</a>
<li><a href="#SWIGPlus_nn15">Protection</a>
<li><a href="#SWIGPlus_nn16">Enums and constants</a>
<li><a href="#SWIGPlus_nn17">Friends</a>
@ -31,7 +31,7 @@
<li><a href="#SWIGPlus_nn20">Inheritance</a>
<li><a href="#SWIGPlus_nn21">A brief discussion of multiple inheritance, pointers, and type checking</a>
<li><a href="#SWIGPlus_nn22">Renaming</a>
<li><a href="#SWIGPlus_nn23">Wrapping Overloaded Functions and Methods</a>
<li><a href="#SWIGPlus_overloaded_methods">Wrapping Overloaded Functions and Methods</a>
<ul>
<li><a href="#SWIGPlus_nn24">Dispatch function generation</a>
<li><a href="#SWIGPlus_nn25">Ambiguity in Overloading</a>
@ -510,60 +510,7 @@ Usually, static members are accessed as functions with names in which the class
prepended with an underscore. For example, <tt>List_print</tt>.
</p>
<H3><a name="SWIGPlus_nn13"></a>6.5.7 Member functions and default arguments</H3>
SWIG allows member functions to accept default arguments. For example:
<blockquote>
<pre>
class Foo {
public:
void bar(int x, int y = 3);
};
</pre>
</blockquote>
However, the implementation restricts the use of default arguments to values
that are public. The following example illustrates a very subtle semantic
incompatibility between SWIG and C++:
<blockquote>
<pre>
class Foo {
private:
int spam;
public:
void bar(int x, int y = spam); // Illegal in SWIG. Private default value
};
</pre>
</blockquote>
When this occurs, you will get a couple of warning messages like this:
<blockquote>
<pre>
example.i:15. Warning 'spam' is private in this context.
example.i:15. Warning. Can't set default argument (ignored)
</pre>
</blockquote>
This incompatibility arises because default values in C++ are
evaluated in the same scope as the member function whereas SWIG
evaluates them in the scope of a wrapper function (meaning that the
values have to be public). The full set of arguments
are needed in the wrappers in order to support a number of advanced
customization features and the use of default arguments in ANSI C
(which is not part of the ANSI standard).
<p>
There are several somewhat clumsy ways to work around this problem
(which are not discussed here). However, a simpler solution may be to
reconsider your design--is it really <em>that</em> critical to make
the default argument private?
</p>
<H3><a name="SWIGPlus_nn14"></a>6.5.8 Member data</H3>
<H3><a name="SWIGPlus_nn13"></a>6.5.7 Member data</H3>
<p>
@ -675,7 +622,97 @@ involving <tt>size_t</tt>. This change is subtle, but it smooths over
a few problems related to structure wrapping and some of SWIG's
customization features.
<H2><a name="SWIGPlus_nn15"></a>6.6 Protection</H2>
<H2><a name="SWIGPlus_default_args"></a>6.6 Default arguments</H2>
SWIG will wrap all types of functions that have default arguments. For example member functions:
<blockquote>
<pre>
class Foo {
public:
void bar(int x, int y = 3, int z = 4);
};
</pre>
</blockquote>
<p>
SWIG handles default arguments by generating an extra overloaded method for each defaulted argument.
SWIG is effectively handling methods with default arguments as if it had wrapped the equivalent overloaded methods.
Thus for the example above, it is as if we had instead given the following to SWIG:
</p>
<blockquote>
<pre>
class Foo {
public:
void bar(int x, int y, int z);
void bar(int x, int y);
void bar(int x);
};
</pre>
</blockquote>
<p>
The wrappers produced are exactly the same as if the above code was instead fed into SWIG.
Details of this is covered later in the <a href="#SWIGPlus_overloaded_methods">Wrapping Overloaded Functions and Methods</a> section.
This approach allows SWIG to wrap all possible default arguments, but can be verbose.
For example if a method has ten default arguments, then eleven wrapper methods are generated.
</p>
<p>
<b>Compatibility note:</b> Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently.
Instead a single wrapper method was generated and the default values were copied into the C++ wrappers
so that the method being wrapped was then called with all the arguments specified.
If the size of the wrappers are a concern then this approach to wrapping methods with default arguments
can be re-activated by using the <tt>compactdefaultargs</tt> <a href="Customization.html#features">feature</a>.
</p>
<blockquote>
<pre>
%feature("compactdefaultargs") Foo::bar;
class Foo {
public:
void bar(int x, int y = 3, int z = 4);
};
</pre>
</blockquote>
<p>
This is great for reducing the size of the wrappers, but the caveat is it does not work for the strongly typed languages
which don't have optional arguments in the language, such as C# and Java.
Another restriction of this feature is that it cannot handle default arguments that are not public.
The following example illustrates this:
</p>
<blockquote>
<pre>
class Foo {
private:
static const int spam;
public:
void bar(int x, int y = spam); // Won't work with %feature("compactdefaultargs") -
// private default value
};
</pre>
</blockquote>
<p>
This produces uncompileable wrapper code because default values in C++ are
evaluated in the same scope as the member function whereas SWIG
evaluates them in the scope of a wrapper function (meaning that the
values have to be public).
</p>
<p>
This feature is automatically turned on when wrapping <a href="SWIG.html#SWIG_default_args">C code with default arguments</a>
and whenever keyword arguments (kwargs) are specified for either C or C++ code.
Keyword arguments are a language feature of some scripting languages, for example Ruby and Python.
SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.
</p>
<H2><a name="SWIGPlus_nn15"></a>6.7 Protection</H2>
SWIG can only wrap class members that are declared public. Anything
@ -689,16 +726,12 @@ until you explicitly give a `<tt>public:</tt>' declaration (This is
the same convention used by C++).
</p>
<p>
A subtle access problem relates to default values of member functions. Specifically,
default values must be public. Please go back to the section on default arguments for further details.
</p>
<H2><a name="SWIGPlus_nn16"></a>6.7 Enums and constants</H2>
<H2><a name="SWIGPlus_nn16"></a>6.8 Enums and constants</H2>
<p>
Enumerations and constants placed in a class definition are mapped
Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter.
However, many languages map enums and constants in a class definition
into constants with the classname as a prefix. For example :</p>
<blockquote><pre>
@ -721,7 +754,7 @@ Swig_STOUT = Swig::STOUT
Members declared as <tt>const</tt> are wrapped as read-only members and do not create constants.
<H2><a name="SWIGPlus_nn17"></a>6.8 Friends</H2>
<H2><a name="SWIGPlus_nn17"></a>6.9 Friends</H2>
Friend declarations are ignored by SWIG. For example, if you have this code:
@ -758,7 +791,7 @@ declaration does not define a method that operates on an instance of
an object nor does it define a declaration in the scope of the class.
Therefore, it would make no sense for SWIG to create wrappers as such.
<H2><a name="SWIGPlus_nn18"></a>6.9 References and pointers</H2>
<H2><a name="SWIGPlus_nn18"></a>6.10 References and pointers</H2>
<p>
@ -842,7 +875,7 @@ more seamless integration with more advanced C++ wrapping applications---especia
templates and the STL. This was first added in SWIG-1.3.12.
</p>
<H2><a name="SWIGPlus_nn19"></a>6.10 Pass and return by value</H2>
<H2><a name="SWIGPlus_nn19"></a>6.11 Pass and return by value</H2>
<p>
@ -922,7 +955,7 @@ It is not used for C++ pointers or references.
if possible (consider using references instead).
</p>
<H2><a name="SWIGPlus_nn20"></a>6.11 Inheritance</H2>
<H2><a name="SWIGPlus_nn20"></a>6.12 Inheritance</H2>
SWIG supports C++ public inheritance of classes and allows both
@ -1096,7 +1129,7 @@ of SWIG may apply further optimizations such as not regenerating
wrapper functions for virtual members that are already defined in a base class.
</p>
<H2><a name="SWIGPlus_nn21"></a>6.12 A brief discussion of multiple inheritance, pointers, and type checking</H2>
<H2><a name="SWIGPlus_nn21"></a>6.13 A brief discussion of multiple inheritance, pointers, and type checking</H2>
When a target scripting language refers to a C++ object, it normally
@ -1208,7 +1241,7 @@ more virtual functions).
The bottom line: learn to live with type-tagged pointers.
</p>
<H2><a name="SWIGPlus_nn22"></a>6.13 Renaming</H2>
<H2><a name="SWIGPlus_nn22"></a>6.14 Renaming</H2>
<p>
@ -1256,7 +1289,7 @@ overloaded methods, it really doesn't work very well because it
requires a lot of additional markup in your interface. Keep reading
for a better solution.
<H2><a name="SWIGPlus_nn23"></a>6.14 Wrapping Overloaded Functions and Methods</H2>
<H2><a name="SWIGPlus_overloaded_methods"></a>6.15 Wrapping Overloaded Functions and Methods</H2>
In many language modules, SWIG provides partial support for overloaded functions, methods, and
@ -1311,7 +1344,7 @@ it might be used like this
</pre>
</blockquote>
<H3><a name="SWIGPlus_nn24"></a>6.14.1 Dispatch function generation</H3>
<H3><a name="SWIGPlus_nn24"></a>6.15.1 Dispatch function generation</H3>
The implementation of overloaded functions and methods is somewhat
@ -1424,7 +1457,7 @@ checked in the same order as they appear in this ranking.
If you're still confused, don't worry about it---SWIG is probably doing the right thing.
</p>
<H3><a name="SWIGPlus_nn25"></a>6.14.2 Ambiguity in Overloading</H3>
<H3><a name="SWIGPlus_nn25"></a>6.15.2 Ambiguity in Overloading</H3>
Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider
@ -1525,7 +1558,7 @@ foo.i:5. Previous declaration is Spam::foo(int )
it means that the target language module has not yet implemented support for overloaded
functions and methods. The only way to fix the problem is to read the next section.
<H3><a name="ambiguity_resolution_renaming"></a>6.14.3 Ambiguity resolution and renaming</H3>
<H3><a name="ambiguity_resolution_renaming"></a>6.15.3 Ambiguity resolution and renaming</H3>
If an ambiguity in overload resolution occurs or if a module doesn't
@ -1805,7 +1838,7 @@ above:
</li>
</ul>
<H3><a name="SWIGPlus_nn27"></a>6.14.4 Comments on overloading</H3>
<H3><a name="SWIGPlus_nn27"></a>6.15.4 Comments on overloading</H3>
Support for overloaded methods was first added in SWIG-1.3.14. The implementation
@ -1820,7 +1853,7 @@ As a general rule, statically typed languages like Java are able to provide more
than dynamically typed languages like Perl, Python, Ruby, and Tcl.
</p>
<H2><a name="SWIGPlus_nn28"></a>6.15 Wrapping overloaded operators</H2>
<H2><a name="SWIGPlus_nn28"></a>6.16 Wrapping overloaded operators</H2>
Starting in SWIG-1.3.10, C++ overloaded operator declarations can be wrapped.
@ -1986,7 +2019,7 @@ are ignored as well as conversion operators.
</li>
</ul>
<H2><a name="SWIGPlus_nn29"></a>6.16 Class extension</H2>
<H2><a name="SWIGPlus_nn29"></a>6.17 Class extension</H2>
<p>
@ -2048,7 +2081,7 @@ be used to extend a structure with more than just methods, a more suitable
directive name has been chosen.
</p>
<H2><a name="SWIGPlus_nn30"></a>6.17 Templates</H2>
<H2><a name="SWIGPlus_nn30"></a>6.18 Templates</H2>
In all versions of SWIG, template type names may appear anywhere a type
@ -2718,7 +2751,7 @@ as the class name. For example:
Similar changes apply to typemaps and other customization features.
<H2><a name="SWIGPlus_nn31"></a>6.18 Namespaces</H2>
<H2><a name="SWIGPlus_nn31"></a>6.19 Namespaces</H2>
Support for C++ namespaces is a relatively late addition to SWIG,
@ -3108,7 +3141,7 @@ more advanced namespace support.
</p>
<H2><a name="SWIGPlus_nn32"></a>6.19 Exception specifiers</H2>
<H2><a name="SWIGPlus_nn32"></a>6.20 Exception specifiers</H2>
When C++ programs utilize exceptions, exceptional behavior is sometimes specified as
@ -3150,7 +3183,7 @@ properly handle C++ exceptions. To do that, a different set of special SWIG dire
Consult the "<a href="Customization.html#Customization">Customization features</a>" chapter for details.
</p>
<H2><a name="SWIGPlus_nn33"></a>6.20 Pointers to Members</H2>
<H2><a name="SWIGPlus_nn33"></a>6.21 Pointers to Members</H2>
Starting with SWIG1.3.7, there is limited parsing support for pointers to C++ class members.
@ -3194,7 +3227,7 @@ when checking types. However, no such support is currently provided
for member pointers.
</p>
<H2><a name="SWIGPlus_nn34"></a>6.21 Smart pointers and operator-&gt;()</H2>
<H2><a name="SWIGPlus_nn34"></a>6.22 Smart pointers and operator-&gt;()</H2>
In some C++ programs, objects are often encapsulated by smart-pointers
@ -3387,7 +3420,7 @@ p = f.__deref__() # Raw pointer from operator-&gt;
</p>
<H2><a name="SWIGPlus_nn35"></a>6.22 Using declarations and inheritance</H2>
<H2><a name="SWIGPlus_nn35"></a>6.23 Using declarations and inheritance</H2>
<tt>using</tt> declarations are sometimes used to adjust access to members of
@ -3537,7 +3570,7 @@ public:
</blockquote>
</ul>
<H2><a name="SWIGPlus_nn36"></a>6.23 Partial class definitions</H2>
<H2><a name="SWIGPlus_nn36"></a>6.24 Partial class definitions</H2>
Since SWIG is still limited in its support of C++, it may be necessary
@ -3568,7 +3601,7 @@ Also, as a rule of thumb, SWIG should not be used on raw C++ source
files.
</p>
<H2><a name="SWIGPlus_nn37"></a>6.24 A brief rant about const-correctness</H2>
<H2><a name="SWIGPlus_nn37"></a>6.25 A brief rant about const-correctness</H2>
A common issue when working with C++ programs is dealing with all
@ -3620,7 +3653,7 @@ using another tool if maintaining constness is the most important part
of your project.
</p>
<H2><a name="SWIGPlus_nn38"></a>6.25 Proxy classes</H2>
<H2><a name="SWIGPlus_nn38"></a>6.26 Proxy classes</H2>
In order to provide a more natural API, many of SWIG's target
@ -3630,7 +3663,7 @@ For example, if you're building a Python module, each C++ class is
wrapped with Python class. Or if you're building a Java module, each
C++ class is wrapped by a Java class.
<H3><a name="SWIGPlus_nn39"></a>6.25.1 Construction of proxy classes</H3>
<H3><a name="SWIGPlus_nn39"></a>6.26.1 Construction of proxy classes</H3>
Proxy classes are always constructed as an extra layer of wrapping that uses the low-level
@ -3707,7 +3740,7 @@ Whenever possible, proxies try to take advantage of language features that are s
might include operator overloading, exception handling, and other features.
</p>
<H3><a name="SWIGPlus_nn40"></a>6.25.2 Resource management in proxies</H3>
<H3><a name="SWIGPlus_nn40"></a>6.26.2 Resource management in proxies</H3>
A major issue with proxies concerns the memory management of wrapped objects. Consider the following
@ -3851,13 +3884,13 @@ Given the tricky nature of C++ memory management, it is impossible for proxy cla
every possible memory management problem. However, proxies do provide a mechanism for manual control that
can be used (if necessary) to address some of the more tricky memory management problems.
<H3><a name="SWIGPlus_nn41"></a>6.25.3 Language specific details</H3>
<H3><a name="SWIGPlus_nn41"></a>6.26.3 Language specific details</H3>
Language specific details on proxy classes are contained the chapters describing each target language. This
chapter has merely introduced the topic in a very general way.
<H2><a name="SWIGPlus_nn42"></a>6.26 Where to go for more information</H2>
<H2><a name="SWIGPlus_nn42"></a>6.27 Where to go for more information</H2>
If you're wrapping serious C++ code, you might want to pick up a copy

View file

@ -1771,6 +1771,8 @@ they aren't supported (like C).
<p>
Once a default typemap has been applied to an argument, all arguments
that follow must have default values.
See the <a href="SWIG.html#SWIG_default_args">Default/optional arguments</a> section
for further information on default argument wrapping.
</p>
<H3><a name="Typemaps_nn31"></a>10.5.6 "check" typemap</H3>