Matthieu Garrigues a écrit :
URL:
https://svn.lrde.epita.fr/svn/oln/trunk/milena
ChangeLog:
2008-01-04 Matthieu Garrigues <garrigues(a)lrde.epita.fr>
Fix convertions between the 4 graylevels types.
s/convertion/conversion/
À changer partout (BTW, c'est le même mot en anglais et en français). :)
Ne pas hésiter à utiliser sed ou perl pour changer tout d'un bloc (sauf
dans ChangeLog, of course).
* mln/value/graylevel.hh,
* mln/value/graylevel_f.hh,
* mln/value/internal/gray_.hh,
* mln/value/internal/gray_f.hh: All these convertion now work:
gray_f -> gray_<n>, gray_f -> graylevel<n>, gray_f -> graylevel_f,
gray_<n> -> gray_f, gray_<n> -> graylevel<n>, gray_<n>
->
graylevel_f, graylevel_f -> gray_f, graylevel_f -> graylevel<n>,
graylevel_<n> -> gray_<n>, graylevel_<n> ->
graylevel_f<n>.
Ok. Mais normalement, les indications dans les entrées de ChangeLog
commencent par des phrases à l'impératif.
* tests/value/graylevel.cc: Add more tests for
convertions.
---
mln/value/graylevel.hh | 84 +++++++++------------------
mln/value/graylevel_f.hh | 96 ++++++++++++++++---------------
mln/value/internal/gray_.hh | 15 ----
mln/value/internal/gray_f.hh | 130 +++++++++++++++++++++++++++++++------------
tests/value/graylevel.cc | 41 ++++++++++---
5 files changed, 206 insertions(+), 160 deletions(-)
Index: trunk/milena/tests/value/graylevel.cc
===================================================================
--- trunk/milena/tests/value/graylevel.cc (revision 1629)
+++ trunk/milena/tests/value/graylevel.cc (revision 1630)
@@ -56,10 +56,17 @@
// }
+#define test_convertion(T1, T2, VAL) \
+{ \
+ T1(T2(VAL)); \
+ T1 test = T2(VAL); \
+ test = T2(VAL); \
+}
Il vaut mieux encapsuler ça dans un do while :
#define test_convertion(T1, T2, VAL) \
do \
{ \
T1(T2(VAL)); \
T1 test = T2(VAL); \
test = T2(VAL); \
} \
while (0)
Ça permet à la fois de
- constituer un bloc d'instructions,
- de faire que la macro soit considérée comme une instruction (qui peut
donc licitement se terminer par un point-virgule.
(Je me trompe peut-être, mais j'imagine que les utilisations du type
test_convertion(...);
doivent déclencher des warnings.)
int main()
{
using namespace mln::value;
+ using namespace mln::value::internal;
Hum, c'est suspect. Quels sont les individus de internal:: qui sont
utilisés ici ?
[...]
Index: trunk/milena/mln/value/graylevel.hh
===================================================================
--- trunk/milena/mln/value/graylevel.hh (revision 1629)
+++ trunk/milena/mln/value/graylevel.hh (revision 1630)
@@ -102,8 +102,6 @@
struct set_precise_binary_< op::div, mln::value::graylevel<n>,
mln::value::graylevel<m> >
{
typedef mln::value::internal::gray_f ret;
- // FIXME : Was...
- //typedef mln::value::internal::gray_< mlc_max_int(m, n) > ret;
};
template < unsigned n, typename I >
@@ -151,8 +149,6 @@
template < unsigned n, typename S >
struct set_precise_binary_< op::div, mln::value::graylevel<n>,
mln::value::scalar_<S> >
{
- // typedef mln_trait_op_times(mln::value::graylevel<n>,
- // mln::value::scalar_<S>) ret;
typedef mln::value::internal::gray_f ret;
};
@@ -201,49 +197,61 @@
//
// |--------------------------------------------|
- // | + || gl | glf |gray_i | int | float |
+ // | + || gl | glf |gray_n | int | float |
// |============================================|
- // |gl ||gray_i|gray_f |gray_i | X | X |
+ // |gl ||gray_n|gray_f |gray_n | X | X |
// |--------------------------------------------|
// |glf || |gray_f |gray_f | X | X |
// |--------------------------------------------|
- // |gray|| |gray_i | X | X |
+ // |gray|| |gray_n | X | X |
// |--------------------------------------------|
// |--------------------------------------------|
- // | - || gl | glf |gray_i | int | float |
+ // | - || gl | glf |gray_n | int | float |
// |============================================|
- // |gl ||gray_i|gray_f |gray_i | X | X |
+ // |gl ||gray_n|gray_f |gray_n | X | X |
// |--------------------------------------------|
// |glf || |gray_f |gray_f | X | X |
// |--------------------------------------------|
- // |gray|| |gray_i | X | X |
+ // |gray|| |gray_n | X | X |
// |--------------------------------------------|
// |--------------------------------------------|
- // | * || gl | glf |gray_i | int | float |
+ // | * || gl | glf |gray_n | int | float |
// |============================================|
- // |gl ||gray_i|gray_f |gray_i |gray_i |gray_f |
+ // |gl ||gray_n|gray_f |gray_n |gray_n |gray_f |
// |--------------------------------------------|
// |glf || |gray_f |gray_f |gray_f |gray_f |
// |--------------------------------------------|
- // |gray|| |gray_i |gray_i |gray_f |
+ // |gray|| |gray_n |gray_n |gray_f |
// |--------------------------------------------|
// |--------------------------------------------|
- // | / || gl | glf |gray_i | int | float |
+ // | / || gl | glf |gray_n | int | float |
// |============================================|
- // |gl ||gray_i|gray_f |gray_i |gray_i |gray_i |
+ // |gl ||gray_f|gray_f |gray_n |gray_f |gray_f |
// |--------------------------------------------|
// |glf || |gray_f |gray_f |gray_f |gray_f |
// |--------------------------------------------|
- // |gray|| |gray_i |gray_i |gray_f |
+ // |gray|| |gray_f |gray_f |gray_f |
// |--------------------------------------------|
- /// Valid convertions :
- // glf -> gl (round)
- // gl -> gray_i
- // gray_i-> gl
+// Valid Convertions are :
+
+// gray_f -> gray_<n>
+// gray_f -> graylevel<n>
+// gray_f -> graylevel_f
+
+// gray_<n> -> gray_f
+// gray_<n> -> graylevel<n>
+// gray_<n> -> graylevel_f
+
+// graylevel_f -> gray_f
+// graylevel_f -> graylevel<n>
+
+// graylevel_<n> -> gray_<n>
+// graylevel_<n> -> graylevel_f<n>
C'est cool ces informations ! Il faudra qu'on les fasse apparaitre dans
la documentation.
[...]
Index: trunk/milena/mln/value/graylevel_f.hh
===================================================================
--- trunk/milena/mln/value/graylevel_f.hh (revision 1629)
+++ trunk/milena/mln/value/graylevel_f.hh (revision 1630)
[...]
@@ -266,34 +252,42 @@
mln_trait_op_plus_(graylevel_f, graylevel_f)
operator+(const graylevel_f& lhs, const graylevel_f& rhs);
- // graylevel_f + Integer<I> (doesn't compile)
- template <typename I>
- graylevel_f
- operator+(const graylevel_f& lhs, const Integer<I>& i);
- // graylevel_f + Floating<I> (doesn't compile)
- template <typename I>
- graylevel_f
- operator+(const graylevel_f& lhs, const Floating<I>& i);
+ // graylevel_f + graylevel<n>
+ template <unsigned n>
+ mln_trait_op_plus(graylevel_f, graylevel<n>)
+ operator+(const graylevel_f& lhs, const graylevel<n>& rhs);
+ // graylevel<n> + graylevel_f
+ template <unsigned n>
+ mln_trait_op_plus(graylevel_f, graylevel<n>)
+ operator+(const graylevel<n>& lhs, const graylevel_f& rhs);
Attention aux indentations. C'est peut-être Emacs qui est fautif ici. Je
crois que la version 22 se comporte beaucoup mieux à ce sujet. S'il
n'est pas installé sur ta (vos) machine(s), dites-le, on fera la mise à
jour.
// graylevel_f - graylevel_f
mln_trait_op_minus_(graylevel_f, graylevel_f)
operator-(const graylevel_f& lhs, const graylevel_f& rhs);
- // graylevel_f - Integer<I> (doesn't compile)
- template <typename I>
- graylevel_f
- operator-(const graylevel_f& lhs, const Integer<I>& i);
-
- // graylevel_f - Floating<I> (doesn't compile)
- template <typename I>
- graylevel_f
- operator-(const graylevel_f& lhs, const Floating<I>& i);
-
// graylevel_f * graylevel_f
mln_trait_op_times_(graylevel_f, graylevel_f)
operator*(const graylevel_f& lhs, const graylevel_f& rhs);
+
+ // With Builtins
Terminer avec un `.'.
[...]
Index: trunk/milena/mln/value/internal/gray_f.hh
===================================================================
--- trunk/milena/mln/value/internal/gray_f.hh (revision 1629)
+++ trunk/milena/mln/value/internal/gray_f.hh (revision 1630)
[...]
@@ -94,7 +97,7 @@
// Nessecary??
S/Nessecary/Necessary/.