00001
00011 #ifndef BS_RR_RW_WR_SAVER_H_
00012 #define BS_RR_RW_WR_SAVER_H_
00013
00014 #include "facility_manager.h"
00015
00016
00017 namespace blue_sky
00018 {
00019 namespace tools
00020 {
00021
00022 template <typename strategy_t, typename array_type, typename accessor_t>
00023 struct rr_rw_wr_saver
00024 {
00025 typedef typename strategy_t::item_t item_t;
00026 typedef typename strategy_t::index_t index_t;
00027 typedef facility_manager <strategy_t> facility_manager_t;
00028 typedef wells::connection <strategy_t> connection_t;
00029 typedef typename facility_manager_t::well_iterator_t well_iterator_t;
00030 typedef item_t value_type;
00031 typedef array_type array_t;
00032
00033 typedef smart_ptr <connection_t, true> sp_connection_t;
00034
00035 rr_rw_wr_saver (well_iterator_t wb, well_iterator_t we, size_t connection_count)
00036 : wb_ (wb)
00037 , we_ (we)
00038 , array_size_ (array_t::static_size)
00039 , total_connection_count_ (connection_count)
00040 , accessor_ (accessor_t ())
00041 , current_connection_ (0)
00042 , current_connection_count_ (wb == we ? 0 : (*wb)->get_connection_list ().size ())
00043 , current_item_ (0)
00044 , total_item_ (0)
00045 {
00046 }
00047
00048 size_t
00049 size () const
00050 {
00051 return array_size_ * total_connection_count_;
00052 }
00053
00054 value_type
00055 operator [] (size_t i) const
00056 {
00057 if (current_item_ >= array_size_)
00058 {
00059 current_item_ = 0;
00060 current_connection_ ++;
00061 }
00062
00063 if (current_connection_ >= current_connection_count_)
00064 {
00065 if (wb_ != we_)
00066 {
00067 ++wb_;
00068 if (wb_ != we_)
00069 {
00070 current_connection_ = 0;
00071 current_connection_count_ = (*wb_)->get_connection_list ().size ();
00072 }
00073 }
00074 }
00075
00076 total_item_++;
00077 BS_ASSERT (total_item_ <= size ()) (total_item_) (size ());
00078 return accessor_ ((*wb_)->get_connection_list ()[current_connection_], current_item_++);
00079 }
00080
00081 mutable well_iterator_t wb_;
00082 well_iterator_t we_;
00083 size_t array_size_;
00084 size_t total_connection_count_;
00085 accessor_t accessor_;
00086
00087 mutable size_t current_connection_;
00088 mutable size_t current_connection_count_;
00089 mutable size_t current_item_;
00090 mutable size_t total_item_;
00091 };
00092
00093 template <typename strategy_t, typename accessor_t>
00094 struct connection_member_saver
00095 {
00096 typedef typename strategy_t::item_t item_t;
00097 typedef typename strategy_t::index_t index_t;
00098
00099 typedef facility_manager <strategy_t> facility_manager_t;
00100 typedef wells::connection <strategy_t> connection_t;
00101 typedef typename facility_manager_t::well_iterator_t well_iterator_t;
00102
00103 typedef item_t value_type;
00104
00105 typedef smart_ptr <connection_t, true> sp_connection_t;
00106
00107 connection_member_saver (well_iterator_t wb, well_iterator_t we, size_t array_size)
00108 : wb_ (wb)
00109 , we_ (we)
00110 , array_size_ (array_size)
00111 , accessor_ (accessor_t ())
00112 , current_connection_ (0)
00113 , current_connection_count_ (wb == we ? 0 : (*wb)->get_connection_list ().size ())
00114 , last_value_ (0)
00115 {
00116 }
00117
00118 size_t
00119 size () const
00120 {
00121 return array_size_;
00122 }
00123
00124 value_type
00125 operator[] (size_t i) const
00126 {
00127 if (wb_ == we_)
00128 {
00129 BS_ASSERT (wb_ != we_);
00130 return last_value_;
00131 }
00132
00133 if (current_connection_ >= current_connection_count_)
00134 {
00135 ++wb_;
00136 if (wb_ != we_)
00137 {
00138 current_connection_ = 0;
00139 current_connection_count_ = (*wb_)->get_connection_list ().size ();
00140 }
00141 }
00142
00143 if (wb_ == we_)
00144 {
00145 BS_ASSERT (wb_ != we_);
00146 return last_value_;
00147 }
00148
00149 last_value_ = accessor_ ((*wb_)->get_connection_list ()[current_connection_++]);
00150 return last_value_;
00151 }
00152
00153 mutable well_iterator_t wb_;
00154 well_iterator_t we_;
00155 size_t array_size_;
00156 accessor_t accessor_;
00157
00158 mutable size_t current_connection_;
00159 mutable size_t current_connection_count_;
00160 mutable item_t last_value_;
00161 };
00162
00163 template <typename strategy_t, typename function_t>
00164 struct well_member_saver
00165 {
00166 typedef typename strategy_t::item_t item_t;
00167 typedef facility_manager <strategy_t> facility_manager_t;
00168 typedef typename facility_manager_t::well_iterator_t well_iterator_t;
00169
00170 typedef item_t value_type;
00171 typedef well <strategy_t> well_t;
00172
00173
00174
00175 typedef function_t accessor_t;
00176
00177 well_member_saver (well_iterator_t wb, well_iterator_t we)
00178 : wb_ (wb)
00179 , we_ (we)
00180 , accessor_ (accessor_t ())
00181 , last_value_ (0)
00182 {
00183 }
00184
00185 size_t
00186 size () const
00187 {
00188 return std::distance (wb_, we_);
00189 }
00190
00191 value_type
00192 operator[] (size_t i) const
00193 {
00194 if (wb_ == we_)
00195 {
00196 BS_ASSERT (wb_ != we_);
00197 return last_value_;
00198 }
00199
00200 last_value_ = accessor_ (*wb_);
00201 ++wb_;
00202 return last_value_;
00203 }
00204
00205 mutable well_iterator_t wb_;
00206 well_iterator_t we_;
00207 accessor_t accessor_;
00208 mutable item_t last_value_;
00209 };
00210
00211 }
00212 }
00213
00214
00215
00216 #endif // #ifndef BS_RR_RW_WR_SAVER_H_
00217