Author: Zappa
Date: 07:16:16 12/07/05
Go up one level in this thread
On December 07, 2005 at 00:49:53, Russell Reagan wrote:
>On December 06, 2005 at 13:06:01, Zappa wrote:
>
>>Yes, but I have to write it twice :) That is my problem.
>
>
>You don't have to write it twice if you use templates as generic function
>generators.
>
>
>
>First establish a handful of color-specific operations.
>
>enum Color { white, black };
>
>template <Color c>
>unsigned shift_fwd (unsigned x, unsigned n) {
> return x << n;
>}
>
>template <>
>unsigned shift_fwd<black> (unsigned x, unsigned n) {
> return x >> n;
>}
>
>
>
>Then write generic, color-blind code.
>
>// You write one, compiler generates two
>template <Color c>
>unsigned fwd_pawn_moves (unsigned x) {
> return shift_fwd<c>(x, 8) & empty_squares;
>}
>
>
>
>Now you have two functions, but you only wrote one.
>
>fwd_pawn_moves<white>(x);
>fwd_pawn_moves<black>(x);
>
>
>
>You can propagate the template parameters from a higher level if you want.
>
>template <Color c>
>int eval () {
> // ...
>
> x = fwd_pawn_moves<c>(y);
>
> // ...
>}
>
>
>
>For something this trivial, it may not be worth it. That's up to you, but
>there's the idea he was going for. At some level you'd have to have an if-else,
>switch statement, or whatever, but you'd do that anyway if you wrote two
>functions, and you only have to do it once in your program and let the rest
>propagate.
>
>if (side == white)
> return eval<white>();
>else
> return eval<black>();
>
>
>
>Personally, I would just use some math and be done with it, as an extra shift
>can't possibly be the bottleneck of your program.
>
>enum { white, black }
>
>unsigned shift_fwd (unsigned x) {
> return (x << 8) >> (side * 16);
>}
Wow, I never thought of that. You have some good ideas every now and again
Russel :)
anthony
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.