src/lib/lua_type.h
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 01:17:36 +0300
branchnew-lib-errors
changeset 219 cefec18b8268
parent 145 src/lua_type.h@a5582e1a83da
permissions -rw-r--r--
some of the lib/transport stuff compiles
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef LUA_TYPE_H
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define LUA_TYPE_H
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/**
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * @file
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 *
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * Convenience functions for defining "types" in lua
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include <lua5.1/lua.h>
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
// XXX: remove
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
#include <lua5.1/lauxlib.h>
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
/**
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    15
 * A type's method
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    16
 *
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    17
 * XXX: a name field?
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    19
struct lua_method {
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    20
    /** The name of the method */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    21
    const char *name;
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    23
    /** The function pointer */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    24
    lua_CFunction func;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    25
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    26
    /** The function definition, optional */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    27
    const struct lua_func *info;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    28
};
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    29
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    30
#define LUA_METHOD(name, func, info) \
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    31
    { (name), (func), (info) }
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    32
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    33
#define LUA_METHODS(...) \
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    34
    { __VA_ARGS__, { NULL, NULL, NULL } }
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
/**
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    37
 * A type
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    39
struct lua_type {
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    40
    /** The name of the type */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    41
    const char *name;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    42
};
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    43
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    44
#define LUA_TYPE(name) \
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    45
    { (name) }
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
/**
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    48
 * Register a new metadata table for the given type in the given lua state.
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    49
 *
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    50
 * This leaves the new type (metatable) on the stack.
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    52
void lua_type_register (lua_State *L, const struct lua_type *type, const struct lua_method methods[]);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    53
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    54
/**
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    55
 * Create a new instance of the given type.
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    56
 *
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    57
 * This leaves the new userdata object on the stack.
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    58
 */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    59
void* lua_type_create (lua_State *L, const struct lua_type *type, size_t size);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    60
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    61
/**
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    62
 * Create a new userdata type, and also create an instance of it, register it as a global, and return it.
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    63
 *
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    64
 * This leaves the new userdata object on the stack.
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    65
 */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    66
void* lua_type_register_global (lua_State *L, const struct lua_type *type, const struct lua_method methods[],
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    67
        const char *global_name, size_t size);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    68
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    69
/**
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    70
 * Get an object of the given type from the given stack position
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    71
 */
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    72
void* lua_type_get (lua_State *L, const struct lua_type *type, int index);
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
#endif