36 #ifndef VIGRA_ACCESSOR_HXX
37 #define VIGRA_ACCESSOR_HXX
39 #include "metaprogramming.hxx"
40 #include "numerictraits.hxx"
131 template <
class VALUETYPE>
141 template <
class ITERATOR>
142 VALUETYPE
const &
operator()(ITERATOR
const & i)
const {
return *i; }
144 VALUETYPE
const &
operator()(VALUETYPE
const * i)
const {
return *i; }
148 template <
class ITERATOR,
class DIFFERENCE>
149 VALUETYPE
const &
operator()(ITERATOR
const & i, DIFFERENCE
const & diff)
const
158 template <
class V,
class ITERATOR>
159 void set(V
const & value, ITERATOR
const & i)
const
160 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
163 template <
class V,
class ITERATOR>
164 void set(V
const & value, ITERATOR & i)
const
165 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
172 template <
class V,
class ITERATOR,
class DIFFERENCE>
173 void set(V
const & value, ITERATOR
const & i, DIFFERENCE
const & diff)
const
175 i[diff]= detail::RequiresExplicitCast<VALUETYPE>::cast(value);
196 template <
class VALUETYPE>
208 template <
class ITERATOR>
210 {
return detail::RequiresExplicitCast<VALUETYPE>::cast(*i); }
217 template <
class ITERATOR,
class DIFFERENCE>
218 VALUETYPE
operator()(ITERATOR
const & i, DIFFERENCE
const & diff)
const
220 return detail::RequiresExplicitCast<VALUETYPE>::cast(i[diff]);
226 template <
class V,
class ITERATOR>
227 void set(V value, ITERATOR
const & i)
const
228 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
231 template <
class V,
class ITERATOR>
232 void set(V value, ITERATOR & i)
const
233 { *i = detail::RequiresExplicitCast<VALUETYPE>::cast(value); }
240 template <
class V,
class ITERATOR,
class DIFFERENCE>
241 void set(V value, ITERATOR
const & i, DIFFERENCE
const & diff)
const
243 i[diff]= detail::RequiresExplicitCast<VALUETYPE>::cast(value);
267 template <
class VALUETYPE>
271 typedef VALUETYPE value_type;
275 template <
class ITERATOR>
281 template <
class ITERATOR,
class DIFFERENCE>
282 VALUETYPE
const &
operator()(ITERATOR
const & i, DIFFERENCE
const & diff)
const
305 template <
class VALUETYPE>
309 typedef VALUETYPE value_type;
315 template <
class ITERATOR>
317 {
return detail::RequiresExplicitCast<VALUETYPE>::cast(*i); }
324 template <
class ITERATOR,
class DIFFERENCE>
325 VALUETYPE
operator()(ITERATOR
const & i, DIFFERENCE
const & diff)
const
327 return detail::RequiresExplicitCast<VALUETYPE>::cast(i[diff]);
363 template <
class VECTORTYPE>
380 template <
class ITERATOR>
382 {
return (*i)[index_]; }
386 template <
class ITERATOR,
class DIFFERENCE>
389 return i[diff][index_];
396 template <
class V,
class ITERATOR>
397 void set(V
const & value, ITERATOR
const & i)
const
399 (*i)[index_] = detail::RequiresExplicitCast<value_type>::cast(value);
407 template <
class V,
class ITERATOR,
class DIFFERENCE>
408 void set(V
const & value, ITERATOR
const & i, DIFFERENCE
const & diff)
const
410 i[diff][index_]= detail::RequiresExplicitCast<value_type>::cast(value);
447 template <
class VECTORTYPE>
467 template <
class ITERATOR>
469 {
return detail::RequiresExplicitCast<value_type>::cast((*i)[index_]); }
476 template <
class ITERATOR,
class DIFFERENCE>
479 return detail::RequiresExplicitCast<value_type>::cast(i[diff][index_]);
486 template <
class V,
class ITERATOR>
487 void set(V value, ITERATOR
const & i)
const
489 (*i)[index_] = detail::RequiresExplicitCast<value_type>::cast(value);
497 template <
class V,
class ITERATOR,
class DIFFERENCE>
498 void set(V value, ITERATOR
const & i, DIFFERENCE
const & diff)
const
500 i[diff][index_]= detail::RequiresExplicitCast<value_type>::cast(value);
537 template <
class ACCESSOR>
556 template <
class ITERATOR>
558 {
return a_.getComponent(i, index_); }
562 template <
class ITERATOR,
class DIFFERENCE>
565 return a_.getComponent(i, diff, index_);
572 template <
class V,
class ITERATOR>
573 void set(V
const & value, ITERATOR
const & i)
const
575 a_.setComponent(detail::RequiresExplicitCast<value_type>::cast(value), i, index_);
583 template <
class V,
class ITERATOR,
class DIFFERENCE>
584 void set(V
const & value, ITERATOR
const & i, DIFFERENCE
const & diff)
const
586 a_.setComponent(detail::RequiresExplicitCast<value_type>::cast(value), i, diff, index_);
630 template <
class SEQUENCE>
639 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
641 If<typename TypeTraits<SEQUENCE>::isConst,
642 typename SEQUENCE::const_iterator,
643 typename SEQUENCE::iterator>::type
648 typedef typename SEQUENCE::iterator iterator;
653 template <
class ITERATOR>
654 iterator
begin(ITERATOR
const & i)
const
661 template <
class ITERATOR>
662 iterator
end(ITERATOR
const & i)
const
670 template <
class ITERATOR,
class DIFFERENCE>
671 iterator
begin(ITERATOR
const & i, DIFFERENCE
const & diff)
const
673 return i[diff].begin();
679 template <
class ITERATOR,
class DIFFERENCE>
680 iterator
end(ITERATOR
const & i, DIFFERENCE
const & diff)
const
682 return i[diff].end();
687 template <
class ITERATOR>
688 unsigned int size(ITERATOR
const & i)
const {
return (*i).size(); }
692 template <
class ITERATOR,
class DIFFERENCE>
693 unsigned int size(ITERATOR
const & i, DIFFERENCE
const & diff)
const
694 {
return i[diff].size(); }
769 template <
class VECTOR>
786 template <
class ITERATOR>
797 template <
class V,
class ITERATOR>
800 (*i)[idx] = detail::RequiresExplicitCast<component_type>::cast(value);
806 template <
class ITERATOR,
class DIFFERENCE>
817 template <
class V,
class ITERATOR,
class DIFFERENCE>
819 setComponent(V
const & value, ITERATOR
const & i, DIFFERENCE
const & diff,
int idx)
const
821 i[diff][idx] = detail::RequiresExplicitCast<component_type>::cast(value);
869 template <
class Iter1,
class Acc1,
class Iter2,
class Acc2>
876 typedef pair<typename Acc1::value_type, typename Acc2::value_type>
882 : i1_(i1), a1_(a1), i2_(i2), a2_(a2)
887 template <
class DIFFERENCE>
890 return std::make_pair(a1_(i1_, d), a2_(i2_, d));
895 template <
class DIFFERENCE1,
class DIFFERENCE2>
899 return std::make_pair(a1_(i1_, d1), a2_(i2_, d1));
912 struct AccessorTraits
914 typedef StandardAccessor<T> default_accessor;
915 typedef StandardConstAccessor<T> default_const_accessor;
918 #define VIGRA_DEFINE_ACCESSOR_TRAITS(VALUE, ACCESSOR, CONST_ACCESSOR) \
920 struct AccessorTraits<VALUE > \
922 typedef ACCESSOR<VALUE > default_accessor; \
923 typedef CONST_ACCESSOR<VALUE > default_const_accessor; \
926 VIGRA_DEFINE_ACCESSOR_TRAITS(
signed char, StandardValueAccessor, StandardConstValueAccessor)
927 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned char, StandardValueAccessor, StandardConstValueAccessor)
928 VIGRA_DEFINE_ACCESSOR_TRAITS(
short, StandardValueAccessor, StandardConstValueAccessor)
929 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned short, StandardValueAccessor, StandardConstValueAccessor)
930 VIGRA_DEFINE_ACCESSOR_TRAITS(
int, StandardValueAccessor, StandardConstValueAccessor)
931 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned int, StandardValueAccessor, StandardConstValueAccessor)
932 VIGRA_DEFINE_ACCESSOR_TRAITS(
long, StandardValueAccessor, StandardConstValueAccessor)
933 VIGRA_DEFINE_ACCESSOR_TRAITS(
unsigned long, StandardValueAccessor, StandardConstValueAccessor)
934 VIGRA_DEFINE_ACCESSOR_TRAITS(
float, StandardValueAccessor, StandardConstValueAccessor)
935 VIGRA_DEFINE_ACCESSOR_TRAITS(
double, StandardValueAccessor, StandardConstValueAccessor)
937 template <class T,
unsigned int RED_IDX,
unsigned int GREEN_IDX,
unsigned int BLUE_IDX> class
RGBValue;
941 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
943 template <
class T,
unsigned int RED_IDX,
unsigned int GREEN_IDX,
unsigned int BLUE_IDX>
944 struct AccessorTraits<RGBValue<T, RED_IDX, GREEN_IDX, BLUE_IDX> >
950 template <
class T,
int SIZE>
951 struct AccessorTraits<TinyVector<T, SIZE> >
957 #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION
959 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<unsigned char>, RGBAccessor, RGBAccessor)
960 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
signed char>, RGBAccessor, RGBAccessor)
961 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
short>, RGBAccessor, RGBAccessor)
962 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned short>, RGBAccessor, RGBAccessor)
963 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
int>, RGBAccessor, RGBAccessor)
964 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned int>, RGBAccessor, RGBAccessor)
965 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
long>, RGBAccessor, RGBAccessor)
966 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
unsigned long>, RGBAccessor, RGBAccessor)
967 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
float>, RGBAccessor, RGBAccessor)
968 VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue<
double>, RGBAccessor, RGBAccessor)
970 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 2>
971 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
972 #undef VIGRA_PIXELTYPE
973 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 3>
974 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
975 #undef VIGRA_PIXELTYPE
976 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 4>
977 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
978 #undef VIGRA_PIXELTYPE
979 #define VIGRA_PIXELTYPE TinyVector<short, 2>
980 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
981 #undef VIGRA_PIXELTYPE
982 #define VIGRA_PIXELTYPE TinyVector<short, 3>
983 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
984 #undef VIGRA_PIXELTYPE
985 #define VIGRA_PIXELTYPE TinyVector<short, 4>
986 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
987 #undef VIGRA_PIXELTYPE
988 #define VIGRA_PIXELTYPE TinyVector<int, 2>
989 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
990 #undef VIGRA_PIXELTYPE
991 #define VIGRA_PIXELTYPE TinyVector<int, 3>
992 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
993 #undef VIGRA_PIXELTYPE
994 #define VIGRA_PIXELTYPE TinyVector<int, 4>
995 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
996 #undef VIGRA_PIXELTYPE
997 #define VIGRA_PIXELTYPE TinyVector<float, 2>
998 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
999 #undef VIGRA_PIXELTYPE
1000 #define VIGRA_PIXELTYPE TinyVector<float, 3>
1001 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1002 #undef VIGRA_PIXELTYPE
1003 #define VIGRA_PIXELTYPE TinyVector<float, 4>
1004 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1005 #undef VIGRA_PIXELTYPE
1006 #define VIGRA_PIXELTYPE TinyVector<double, 2>
1007 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1008 #undef VIGRA_PIXELTYPE
1009 #define VIGRA_PIXELTYPE TinyVector<double, 3>
1010 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1011 #undef VIGRA_PIXELTYPE
1012 #define VIGRA_PIXELTYPE TinyVector<double, 4>
1013 VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor)
1014 #undef VIGRA_PIXELTYPE
1016 #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION
1018 #undef VIGRA_DEFINE_ACCESSOR_TRAITS
1022 #endif // VIGRA_ACCESSOR_HXX