extending 'incomplete' types (SWIG)
Asked Answered
E

1

2

I'm looking for a way to extend (i.e. add new members to a type using the %extend directive) a type that is defined in the library file itself while the header files of the library provide only a forward declaration for the type.

Treating the type as if its definition is known at compile time, leads to the following warning:

Warning 303: %extend defined for an undeclared class [name of the type].

Is anyone aware of a solution or a workaround for this problem? I'm sure there is one, since SWIG's documentation states that swig assumes that the unknown type is a struct or a union each time it finds one.

Many thanks in advance!

Electromechanical answered 3/4, 2012 at 14:1 Comment(2)
SWIG is the regexp of interop. Now you have two problems.Demoiselle
@HansPassant I disagree. SWIG is a bit "quirky" but once you understand its idiosyncrasies it's very powerful with useful encapsulation+abstractions.Bloodstream
B
5

You can very easily add extra methods to a type which has been forward declared in SWIG by giving it an empty definition in the interface, e.g.

test.h:

// Forward declare foo
struct foo;

test.i:

%module test

// Tell SWIG to wrap foo "properly", but that you don't know anything about it:
struct foo { };

%include "test.h"

%extend foo {
  void bar() {
    // Do stuff, probably with $self, here
  }
}

The key is that in the interface file you're not actually writing C or C++ in the normal sense, you're telling SWIG what types and what parts of each type to wrap.

Since you will presumably be relying on the library to create and destroy instances you'll also want to add:

%nodefaultctor foo; 
%nodefaultdtor foo; 

In the interface file to suppress the constructor/destructor generation and force it to go through the library.

Bloodstream answered 4/4, 2012 at 9:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.