[Dune-devel] [Dune-Commit] [Commit] dune-common - cca8ac1: [bugfix] fix bug #1457 - FieldVector::operator*=() called with an int is ambiguous
Oliver Sander
sander at igpm.rwth-aachen.de
Tue May 20 14:46:43 CEST 2014
Hi Christian, Marco,
thanks for fixing this. However, can we have some in-code documentation with this patch?
The bug is fixes is so subtle that I'm afraid nobody will understand why the enable_if-trick
is used here in short time.
Thanks,
Oliver
Am 20.05.2014 14:40, schrieb Christian Engwer:
> New commit, appeared at Tue May 20 14:40:52 2014 +0200
> as part of the following ref changes:
>
> branch refs/heads/master updated from cf4bf4d -> b6ddd1c
>
> Browsable version: http://cgit.dune-project.org/repositories/dune-common/commit/?id=cca8ac1bf824be51aefc48f67d6050c44a682f93
>
> ======================================================================
>
> commit cca8ac1bf824be51aefc48f67d6050c44a682f93
> Author: Marco Cecchetti <mc.aquilegia at gmail.com>
> AuthorDate: Sat May 17 22:39:05 2014 +0200
> Commit: Christian Engwer <christi at dune-project.org>
> CommitDate: Tue May 20 14:37:38 2014 +0200
>
> [bugfix] fix bug #1457 - FieldVector::operator*=() called with an int is ambiguous
>
> The bug affected operators: +=, -=, *=, /=. It has been fixed by using:
> enable_if<is_convertible<ParamType, FieldVector::valueType>, ...>
>
> dune/common/densevector.hh | 41 +++++++++++++++++++++++++++++++++--------
> dune/common/test/fvectortest.cc | 2 ++
> 2 files changed, 35 insertions(+), 8 deletions(-)
>
>
>
> diff --git a/dune/common/densevector.hh b/dune/common/densevector.hh
> index 7a30b27..7ef0ec0 100644
> --- a/dune/common/densevector.hh
> +++ b/dune/common/densevector.hh
> @@ -4,6 +4,7 @@
> #define DUNE_DENSEVECTOR_HH
>
> #include <limits>
> +#include <type_traits>
>
> #include "genericiterator.hh"
> #include "ftraits.hh"
> @@ -406,32 +407,56 @@ namespace Dune {
> }
>
> //! vector space add scalar to all comps
> - derived_type& operator+= (const value_type& k)
> - {
> + template <typename ValueType>
> + typename std::enable_if<
> + std::is_convertible<ValueType, value_type>::value,
> + derived_type
> + >::type&
> + operator+= (const ValueType& kk)
> + {
> + const value_type& k = kk;
> for (size_type i=0; i<size(); i++)
> (*this)[i] += k;
> return asImp();
> }
>
> //! vector space subtract scalar from all comps
> - derived_type& operator-= (const value_type& k)
> - {
> + template <typename ValueType>
> + typename std::enable_if<
> + std::is_convertible<ValueType, value_type>::value,
> + derived_type
> + >::type&
> + operator-= (const ValueType& kk)
> + {
> + const value_type& k = kk;
> for (size_type i=0; i<size(); i++)
> (*this)[i] -= k;
> return asImp();
> }
>
> //! vector space multiplication with scalar
> - derived_type& operator*= (const value_type& k)
> - {
> + template <typename ValueType>
> + typename std::enable_if<
> + std::is_convertible<ValueType, value_type>::value,
> + derived_type
> + >::type&
> + operator*= (const ValueType& kk)
> + {
> + const value_type& k = kk;
> for (size_type i=0; i<size(); i++)
> (*this)[i] *= k;
> return asImp();
> }
>
> //! vector space division by scalar
> - derived_type& operator/= (const value_type& k)
> - {
> + template <typename ValueType>
> + typename std::enable_if<
> + std::is_convertible<ValueType, value_type>::value,
> + derived_type
> + >::type&
> + operator/= (const ValueType& kk)
> + {
> + const value_type& k = kk;
> for (size_type i=0; i<size(); i++)
> (*this)[i] /= k;
> return asImp();
> diff --git a/dune/common/test/fvectortest.cc b/dune/common/test/fvectortest.cc
> index e182145..4a323df 100644
> --- a/dune/common/test/fvectortest.cc
> +++ b/dune/common/test/fvectortest.cc
> @@ -366,6 +366,8 @@ int main()
> FieldVectorTest<int, 3>();
> FieldVectorTest<float, 3>();
> FieldVectorTest<double, 3>();
> + FieldVectorTest<int, 1>();
> + FieldVectorTest<double, 1>();
>
> test_nan();
> test_infinity_norms();
>
> _______________________________________________
> Dune-Commit mailing list
> Dune-Commit at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-commit
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 534 bytes
Desc: OpenPGP digital signature
URL: <https://lists.dune-project.org/pipermail/dune-devel/attachments/20140520/7031fdd7/attachment.sig>
More information about the Dune-devel
mailing list