GC and void[N] in struct

vit vit at vit.vit
Mon Aug 6 22:04:46 UTC 2018


On Monday, 6 August 2018 at 21:23:36 UTC, Paul Backus wrote:
> On Monday, 6 August 2018 at 20:22:36 UTC, vit wrote:
>> On Monday, 6 August 2018 at 19:56:03 UTC, Steven Schveighoffer 
>> wrote:
>>>
>>> BTW, is there a reason you aren't just using Algebraic?
>>>
>>> https://dlang.org/phobos/std_variant.html#.Algebraic
>>>
>>> -Steve
>>
>> primarily visit for Algebraic isn't pure, @nogc, @safe, 
>> nothrow.
>
> I wrote the 'sumtype' package to solve this exact problem:
>
> https://code.dlang.org/packages/sumtype

I'm using simpler (and less powerful) version with different  
visit/visitor syntax:


struct Foo{
	string foo;
}
struct Bar1{
	string bar;
}
struct Bar2{
	string bar;
}

void main()pure nothrow @safe @nogc{
	Variant!(true, Foo, Bar1, Bar2) var; ///Nullable == true
	
	static visit(T)(auto ref const(T) x, string def = ""){
		import std.experimental.all;
		
		static if(is(T == Foo)){
			return x.foo;
		}
		else static if(false
			|| is(T == Bar1)
			|| is(T == Bar2)
		){
			return x.bar;
		}
		else static if(is(T == typeof(null))){
			return def;
		}
		else static assert(0, "no impl");
	}
	
	assert(var.isa!null);
	assert(var.visitor!visit("null") == "null");
	
	var = Foo("foo");
	assert(var.isa!Foo);
	assert(var.visitor!visit == "foo");
	
	var = Bar1("bar1");
	assert(var.isa!Bar1);
	assert(var.visitor!visit == "bar1");
	
	var = Bar2("bar2");
	assert(var.isa!Bar2);
	assert(var.visitor!visit == "bar2");
	
	var = null;
	assert(var.isa!null);
	
	auto var2 = Variant!(false, Foo, Bar1, 
Bar2)(Foo("foo"));///Nullable == false
	
	assert(var2.visitor!visit == "foo");
	assert(var2.as!Foo.foo == "foo");
	
	///var2 = null;		//error, variant is not null
	

}

full code: https://dpaste.dzfl.pl/d83ecca23694


More information about the Digitalmars-d-learn mailing list