Skip to content

Commit fd5bf70

Browse files
author
Vladimir Dimic
committed
Add possibility for VectorView to be a temporary
1 parent ec2e55b commit fd5bf70

File tree

3 files changed

+32
-26
lines changed

3 files changed

+32
-26
lines changed

include/graphblas/base/vector.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -875,7 +875,7 @@ namespace grb {
875875
}
876876
};
877877

878-
template< typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C >
878+
template< typename T, typename View, typename StorageSchemeType, enum Backend backend, typename C, typename tmp >
879879
class VectorView { };
880880

881881
}

include/graphblas/denseref/vector.hpp

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

include/graphblas/vector.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace grb {
5050
/*
5151
* The default value of \a StorageSchemeType could also be made conditional (Dense or Sparse) depending on \a config::default_backend
5252
*/
53-
template< typename T, typename View = view::Identity< void >, typename StorageSchemeType = storage::Dense, enum Backend backend = config::default_backend, typename C = internal::DefaultCoordinates >
53+
template< typename T, typename View = view::Identity< void >, typename StorageSchemeType = storage::Dense, enum Backend backend = config::default_backend, typename C = internal::DefaultCoordinates, bool tmp = false >
5454
class VectorView;
5555

5656
}

0 commit comments

Comments
 (0)