00001
00002 #ifndef _INSTIGATE_OPEN_SOURCE_INTERNAL_HEADER_IN_CONCEPT
00003 #error This is an internal header file used to implement Instigate STL.\
00004 It should never be included directly by a program.
00005 #endif
00006
00007 #ifndef INSTIGATE_STL_RANDOM_ACCESS_ITERATOR_HPP
00008 #define INSTIGATE_STL_RANDOM_ACCESS_ITERATOR_HPP
00009
00059
00060 #include "_bidirectional_iterator.hpp"
00061 #include "iterator_interface.hpp"
00062
00063
00064 #include <generic/base.hpp>
00065 #include <generic/_less_than_comparable.hpp>
00066
00067
00068 #include <iterator>
00069
00070
00071 namespace instigate {
00072 namespace stl {
00094 namespace random_access_iterator {
00095 struct tag;
00096 template <typename T> struct interface;
00097 template <typename T> struct requirements;
00098
00099 }
00100 }
00101 }
00102
00103
00110 struct instigate::stl::random_access_iterator::tag
00111 : instigate::stl::bidirectional_iterator::tag
00112 , instigate::generic::less_than_comparable::tag
00113 {
00114 };
00115
00121 template <typename T>
00122 struct instigate::stl::random_access_iterator::interface
00123 : instigate::stl::bidirectional_iterator::interface<T>
00124 , instigate::generic::less_than_comparable::interface<T>
00125 {
00127 typedef typename instigate::stl::interface<T>::difference_type
00128 difference_type;
00129
00131 static void advance(T& a, const difference_type& n)
00132 {
00133 instigate::stl::interface<T>::advance(a, n);
00134 }
00136 static difference_type distance(const T& a, const T& b)
00137 {
00138 return instigate::stl::interface<T>::distance(a, b);
00139 }
00140 };
00141
00150 template <typename T>
00151 struct instigate::stl::random_access_iterator::requirements
00152 : instigate::stl::bidirectional_iterator::requirements<T>
00153 , instigate::generic::less_than_comparable::requirements<T>
00154 {
00155
00160 typedef typename instigate::stl::random_access_iterator::interface<T>
00161 ::difference_type difference_type;
00166 static void require_distance(T& a , T& b)
00167 {
00168 instigate::stl::random_access_iterator::interface<T>
00169 ::distance(a, b);
00170 }
00171
00176 static void require_advance(T& a , difference_type n)
00177 {
00178 instigate::stl::random_access_iterator::interface<T>
00179 ::advance(a, n);
00180 }
00181
00183 public:
00190 requirements()
00191 {
00192 (void)require_advance;
00193 (void)require_distance;
00194 }
00195 };
00196
00197
00198
00199 #endif