45 #ifndef _INCLUDED_Field3D_Field_H_
46 #define _INCLUDED_Field3D_Field_H_
52 #include <boost/intrusive_ptr.hpp>
53 #include <boost/thread/mutex.hpp>
97 typedef boost::intrusive_ptr<FieldBase>
Ptr;
125 return staticClassName();
138 virtual std::string className()
const = 0;
142 virtual Ptr clone()
const = 0;
153 {
return m_metadata; }
157 {
return m_metadata; }
215 typedef boost::intrusive_ptr<FieldRes>
Ptr;
216 typedef std::vector<Ptr>
Vec;
224 {
return std::string(
"FieldRes"); }
233 return staticClassName();
252 {
return m_extents; }
256 {
return m_dataWindow; }
259 {
return m_dataWindow.max - m_dataWindow.min +
V3i(1); }
266 {
return m_mapping; }
270 {
return m_mapping; }
273 bool isInBounds(
int i,
int j,
int k)
const;
282 {
return sizeof(*this); }
343 "Tried to call FieldRes::setMapping with null pointer");
375 template <
class Data_T>
382 typedef boost::intrusive_ptr<Field>
Ptr;
390 typedef std::vector<Ptr>
Vec;
417 class const_iterator;
420 const_iterator
cbegin()
const;
424 const_iterator
cend()
const;
427 const_iterator
cend(
const Box3i &subset)
const;
437 virtual Data_T
value(
int i,
int j,
int k)
const = 0;
460 #define FIELD3D_CLASSTYPE_TEMPL_INSTANTIATION(field) \
461 template <typename Data_T> \
462 TemplatedFieldType<field<Data_T> > field<Data_T>::ms_classType = \
463 TemplatedFieldType<field<Data_T> >(); \
469 template <
class Data_T>
480 template <
class Data_T>
484 if (subset.isEmpty())
491 template <
class Data_T>
496 V3i(m_dataWindow.min.x,
498 m_dataWindow.max.z + 1));
503 template <
class Data_T>
516 template <
class Data_T>
525 : x(i.x), y(i.y), z(i.z),
526 m_window(i.m_window), m_field(i.m_field)
530 const V3i ¤tPos)
531 : x(currentPos.x), y(currentPos.y), z(currentPos.z),
532 m_window(window), m_field(field)
539 if (x == m_window.max.x) {
540 if (y == m_window.max.y) {
553 template <
class Iter_T>
554 bool operator == (
const Iter_T &rhs)
const
556 return x == rhs.x && y == rhs.y && z == rhs.z;
558 template <
class Iter_T>
559 bool operator != (
const Iter_T &rhs)
const
561 return x != rhs.x || y != rhs.y || z != rhs.z;
565 return m_field.value(x, y, z);
595 template <
class Data_T>
597 :
public Field<Data_T>
603 typedef boost::intrusive_ptr<WritableField>
Ptr;
612 return "WritableField";
627 inline iterator
begin();
631 inline iterator
end();
634 inline iterator
end(
const Box3i &subset);
646 virtual Data_T&
lvalue(
int i,
int j,
int k) = 0;
653 { std::fill(
begin(),
end(), value); }
673 template <
class Data_T>
685 template <
class Data_T>
689 if (subset.isEmpty())
691 return iterator(*
this, subset, subset.min);
696 template <
class Data_T>
707 template <
class Data_T>
711 V3i(subset.min.x, subset.min.y, subset.max.z + 1));
718 template <
class Data_T>
726 const V3i ¤tPos)
727 : x(currentPos.x), y(currentPos.y), z(currentPos.z),
728 m_window(window), m_field(field)
735 if (x == m_window.max.x) {
736 if (y == m_window.max.y) {
750 template <
class Iter_T>
751 bool operator == (
const Iter_T &rhs)
const
753 return x == rhs.x && y == rhs.y && z == rhs.z;
756 template <
class Iter_T>
757 bool operator != (
const Iter_T &rhs)
const
759 return x != rhs.x || y != rhs.y || z != rhs.z;
764 return m_field.lvalue(x, y, z);
797 template <
class Data_T>
805 typedef boost::intrusive_ptr<ResizableField>
Ptr;
814 return "ResizableField";
845 template <
class Data_T2>
877 template <
class Data_T>
890 template <
class Data_T>
901 template <
class Data_T>
903 const Box3i &dataWindow)
914 template <
class Data_T>
919 size +
V3i(padding - 1)));
924 template <
class Data_T>
933 typename base::iterator i = base::begin();
934 typename base::iterator end = base::end();
936 for (; i != end; ++i, ++c)
942 template <
class Data_T>
943 template <
class Data_T2>
951 typename base::iterator i = base::begin();
952 typename base::iterator end = base::end();
954 for (; i != end; ++i, ++c)
960 template <
class Data_T>
963 setSize(fieldToMatch->extents(), fieldToMatch->dataWindow());
973 template <
class Data_T,
class Data_T2>
993 template <
class Data_T>
996 if (!sameDefinition<Data_T, Data_T>(a, b)) {
1005 for (; is1 != ie1; ++is1, ++is2) {
1020 return static_cast<int>(std::floor(contCoord));
1029 return static_cast<double>(discCoord) + 0.5;
1069 template <
class Iter_T>
1072 if (num <= 0)
return;
1073 for (
int i=0; i<num; ++i, ++iter);
1079 template <
class Iter_T>
1080 void advance(Iter_T &iter,
int num,
const Iter_T &end)
1084 for (
int i=0; i<num && iter != end; ++i, ++iter);
1093 #endif // Include guard