Vaucanson  1.4.1
default_ops.hxx
1 // default_ops.hxx: this file is part of the Vaucanson project.
2 //
3 // Vaucanson, a generic library for finite state machines.
4 //
5 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // The complete GNU General Public Licence Notice can be found as the
13 // `COPYING' file in the root directory.
14 //
15 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
16 //
17 #ifndef VCSN_DESIGN_PATTERN_DEFAULT_OPS_HXX
18 # define VCSN_DESIGN_PATTERN_DEFAULT_OPS_HXX
19 
22 # include <algorithm>
23 
24 namespace vcsn {
25 
26  /*--------------------.
27  | Structure::contains |
28  `--------------------*/
29 
30  template<typename S, typename T>
31  bool op_contains(const Structure<S>&, const T&)
32  {
33  return false;
34  }
35 
36  /*--------------------.
37  | Standard comparison |
38  `--------------------*/
39 
40  template<typename S, typename T, typename U>
41  bool op_eq(const Structure<S>&,
42  const T& v1,
43  const U& v2)
44  {
45  return v1 == v2;
46  }
47 
48  template<typename S, typename T, typename U>
49  bool op_lt(const Structure<S>&,
50  const T& v1,
51  const U& v2)
52  {
53  return v1 < v2;
54  }
55 
56 
57  template<typename S, typename V, typename T, typename U>
58  bool op_eq(const Structure<S>&,
59  const Structure<V>&,
60  const T& v1,
61  const U& v2)
62  {
63  return v1 == v2;
64  }
65 
66  template<typename S, typename V, typename T, typename U>
67  bool op_lt(const Structure<S>&,
68  const Structure<V>&,
69  const T& v1,
70  const U& v2)
71  {
72  return v1 < v2;
73  }
74 
75  /*------------.
76  | Conversions |
77  `------------*/
78 
79  template<typename S, typename R, typename T>
80  R op_convert(const Structure<S> &,
81  SELECTOR(R), const T& data)
82  {
83  return static_cast<R>(data);
84  }
85 
86  template<typename S, typename T>
87  const T& op_convert(const Structure<S>&,
88  SELECTOR(T), const T& from_data)
89  {
90  return from_data;
91  }
92 
93  template<typename S, typename T>
94  const T& op_convert(const Structure<S>& s1, SELECTOR(T),
95  const Structure<S>& s2, const T& from_data)
96  {
97  precondition(& s1 == & s2);
98  static_cast<void> (s1); static_cast<void> (s2);
99  return from_data;
100  }
101 
102  template<typename S, typename T>
103  const S& op_convert(const Structure<S>&, const Structure<T>&)
104  {
105  static_error(no_convertion_operator_available);
106  return S ();
107  }
108 
109  /*---------------------.
110  | Default construction |
111  `---------------------*/
112 
113  template<typename S, typename T>
115  {
116  return T();
117  }
118 
119  /*-----.
120  | Swap |
121  `-----*/
122 
123  template<typename S, typename T>
124  void op_swap(const Structure<S>&,
125  T& v1,
126  T& v2)
127  {
128  std::swap(v1, v2);
129  }
130 
131  /*-----------.
132  | Assignment |
133  `-----------*/
134 
135  template<typename S, typename T, typename U>
136  void
137  op_assign(const Structure<S>&, T& dst, const U& src)
138  {
139  dst = src;
140  }
141 
142  template<typename S, typename T, typename U>
143  void op_assign(const Structure<S>& s1,
144  const Structure<S>& s2,
145  T& dst,
146  const U& src)
147  {
148  precondition(& s1 == & s2);
149  (void) s2;
150  op_assign(s1.self(), dst, src);
151  }
152 
153 # define INOP_IMPL(Name) \
154  template<typename S, typename T, typename U> \
155  void op_in_ ## Name (const Structure<S>& s1, \
156  const Structure<S>& s2, \
157  T& dst, \
158  const U& arg) \
159  { \
160  precondition(& s1 == & s2); \
161  (void) s2; \
162  return op_in_ ## Name (s1.self(), dst, arg); \
163  }
164 
165  INOP_IMPL(add);
166  INOP_IMPL(sub);
167  INOP_IMPL(mul);
168  INOP_IMPL(div);
169  INOP_IMPL(mod);
170 # undef INOP_IMPL
171 
172 
173 
174 # define BINOP_IMPL(Name) \
175  template<typename S, typename T, typename U> \
176  T op_ ## Name (const Structure<S>& s1, \
177  const Structure<S>& s2, \
178  const T& v1, \
179  const U& v2) \
180  { \
181  precondition(& s1 == & s2); \
182  (void) s2; \
183  return op_ ## Name(s1.self(), v1, v2); \
184  }
185 
186  BINOP_IMPL(add);
187  BINOP_IMPL(sub);
188  BINOP_IMPL(mul);
189  BINOP_IMPL(div);
190  BINOP_IMPL(mod);
191 # undef BINOP_IMPL
192 
193  template<typename S, typename St, typename T>
194  St& op_rin(const Structure<S>& s, St& st, const T& v)
195  {
196  return st >> v;
197  }
198 
199  template<typename S, typename St, typename T>
200  St& op_rout(const Structure<S>&, St& st, const T& v)
201  {
202  st << v;
203  return st;
204  }
205 
206 } // vcsn
207 
208 #endif // ! VCSN_DESIGN_PATTERN_DEFAULT_OPS_HXX