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_LVALUE_ITERATOR_HPP 00008 #define INSTIGATE_STL_LVALUE_ITERATOR_HPP 00009 00059 // Headers from this project 00060 #include "iterator_interface.hpp" 00061 00062 // Headers from other projects 00063 #include <generic/_assignable.hpp> 00064 00065 // Headers from standard library 00066 #include <iterator> 00067 00068 // Forward declarations 00069 namespace instigate { 00070 namespace stl { 00089 namespace lvalue_iterator { 00090 struct tag; 00091 template<typename T> struct interface; 00092 template<typename T> struct requirements; 00093 } 00094 } 00095 } 00096 00103 struct instigate::stl::lvalue_iterator::tag 00104 : instigate::generic::assignable::tag 00105 { 00106 }; 00107 00112 template <typename T> 00113 struct instigate::stl::lvalue_iterator::interface 00114 : instigate::generic::assignable::interface<T> 00115 { 00117 typedef typename instigate::stl::interface<T>::value_type value_type; 00118 00127 static value_type& dereference(const T& a) 00128 { 00129 return instigate::stl::interface<T>::dereference(a); 00130 } 00131 }; 00132 00137 template <typename T> 00138 struct instigate::stl::lvalue_iterator::requirements 00139 : instigate::generic::assignable::requirements<T> 00140 { 00145 static void require_nested_typename_value_type() 00146 { 00147 typedef typename instigate::stl::lvalue_iterator::interface<T> 00148 ::value_type value_type; 00149 } 00150 00155 static void require_dereference(const T& a) 00156 { 00157 instigate::stl::lvalue_iterator::interface<T>::dereference(a); 00158 } 00159 00166 requirements() 00167 { 00168 (void)&require_nested_typename_value_type; 00169 (void)&require_dereference; 00170 } 00171 }; 00172 00173 //vim:et:tabstop=8:shiftwidth=8:cindent:fo=croq:textwidth=80: 00174 00175 #endif // INSTIGATE_STL_LVALUE_ITERATOR_HPP