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_VECTOR
00008 #define INSTIGATE_STL_VECTOR
00009
00056
00057 #include "concept.hpp"
00058
00059
00060 #include <generic/_assignable.hpp>
00061 #include <generic/_default_constructible.hpp>
00062
00063
00064 #include <cassert>
00065
00066
00067 namespace instigate {
00068 namespace stl {
00076 namespace vector {
00077 template<typename T>
00078 struct interface;
00079 template<typename T>
00080 struct requirements;
00081 }
00082 }
00083 }
00084
00097 template <typename T>
00098 struct instigate::stl::vector::interface
00099 : instigate::generic::assignable::interface<T>
00100 , instigate::generic::default_constructible::interface<T>
00101 {
00103 typedef typename T::size_type size_type;
00104
00106 typedef typename T::value_type value_type;
00107
00117 static size_type get_size(const T& x)
00118 {
00119 return x.size();
00120 }
00121
00129 static value_type get_element(const T& x, const size_type& i)
00130 {
00131 assert(i < get_size(x));
00132 return x[i];
00133 }
00134
00142 static void set_element(T& x,
00143 const size_type& i,
00144 const value_type& v)
00145 {
00146 assert(i < get_size(x));
00147 x[i] = v;
00148 }
00149
00156 static void construct(T& x, const size_type& i)
00157 {
00158 x.resize(i);
00159 }
00160 };
00161
00162
00170 template <typename T>
00171 struct instigate::stl::vector::requirements
00172 {
00173 private:
00178 void require_get_size(const T& x)
00179 {
00180 typedef instigate::stl::vector::interface<T> I;
00181 typedef typename I::size_type S;
00182 S s = I::get_size(x);
00183 }
00184
00189 void require_get_element(const T& x,
00190 const typename instigate::stl::
00191 vector:: interface<T>::size_type& i)
00192 {
00193 typedef instigate::stl::vector::interface<T> I;
00194 typedef typename instigate::stl::vector::
00195 interface<T>::value_type V;
00196 V v = I::get_element(x, i);
00197 }
00198
00203 void require_set_element(T& x,
00204 const typename instigate::stl::
00205 vector:: interface<T>::size_type& i,
00206 const typename instigate::stl::
00207 vector:: interface<T>::value_type& v)
00208 {
00209 typedef instigate::stl::vector::interface<T> I;
00210 I::set_element(x, i, v);
00211 }
00212
00214 public:
00220 requirements()
00221 {
00222 (void)require_get_size;
00223 (void)require_get_element;
00224 (void)require_set_element;
00225 }
00226
00228 private:
00230 requirements(const requirements&) throw();
00231
00233 requirements& operator=(const requirements&) throw();
00234
00235
00236 };
00237
00238
00239
00240 #endif // INSTIGATE_STL_VECTOR
00241