Skip to content

Descriptor resolutions on compile time #371

Description

@djelovina

Code like this one

	rc = rc ? rc : grb::eWiseApply< (descr_dense) >(
		y_comp, static_cast<IOType>(0),
		mask, 
		grb::operators::left_assign_if<IOType, bool, IOType>()
	);

will fail to compile due to the static assertions in inactive part of the code

static_assert( !internal::maybe_noop< OP >::value, "Warning: you may be "

in this example from


...

// check for dense variant
if( (descr & descriptors::dense) ||
internal::getCoordinates( y ).nonzeroes() == n
) {
internal::getCoordinates( z ).assignAll();
const internal::Coordinates< reference > * const no_coordinates = nullptr;
return internal::dense_apply_generic< true, false, false, false, descr >(
internal::getRaw( z ), &alpha, no_coordinates,
internal::getRaw( y ), no_coordinates, op, n
);
}
// we are in the sparse variant
internal::getCoordinates( z ).clear();
const bool * const null_mask = nullptr;
const Coords * const null_coors = nullptr;
return internal::sparse_apply_generic< false, false, true, false, descr >(
internal::getRaw( z ), internal::getCoordinates( z ), null_mask, null_coors,
&alpha, null_coors,
internal::getRaw( y ), &( internal::getCoordinates( y ) ),
op, n
);

		// check for dense variant
		if( (descr & descriptors::dense) ||
			internal::getCoordinates( y ).nonzeroes() == n
		) {
			internal::getCoordinates( z ).assignAll();
			const internal::Coordinates< reference > * const no_coordinates = nullptr;
			 // **<<------ active code**
			return internal::dense_apply_generic< true, false, false, false, descr >(  
				 internal::getRaw( z ), &alpha, no_coordinates,
				 internal::getRaw( y ), no_coordinates, op, n
			);
		}
		
		// **<<------ inactive code**
		// we are in the sparse variant
		internal::getCoordinates( z ).clear();
		const bool * const null_mask = nullptr;
		const Coords * const null_coors = nullptr;
		//**<<------ static assert inside**
		return internal::sparse_apply_generic< false, false, true, false, descr >(    
			internal::getRaw( z ), internal::getCoordinates( z ), null_mask, null_coors,
			&alpha, null_coors,
			internal::getRaw( y ), &( internal::getCoordinates( y ) ),
			op, n
		);

In order to avoid these problems the blocks of the code should be properly guarded by static checks.
related to #370 where some statements could be better implemented with this examples

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions