21#ifndef __MIA_3DDATAFIELD_HH
22#define __MIA_3DDATAFIELD_HH 1
41#define DECLARE_EXTERN_ITERATORS(TYPE) \
42 extern template class EXPORT_3D range3d_iterator<std::vector<TYPE>::iterator>; \
43 extern template class EXPORT_3D range3d_iterator<std::vector<TYPE>::const_iterator>; \
44 extern template class EXPORT_3D range3d_iterator_with_boundary_flag<std::vector<TYPE>::iterator>; \
45 extern template class EXPORT_3D range3d_iterator_with_boundary_flag<std::vector<TYPE>::const_iterator>; \
46 extern template class EXPORT_3D range2d_iterator<std::vector<TYPE>::iterator>; \
47 extern template class EXPORT_3D range2d_iterator<std::vector<TYPE>::const_iterator>;
51#pragma GCC diagnostic push
53#pragma GCC diagnostic ignored "-Wattributes"
74#pragma GCC diagnostic pop
85 typedef ::std::vector<typename __holder_type_dispatch<T>::type> data_array;
98 bool holds_unique_data()const __attribute__((deprecated))
107 typedef typename data_array::iterator iterator;
108 typedef typename data_array::const_iterator const_iterator;
109 typedef typename data_array::const_reference const_reference;
110 typedef typename data_array::reference reference;
111 typedef typename data_array::const_pointer const_pointer;
112 typedef typename data_array::pointer pointer;
113 typedef typename data_array::value_type value_type;
114 typedef typename data_array::size_type size_type;
115 typedef typename data_array::difference_type difference_type;
116 typedef typename atomic_data<value_type>::type atomic_type;
207 template <
typename Out>
211 template <
typename Out>
215 template <
typename Out>
246 return m_data.size();
260 const_reference
operator()(
size_t x,
size_t y,
size_t z)
const
263 if (x < m_size.x && y < m_size.y && z < m_size.z) {
264 return m_data[x + m_size.x * (y + m_size.y * z)];
274 return (*
this)(l.
x, l.
y, l.
z);
282 assert(x < m_size.x && y < m_size.y && z < m_size.z);
283 return m_data[x + m_size.x * (y + m_size.y * z)];
291 return (*
this)(l.
x, l.
y, l.
z);
313 template <
class TMask>
423 return m_data.begin();
429 const_iterator
begin_at(
size_t x,
size_t y,
size_t z)
const
431 return m_data.begin() + (z * m_size.y + y) * m_size.x + x;
448 return m_data.begin();
495 return m_data.begin() + (z * m_size.y + y) * m_size.x + x;
538 static const value_type Zero;
540 static const size_t m_elements;
593template <
typename Out>
596 const int sizex = m_size.x;
599 if (x - 1 < m_size.x - 2 && y - 1 < m_size.y - 2 && z - 1 < m_size.z - 2) {
601 const T *H = &m_data[x + m_size.x * (y + m_size.y * z)];
603 Out((H[sizex] - H[-sizex]) * 0.5),
604 Out((H[m_xy] - H[-m_xy]) * 0.5));
612template <
typename Out>
615 const int sizex = m_size.x;
617 const T *H = &m_data[hardcode];
619 Out((H[sizex] - H[-sizex]) * 0.5),
620 Out((H[m_xy] - H[-m_xy]) * 0.5));
628template <
typename Out>
632 return T3DVector<Out> (Out((m_data[hardcode + 1] - m_data[hardcode - 1]) * 0.5),
633 Out((m_data[hardcode + m_size.x] - m_data[hardcode - m_size.x]) * 0.5),
634 Out((m_data[hardcode + m_xy] - m_data[hardcode - m_xy]) * 0.5));
638template <
typename Out>
642 const int sizex = m_size.x;
645 size_t x = size_t (p.
x);
648 size_t y = size_t (p.
y);
651 size_t z = size_t (p.
z);
656 if (x - 1 < m_size.x - 3 && y - 1 < m_size.y - 3 && z - 1 < m_size.z - 3 ) {
658 const T *H000 = &m_data[x + sizex * y + m_xy * z];
659 const T *H_100 = &H000[-m_xy];
660 const T *H_101 = &H_100[1];
661 const T *H_110 = &H_100[sizex];
662 const T *H_111 = &H_110[1];
663 const T *H0_10 = &H000[-sizex];
664 const T *H0_11 = &H0_10[1];
665 const T *H00_1 = &H000[-1];
666 const T *H001 = &H000[ 1];
667 const T *H002 = &H000[ 2];
668 const T *H010 = &H000[sizex];
669 const T *H011 = &H010[ 1];
670 const T *H012 = &H010[ 2];
671 const T *H01_1 = &H010[-1];
672 const T *H020 = &H010[sizex];
673 const T *H021 = &H020[ 1];
674 const T *H100 = &H000[m_xy];
675 const T *H1_10 = &H100[sizex];
676 const T *H1_11 = &H1_10[1];
677 const T *H10_1 = &H100[-1];
678 const T *H101 = &H100[ 1];
679 const T *H102 = &H100[ 2];
680 const T *H110 = &H100[sizex];
681 const T *H111 = &H110[ 1];
682 const T *H112 = &H110[ 2];
683 const T *H11_1 = &H110[-1];
684 const T *H120 = &H110[sizex];
685 const T *H121 = &H120[ 1];
686 const T *H200 = &H100[m_xy];
687 const T *H201 = &H200[1];
688 const T *H210 = &H200[sizex];
689 const T *H211 = &H210[1];
692 Out((zm * (ym * (dx * (*H002 - *H000) + xm * (*H001 - *H00_1)) +
693 dy * (dx * (*H012 - *H010) + xm * (*H011 - *H01_1))) +
694 dz * (ym * (dx * (*H102 - *H100) + xm * (*H101 - *H10_1)) +
695 dy * (dx * (*H112 - *H110) + xm * (*H111 - *H11_1)))) * 0.5),
696 Out((zm * (ym * (xm * (*H010 - *H0_10) + dx * (*H011 - *H0_11)) +
697 dy * (xm * (*H020 - *H000) + dx * (*H021 - *H001))) +
698 dz * (ym * (xm * (*H110 - *H1_10) + dx * (*H111 - *H1_11)) +
699 dy * (xm * (*H120 - *H100) + dx * (*H121 - *H101)))) * 0.5),
700 Out((zm * (ym * (xm * (*H100 - *H_100) + dx * (*H101 - *H_101)) +
701 dy * (xm * (*H110 - *H_110) + dx * (*H111 - *H_111))) +
702 dz * (ym * (xm * (*H200 - *H000) + dx * (*H201 - *H001)) +
703 dy * (xm * (*H210 - *H010) + dx * (*H211 - *H011)))) * 0.5));
710#pragma GCC diagnostic push
712#pragma GCC diagnostic ignored "-Wattributes"
716#define DECLARE_EXTERN(TYPE) \
717 extern template class EXPORT_3D T3DDatafield<TYPE>;
743#pragma GCC diagnostic pop
#define DECLARE_EXTERN(TYPE)
TTranslator< C3DFVector > C3DFVectorTranslator
CTParameter< C3DBounds > C3DBoundsParameter
3D size parameter type
T3DDatafield< uint32_t > C3DUIDatafield
a data field of 32 bit unsigned int values
T3DDatafield< int32_t > C3DSIDatafield
a data field of 32 bit signed int values
T3DDatafield< int16_t > C3DSSDatafield
a data field of 32 bit signed int values
CTParameter< C3DFVector > C3DFVectorParameter
3D vector parameter type
T3DDatafield< uint16_t > C3DUSDatafield
a data field of 32 bit unsigned int values
T3DDatafield< uint64_t > C3DULDatafield
a data field of 32 bit unsigned int values
#define DECLARE_EXTERN_ITERATORS(TYPE)
T3DDatafield< int8_t > C3DSBDatafield
a data field of 8 bit int values
T3DDatafield< bool > C3DBitDatafield
a data field of float values
T3DDatafield< int64_t > C3DLDatafield
a data field of 32 bit signed int values
T3DDatafield< uint8_t > C3DUBDatafield
a data field of 8 bit int values
T3DDatafield< float > C3DFDatafield
a data field of float values
Generic type of a complex paramter.
A class to hold data on a regular 2D grid.
T3DDatafield< T >::const_range_iterator iterator
T3DDatafield< T >::range_iterator iterator
A templated class of a 3D data field.
T2DDatafield< T > get_data_plane_xz(size_t y) const
void put_data_plane_xy(size_t z, const T2DDatafield< T > &p)
void write_zslice_flat(size_t z, const std::vector< atomic_type > &buffer)
size_t get_plane_size_xy() const
ConstRange get_range(const C3DBounds &start, const C3DBounds &end) const
const C3DBounds & get_size() const
void read_xslice_flat(size_t x, std::vector< atomic_type > &buffer) const
reference operator()(const C3DBounds &l)
T3DDatafield(T3DDatafield< T > &&org)
void mask(const TMask &m)
range_iterator begin_range(const C3DBounds &begin, const C3DBounds &end)
Range get_range(const C3DBounds &start, const C3DBounds &end)
const_reference operator[](int i) const
T2DDatafield< T > get_data_plane_xy(size_t z) const
T3DVector< Out > get_gradient(const T3DVector< float > &p) const
const_range_iterator end_range(const C3DBounds &begin, const C3DBounds &end) const
const_reference operator()(size_t x, size_t y, size_t z) const
void put_data_line_z(int x, int y, const std::vector< T > &buffer)
range_iterator_with_boundary_flag begin_range_with_boundary_flags(const C3DBounds &begin, const C3DBounds &end)
range_iterator_with_boundary_flag end_range_with_boundary_flags(const C3DBounds &begin, const C3DBounds &end)
reference operator()(size_t x, size_t y, size_t z)
void write_yslice_flat(size_t y, const std::vector< atomic_type > &buffer)
const_reference operator()(const C3DBounds &l) const
void put_data_plane_xz(size_t y, const T2DDatafield< T > &p)
iterator begin_at(size_t x, size_t y, size_t z)
const_iterator begin_at(size_t x, size_t y, size_t z) const
void write_xslice_flat(size_t x, const std::vector< atomic_type > &buffer)
T3DVector< Out > get_gradient(int index) const
void make_single_ref() __attribute__((deprecated))
T3DDatafield(const T3DDatafield< T > &org)
void get_data_line_x(int y, int z, std::vector< T > &buffer) const
value_type get_interpol_val_at(const T3DVector< float > &p) const __attribute__((deprecated))
const_range_iterator begin_range(const C3DBounds &begin, const C3DBounds &end) const
T3DDatafield(const C3DBounds &_Size)
void get_data_line_z(int x, int y, std::vector< T > &buffer) const
void read_yslice_flat(size_t y, std::vector< atomic_type > &buffer) const
void put_data_line_y(int x, int z, const std::vector< T > &buffer)
T3DDatafield & operator=(const T3DDatafield &org)
const_iterator begin() const
void swap(T3DDatafield &other)
swap the data ofthis 3DDatafield with another one
void read_zslice_flat(size_t z, std::vector< atomic_type > &buffer) const
virtual ~T3DDatafield()
make sure the destructor is virtual
const_iterator end() const
T2DDatafield< T > get_data_plane_yz(size_t x) const
reference operator[](int i)
void put_data_plane_yz(size_t x, const T2DDatafield< T > &p)
const_range_iterator_with_boundary_flag begin_range_with_boundary_flags(const C3DBounds &begin, const C3DBounds &end) const
T3DDatafield(const C3DBounds &size, const data_array &data)
void get_data_line_y(int x, int z, std::vector< T > &buffer) const
void put_data_line_x(int y, int z, const std::vector< T > &buffer)
T3DDatafield(const C3DBounds &size, const T *data)
value_type get_block_avrg(const C3DBounds &Start, const C3DBounds &BlockSize) const
const_range_iterator_with_boundary_flag end_range_with_boundary_flags(const C3DBounds &begin, const C3DBounds &end) const
range_iterator end_range(const C3DBounds &begin, const C3DBounds &end)
T3DVector< Out > get_gradient(size_t x, size_t y, size_t z) const
Class of an attribute that holds data of type T.
Generic string vs. attribute translator singleton.
a 3D iterator that knows its position in the 3D grid, has a flag indicating whether it is on a bounda...
a 3D iterator that knows its position in the 3D grid ans supports iterating over sub-ranges
#define NS_MIA_BEGIN
conveniance define to start the mia namespace
#define NS_MIA_END
conveniance define to end the mia namespace