Commit ed2c4b4e authored by Tomáš Oberhuber's avatar Tomáš Oberhuber Committed by Tomáš Oberhuber
Browse files

Attempt for SFINAE in array assignment.

parent 7135fefb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ void arrayExample()
   /***
    * You may also assign value to all array elements ...
    */
   a2 = 0;
   a2 = 0.0;

   /***
    * ... or assign STL list and vector.
+18 −20
Original line number Diff line number Diff line
@@ -10,50 +10,48 @@

#pragma once

#include <TNL/Containers/ArrayOperations.h>
#include <TNL/Containers/Algorithms/ArrayOperations.h>

namespace TNL {
namespace Containers {
namespace Algorithms {


template< typename Array,
   typename T,
   bool isArray = TNL::IsArray< T > >
struct ArraysAsignment
{};

/**
 * \brief Specialization for array-array assignment
 */
template< typename Array,
          typename T >
struct ArraysAsignment< Array, T, true >
struct ArrayAssignment
{
   void assign( Array& a, T& t )
   static void assign( Array& a, const T& t, const typename T::ValueType* )
   {
      a.setSize( t.getSize() );
      ArrayOperations< typename Array::DeviceType, typename T::DeviceType >::
      /*a.setSize( t.getSize() );
      ArrayOperations< typename Array::DeviceType, typename T::DeviceType >::template
         copyMemory< typename Array::ValueType, typename T::ValueType, typename T::IndexType >
         ( a.getData(), t.getData(), t.getSize() );
         ( a.getData(), t.getData(), t.getSize() );*/
   };
   
   static void assign( Array& a, const T& t, const void* )
   {
      
   };
};

/**
 * \brief Specialization for array-value assignment
 */
template< typename Array,
/*template< typename Array,
          typename T >
struct ArraysAsignment< Array, T, false >
struct ArrayAssignment< Array, T, void >
{
   void assign( Array& a, T& t )
   static void assign( Array& a, const T& t )
   {
      ArrayOperations< typename Array::DeviceType >::
      ArrayOperations< typename Array::DeviceType >::template
         setMemory< typename Array::ValueType, typename Array::IndexType >
         ( a.getData(), ( typename Array::ValueType ) t, t.getSize() );
   };

};
};*/


} // namespace Algorithms
+1 −28
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ class Array : public Object
       * \param array is an array to be copied.
       */
      // Deep copy does not work because of EllpackIndexMultiMap - TODO: Fix it
      //Array( const Array& array );
      explicit Array( const Array& array );

      /**
       * \brief Bind constructor .
@@ -533,38 +533,11 @@ class Array : public Object
      mutable int* referenceCounter = nullptr;
};

template< typename Array,
          typename Data,
          bool isArray = TNL::isArray< Data >::value >
struct ArrayAssignment {};

template< typename Array,
          typename Data >
struct ArrayAssignment< Array, Data, true >
{
   static void assign( Array& a, const Data& d );
};

template< typename Array,
          typename Data >
struct ArrayAssignment< Array, Data, false >
{
   static void assign( Array& a, const Data& d );
};

template< typename Value, typename Device, typename Index >
std::ostream& operator << ( std::ostream& str, const Array< Value, Device, Index >& v );

} // namespace Containers

template< typename Value,
          typename Device,
          typename Index >
struct IsArray< Containers::Array< Value, Device, Index > >
{
   static constexpr bool value = true;
};

} // namespace TNL

#include <TNL/Containers/Array.hpp>
+2 −25
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <TNL/param-types.h>
#include <TNL/Containers/Algorithms/ArrayOperations.h>
#include <TNL/Containers/Algorithms/ArrayIO.h>
#include <TNL/Containers/Algorithms/ArrayAssignment.h>
#include <TNL/Containers/Array.h>
#include <TNL/Exceptions/ArrayWrongSize.h>

@@ -493,7 +494,7 @@ Array< Value, Device, Index >&
Array< Value, Device, Index >::
operator = ( const T& data )
{
   ArrayAssignment< ThisType, T >::assign( *this, data );
   Algorithms::ArrayAssignment< ThisType, T >::assign( *this, data );
   return ( *this );
}

@@ -699,30 +700,6 @@ std::ostream& operator << ( std::ostream& str, const Array< Value, Device, Index
   return str;
}

template< typename Array,
          typename Data >
void
ArrayAssignment< Array, Data, true >::
assign( Array& array, const Data& data )
{
   if( array.getSize() != data.getSize() )
      array.setLike( data );
   if( array.getSize() > 0 )
      Algorithms::ArrayOperations< typename Array::DeviceType, typename Data::DeviceType >::
         copyMemory( array.getData(),
                     data.getData(),
                     data.getSize() );
};

template< typename Array,
          typename Data >
void
ArrayAssignment< Array, Data, false >::
assign( Array& array, const Data& data )
{
   array.setValue( data );
};


} // namespace Containers
} // namespace TNL
+0 −10
Original line number Diff line number Diff line
@@ -155,16 +155,6 @@ template< typename Value, typename Device, typename Index >
std::ostream& operator<<( std::ostream& str, const ArrayView< Value, Device, Index >& v );

} // namespace Containers

template< typename Value,
          typename Device,
          typename Index >
struct isArray< Containers::ArrayView< Value, Device, Index > >
{
   static constexpr bool value = true;
};


} // namespace TNL

#include <TNL/Containers/ArrayView_impl.h>
Loading