17 #include "../declspec.h"
188 enum flags_t {C_ORDERING=1, CONTIGUOUS=2, POSITIVE_STRIDE=4, DEGENERATE=8};
196 virtual std::string toString()
const = 0;
197 virtual std::shared_ptr<void> voidData() = 0;
198 virtual std::shared_ptr<const void> voidData()
const = 0;
200 virtual bool contiguous()
const = 0;
202 virtual std::int64_t allocsize()
const = 0;
204 virtual std::int64_t totalsize()
const = 0;
206 virtual std::int64_t itemsize()
const = 0;
208 virtual const std::int64_t* sizeptr()
const = 0;
210 virtual const std::int64_t* strideptr()
const = 0;
212 virtual std::array<std::int64_t,3> size3d()
const = 0;
214 virtual std::array<std::int64_t,3> stride3d()
const = 0;
216 virtual bool ownsdata()
const = 0;
218 virtual bool isScalar()
const = 0;
220 virtual bool isAllSame(
const std::int64_t *used_in)
const = 0;
222 virtual double scalarAsDouble()
const = 0;
226 virtual void fill(
double value) = 0;
228 virtual void clear() = 0;
230 virtual std::pair<double, double> range()
const = 0;
234 virtual void copyFrom(
236 const std::int64_t *srcorig,
const std::int64_t *dstorig,
237 const std::int64_t *cpyorig,
const std::int64_t *cpysize) = 0;
242 virtual std::shared_ptr<DataBuffer> clone()
const = 0;
244 virtual std::shared_ptr<DataBuffer> scaleToFloat(
const std::array<double,2>&) = 0;
246 virtual std::shared_ptr<DataBuffer> scaleToStorage(
const std::array<double,2>&,
RawDataType) = 0;
247 virtual std::uint32_t layout()
const = 0;
248 virtual bool is_cstride()
const = 0;
249 virtual void check_cstride()
const = 0;
250 virtual std::shared_ptr<DataBuffer> slice1(
int dim, std::int64_t start, std::int64_t size)
const = 0;
251 static std::shared_ptr<DataBuffer> makeDataBuffer3d(
void *raw, std::int64_t nbytes,
const std::array<std::int64_t,3>& size,
RawDataType dtype);
254 template <
typename T,
int NDim>
258 typedef T value_type;
260 typedef std::array<std::int64_t,NDim> ndsize_t;
261 enum { ndim = NDim };
270 DataBufferNd(T scalar,
const std::array<std::int64_t,NDim>& size);
272 DataBufferNd(
const std::array<std::int64_t,NDim>& size);
274 DataBufferNd(
const std::array<std::int64_t,NDim>& size,
const std::array<std::int64_t,NDim>& stride);
276 DataBufferNd(
const std::shared_ptr<T>& data,
const std::array<std::int64_t,NDim>& size);
278 DataBufferNd(
const std::shared_ptr<T>& data,
const std::array<std::int64_t,NDim>& size,
const std::array<std::int64_t,NDim>& stride);
280 T* data() {
return _data.get(); }
282 const T* data()
const {
return _data.get(); }
284 T scalarValue()
const {
return data()[0]; }
286 virtual bool ownsdata()
const {
return _ownsdata; }
288 bool isScalar()
const override {
return _is_scalar; }
290 bool isAllSame(
const std::int64_t *used_in)
const override;
292 double scalarAsDouble()
const override {
return (
double)scalarValue(); }
294 void fill(
double value)
override;
295 void clear()
override;
296 std::pair<double, double> range()
const override;
297 std::uint32_t layout()
const override;
298 bool is_cstride()
const override;
299 void check_cstride()
const override;
305 std::shared_ptr<T> _data;
308 static std::uint32_t check_stride(
const ndsize_t& size,
const ndsize_t& stride);
309 static ndsize_t cstride(
const ndsize_t& size);
310 static ndsize_t make_array(
const std::int64_t *in);
311 static std::int64_t make_product(
const ndsize_t& size);
312 static std::int64_t make_allocsize(
const ndsize_t& size,
const ndsize_t& stride);
315 std::string toString()
const override;
316 std::shared_ptr<void> voidData()
override {
return _data; }
317 std::shared_ptr<const void> voidData()
const override {
return _data; }
318 bool contiguous()
const override;
319 std::int64_t allocsize()
const override;
320 std::int64_t totalsize()
const override;
321 std::int64_t itemsize()
const override;
322 const std::int64_t* sizeptr()
const override;
323 const std::int64_t* strideptr()
const override;
324 std::array<std::int64_t,3> size3d()
const override;
325 std::array<std::int64_t,3> stride3d()
const override;
326 const ndsize_t& safesize()
const {
return _size;}
327 const ndsize_t& safestride()
const {
return _stride;}
328 std::shared_ptr<DataBuffer> clone()
const;
329 std::shared_ptr<DataBuffer> scaleToFloat(
const std::array<double,2>&)
override;
330 std::shared_ptr<DataBuffer> scaleToStorage(
const std::array<double,2>&,
RawDataType)
override;
331 std::shared_ptr<DataBuffer> slice1(
int dim, std::int64_t start, std::int64_t size)
const override;
333 std::shared_ptr<self_type> slice(
const ndsize_t& neworig,
334 const ndsize_t& newsize)
const;
337 const std::int64_t *srcorig,
const std::int64_t *dstorig,
338 const std::int64_t *cpyorig,
const std::int64_t *cpysize);
340 static void copySubset(
const ndsize_t& srcorig,
const self_type& src,
342 const ndsize_t& cpyorig,
const ndsize_t& cpysize);
344 static void copySubset(
const ndsize_t& srcorig,
const self_type& src,
345 const ndsize_t& dstorig,
self_type& dst);
349 static std::shared_ptr<DataBuffer> s_scaleToFloat(
const DataBuffer*,
const std::array<double,2>&);
350 static std::shared_ptr<DataBuffer> s_scaleFromFloat(
const DataBuffer*,
const std::array<double,2>&);