GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/pinocchio/bindings/python/utils/list.hpp Lines: 0 11 0.0 %
Date: 2024-01-23 21:41:47 Branches: 0 48 0.0 %

Line Branch Exec Source
1
//
2
// Copyright (c) 2019 INRIA
3
//
4
5
#ifndef __pinocchio_python_utils_list_hpp__
6
#define __pinocchio_python_utils_list_hpp__
7
8
#include "pinocchio/bindings/python/fwd.hpp"
9
10
#include <eigenpy/exception.hpp>
11
12
#include <boost/python.hpp>
13
#include <boost/python/type_id.hpp>
14
#include <vector>
15
#include <sstream>
16
#include <string>
17
18
namespace pinocchio
19
{
20
  namespace python
21
  {
22
23
    template<typename T, class Allocator>
24
    void extract(const boost::python::list & list, std::vector<T,Allocator> & vec)
25
    {
26
      namespace bp = boost::python;
27
28
      size_t size_list = (size_t)bp::len(list);
29
      vec.resize(size_list);
30
      for(size_t i = 0; i < size_list; ++i)
31
      {
32
        bp::extract<T> input_T(list[i]);
33
        if(input_T.check())
34
          vec[i] = input_T();
35
        else
36
        {
37
          const std::string classname
38
          = bp::extract<std::string>(list[i].attr("__class__").attr("__name__"));
39
          std::stringstream ss;
40
          ss << "The conversion from " << classname << " to "
41
             << bp::type_id<T>().name() << " has failed." << std::endl;
42
          throw eigenpy::Exception(ss.str());
43
        }
44
      }
45
    }
46
47
    template<typename T>
48
    std::vector<T,std::allocator<T> > extract(const boost::python::list & list)
49
    {
50
      std::vector<T,std::allocator<T> > vec;
51
      extract(list,vec);
52
      return vec;
53
    }
54
55
    template<typename T, class Allocator>
56
    std::vector<T,Allocator> extract(const boost::python::list & list)
57
    {
58
      std::vector<T,Allocator> vec;
59
      extract(list,vec);
60
      return vec;
61
    }
62
63
  } // namespace python
64
} // namespace pinocchio
65
66
#endif // ifndef __pinocchio_python_utils_list_hpp__