Move types into their own file;

This commit is contained in:
bjorn 2019-04-05 04:05:03 -07:00
parent 14cab6cd3c
commit 410a2810cf
4 changed files with 151 additions and 141 deletions

82
src/types.c Normal file
View File

@ -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;
}

68
src/types.h Normal file
View File

@ -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)

View File

@ -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;
}

View File

@ -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)