From 410a2810cf70868402656c387142ed1175f87904 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 5 Apr 2019 04:05:03 -0700 Subject: [PATCH] Move types into their own file; --- src/types.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/types.h | 68 ++++++++++++++++++++++++++++++++++++++++++++ src/util.c | 78 -------------------------------------------------- src/util.h | 64 +---------------------------------------- 4 files changed, 151 insertions(+), 141 deletions(-) create mode 100644 src/types.c create mode 100644 src/types.h diff --git a/src/types.c b/src/types.c new file mode 100644 index 00000000..2ea37cc1 --- /dev/null +++ b/src/types.c @@ -0,0 +1,82 @@ +#include "types.h" +#include "util.h" +#include + +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; +} diff --git a/src/types.h b/src/types.h new file mode 100644 index 00000000..9a64ffd4 --- /dev/null +++ b/src/types.h @@ -0,0 +1,68 @@ +#include + +#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) diff --git a/src/util.c b/src/util.c index cc93cdb2..b405ce6f 100644 --- a/src/util.c +++ b/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; -} diff --git a/src/util.h b/src/util.h index dc0e45f8..b573544b 100644 --- a/src/util.h +++ b/src/util.h @@ -1,6 +1,7 @@ #include #include #include +#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)