On Friday, 17 July 2015 at 15:49:46 UTC, Roland Hadinger wrote:
On Friday, 17 July 2015 at 15:47:39 UTC, Roland Hadinger wrote:
Otherwise, I'd use templates and an alias. Maybe this will
result in faster code:
bool opIndexAssign(bool value, size_t[2] inds)
{
void impl(bool b)(size_t[2] inds)
{
static if(b)
alias btx = bts;
else
alias btx = btr;
// code from opIndexAssign goes here...
// for (size_t i = startBitInd; ...
}
if( value )
impl!true(inds);
else
impl!false(inds);
return value; // oops
}
Roland, both of your solutions work perfectly. Thank you.
You brought up the issue of performance. Performance may be an
issue for certain use-cases when the function is called many
times and the values of inds[1] - inds[0] is small (e.g less than
257). In these cases at least half the work in the function will
be done with bts/btr. However, for larger ranges there is an
optimization (not shown) that eliminates the need to call bts/btr
in the middle region of the range.
Why do you think the second solution would be faster than the
first? And do you also think that the rolled out version
replicating the code in the "if" and "else" blocks replacing bts
with btr would be even faster since it eliminates the need for
any additional function call? I guess I'll have to profile all
three versions when my program matures enough be used with a
"big" data example.
Sorry for all the questions. I really appreciate your help.
Best, Matt