44 #ifndef _INCLUDED_Field3D_DenseField_H_
45 #define _INCLUDED_Field3D_DenseField_H_
49 #include <boost/lexical_cast.hpp>
63 template <
class Field_T>
65 template <
class Field_T>
81 template <
class Data_T>
89 typedef boost::intrusive_ptr<DenseField>
Ptr;
90 typedef std::vector<Ptr>
Vec;
116 virtual Data_T
value(
int i,
int j,
int k)
const;
117 virtual long long int memSize()
const;
139 virtual Data_T&
lvalue(
int i,
int j,
int k);
145 const Data_T&
fastValue(
int i,
int j,
int k)
const;
155 class const_iterator;
161 const_iterator
cbegin()
const;
165 const_iterator
cend()
const;
168 const_iterator
cend(
const Box3i &subset)
const;
226 inline Data_T*
ptr(
int i,
int j,
int k);
228 inline const Data_T*
ptr(
int i,
int j,
int k)
const;
247 template <
class Data_T>
259 const V3i ¤tPos)
260 : x(currentPos.x), y(currentPos.y), z(currentPos.z),
261 m_window(window), m_field(field)
262 { m_p = m_field.ptr(x, y, z); }
268 if (x == m_window.max.x) {
269 if (y == m_window.max.y) {
270 m_p = m_field.ptr(x = m_window.min.x, y = m_window.min.y, ++z);
272 m_p = m_field.ptr(x = m_window.min.x, ++y, z);
281 template <
class Iter_T>
282 inline bool operator == (
const Iter_T &rhs)
const
284 return m_p == &(*rhs);
287 template <
class Iter_T>
288 inline bool operator != (
const Iter_T &rhs)
const
290 return m_p != &(*rhs);
298 inline const Data_T* operator -> ()
const
325 template <
class Data_T>
337 const V3i ¤tPos)
338 : x(currentPos.x), y(currentPos.y), z(currentPos.z),
339 m_window(window), m_field(field)
340 { m_p = m_field.ptr(x, y, z); }
346 if (x == m_window.max.x) {
347 if (y == m_window.max.y) {
348 m_p = m_field.ptr(x = m_window.min.x, y = m_window.min.y, ++z);
350 m_p = m_field.ptr(x = m_window.min.x, ++y, z);
359 template <
class Iter_T>
360 inline bool operator == (
const Iter_T &rhs)
const
362 return m_p == &(*rhs);
365 template <
class Iter_T>
366 inline bool operator != (
const Iter_T &rhs)
const
368 return m_p != &(*rhs);
376 inline Data_T* operator -> ()
const
402 template <
class Data_T>
405 m_memSize(0), m_memSizeXY(0)
412 template <
class Data_T>
415 std::fill(m_data.begin(), m_data.end(), value);
420 template <
class Data_T>
423 return fastValue(i, j, k);
428 template <
class Data_T>
431 long long int superClassMemSize = base::memSize();
432 long long int vectorMemSize = m_data.capacity() *
sizeof(Data_T);
433 return sizeof(*this) + vectorMemSize + superClassMemSize;
438 template <
class Data_T>
441 return fastLValue(i, j, k);
446 template <
class Data_T>
449 assert (i >= base::m_dataWindow.min.x);
450 assert (i <= base::m_dataWindow.max.x);
451 assert (j >= base::m_dataWindow.min.y);
452 assert (j <= base::m_dataWindow.max.y);
453 assert (k >= base::m_dataWindow.min.z);
454 assert (k <= base::m_dataWindow.max.z);
456 i -= base::m_dataWindow.min.x;
457 j -= base::m_dataWindow.min.y;
458 k -= base::m_dataWindow.min.z;
460 return m_data[i + j * m_memSize.x + k * m_memSizeXY];
465 template <
class Data_T>
468 assert (i >= base::m_dataWindow.min.x);
469 assert (i <= base::m_dataWindow.max.x);
470 assert (j >= base::m_dataWindow.min.y);
471 assert (j <= base::m_dataWindow.max.y);
472 assert (k >= base::m_dataWindow.min.z);
473 assert (k <= base::m_dataWindow.max.z);
475 i -= base::m_dataWindow.min.x;
476 j -= base::m_dataWindow.min.y;
477 k -= base::m_dataWindow.min.z;
479 return m_data[i + j * m_memSize.x + k * m_memSizeXY];
484 template <
class Data_T>
490 return const_iterator(*
this, base::m_dataWindow, base::m_dataWindow.min);
495 template <
class Data_T>
499 if (subset.isEmpty())
506 template <
class Data_T>
511 V3i(base::m_dataWindow.min.x,
512 base::m_dataWindow.min.y,
513 base::m_dataWindow.max.z + 1));
518 template <
class Data_T>
523 V3i(subset.min.x, subset.min.y, subset.max.z + 1));
528 template <
class Data_T>
534 return iterator(*
this, base::m_dataWindow, base::m_dataWindow.min); }
538 template <
class Data_T>
542 if (subset.isEmpty())
544 return iterator(*
this, subset, subset.min);
549 template <
class Data_T>
553 return iterator(*
this, base::m_dataWindow,
554 V3i(base::m_dataWindow.min.x,
555 base::m_dataWindow.min.y,
556 base::m_dataWindow.max.z + 1));
561 template <
class Data_T>
566 V3i(subset.min.x, subset.min.y, subset.max.z + 1));
571 template <
class Data_T>
578 m_memSize = base::m_dataWindow.max - base::m_dataWindow.min +
V3i(1);
579 m_memSizeXY = m_memSize.x * m_memSize.y;
582 if (base::m_dataWindow.max.x < base::m_dataWindow.min.x ||
583 base::m_dataWindow.max.y < base::m_dataWindow.min.y ||
584 base::m_dataWindow.max.z < base::m_dataWindow.min.z)
585 throw Exc::ResizeException(
"Attempt to resize ResizableField object "
586 "using negative size. Data window was: " +
587 boost::lexical_cast<std::string>(
588 base::m_dataWindow.min) +
" - " +
589 boost::lexical_cast<std::string>(
590 base::m_dataWindow.max));
594 std::vector<Data_T>().swap(m_data);
595 m_data.resize(m_memSize.x * m_memSize.y * m_memSize.z);
597 catch (std::bad_alloc &e) {
598 throw Exc::MemoryException(
"Couldn't allocate DenseField of size " +
599 boost::lexical_cast<std::string>(m_memSize));
605 template <
class Data_T>
609 i -= base::m_dataWindow.min.x;
610 j -= base::m_dataWindow.min.y;
611 k -= base::m_dataWindow.min.z;
613 return &m_data[i + j * m_memSize.x + k * m_memSizeXY];
618 template <
class Data_T>
622 i -= base::m_dataWindow.min.x;
623 j -= base::m_dataWindow.min.y;
624 k -= base::m_dataWindow.min.z;
626 return &m_data[i + j * m_memSize.x + k * m_memSizeXY];
641 #endif // Include guard