Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
is-proper.hh
Go to the documentation of this file.
1 #ifndef VCSN_ALGOS_IS_PROPER_HH
2 # define VCSN_ALGOS_IS_PROPER_HH
3 
4 # include <type_traits>
5 
6 # include <vcsn/ctx/traits.hh>
7 # include <vcsn/misc/attributes.hh>
8 # include <vcsn/core/kind.hh>
9 # include <vcsn/dyn/automaton.hh> // make_automaton
10 
11 namespace vcsn
12 {
13 
14  namespace detail
15  {
16  template <typename Aut>
17  typename std::enable_if<labelset_t_of<Aut>::has_one(),
18  bool>::type
19  is_proper_(const Aut& aut)
20  {
21  for (auto t: aut->transitions())
22  if (aut->labelset()->is_one(aut->label_of(t)))
23  return false;
24  return true;
25  }
26 
27  template <typename Aut>
28  constexpr
29  typename std::enable_if<!labelset_t_of<Aut>::has_one(),
30  bool>::type
31  is_proper_(const Aut&)
32  {
33  return true;
34  }
35  }
36 
44  template <typename Aut>
45  bool is_proper(const Aut& aut) ATTRIBUTE_CONST;
46 
47  template <typename Aut>
48  bool
49  is_proper(const Aut& aut)
50  {
51  return detail::is_proper_(aut);
52  }
53 
54  namespace dyn
55  {
56 
57  /*-----------------.
58  | dyn::is_proper. |
59  `-----------------*/
60 
61  namespace detail
62  {
63  template <typename Aut>
64  bool is_proper(const automaton& aut)
65  {
66  const auto& a = aut->as<Aut>();
67  return is_proper(a);
68  }
69 
71  (const automaton& aut) -> bool);
72  }
73 
74  }
75 
76 } // namespace vcsn
77 
78 #endif // !VCSN_ALGOS_IS_PROPER_HH
std::enable_if< labelset_t_of< Aut >::has_one(), bool >::type is_proper_(const Aut &aut)
Definition: is-proper.hh:19
REGISTER_DECLARE(accessible,(const automaton &) -> automaton)
std::shared_ptr< detail::automaton_base > automaton
Definition: automaton.hh:71
bool is_proper(const automaton &aut)
Definition: is-proper.hh:64
bool is_proper(const Aut &aut)
Test whether an automaton is proper.
Definition: is-proper.hh:49