From 96716133726ff1bec53a73c15a09ab52a113fc3c Mon Sep 17 00:00:00 2001
From: William S Fulton
+The %shared_ptr macro should be used for all the required instantiations
+of the template before each of the %template instantiations.
+For example, consider number.h containing the following illustrative template:
+
-Only the single %shared_ptr declaration should be used for all specializations
-of the template before the first template instantiation using the following notation:
-%shared_ptr(TemplateName<>). For example:
+The SWIG code below shows the required ordering:
-The %inline directive inserts all of the code that follows
+This is the same as writing:
+
+In other words, the %inline directive inserts all of the code that follows
verbatim into the header portion of an interface file. The code is
then parsed by both the SWIG preprocessor and parser.
Thus, the above example creates a new command new_Vector using only one
@@ -3314,10 +3331,10 @@ declaration. Since the code inside an %inline %{ ... %} block
is given to both the C compiler and SWIG, it is illegal to include any
SWIG directives inside a %{ ... %} block.
-Note: Any #include directives are omitted inside the
-%inline %{ ... %} block unless the -includeall command line
-option is supplied.9.4.4.3 shared_ptr and templates
+
+#include <memory>
+
+template<int N> struct Number {
+ int num;
+ Number() : num(N) {}
+ static std::shared_ptr<Number<N>> make() { return std::make_shared<Number<N>>(); }
+};
+
+
%include <std_shared_ptr.i>
-%shared_ptr(Graph<>); // Declaration of the transparent shared ptr for the Graph template
+%shared_ptr(Number<10>);
+%shared_ptr(Number<42>);
%{
- #include "graph.h" // Graph definition (inside the namespace gany)
- using namespace gany;
+ #include "number.h"
%}
+%include "number.h"
-%include "graph.h" // Graph declaration (inside the namespace gany)
-using namespace gany;
-
-%template(SGraph) Graph<false>; // Simple graph
-// Note: the Graph name is redefined in the following line from the template to the specialization (class)
-%template(WGraph) Graph<true>; // Weighted graph
+%template(Number10) Number<10>;
+%template(Number42) Number<42>;
+%{
+/* Create a new vector */
+Vector *new_Vector() {
+ return (Vector *) malloc(sizeof(Vector));
+}
+%}
+
+/* Create a new vector */
+Vector *new_Vector() {
+ return (Vector *) malloc(sizeof(Vector));
+}
+