lsst.sphgeom gfb2c8f9998+ce83317b7e
interval.h
1/*
2 * LSST Data Management System
3 * See COPYRIGHT file at the top of the source tree.
4 *
5 * This product includes software developed by the
6 * LSST Project (http://www.lsst.org/).
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the LSST License Statement and
19 * the GNU General Public License along with this program. If not,
20 * see <https://www.lsstcorp.org/LegalNotices/>.
21 */
22
23#ifndef LSST_SPHGEOM_PYTHON_INTERVAL_H_
24#define LSST_SPHGEOM_PYTHON_INTERVAL_H_
25
26#include "pybind11/pybind11.h"
27
28#include "relationship.h"
29
30namespace py = pybind11;
31using namespace pybind11::literals;
32
33namespace lsst {
34namespace sphgeom {
35namespace python {
36namespace {
37
43template <typename PyClass, typename Class, typename Scalar>
44void defineInterval(PyClass& cls) {
45 cls.def("__eq__", [](Class const& self,
46 Class const& other) { return self == other; },
47 py::is_operator());
48 cls.def("__eq__",
49 [](Class const& self, Scalar other) { return self == other; },
50 py::is_operator());
51 cls.def("__ne__", [](Class const& self,
52 Class const& other) { return self != other; },
53 py::is_operator());
54 cls.def("__ne__",
55 [](Class const& self, Scalar other) { return self != other; },
56 py::is_operator());
57
58 cls.def("getA", [](Class const& self) { return self.getA(); });
59 cls.def("getB", [](Class const& self) { return self.getB(); });
60 cls.def("isEmpty", [](Class const& self) { return self.isEmpty(); });
61 cls.def("getCenter", [](Class const& self) { return self.getCenter(); });
62 cls.def("getSize", [](Class const& self) { return self.getSize(); });
63
64 cls.def("__contains__", [](Class const& self,
65 Scalar other) { return self.contains(other); },
66 py::is_operator());
67 cls.def("__contains__",
68 [](Class const& self, Class const& other) {
69 return self.contains(other);
70 },
71 py::is_operator());
72
73 cls.def("contains", [](Class const& self, Scalar other) {
74 return self.contains(other);
75 });
76 cls.def("contains", [](Class const& self, Class const& other) {
77 return self.contains(other);
78 });
79 cls.def("isDisjointFrom", [](Class const& self, Scalar other) {
80 return self.isDisjointFrom(other);
81 });
82 cls.def("isDisjointFrom", [](Class const& self, Class const& other) {
83 return self.isDisjointFrom(other);
84 });
85 cls.def("intersects", [](Class const& self, Scalar other) {
86 return self.intersects(other);
87 });
88 cls.def("intersects", [](Class const& self, Class const& other) {
89 return self.intersects(other);
90 });
91 cls.def("isWithin", [](Class const& self, Scalar other) {
92 return self.isWithin(other);
93 });
94 cls.def("isWithin", [](Class const& self, Class const& other) {
95 return self.isWithin(other);
96 });
97 cls.def("relate", [](Class const& self, Scalar other) {
98 return self.relate(other);
99 });
100 cls.def("relate", [](Class const& self, Class const& other) {
101 return self.relate(other);
102 });
103
104 // Note that when a reference to *this is returned in C++, it will
105 // have an existing wrapper object which is automatically returned
106 // by pybind11 - no return value policy is needed. The explicit
107 // reference return type for the corresponding lambdas seems to be
108 // required to obtain this behavior.
109
110 cls.def("clipTo", [](Class& self, Scalar other) -> Class & {
111 self.clipTo(other);
112 return self;
113 });
114 cls.def("clipTo", [](Class& self, Class const& other) -> Class & {
115 self.clipTo(other);
116 return self;
117 });
118 cls.def("clippedTo", [](Class const& self, Scalar other) {
119 Class instance = self.clippedTo(other);
120 return instance;
121 });
122 cls.def("clippedTo", [](Class const& self, Class const& other) {
123 Class instance = self.clippedTo(other);
124 return instance;
125 });
126 cls.def("expandTo", [](Class& self, Scalar other) -> Class & {
127 self.expandTo(other);
128 return self;
129 });
130 cls.def("expandTo", [](Class& self, Class const& other) -> Class & {
131 self.expandTo(other);
132 return self;
133 });
134 cls.def("expandedTo", [](Class const& self, Scalar other) {
135 Class instance = self.expandedTo(other);
136 return instance;
137 });
138 cls.def("expandedTo", [](Class const& self, Class const& other) {
139 Class instance = self.expandedTo(other);
140 return instance;
141 });
142
143 cls.def("dilateBy", [](Class& self, Scalar other) -> Class & {
144 self.dilateBy(other);
145 return self;
146 });
147 cls.def("dilatedBy", [](Class const& self, Scalar other) {
148 Class instance = self.dilatedBy(other);
149 return instance;
150 });
151 cls.def("erodeBy", [](Class& self, Scalar other) -> Class & {
152 self.erodeBy(other);
153 return self;
154 });
155 cls.def("erodedBy", [](Class const& self, Scalar other) {
156 Class instance = self.erodedBy(other);
157 return instance;
158 });
159
160 cls.def("__reduce__", [cls](Class const &self) {
161 return py::make_tuple(cls, py::make_tuple(self.getA(), self.getB()));
162 });
163}
164
165} // unnamed
166} // python
167} // sphgeom
168} // lsst
169
170#endif // LSST_SPHGEOM_PYTHON_INTERVAL_H_
This file provides a type alias for describing set relationships.