23 template <
typename T2>
static std::true_type test_comparable(decltype(std::declval<const T2 &>() == std::declval<const T2 &>())*);
24 template <
typename T2>
static std::false_type test_comparable(...);
25 template <
typename T2>
static std::true_type test_value(
typename T2::value_type *);
26 template <
typename T2>
static std::false_type test_value(...);
27 template <
typename T2>
static std::true_type test_pair(
typename T2::first_type *,
typename T2::second_type *);
28 template <
typename T2>
static std::false_type test_pair(...);
30 static constexpr
const bool is_comparable = std::is_same<std::true_type, decltype(test_comparable<T>(
nullptr))>
::value;
31 static constexpr
const bool is_pair = std::is_same<std::true_type, decltype(test_pair<T>(
nullptr,
nullptr))>
::value;
32 static constexpr
const bool is_vector = std::is_same<std::true_type, decltype(test_value<T>(
nullptr))>
::value;
33 static constexpr
const bool is_element = !is_pair && !is_vector;
37 template <
typename T,
typename SFINAE =
void>
50 static constexpr
const bool value =
57 static constexpr
const bool value =
66 template <
typename,
typename,
typename... Args>
void vector_modifiers(
const Args &...) { }
68 template<
typename Vector,
typename Class_>
70 cl.def(init<const Vector &>(),
"Copy constructor");
73 template<
typename Vector,
typename Class_>
75 using T =
typename Vector::value_type;
81 [](
const Vector &v,
const T &
x) {
82 return std::count(v.begin(), v.end(),
x);
85 "Return the number of times ``x`` appears in the list" 88 cl.def(
"remove", [](Vector &v,
const T &x) {
89 auto p = std::find(v.begin(), v.end(),
x);
96 "Remove the first item from the list whose value is x. " 97 "It is an error if there is no such item." 100 cl.def(
"__contains__",
101 [](
const Vector &v,
const T &x) {
102 return std::find(v.begin(), v.end(),
x) != v.end();
105 "Return true the container contains ``x``" 112 template <
typename Vector,
typename Class_>
114 using T =
typename Vector::value_type;
115 using SizeType =
typename Vector::size_type;
116 using DiffType =
typename Vector::difference_type;
118 auto wrap_i = [](DiffType
i, SizeType n) {
121 if (i < 0 || (SizeType)i >= n)
127 [](Vector &v,
const T &
value) { v.push_back(value); },
129 "Add an item to the end of the list");
132 auto v = std::unique_ptr<Vector>(
new Vector());
135 v->push_back(h.cast<T>());
140 [](Vector &v,
const Vector &src) {
141 v.insert(v.end(), src.begin(), src.end());
144 "Extend the list by appending all the items in the given list" 149 const size_t old_size = v.size();
153 v.push_back(h.cast<T>());
156 v.erase(v.begin() +
static_cast<typename Vector::difference_type
>(old_size), v.end());
159 }
catch (
const std::exception &) {
166 "Extend the list by appending all the items in the given list" 170 [](Vector &v, DiffType i,
const T &
x) {
174 if (i < 0 || (SizeType)i > v.size())
176 v.insert(v.begin() +
i,
x);
179 "Insert an item at a given position." 190 "Remove and return the last item" 194 [wrap_i](Vector &v, DiffType i) {
195 i = wrap_i(i, v.size());
196 T t = v[(SizeType) i];
197 v.erase(v.begin() +
i);
201 "Remove and return the item at index ``i``" 204 cl.def(
"__setitem__",
205 [wrap_i](Vector &v, DiffType i,
const T &t) {
206 i = wrap_i(i, v.size());
212 cl.def(
"__getitem__",
213 [](
const Vector &v,
slice slice) -> Vector * {
214 size_t start, stop, step, slicelength;
216 if (!slice.compute(v.size(), &start, &stop, &step, &slicelength))
219 Vector *seq =
new Vector();
220 seq->reserve((
size_t) slicelength);
222 for (
size_t i=0; i<slicelength; ++
i) {
223 seq->push_back(v[start]);
229 "Retrieve list elements using a slice object" 232 cl.def(
"__setitem__",
233 [](Vector &v, slice slice,
const Vector &value) {
234 size_t start, stop, step, slicelength;
235 if (!slice.compute(v.size(), &start, &stop, &step, &slicelength))
238 if (slicelength != value.size())
239 throw std::runtime_error(
"Left and right hand size of slice assignment have different sizes!");
241 for (
size_t i=0; i<slicelength; ++
i) {
246 "Assign list elements using a slice object" 249 cl.def(
"__delitem__",
250 [wrap_i](Vector &v, DiffType i) {
251 i = wrap_i(i, v.size());
252 v.erase(v.begin() +
i);
254 "Delete the list elements at index ``i``" 257 cl.def(
"__delitem__",
258 [](Vector &v, slice slice) {
259 size_t start, stop, step, slicelength;
261 if (!slice.compute(v.size(), &start, &stop, &step, &slicelength))
264 if (step == 1 &&
false) {
265 v.erase(v.begin() + (DiffType) start, v.begin() + DiffType(start + slicelength));
267 for (
size_t i = 0; i < slicelength; ++
i) {
268 v.erase(v.begin() + DiffType(start));
273 "Delete list elements using a slice object" 281 std::is_same<decltype(std::declval<Vector>()[
typename Vector::size_type()]),
typename Vector::value_type &>>;
284 template <
typename Vector,
typename Class_>
286 using T =
typename Vector::value_type;
287 using SizeType =
typename Vector::size_type;
288 using DiffType =
typename Vector::difference_type;
289 using ItType =
typename Vector::iterator;
291 auto wrap_i = [](DiffType
i, SizeType n) {
294 if (i < 0 || (SizeType)i >= n)
299 cl.def(
"__getitem__",
300 [wrap_i](Vector &v, DiffType i) -> T & {
301 i = wrap_i(i, v.size());
302 return v[(SizeType)i];
304 return_value_policy::reference_internal
310 return_value_policy::reference_internal, ItType, ItType, T&>(
318 template <
typename Vector,
typename Class_>
320 using T =
typename Vector::value_type;
321 using SizeType =
typename Vector::size_type;
322 using DiffType =
typename Vector::difference_type;
323 using ItType =
typename Vector::iterator;
324 cl.def(
"__getitem__",
325 [](
const Vector &v, DiffType
i) -> T {
326 if (i < 0 && (i += v.size()) < 0)
328 if ((SizeType)i >= v.size())
330 return v[(SizeType)i];
337 return_value_policy::copy, ItType, ItType, T>(
345 -> decltype(std::declval<std::ostream&>() << std::declval<typename Vector::value_type>(),
void()) {
346 using size_type =
typename Vector::size_type;
350 std::ostringstream s;
352 for (size_type
i=0;
i < v.size(); ++
i) {
354 if (
i != v.size() - 1)
360 "Return the canonical string representation of this list." 366 template <
typename Vector,
typename =
void>
368 template <
typename Vector>
372 template <
typename Vector,
typename Class_,
typename... Args>
375 using T =
typename Vector::value_type;
387 auto info = buf.request();
388 if (info.ndim != 1 || info.strides[0] % static_cast<ssize_t>(
sizeof(T)))
389 throw type_error(
"Only valid 1D buffers can be copied to a vector");
393 auto vec = std::unique_ptr<Vector>(
new Vector());
394 vec->reserve((
size_t) info.shape[0]);
395 T *p =
static_cast<T*
>(info.ptr);
397 T *
end = p + info.shape[0] * step;
398 for (; p !=
end; p += step)
400 return vec.release();
406 template <
typename Vector,
typename Class_,
typename... Args>
414 template <
typename Vector,
typename holder_type = std::unique_ptr<Vector>,
typename... Args>
420 using vtype =
typename Vector::value_type;
421 auto vtype_info = detail::get_type_info(
typeid(vtype));
422 bool local = !vtype_info || vtype_info->module_local;
432 detail::vector_if_copy_constructible<Vector, Class_>(cl);
435 detail::vector_if_equal_operator<Vector, Class_>(cl);
438 detail::vector_if_insertion_operator<Vector, Class_>(cl, name);
441 detail::vector_modifiers<Vector, Class_>(cl);
444 detail::vector_accessor<Vector, Class_>(cl);
447 [](
const Vector &v) ->
bool {
450 "Check whether the list is nonempty" 460 cl.def(init<size_type>());
463 (
void (Vector::*) (size_type count)) & Vector::resize,
464 "changes the number of elements stored");
467 [](Vector &v, SizeType
i) {
470 v.erase(v.begin() +
i);
471 },
"erases element at index ``i``");
473 cl.def(
"empty", &Vector::empty,
"checks whether the container is empty");
474 cl.def(
"size", &
Vector::size,
"returns the number of elements");
475 cl.def(
"push_back", (
void (Vector::*)(
const T&)) &Vector::push_back,
"adds an element to the end");
476 cl.def(
"pop_back", &Vector::pop_back,
"removes the last element");
478 cl.def(
"max_size", &Vector::max_size,
"returns the maximum possible number of elements");
479 cl.def(
"reserve", &Vector::reserve,
"reserves storage");
480 cl.def(
"capacity", &Vector::capacity,
"returns the number of elements that can be held in currently allocated storage");
481 cl.def(
"shrink_to_fit", &Vector::shrink_to_fit,
"reduces memory usage by freeing unused memory");
483 cl.def(
"clear", &Vector::clear,
"clears the contents");
484 cl.def(
"swap", &Vector::swap,
"swaps the contents");
486 cl.def(
"front", [](Vector &v) {
487 if (v.size())
return v.front();
489 },
"access the first element");
491 cl.def(
"back", [](Vector &v) {
492 if (v.size())
return v.back();
494 },
"access the last element ");
511 template <
typename,
typename,
typename... Args>
void map_assignment(
const Args &...) { }
514 template <
typename Map,
typename Class_>
516 using KeyType =
typename Map::key_type;
517 using MappedType =
typename Map::mapped_type;
519 cl.def(
"__setitem__",
520 [](Map &m,
const KeyType &k,
const MappedType &v) {
522 if (it != m.end()) it->second = v;
523 else m.emplace(k, v);
529 template<
typename Map,
typename Class_>
534 using KeyType =
typename Map::key_type;
535 using MappedType =
typename Map::mapped_type;
537 cl.def(
"__setitem__",
538 [](Map &m,
const KeyType &k,
const MappedType &v) {
540 auto r = m.emplace(k, v);
552 -> decltype(std::declval<std::ostream&>() << std::declval<typename Map::key_type>() << std::declval<typename Map::mapped_type>(),
void()) {
556 std::ostringstream s;
559 for (
auto const &kv : m) {
562 s << kv.first <<
": " << kv.second;
568 "Return the canonical string representation of this map." 575 template <
typename Map,
typename holder_type = std::unique_ptr<Map>,
typename... Args>
577 using KeyType =
typename Map::key_type;
578 using MappedType =
typename Map::mapped_type;
584 auto tinfo = detail::get_type_info(
typeid(MappedType));
587 tinfo = detail::get_type_info(
typeid(KeyType));
596 detail::map_if_insertion_operator<Map, Class_>(cl, name);
599 [](
const Map &m) ->
bool {
return !m.empty(); },
600 "Check whether the map is nonempty" 613 cl.def(
"__getitem__",
614 [](Map &m,
const KeyType &k) -> MappedType & {
620 return_value_policy::reference_internal
623 cl.def(
"__contains__",
624 [](Map &m,
const KeyType &k) ->
bool {
633 detail::map_assignment<Map, Class_>(cl);
635 cl.def(
"__delitem__",
636 [](Map &m,
const KeyType &k) {
iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra)
Annotation for parent scope.
#define PYBIND11_NAMESPACE
void vector_accessor(enable_if_t< vector_needs_copy< Vector >::value, Class_ > &cl)
void map_assignment(enable_if_t< !std::is_copy_assignable< typename Map::mapped_type >::value &&is_copy_constructible< typename Map::mapped_type >::value, Class_ > &cl)
class_< Vector, holder_type > bind_vector(handle scope, std::string const &name, Args &&... args)
auto format(const std::locale &loc, const CharT *fmt, const Streamable &tp) -> decltype(to_stream(std::declval< std::basic_ostream< CharT > &>(), fmt, tp), std::basic_string< CharT >
void vector_modifiers(enable_if_t< is_copy_constructible< typename Vector::value_type >::value, Class_ > &cl)
Information record describing a Python buffer object.
detail::initimpl::constructor< Args... > init()
Binds an existing constructor taking arguments Args...
#define NAMESPACE_END(name)
class_< Map, holder_type > bind_map(handle scope, const std::string &name, Args &&... args)
Keep patient alive while nurse lives.
size_t len_hint(handle h)
void vector_if_equal_operator(enable_if_t< is_comparable< Vector >::value, Class_ > &cl)
enable_if_t<!detail::any_of< std::is_same< Args, buffer_protocol >... >::value > vector_buffer(Class_ &)
Annotation for function names.
auto map_if_insertion_operator(Class_ &cl, std::string const &name) -> decltype(std::declval< std::ostream &>()<< std::declval< typename Map::key_type >()<< std::declval< typename Map::mapped_type >(), void())
auto vector_if_insertion_operator(Class_ &cl, std::string const &name) -> decltype(std::declval< std::ostream &>()<< std::declval< typename Vector::value_type >(), void())
#define NAMESPACE_BEGIN(name)
void vector_if_copy_constructible(enable_if_t< is_copy_constructible< Vector >::value, Class_ > &cl)
iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra)
Makes a python iterator from a first and past-the-end C++ InputIterator.
const std::type_info & tinfo
typename std::enable_if< B, T >::type enable_if_t
from cpp_future import (convenient aliases from C++14/17)
Annotation that marks a class as local to the module: