Commit 4847fc94 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed assignment of const-VectorView to non-const-VectorView

parent a838c6cd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -93,8 +93,8 @@ public:
   // must match (i.e. copy-assignment cannot resize).
   ArrayView& operator=( const ArrayView& view );

   template< typename Value_, typename Device_, typename Index_ >
   ArrayView& operator=( const ArrayView< Value_, Device_, Index_ >& view );
   template< typename Array >
   ArrayView& operator=( const Array& array );


   static String getType();
+4 −4
Original line number Diff line number Diff line
@@ -123,14 +123,14 @@ operator=( const ArrayView& view )
template< typename Value,
           typename Device,
           typename Index >
   template< typename Value_, typename Device_, typename Index_ >
   template< typename Array >
ArrayView< Value, Device, Index >&
ArrayView< Value, Device, Index >::
operator=( const ArrayView< Value_, Device_, Index_ >& view )
operator=( const Array& array )
{
   TNL_ASSERT_EQ( getSize(), view.getSize(), "The sizes of the array views must be equal, views are not resizable." );
   TNL_ASSERT_EQ( getSize(), array.getSize(), "The sizes of the array views must be equal, views are not resizable." );
   if( getSize() > 0 )
      Algorithms::ArrayOperations< Device, Device_ >::copyMemory( getData(), view.getData(), getSize() );
      Algorithms::ArrayOperations< Device, typename Array::DeviceType >::copyMemory( getData(), array.getData(), getSize() );
   return *this;
}

+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ public:
   using ArrayView< Real, Device, Index >::ArrayView;
#endif

   // inherit all ArrayView's assignment operators
   using BaseType::operator=;

   // In C++14, default constructors cannot be inherited, although Clang
   // and GCC since version 7.0 inherit them.
   // https://stackoverflow.com/a/51854172
+0 −9
Original line number Diff line number Diff line
@@ -62,19 +62,16 @@ protected:

// types for which ArrayTest is instantiated
using ArrayTypes = ::testing::Types<
   Array< short,  Devices::Host, short >,
   Array< int,    Devices::Host, short >,
   Array< long,   Devices::Host, short >,
   Array< float,  Devices::Host, short >,
   Array< double, Devices::Host, short >,
   Array< MyData, Devices::Host, short >,
   Array< short,  Devices::Host, int >,
   Array< int,    Devices::Host, int >,
   Array< long,   Devices::Host, int >,
   Array< float,  Devices::Host, int >,
   Array< double, Devices::Host, int >,
   Array< MyData, Devices::Host, int >,
   Array< short,  Devices::Host, long >,
   Array< int,    Devices::Host, long >,
   Array< long,   Devices::Host, long >,
   Array< float,  Devices::Host, long >,
@@ -83,19 +80,16 @@ using ArrayTypes = ::testing::Types<
   // FIXME: this segfaults in String::~String()
//   Array< String, Devices::Host, long >,
#ifdef HAVE_CUDA
   Array< short,  Devices::Cuda, short >,
   Array< int,    Devices::Cuda, short >,
   Array< long,   Devices::Cuda, short >,
   Array< float,  Devices::Cuda, short >,
   Array< double, Devices::Cuda, short >,
   Array< MyData, Devices::Cuda, short >,
   Array< short,  Devices::Cuda, int >,
   Array< int,    Devices::Cuda, int >,
   Array< long,   Devices::Cuda, int >,
   Array< float,  Devices::Cuda, int >,
   Array< double, Devices::Cuda, int >,
   Array< MyData, Devices::Cuda, int >,
   Array< short,  Devices::Cuda, long >,
   Array< int,    Devices::Cuda, long >,
   Array< long,   Devices::Cuda, long >,
   Array< float,  Devices::Cuda, long >,
@@ -103,21 +97,18 @@ using ArrayTypes = ::testing::Types<
   Array< MyData, Devices::Cuda, long >,
#endif
#ifdef HAVE_MIC
   Array< short,  Devices::MIC, short >,
   Array< int,    Devices::MIC, short >,
   Array< long,   Devices::MIC, short >,
   Array< float,  Devices::MIC, short >,
   Array< double, Devices::MIC, short >,
   // TODO: MyData does not work on MIC
//   Array< MyData, Devices::MIC, short >,
   Array< short,  Devices::MIC, int >,
   Array< int,    Devices::MIC, int >,
   Array< long,   Devices::MIC, int >,
   Array< float,  Devices::MIC, int >,
   Array< double, Devices::MIC, int >,
   // TODO: MyData does not work on MIC
//   Array< MyData, Devices::MIC, int >,
   Array< short,  Devices::MIC, long >,
   Array< int,    Devices::MIC, long >,
   Array< long,   Devices::MIC, long >,
   Array< float,  Devices::MIC, long >,
+75 −63
Original line number Diff line number Diff line
@@ -14,7 +14,9 @@
#include <type_traits>

#include <TNL/Containers/Array.h>
#include <TNL/Containers/Vector.h>
#include <TNL/Containers/ArrayView.h>
#include <TNL/Containers/VectorView.h>

#include "gtest/gtest.h"

@@ -53,91 +55,95 @@ std::ostream& operator<<( std::ostream& str, const MyData& v )


// test fixture for typed tests
template< typename Array >
template< typename View >
class ArrayViewTest : public ::testing::Test
{
protected:
   using ArrayType = Array;
   using ViewType = ArrayView< typename Array::ValueType, typename Array::DeviceType, typename Array::IndexType >;
   using ViewType = View;
   using ArrayType = Array< typename View::ValueType, typename View::DeviceType, typename View::IndexType >;
};

// types for which ArrayViewTest is instantiated
using ArrayTypes = ::testing::Types<
   Array< short,  Devices::Host, short >,
   Array< int,    Devices::Host, short >,
   Array< long,   Devices::Host, short >,
   Array< float,  Devices::Host, short >,
   Array< double, Devices::Host, short >,
   Array< MyData, Devices::Host, short >,
   Array< short,  Devices::Host, int >,
   Array< int,    Devices::Host, int >,
   Array< long,   Devices::Host, int >,
   Array< float,  Devices::Host, int >,
   Array< double, Devices::Host, int >,
   Array< MyData, Devices::Host, int >,
   Array< short,  Devices::Host, long >,
   Array< int,    Devices::Host, long >,
   Array< long,   Devices::Host, long >,
   Array< float,  Devices::Host, long >,
   Array< double, Devices::Host, long >,
   Array< MyData, Devices::Host, long >
using ViewTypes = ::testing::Types<
   ArrayView< int,    Devices::Host, short >,
   ArrayView< long,   Devices::Host, short >,
   ArrayView< float,  Devices::Host, short >,
   ArrayView< double, Devices::Host, short >,
   ArrayView< MyData, Devices::Host, short >,
   ArrayView< int,    Devices::Host, int >,
   ArrayView< long,   Devices::Host, int >,
   ArrayView< float,  Devices::Host, int >,
   ArrayView< double, Devices::Host, int >,
   ArrayView< MyData, Devices::Host, int >,
   ArrayView< int,    Devices::Host, long >,
   ArrayView< long,   Devices::Host, long >,
   ArrayView< float,  Devices::Host, long >,
   ArrayView< double, Devices::Host, long >,
   ArrayView< MyData, Devices::Host, long >,
   // FIXME: this segfaults in String::~String()
//   , Array< String, Devices::Host, long >
//   , ArrayView< String, Devices::Host, long >,
#ifdef HAVE_CUDA
   ,
   Array< short,  Devices::Cuda, short >,
   Array< int,    Devices::Cuda, short >,
   Array< long,   Devices::Cuda, short >,
   Array< float,  Devices::Cuda, short >,
   Array< double, Devices::Cuda, short >,
   Array< MyData, Devices::Cuda, short >,
   Array< short,  Devices::Cuda, int >,
   Array< int,    Devices::Cuda, int >,
   Array< long,   Devices::Cuda, int >,
   Array< float,  Devices::Cuda, int >,
   Array< double, Devices::Cuda, int >,
   Array< MyData, Devices::Cuda, int >,
   Array< short,  Devices::Cuda, long >,
   Array< int,    Devices::Cuda, long >,
   Array< long,   Devices::Cuda, long >,
   Array< float,  Devices::Cuda, long >,
   Array< double, Devices::Cuda, long >,
   Array< MyData, Devices::Cuda, long >
   ArrayView< int,    Devices::Cuda, short >,
   ArrayView< long,   Devices::Cuda, short >,
   ArrayView< float,  Devices::Cuda, short >,
   ArrayView< double, Devices::Cuda, short >,
   ArrayView< MyData, Devices::Cuda, short >,
   ArrayView< int,    Devices::Cuda, int >,
   ArrayView< long,   Devices::Cuda, int >,
   ArrayView< float,  Devices::Cuda, int >,
   ArrayView< double, Devices::Cuda, int >,
   ArrayView< MyData, Devices::Cuda, int >,
   ArrayView< int,    Devices::Cuda, long >,
   ArrayView< long,   Devices::Cuda, long >,
   ArrayView< float,  Devices::Cuda, long >,
   ArrayView< double, Devices::Cuda, long >,
   ArrayView< MyData, Devices::Cuda, long >,
