Alien-SmokeQt
view release on metacpan or search on metacpan
generator/smoke.h view on Meta::CPAN
public:
union StackItem; // defined below
/**
* A stack is an array of arguments, passed to a method when calling it.
*/
typedef StackItem* Stack;
enum EnumOperation {
EnumNew,
EnumDelete,
EnumFromLong,
EnumToLong
};
typedef short Index;
typedef void (*ClassFn)(Index method, void* obj, Stack args);
typedef void* (*CastFn)(void* obj, Index from, Index to);
typedef void (*EnumFn)(EnumOperation, Index, void*&, long&);
/**
* Describe one index in a given module.
*/
struct ModuleIndex {
Smoke* smoke;
Index index;
ModuleIndex() : smoke(0), index(0) {}
ModuleIndex(Smoke * s, Index i) : smoke(s), index(i) {}
inline bool operator==(const Smoke::ModuleIndex& other) const {
return index == other.index && smoke == other.smoke;
}
inline bool operator!=(const Smoke::ModuleIndex& other) const {
return index != other.index || smoke != other.smoke;
}
};
/**
* A ModuleIndex with both fields set to 0.
*/
static ModuleIndex NullModuleIndex;
typedef std::map<std::string, ModuleIndex> ClassMap;
static ClassMap classMap;
enum ClassFlags {
cf_constructor = 0x01, // has a constructor
cf_deepcopy = 0x02, // has copy constructor
cf_virtual = 0x04, // has virtual destructor
cf_namespace = 0x08, // is a namespace
cf_undefined = 0x10 // defined elsewhere
};
/**
* Describe one class.
*/
struct Class {
const char *className; // Name of the class
bool external; // Whether the class is in another module
Index parents; // Index into inheritanceList
ClassFn classFn; // Calls any method in the class
EnumFn enumFn; // Handles enum pointers
unsigned short flags; // ClassFlags
unsigned int size;
};
enum MethodFlags {
mf_static = 0x01,
mf_const = 0x02,
mf_copyctor = 0x04, // Copy constructor
mf_internal = 0x08, // For internal use only
mf_enum = 0x10, // An enum value
mf_ctor = 0x20,
mf_dtor = 0x40,
mf_protected = 0x80,
mf_attribute = 0x100, // accessor method for a field
mf_property = 0x200, // accessor method of a property
mf_virtual = 0x400,
mf_purevirtual = 0x800,
mf_signal = 0x1000, // method is a signal
mf_slot = 0x2000, // method is a slot
mf_explicit = 0x4000 // method is an 'explicit' constructor
};
/**
* Describe one method of one class.
*/
struct Method {
Index classId; // Index into classes
Index name; // Index into methodNames; real name
Index args; // Index into argumentList
unsigned char numArgs; // Number of arguments
unsigned short flags; // MethodFlags (const/static/etc...)
Index ret; // Index into types for the return type
Index method; // Passed to Class.classFn, to call method
};
/**
* One MethodMap entry maps the munged method prototype
* to the Method entry.
*
* The munging works this way:
* $ is a plain scalar
* # is an object
* ? is a non-scalar (reference to array or hash, undef)
*
* e.g. QApplication(int &, char **) becomes QApplication$?
*/
struct MethodMap {
Index classId; // Index into classes
Index name; // Index into methodNames; munged name
Index method; // Index into methods
};
enum TypeFlags {
// The first 4 bits indicate the TypeId value, i.e. which field
// of the StackItem union is used.
tf_elem = 0x0F,
// Always only one of the next three flags should be set
tf_stack = 0x10, // Stored on the stack, 'type'
tf_ptr = 0x20, // Pointer, 'type*'
tf_ref = 0x30, // Reference, 'type&'
// Can | whatever ones of these apply
tf_const = 0x40 // const argument
};
/**
* One Type entry is one argument type needed by a method.
* Type entries are shared, there is only one entry for "int" etc.
*/
struct Type {
const char *name; // Stringified type name
Index classId; // Index into classes. -1 for none
unsigned short flags; // TypeFlags
};
// We could just pass everything around using void* (pass-by-reference)
// I don't want to, though. -aw
union StackItem {
void* s_voidp;
bool s_bool;
signed char s_char;
unsigned char s_uchar;
short s_short;
unsigned short s_ushort;
int s_int;
unsigned int s_uint;
long s_long;
unsigned long s_ulong;
float s_float;
double s_double;
long s_enum;
void* s_class;
};
enum TypeId {
t_voidp,
t_bool,
t_char,
t_uchar,
t_short,
t_ushort,
t_int,
t_uint,
t_long,
t_ulong,
t_float,
t_double,
t_enum,
t_class,
t_last // number of pre-defined types
};
// Passed to constructor
/**
* The classes array defines every class for this module
*/
Class *classes;
Index numClasses;
/**
* The methods array defines every method in every class for this module
*/
Method *methods;
Index numMethods;
/**
* methodMaps maps the munged method prototypes
* to the methods entries.
*/
MethodMap *methodMaps;
Index numMethodMaps;
/**
* Array of method names, for Method.name and MethodMap.name
( run in 0.602 second using v1.01-cache-2.11-cpan-d7f47b0818f )