
Nicolas Burrus <burrus_n@epita.fr> writes:
Giovanni Palma <giovanni@lrde.epita.fr> writes:
Index: integre/ChangeLog from Giovanni Palma <giovanni@lrde.epita.fr>
* ntg/utils/cast.hh: Make force use a single cast instead of delegate its work to an unsafe type.
[...]
Index: integre/ntg/utils/cast.hh --- integre/ntg/utils/cast.hh Thu, 27 Nov 2003 11:26:27 +0100 burrus_n (oln/i/26_cast.hh 1.3.1.11 640) +++ integre/ntg/utils/cast.hh Wed, 28 Jan 2004 16:22:43 +0100 palma_g (oln/i/26_cast.hh 1.3.1.11 640) @@ -70,12 +70,14 @@ | force | `------*/
+ // a cast is performed instead of a constructor (unsafe one) call + // because this last one may not be available with the good + // signature. template<class Tdest, class Tsrc> inline const Tdest force(const Tsrc& val) { - ntg_unsafe_type(Tdest) tmp (val); - return tmp; + return (Tdest)val; }
Ce code pose pb dans quels cas ? Le pb en enlevant le passage par un type unsafe, c'est qu il peut y avoir un check dynamique. L interet de cast::force est justement d assurer qu aucune verification ne sera faite. Si ce n'est pas le cas, autant utiliser directement le cast habituel sans passer par cast::force.
Le probleme rencontre concerne tout ce qui est dans /doc/demo pour la gaussienne. Concretement, lors du passage d'une image de float a une image de u_int, avec un behavior force, le passage par un type unsafe tente d'appeler unsafe::check qui genere des warning lors de la compil. Ces derniers viennent du fait que g++-3.* ne veut pas generer un int a partir d'un float sans faire de cast explicite. Ce qui m'a amener a faire la modif en ce point, c'est que quand on est dans le behavior force, le code d'origine nous ramenait un un comportement unsafe (par l'appel de cast::force), or il est specifie dans les commentaires, que ces derniers ne doivent pas se comporter de la meme maniere. Je suis ouvert a toute remarque car mon interpretation de la chose n'est peut etre pas la bonne. -- Giovanni Palma EPITA - promo 2005 - membre d'EpX - LRDE Mob. : +33 (0)6 60 97 31 74