22 #include "pybind11/pybind11.h"
30 using namespace pybind11::literals;
38 uint64_t _uint64(py::handle
const &obj) {
40 return obj.cast<uint64_t>();
41 }
catch (py::cast_error
const &) {
42 throw py::value_error(
43 "RangeSet elements and range beginning and "
44 "end points must be non-negative integers "
51 RangeSet makeRangeSet(py::iterable iterable) {
53 for (py::handle item : iterable) {
54 PyObject *o = item.ptr();
55 if (PySequence_Check(o) && PySequence_Size(o) == 2) {
56 uint64_t
first = _uint64(py::reinterpret_steal<py::object>(
57 PySequence_GetItem(o, 0)));
58 uint64_t last = _uint64(py::reinterpret_steal<py::object>(
59 PySequence_GetItem(o, 1)));
60 rs.insert(
first, last);
62 rs.insert(_uint64(item));
69 py::list ranges(RangeSet
const &
self) {
72 list.append(py::make_tuple(py::int_(std::get<0>(t)),
73 py::int_(std::get<1>(t))));
88 cls.def(py::init<>());
89 cls.def(py::init<uint64_t>(),
"integer"_a);
90 cls.def(py::init([](uint64_t
a, uint64_t
b) {
94 cls.def(py::init<RangeSet const &>(),
"rangeSet"_a);
96 [](py::iterable iterable) {
97 return new RangeSet(makeRangeSet(iterable));
100 cls.def(
"__eq__", &RangeSet::operator==, py::is_operator());
101 cls.def(
"__ne__", &RangeSet::operator!=, py::is_operator());
103 cls.def(
"insert", (
void (
RangeSet::*)(uint64_t)) & RangeSet::insert,
106 (
void (
RangeSet::*)(uint64_t, uint64_t)) & RangeSet::insert,
107 "first"_a,
"last"_a);
111 "first"_a,
"last"_a);
113 cls.def(
"complement", &RangeSet::complement);
114 cls.def(
"complemented", &RangeSet::complemented);
115 cls.def(
"intersection", &RangeSet::intersection,
"rangeSet"_a);
118 cls.def(
"union", &RangeSet::join,
"rangeSet"_a);
119 cls.def(
"difference", &RangeSet::difference,
"rangeSet"_a);
120 cls.def(
"symmetricDifference", &RangeSet::symmetricDifference,
122 cls.def(
"__invert__", &RangeSet::operator~, py::is_operator());
123 cls.def(
"__and__", &RangeSet::operator&, py::is_operator());
124 cls.def(
"__or__", &RangeSet::operator|, py::is_operator());
125 cls.def(
"__sub__", &RangeSet::operator-, py::is_operator());
126 cls.def(
"__xor__", &RangeSet::operator^, py::is_operator());
127 cls.def(
"__iand__", &RangeSet::operator&=);
128 cls.def(
"__ior__", &RangeSet::operator|=);
129 cls.def(
"__isub__", &RangeSet::operator-=);
130 cls.def(
"__ixor__", &RangeSet::operator^=);
132 cls.def(
"__len__", &RangeSet::size);
133 cls.def(
"__getitem__", [](
RangeSet const &
self, py::int_ i) {
135 return py::cast(
self.begin()[j]);
138 cls.def(
"intersects",
139 (
bool (
RangeSet::*)(uint64_t)
const) & RangeSet::intersects,
141 cls.def(
"intersects",
142 (
bool (
RangeSet::*)(uint64_t, uint64_t)
const) &
143 RangeSet::intersects,
144 "first"_a,
"last"_a);
145 cls.def(
"intersects",
154 "first"_a,
"last"_a);
158 cls.def(
"__contains__",
160 "integer"_a, py::is_operator());
161 cls.def(
"__contains__",
163 "first"_a,
"last"_a, py::is_operator());
164 cls.def(
"__contains__",
166 "rangeSet"_a, py::is_operator());
169 (
bool (
RangeSet::*)(uint64_t)
const) & RangeSet::isWithin,
172 (
bool (
RangeSet::*)(uint64_t, uint64_t)
const) & RangeSet::isWithin,
173 "first"_a,
"last"_a);
178 cls.def(
"isDisjointFrom",
179 (
bool (
RangeSet::*)(uint64_t)
const) & RangeSet::isDisjointFrom,
181 cls.def(
"isDisjointFrom",
182 (
bool (
RangeSet::*)(uint64_t, uint64_t)
const) &
183 RangeSet::isDisjointFrom,
184 "first"_a,
"last"_a);
185 cls.def(
"isDisjointFrom",
187 RangeSet::isDisjointFrom,
190 cls.def(
"simplify", &RangeSet::simplify,
"n"_a);
193 cls.def(
"scaled", &RangeSet::scaled,
"factor"_a);
194 cls.def(
"fill", &RangeSet::fill);
195 cls.def(
"clear", &RangeSet::clear);
196 cls.def(
"empty", &RangeSet::empty);
197 cls.def(
"full", &RangeSet::full);
198 cls.def(
"size", &RangeSet::size);
199 cls.def(
"cardinality", &RangeSet::cardinality);
202 cls.def(
"isValid", &RangeSet::cardinality);
203 cls.def(
"ranges", &ranges);
206 [](
RangeSet const &
self) {
return py::str(ranges(
self)); });
207 cls.def(
"__repr__", [](
RangeSet const &
self) {
208 return py::str(
"RangeSet({!s})").format(ranges(
self));
211 cls.def(
"__reduce__", [cls](
RangeSet const &
self) {
212 return py::make_tuple(cls, py::make_tuple(ranges(
self)));
This file provides a type for representing integer sets.
A RangeSet is a set of unsigned 64 bit integers.
daf::base::PropertyList * list
def scale(algorithm, min, max=None, frame=None)
PolynomialFunction1d simplified(ScaledPolynomialFunction1d const &f)
Calculate the standard polynomial function that is equivalent to a scaled standard polynomial functio...
ptrdiff_t convertIndex(ptrdiff_t len, pybind11::int_ i)
Convert a Python index i over a sequence with length len to a non-negative (C++ style) index,...
void defineClass(py::class_< RangeSet, std::shared_ptr< RangeSet >> &cls)
A base class for image defects.