Vcsn  2.2
Be Rational
expansion.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 
6 #include <vcsn/misc/symbol.hh>
7 
8 namespace vcsn
9 {
10  namespace dyn
11  {
12  namespace detail
13  {
16  {
17  public:
19  virtual symbol vname() const = 0;
20 
21  template <typename ExpansionSet>
22  auto& as()
23  {
25  }
26 
27  template <typename ExpansionSet>
28  auto& as() const
29  {
30  return dyn_cast<const expansion_wrapper<ExpansionSet>&>(*this);
31  }
32  };
33 
35  template <typename ExpansionSet>
36  class expansion_wrapper final: public expansion_base
37  {
38  public:
39  using expansionset_t = ExpansionSet;
41  using expansion_t = typename expansionset_t::value_t;
43  const expansion_t& expansion)
44  : expansionset_(expansionset)
45  , expansion_(expansion)
46  {}
47  virtual ~expansion_wrapper() {}
48 
49  virtual symbol vname() const override
50  {
51  return expansionset().sname();
52  }
53 
55  {
56  return expansionset_;
57  }
58 
59  const expansion_t expansion() const
60  {
61  return expansion_;
62  }
63 
64  private:
69  };
70 
71  } // namespace detail
72 
73  using expansion = std::shared_ptr<const detail::expansion_base>;
74 
75  template <typename ExpansionSet>
76  inline
77  expansion
78  make_expansion(const ExpansionSet& ps,
79  const typename ExpansionSet::value_t& expansion)
80  {
82  return std::make_shared<wrapper_t>(ps, expansion);
83  }
84  } // namespace dyn
85 } // namespace vcsn
const expansionset_t & expansionset() const
Definition: expansion.hh:54
An abstract expansion.
Definition: expansion.hh:15
Definition: a-star.hh:8
const expansion_t expansion_
The expansion.
Definition: expansion.hh:68
std::shared_ptr< const detail::expansion_base > expansion
Definition: expansion.hh:73
To dyn_cast(From &&from)
A dynamic_cast in debug mode, static_cast with NDEBUG.
Definition: fwd.hh:16
typename expansionset_t::value_t expansion_t
Definition: expansion.hh:41
virtual symbol vname() const =0
A description of the expansion.
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
Definition: symbol.hh:23
expansion_wrapper(const expansionset_t &expansionset, const expansion_t &expansion)
Definition: expansion.hh:42
virtual symbol vname() const override
A description of the expansion.
Definition: expansion.hh:49
const expansionset_t expansionset_
The expansion set.
Definition: expansion.hh:66
const expansion_t expansion() const
Definition: expansion.hh:59
expansion make_expansion(const ExpansionSet &ps, const typename ExpansionSet::value_t &expansion)
Definition: expansion.hh:78
Aggregate an expansion and its expansionset.
Definition: expansion.hh:36