00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_IMPLEMENTATION_LISTG_LISTG_SPARSE_INTERVAL_HXX
00018 # define VCSN_AUTOMATA_IMPLEMENTATION_LISTG_LISTG_SPARSE_INTERVAL_HXX
00019
00020 #include <vaucanson/misc/limits.hh>
00021
00022 namespace vcsn
00023 {
00024 namespace misc
00025 {
00026
00027
00028
00029
00030 template <class T, class ExcludedContainer>
00031 SparseIterator<handler<T, unsigned>, ExcludedContainer>::
00032 SparseIterator (integer_t from,
00033 const excluded_container_t& c)
00034 : excluded_ (&c),
00035 integer_ (from)
00036 {}
00037
00038 template <class T, class ExcludedContainer>
00039 SparseIterator<handler<T, unsigned>, ExcludedContainer>&
00040 SparseIterator<handler<T, unsigned>, ExcludedContainer>::operator++ ()
00041 {
00042 if (excluded_->size () == 0)
00043 ++integer_;
00044 else
00045 do
00046 ++integer_;
00047 while (excluded_->find (handler_t(integer_)) != excluded_->end ());
00048 return *this;
00049 }
00050
00051 template <class T, class ExcludedContainer>
00052 SparseIterator<handler<T, unsigned>, ExcludedContainer>&
00053 SparseIterator<handler<T, unsigned>, ExcludedContainer>::operator-- ()
00054 {
00055 if (excluded_->size () == 0)
00056 --integer_;
00057 else
00058 do
00059 --integer_;
00060 while (excluded_->find (handler_t(integer_)) != excluded_->end ());
00061 return *this;
00062 }
00063
00064 template <class T, class ExcludedContainer>
00065 SparseIterator<handler<T, unsigned>, ExcludedContainer>
00066 SparseIterator<handler<T, unsigned>, ExcludedContainer>::operator++ (int)
00067 {
00068 SparseIterator tmp = *this;
00069 ++*this;
00070 return tmp;
00071 }
00072
00073 template <class T, class ExcludedContainer>
00074 SparseIterator<handler<T, unsigned>, ExcludedContainer>
00075 SparseIterator<handler<T, unsigned>, ExcludedContainer>::operator-- (int)
00076 {
00077 SparseIterator tmp = *this;
00078 --*this;
00079 return tmp;
00080 }
00081
00082 template <class T, class ExcludedContainer>
00083 typename SparseIterator<handler<T, unsigned>, ExcludedContainer>::
00084 integer_t
00085 SparseIterator<handler<T, unsigned>, ExcludedContainer>::operator* ()
00086 {
00087 return handler_t(integer_);
00088 }
00089
00090 template <class T, class ExcludedContainer>
00091 bool
00092 SparseIterator<handler<T, unsigned>, ExcludedContainer>
00093 ::operator!= (const SparseIterator& i) const
00094 {
00095 return i.integer_ != integer_;
00096 }
00097
00098 template <class T, class ExcludedContainer>
00099 bool
00100 SparseIterator<handler<T, unsigned>, ExcludedContainer>
00101 ::operator== (const SparseIterator& i) const
00102 {
00103 return i.integer_ == integer_;
00104 }
00105
00106 template <class T, class ExcludedContainer>
00107 SparseIterator<handler<T, unsigned>, ExcludedContainer>&
00108 SparseIterator<handler<T, unsigned>, ExcludedContainer>
00109 ::operator= (const SparseIterator& i)
00110 {
00111 integer_ = i.integer_;
00112 excluded_ = i.excluded_;
00113 return *this;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00127 template <class T, class ExcludedContainer>
00128 SparseInterval<handler<T, unsigned>, ExcludedContainer>
00129 ::SparseInterval (integer_t f, integer_t t, const excluded_container_t& c)
00130 : excluded_ (c),
00131 from_ (f),
00132 to_ (t)
00133 {
00134 precondition (from_ <= to_ + 1);
00135 precondition (excluded_.find (handler_t(to_ + 1)) == excluded_.end ());
00136 precondition ((to_ == limits<unsigned int>::max())
00137 || (to_ + 1 - from_ >= excluded_.size()));
00138 }
00139
00140 template <class T, class ExcludedContainer>
00141 SparseInterval<handler<T, unsigned>, ExcludedContainer>
00142 ::SparseInterval (const SparseInterval& a)
00143 : excluded_ (a.excluded_),
00144 from_ (a.from_),
00145 to_ (a.to_)
00146 {
00147 }
00148
00149 template <class T, class ExcludedContainer>
00150 unsigned
00151 SparseInterval<handler<T, unsigned>, ExcludedContainer>::size () const
00152 {
00153
00154
00155 return to_ == limits<unsigned int>::max() ? 0
00156 : to_ - from_ + 1 - excluded_.size ();
00157 }
00158
00159 template <class T, class ExcludedContainer>
00160 std::string
00161 SparseInterval<handler<T, unsigned>, ExcludedContainer>::to_string () const
00162 {
00163 std::stringstream s;
00164 s << "from :" << from_ << " to : " << to_ << " ex:";
00165 for (typename ExcludedContainer::iterator i = excluded_.begin ();
00166 i != excluded_.end ();
00167 ++i)
00168 s << *i << " ";
00169 return s.str ();
00170 }
00171
00172 template <class T, class ExcludedContainer>
00173 typename SparseInterval<handler<T, unsigned>, ExcludedContainer>::iterator
00174 SparseInterval<handler<T, unsigned>, ExcludedContainer>::begin () const
00175 {
00176 unsigned from = from_;
00177
00178 if (excluded_.size () != 0)
00179 while (excluded_.find (handler_t(from)) != excluded_.end ())
00180 ++from;
00181 return iterator (handler_t(from), excluded_);
00182 }
00183
00184 template <class T, class ExcludedContainer>
00185 typename SparseInterval<handler<T, unsigned>, ExcludedContainer>::iterator
00186 SparseInterval<handler<T, unsigned>, ExcludedContainer>::end () const
00187 {
00188 return iterator (handler_t(to_ + 1), excluded_);
00189 }
00190
00191 template <class T, class ExcludedContainer>
00192 typename SparseInterval<handler<T, unsigned>, ExcludedContainer>::handler_t
00193 SparseInterval<handler<T, unsigned>, ExcludedContainer>::back () const
00194 {
00195 unsigned to = to_;
00196
00197 if (excluded_.size () != 0)
00198 while (excluded_.find (handler_t(to)) != excluded_.end ())
00199 --to;
00200 return *(iterator (handler_t(to), excluded_));
00201 }
00202
00203
00204 }
00205 }
00206
00207 #endif // ! VCSN_MISC_SPARSE_INTERVAL_HXX