import std.stdio ;
import std.algorithm;
import std.range ;
import std.bitmanip ;
alias NODEp = NODE * ;
version (alpha)
{
class TAGREF
{
struct S
{
mixin(taggedClassRef!(
// mixin(taggedPointer!(
NODE, "p",
uint, "flag", 2));
}
NODE tag()
{
S *sp = new S ;
sp.p = new NODE ;
sp.flag = true ;
return sp.p ;
}
// return null ;
}
}
enum PtrFlag
{
A = 1 << 0,
DeepRoot = 1 << 1,
C = 1 << 2,
}
class NODE
{
NODE left, right ;
long data ;
this(long v)
{ data = v ;
writeln(__PRETTY_FUNCTION__, " Value : ", data);
}
void setl(NODE n)
{
this.left = n ;
}
void setr(NODE n)
{
this.right = n ;
}
void setd(long d)
{
this.data = d ;
}
this()
{
writeln(__PRETTY_FUNCTION__, " ", this );
}
NODE *
toleft()
{
if ( this.left !is null )
return &this.left ;
return null ;
}
NODE
toright()
{
if ( this.right !is null )
return this.right ;
return null ;
}
} ;
class CURSOR : NODE
{
mixin(taggedClassRef!(
NODE, "p",
uint, "flag", 2));
// NODE p ;
this(NODE set_to)
{
p = set_to ;
flag = PtrFlag.DeepRoot ;
}
}
int
main()
{
auto a = new NODE(6);
auto b = new NODE(9);
auto c = new NODE(11);
b.setl(a);
b.setr(c);
b.setl = a ;
b.setd = long.max - 1 ;
writeln(__FUNCTION__, " B: ", b.data);
foreach ( k ; [ a, b, c ] )
writeln(k.stringof, " : ", k.data);
auto c0 = new CURSOR(b);
// c0.set_to(b);
writeln(c0.stringof, " : ", c0.p.data);
auto np = &b ;
writeln(np.stringof, " : ", np.data);
np = np.toleft() ;
// np &= 1 ;
writeln(np.stringof, " : ", np.data);
writeln(np.stringof, " size : ", np.sizeof );
np = np.toleft() ; // null
if ( np !is null )
writeln(np.stringof, " : ", np.data);
// auto tag = TAGREF.tag();
writeln(a.stringof, " size : ", a.sizeof );
auto q = b.toright();
writeln(q.stringof, " : ", q.data);
b = b.toright();
writeln(q.stringof, " : ", q.data);
return 0 ;
}
/* Local Variables: */
/* mode: d */
/* buffer-save-without-query: t */
/* End: */