00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_TOPO_INTER_PIXEL_INTERNAL_DIR_HH
00029 # define OLENA_TOPO_INTER_PIXEL_INTERNAL_DIR_HH
00030
00031 # include <oln/config/system.hh>
00032
00033 # include <iostream>
00034
00035 namespace oln {
00036
00037 namespace topo {
00038
00039 namespace inter_pixel {
00041 namespace internal {
00043 template<unsigned Dim>
00044 struct dir_traits
00045 {};
00047 template<>
00048 struct dir_traits<2>
00049 {
00051 typedef enum dir { east, north, west, south } ret;
00052
00054 static ret
00055 first()
00056 {
00057 return east;
00058 }
00059
00061 static ret
00062 last()
00063 {
00064 return south;
00065 }
00067 static ret
00068 prev(ret i)
00069 {
00070 return i == first() ? last() : ret(i - 1);
00071 }
00072
00074 static ret
00075 next(ret i)
00076 {
00077 return i == last() ? first() : ret(i + 1);
00078 }
00079
00084 static ret
00085 opposite(ret i)
00086 {
00087 return ret((i + 2) % 4);
00088 }
00089 };
00091 # define oln_dir_traits_type(ImgType) \
00092 oln::topo::inter_pixel::internal::dir_traits< ImgType::dim >
00093
00095 # define oln_dir_type(ImgType) \
00096 typename oln_dir_traits_type(ImgType)::ret
00097
00098 }
00099
00100 }
00101
00102 }
00103
00104 }
00105
00106 std::ostream & operator<<(std::ostream& o,
00107 oln::topo::inter_pixel::internal::dir_traits<2>::ret i)
00108 {
00109 typedef oln::topo::inter_pixel::internal::dir_traits<2> traits;
00110
00111 switch (i)
00112 {
00113 case traits::east: return o << "east";
00114 case traits::north: return o << "north";
00115 case traits::west: return o << "west";
00116 case traits::south: return o << "south";
00117 default: return o;
00118 }
00119 }
00120
00121 #endif // !OLENA_TOPO_INTER_PIXEL_INTERNAL_DIR_HH