00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CVD_BUILTIN_TRAITS_H_
00022 #define CVD_BUILTIN_TRAITS_H_
00023
00024 #include <limits>
00025 #include <cstddef>
00026
00027 #if defined (CVD_HAVE_TOON)
00028 #include <TooN/TooN.h>
00029 #endif
00030
00031
00032
00033
00034 namespace CVD
00035 {
00036 namespace Pixel
00037 {
00038
00039
00040
00041
00042
00043
00044
00045 template<class P, int spp> struct component_base {
00046 template<bool x> struct component_base_only_for_basic_types;
00047 static const int fail = sizeof(component_base_only_for_basic_types<false>);
00048 };
00049
00050 template<class P> struct component_base<P, 1>
00051 {
00052 };
00053
00054
00055
00056 template<class P> struct Component
00057 {
00058 typedef P type;
00059 static const size_t count = 1;
00060
00061 static const P& get(const P& pixel, size_t)
00062 {
00063 return pixel;
00064 }
00065
00066 static P& get(P& pixel, size_t)
00067 {
00068 return pixel;
00069 }
00070
00071 };
00072
00073 template<class P, int I> struct Component<P[I]>
00074 {
00075 typedef P type;
00076 static const size_t count=I;
00077
00078 static const P& get(const P pixel[I], size_t i)
00079 {
00080 return pixel[i];
00081 }
00082
00083 static inline P& get(P pixel[I], size_t i)
00084 {
00085 return pixel[i];
00086 }
00087 };
00088
00089 #if defined (CVD_HAVE_TOON)
00090 template<int N> struct Component<TooN::Vector<N> >
00091 {
00092 typedef double type;
00093 static const size_t count=N;
00094
00095 static const type& get(const TooN::Vector<N>& pixel, size_t i)
00096 {
00097 return pixel[i];
00098 }
00099
00100 static inline type& get(TooN::Vector<N>& pixel, size_t i)
00101 {
00102 return pixel[i];
00103 }
00104 };
00105
00106 template<int N, int M> struct Component<TooN::Matrix<N,M> >
00107 {
00108 typedef double type;
00109 static const size_t count=N*M;
00110
00111 static const type& get(const TooN::Matrix<N,M>& pixel, size_t i)
00112 {
00113 return pixel[i/M][i%M];
00114 }
00115
00116 static inline type& get(TooN::Matrix<N,M>& pixel, size_t i)
00117 {
00118 return pixel[i/M][i%M];
00119 }
00120 };
00121 #endif
00122
00123 }
00124 }
00125
00126 #endif