Given this set of files:
foo.h:
#pragma once
#include <stdio.h>
template <class T0> class Foo {
public:
T0 m[3];
Foo(const T0 &a, const T0 &b, const T0 &c) {
m[0] = a;
m[1] = b;
m[2] = c;
}
void info() { printf("%d %d %d\n", m[0], m[1], m[2]); }
// T0 &operator[](int id) { return ((T0 *)m)[id]; }
};
foo.cpp:
#include "foo.h"
foo.i (Attempt1):
%module foo
%{
#include "foo.h"
%}
%include "foo.h"
%template(intFoo) Foo<int>;
%extend Foo{
T0& __getitem__(int id) { return ((T0 *)m)[id]; }
}
setup.py:
import os
import sys
from setuptools import setup, Extension
foo_module = Extension('_foo',
sources=[
'foo.i',
'foo.cpp'
],
swig_opts=['-c++', '-py3', '-builtin'],
include_dirs=['.']
)
setup(name='foo',
version='0.1',
platforms=['Windows', 'Linux'],
ext_modules=[foo_module],
py_modules=["foo"],
)
test.py:
from foo import intFoo
a = intFoo(10,20,30)
print(dir(a))
a.info()
print(a[2])
I build the extension running:
python setup.py build_ext --force -i
but when i try to run test.py i'll get:
TypeError: 'foo.intFoo' object does not support indexing
The statement extend in foo.i is the answer suggested on any other SO related threads, that means I'm using it incorrectly here. Could anyone explain how to fix this so when i run test.py is able to use the [] operator succesfully?
Another attempts:
Attempt2:
%module foo %{ #include "foo.h" %} %include "foo.h" %template(intFoo) Foo<int>; %extend intFoo{ T0& __getitem__(int id) { return ((T0 *)m)[id]; } }Throws this error
TypeError: 'foo.intFoo' object does not support indexingAttempt3
%module foo %{ #include "foo.h" %} %include "foo.h" %extend Foo{ T0& __getitem__(int id) { return ((T0 *)m)[id]; } } %template(intFoo) Foo<int>;Throws this error
foo_wrap.cpp(3808): error C2065: 'm': undeclared identifier
%extend intFooor move the%extend Foobefore%template(intFoo).%extendfeature does not work together with the-builtinoption