How to use the type system and its features.
The language interop layer of libGimbal is primarily facilitated through its low-level, C-based meta type system. The type system has two primary goals, one of which is to provide the C (and C++) programming language(s) with higher-level object-oriented constructs, and the other is to use these constructs to create a common type system for cross-langauge interoperability.
At its core, the LibGimbal Type Framework utilizes a dynamic type system, provided by the GblType API (within gimbal_type.h). This system provides a runtime type registry maintaining all type information provided by builtin or user-registered types. This registry provides object-oriented concepts such as classes, objects, interfaces, poperties, signals, and an inheritance model to both the C programming language, and any langauge which can provide glue code to a C API.
One of the things libGimabl's type system aims to do is endow C programmers with a powerful set of tools and constructs from higher-level object-oriented languages. Constructs such as inheritance, private member variables, virtual functions, interfaces, and even signals and properties become accessible to C programs. The following is an almost complete header from the ElysianVMU emulator, creating an object-oriented type for the piezoelectric Buzzer peripheral:
#ifndef EVMU_BUZZER_H
#define EVMU_BUZZER_H
#include <gimbal/meta.h>
#define EVMU_BUZZER_TYPE (GBL_TYPEOF(EvmuBuzzer))
#define EVMU_BUZZER(instance) (GBL_INSTANCE_CAST(instance, EvmuBuzzer))
#define EVMU_BUZZER_CLASS(klass) (GBL_CLASS_CAST(klass, EvmuBuzzer))
#define EVMU_BUZZER_GET_CLASS(instance) (GBL_INSTANCE_GET_CLASS(instance, EvmuBuzzer))
#define GBL_SELF_TYPE EvmuBuzzer
GBL_DECLS_BEGIN
GBL_CLASS_DERIVE(EvmuBuzzer, EvmuPeripheral)
EVMU_RESULT (*pFnPlayPcm) (GBL_SELF);
EVMU_RESULT (*pFnStopPcm) (GBL_SELF);
EVMU_RESULT (*pFnBufferPcm)(GBL_SELF);
GBL_CLASS_END
GBL_INSTANCE_DERIVE(EvmuBuzzer, EvmuPeripheral)
GBL_INSTANCE_END
)
GBL_SIGNALS(EvmuBuzzer,
)
EVMU_EXPORT
GblType EvmuBuzzer_type (
void) GBL_NOEXCEPT;
EVMU_EXPORT
GblBool EvmuBuzzer_isActive (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT
GblBool EvmuBuzzer_isConfigured (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT
GblBool EvmuBuzzer_isEnabled (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT void EvmuBuzzer_setEnabled (GBL_SELF,
EVMU_EXPORT void EvmuBuzzer_tone (GBL_CSELF,
uint16_t* pPeriod,
uint8_t* pInvPulseLen) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuBuzzer_setTone (GBL_SELF,
uint16_t period,
uint8_t invPulseLen) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuBuzzer_playTone (GBL_SELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuBuzzer_stopTone (GBL_SELF) GBL_NOEXCEPT;
EVMU_EXPORT const void* EvmuBuzzer_pcmBuffer (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT GblSize EvmuBuzzer_pcmSamples (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT GblSize EvmuBuzzer_pcmFrequency (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT float EvmuBuzzer_pcmGain (GBL_CSELF) GBL_NOEXCEPT;
GBL_DECLS_END
#undef GBL_SELF_TYPE
#endif
#define GBL_INSTANCE_TYPE
Type UUID for GblInstance.
#define GBL_UINT16_TYPE
Builtin ID for uint16_t GblVariant type.
#define GBL_FLOAT_TYPE
Builtin ID for float GblVariant type.
#define GBL_BOOL_TYPE
Builtin ID for boolean GblVariant type.
#define GBL_UINT8_TYPE
Builtin ID for uint8_t GblVariant type.
#define GBL_UINT32_TYPE
Builtin ID for uint32_t GblVariant type.
#define GBL_PROPERTIES(object,...)
Declares a list of properties for the given object/instance structure.
uint8_t GblBool
Basic boolean type, standardized to sizeof(char)