mirror of https://github.com/bjornbytes/lovr.git
Move types into their own file;
This commit is contained in:
parent
14cab6cd3c
commit
410a2810cf
|
@ -0,0 +1,82 @@
|
|||
#include "types.h"
|
||||
#include "util.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void lovrAnimatorDestroy(void*);
|
||||
void lovrAudioStreamDestroy(void*);
|
||||
void lovrBlobDestroy(void*);
|
||||
void lovrBufferDestroy(void*);
|
||||
void lovrCanvasDestroy(void*);
|
||||
void lovrChannelDestroy(void*);
|
||||
void lovrColliderDestroy(void*);
|
||||
void lovrControllerDestroy(void*);
|
||||
void lovrCurveDestroy(void*);
|
||||
void lovrFontDestroy(void*);
|
||||
void lovrJointDestroy(void*);
|
||||
void lovrMaterialDestroy(void*);
|
||||
void lovrMeshDestroy(void*);
|
||||
void lovrMicrophoneDestroy(void*);
|
||||
void lovrModelDestroy(void*);
|
||||
void lovrModelDataDestroy(void*);
|
||||
void lovrPoolDestroy(void*);
|
||||
void lovrRandomGeneratorDestroy(void*);
|
||||
void lovrRasterizerDestroy(void*);
|
||||
void lovrShaderDestroy(void*);
|
||||
void lovrShaderBlockDestroy(void*);
|
||||
void lovrShapeDestroy(void*);
|
||||
void lovrSoundDataDestroy(void*);
|
||||
void lovrSourceDestroy(void*);
|
||||
void lovrTextureDestroy(void*);
|
||||
void lovrTextureDataDestroy(void*);
|
||||
void lovrThreadDestroy(void*);
|
||||
void lovrWorldDestroy(void*);
|
||||
#define INFO(T) [T_ ## T] = { #T, lovr ## T ## Destroy, T_NONE }
|
||||
#define SUPERINFO(T, S) [T_ ## T] = { #T, lovr ## S ## Destroy, T_ ## S }
|
||||
const TypeInfo lovrTypeInfo[T_MAX] = {
|
||||
INFO(Animator),
|
||||
INFO(AudioStream),
|
||||
SUPERINFO(BallJoint, Joint),
|
||||
INFO(Blob),
|
||||
SUPERINFO(BoxShape, Shape),
|
||||
INFO(Buffer),
|
||||
INFO(Canvas),
|
||||
SUPERINFO(CapsuleShape, Shape),
|
||||
INFO(Channel),
|
||||
INFO(Collider),
|
||||
INFO(Controller),
|
||||
INFO(Curve),
|
||||
SUPERINFO(CylinderShape, Shape),
|
||||
SUPERINFO(DistanceJoint, Joint),
|
||||
INFO(Font),
|
||||
SUPERINFO(HingeJoint, Joint),
|
||||
INFO(Joint),
|
||||
INFO(Material),
|
||||
INFO(Mesh),
|
||||
INFO(Microphone),
|
||||
INFO(Model),
|
||||
INFO(ModelData),
|
||||
INFO(Pool),
|
||||
INFO(RandomGenerator),
|
||||
INFO(Rasterizer),
|
||||
INFO(Shader),
|
||||
INFO(ShaderBlock),
|
||||
INFO(Shape),
|
||||
SUPERINFO(SliderJoint, Joint),
|
||||
INFO(SoundData),
|
||||
INFO(Source),
|
||||
SUPERINFO(SphereShape, Shape),
|
||||
INFO(Texture),
|
||||
INFO(TextureData),
|
||||
INFO(Thread),
|
||||
INFO(World)
|
||||
};
|
||||
#undef INFO
|
||||
#undef SUPERINFO
|
||||
|
||||
Ref* _lovrAlloc(size_t size, Type type) {
|
||||
Ref* ref = calloc(1, size);
|
||||
lovrAssert(ref, "Out of memory");
|
||||
ref->type = type;
|
||||
ref->count = 1;
|
||||
return ref;
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
#include <stddef.h>
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef enum {
|
||||
T_NONE = 0,
|
||||
T_vec3,
|
||||
T_quat,
|
||||
T_mat4,
|
||||
T_Animator,
|
||||
T_AudioStream,
|
||||
T_BallJoint,
|
||||
T_Blob,
|
||||
T_BoxShape,
|
||||
T_Buffer,
|
||||
T_Canvas,
|
||||
T_CapsuleShape,
|
||||
T_Channel,
|
||||
T_Collider,
|
||||
T_Controller,
|
||||
T_Curve,
|
||||
T_CylinderShape,
|
||||
T_DistanceJoint,
|
||||
T_Font,
|
||||
T_HingeJoint,
|
||||
T_Joint,
|
||||
T_Material,
|
||||
T_Mesh,
|
||||
T_Microphone,
|
||||
T_Model,
|
||||
T_ModelData,
|
||||
T_Pool,
|
||||
T_RandomGenerator,
|
||||
T_Rasterizer,
|
||||
T_Shader,
|
||||
T_ShaderBlock,
|
||||
T_Shape,
|
||||
T_SliderJoint,
|
||||
T_SoundData,
|
||||
T_Source,
|
||||
T_SphereShape,
|
||||
T_Texture,
|
||||
T_TextureData,
|
||||
T_Thread,
|
||||
T_World,
|
||||
T_MAX
|
||||
} Type;
|
||||
|
||||
typedef void lovrDestructor(void*);
|
||||
typedef struct {
|
||||
const char* name;
|
||||
lovrDestructor* destructor;
|
||||
Type super;
|
||||
} TypeInfo;
|
||||
|
||||
extern const TypeInfo lovrTypeInfo[T_MAX];
|
||||
|
||||
typedef struct {
|
||||
Type type;
|
||||
int count;
|
||||
} Ref;
|
||||
|
||||
Ref* _lovrAlloc(size_t size, Type type);
|
||||
|
||||
#define lovrAlloc(T) (T*) _lovrAlloc(sizeof(T), T_ ## T)
|
||||
#define lovrRetain(r) if (r && ++(((Ref*) r)->count) >= 0xff) lovrThrow("Ref count overflow")
|
||||
#define lovrRelease(T, r) if (r && --(((Ref*) r)->count) == 0) lovr ## T ## Destroy(r)
|
||||
#define lovrGenericRelease(r) if (r && --(((Ref*) r)->count) == 0) lovrTypeInfo[((Ref*) r)->type].destructor(r)
|
78
src/util.c
78
src/util.c
|
@ -28,81 +28,3 @@ void lovrThrow(const char* format, ...) {
|
|||
}
|
||||
}
|
||||
|
||||
void lovrAnimatorDestroy(void*);
|
||||
void lovrAudioStreamDestroy(void*);
|
||||
void lovrBlobDestroy(void*);
|
||||
void lovrBufferDestroy(void*);
|
||||
void lovrCanvasDestroy(void*);
|
||||
void lovrChannelDestroy(void*);
|
||||
void lovrColliderDestroy(void*);
|
||||
void lovrControllerDestroy(void*);
|
||||
void lovrCurveDestroy(void*);
|
||||
void lovrFontDestroy(void*);
|
||||
void lovrJointDestroy(void*);
|
||||
void lovrMaterialDestroy(void*);
|
||||
void lovrMeshDestroy(void*);
|
||||
void lovrMicrophoneDestroy(void*);
|
||||
void lovrModelDestroy(void*);
|
||||
void lovrModelDataDestroy(void*);
|
||||
void lovrPoolDestroy(void*);
|
||||
void lovrRandomGeneratorDestroy(void*);
|
||||
void lovrRasterizerDestroy(void*);
|
||||
void lovrShaderDestroy(void*);
|
||||
void lovrShaderBlockDestroy(void*);
|
||||
void lovrShapeDestroy(void*);
|
||||
void lovrSoundDataDestroy(void*);
|
||||
void lovrSourceDestroy(void*);
|
||||
void lovrTextureDestroy(void*);
|
||||
void lovrTextureDataDestroy(void*);
|
||||
void lovrThreadDestroy(void*);
|
||||
void lovrWorldDestroy(void*);
|
||||
#define INFO(T) [T_ ## T] = { #T, lovr ## T ## Destroy, T_NONE }
|
||||
#define SUPERINFO(T, S) [T_ ## T] = { #T, lovr ## S ## Destroy, T_ ## S }
|
||||
const TypeInfo lovrTypeInfo[T_MAX] = {
|
||||
INFO(Animator),
|
||||
INFO(AudioStream),
|
||||
SUPERINFO(BallJoint, Joint),
|
||||
INFO(Blob),
|
||||
SUPERINFO(BoxShape, Shape),
|
||||
INFO(Buffer),
|
||||
INFO(Canvas),
|
||||
SUPERINFO(CapsuleShape, Shape),
|
||||
INFO(Channel),
|
||||
INFO(Collider),
|
||||
INFO(Controller),
|
||||
INFO(Curve),
|
||||
SUPERINFO(CylinderShape, Shape),
|
||||
SUPERINFO(DistanceJoint, Joint),
|
||||
INFO(Font),
|
||||
SUPERINFO(HingeJoint, Joint),
|
||||
INFO(Joint),
|
||||
INFO(Material),
|
||||
INFO(Mesh),
|
||||
INFO(Microphone),
|
||||
INFO(Model),
|
||||
INFO(ModelData),
|
||||
INFO(Pool),
|
||||
INFO(RandomGenerator),
|
||||
INFO(Rasterizer),
|
||||
INFO(Shader),
|
||||
INFO(ShaderBlock),
|
||||
INFO(Shape),
|
||||
SUPERINFO(SliderJoint, Joint),
|
||||
INFO(SoundData),
|
||||
INFO(Source),
|
||||
SUPERINFO(SphereShape, Shape),
|
||||
INFO(Texture),
|
||||
INFO(TextureData),
|
||||
INFO(Thread),
|
||||
INFO(World)
|
||||
};
|
||||
#undef INFO
|
||||
#undef SUPERINFO
|
||||
|
||||
void* _lovrAlloc(size_t size, Type type) {
|
||||
Ref* ref = calloc(1, size);
|
||||
lovrAssert(ref, "Out of memory");
|
||||
ref->type = type;
|
||||
ref->count = 1;
|
||||
return ref;
|
||||
}
|
||||
|
|
64
src/util.h
64
src/util.h
|
@ -1,6 +1,7 @@
|
|||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include "types.h"
|
||||
|
||||
#pragma once
|
||||
|
||||
|
@ -37,64 +38,6 @@
|
|||
#define M_PI 3.14159265358979323846264f
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
T_NONE = 0,
|
||||
T_vec3,
|
||||
T_quat,
|
||||
T_mat4,
|
||||
T_Animator,
|
||||
T_AudioStream,
|
||||
T_BallJoint,
|
||||
T_Blob,
|
||||
T_BoxShape,
|
||||
T_Buffer,
|
||||
T_Canvas,
|
||||
T_CapsuleShape,
|
||||
T_Channel,
|
||||
T_Collider,
|
||||
T_Controller,
|
||||
T_Curve,
|
||||
T_CylinderShape,
|
||||
T_DistanceJoint,
|
||||
T_Font,
|
||||
T_HingeJoint,
|
||||
T_Joint,
|
||||
T_Material,
|
||||
T_Mesh,
|
||||
T_Microphone,
|
||||
T_Model,
|
||||
T_ModelData,
|
||||
T_Pool,
|
||||
T_RandomGenerator,
|
||||
T_Rasterizer,
|
||||
T_Shader,
|
||||
T_ShaderBlock,
|
||||
T_Shape,
|
||||
T_SliderJoint,
|
||||
T_SoundData,
|
||||
T_Source,
|
||||
T_SphereShape,
|
||||
T_Texture,
|
||||
T_TextureData,
|
||||
T_Thread,
|
||||
T_World,
|
||||
T_MAX
|
||||
} Type;
|
||||
|
||||
typedef void lovrDestructor(void*);
|
||||
typedef struct {
|
||||
const char* name;
|
||||
lovrDestructor* destructor;
|
||||
Type super;
|
||||
} TypeInfo;
|
||||
|
||||
extern const TypeInfo lovrTypeInfo[T_MAX];
|
||||
|
||||
typedef struct {
|
||||
Type type;
|
||||
int count;
|
||||
} Ref;
|
||||
|
||||
typedef struct { float r, g, b, a; } Color;
|
||||
|
||||
typedef void (*lovrErrorHandler)(void* userdata, const char* format, va_list args);
|
||||
|
@ -103,10 +46,5 @@ extern _Thread_local void* lovrErrorUserdata;
|
|||
|
||||
void lovrSetErrorCallback(lovrErrorHandler callback, void* context);
|
||||
void _Noreturn lovrThrow(const char* format, ...);
|
||||
void* _lovrAlloc(size_t size, Type type);
|
||||
|
||||
#define lovrAssert(c, ...) if (!(c)) { lovrThrow(__VA_ARGS__); }
|
||||
#define lovrAlloc(T) (T*) _lovrAlloc(sizeof(T), T_ ## T)
|
||||
#define lovrRetain(r) if (r && ++(((Ref*) r)->count) >= 0xff) lovrThrow("Ref count overflow")
|
||||
#define lovrRelease(T, r) if (r && --(((Ref*) r)->count) == 0) lovr ## T ## Destroy(r)
|
||||
#define lovrGenericRelease(r) if (r && --(((Ref*) r)->count) == 0) lovrTypeInfo[((Ref*) r)->type].destructor(r)
|
||||
|
|
Loading…
Reference in New Issue