Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ratexp.hxx
Go to the documentation of this file.
1 #ifndef VCSN_CORE_RAT_RATEXP_HXX_
2 # define VCSN_CORE_RAT_RATEXP_HXX_
3 
4 # include <vcsn/core/rat/ratexp.hh>
5 # include <vcsn/core/rat/visitor.hh>
6 
7 namespace vcsn
8 {
9  namespace rat
10  {
11 
12 #define DEFINE_CTOR(Node) \
13  template <typename Context> \
14  inline \
15  Node<Context>::Node
16 
17 #define DEFINE(Node) \
18  template <typename Context> \
19  inline \
20  auto \
21  Node<Context>
22 
23  /*-------.
24  | atom. |
25  `-------*/
26 
27  DEFINE_CTOR(atom)(const label_t& value)
28  : value_(value)
29  {}
30 
31  DEFINE(atom)::accept(typename super_t::const_visitor& v) const
32  -> void
33  {
34  v.visit(*this);
35  }
36 
37  DEFINE(atom)::value() const
38  -> const label_t&
39  {
40  return value_;
41  }
42 
43 # undef DEFINE_CTOR
44 # undef DEFINE
45 
46 
47 #define DEFINE_CTOR(Node) \
48  template <type_t Type, typename Context> \
49  inline \
50  Node<Type, Context>::Node
51 
52 #define DEFINE(Node) \
53  template <type_t Type, typename Context> \
54  inline \
55  auto \
56  Node<Type, Context>
57 
58 
59  /*-----------.
60  | variadic. |
61  `-----------*/
62 
64  : sub_(ns)
65  {}
66 
67 
68  DEFINE(variadic)::begin() const
70  {
71  return sub_.begin();
72  }
73 
74  DEFINE(variadic)::end() const
76  {
77  return sub_.end();
78  }
79 
80  DEFINE(variadic)::rbegin() const
82  {
83  return sub_.begin();
84  }
85 
86  DEFINE(variadic)::rend() const
88  {
89  return sub_.end();
90  }
91 
92  DEFINE(variadic)::size() const
93  -> size_t
94  {
95  return sub_.size();
96  }
97 
98  DEFINE(variadic)::operator[](size_t n) const
99  -> const value_t
100  {
101  return sub_[n];
102  }
103 
104  DEFINE(variadic)::head() const
105  -> const value_t
106  {
107  return *begin();
108  }
109 
110  DEFINE(variadic)::back() const
111  -> const value_t
112  {
113  return sub_.back();
114  }
115 
116  DEFINE(variadic)::tail() const
117  -> decltype(boost::make_iterator_range(*this, 1, 0))
118  {
119  return boost::make_iterator_range(*this, 1, 0);
120  }
121 
122  DEFINE(variadic)::subs() const
123  -> values_t
124  {
125  return sub_;
126  }
127 
128  DEFINE(variadic)::accept(typename super_t::const_visitor& v) const
129  -> void
130  {
131  v.visit(*this);
132  }
133 
134  /*---------.
135  | weight. |
136  `---------*/
137 
139  : sub_(sub)
140  , weight_(weight)
141  {}
142 
143  DEFINE(weight_node)::sub() const
144  -> const value_t
145  {
146  return sub_;
147  }
148 
150  -> const weight_t&
151  {
152  return weight_;
153  }
154 
155  DEFINE(weight_node)::set_weight(const weight_t& w)
156  -> void
157  {
158  weight_ = w;
159  }
160 
161  DEFINE(weight_node)::accept(typename super_t::const_visitor& v) const
162  -> void
163  {
164  v.visit(*this);
165  }
166 
167  /*--------.
168  | unary. |
169  `--------*/
170 
172  : sub_(sub)
173  {}
174 
175  DEFINE(unary)::sub() const
176  -> const value_t
177  {
178  return sub_;
179  }
180 
181  DEFINE(unary)::accept(typename super_t::const_visitor& v) const
182  -> void
183  {
184  v.visit(*this);
185  }
186 
187  /*-----------.
188  | constant. |
189  `-----------*/
190 
191  DEFINE(constant)::accept(typename super_t::const_visitor& v) const
192  -> void
193  {
194  v.visit(*this);
195  }
196 
197 # undef DEFINE_CTOR
198 # undef DEFINE
199 
200  } // namespace exp
201 } // namespace vcsn
202 
203 #endif // !VCSN_CORE_RAT_RATEXP_HXX_
An inner node with multiple children.
Definition: fwd.hh:123
The abstract parameterized, root for all rational expression types.
Definition: fwd.hh:80
typename values_t::const_reverse_iterator const_reverse_iterator
Definition: ratexp.hh:135
#define DEFINE(Node)
Definition: ratexp.hxx:52
std::shared_ptr< const detail::weight_base > weight
Definition: fwd.hh:82
weight_t_of< Context > weight_t
Definition: ratexp.hh:216
label_t_of< Context > label_t
Definition: ratexp.hh:275
An inner node implementing a weight.
Definition: fwd.hh:145
std::vector< value_t > values_t
Definition: ratexp.hh:91
std::shared_ptr< const node_t > value_t
A ratexp usable with value semantics.
Definition: ratexp.hh:90
typename values_t::const_iterator const_iterator
Definition: ratexp.hh:130
#define DEFINE_CTOR(Node)
Definition: ratexp.hxx:47