00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_LETTERS_SPEC_HH_
00019 # define VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_LETTERS_SPEC_HH_
00020
00021 # include <set>
00022 # include <vaucanson/automata/implementation/bmig_graph_impl.hh>
00023
00024 namespace vcsn
00025 {
00026 namespace bmig
00027 {
00028
00029
00030 template <typename WordValue,
00031 typename SeriesValue, typename Letter, typename Tag, typename GeometryCoords>
00032 class Graph<labels_are_letters, WordValue, bool, SeriesValue, Letter,
00033 Tag, GeometryCoords>
00034 {
00035 public:
00036
00037
00038
00039
00040
00041 typedef Graph<labels_are_letters, WordValue, bool,
00042 SeriesValue, Letter, Tag, GeometryCoords>
00043 self_t;
00044
00045 typedef bool semiring_elt_value_t;
00046 typedef WordValue monoid_elt_value_t;
00047 typedef WordValue word_value_t;
00048 typedef SeriesValue series_set_elt_value_t;
00049 typedef Letter letter_t;
00050 typedef Tag tag_t;
00051
00052 typedef typename LabelOf<labels_are_letters, WordValue, bool,
00053 SeriesValue, Letter>::ret label_t;
00054
00055 typedef boost::shared_ptr<std::size_t> state_t;
00056
00057
00058 typedef handler<state_h, state_t> hstate_t;
00059
00060 typedef EdgeValue<state_t, label_t> edge_data_t;
00061
00062 typedef GraphContainer<state_t, label_t, edge_data_t> graph_data_t;
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 typedef typename graph_data_t::iterator edges_iterator;
00075 typedef handler<transition_h, edges_iterator> htransition_t;
00076 typedef htransition_t hedge_t;
00077
00078 typedef VGraphContainer<edges_iterator, graph_data_t, htransition_t> edges_t;
00079 typedef std::vector<state_t> states_data_t;
00080 typedef misc::Support<states_data_t> states_t;
00081
00082 typedef std::set<state_t> initial_t;
00083 typedef std::set<state_t> final_t;
00084
00085 typedef misc::Support<initial_t> initial_support_t;
00086 typedef misc::Support<final_t> final_support_t;
00087
00088 typedef GeometryCoords geometry_coords_t;
00089
00090 typedef vcsn::geometry<hstate_t, htransition_t, GeometryCoords>
00091 geometry_t;
00092
00093
00094 typedef typename graph_data_t::iterator iterator;
00095 typedef typename graph_data_t::const_iterator const_iterator;
00096 typedef iterator transition_iterator;
00097
00098 typedef typename index_iterator<graph_data_t, src>::type
00099 src_iterator;
00100 typedef src_iterator src_const_iterator;
00101 typedef typename index_iterator<graph_data_t, dst>::type
00102 dst_iterator;
00103 typedef dst_iterator dst_const_iterator;
00104 typedef typename index_iterator<graph_data_t, pred>::type
00105 pred_iterator;
00106 typedef pred_iterator pred_const_iterator;
00107 typedef typename index_iterator<graph_data_t, succ>::type
00108 succ_iterator;
00109 typedef succ_iterator succ_const_iterator;
00110 typedef std::pair<src_iterator, src_iterator> src_range;
00111 typedef std::pair<dst_iterator, dst_iterator> dst_range;
00112 typedef std::pair<pred_iterator, pred_iterator> pred_range;
00113 typedef std::pair<succ_iterator, succ_iterator> succ_range;
00114
00115 Graph ();
00116 Graph (unsigned int reserve_number_of_state,
00117 unsigned int reserve_number_edge);
00118 Graph (const self_t&);
00119 ~Graph ();
00120
00121 self_t& operator= (const self_t&);
00122
00123
00124
00125 states_t states () const;
00126 edges_t edges () const;
00127 initial_support_t initial () const;
00128 final_support_t final () const;
00129
00130
00131 bool has_state (const hstate_t& h) const;
00132 hstate_t add_state ();
00133 hstate_t get_state (unsigned h) const;
00134 void del_state (const hstate_t& h);
00135
00136 void set_initial(const hstate_t& s,
00137 const series_set_elt_value_t& v,
00138 const series_set_elt_value_t& z);
00139 const series_set_elt_value_t&
00140 get_initial(const hstate_t&,
00141 const series_set_elt_value_t&) const;
00142 bool is_initial(const hstate_t& s,
00143 const series_set_elt_value_t&) const;
00144 void clear_initial();
00145
00146 void set_final(const hstate_t&,
00147 const series_set_elt_value_t&,
00148 const series_set_elt_value_t&);
00149 const series_set_elt_value_t&
00150 get_final(const hstate_t&,
00151 const series_set_elt_value_t&) const;
00152 bool is_final(const hstate_t& s,
00153 const series_set_elt_value_t&) const;
00154 void clear_final();
00155
00156
00157
00158 bool has_edge (const hedge_t& h) const;
00159 hedge_t add_edge (const hstate_t& from,
00160 const hstate_t& to,
00161 const label_t& l);
00162 void del_edge (const hedge_t& h);
00163
00164 hstate_t src_of (const hedge_t& h) const;
00165 hstate_t dst_of (const hedge_t& h) const;
00166
00167 const label_t& label_of (const hedge_t& h) const;
00168 void update(const hedge_t& h, const label_t& l);
00169
00170
00171 template <class S>
00172 bool exists (const AutomataBase<S>& s) const;
00173
00174 self_t& clone () const;
00175
00176 tag_t& tag ();
00177 const tag_t& tag () const;
00178 geometry_t& geometry ();
00179 const geometry_t& geometry () const;
00180
00181
00183 # define DECLARE_DELTA_FUNCTION(FunName, DeltaKind) \
00184 template <typename OutputIterator, typename Query> \
00185 void FunName (OutputIterator res, const hstate_t& from, \
00186 const Query& q, ::vcsn::delta_kind::DeltaKind) const
00187 DECLARE_DELTA_FUNCTION (delta, states);
00188 DECLARE_DELTA_FUNCTION (delta, transitions);
00189 DECLARE_DELTA_FUNCTION (rdelta, states);
00190 DECLARE_DELTA_FUNCTION (rdelta, transitions);
00191 # undef DECLARE_DELTA_FUNCTION
00192
00193
00194 private:
00195 typename graph_data_t::const_iterator
00196 find_edge(const state_t&,
00197 const state_t&,
00198 const label_t&) const;
00199
00200 geometry_t geometry_;
00201 graph_data_t graph_;
00202 tag_t tag_;
00203 final_t final_;
00204 initial_t initial_;
00205
00206
00207 boost::dynamic_bitset<> initial_bitset_;
00208 boost::dynamic_bitset<> final_bitset_;
00209 unsigned number_of_epsilon_;
00210
00211
00212 unsigned number_of_state_;
00213 states_data_t states_;
00214
00215 };
00216
00217
00218 # define BMIGRAPH_TPARAM \
00219 template <class S, class WordValue, class SeriesValue, \
00220 class Letter, class Tag, class GeometryCoords>
00221
00222 # define BMIGRAPH_LETTERS \
00223 Graph<labels_are_letters, WordValue, bool, SeriesValue, \
00224 Letter, Tag, GeometryCoords>
00225
00226 BMIGRAPH_TPARAM
00227 ADAPT_WORD_OF_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00228
00229 BMIGRAPH_TPARAM
00230 ADAPT_SERIE_OF_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00231
00232 BMIGRAPH_TPARAM
00233 ADAPT_ADD_SERIE_TRANSITION_TO_LETTERS_LABEL(BMIGRAPH_LETTERS);
00234
00235 # define BMIGRAPH \
00236 Graph<labels_are_letters, WordValue, bool, SerieValue, \
00237 Letter, Tag, GeometryCoords>
00238
00239 template <class WordValue, class SerieValue,
00240 class Letter, class Tag, class GeometryCoords, class I>
00241 Tag& op_tag(const AutomataBase<I>&, BMIGRAPH&);
00242
00243 template <class WordValue, class SerieValue,
00244 class Letter, class Tag, class GeometryCoords, class I>
00245 const Tag& op_tag(const AutomataBase<I>&, BMIGRAPH&);
00246
00247 template <class WordValue, class SerieValue,
00248 class Letter, class Tag, class GeometryCoords, class I>
00249 typename BMIGRAPH::geometry_t&
00250 op_geometry(const AutomataBase<I>&, BMIGRAPH&);
00251
00252 template <class WordValue, class SerieValue,
00253 class Letter, class Tag, class GeometryCoords, class I>
00254 const typename BMIGRAPH::geometry_t&
00255 op_geometry(const AutomataBase<I>&, const BMIGRAPH&);
00256
00257 # undef BMIGRAPH
00258 # undef BMIGRAPH_TPARAM
00259
00260 }
00261
00262
00263 template <typename WordValue,
00264 typename SeriesValue,
00265 typename Letter,
00266 typename Tag,
00267 typename GeometryCoords>
00268 struct automaton_traits<bmig::Graph<labels_are_letters, WordValue, bool, SeriesValue,
00269 Letter, Tag, GeometryCoords> >
00270 {
00271 typedef bmig::Graph<labels_are_letters, WordValue, bool, SeriesValue,
00272 Letter, Tag, GeometryCoords> graph_t;
00273 typedef typename graph_t::semiring_elt_value_t semiring_elt_value_t;
00274 typedef typename graph_t::monoid_elt_value_t monoid_elt_value_t;
00275 typedef typename graph_t::word_value_t word_value_t;
00276 typedef typename graph_t::series_set_elt_value_t series_set_elt_value_t;
00277 typedef typename graph_t::letter_t letter_t;
00278 typedef typename graph_t::tag_t tag_t;
00279 typedef typename graph_t::geometry_t geometry_t;
00280 typedef typename graph_t::label_t label_t;
00281 typedef typename graph_t::states_t states_t;
00282 typedef typename states_t::iterator state_iterator;
00283 typedef typename graph_t::hstate_t hstate_t;
00284 typedef typename graph_t::edges_t transitions_t;
00285 typedef typename transitions_t::iterator transition_iterator;
00286 typedef typename graph_t::htransition_t htransition_t;
00287 typedef typename graph_t::initial_t initial_t;
00288 typedef typename graph_t::initial_support_t initial_support_t;
00289 typedef typename initial_support_t::iterator initial_iterator;
00290 typedef typename graph_t::final_t final_t;
00291 typedef typename graph_t::final_support_t final_support_t;
00292 typedef typename final_support_t::iterator final_iterator;
00293 };
00294
00295 }
00296
00297 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00298 # include <vaucanson/automata/implementation/bmig_graph_letters_spec.hxx>
00299 # endif // !VCSN_USE_INTERFACE_ONLY || VCSN_USE_LIB
00300
00301 #endif // !VCSN_AUTOMATA_IMPLEMENTATION_BMIG_GRAPH_LETTERS_SPEC_HH_ //
00302