00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_CONCEPT_HISTORY_HXX
00018 # define VCSN_AUTOMATA_CONCEPT_HISTORY_HXX
00019
00020 # include <list>
00021 # include <map>
00022
00023 # include <vaucanson/automata/concept/history.hh>
00024
00025 namespace vcsn {
00026
00027 namespace history {
00028
00029 template <class T>
00030 Event<T>::Event(event_kind_t e) : kind_(e)
00031 {}
00032
00033 template <class T>
00034 Event<T>::~Event()
00035 {}
00036
00037 template <class T>
00038 event_kind_t
00039 Event<T>::get_event_kind() const
00040 {
00041 return kind_;
00042 }
00043
00044 template <class T>
00045 BinaryEvent<T>::BinaryEvent(event_kind_t e, const T& first,
00046 const T& second) :
00047 Event<T>(e),
00048 first_(first),
00049 second_(second)
00050 {}
00051
00052 template <class T>
00053 const T&
00054 BinaryEvent<T>::get_first() const
00055 {
00056 return first_;
00057 }
00058
00059 template <class T>
00060 const T&
00061 BinaryEvent<T>::get_second() const
00062 {
00063 return second_;
00064 }
00065
00066 template <class T>
00067 UnaryEvent<T>::UnaryEvent(event_kind_t e, const T& first) :
00068 Event<T>(e),
00069 first_(first)
00070 {}
00071
00072 template <class T>
00073 const T&
00074 UnaryEvent<T>::get_first() const
00075 {
00076 return first_;
00077 }
00078
00079
00080 template <class AutoType_>
00081 bool
00082 AutomatonHistory<AutoType_>::set_state_event_about(event_kind_t e,
00083 hstate_t s)
00084 {
00085
00086
00087
00088
00089
00090
00091
00092
00093 return true;
00094 }
00095
00096 template <class AutoType_>
00097 bool
00098 AutomatonHistory<AutoType_>::set_state_event_about(event_kind_t e,
00099 hstate_t s,
00100 hstate_t first)
00101 {
00102 for (typename state_events_t::const_iterator ev
00103 = states_events_[s].begin();
00104 ev != states_events_[s].end();
00105 ++ev)
00106 if (ev->get_event_kind() == e)
00107 return false;
00108 states_events_[s].push_front(UnaryEvent<hstate_t>(e, first));
00109 return true;
00110 }
00111
00112 template <class AutoType_>
00113 bool
00114 AutomatonHistory<AutoType_>::set_state_event_about(event_kind_t e,
00115 hstate_t s,
00116 hstate_t first,
00117 hstate_t second)
00118 {
00119 for (typename state_events_t::const_iterator ev =
00120 states_events_[s].begin();
00121 ev != states_events_[s].end();
00122 ++ev)
00123 if (ev->get_event_kind() == e)
00124 return false;
00125 states_events_[s].push_front(BinaryEvent<hstate_t>
00126 (e, first, second));
00127 return true;
00128 }
00129
00130 template <class AutoType_>
00131 const Event<typename AutoType_::hstate_t>
00132 AutomatonHistory<AutoType_>::get_state_event_about(event_kind_t e,
00133 hstate_t s) const
00134 {
00135 typename states_events_t::const_iterator se = states_events_.find(s);
00136 if (se == states_events_.end())
00137 return 0;
00138 for (typename state_events_t::const_iterator ev = se->second.begin();
00139 ev != se->second.end();
00140 ++ev)
00141 if (ev->get_event_kind() == e)
00142 return *ev;
00143 return 0;
00144 }
00145
00146 template <class AutoType_>
00147 bool
00148 AutomatonHistory<AutoType_>::set_transition_event_about(event_kind_t e,
00149 htransition_t transition)
00150 {
00151 for (typename transition_events_t::const_iterator ev
00152 = transitions_events_[transition].begin();
00153 ev != transitions_events_[transition].end();
00154 ++ev)
00155 if (ev->get_event_kind() == e)
00156 return false;
00157 transitions_events_[transition].push_front(Event<htransition_t>(e));
00158 return true;
00159 }
00160
00161 template <class AutoType_>
00162 bool
00163 AutomatonHistory<AutoType_>::set_transition_event_about(event_kind_t e,
00164 htransition_t transition,
00165 htransition_t first)
00166 {
00167 for (typename transition_events_t::const_iterator ev
00168 = transitions_events_[transition].begin();
00169 ev != transitions_events_[transition].end();
00170 ++ev)
00171 if (ev->get_event_kind() == e)
00172 return false;
00173 transitions_events_[transition].push_front(UnaryEvent<htransition_t>(e, first));
00174 return true;
00175 }
00176
00177 template <class AutoType_>
00178 bool
00179 AutomatonHistory<AutoType_>::set_transition_event_about(event_kind_t e,
00180 htransition_t transition,
00181 htransition_t first,
00182 htransition_t second)
00183 {
00184 for (typename transition_events_t::const_iterator ev
00185 = transitions_events_[transition].begin();
00186 ev != transitions_events_[transition].end();
00187 ++ev)
00188 if (ev->get_event_kind() == e)
00189 return false;
00190 transitions_events_[transition].push_front
00191 (BinaryEvent<htransition_t>(e, first, second));
00192 return true;
00193 }
00194
00195 template <class AutoType_>
00196 const Event<typename AutoType_::htransition_t>
00197 AutomatonHistory<AutoType_>::get_transition_event_about(event_kind_t e,
00198 htransition_t transition
00199 ) const
00200 {
00201 typename transitions_events_t::const_iterator ee =
00202 transitions_events_.find(transition);
00203 if (ee == transitions_events_.end())
00204 return 0;
00205 for (typename transition_events_t::const_iterator ev = ee->second.begin();
00206 ev != ee->second.end();
00207 ++ev)
00208 if (ev->get_event_kind() == e)
00209 return (*ev);
00210 return 0;
00211 }
00212
00213 template <class AutoType_>
00214 bool
00215 AutomatonHistory<AutoType_>::set_auto_event_about(event_kind_t e)
00216 {
00217 for (typename auto_events_t::const_iterator ev = auto_events_.begin();
00218 ev != auto_events_.end();
00219 ++ev)
00220 if (ev->second->get_event_kind() == e)
00221 return false;
00222 auto_events_.push_front(Event<AutoType_>(e));
00223 return true;
00224 }
00225
00226 template <class AutoType_>
00227 bool
00228 AutomatonHistory<AutoType_>::set_auto_event_about(event_kind_t e,
00229 AutoType_ first)
00230 {
00231 for (typename auto_events_t::const_iterator ev = auto_events_.begin();
00232 ev != auto_events_.end();
00233 ++ev)
00234 if (ev->second->get_event_kind() == e)
00235 return false;
00236 auto_events_.push_front(Event<AutoType_>(e, first));
00237 return true;
00238 }
00239
00240 template <class AutoType_>
00241 bool
00242 AutomatonHistory<AutoType_>::set_auto_event_about(event_kind_t e,
00243 AutoType_ first,
00244 AutoType_ second)
00245 {
00246 for (typename auto_events_t::const_iterator ev = auto_events_.begin();
00247 ev != auto_events_.end();
00248 ++ev)
00249 if (ev->get_event_kind() == e)
00250 return false;
00251 auto_events_.push_front(BinaryEvent<AutoType_>(e, first, second));
00252 return true;
00253 }
00254
00255 template <class AutoType_>
00256 const Event<AutoType_>
00257 AutomatonHistory<AutoType_>::get_auto_event_about(event_kind_t e) const
00258 {
00259 for (typename auto_events_t::const_iterator ev = auto_events_.begin();
00260 ev != auto_events_.end();
00261 ++ev)
00262 if (ev->get_event_kind() == e)
00263 return (*ev);
00264 return 0;
00265 }
00266
00267 template <class T>
00268 std::ostream&
00269 operator<<(std::ostream& out, const Event<T>& e)
00270 {
00271 out << e.get_event_kind();
00272 return out;
00273 }
00274
00275
00276 }
00277
00278 }
00279
00280 #endif // ! VCSN_AUTOMATA_CONCEPT_HISTORY_HXX