File: stl_binders.hpp

package info (click to toggle)
mrpt 1%3A2.15.10%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 92,552 kB
  • sloc: cpp: 558,205; ansic: 36,841; xml: 3,872; python: 2,195; sh: 524; makefile: 232
file content (107 lines) | stat: -rw-r--r-- 3,836 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
// vi: set ts=2 noet:
//
// Copyright (c) 2016 Sergey Lyskov <sergey.lyskov@jhu.edu>
//
// All rights reserved. Use of this source code is governed by a
// MIT license that can be found in the LICENSE file.

/// @file   binder/std_binders.hpp
/// @brief  Support for custom binders for some std:: template classes
/// @author Sergey Lyskov


#ifndef _INCLUDED_std_binders_hpp_
#define _INCLUDED_std_binders_hpp_

#include <map>
#include <deque>
#include <pybind11/stl_bind.h>

namespace binder {

template <typename T, class Allocator> class vector_binder
{
	using Vector = std::vector<T, Allocator>;
	using SizeType = typename Vector::size_type;

	using Class_ = pybind11::class_<Vector, std::shared_ptr< Vector > >;


public:
	vector_binder(pybind11::module &m, std::string const &name, std::string const & /*allocator name*/)
	{
		using Vector = std::vector<T, Allocator>;
		using holder_type = std::shared_ptr<std::vector<T, Allocator>>;
		using Class_ = pybind11::class_<Vector, holder_type>;

		Class_ cl = pybind11::bind_vector<Vector, holder_type>(m, "vector_" + name);

		// cl.def(pybind11::init<size_type>());
		// cl.def("resize", (void (Vector::*) (size_type count)) & Vector::resize, "changes the number of elements stored");

		cl.def("empty", &Vector::empty, "checks whether the container is empty");
		cl.def("max_size", &Vector::max_size, "returns the maximum possible number of elements");
		cl.def("reserve", &Vector::reserve, "reserves storage");
		cl.def("capacity", &Vector::capacity, "returns the number of elements that can be held in currently allocated storage");
		cl.def("shrink_to_fit", &Vector::shrink_to_fit, "reduces memory usage by freeing unused memory");
		cl.def("clear", &Vector::clear, "clears the contents");
		cl.def("swap", (void(Vector::*)(Vector &)) & Vector::swap, "swaps the contents");



		// cl.def("front", [](Vector &v) {
		// 		if (v.size()) return v.front();
		// 		else throw pybind11::index_error();
		// 	}, "access the first element");
		// cl.def("back", [](Vector &v) {
		// 		if (v.size()) return v.back();
		// 		else throw pybind11::index_error();
		// 	}, "access the last element ");
	}
};


template <typename Key, typename T, typename Compare, class Allocator> class map_binder
{
public:
	map_binder(pybind11::module &m, std::string const &key_name, std::string const &value_name, std::string const & /*compare name*/, std::string const & /*allocator name*/)
	{
		using Map = std::map<Key, T, Compare, Allocator>;
		using holder_type = std::shared_ptr< std::map<Key, T, Compare, Allocator> >;
		using Class_ = pybind11::class_<Map, holder_type>;

		Class_ cl = pybind11::bind_map<Map, holder_type>(m, "map_" + key_name + '_' + value_name);
	}
};

template <typename T, class Allocator> class deque_binder
{
	using Vector = std::deque<T, Allocator>;
	using SizeType = typename Vector::size_type;

	using Class_ = pybind11::class_<Vector, std::shared_ptr< Vector > >;


public:
	deque_binder(pybind11::module &m, std::string const &name, std::string const & /*allocator name*/)
	{
		using Vector = std::deque<T, Allocator>;
		using holder_type = std::shared_ptr<std::deque<T, Allocator>>;
		using Class_ = pybind11::class_<Vector, holder_type>;

		Class_ cl = pybind11::bind_vector<Vector, holder_type>(m, "deque_" + name);

		// cl.def(pybind11::init<size_type>());
		// cl.def("resize", (void (Vector::*) (size_type count)) & Vector::resize, "changes the number of elements stored");

		cl.def("empty", &Vector::empty, "checks whether the container is empty");
		cl.def("clear", &Vector::clear, "clears the contents");
		cl.def("swap", (void(Vector::*)(Vector &)) & Vector::swap, "swaps the contents");
	}
};


} // namespace binder

#endif // _INCLUDED_std_binders_hpp_