Vcsn  2.1
Be Rational
polynomial.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 
6 #include <vcsn/dyn/fwd.hh>
7 #include <vcsn/misc/symbol.hh>
8 
9 namespace vcsn
10 {
11  namespace dyn
12  {
13  namespace detail
14  {
15 
18  {
19  public:
21  virtual symbol vname() const = 0;
22 
23  template <typename PolynomialSet>
24  auto& as()
25  {
27  }
28 
29  template <typename PolynomialSet>
30  auto& as() const
31  {
32  return dyn_cast<const polynomial_wrapper<PolynomialSet>&>(*this);
33  }
34 
36  virtual bool empty() const = 0;
37  };
38 
40  template <typename PolynomialSet>
41  class polynomial_wrapper final: public polynomial_base
42  {
43  public:
44  using polynomialset_t = PolynomialSet;
46  using polynomial_t = typename polynomialset_t::value_t;
48  : polynomialset_(ps)
49  , polynomial_(p)
50  {}
51  virtual ~polynomial_wrapper() {}
52 
53  virtual symbol vname() const override
54  {
55  return polynomialset().sname();
56  }
57 
59  {
60  return polynomialset_;
61  }
62 
63  const polynomial_t polynomial() const
64  {
65  return polynomial_;
66  }
67 
69  virtual bool empty() const override
70  {
71  return polynomial_.empty();
72  }
73 
74  private:
79  };
80 
81  } // namespace detail
82 
83  using polynomial = std::shared_ptr<const detail::polynomial_base>;
84 
85  template <typename PolynomialSet>
86  inline
88  make_polynomial(const PolynomialSet& ps,
89  const typename PolynomialSet::value_t& p)
90  {
92  return std::make_shared<wrapper_t>(ps, p);
93  }
94  } // namespace dyn
95 } // namespace vcsn
const polynomialset_t & polynomialset() const
Definition: polynomial.hh:58
virtual symbol vname() const override
A description of the polynomial.
Definition: polynomial.hh:53
const polynomial_t polynomial_
The polynomial.
Definition: polynomial.hh:78
const polynomial_t polynomial() const
Definition: polynomial.hh:63
Aggregate a polynomial and its polynomialset.
Definition: fwd.hh:66
polynomial_wrapper(const polynomialset_t &ps, const polynomial_t &p)
Definition: polynomial.hh:47
virtual symbol vname() const =0
A description of the polynomial.
polynomial make_polynomial(const PolynomialSet &ps, const typename PolynomialSet::value_t &p)
Definition: polynomial.hh:88
An abstract polynomial.
Definition: polynomial.hh:17
virtual bool empty() const override
Whether is zero.
Definition: polynomial.hh:69
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
Definition: symbol.hh:23
std::shared_ptr< const detail::polynomial_base > polynomial
Definition: fwd.hh:68
const polynomialset_t polynomialset_
The polynomial set.
Definition: polynomial.hh:76
typename polynomialset_t::value_t polynomial_t
Definition: polynomial.hh:46
virtual bool empty() const =0
Whether is zero.
To dyn_cast(From &&from)
A dynamic_cast in debug mode, static_cast with NDEBUG.
Definition: fwd.hh:14