00001 #if !defined(____________animal_container_traits_h_____________)
00002 #define ____________animal_container_traits_h_____________ 1
00003
00004
00005
00006 #include <vector>
00007
00008
00009
00010 namespace animal
00011 {
00012
00013
00014
00016 template <typename Cont>
00017 struct container_traits
00018 {
00019 typedef typename Cont::iterator iterator;
00020 typedef iterator iter_type;
00021 typedef typename Cont::size_type size_type;
00022 typedef typename Cont::value_type value_type;
00023 typedef typename Cont::reference reference;
00024
00026 static iterator begin(Cont &cont) { return cont.begin(); }
00028 static iterator end(Cont &cont) { return cont.end(); }
00030 static size_type size(Cont &cont) { return cont.size(); }
00031 };
00032
00033
00034
00036 template <typename Cont>
00037 struct container_traits<Cont const>
00038 {
00039 typedef typename Cont::const_iterator iterator;
00040 typedef iterator iter_type;
00041 typedef typename Cont::size_type size_type;
00042 typedef typename Cont::value_type value_type;
00043 typedef typename Cont::const_reference reference;
00044
00046 static iterator begin(Cont const &cont) { return cont.begin(); }
00048 static iterator end(Cont const &cont) { return cont.end(); }
00050 static size_type size(Cont const &cont) { return cont.size(); }
00051 };
00052
00053
00054
00056 template <typename T, std::size_t sz>
00057 struct container_traits<T[sz]>
00058 {
00059 typedef T* iterator;
00060 typedef iterator iter_type;
00061 typedef T value_type;
00062 typedef value_type& reference;
00063 typedef std::size_t size_type;
00064
00066 static iterator begin(T (&array)[sz]) { return array; }
00068 static iterator end(T (&array)[sz]) { return array + sz; }
00070 static size_type size(T (&)[sz]) { return sz; }
00071 };
00072
00073
00074
00076 template <typename T, std::size_t sz>
00077 struct container_traits<T const[sz]>
00078 {
00079 typedef T const* iterator;
00080 typedef iterator iter_type;
00081 typedef std::size_t size_type;
00082 typedef T const value_type;
00083 typedef value_type& reference;
00084
00086 static iterator begin(T const (&array)[sz]) { return array; }
00088 static iterator end(T const (&array)[sz]) { return array + sz; }
00090 static size_type size(T const (&array)[sz]) { return sz; }
00091 };
00092
00093
00094
00095
00096
00097
00098
00100 template <typename Cont>
00101 inline typename container_traits<Cont>::iterator
00102 begin(Cont &cont) { return container_traits<Cont>::begin(cont); }
00103
00105 template <typename Cont>
00106 inline typename container_traits<Cont>::iterator
00107 end(Cont &cont) { return container_traits<Cont>::end(cont); }
00108
00110 template <typename Cont>
00111 inline typename container_traits<Cont>::size_type
00112 size(Cont &cont) { return container_traits<Cont>::size(cont); }
00113
00114
00115
00116
00118 template <typename T, std::size_t sz>
00119 inline typename container_traits<T[sz]>::iterator
00120 begin(T (&a)[sz]) { return container_traits<T[sz]>::begin(a); }
00121
00123 template <typename T, std::size_t sz>
00124 inline typename container_traits<T[sz]>::iterator
00125 end(T (&a)[sz]) { return container_traits<T[sz]>::end(a); }
00126
00128 template <typename T, std::size_t sz>
00129 inline typename container_traits<T[sz]>::size_type
00130 size(T (&a)[sz]) { return container_traits<T[sz]>::size(a); }
00131
00132
00133
00134
00135 #ifdef __EDG__
00136 template <typename T>
00137 struct container_traits<T*>
00138 {
00139 typedef T* iterator;
00140 typedef iterator iter_type;
00141 typedef std::size_t size_type;
00142 };
00143 #endif
00144
00145
00146 #ifdef __GNUG__
00147
00148 template <typename T, std::size_t sz>
00149 inline typename container_traits<T const[sz]>::iterator
00150 begin(T const(&a)[sz]) { return container_traits<T const[sz]>::begin(a); }
00151
00153 template <typename T, std::size_t sz>
00154 inline typename container_traits<T const[sz]>::iterator
00155 end(T const(&a)[sz]) { return container_traits<T const[sz]>::end(a); }
00156
00158 template <typename T, std::size_t sz>
00159 inline typename container_traits<T const[sz]>::size_type
00160 size(T const (&a)[sz]) { return container_traits<T const[sz]>::size(a); }
00161 #endif
00162
00163
00164
00165
00166
00167 template< typename T >
00168 struct value_type {
00169 typedef typename T::value_type type;
00170 } ;
00171
00172
00173
00174 }
00175
00176
00177
00178 #endif