lsst.sphgeom g31e44d4a5c+b0138be388
 
Loading...
Searching...
No Matches
utils.h
1/*
2 * This file is part of sphgeom.
3 *
4 * Developed for the LSST Data Management System.
5 * This product includes software developed by the LSST Project
6 * (http://www.lsst.org).
7 * See the COPYRIGHT file at the top-level directory of this distribution
8 * for details of code ownership.
9 *
10 * This software is dual licensed under the GNU General Public License and also
11 * under a 3-clause BSD license. Recipients may choose which of these licenses
12 * to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
13 * respectively. If you choose the GPL option then the following text applies
14 * (but note that there is still no warranty even if you opt for BSD instead):
15 *
16 * This program is free software: you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation, either version 3 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program. If not, see <http://www.gnu.org/licenses/>.
28 */
29
30#ifndef LSST_SPHGEOM_PYTHON_UTILS_H_
31#define LSST_SPHGEOM_PYTHON_UTILS_H_
32
33#include "pybind11/pybind11.h"
34
35#include <limits>
36#include <sstream>
37#include <stdexcept>
38#include <cstdint>
39
40#include "lsst/sphgeom/Region.h"
41
42namespace lsst {
43namespace sphgeom {
44namespace python {
45
48inline ptrdiff_t convertIndex(ptrdiff_t len, pybind11::int_ i) {
49 auto j = static_cast<ptrdiff_t>(i);
50 if ((j == -1 && PyErr_Occurred()) || j < -len || j >= len) {
51 PyErr_Clear();
52 throw pybind11::index_error(
53 pybind11::str("Index {} not in range({}, {})")
54 .format(i, -len, len));
55 }
56 return (j < 0) ? j + len : j;
57}
58
59
61inline pybind11::bytes encode(Region const &self) {
62 std::vector<std::uint8_t> bytes = self.encode();
63 return pybind11::bytes(reinterpret_cast<char const *>(bytes.data()),
64 bytes.size());
65}
66
68template <typename R>
69std::unique_ptr<R> decode(pybind11::bytes bytes) {
70 std::uint8_t const *buffer = reinterpret_cast<std::uint8_t const *>(
71 PYBIND11_BYTES_AS_STRING(bytes.ptr()));
72 size_t n = static_cast<size_t>(PYBIND11_BYTES_SIZE(bytes.ptr()));
73 return R::decode(buffer, n);
74}
75
82template <typename S>
83inline std::vector<std::unique_ptr<Region>> convert_region_sequence(S const & seq) {
84 std::vector<std::unique_ptr<Region>> result;
85 result.reserve(seq.size());
86 for (pybind11::handle py_region : seq) {
87 result.push_back(py_region.cast<Region const &>().clone());
88 }
89 return result;
90}
91
92} // python
93} // sphgeom
94} // lsst
95
96#endif // LSST_SPHGEOM_PYTHON_UTILS_H_
This file defines an interface for spherical regions.
Definition Angle.h:45