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_WRITABLE_ITERATOR_HPP 00008 #define INSTIGATE_STL_WRITABLE_ITERATOR_HPP 00009 00059 // Headers from this project 00060 #include "iterator_interface.hpp" 00061 00062 // Headers from other project 00063 #include <generic/base.hpp> 00064 #include <generic/_assignable.hpp> 00065 00066 // Headers from standard library 00067 #include <iterator> 00068 00069 // Forward declarations 00070 namespace instigate { 00071 namespace stl { 00080 namespace writable_iterator { 00081 struct tag; 00082 template <typename T> 00083 struct interface; 00084 template <typename T> 00085 struct interface<std::ostream_iterator<T> >; 00086 template <typename T> 00087 struct requirements; 00088 } 00089 } 00090 } 00091 00098 struct instigate::stl::writable_iterator::tag 00099 : instigate::generic::assignable::tag 00100 { 00101 }; 00102 00107 template <typename T> 00108 struct instigate::stl::writable_iterator::interface 00109 : instigate::generic::assignable::interface<T> 00110 { 00112 typedef typename instigate::stl::interface<T>::value_type value_type; 00113 00120 static void dereference_assign(T a, const value_type& b) 00121 { 00122 instigate::stl::interface<T>::dereference_assign(a, b); 00123 } 00124 }; 00125 00127 template<typename T> 00128 struct instigate::stl::writable_iterator::interface<std::ostream_iterator<T> > 00129 : instigate::generic::assignable::interface<std::ostream_iterator<T> > 00130 { 00132 typedef typename instigate::stl::interface<std::ostream_iterator<T> >:: 00133 value_type value_type; 00134 00141 static void dereference_assign(std::ostream_iterator<T> a, 00142 const value_type& b) 00143 { 00144 instigate::stl::interface<std::ostream_iterator<T> >:: 00145 dereference_assign(a, b); 00146 } 00147 }; 00148 00156 template<typename T> 00157 struct instigate::stl::writable_iterator::requirements 00158 : instigate::generic::assignable::requirements<T> 00159 { 00161 typedef typename instigate::stl::writable_iterator::interface<T> 00162 ::value_type value_type; 00167 static void require_nested_typename_value_type() 00168 { 00169 typedef typename instigate::stl::writable_iterator:: 00170 interface<T>::value_type value_type; 00171 } 00172 00177 static void require_dereference_assign(T a, const value_type& b) 00178 { 00179 instigate::stl::writable_iterator::interface<T>:: 00180 dereference_assign(a, b); 00181 } 00182 00183 public: 00190 requirements() 00191 { 00192 (void)&require_nested_typename_value_type; 00193 (void)&require_dereference_assign; 00194 } 00195 }; 00196 00197 // vim:et:tabstop=8:shiftwidth=8:cindent:fo=croq:textwidth=80: 00198 00199 #endif // INSTIGATE_STL_WRITABLE_ITERATOR_HPP