Re: Conversion of Python list to class that takes a vector in a constructor

Lluís Alemany Puig <[email protected]> Thu, 28 Oct 2021 07:34:48 +0200
Newsgroups gmane.comp.programming.swig
Message-ID <[email protected]>
Hello,

I finally managed to make the typemap and typecheck work (after reading 
very carefully the documentation, looking at examples on the internet 
and learning about Python's C API), but this %implicitconv seems to deal 
with more cases than I can handle with basic knowledge of the former 
two. Thanks a lot for mentioning %implicitconv. I didn't know about this 
feature at all.

Lluís

On 27/10/2021 20:18, William S Fulton wrote:
> Take a look at %implicitconv mentioned in the CHANGES file 
> http://swig.org/Release/CHANGES <http://swig.org/Release/CHANGES>
>
> I think this should work:
>
> %implicitconv S;
>
> William
>
> On Mon, 25 Oct 2021 at 13:30, Lluís Alemany Puig 
> <[email protected] <mailto:[email protected]>> wrote:
>
>     Hello all,
>
>     I have a C++ class S which takes a std::vector<int> as only input
>     parameter in one of its constructors. I can create an object of S
>     normally from Python using its constructor passing to it a python
>     list ([1,2,3,...]). However, I can't call the function
>     calculate_sum (which takes a const S&) when I pass to it a python
>     list instead an object of type S. To be more precise, in the
>     following python code, the print("3:", ...)
>
>         import library
>         print("1:", library.return_pair(10))
>         d = library.D()
>         d.v = 3
>         print("2:", library.calculate_sum(d, library.S([1,2,3,4])))
>         print("3:", library.calculate_sum(d, [1,2,3,4]))
>
>     fails with the expected error message:
>
>         Traceback (most recent call last):
>           File "test.py", line 6, in <module>
>             print(library.calculate_sum(d, [1,2,3,4]))
>           File "library.py", line 261, in calculate_sum
>             return _library.calculate_sum(d, s)
>         TypeError: in method 'calculate_sum', argument 2 of type 'S
>         const &'
>
>     I'm trying to overcome this problem. That is, I would like python
>     to create an object of type S given that it has a constructor with
>     a vector (C++ code at the end). Can this be done? If so, how? I
>     tried typemaps but I don't seem to be able to get them working for
>     this.
>
>     Many thanks in advance.
>
>     Looking forward to hearing from you,
>
>     Lluís.
>
>     C++ code:
>
>         #pragma once
>         #include <vector>
>         class D {
>         public:
>             int v;
>         };
>
>         class S {
>         public:
>             S() noexcept = default;
>             S(const std::vector<int>& _v) noexcept : v(_v) {}
>             int elemsum() const noexcept {
>                 int s = 0;
>                 for (int k : v) { s += k; }
>                 return s;
>             }
>         private:
>             std::vector<int> v;
>         };
>
>         int calculate_sum(const D& d, const S& s) { return s.elemsum()
>         + d.v; }
>         std::pair<int, S> return_pair(int v) {
>             S s(std::vector<int>(v,v));
>             return {s.elemsum(), s};
>         }
>
>     Interface file (.i):
>
>         %module library
>
>         %include stdint.i
>         %include std_string.i
>         %include std_pair.i
>         %include std_vector.i
>
>         %template(_list_int) std::vector<int>;
>
>         %{
>         #include <sstream>
>         #include "library.hpp"
>         %}
>
>         %include library.hpp
>
>         %extend S {
>             std::string __repr__() const {
>                 std::ostringstream out;
>                 out << "I am a simple 'S'";
>                 return out.str();
>             }
>         }
>
>         %template(_pair_int_S) std::pair<int, S>;
>
>     Makefile:
>
>         _library.so: library.o
>             g++ -shared -O3 -o _library.so library.o -L
>         /usr/lib/x86_64-linux-gnu/ -lpython3.8
>         library.o: library.cxx
>             g++ -fPIC -std=c++17 -O3 -c library.cxx -I
>         /usr/include/python3.8
>         library.cxx: library.i library.hpp
>             swig -Wall -debug-tmused -c++ -python -py3 -o library.cxx
>         library.i
>         clean:
>             rm -f library.cxx
>             rm -f library.py
>             rm -f library.o
>             rm -f _library.so
>
>     _______________________________________________
>     Swig-user mailing list
>     [email protected]
>     <mailto:[email protected]>
>     https://lists.sourceforge.net/lists/listinfo/swig-user
>     <https://lists.sourceforge.net/lists/listinfo/swig-user>
>

_______________________________________________
Swig-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/swig-user