Anuncios

Bienvenidos sean a este post, en los ultimos posts hemos visto como extender las funciones de Lua por medio de C a partir de este post veremos como extender Lua con nuevos tipos escritos en C.

Anuncios

Comenzaremos con un ejemplo simple al cual extenderemos con los siguientes posts a este con metametodos y otra cositas interesantes.

Anuncios

Nuestro tipo de ejemplo es simple: array de booleano, la principal motivacion para este ejemplo es que no necesita complejos algoritmos y esto nos permite concentrarnos en los problemas de la API, sin embargo el ejemplo es util por si mismo, por supuesto que podemos usar tablas para implementar arrays de booleanos en Lua pero una implementacion de C donde almacenamos cada entrada en un unico bit es menos del 3% de la memoria que usa una tabla, nuestra implementacion necesita la siguiente definicion:

#include <limits.h>

#define BITS_PER_WORD	(CHAR_BIT*sizeof(unsigned int))
#define I_WORD(i)	((unsigned int)(i) / BITS_PER_WORD)
#define I_BIT(i)	(1 << ((unsigned int)(i) % BITS_PER_WORD))
Anuncios

BITS_PER_WORD es el numero de bits en un entero sin signo, la macro I_WORD computa la palabra (word) cuando es almacenada el bit correspondiente para un indice informado e I_BIT computa una mascara para acceder el bit correcto dentro de esta palabra, representaremos nuestros arrays con la siguiente estructura:

typedef struct NumArray {
	int tamano;
	unsigned int valores[1];
} NumArray;
Anuncios

Declaramos al array valores con el tamaño de 1 solo como un contenedor porque C 89 no permite un array con tamaño de 0, definiremos el tamaño actual cuando ubicamos al array, la siguiente expresion da este tamaño para un array con n elementos:

sizeof(NumArray) + I_WORD(n - !)*sizeof(unsigned int)
Anuncios

No necesitamos agregar uno para I_WORD porque la estructura original ya incluye espacio para este elemento, en los proximos posts iremos viendo los distintos tipos de datos que podemos definir en C y agregarlos a Lua.

Anuncios

En resumen, hoy hemos visto una breve introduccion sobre tipos definidos por nosotros para extender Lua, una breve explicacion, un breve ejemplo y una leve introduccion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00