Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
letterset.hh
Go to the documentation of this file.
1 #ifndef VCSN_LABELSET_LETTERSET_HH
2 # define VCSN_LABELSET_LETTERSET_HH
3 
4 # include <memory>
5 
6 # include <vcsn/alphabets/setalpha.hh> // intersection
7 # include <vcsn/core/kind.hh>
8 # include <vcsn/misc/attributes.hh>
9 # include <vcsn/misc/escape.hh>
10 # include <vcsn/misc/raise.hh>
11 # include <vcsn/misc/set.hh> // intersection
13 # include <vcsn/labelset/labelset.hh>
15 # include <vcsn/labelset/wordset.hh>
16 
17 namespace vcsn
18 {
20  template <typename GenSet>
21  class letterset: public detail::genset_labelset<GenSet>
22  {
23  public:
24  using genset_t = GenSet;
27  using genset_ptr = std::shared_ptr<const genset_t>;
28 
29  using letter_t = typename genset_t::letter_t;
30  using word_t = typename genset_t::word_t;
31  using letters_t = std::set<letter_t>;
32 
33  using value_t = letter_t;
34 
36 
37  letterset(const genset_ptr& gs)
38  : super_t{gs}
39  {}
40 
41  letterset(const genset_t& gs = {})
42  : letterset(std::make_shared<const genset_t>(gs))
43  {}
44 
45  letterset(const std::initializer_list<letter_t>& letters)
46  : letterset(std::make_shared<const genset_t>(letters))
47  {}
48 
49  static std::string sname()
50  {
51  return "letterset<" + super_t::sname() + ">";
52  }
53 
54  std::string vname(bool full = true) const
55  {
56  return "letterset<" + super_t::vname(full) + ">";
57  }
58 
60  static letterset make(std::istream& is)
61  {
62  // name: letterset<char_letters(abc)>.
63  // ^^^^^^^^^ ^^^^^^^^^^^^^^^^^
64  // kind genset
65  eat(is, "letterset<");
66  auto gs = genset_t::make(is);
67  eat(is, ">");
68  return gs;
69  }
70 
74  bool open(bool o) const
75  {
76  return this->genset().open(o);
77  }
78 
79  static constexpr bool is_free()
80  {
81  return true;
82  }
83 
85  template <typename... Args>
86  value_t value(Args&&... args) const
87  {
88  return value_t{std::forward<Args>(args)...};
89  }
90 
92  word_t word(value_t v) const
93  {
94  return {v};
95  }
96 
98  static word_t
100  {
101  return v;
102  }
103 
104  static value_t
105  special() ATTRIBUTE_PURE
106  {
107  return genset_t::template special<value_t>();
108  }
109 
111  static bool
112  equals(const value_t l, const value_t r)
113  {
114  return l == r;
115  }
116 
118  static bool less_than(const value_t l, const value_t r)
119  {
120  return l < r;
121  }
122 
123  static constexpr bool
125  {
126  return false;
127  }
128 
129  static constexpr bool
131  {
132  return false;
133  }
134 
135  static constexpr bool
137  {
138  return true;
139  }
140 
141  static bool
142  is_special(value_t v) ATTRIBUTE_PURE
143  {
144  return v == special();
145  }
146 
147  static constexpr bool
149  {
150  return false;
151  }
152 
153  bool
154  is_valid(value_t v) const
155  {
156  return this->has(v);
157  }
158 
159  static size_t size(value_t)
160  {
161  return 1;
162  }
163 
164  static size_t hash(value_t v)
165  {
166  return hash_value(v);
167  }
168 
169  static value_t
171  {
172  return v;
173  }
174 
176  value_t
177  conv(std::istream& i) const
178  {
179  letter_t l = this->genset().get_letter(i);
180  require(this->has(l),
181  "invalid label: unexpected ", str_escape(l));
182  return value_t{l};
183  }
184 
185  std::set<value_t>
186  convs(std::istream& i) const
187  {
188  std::set<value_t> res;
189  for (auto r : this->convs_(i))
190  res.insert(value_t{r});
191  return res;
192  }
193 
194  std::ostream&
195  print(const value_t& l, std::ostream& o,
196  const std::string& = "text") const
197  {
198  if (!is_special(l))
199  o << str_escape(l);
200  return o;
201  }
202 
203  std::ostream&
204  print_set(std::ostream& o, symbol format = symbol{"text"}) const
205  {
206  if (format == "latex")
207  this->genset().print_set(o, format);
208  else if (format == "text")
209  o << vname(true);
210  else
211  raise("invalid format: ", format);
212  return o;
213  }
214  };
215 
216  namespace detail
217  {
219  template <typename GenSet>
221  {
223  static type value(const letterset<GenSet>& ls)
224  {
225  return ls;
226  }
227  };
228 
230  template <typename GenSet>
231  struct law_traits<letterset<GenSet>>
232  {
234  static type value(const letterset<GenSet>& ls)
235  {
236  return ls.genset();
237  }
238  };
239 
240  /*-------.
241  | Join. |
242  `-------*/
243 
244  template <typename GenSet>
245  struct join_impl<letterset<GenSet>, letterset<GenSet>>
246  {
248  static type join(const letterset<GenSet>& lhs,
249  const letterset<GenSet>& rhs)
250  {
251  return {get_union(lhs.genset(), rhs.genset())};
252  }
253  };
254  }
255 
257  template <typename GenSet>
259  meet(const letterset<GenSet>& lhs, const letterset<GenSet>& rhs)
260  {
261  return {intersection(lhs.genset(), rhs.genset())};
262  }
263 }
264 
265 #endif // !VCSN_LABELSET_LETTERSET_HH
value_t value(Args &&...args) const
Value constructor.
Definition: letterset.hh:86
static std::string sname()
Definition: letterset.hh:49
static type value(const letterset< GenSet > &ls)
Definition: letterset.hh:234
std::shared_ptr< const genset_t > genset_ptr
std::set< T, Compare, Alloc > get_union(const std::set< T, Compare, Alloc > &set1, const std::set< T, Compare, Alloc > &set2)
The union of two sets.
word_t word(value_t v) const
Convert to a word.
Definition: letterset.hh:92
static constexpr bool is_one(value_t)
Definition: letterset.hh:148
letterset(const genset_ptr &gs)
Definition: letterset.hh:37
static type value(const letterset< GenSet > &ls)
Definition: letterset.hh:223
std::set< letter_t > letters_t
std::ostream & print(const value_t &l, std::ostream &o, const std::string &="text") const
Definition: letterset.hh:195
The LAW from a LAL.
Definition: labelset.hh:62
static size_t hash(value_t v)
Definition: letterset.hh:164
value_t conv(std::istream &i) const
Read one letter from i, return the corresponding label.
Definition: letterset.hh:177
Implementation of labels are nullables (letter or empty).
Definition: fwd.hh:13
static value_t conv(self_type, value_t v)
Definition: letterset.hh:170
boost::flyweight< std::string, boost::flyweights::no_tracking > symbol
An internalized string.
Definition: symbol.hh:24
typename genset_t::word_t word_t
std::ostream & str_escape(std::ostream &os, const std::string &str)
Output a string, escaping special characters.
Definition: escape.cc:43
static letterset make(std::istream &is)
Build from the description in is.
Definition: letterset.hh:60
This class has no modeling purpose, it only serves to factor code common to letterset, nullableset and wordset.
std::string vname(bool full=true) const
std::size_t hash_value(const T &v)
Definition: hash.hh:61
std::set< value_t > convs(std::istream &i) const
Definition: letterset.hh:186
typename genset_t::letter_t letter_t
Definition: letterset.hh:29
static constexpr bool is_free()
Definition: letterset.hh:79
static bool is_special(value_t v) ATTRIBUTE_PURE
Definition: letterset.hh:142
static std::string sname()
auto meet(const ratexpset< Ctx1 > &a, const ratexpset< Ctx2 > &b) -> ratexpset< meet_t< Ctx1, Ctx2 >>
The meet of two ratexpsets.
Definition: ratexpset.hh:480
letter_t value_t
Definition: letterset.hh:33
std::istringstream is
The input stream: the specification to translate.
Definition: translate.cc:329
static value_t special() ATTRIBUTE_PURE
Definition: letterset.hh:105
static constexpr bool has_one()
Definition: letterset.hh:124
std::set< letter_t > convs_(std::istream &i) const
Read a range of letters.
static size_t size(value_t)
Definition: letterset.hh:159
A structure that implements the computation of join(V1, V2).
Definition: join.hh:19
typename genset_t::word_t word_t
Definition: letterset.hh:30
ATTRIBUTE_PURE auto has(Args &&...args) const -> decltype(this->genset().has(std::forward< Args >(args)...))
bool is_valid(value_t v) const
Definition: letterset.hh:154
static type join(const letterset< GenSet > &lhs, const letterset< GenSet > &rhs)
Definition: letterset.hh:248
static bool less_than(const value_t l, const value_t r)
Whether l < r.
Definition: letterset.hh:118
Provide a variadic mul on top of a binary mul(), and one().
Definition: fwd.hh:36
letterset(const genset_t &gs={})
Definition: letterset.hh:41
std::set< T, Compare, Alloc > intersection(const std::set< T, Compare, Alloc > &set1, const std::set< T, Compare, Alloc > &set2)
The intersection of two sets.
char eat(std::istream &is, char c)
Check lookahead character and advance.
Definition: stream.cc:37
letterset(const std::initializer_list< letter_t > &letters)
Definition: letterset.hh:45
static bool equals(const value_t l, const value_t r)
Whether l == r.
Definition: letterset.hh:112
static constexpr bool is_ratexpset()
Definition: letterset.hh:130
std::ostream & print_set(std::ostream &o, symbol format=symbol{"text"}) const
Definition: letterset.hh:204
typename genset_t::letter_t letter_t
Implementation of labels are letters.
Definition: fwd.hh:9
bool open(bool o) const
Whether unknown letters should be added, or rejected.
Definition: letterset.hh:74
Implementation of labels are words.
Definition: fwd.hh:24
The smallest nullableset which includes LabelSet.
Definition: labelset.hh:22
static word_t letters_of(word_t v)
Prepare to iterate over the letters of v.
Definition: letterset.hh:99
const genset_t & genset() const
variadic_mul_mixin< detail::r_impl > r
Definition: fwd.hh:42
static constexpr bool is_letterized()
Definition: letterset.hh:136
void require(bool b, Args &&...args)
If b is not verified, raise an error with args as message.
Definition: raise.hh:39
std::string vname(bool full=true) const
Definition: letterset.hh:54