CTL  0.6.1
Computed Tomography Library
chunk2d.h
Go to the documentation of this file.
1 #ifndef CTL_CHUNK2D_H
2 #define CTL_CHUNK2D_H
3 
4 #include "mat/matrix.h"
5 #include "processing/coordinates.h"
6 #include <QtGlobal>
7 #include <algorithm>
8 #include <array>
9 #include <stdexcept>
10 #include <string>
11 #include <vector>
12 
13 namespace CTL {
14 
22 {
25 
26  bool operator==(const Chunk2DDimensions& other) const;
27  bool operator!=(const Chunk2DDimensions& other) const;
28 
29  std::string info() const;
30  size_t totalNbElements() const;
31 };
32 
50 template <typename T>
51 class Chunk2D
52 {
53 private:
54  template <class IteratorType>
56 
57 public:
59 
62  using reverse_iterator = std::reverse_iterator<iterator>;
63  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
64 
65  iterator begin();
66  iterator end();
67  const_iterator begin() const;
68  const_iterator end() const;
69  const_iterator cbegin() const;
70  const_iterator cend() const;
71  reverse_iterator rbegin();
72  reverse_iterator rend();
73  const_reverse_iterator rbegin() const;
74  const_reverse_iterator rend() const;
75  const_reverse_iterator crbegin() const;
76  const_reverse_iterator crend() const;
77 
78  // ctors
79  explicit Chunk2D(const Dimensions& dimensions);
80  Chunk2D(const Dimensions& dimensions, const T& initValue);
81  Chunk2D(const Dimensions& dimensions, std::vector<T>&& data);
82  Chunk2D(const Dimensions& dimensions, const std::vector<T>& data);
83 
85  Chunk2D(uint width, uint height, const T& initValue);
86  Chunk2D(uint width, uint height, std::vector<T>&& data);
87  Chunk2D(uint width, uint height, const std::vector<T>& data);
88 
89  // getter methods
90  size_t allocatedElements() const;
91  const std::vector<T>& constData() const;
92  const std::vector<T>& data() const;
93  bool hasData() const;
94 
95  const Dimensions& dimensions() const;
96  uint height() const;
97  T max() const;
98  T min() const;
99  size_t nbElements() const;
100  T* rawData();
101  const T* rawData() const;
102  uint width() const;
103 
104  typename std::vector<T>::reference operator()(uint x, uint y);
105  typename std::vector<T>::const_reference operator()(uint x, uint y) const;
106 
107  bool operator==(const Chunk2D<T>& other) const;
108  bool operator!=(const Chunk2D<T>& other) const;
109 
110  Chunk2D& operator+=(const Chunk2D<T>& other);
111  Chunk2D& operator-=(const Chunk2D<T>& other);
112  Chunk2D& operator*=(const T& factor);
113  Chunk2D& operator/=(const T& divisor);
114 
115  Chunk2D operator+(const Chunk2D<T>& other) const;
116  Chunk2D operator-(const Chunk2D<T>& other) const;
117  Chunk2D operator*(const T& factor) const;
118  Chunk2D operator/(const T& divisor) const;
119 
120  // setter methods
121  void setData(std::vector<T>&& data);
122  void setData(const std::vector<T>& data);
123 
124  // other methods
125  void allocateMemory();
126  void allocateMemory(const T& initValue);
127  void fill(const T& fillValue);
128  void freeMemory();
129 
130 protected:
131  std::vector<T> _data;
133 
134 private:
135  bool hasEqualSizeAs(const std::vector<T>& other) const;
136 };
137 
139 {
140  using Generic2DIndex::Generic2DIndex;
141 
142  uint& x() { return idx1(); }
143  uint& y() { return idx2(); }
144  const uint& x() const { return idx1(); }
145  const uint& y() const { return idx2(); }
146 };
147 
148 // iterators
149 template <class T>
150 template <class IteratorType>
151 class Chunk2D<T>::PixelIterator
152 {
153 public:
154  using iterator_category = std::bidirectional_iterator_tag;
155  using value_type = typename IteratorType::value_type;
156  using difference_type = typename IteratorType::difference_type;
157  using pointer = typename IteratorType::pointer;
158  using reference = typename IteratorType::reference;
159 
160  PixelIterator(IteratorType voxel = {}, const Chunk2D<T>* ptrToVol = nullptr);
161 
162  friend bool operator==(const PixelIterator& left, const PixelIterator& right)
163  {
164  return left._dataItr == right._dataItr;
165  }
166  friend bool operator!=(const PixelIterator& left, const PixelIterator& right)
167  {
168  return left._dataItr != right._dataItr;
169  }
170 
171  PixelIterator& operator++();
172  PixelIterator operator++(int);
173  PixelIterator& operator--();
174  PixelIterator operator--(int);
175 
176  reference operator*() const { return *_dataItr; }
177  pointer operator->() const { return _dataItr.operator->(); }
178 
179  operator PixelIterator<typename std::vector<T>::const_iterator>() const;
180 
181  reference value() const;
182  PixelIndex pixelIndex() const;
183 
184 private:
185  IteratorType _dataItr;
186  const Chunk2D<T>* _ptrToVol;
187 };
188 
189 namespace assist {
190 
191 template <typename ToType, typename FromType, typename ConversionFun = ToType (*)(const FromType&)>
192 Chunk2D<ToType> convertTo(const Chunk2D<FromType>& chunk2d,
193  ConversionFun f = [](const FromType& val) { return static_cast<ToType>(val); });
194 float interpolate2D(const Chunk2D<float>& chunk2D, const mat::Matrix<2,1>& pos);
195 float interpolate2D(const Chunk2D<float>& chunk2D, double x, double y);
196 
197 } // namespace assist
198 
199 using assist::convertTo;
200 
201 } // namespace CTL
202 
203 #include "chunk2d.tpp"
204 
207 #endif // CTL_CHUNK2D_H
std::vector< T > _data
The internal data of the chunk.
Definition: chunk2d.h:131
size_t allocatedElements() const
Definition: chunk2d.tpp:411
T min() const
Definition: chunk2d.tpp:203
void setData(std::vector< T > &&data)
Definition: chunk2d.tpp:220
bool operator==(const Chunk2DDimensions &other) const
Definition: chunk2d.tpp:369
const std::vector< T > & constData() const
Definition: chunk2d.tpp:420
T max() const
Definition: chunk2d.tpp:189
Definition: chunk2d.h:21
Chunk2D & operator-=(const Chunk2D< T > &other)
Definition: chunk2d.tpp:277
bool operator==(const Chunk2D< T > &other) const
Definition: chunk2d.tpp:564
std::vector< T >::reference operator()(uint x, uint y)
Definition: chunk2d.tpp:543
bool hasEqualSizeAs(const std::vector< T > &other) const
Definition: chunk2d.tpp:250
Chunk2D & operator *=(const T &factor)
Definition: chunk2d.tpp:293
T * rawData()
Definition: chunk2d.tpp:485
Chunk2D operator+(const Chunk2D< T > &other) const
Definition: chunk2d.tpp:318
float interpolate2D(const Chunk2D< float > &chunk2D, const mat::Matrix< 2, 1 > &pos)
Returns the value at position pos from chunk2D using (bi-)linear interpolation.
Definition: chunk2d.tpp:748
Chunk2D operator-(const Chunk2D< T > &other) const
Definition: chunk2d.tpp:331
bool operator!=(const Chunk2D< T > &other) const
Definition: chunk2d.tpp:573
The Chunk2D class provides a simple container for storage of 2D image data.
Definition: chunk2d.h:51
const std::vector< T > & data() const
Definition: chunk2d.tpp:429
size_t nbElements() const
Definition: chunk2d.tpp:474
Chunk2D & operator+=(const Chunk2D< T > &other)
Definition: chunk2d.tpp:260
Chunk2D & operator/=(const T &divisor)
Definition: chunk2d.tpp:305
Chunk2D(const Dimensions &dimensions)
Definition: chunk2d.tpp:11
Definition: coordinates.h:39
uint width() const
Definition: chunk2d.tpp:507
uint height() const
Definition: chunk2d.tpp:462
Chunk2D operator *(const T &factor) const
Definition: chunk2d.tpp:343
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
uint width
The width of the chunk.
Definition: chunk2d.h:23
Chunk2D< ToType > convertTo(const Chunk2D< FromType > &chunk2d, ConversionFun f=[](const FromType &val) { return static_cast< ToType >(val);})
Returns a Chunk2D<ToType>, where ToType must be specified as a template parameter.
Definition: chunk2d.tpp:737
bool operator!=(const Chunk2DDimensions &other) const
Definition: chunk2d.tpp:380
const Dimensions & dimensions() const
Definition: chunk2d.tpp:451
void allocateMemory()
Definition: chunk2d.tpp:586
size_t totalNbElements() const
Definition: chunk2d.tpp:396
Chunk2D operator/(const T &divisor) const
Definition: chunk2d.tpp:355
std::string info() const
Definition: chunk2d.tpp:388
Dimensions _dim
The dimensions (width x height) of the chunk.
Definition: chunk2d.h:132
uint height
The height of the chunk.
Definition: chunk2d.h:24
Definition: chunk2d.h:138
void fill(const T &fillValue)
Definition: chunk2d.tpp:518
bool hasData() const
Definition: chunk2d.tpp:440
Definition: chunk2d.h:55