@@ -209,19 +209,19 @@ namespace grb {
209209 * Here starts spec draft for vectorView
210210 */
211211
212- template < typename T, typename View, typename C >
213- size_t getLength ( const VectorView< T, View, storage::Dense, reference_dense, C > &v ) noexcept {
212+ template < typename T, typename View, typename C, typename tmp >
213+ size_t getLength ( const VectorView< T, View, storage::Dense, reference_dense, C, tmp > &v ) noexcept {
214214 return v._length ();
215215 }
216216
217217 /* *
218218 * Identity View over a vector container.
219219 */
220- template < typename T, typename C >
221- class VectorView < T, view::Identity< void >, storage::Dense, reference_dense, C > {
220+ template < typename T, typename C, typename tmp >
221+ class VectorView < T, view::Identity< void >, storage::Dense, reference_dense, C, tmp > {
222222
223223 private:
224- using self_type = VectorView< T, view::Identity< void >, storage::Dense, reference_dense, C >;
224+ using self_type = VectorView< T, view::Identity< void >, storage::Dense, reference_dense, C, tmp >;
225225
226226 /* ********************
227227 Storage info friends
@@ -249,25 +249,31 @@ namespace grb {
249249 /* * @see Vector::value_type. */
250250 using value_type = T;
251251
252+ /* *
253+ * @brief Any vector view type which allocates a physical container provides a version of
254+ * itself for defining a temporary vector of the same type via the \a tmp_t member type.
255+ */
256+ using tmp_t = VectorView< T, view::Identity< void >, storage::Dense, reference_dense, C, true >;
257+
252258 VectorView ( const size_t length ) : v( std::make_unique< Vector< T, reference_dense, C > >( length ) ), imf( std::make_shared< imf::Id >( length ) ), initialized( false ) {}
253259
254260 }; // class VectorView with physical container
255261
256262 /* * Identifies any reference_dense vector as an ALP vector. */
257- template < typename T, typename View, typename Storage, typename C >
258- struct is_container < VectorView< T, View, Storage, reference_dense, C > > {
263+ template < typename T, typename View, typename Storage, typename C, typename tmp >
264+ struct is_container < VectorView< T, View, Storage, reference_dense, C, tmp > > {
259265 /* * A reference_vector is an ALP object. */
260266 static const constexpr bool value = true ;
261267 };
262268
263269 /* *
264270 * Vector view of a vector only via \a view::Identity of another VectorView.
265271 */
266- template < typename T, typename VectorViewT, typename C >
267- class VectorView < T, view::Identity< VectorViewT >, storage::Dense, reference_dense, C > {
272+ template < typename T, typename VectorViewT, typename C, typename tmp >
273+ class VectorView < T, view::Identity< VectorViewT >, storage::Dense, reference_dense, C, tmp > {
268274
269275 private:
270- using self_type = VectorView< T, view::Identity< VectorViewT >, storage::Dense, reference_dense, C >;
276+ using self_type = VectorView< T, view::Identity< VectorViewT >, storage::Dense, reference_dense, C, tmp >;
271277 using target_type = VectorViewT;
272278
273279 /* ********************
@@ -311,13 +317,13 @@ namespace grb {
311317 /* *
312318 * Diagonal Vector View of a structured matrix.
313319 */
314- template < typename T, typename StructuredMatrixT, typename C >
315- class VectorView < T, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C > {
320+ template < typename T, typename StructuredMatrixT, typename C, typename tmp >
321+ class VectorView < T, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C, tmp > {
316322
317323 private:
318324 /* * Exposes the own type and the type of the VectorView object over
319325 * which this view is created. */
320- using self_type = VectorView< T, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C >;
326+ using self_type = VectorView< T, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C, tmp >;
321327 using target_type = StructuredMatrixT;
322328
323329 /* ********************
@@ -359,11 +365,11 @@ namespace grb {
359365 *
360366 * @returns A VectorView object.
361367 * */
362- template < typename StructuredMatrixT, typename C = internal::DefaultCoordinates >
363- VectorView< typename StructuredMatrixT::value_type, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C >
368+ template < typename StructuredMatrixT, typename C = internal::DefaultCoordinates, typename tmp = false >
369+ VectorView< typename StructuredMatrixT::value_type, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C, tmp >
364370 diagonal ( StructuredMatrixT &smat ) {
365371
366- VectorView< typename StructuredMatrixT::value_type, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C > smat_diag ( smat );
372+ VectorView< typename StructuredMatrixT::value_type, view::Diagonal< StructuredMatrixT >, storage::Dense, reference_dense, C, tmp > smat_diag ( smat );
367373
368374 return smat_diag;
369375 }
@@ -375,11 +381,11 @@ namespace grb {
375381 *
376382 * @returns A VectorView object.
377383 */
378- template < typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C = internal::DefaultCoordinates >
379- VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C >
380- get_view ( VectorView< T, View, StorageSchemeType, backend, C > &source ) {
384+ template < typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C = internal::DefaultCoordinates, typename tmp = false >
385+ VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C, tmp >
386+ get_view ( VectorView< T, View, StorageSchemeType, backend, C, tmp > &source ) {
381387
382- VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C > vec_view ( source );
388+ VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C, tmp > vec_view ( source );
383389
384390 return vec_view;
385391 }
@@ -394,11 +400,11 @@ namespace grb {
394400 * @returns A VectorView object.
395401 */
396402
397- template < typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C >
398- VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C >
399- get_view ( VectorView< T, View, StorageSchemeType, backend, C > &source, std::shared_ptr< imf::IMF > imf ) {
403+ template < typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C, typename tmp = false >
404+ VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C, tmp >
405+ get_view ( VectorView< T, View, StorageSchemeType, backend, C, tmp > &source, std::shared_ptr< imf::IMF > imf ) {
400406
401- VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C > vec_view ( source, imf );
407+ VectorView< T, view::Identity< VectorView< T, View, StorageSchemeType, backend, C > >, StorageSchemeType, backend, C, tmp > vec_view ( source, imf );
402408
403409 return vec_view;
404410 }
0 commit comments