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_UTIL_MULTI_SITE_HH
00027 # define MLN_UTIL_MULTI_SITE_HH
00028
00031
00032 # include <cstddef>
00033
00034 # include <vector>
00035
00036 # include <mln/core/concept/object.hh>
00037
00038 namespace mln
00039 {
00040
00041 namespace util
00042 {
00043
00044 template <typename P>
00045 struct multi_site : public mln::Object< multi_site<P> >
00046 {
00047
00048 typedef P location;
00049
00050
00051 typedef mln_coord(P) coord;
00052
00053 typedef std::vector<P> container;
00054 typedef typename container::size_type size_type;
00055 typedef typename container::reference reference;
00056 typedef typename container::const_reference const_reference;
00057
00060 void push_back(const P& p);
00061
00062 void reserve(size_type n);
00063
00064 size_type size() const;
00065
00066 reference operator[](size_type n);
00067 const_reference operator[](size_type n) const;
00068
00069 const_reference front() const;
00070 reference front();
00072
00073 container sites;
00074 };
00075
00076
00077
00078
00079 template <typename P>
00080 bool
00081 operator==(const multi_site<P>& lhs, const multi_site<P>& rhs);
00082
00083
00084
00085 # ifndef MLN_INCLUDE_ONLY
00086
00087 template <typename P>
00088 void
00089 multi_site<P>::push_back(const P& p)
00090 {
00091 sites.push_back(p);
00092 }
00093
00094 template <typename P>
00095 void
00096 multi_site<P>::reserve(size_type n)
00097 {
00098 sites.reserve(n);
00099 }
00100
00101 template <typename P>
00102 typename multi_site<P>::size_type
00103 multi_site<P>::size() const
00104 {
00105 return sites.size();
00106 }
00107
00108 template <typename P>
00109 typename multi_site<P>::reference
00110 multi_site<P>::operator[](size_type n)
00111 {
00112 return sites[n];
00113 }
00114
00115 template <typename P>
00116 typename multi_site<P>::const_reference
00117 multi_site<P>::operator[](size_type n) const
00118 {
00119 return sites[n];
00120 }
00121
00122 template <typename P>
00123 typename multi_site<P>::const_reference
00124 multi_site<P>::front() const
00125 {
00126 mln_precondition(!sites.empty());
00127 return sites[0];
00128 }
00129
00130 template <typename P>
00131 typename multi_site<P>::reference
00132 multi_site<P>::front()
00133 {
00134 mln_precondition(!sites.empty());
00135 return sites[0];
00136 }
00137
00138
00139 template <typename P>
00140 bool
00141 operator==(const multi_site<P>& lhs, const multi_site<P>& rhs)
00142 {
00143 return lhs.sites == rhs.sites;
00144 }
00145
00146 # endif // ! MLN_INCLUDE_ONLY
00147
00148 }
00149
00150 }
00151
00152
00153 #endif // ! MLN_UTIL_MULTI_SITE_HH