Base

Stack

public const class
{
    @content: char[]
    @length:  int
}
struct ix_base_Stack
{
      ix_base_Object        parent;
      void                  (*push)(       ix_base_Stack*  self, ix_base_Object* element );
      ix_base_Object*        (*pop)(       ix_base_Stack*  self );
const ix_base_Object_Ref*    (*top)( const ix_base_Stack*  self );
      ix_base_Stack*      (*delete)(       ix_base_Stack** self );    
};
struct ix_base_Stack_Ref
{
      ix_base_Object_Ref    parent;
      void                  (*push)(       ix_base_Stack* self, ix_base_Object* element );
      ix_base_Object*        (*pop)(       ix_base_Stack* self );
      ix_base_Object_Ref*    (*top)( const ix_base_Stack* self );
};
#endif
struct ix_base_Stack_private
{
    ix_base_Stack  public;
    ix_base_Array* elements;
    int            length;

    ix_base_Object* (*ix_base_Object_delete)( ix_base_Object** self );
};
public class Stack {

Stack content;
int    length;

Constructors

public new( content: char[] )
{
    @content = content
    @length  = content.length
}
ix_base_Stack* ix_base_Stack_new( ix_base_Stack* self )
{
    if ( !self ) self = calloc( 1, ix_base_Stack_sz() );

    if ( self )
    {
        ix_base_Object_new( (ix_base_Object*) self );
        {
            struct ix_base_Stack_private* _self = (struct ix_base_Stack_private*) self;

            _self->elements = ix_base_Array_new( NULL, 1 );
            _self->length   = 0;

            _self->ix_base_Object_delete = _self->public.parent.delete;

            _self->public.parent.delete  = (ix_base_Object*(*)(ix_base_Object**)) ix_base_Stack_delete;
            _self->public.delete         = ix_base_Stack_delete;
            _self->public.push           = ix_base_Stack_push;
            _self->public.pop            = ix_base_Stack_pop;
            _self->public.top            = ix_base_Stack_top;
        }
    }

    return self;
}
public Stack( Stack content )
{
    this.elements = new Array();
    this.length  = content.Length;
}

Destructors

ix_base_Stack*
ix_base_Stack_delete( ix_base_Stack** self )
{
    struct ix_base_Stack_private* _self = (struct ix_base_Stack_private*) *self;

    if ( _self )
    {
        _self->elements = _self->elements->delete( &_self->elements );

        *self = (ix_base_Stack*) _self->ix_base_Object_delete( (ix_base_Object**) self );
    }
    return NULL;
}
Stack delete()
{
    this.elements = null;

    return null;
}

Mutating methods

void
ix_base_Stack_push( ix_base_Stack* self, ix_base_Object* element )
{
    struct ix_base_Stack_private* _self = (struct ix_base_Stack_private*) self;

    _self->elements->set( _self->elements, element, _self->length++ );
}
ix_base_Object*
ix_base_Stack_pop( ix_base_Stack* self )
{
    struct ix_base_Stack_private* _self = (struct ix_base_Stack_private*) self;

    if ( _self->length <= 0 )
    {
        return NULL;
    }
    else
    {
        return _self->elements->remove( _self->elements, --_self->length );
    }
}

Const methods

const ix_base_Object_Ref*
ix_base_Stack_top( const ix_base_Stack* self )
{
    struct ix_base_Stack_private* _self = (struct ix_base_Stack_private*) self;

    if ( _self->length <= 0 )
    {
        return NULL;
    }
    else
    {
        return (ix_base_Object_Ref*) _self->elements->get( _self->elements, _self->length - 1 );
    }
}
unsigned long
ix_base_Stack_sz()
{
    return sizeof( struct ix_base_Stack_private ) + ix_base_Object_sz();
}

ix_base_Stack_ref*
ix_base_Stack_ref_cast( ix_base_Stack* self )
{ return (ix_base_Stack_ref*) self; }