Vcsn  2.2a
Be Rational
traits.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 
6 
7 namespace vcsn
8 {
9 
11  template <typename T>
12  using base_t = std::remove_cv_t<std::remove_reference_t<T>>;
13 
14  /*------------------.
15  | Computing types. |
16  `------------------*/
17 
27 
28 #define DEFINE(Type) \
29  namespace detail \
30  { \
31  template <typename ValueSet, typename = void_t<>> \
32  struct Type ## _of_impl; \
33  \
34  template <typename ValueSet> \
35  struct Type ## _of_impl<ValueSet, \
36  void_t<typename ValueSet::Type>> \
37  { \
38  using type = typename ValueSet::Type; \
39  }; \
40  \
41  template <typename ValueSet> \
42  struct Type ## _of_impl<std::shared_ptr<ValueSet>, \
43  void_t<typename ValueSet::Type>> \
44  { \
45  using type = typename ValueSet::Type; \
46  }; \
47  } \
48  \
49  template <typename ValueSet> \
50  using Type ## _of \
51  = typename detail::Type ## _of_impl<base_t<ValueSet>>::type
52 
53  DEFINE(context_t);
54  DEFINE(label_t);
55  DEFINE(labelset_t);
56  DEFINE(state_t);
57  DEFINE(transition_t);
58  DEFINE(weight_t);
59  DEFINE(weightset_t);
60 
61 #undef DEFINE
62 
72  template <typename Aut, typename Context = context_t_of<Aut>>
74  = typename Aut::element_type::template fresh_automaton_t<Context>;
75 
76  template <typename ValueSet>
77  using letter_t_of
78  = typename labelset_t_of<base_t<ValueSet>>::letter_t;
79 
80  template <typename ValueSet>
81  using word_t_of
82  = typename labelset_t_of<base_t<ValueSet>>::word_t;
83 }
typename Aut::element_type::template fresh_automaton_t< Context > fresh_automaton_t_of
Given an automaton type, the type of its copies.
Definition: traits.hh:74
#define DEFINE(Type)
Extract various ValueSets/Value types from objects, or pointers to objects.
Definition: traits.hh:28
typename labelset_t_of< base_t< ValueSet >>::word_t word_t_of
Definition: traits.hh:82
typename labelset_t_of< base_t< ValueSet >>::letter_t letter_t_of
Definition: traits.hh:78
std::remove_cv_t< std::remove_reference_t< T >> base_t
T without reference or const/volatile qualifiers.
Definition: traits.hh:12
typename detail::labelset_t_of_impl< base_t< ValueSet >>::type labelset_t_of
Definition: traits.hh:55
Definition: a-star.hh:8