'new' class method

KennyTM~ kennytm at gmail.com
Sat Oct 25 07:21:07 PDT 2008


Yigal Chripun wrote:
> KennyTM~ wrote:
>> Yigal Chripun wrote:
>>> KennyTM~ wrote:
>>>> KennyTM~ wrote:
>>>>> Bill Baxter wrote:
>>>>>> On Sat, Oct 25, 2008 at 2:04 AM, KennyTM~ <kennytm at gmail.com> wrote:
>>>>>>
>>>>>>>>  auto a = Class();  // heap   (default)
>>>>>>>>  auto a = Struct(); // stack   (default)
>>>>>>>>
>>>>>>>>  auto a = Class.new(stack)(); // stack
>>>>>>>>  auto a = Struct.new(stack)(); // stack
>>>>>>>>
>>>>>>>>  auto a = Class.new(heap)(); // heap
>>>>>>>>  auto a = Struct.new(heap)(); // heap
>>>>>>>>
>>>>>>>>   void *addr;
>>>>>>>>   auto a = Class.new(addr)(); // placement
>>>>>>>>   auto a = Struct.new(addr)(); // placement
>>>>>>>>
>>>>>>> I strongly *oppose* using stack and heap as keywords because there
>>>>>>> are also
>>>>>>> (partly irrelevant) data structures called stack and heap, even
>>>>>>> though
>>>>>>> according to the guideline these class/structs should be named Stack
>>>>>>> and
>>>>>>> Heap.
>>>>>> Right, that's why both Benji and I proposed making them *context*
>>>>>> keywords.  Just like "Windows" is a keyword only in the context of
>>>>>> extern( ).  This would make heap and stack keywords only in the
>>>>>> context of new(  ).
>>>>>>
>>>>> I see. But with the your new(...) syntax this can't be done because it
>>>>> is ambiguous with
>>>>>
>>>>>   void* stack = allocate();
>>>>>   auto C = Class.new(stack)();
>>>>>
>>>>> The placement new syntax should use some other syntax.
>>>>>
>>>> or do it like this:
>>>>
>>>>    auto C = Class.new(placement, addr, etc)();
>>>> //--------------------^ use this to specify it is a placement new.
>>> maybe just add the concept of allocators.
>>> auto C1 = Class.new(parameters/*, Allocator = GC.DefaultAllocator */);
>>> auto C2 = Class.new(parameters, HeapAllocator); // on heap
>>> auto C3 = Class.new(parameters, StackAllocator); // on stack
>>> auto C4 = Class.new(parameters, MyPlacementNewAllocator);
>>> etc..
>>> initial Allocator hierarchy could be part of the run-time, and could be
>>> user extended to allow for placement new.
>>>
>> This can't work because parameters (I bet you mean constructor arguments
>> here) can be variadic.
> 
> I did mean the constructor arguments. The syntax itself is less
> important here, I was more talking about the concept of Allocators.
> like the ones in STL, for example.
> 
> regarding the syntax:
> a few possibilities that come to mind:
> 
> a) new!(Allocator)(args)..

Then Allocator must be known in compile time? Though also in STL.

> 
> b) Allocator is just a regular parameter which you can add to your args
> list. now the c-tor need some machinery to handle the allocator.
> I'd say something like:
> a c-tor does two things, gets memory and puts stuff into that memory.
> so the first thing a c-tor does is automatically calls a default
> Allocator for the type to get memory, *unless* you call one explicitly
> yourself. it's similar to the way a c-tor has an implicit super() call
> if you don't call that yourself only this probably will need additional
> machinery to work.

Yes. Although the problem right now is syntactical. :(

> 
> other ideas how to approach this?
> 

Use the semicolon:

   Class.new(parameters; allocator params);



More information about the Digitalmars-d mailing list