/***
* Proyecto: Clases HARBOUR desde C
* Fichero: myclass.h
* Descripcion: Implementacion clases HARBOUR en C
* Autor: Manu Exposito 2014-22
* Version 22.10
* Fecha: 07/10/2022
*/
#pragma once
#ifndef MYCLASS_H
#define MYCLASS_H
#include "hbapicls.h"
#include "hbdefs.h"
//------------------------------------------------------------------------------
// Declaracion de clases desde C
//------------------------------------------------------------------------------
#define DEFINE_CLASS( clsName, uiVar ) \
HB_FUNC( clsName ) { static HB_USHORT usClassH = 0; \
if( usClassH == 0 ) { usClassH = hb_clsCreate( uiVar, #clsName );
#define CREATE_CLASS( clsName, uiVar ) DEFINE_CLASS( clsName , uiVar )
/* Esta es para DATAs que van a tener una funcion get y otra set */
#define VAR( clsName, szDataName, pGetFuncName, pSetFuncName ) \
hb_clsAdd( usClassH, #szDataName, HB_FUNCNAME( clsName##_##pGetFuncName ) ); \
hb_clsAdd( usClassH, "_"#szDataName, HB_FUNCNAME( clsName##_##pSetFuncName ) );
#define DATA( szDataName, pGetFuncName, pSetFuncName ) \
VAR( szDataName, pGetFuncName, pSetFuncName );
/* Esta es para DATAs que van a tener una funcion unica para get y set */
#define SETGETVAR( clsName, szDataName, pFuncName ) \
VAR( clsName, szDataName, pFuncName, pFuncName );
#define SETGETDATA( clsName, szDataName, pFuncName ) \
VAR( clsName, szDataName, pFuncName, pFuncName );
/* Metodos */
#define METHOD( clsName, szName ) \
hb_clsAdd( usClassH, #szName, HB_FUNCNAME( clsName##_##szName ) );
#define MESSAGE( clsName, szName, szMethod ) \
hb_clsAdd( usClassH, #szName, HB_FUNCNAME( clsName##_##szMethod ) );
#define EXTERNAL_METHOD( szName, pFuncName ) \
hb_clsAdd( usClassH, #szName, HB_FUNCNAME( pFuncName ) );
#define END_CLASS } hb_clsAssociate( usClassH ); }
//------------------------------------------------------------------------------
// Definicion de objetos de una clase
//------------------------------------------------------------------------------
/* Crea un objeto */
#define HB_CREATE_OBJECT( pCls, o ) \
HB_FUNC_EXEC( pCls ); o = hb_itemNew( hb_stackReturnItem() )
/* Crea un objeto a partir de un item ya existente */
#define HB_CREATE_OBJECT_ITEM( pCls, o ) \
HB_FUNC_EXEC( pCls ); hb_itemMove( ( o ), hb_stackReturnItem() )
//------------------------------------------------------------------------------
// Varios
//------------------------------------------------------------------------------
/* Añade metodos a una clase pCls ya existente */
#define ADD_METHOD( pCls, szMethodName, pFuncName ) \
( hb_clsAdd( hb_objGetClass( pCls ), szMethodName, HB_FUNCNAME( pFuncName ) ) )
/* Obtiene Self en la implemantacion de los metodos de la clase */
#define HB_PSELF() hb_stackSelfItem()
#define HB_RETURNOBJ( pSelf ) hb_itemReturnForward( ( pSelf ) )
#define HB_RETURNSELF( pSelf ) HB_RETURNOBJ( pSelf )
/* Implementacion */
#define HB_METHOD( clsName, szName ) HB_FUNC_STATIC( clsName##_##szName )
#define HB_PROCEDURE( clsName, szName ) HB_METHOD( clsName, szName )
#define HB_VAR( clsName, szName ) HB_METHOD( clsName, szName )
#define HB_DATA( clsName, szName ) HB_METHOD( clsName, szName )
/* Propiedad reflexiva */
#define HB_ISCLSOBJ( o ) HB_IS_OBJECT( ( o ) )
#define HB_CLASSNAME( o ) hb_objGetClsName( ( o ) )
#define HB_CLASSNAMESELF() hb_stackSelfItem()
/* Ejecuta un metodo del objeto pasado */
#define HB_SENDMSG hb_objSendMsg
/* Ejecuta metodos dentro de la clase */
#define HB_SELF_EXEC( clsName, mtd ) HB_FUNC_EXEC( clsName##_##mtd )
/* Devuelve el nombre interno del metodo */
#define HB_METHODNAME( clsName, pName ) ( clsName##_##pName )
/* Clona un objeto "o" con otro objeto "wo" */
#define HB_OBJCLONE( o, wo ) hb_arrayCloneTo( ( o ), ( wo ) )
/* Obtiene el valor de una data directamente por su posicion */
/* Nota: Devuelve un puntero.
void *HB_OBJGETPTR( PHB_ITEM obj, HB_UINT nPosData ) */
#define HB_OBJGETPTR( o, n ) hb_arrayGetPtr( ( o ), ( n ) )
/* Nota: Devuelve un PHB_ITEM.
PHB_ITEM HB_OBJGETITEM( PHB_ITEM obj, HB_UINT nPosData ) */
#define HB_OBJGETITEM( o, n ) hb_arrayGetItemPtr( ( o ), ( n ) )
#define HB_OBJGETDATA( o, n ) HB_OBJGETITEM( o, n )
#define HB_OBJGETVAR( o, n ) HB_OBJGETITEM( o, n )
/* Asigna un valor directamente a una data del objeto por su posicion */
/* Este para asignar un puntero */
#define HB_OBJSETPTR( o, n, p ) hb_arraySetPtr( ( o ), ( n ), ( p ) )
/* Este para asignar un ITEM */
#define HB_OBJSETITEM( o, n, v ) hb_arraySet( ( o ), ( n ), ( v ) )
#define HB_OBJSETDATA( o, n, v ) HB_OBJSETITEM( o, n, v )
#define HB_OBJSETVAR( o, n, v ) HB_OBJSETITEM( o, n, v )
//------------------------------------------------------------------------------
#endif /* MYCLASS_H */
//------------------------------------------------------------------------------