-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathArray.hh
executable file
·193 lines (133 loc) · 4.54 KB
/
Array.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#ifndef _ARRAY_HH_
#define _ARRAY_HH_
class BoolArray;
class ArrayException {
public:
ArrayException(const char *msg) : _msg(msg) { }
const char *msg(void) const { return _msg; }
private:
const char *_msg;
};
class Array {
public:
Array(int cols, int rows, float missing = 0.0);
~Array();
int rows(void) const { return _nrows; }
int cols(void) const { return _ncols; }
float missing(void) const { return _missing; }
long size(void) const { return _size; }
float *data(void) { return _data; }
float *operator()(int row) { return _rows[row]; }
float &operator()(int col, int row) { return _rows[row][col]; }
const float &operator()(int col, int row) const { return _rows[row][col]; }
Array &operator=(float val);
void reset(void);
void rotate(int shift);
void flip_rows(void);
void fix_missing(void);
void mask(const BoolArray &mask);
static void regrid(const Array &in, const float *in_x, const float *in_y,
Array &out, const float *out_x, const float *out_y);
static void regrid_circular_x(const Array &in,
const float *in_x, const float *in_y,
Array &out,
const float *out_x, const float *out_y,
float min_x, float max_x);
static void regrid_average(const Array &in,
const float *in_x, const float *in_y,
Array &out,
const float *out_x, const float *out_y);
static void regrid_discrete(const Array &in,
const float *in_x, const float *in_y,
Array &out,
const float *out_x, const float *out_y);
private:
bool all_missing(int row);
int count_missing(int row);
void copy_row(int from_row, int to_row);
int _ncols;
int _nrows;
float _missing;
long _size;
float *_data;
float **_rows;
};
class Array3 {
public:
Array3(int cols, int rows, int blocks, float missing = 0.0);
~Array3();
int rows(void) const { return _nrows; }
int cols(void) const { return _ncols; }
int blocks(void) const { return _nblocks; }
float missing(void) const { return _missing; }
long size(void) const { return _size; }
Array &operator()(int block) { return *_blocks[block]; }
float *operator()(int row, int block) { return (*_blocks[block])(row); }
float &operator()(int col, int row, int block)
{ return (*_blocks[block])(col, row); }
const float &operator()(int col, int row, int block) const
{ return (*_blocks[block])(col, row); }
private:
int _ncols;
int _nrows;
int _nblocks;
float _missing;
long _size;
Array **_blocks;
};
class IntArray {
public:
IntArray(int cols, int rows, int missing = 0);
~IntArray();
int rows(void) const { return _nrows; }
int cols(void) const { return _ncols; }
int missing(void) const { return _missing; }
long size(void) const { return _size; }
int *data(void) { return _data; }
int *operator()(int row) { return _rows[row]; }
int &operator()(int col, int row) { return _rows[row][col]; }
const int &operator()(int col, int row) const { return _rows[row][col]; }
IntArray &operator=(int val);
void reset(void);
void rotate(int shift);
void fix_missing(void);
void mask(const BoolArray &mask);
int interpolate(float x, float y, float *in_x, float *in_y);
static void regrid_discrete(const IntArray &in,
const float *in_x, const float *in_y,
IntArray &out,
const float *out_x, const float *out_y);
private:
bool all_missing(int row);
int count_missing(int row);
void copy_row(int from_row, int to_row);
int _ncols;
int _nrows;
int _missing;
long _size;
int *_data;
int **_rows;
};
class BoolArray {
public:
BoolArray(int cols, int rows);
BoolArray(const BoolArray &other);
~BoolArray();
int rows(void) const { return _nrows; }
int cols(void) const { return _ncols; }
long size(void) const { return _size; }
bool &operator()(int col, int row) { return _rows[row][col]; }
const bool &operator()(int col, int row) const { return _rows[row][col]; }
void rotate(int shift);
static void regrid_discrete(const BoolArray &in,
const float *in_x, const float *in_y,
BoolArray &out,
const float *out_x, const float *out_y);
private:
int _ncols;
int _nrows;
long _size;
bool *_data;
bool **_rows;
};
#endif