www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Combining template conditions and contracts?

reply Ozan <ozan.sueel gmail.com> writes:
Is it possible to combine  template conditions and contracts?
Like in the following


T square_root(T)(T x)  if (isBasicType!T) {
in
{
     assert(x >= 0);
}
out (result)
{
     assert((result * result) <= x && (result+1) * (result+1) > x);
}
body
{
     return cast(long)std.math.sqrt(cast(real)x);
}

Compiler says no. Maybe it's a missunderstanding from my side..

Thanks & regards, Ozan
Feb 29 2016
next sibling parent Alex Parrill <initrd.gz gmail.com> writes:
On Monday, 29 February 2016 at 14:38:52 UTC, Ozan wrote:
 Is it possible to combine  template conditions and contracts?
 Like in the following


 T square_root(T)(T x)  if (isBasicType!T) {
 in
 {
     assert(x >= 0);
 }
 out (result)
 {
     assert((result * result) <= x && (result+1) * (result+1) > 
 x);
 }
 body
 {
     return cast(long)std.math.sqrt(cast(real)x);
 }

 Compiler says no. Maybe it's a missunderstanding from my side..

 Thanks & regards, Ozan
You have a spare { after the template constraint in your sample
Feb 29 2016
prev sibling next sibling parent Daniel Kozak via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> writes:
Dne 29.2.2016 v 15:38 Ozan via Digitalmars-d-learn napsal(a):
 T square_root(T)(T x)  if (isBasicType!T) {
 in
 {
     assert(x >= 0);
 }
 out (result)
 {
     assert((result * result) <= x && (result+1) * (result+1) > x);
 }
 body
 {
     return cast(long)std.math.sqrt(cast(real)x);
 } 
import std.traits; import std.math; template square_root(T) if (isBasicType!T) { auto square_root(T x) in { assert(x >= 0); } out (result) { assert((result * result) <= x && (result+1) * (result+1) > x); } body { return cast(long)std.math.sqrt(cast(real)x); } } void main() { import std.stdio: writeln; writeln(square_root(2)); }
Feb 29 2016
prev sibling parent Daniel Kozak via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> writes:
auto square_root(T)(T x) if (isBasicType!T)
in
{
     assert(x >= 0);
}
out (result)
{
     assert((result * result) <= x && (result+1) * (result+1) > x);
}
body
{
     return cast(long)std.math.sqrt(cast(real)x);
}

void main()
{
     import std.stdio: writeln;
     writeln(square_root(2));
}

Dne 29.2.2016 v 15:38 Ozan via Digitalmars-d-learn napsal(a):
 Is it possible to combine  template conditions and contracts?
 Like in the following


 T square_root(T)(T x)  if (isBasicType!T) {
 in
 {
     assert(x >= 0);
 }
 out (result)
 {
     assert((result * result) <= x && (result+1) * (result+1) > x);
 }
 body
 {
     return cast(long)std.math.sqrt(cast(real)x);
 }

 Compiler says no. Maybe it's a missunderstanding from my side..

 Thanks & regards, Ozan
Feb 29 2016