Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
Dimensions.h
Go to the documentation of this file.
1#ifndef CPYRT_DIMENSIONS_H
2#define CPYRT_DIMENSIONS_H
3
4#include "Python.h"
5#include "cppjit_interop.h"
6
7// Bindings
8#include "cpyrt/CommonDefs.h"
9
10// Standard
11#include <algorithm>
12#include <initializer_list>
13
14namespace cppjit::cpyrt {
15
16static const dim_t UNKNOWN_SIZE = (dim_t)-1;
17
19 dim_t* fDims;
20
21public:
22 Dimensions(dim_t ndim = 0, dim_t* dims = nullptr) : fDims(nullptr) {
23 if (ndim && ndim != UNKNOWN_SIZE) {
24 fDims = new dim_t[ndim + 1];
25 fDims[0] = ndim;
26 if (dims)
27 std::copy(dims, dims + ndim, fDims + 1);
28 else
29 std::fill_n(fDims + 1, ndim, UNKNOWN_SIZE);
30 }
31 }
32 Dimensions(std::initializer_list<dim_t> l) {
33 fDims = new dim_t[l.size() + 1];
34 fDims[0] = l.size();
35 std::copy(l.begin(), l.end(), fDims + 1);
36 }
37 Dimensions(const Dimensions& d) : fDims(nullptr) {
38 if (d.fDims) {
39 fDims = new dim_t[d.fDims[0] + 1];
40 std::copy(d.fDims, d.fDims + d.fDims[0] + 1, fDims);
41 }
42 }
43 Dimensions(Dimensions&& d) : fDims(d.fDims) { d.fDims = nullptr; }
45 if (this != &d) {
46 if (!d.fDims) {
47 delete[] fDims;
48 fDims = nullptr;
49 } else {
50 if (!fDims || (fDims && fDims[0] != d.fDims[0])) {
51 delete[] fDims;
52 fDims = new dim_t[d.fDims[0] + 1];
53 }
54 std::copy(d.fDims, d.fDims + d.fDims[0] + 1, fDims);
55 }
56 }
57 return *this;
58 }
59 ~Dimensions() { delete[] fDims; }
60
61public:
62 operator bool() const { return (bool)fDims; }
63
64 dim_t ndim() const { return fDims ? fDims[0] : UNKNOWN_SIZE; }
65 void ndim(dim_t d) {
66 if (fDims) {
67 if (fDims[0] == d)
68 return;
69 delete[] fDims;
70 }
71
72 fDims = new dim_t[d + 1];
73 fDims[0] = d;
74 std::fill_n(fDims + 1, d, UNKNOWN_SIZE);
75 }
76
77 dim_t operator[](dim_t i) const { return fDims[i + 1]; }
78 dim_t& operator[](dim_t i) { return fDims[i + 1]; }
79
80 Dimensions sub() const {
81 return fDims ? Dimensions(fDims[0] - 1, fDims + 2) : Dimensions();
82 }
83};
84
85typedef Dimensions dims_t;
86typedef const dims_t& cdims_t;
87
88} // namespace cppjit::cpyrt
89
90#endif // !CPYRT_DIMENSIONS_H
#define d(i)
Definition RSha256.hxx:102
#define CPYRT_CLASS_EXPORT
Definition CommonDefs.h:27
Dimensions(std::initializer_list< dim_t > l)
Definition Dimensions.h:32
Dimensions(const Dimensions &d)
Definition Dimensions.h:37
Dimensions(Dimensions &&d)
Definition Dimensions.h:43
Dimensions sub() const
Definition Dimensions.h:80
Dimensions(dim_t ndim=0, dim_t *dims=nullptr)
Definition Dimensions.h:22
dim_t & operator[](dim_t i)
Definition Dimensions.h:78
Dimensions & operator=(const Dimensions &d)
Definition Dimensions.h:44
dim_t operator[](dim_t i) const
Definition Dimensions.h:77
Py_ssize_t dim_t
Definition API.h:100
static const dim_t UNKNOWN_SIZE
Definition Dimensions.h:16
Dimensions dims_t
Definition API.h:113
const dims_t & cdims_t
Definition API.h:114
TLine l
Definition textangle.C:4