Re: How to avoid code duplication in static if branches?
04.03.2012 3:42, Andrej Mitrovic пишет: [...code...] I want to avoid writing check() twice. I only have to statically check a field of a member if it's of a certain type (Foo). One solution would be to use a boolean: void test(T)(T t) { bool isTrue = true; static if (is(T == Foo)) isTrue = t.isTrue; if (isTrue) check(); } But that kind of defeats the purpose of static if (avoiding runtime overhead). Does anyone have a trick up their sleeve for these types of situations? :) Alias maybe? void test(T)( T t ) { enum TRUE = true; static if( is(T == Foo) ) { alias t.isTrue isTrue; } else { alias TRUE isTrue; } if( isTrue ) { check(); } } This will still insert a redundant check for one of instantiations, but compiler should be able to deal with 'if(true)' checks.
Re: How to avoid code duplication in static if branches?
Andrej Mitrovic andrej.mitrov...@gmail.com wrote in message news:mailman.364.1330825349.24984.digitalmars-d-le...@puremagic.com... import std.stdio; void check() { writeln(check); } struct Foo { bool isTrue = true; } struct Bar { } void test(T)(T t) { static if (is(T == Foo)) { if (t.isTrue) check(); } else { check(); } } void main() { Foo foo; Bar bar; test(foo); test(bar); } I want to avoid writing check() twice. I only have to statically check a field of a member if it's of a certain type (Foo). One solution would be to use a boolean: void test(T)(T t) { bool isTrue = true; static if (is(T == Foo)) isTrue = t.isTrue; if (isTrue) check(); } But that kind of defeats the purpose of static if (avoiding runtime overhead). Does anyone have a trick up their sleeve for these types of situations? :) Have you checked the generated code? When the static if check fails, it should be reduced to: void test(T)(T t) { bool isTrue = true; if (isTrue) check(); } And the compiler should be able to tell that isTrue is always true. Otherwise, void test(T)(T t) { enum doCheck = is(T == Foo); bool isTrue = true; static if (is(T == Foo)) auto isTrue = t.isTrue; if (!doCheck || isTrue) check(); } The compiler takes care of it because doCheck is known at compile time.
Re: How to avoid code duplication in static if branches?
You're right it should be able do that dead-code elimination thing. Slipped my mind. :) On 3/4/12, Daniel Murphy yebbl...@nospamgmail.com wrote: Andrej Mitrovic andrej.mitrov...@gmail.com wrote in message news:mailman.364.1330825349.24984.digitalmars-d-le...@puremagic.com... import std.stdio; void check() { writeln(check); } struct Foo { bool isTrue = true; } struct Bar { } void test(T)(T t) { static if (is(T == Foo)) { if (t.isTrue) check(); } else { check(); } } void main() { Foo foo; Bar bar; test(foo); test(bar); } I want to avoid writing check() twice. I only have to statically check a field of a member if it's of a certain type (Foo). One solution would be to use a boolean: void test(T)(T t) { bool isTrue = true; static if (is(T == Foo)) isTrue = t.isTrue; if (isTrue) check(); } But that kind of defeats the purpose of static if (avoiding runtime overhead). Does anyone have a trick up their sleeve for these types of situations? :) Have you checked the generated code? When the static if check fails, it should be reduced to: void test(T)(T t) { bool isTrue = true; if (isTrue) check(); } And the compiler should be able to tell that isTrue is always true. Otherwise, void test(T)(T t) { enum doCheck = is(T == Foo); bool isTrue = true; static if (is(T == Foo)) auto isTrue = t.isTrue; if (!doCheck || isTrue) check(); } The compiler takes care of it because doCheck is known at compile time.
Re: How to avoid code duplication in static if branches?
Andrej Mitrovic wrote: ...snip... I want to avoid writing check() twice. I only have to statically check a field of a member if it's of a certain type (Foo). One solution would be to use a boolean: void test(T)(T t) { bool isTrue = true; static if (is(T == Foo)) isTrue = t.isTrue; if (isTrue) check(); } But that kind of defeats the purpose of static if (avoiding runtime overhead). Does anyone have a trick up their sleeve for these types of situations? :) There's always this: void test(T)(T t) { static if (is (T == Foo)) if (!t.isTrue) return; check(); } Jerome -- mailto:jeber...@free.fr http://jeberger.free.fr Jabber: jeber...@jabber.fr signature.asc Description: OpenPGP digital signature