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

Reply via email to