Object oriented programming in C

Object Oriented C framework:
- work in progress -

Header-File:

/* forward declaration */
typedef struct _MemMng_ MemMng_;
typedef struct _MemMng_Attribs MemMng_Attribs;

/* actual c-type class of memory manager */
typedef struct _MemMng_Class
{
    const char* name;

    /* general */
    void (*Initialize)( MemMng_* me );
    void (*Cyclic)( MemMng_* me );
    void (*Manage)( MemMng_* me, void* data );

  }MemMng_Class;

PUBLIC MemMng_Class* MemMng_instance_MemMngClass( void );
PUBLIC MemMng_* MemMng_instance_MemMng( void );


Source-File:

struct _MemMng_
{
    const MemMng_Class* isa;
    MemMng_Attribs* attribs;
};

struct _MemMng_Attribs
{
    /* states */
    boolean m_isInitialized;
};

STATIC MemMng_ MemMng_instance;

STATIC void initialize_class_MemMng( MemMng_* me ){ } 

STATIC void cyclic_class_MemMng( MemMng_* me  ){}

STATIC void manage_class_MemMng( MemMng_* me, void* data ){}

STATIC MemMng_Class MemMng_ClassObject =
{
        /* name */
        "MemoryManagerClass",

        /* general */
        initialize_class_MemMng,
        cyclic_class_MemMng,
        manage_class_MemMng

}

STATIC MemMng_Attribs MemMng_AttribsInstance;

STATIC boolean ptr_to_instances_initialized = FALSE;

PUBLIC MemMng_Class* MemMng_instance_MemMngClass( void ){


    if( TRUE == ptr_to_instances_initialized{


        return &MemMng_ClassObject;
    }

    return NULL;
}


/* we only allow singleton of a memory manager */
PUBLIC MemMng_* MemMng_instance_MemMng( void ){


    /* configure mem_mng */
    if( (MemMng_instance.isa != &MemMng_ClassObject) &&
        (MemMng_instance.attribs != &MemMng_AttribsInstance)){


        MemMng_instance.isa = &MemMng_ClassObject;
        MemMng_instance.attribs = &MemMng_AttribsInstance;

        ptr_to_instances_initialized = TRUE;

    }

    return &MemMng_instance;
}





No comments:

Post a Comment