digitalmars.D.learn - Checking nogc-ness of an Allocator.allocate()
- =?UTF-8?B?Tm9yZGzDtnc=?= (8/8) Jan 11 2018 How do I check whether an aggregate member function (call for a
- Per =?UTF-8?B?Tm9yZGzDtnc=?= (12/20) Jan 11 2018 Is this an ok implementation:
- Simen =?UTF-8?B?S2rDpnLDpXM=?= (10/21) Jan 11 2018 Seems to be working fine. I'd go with this version for perhaps a
- Seb (6/29) Jan 11 2018 Author of hasFunctionAttributes here.
How do I check whether an aggregate member function (call for a specific argument) is nogc or not? I want to check whether Allocator.allocate(1) (for a any Allocator) is nogc or not? Is https://dlang.org/phobos/std_traits.html#hasFunctionAttributes the way to do it?
Jan 11 2018
On Thursday, 11 January 2018 at 12:24:36 UTC, Nordlöw wrote:How do I check whether an aggregate member function (call for a specific argument) is nogc or not? I want to check whether Allocator.allocate(1) (for a any Allocator) is nogc or not? Is https://dlang.org/phobos/std_traits.html#hasFunctionAttributes the way to do it?Is this an ok implementation: enum bool isNogc(alias fun) = (isCallable!fun && (functionAttributes!fun & FunctionAttribute.nogc)); safe pure nothrow nogc unittest { static int foo(int x) nogc pure nothrow; static int goo(int x) pure nothrow; static assert(isNogc!foo); static assert(!isNogc!goo); }
Jan 11 2018
On Thursday, 11 January 2018 at 12:32:54 UTC, Per Nordlöw wrote:Is this an ok implementation: enum bool isNogc(alias fun) = (isCallable!fun && (functionAttributes!fun & FunctionAttribute.nogc)); safe pure nothrow nogc unittest { static int foo(int x) nogc pure nothrow; static int goo(int x) pure nothrow; static assert(isNogc!foo); static assert(!isNogc!goo); }Seems to be working fine. I'd go with this version for perhaps a bit more brevity and clarity: enum bool isNogc(alias fun) = hasFunctionAttributes!(fun, " nogc"); Both functionAttributes and hasFunctionAttributes already check that the argument is a callable (which function attributes should "foo" have?), so that's unnecessary. -- Simen
Jan 11 2018
On Thursday, 11 January 2018 at 13:18:47 UTC, Simen Kjærås wrote:On Thursday, 11 January 2018 at 12:32:54 UTC, Per Nordlöw wrote:Author of hasFunctionAttributes here. FYI: `hasFunctionAttributes` is exactly intended to be used how you do it. functionAttributes is only there for legacy reasons. And it works nicely with inference too: https://run.dlang.io/is/9OXZctIs this an ok implementation: enum bool isNogc(alias fun) = (isCallable!fun && (functionAttributes!fun & FunctionAttribute.nogc)); safe pure nothrow nogc unittest { static int foo(int x) nogc pure nothrow; static int goo(int x) pure nothrow; static assert(isNogc!foo); static assert(!isNogc!goo); }Seems to be working fine. I'd go with this version for perhaps a bit more brevity and clarity: enum bool isNogc(alias fun) = hasFunctionAttributes!(fun, " nogc"); Both functionAttributes and hasFunctionAttributes already check that the argument is a callable (which function attributes should "foo" have?), so that's unnecessary. -- Simen
Jan 11 2018