Как сделать, чтобы std :: map содержал различные типы данных в swig? - PullRequest
0 голосов
/ 13 января 2020

Как мне сделать deque<map<char, int>> fp(vector<int> inp_list) до deque<map<char, any>> fp, где в any Я хочу, чтобы эта карта содержала int, строку и список массивов. Я знаю, что существуют некоторые решения, такие как в C ++ 17. Я могу использовать Any, как указано в этой ссылке , но как связать его с Swig? Я не могу найти ссылки, где кто-то использовал карту для различных типов данных в swig.

f_p.i:

%module f_p
#define SWIGPYTHON_BUILTIN

%{
  #include "numpy/arrayobject.h"
  #define SWIG_FILE_WITH_INIT  /* To import_array() below */
  #include "f_p.h"
%}

%include "std_map.i"
%import "std_deque.i" 
// %include "numpy.i"
%import "std_vector.i" 

#include <deque>

%template() std::vector<int>;

%template (map) std::map<char,int>;
%template(MapDeque) std::deque<std::map<char, int>>;

%typemap(ret) std::deque<std::map<char, int>> {
  $result = PyTuple_New($1.size());
  for (int i = 0; i < (int)$1.size(); ++i)
    PyTuple_SetItem($result, i, swig::traits_from<std::map<char, int>>::asdict($1[i]));
}


%include "f_p.h"

f_p. cpp:

#include <deque> 
#include <iostream> 
using namespace std; 

#include <vector>
#include <map>  

deque<map<char, int>> fp(vector<int> inp_list) 
{
    map<char, int> my_map = {
    { 'A', 1 },
    { 'B', 2 },
    { 'C', 3 }
    };
    deque<map<char, int>> mydeque;
    mydeque.push_back(my_map); 
    return mydeque;
}

f_p.h:

#ifndef F_P_H
#define f_P_H
#include <stdio.h>
#include <deque>
#include <map>
#include <vector>

/* Define function prototype */
std::deque<std::map<char, int>> fp(std::vector<int> inp_list) ;
#endif

build. sh:

rm *.o f_p_wrap.cpp _f_p.so f_p.py
rm -rf __pycache__

g++ -O3 -march=native -fPIC -c f_p.cpp

swig -python -c++ -o f_p_wrap.cpp f_p.i

# Next, compile the wrapper code:

g++ -O3 -march=native -w -fPIC -c $(pkg-config --cflags --libs python3) -I /home/kriti/anaconda3/lib/python3.7/site-packages/numpy/core/include f_p.cpp f_p_wrap.cpp

g++ -std=c++11 -O3 -march=native -shared f_p.o f_p_wrap.o -o _f_p.so -lm
...