#endif
#ifdef HAVE_MIC
   ,
   Array< short,  Devices::MIC, short >,
   Array< int,    Devices::MIC, short >,
   Array< long,   Devices::MIC, short >,
   Array< float,  Devices::MIC, short >,
   Array< double, Devices::MIC, short >,
   ArrayView< int,    Devices::MIC, short >,
   ArrayView< long,   Devices::MIC, short >,
   ArrayView< float,  Devices::MIC, short >,
   ArrayView< double, Devices::MIC, short >,
   // TODO: MyData does not work on MIC
//   Array< MyData, Devices::MIC, short >,
   Array< short,  Devices::MIC, int >,
   Array< int,    Devices::MIC, int >,
   Array< long,   Devices::MIC, int >,
   Array< float,  Devices::MIC, int >,
   Array< double, Devices::MIC, int >,
//   ArrayView< MyData, Devices::MIC, short >,
   ArrayView< int,    Devices::MIC, int >,
   ArrayView< long,   Devices::MIC, int >,
   ArrayView< float,  Devices::MIC, int >,
   ArrayView< double, Devices::MIC, int >,
   // TODO: MyData does not work on MIC
//   Array< MyData, Devices::MIC, int >,
   Array< short,  Devices::MIC, long >,
   Array< int,    Devices::MIC, long >,
   Array< long,   Devices::MIC, long >,
   Array< float,  Devices::MIC, long >,
   Array< double, Devices::MIC, long >
//   ArrayView< MyData, Devices::MIC, int >,
   ArrayView< int,    Devices::MIC, long >,
   ArrayView< long,   Devices::MIC, long >,
   ArrayView< float,  Devices::MIC, long >,
   ArrayView< double, Devices::MIC, long >,
   // TODO: MyData does not work on MIC
//   Array< MyData, Devices::MIC, long >
//   ArrayView< MyData, Devices::MIC, long >,
#endif

   // all ArrayView tests should also work with VectorView
   // (but we can't test all types because the argument list would be too long...)
   VectorView< float,  Devices::Host, long >,
   VectorView< double, Devices::Host, long >
#ifdef HAVE_CUDA
   ,
   VectorView< float,  Devices::Cuda, long >,
   VectorView< double, Devices::Cuda, long >
#endif
#ifdef HAVE_MIC
   ,
   VectorView< float,  Devices::MIC, long >,
   VectorView< double, Devices::MIC, long >
#endif
>;

TYPED_TEST_CASE( ArrayViewTest, ArrayTypes );
TYPED_TEST_CASE( ArrayViewTest, ViewTypes );


TYPED_TEST( ArrayViewTest, constructors )
{
   using ArrayType = typename TestFixture::ArrayType;
   using ViewType = typename TestFixture::ViewType;
   using ConstViewType = ArrayView< const typename ArrayType::ValueType, typename ArrayType::DeviceType, typename ArrayType::IndexType >;
   using ConstViewType = VectorView< const typename ArrayType::ValueType, typename ArrayType::DeviceType, typename ArrayType::IndexType >;

   ArrayType a( 10 );
   EXPECT_EQ( a.getSize(), 10 );
@@ -410,6 +416,7 @@ TYPED_TEST( ArrayViewTest, assignmentOperator )
{
   using ArrayType = typename TestFixture::ArrayType;
   using ViewType = typename TestFixture::ViewType;
   using ConstViewType = VectorView< const typename ArrayType::ValueType, typename ArrayType::DeviceType, typename ArrayType::IndexType >;

   ArrayType a( 10 ), b( 10 );
   typename ArrayType::HostType a_host( 10 );
@@ -437,6 +444,11 @@ TYPED_TEST( ArrayViewTest, assignmentOperator )
   u_host = u;
   EXPECT_EQ( u_host, u );
   EXPECT_EQ( u_host.getData(), a_host.getData() );

   // assignment of const view to non-const view
   v.setValue( 0 );
   ConstViewType c( u );
   v = c;
}

// test works only for arithmetic types