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