00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_CORE_SITE_SET_P_MUTABLE_ARRAY_OF_HH
00027 # define MLN_CORE_SITE_SET_P_MUTABLE_ARRAY_OF_HH
00028
00041 # include <mln/core/site_set/p_double.hh>
00042 # include <mln/core/internal/site_set_base.hh>
00043 # include <mln/util/array.hh>
00044
00045
00046
00047 namespace mln
00048 {
00049
00050
00051 template <typename S> class p_mutable_array_of;
00052
00053
00054 namespace trait
00055 {
00056
00057 template <typename S>
00058 struct site_set_< p_mutable_array_of<S> >
00059 {
00060 typedef trait::site_set::nsites::unknown nsites;
00061 typedef trait::site_set::bbox::unknown bbox;
00062 typedef trait::site_set::contents::growing contents;
00063 typedef trait::site_set::arity::multiple arity;
00064 };
00065
00066 }
00067
00068
00069
00075 template <typename S>
00076 class p_mutable_array_of : public internal::site_set_base_< mln_site(S),
00077 p_mutable_array_of<S> >,
00078 private mlc_is_a(S, Site_Set)::check_t
00079 {
00080 typedef p_mutable_array_of<S> self_;
00081 typedef util::array<S> array_;
00082 public:
00083
00085 typedef S element;
00086
00087
00089 typedef p_double_psite<self_, element> psite;
00090
00092 typedef p_double_piter<self_,
00093 mln_fwd_eiter(array_),
00094 mln_fwd_piter(S)> fwd_piter;
00095
00097 typedef p_double_piter<self_,
00098 mln_bkd_eiter(array_),
00099 mln_bkd_piter(S)> bkd_piter;
00100
00102 typedef fwd_piter piter;
00103
00104
00106 p_mutable_array_of();
00107
00108
00110 void reserve(unsigned n);
00111
00112
00114 bool has(const psite& p) const;
00115
00117 bool is_valid() const;
00118
00119
00121 typedef S i_element;
00122
00125 void insert(const S& s);
00126
00127
00129 const S& operator[](unsigned i) const;
00130
00132 S& operator[](unsigned i);
00133
00135 unsigned nelements() const;
00136
00137
00139 void clear();
00140
00142 bool is_empty_() const;
00143
00144
00146 std::size_t memory_size() const;
00147
00149 const util::array<S>& array_hook_() const;
00150
00151
00152
00153 const util::array<S>& set_1_() const;
00154 template <typename I>
00155 const S& set_2_(const I& it) const;
00156
00157 protected:
00158
00160 util::array<S> arr_;
00161 };
00162
00163
00164
00165 template <typename S>
00166 std::ostream& operator<<(std::ostream& ostr, const p_mutable_array_of<S>& r);
00167
00168
00169
00170
00171 # ifndef MLN_INCLUDE_ONLY
00172
00173 template <typename S>
00174 inline
00175 p_mutable_array_of<S>::p_mutable_array_of()
00176 {
00177 }
00178
00179 template <typename S>
00180 inline
00181 void
00182 p_mutable_array_of<S>::reserve(unsigned n)
00183 {
00184 arr_.reserve(n);
00185 }
00186
00187 template <typename S>
00188 inline
00189 bool
00190 p_mutable_array_of<S>::has(const psite& p) const
00191 {
00192 return p.index() < arr_.nelements() && arr_[p.index()].has(p.p());
00193 }
00194
00195 template <typename S>
00196 inline
00197 bool
00198 p_mutable_array_of<S>::is_valid() const
00199 {
00200 return true;
00201 }
00202
00203 template <typename S>
00204 inline
00205 void
00206 p_mutable_array_of<S>::insert(const S& s)
00207 {
00208 mln_precondition(s.is_valid());
00209 arr_.append(s);
00210 }
00211
00212 template <typename S>
00213 inline
00214 const S&
00215 p_mutable_array_of<S>::operator[](unsigned i) const
00216 {
00217 mln_precondition(i < arr_.nelements());
00218 return arr_[i];
00219 }
00220
00221 template <typename S>
00222 inline
00223 S&
00224 p_mutable_array_of<S>::operator[](unsigned i)
00225 {
00226 mln_precondition(i < arr_.nelements());
00227 return arr_[i];
00228 }
00229
00230 template <typename S>
00231 inline
00232 unsigned
00233 p_mutable_array_of<S>::nelements() const
00234 {
00235 return arr_.nelements();
00236 }
00237
00238 template <typename S>
00239 inline
00240 void
00241 p_mutable_array_of<S>::clear()
00242 {
00243 arr_.clear();
00244 mln_postcondition(this->is_empty());
00245 }
00246
00247 template <typename S>
00248 inline
00249 bool
00250 p_mutable_array_of<S>::is_empty_() const
00251 {
00252 return arr_.is_empty();
00253 }
00254
00255 template <typename S>
00256 inline
00257 std::size_t
00258 p_mutable_array_of<S>::memory_size() const
00259 {
00260 return arr_.memory_size();
00261 }
00262
00263 template <typename S>
00264 inline
00265 const util::array<S>&
00266 p_mutable_array_of<S>::array_hook_() const
00267 {
00268 return arr_;
00269 }
00270
00271 template <typename S>
00272 inline
00273 const util::array<S>&
00274 p_mutable_array_of<S>::set_1_() const
00275 {
00276 return arr_;
00277 }
00278
00279 template <typename S>
00280 template <typename I>
00281 inline
00282 const S&
00283 p_mutable_array_of<S>::set_2_(const I& it) const
00284 {
00285 return it.element();
00286 }
00287
00288
00289 template <typename S>
00290 std::ostream& operator<<(std::ostream& ostr, const p_mutable_array_of<S>& a)
00291 {
00292 return ostr << a.array_hook_();
00293 }
00294
00295 # endif // ! MLN_INCLUDE_ONLY
00296
00297 }
00298
00299
00300 #endif // ! MLN_CORE_SITE_SET_P_MUTABLE_ARRAY_OF_HH