30 #ifndef BZ_TRAVERSAL_H
31 #define BZ_TRAVERSAL_H
45 template<
int N_dimensions>
46 class TraversalOrder {
57 TraversalOrder(
const T_coord& size, T_traversal& order)
58 : size_(size), order_(order)
61 TraversalOrder(
const T_coord& size)
65 T_coord operator[](
int i)
const
68 T_coord& operator[](
int i)
72 {
return order_.length(); }
74 bool operator<(const TraversalOrder<N_dimensions>& x)
const
76 for (
int i=0;
i < N_dimensions; ++
i)
78 if (size_[
i] < x.size_[
i])
80 else if (size_[
i] > x.size_[
i])
86 bool operator==(
const TraversalOrder<N_dimensions>& x)
const
88 for (
int i=0;
i < N_dimensions; ++
i)
90 if (size_[
i] != x.size_[
i])
107 class TraversalOrder<0> {
112 template<
int N_dimensions>
113 class TraversalOrderCollection {
115 typedef TraversalOrder<N_dimensions> T_traversal;
117 typedef set<T_traversal> T_set;
118 typedef _bz_typename set<T_traversal>::const_iterator T_iterator;
120 const T_traversal*
find(
const T_coord& size)
122 T_iterator iter = traversals_.find(T_traversal(size));
123 if (iter != traversals_.end())
128 void insert(T_traversal x)
130 traversals_.insert(x);
134 static T_set traversals_;
137 template<
int N_dimensions>
138 _bz_typename TraversalOrderCollection<N_dimensions>::T_set
139 TraversalOrderCollection<N_dimensions>::traversals_;
147 class TraversalOrderCollection<0> {
149 typedef int T_traversal;
152 typedef int T_iterator;
154 const T_traversal*
find(
const T_coord& size)
160 #include <blitz/traversal.cc>
162 #endif // BZ_TRAVERSAL_H
164 #endif // BZ_HAVE_STD