#ifndef FUTILE_NNODE_H_INCLUDED
#define FUTILE_NNODE_H_INCLUDED
namespace Futile {
/**
* NNode represents a node in an n-ary tree.
* T = data type
* N = number of children per node
* H = tree height
* D = node depth (distance from the root node)
*
* The entire tree is contained in a single segement of contiguous memory.
*/
template < typename T, unsigned N, unsigned H, unsigned D>
struct NNode;
namespace Private {
template < typename T, unsigned N, unsigned H, unsigned D>
struct NNodeWithParent
{
typedef NNode< T, N, H, D - 1 > Parent;
NNodeWithParent( ) :
mParent( )
{
}
const Parent * parent( ) const { return mParent; }
Parent * parent( ) { return mParent; }
Parent * mParent;
} ;
template < typename T, unsigned N, unsigned H, unsigned D>
struct NNodeWithChildren
{
typedef NNode< T, N, H, D + 1 > Child;
NNodeWithChildren( )
{
for ( std:: size_t idx = 0 ; idx < N; ++ idx)
{
Child & child = mChildren[ idx] ;
child.mParent = static_cast < NNode< T, N, H, D> * > ( this ) ;
}
}
const Child & getChild( unsigned idx) const { return mChildren[ idx] ; }
Child mChildren[ N] ;
} ;
template < unsigned D>
struct NNodeCore
{
enum
{
Depth = D
} ;
} ;
} // namespace Private
/**
* NNodeBase
*/
template < typename T, unsigned N, unsigned H>
struct NNodeBase
{
typedef T DataType;
enum {
ChildCount = N,
TreeHeight = H
} ;
NNodeBase( ) :
mData( )
{
}
DataType mData;
} ;
/**
* Root node:
* -> node depth = 0
* -> no parent
*/
template < typename T, unsigned N, unsigned H>
struct NNode< T, N, H, 0 > : NNodeBase< T, N, H> ,
Private:: NNodeCore < 0 > ,
Private:: NNodeWithChildren < T, N, H, 0 >
{
NNode( ) :
Private:: NNodeCore < 0 > ( ) ,
Private:: NNodeWithChildren < T, N, H, 0 > ( )
{
}
} ;
/**
* Leaf node:
* -> node depth = tree height
* -> no children
*/
template < typename T, unsigned N, unsigned H>
struct NNode< T, N, H, H> : NNodeBase< T, N, H> ,
Private:: NNodeWithParent < T, N, H, H> ,
Private:: NNodeCore < H>
{
typedef NNode< T, N, H, H - 1 > Parent;
NNode( ) :
Private:: NNodeWithParent < T, N, H, H> ( ) ,
Private:: NNodeCore < H> ( )
{
}
} ;
/**
* NNode represents a node in an n-ary tree.
* T = data type
* N = number of children per node
* H = tree height
* D = node depth (distance from the root node)
*
* The entire tree is contained in a single segement of contiguous memory.
*/
template < typename T, unsigned N, unsigned H, unsigned D>
struct NNode : NNodeBase< T, N, H> ,
Private:: NNodeWithParent < T, N, H, D> ,
Private:: NNodeCore < D> ,
Private:: NNodeWithChildren < T, N, H, D>
{
typedef NNode< T, N, H, D - 1 > Parent;
NNode( ) :
Private:: NNodeWithParent < T, N, H, D> ( ) ,
Private:: NNodeCore < D> ( ) ,
Private:: NNodeWithChildren < T, N, H, D> ( )
{
}
} ;
/**
* For the root node you can either use:
* - NNode<T, N, H, 0>
* - RootNode<T, N, H>
*/
template < typename T, unsigned N, unsigned H>
struct RootNode : public NNode< T, N, H, 0 >
{
} ;
} // namespace Futile
#endif // FUTILE_NNODE_H_INCLUDED
I2lmbmRlZiBGVVRJTEVfTk5PREVfSF9JTkNMVURFRAojZGVmaW5lIEZVVElMRV9OTk9ERV9IX0lOQ0xVREVECgoKbmFtZXNwYWNlIEZ1dGlsZSB7CgoKLyoqCiAqIE5Ob2RlIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIG4tYXJ5IHRyZWUuCiAqIFQgPSBkYXRhIHR5cGUKICogTiA9IG51bWJlciBvZiBjaGlsZHJlbiBwZXIgbm9kZQogKiBIID0gdHJlZSBoZWlnaHQKICogRCA9IG5vZGUgZGVwdGggKGRpc3RhbmNlIGZyb20gdGhlIHJvb3Qgbm9kZSkKICoKICogVGhlIGVudGlyZSB0cmVlIGlzIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBzZWdlbWVudCBvZiBjb250aWd1b3VzIG1lbW9yeS4KICovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sIHVuc2lnbmVkIEgsIHVuc2lnbmVkIEQ+CnN0cnVjdCBOTm9kZTsKCgpuYW1lc3BhY2UgUHJpdmF0ZSB7CgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTiwgdW5zaWduZWQgSCwgdW5zaWduZWQgRD4Kc3RydWN0IE5Ob2RlV2l0aFBhcmVudAp7CiAgICB0eXBlZGVmIE5Ob2RlPFQsIE4sIEgsIEQgLSAxPiBQYXJlbnQ7CgogICAgTk5vZGVXaXRoUGFyZW50KCkgOgogICAgICAgIG1QYXJlbnQoKQogICAgewogICAgfQoKICAgIGNvbnN0IFBhcmVudCAqIHBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIG1QYXJlbnQ7IH0KCiAgICBQYXJlbnQgKiBwYXJlbnQoKSB7IHJldHVybiBtUGFyZW50OyB9CgogICAgUGFyZW50ICogbVBhcmVudDsKfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOLCB1bnNpZ25lZCBILCB1bnNpZ25lZCBEPgpzdHJ1Y3QgTk5vZGVXaXRoQ2hpbGRyZW4KewogICAgdHlwZWRlZiBOTm9kZTxULCBOLCBILCBEICsgMT4gQ2hpbGQ7CiAgICBOTm9kZVdpdGhDaGlsZHJlbigpCiAgICB7CiAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpZHggPSAwOyBpZHggPCBOOyArK2lkeCkKICAgICAgICB7CiAgICAgICAgICAgIENoaWxkICYgY2hpbGQgPSBtQ2hpbGRyZW5baWR4XTsKICAgICAgICAgICAgY2hpbGQubVBhcmVudCA9IHN0YXRpY19jYXN0PCBOTm9kZTxULCBOLCBILCBEPiogPih0aGlzKTsKICAgICAgICB9CiAgICB9CgogICAgY29uc3QgQ2hpbGQgJiBnZXRDaGlsZCh1bnNpZ25lZCBpZHgpIGNvbnN0IHsgcmV0dXJuIG1DaGlsZHJlbltpZHhdOyB9CgogICAgQ2hpbGQgbUNoaWxkcmVuW05dOwp9OwoKCnRlbXBsYXRlPHVuc2lnbmVkIEQ+CnN0cnVjdCBOTm9kZUNvcmUKewogICAgZW51bQogICAgewogICAgICAgIERlcHRoID0gRAogICAgfTsKfTsKCgp9IC8vIG5hbWVzcGFjZSBQcml2YXRlCgoKCi8qKgogKiBOTm9kZUJhc2UKICovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sIHVuc2lnbmVkIEg+CnN0cnVjdCBOTm9kZUJhc2UKewogICAgdHlwZWRlZiBUIERhdGFUeXBlOwogICAgZW51bSB7CiAgICAgICAgQ2hpbGRDb3VudCA9IE4sCiAgICAgICAgVHJlZUhlaWdodCA9IEgKICAgIH07CgogICAgTk5vZGVCYXNlKCkgOgogICAgICAgIG1EYXRhKCkKICAgIHsKICAgIH0KCiAgICBEYXRhVHlwZSBtRGF0YTsKfTsKCgovKioKICogUm9vdCBub2RlOgogKiAtPiBub2RlIGRlcHRoID0gMAogKiAtPiBubyBwYXJlbnQKICovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sIHVuc2lnbmVkIEg+CnN0cnVjdCBOTm9kZTxULCBOLCBILCAwPiA6IE5Ob2RlQmFzZTxULCBOLCBIPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZTo6Tk5vZGVDb3JlPDA+LAogICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YXRlOjpOTm9kZVdpdGhDaGlsZHJlbjxULCBOLCBILCAwPgp7CiAgICBOTm9kZSgpIDoKICAgICAgICBQcml2YXRlOjpOTm9kZUNvcmU8MD4oKSwKICAgICAgICBQcml2YXRlOjpOTm9kZVdpdGhDaGlsZHJlbjxULCBOLCBILCAwPigpCiAgICB7CiAgICB9Cn07CgoKLyoqCiAqIExlYWYgbm9kZToKICogLT4gbm9kZSBkZXB0aCA9IHRyZWUgaGVpZ2h0CiAqIC0+IG5vIGNoaWxkcmVuCiAqLwp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOLCB1bnNpZ25lZCBIPgpzdHJ1Y3QgTk5vZGU8VCwgTiwgSCwgSD4gOiBOTm9kZUJhc2U8VCwgTiwgSD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGU6Ok5Ob2RlV2l0aFBhcmVudDxULCBOLCBILCBIPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZTo6Tk5vZGVDb3JlPEg+CnsKICAgIHR5cGVkZWYgTk5vZGU8VCwgTiwgSCwgSCAtIDE+IFBhcmVudDsKICAgIE5Ob2RlKCkgOgogICAgICAgIFByaXZhdGU6Ok5Ob2RlV2l0aFBhcmVudDxULCBOLCBILCBIPigpLAogICAgICAgIFByaXZhdGU6Ok5Ob2RlQ29yZTxIPigpCiAgICB7CiAgICB9Cn07CgoKLyoqCiAqIE5Ob2RlIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIG4tYXJ5IHRyZWUuCiAqIFQgPSBkYXRhIHR5cGUKICogTiA9IG51bWJlciBvZiBjaGlsZHJlbiBwZXIgbm9kZQogKiBIID0gdHJlZSBoZWlnaHQKICogRCA9IG5vZGUgZGVwdGggKGRpc3RhbmNlIGZyb20gdGhlIHJvb3Qgbm9kZSkKICoKICogVGhlIGVudGlyZSB0cmVlIGlzIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBzZWdlbWVudCBvZiBjb250aWd1b3VzIG1lbW9yeS4KICovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sIHVuc2lnbmVkIEgsIHVuc2lnbmVkIEQ+CnN0cnVjdCBOTm9kZSA6IE5Ob2RlQmFzZTxULCBOLCBIPiwKICAgICAgICAgICAgICAgUHJpdmF0ZTo6Tk5vZGVXaXRoUGFyZW50PFQsIE4sIEgsIEQ+LAogICAgICAgICAgICAgICBQcml2YXRlOjpOTm9kZUNvcmU8RD4sCiAgICAgICAgICAgICAgIFByaXZhdGU6Ok5Ob2RlV2l0aENoaWxkcmVuPFQsIE4sIEgsIEQ+CnsKICAgIHR5cGVkZWYgTk5vZGU8VCwgTiwgSCwgRCAtIDE+IFBhcmVudDsKCiAgICBOTm9kZSgpIDoKICAgICAgICBQcml2YXRlOjpOTm9kZVdpdGhQYXJlbnQ8VCwgTiwgSCwgRD4oKSwKICAgICAgICBQcml2YXRlOjpOTm9kZUNvcmU8RD4oKSwKICAgICAgICBQcml2YXRlOjpOTm9kZVdpdGhDaGlsZHJlbjxULCBOLCBILCBEPigpCiAgICB7CiAgICB9Cn07CgoKLyoqCiAqIEZvciB0aGUgcm9vdCBub2RlIHlvdSBjYW4gZWl0aGVyIHVzZToKICogLSBOTm9kZTxULCBOLCBILCAwPgogKiAtIFJvb3ROb2RlPFQsIE4sIEg+CiAqLwp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOLCB1bnNpZ25lZCBIPgpzdHJ1Y3QgUm9vdE5vZGUgOiBwdWJsaWMgTk5vZGU8VCwgTiwgSCwgMD4KewoKfTsKCgp9IC8vIG5hbWVzcGFjZSBGdXRpbGUKCgojZW5kaWYgLy8gRlVUSUxFX05OT0RFX0hfSU5DTFVERUQ=