36 #ifndef VIGRA_ACCESSOR_HXX
37 #define VIGRA_ACCESSOR_HXX
39 #include "metaprogramming.hxx"
40 #include "numerictraits.hxx"
132 template <
class VALUETYPE>
142 template <
class ITERATOR>
143 VALUETYPE
const &
operator()(ITERATOR
const & i)
const {
return *i; }
145 VALUETYPE
const &
operator()(VALUETYPE
const * i)
const {
return *i; }
149 template <
class ITERATOR,
class OFFSET>
150 VALUETYPE
const &
operator()(ITERATOR
const & i, OFFSET
const & diff)
const
159 template <
class V,
class ITERATOR>
160 void set(V
const & value, ITERATOR
const & i)
const
161 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
164 template <
class V,
class ITERATOR>
165 void set(V
const & value, ITERATOR & i)
const
166 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
173 template <
class V,
class ITERATOR,
class OFFSET>
174 void set(V
const & value, ITERATOR
const & i, OFFSET
const & diff)
const
176 i[diff]= detail::RequiresExplicitCast<VALUETYPE>::cast(value);
197 template <
class VALUETYPE>
209 template <
class ITERATOR>
211 {
return detail::RequiresExplicitCast<VALUETYPE>::cast(*i); }
218 template <
class ITERATOR,
class OFFSET>
219 VALUETYPE
operator()(ITERATOR
const & i, OFFSET
const & diff)
const
221 return detail::RequiresExplicitCast<VALUETYPE>::cast(i[diff]);
227 template <
class V,
class ITERATOR>
228 void set(V value, ITERATOR
const & i)
const
229 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
232 template <
class V,
class ITERATOR>
233 void set(V value, ITERATOR & i)
const
234 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
241 template <
class V,
class ITERATOR,
class OFFSET>
242 void set(V value, ITERATOR
const & i, OFFSET
const & diff)
const
244 i[diff]= detail::RequiresExplicitCast<VALUETYPE>::cast(value);
268 template <
class VALUETYPE>
272 typedef VALUETYPE value_type;
276 template <
class ITERATOR>
282 template <
class ITERATOR,
class OFFSET>
283 VALUETYPE
const &
operator()(ITERATOR
const & i, OFFSET
const & diff)
const
306 template <
class VALUETYPE>
310 typedef VALUETYPE value_type;
316 template <
class ITERATOR>
318 {
return detail::RequiresExplicitCast<VALUETYPE>::cast(*i); }
325 template <
class ITERATOR,
class OFFSET>
326 VALUETYPE
operator()(ITERATOR
const & i, OFFSET
const & diff)
const
328 return detail::RequiresExplicitCast<VALUETYPE>::cast(i[diff]);
364 template <
class VECTORTYPE>
381 template <
class ITERATOR>
383 {
return (*i)[index_]; }
387 template <
class ITERATOR,
class OFFSET>
390 return i[diff][index_];
397 template <
class V,
class ITERATOR>
398 void set(V
const & value, ITERATOR
const & i)
const
400 (*i)[index_] = detail::RequiresExplicitCast<value_type>::cast(value);
408 template <
class V,
class ITERATOR,
class OFFSET>
409 void set(V
const & value, ITERATOR
const & i, OFFSET
const & diff)
const
411 i[diff][index_]= detail::RequiresExplicitCast<value_type>::cast(value);
448 template <
class VECTORTYPE>
468 template <
class ITERATOR>
470 {
return detail::RequiresExplicitCast<value_type>::cast((*i)[index_]); }
477 template <
class ITERATOR,
class OFFSET>
480 return detail::RequiresExplicitCast<value_type>::cast(i[diff][index_]);
487 template <
class V,
class ITERATOR>
488 void set(V value, ITERATOR
const & i)
const
490 (*i)[index_] = detail::RequiresExplicitCast<value_type>::cast(value);
498 template <
class V,
class ITERATOR,
class OFFSET>
499 void set(V value, ITERATOR
const & i, OFFSET
const & diff)
const
501 i[diff][index_]= detail::RequiresExplicitCast<value_type>::cast(value);
538 template <
class ACCESSOR>
557 template <
class ITERATOR>
559 {
return a_.getComponent(i, index_); }
563 template <
class ITERATOR,
class OFFSET>
566 return a_.getComponent(i, diff, index_);
573 template <
class V,
class ITERATOR>
574 void set(V
const & value, ITERATOR
const & i)
const
576 a_.setComponent(detail::RequiresExplicitCast<value_type>::cast(value), i, index_);
584 template <
class V,
class ITERATOR,
class OFFSET>
585 void set(V
const & value, ITERATOR
const & i, OFFSET
const & diff)
const
587 a_.setComponent(detail::RequiresExplicitCast<value_type>::cast(value), i, diff, index_);
631 template <
class SEQUENCE>
640 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
642 If<typename TypeTraits<SEQUENCE>::isConst,
643 typename SEQUENCE::const_iterator,
644 typename SEQUENCE::iterator>::type
649 typedef typename SEQUENCE::iterator iterator;
654 template <
class ITERATOR>
655 iterator
begin(ITERATOR
const & i)
const
662 template <
class ITERATOR>
663 iterator
end(ITERATOR
const & i)
const
671 template <
class ITERATOR,
class OFFSET>
672 iterator
begin(ITERATOR
const & i, OFFSET
const & diff)
const
674 return i[diff].begin();
680 template <
class ITERATOR,
class OFFSET>
681 iterator
end(ITERATOR
const & i, OFFSET
const & diff)
const
683 return i[diff].end();
688 template <
class ITERATOR>
689 unsigned int size(ITERATOR
const & i)
const {
return (*i).size(); }
693 template <
class ITERATOR,
class OFFSET>
694 unsigned int size(ITERATOR
const & i, OFFSET
const & diff)
const
695 {
return i[diff].size(); }
770 template <
class VECTOR>
787 template <
class ITERATOR>
798 template <
class V,
class ITERATOR>
801 (*i)[idx] = detail::RequiresExplicitCast<component_type>::cast(value);
807 template <
class ITERATOR,
class OFFSET>
818 template <
class V,
class ITERATOR,
class OFFSET>
820 setComponent(V
const & value, ITERATOR
const & i, OFFSET
const & diff,
int idx)
const
822 i[diff][idx] = detail::RequiresExplicitCast<component_type>::cast(value);
870 template <
class Iter1,
class Acc1,
class Iter2,
class Acc2>
877 typedef pair<typename Acc1::value_type, typename Acc2::value_type>
883 : i1_(i1), a1_(a1), i2_(i2), a2_(a2)
888 template <
class OFFSET>
891 return std::make_pair(a1_(i1_, d), a2_(i2_, d));
896 template <
class OFFSET1,
class OFFSET2>
900 return std::make_pair(a1_(i1_, d1), a2_(i2_, d1));
913 struct AccessorTraits
915 typedef StandardAccessor<T> default_accessor;
916 typedef StandardConstAccessor<T> default_const_accessor;
919 #define VIGRA_DEFINE_ACCESSOR_TRAITS(VALUE, ACCESSOR, CONST_ACCESSOR) \
921 struct AccessorTraits<VALUE > \
923 typedef ACCESSOR<VALUE > default_accessor; \
924 typedef CONST_ACCESSOR<VALUE > default_const_accessor; \
927 VIGRA_DEFINE_ACCESSOR_TRAITS(
signed char, StandardValueAccessor, StandardConstValueAccessor)
928 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned char, StandardValueAccessor, StandardConstValueAccessor)
929 VIGRA_DEFINE_ACCESSOR_TRAITS(
short, StandardValueAccessor, StandardConstValueAccessor)
930 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned short, StandardValueAccessor, StandardConstValueAccessor)
931 VIGRA_DEFINE_ACCESSOR_TRAITS(
int, StandardValueAccessor, StandardConstValueAccessor)
932 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned int, StandardValueAccessor, StandardConstValueAccessor)
933 VIGRA_DEFINE_ACCESSOR_TRAITS(
long, StandardValueAccessor, StandardConstValueAccessor)
934 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned long, StandardValueAccessor, StandardConstValueAccessor)
935 VIGRA_DEFINE_ACCESSOR_TRAITS(
float, StandardValueAccessor, StandardConstValueAccessor)
936 VIGRA_DEFINE_ACCESSOR_TRAITS(
double, StandardValueAccessor, StandardConstValueAccessor)
938 template <class T,
unsigned int RED_IDX,
unsigned int GREEN_IDX,
unsigned int BLUE_IDX> class
RGBValue;
942 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
944 template <
class T,
unsigned int RED_IDX,
unsigned int GREEN_IDX,
unsigned int BLUE_IDX>
945 struct AccessorTraits<RGBValue<T, RED_IDX, GREEN_IDX, BLUE_IDX> >
951 template <
class T,
int SIZE>
952 struct AccessorTraits<TinyVector<T, SIZE> >
958 #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION
960 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<unsigned char>, RGBAccessor, RGBAccessor)
961 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
signed char>, RGBAccessor, RGBAccessor)
962 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
short>, RGBAccessor, RGBAccessor)
963 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned short>, RGBAccessor, RGBAccessor)
964 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
int>, RGBAccessor, RGBAccessor)
965 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned int>, RGBAccessor, RGBAccessor)
966 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
long>, RGBAccessor, RGBAccessor)
967 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned long>, RGBAccessor, RGBAccessor)
968 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
float>, RGBAccessor, RGBAccessor)
969 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
double>, RGBAccessor, RGBAccessor)
971 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 2>
972 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
973 #undef VIGRA_PIXELTYPE
974 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 3>
975 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
976 #undef VIGRA_PIXELTYPE
977 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 4>
978 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
979 #undef VIGRA_PIXELTYPE
980 #define VIGRA_PIXELTYPE TinyVector<short, 2>
981 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
982 #undef VIGRA_PIXELTYPE
983 #define VIGRA_PIXELTYPE TinyVector<short, 3>
984 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
985 #undef VIGRA_PIXELTYPE
986 #define VIGRA_PIXELTYPE TinyVector<short, 4>
987 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
988 #undef VIGRA_PIXELTYPE
989 #define VIGRA_PIXELTYPE TinyVector<int, 2>
990 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
991 #undef VIGRA_PIXELTYPE
992 #define VIGRA_PIXELTYPE TinyVector<int, 3>
993 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
994 #undef VIGRA_PIXELTYPE
995 #define VIGRA_PIXELTYPE TinyVector<int, 4>
996 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
997 #undef VIGRA_PIXELTYPE
998 #define VIGRA_PIXELTYPE TinyVector<float, 2>
999 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1000 #undef VIGRA_PIXELTYPE
1001 #define VIGRA_PIXELTYPE TinyVector<float, 3>
1002 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1003 #undef VIGRA_PIXELTYPE
1004 #define VIGRA_PIXELTYPE TinyVector<float, 4>
1005 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1006 #undef VIGRA_PIXELTYPE
1007 #define VIGRA_PIXELTYPE TinyVector<double, 2>
1008 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1009 #undef VIGRA_PIXELTYPE
1010 #define VIGRA_PIXELTYPE TinyVector<double, 3>
1011 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1012 #undef VIGRA_PIXELTYPE
1013 #define VIGRA_PIXELTYPE TinyVector<double, 4>
1014 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1015 #undef VIGRA_PIXELTYPE
1017 #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION
1019 #undef VIGRA_DEFINE_ACCESSOR_TRAITS
1023 #endif // VIGRA_ACCESSOR_HXX
void setComponent(V const &value, ITERATOR const &i, int idx) const
Definition: accessor.hxx:799
Accessor for one component of a vector.
Definition: accessor.hxx:539
void set(V const &value, ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:585
VALUETYPE const & operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:283
VectorElementAccessor(int index, ACCESSOR a=ACCESSOR())
Definition: accessor.hxx:550
VectorComponentValueAccessor(int index)
Definition: accessor.hxx:459
void set(V const &value, ITERATOR const &i) const
Definition: accessor.hxx:398
void setComponent(V const &value, ITERATOR const &i, OFFSET const &diff, int idx) const
Definition: accessor.hxx:820
ACCESSOR::component_type value_type
Definition: accessor.hxx:546
VECTORTYPE::value_type value_type
Definition: accessor.hxx:371
void set(V value, ITERATOR const &i) const
Definition: accessor.hxx:228
value_type const & operator()(ITERATOR const &i) const
Definition: accessor.hxx:558
pair< typename Acc1::value_type, typename Acc2::value_type > value_type
Definition: accessor.hxx:878
component_type const & getComponent(ITERATOR const &i, OFFSET const &diff, int idx) const
Definition: accessor.hxx:808
Accessor for one component of a vector.
Definition: accessor.hxx:449
VALUETYPE value_type
Definition: accessor.hxx:138
VALUETYPE operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:219
iterator begin(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:672
void set(V value, ITERATOR const &i) const
Definition: accessor.hxx:488
Encapsulate access to the values an iterator points to.
Definition: accessor.hxx:307
value_type operator()(OFFSET1 d1, OFFSET2 const &d2) const
Definition: accessor.hxx:897
VECTORTYPE::value_type value_type
Definition: accessor.hxx:455
VALUETYPE operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:326
unsigned int size(ITERATOR const &i) const
Definition: accessor.hxx:689
value_type const & operator()(ITERATOR const &i) const
Definition: accessor.hxx:382
Accessor for items that are STL compatible vectors.
Definition: accessor.hxx:771
void set(V value, ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:242
void set(V const &value, ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:174
VALUETYPE value_type
Definition: accessor.hxx:203
VectorComponentAccessor(int index)
Definition: accessor.hxx:375
VECTOR::value_type component_type
Definition: accessor.hxx:777
Accessor for items that are STL compatible sequences.
Definition: accessor.hxx:632
void set(V value, ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:499
iterator begin(ITERATOR const &i) const
Definition: accessor.hxx:655
Encapsulate access to the values an iterator points to.
Definition: accessor.hxx:198
Access two images simultaneously.
Definition: accessor.hxx:871
void setIndex(int i)
Definition: accessor.hxx:416
value_type operator()(ITERATOR const &i) const
Definition: accessor.hxx:469
void setIndex(int i)
Definition: accessor.hxx:592
value_type const & operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:564
VectorElementAccessor< VectorAccessor< VECTOR > > ElementAccessor
Definition: accessor.hxx:782
Class for fixed size vectors.This class contains an array of size SIZE of the specified VALUETYPE...
Definition: accessor.hxx:940
iterator end(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:681
Accessor for one component of a vector.
Definition: accessor.hxx:365
value_type operator()(OFFSET const &d) const
Definition: accessor.hxx:889
VALUETYPE const & operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:150
void set(V const &value, ITERATOR const &i) const
Definition: accessor.hxx:160
Encapsulate read access to the values an iterator points to.
Definition: accessor.hxx:269
SEQUENCE::value_type component_type
Definition: accessor.hxx:638
value_type operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:478
VALUETYPE const & operator()(ITERATOR const &i) const
Definition: accessor.hxx:277
void set(V const &value, ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:409
VALUETYPE operator()(ITERATOR const &i) const
Definition: accessor.hxx:317
Class for a single RGB value.
Definition: accessor.hxx:938
Encapsulate access to the values an iterator points to.
Definition: accessor.hxx:133
component_type const & getComponent(ITERATOR const &i, int idx) const
Definition: accessor.hxx:788
MultiImageAccessor2(Iter1 i1, Acc1 a1, Iter2 i2, Acc2 a2)
Definition: accessor.hxx:882
void setIndex(int i)
Definition: accessor.hxx:506
VALUETYPE operator()(ITERATOR const &i) const
Definition: accessor.hxx:210
unsigned int size(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:694
void set(V const &value, ITERATOR const &i) const
Definition: accessor.hxx:574
value_type const & operator()(ITERATOR const &i, OFFSET const &diff) const
Definition: accessor.hxx:388
Definition: accessor.hxx:939
iterator end(ITERATOR const &i) const
Definition: accessor.hxx:663
VALUETYPE const & operator()(ITERATOR const &i) const
Definition: accessor.hxx:143