Duckstation/src/common/property.h
Connor McLaughlin 2149ab4d69 Initial commit
2019-09-11 14:00:42 +10:00

104 lines
5.8 KiB
C++

#pragma once
#include "common/types.h"
class BinaryReader;
class BinaryWriter;
class String;
enum : u32
{
MAX_PROPERTY_TABLE_NAME_LENGTH = 128,
MAX_PROPERTY_NAME_LENGTH = 128
};
enum PROPERTY_TYPE
{
PROPERTY_TYPE_BOOL,
PROPERTY_TYPE_UINT,
PROPERTY_TYPE_INT,
PROPERTY_TYPE_FLOAT,
PROPERTY_TYPE_STRING,
PROPERTY_TYPE_COUNT,
};
enum PROPERTY_FLAG
{
PROPERTY_FLAG_READ_ONLY = (1 << 0), // Property cannot be modified by user. Engine can still modify it, however.
PROPERTY_FLAG_INVOKE_CHANGE_CALLBACK_ON_CREATE =
(1 << 1), // Property change callback will be invoked when the object is being created. By default it is not.
};
struct PROPERTY_DECLARATION
{
typedef bool (*GET_PROPERTY_CALLBACK)(const void* object, const void* userdata, void* value_ptr);
typedef bool (*SET_PROPERTY_CALLBACK)(void* object, const void* userdata, const void* value_ptr);
typedef void (*PROPERTY_CHANGED_CALLBACK)(void* object, const void* userdata);
const char* Name;
PROPERTY_TYPE Type;
u32 Flags;
GET_PROPERTY_CALLBACK GetPropertyCallback;
const void* pGetPropertyCallbackUserData;
SET_PROPERTY_CALLBACK SetPropertyCallback;
const void* pSetPropertyCallbackUserData;
PROPERTY_CHANGED_CALLBACK PropertyChangedCallback;
const void* pPropertyChangedCallbackUserData;
};
bool GetPropertyValueAsString(const void* object, const PROPERTY_DECLARATION* property, String& value);
bool SetPropertyValueFromString(void* object, const PROPERTY_DECLARATION* property, const char* value);
bool WritePropertyValueToBuffer(const void* object, const PROPERTY_DECLARATION* property, BinaryWriter& writer);
bool ReadPropertyValueFromBuffer(void* object, const PROPERTY_DECLARATION* property, BinaryReader& reader);
bool EncodePropertyTypeToBuffer(PROPERTY_TYPE type, const char* value_string, BinaryWriter& writer);
namespace DefaultPropertyTableCallbacks {
// builtin functions
bool GetBool(const void* object, const void* userdata, bool* value_ptr);
bool SetBool(void* object, const void* userdata, const bool* value_ptr);
bool GetUInt(const void* object, const void* userdata, u32* value_ptr);
bool SetUInt(void* object, const void* userdata, const u32* value_ptr);
bool GetInt(const void* object, const void* userdata, s32* value_ptr);
bool SetInt(void* object, const void* userdata, const s32* value_ptr);
bool GetFloat(const void* object, const void* userdata, float* value_ptr);
bool SetFloat(void* object, const void* userdata, const float* value_ptr);
bool GetString(const void* object, const void* userdata, String* value_ptr);
bool SetString(void* object, const void* userdata, const String* value_ptr);
// static bool value
bool GetConstBool(const void* object, const void* userdata, bool* value_ptr);
} // namespace DefaultPropertyTableCallbacks
#define PROPERTY_TABLE_MEMBER(Name, Type, Flags, GetPropertyCallback, GetPropertyCallbackUserData, \
SetPropertyCallback, SetPropertyCallbackUserData, PropertyChangedCallback, \
PropertyChangedCallbackUserData) \
{Name, \
Type, \
Flags, \
(PROPERTY_DECLARATION::GET_PROPERTY_CALLBACK)(GetPropertyCallback), \
(const void*)(GetPropertyCallbackUserData), \
(PROPERTY_DECLARATION::SET_PROPERTY_CALLBACK)(SetPropertyCallback), \
(const void*)(SetPropertyCallbackUserData), \
(PROPERTY_DECLARATION::PROPERTY_CHANGED_CALLBACK)(PropertyChangedCallback), \
(const void*)(PropertyChangedCallbackUserData)},
#define PROPERTY_TABLE_MEMBER_BOOL(Name, Flags, Offset, ChangedFunc, ChangedFuncUserData) \
PROPERTY_TABLE_MEMBER(Name, PROPERTY_TYPE_BOOL, Flags, DefaultPropertyTableCallbacks::GetBool, (Offset), \
DefaultPropertyTableCallbacks::SetBool, (Offset), ChangedFunc, ChangedFuncUserData)
#define PROPERTY_TABLE_MEMBER_UINT(Name, Flags, Offset, ChangedFunc, ChangedFuncUserData) \
PROPERTY_TABLE_MEMBER(Name, PROPERTY_TYPE_INT, Flags, DefaultPropertyTableCallbacks::GetUInt, (Offset), \
DefaultPropertyTableCallbacks::SetUInt, (Offset), ChangedFunc, ChangedFuncUserData)
#define PROPERTY_TABLE_MEMBER_INT(Name, Flags, Offset, ChangedFunc, ChangedFuncUserData) \
PROPERTY_TABLE_MEMBER(Name, PROPERTY_TYPE_INT, Flags, DefaultPropertyTableCallbacks::GetInt, (Offset), \
DefaultPropertyTableCallbacks::SetInt, (Offset), ChangedFunc, ChangedFuncUserData)
#define PROPERTY_TABLE_MEMBER_FLOAT(Name, Flags, Offset, ChangedFunc, ChangedFuncUserData) \
PROPERTY_TABLE_MEMBER(Name, PROPERTY_TYPE_FLOAT, Flags, DefaultPropertyTableCallbacks::GetFloat, (Offset), \
DefaultPropertyTableCallbacks::SetFloat, (Offset), ChangedFunc, ChangedFuncUserData)
#define PROPERTY_TABLE_MEMBER_STRING(Name, Flags, Offset, ChangedFunc, ChangedFuncUserData) \
PROPERTY_TABLE_MEMBER(Name, PROPERTY_TYPE_STRING, Flags, DefaultPropertyTableCallbacks::GetString, (Offset), \
DefaultPropertyTableCallbacks::SetString, (Offset), ChangedFunc, ChangedFuncUserData)