Re: How to avoid code duplication in static if branches?

2012-03-03 Thread Mantis

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?

2012-03-03 Thread Daniel Murphy
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?

2012-03-03 Thread Andrej Mitrovic
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?

2012-03-03 Thread Jérôme M. Berger
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