mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-04 20:57:49 +00:00
109 lines
3.2 KiB
C++
109 lines
3.2 KiB
C++
|
|
#pragma once
|
|
|
|
#include "reflection/type.h"
|
|
#include "security/securitycontext.h"
|
|
#include "reflection/member.h"
|
|
#include "util/G3DCore.h"
|
|
#include "util/Region3.h"
|
|
#include "util/Region3Int16.h"
|
|
|
|
struct lua_State;
|
|
|
|
namespace RBX
|
|
{
|
|
namespace Reflection
|
|
{
|
|
class Function;
|
|
class EnumDescriptor;
|
|
|
|
// Base that describes a Function
|
|
class RBXBaseClass FunctionDescriptor : public MemberDescriptor
|
|
{
|
|
public:
|
|
enum Kind
|
|
{
|
|
Kind_Default,
|
|
Kind_Custom
|
|
};
|
|
|
|
class RBXInterface Arguments
|
|
{
|
|
public:
|
|
Variant returnValue;
|
|
|
|
virtual size_t size() const = 0;
|
|
// Place the value for the requested parameter in "value".
|
|
//
|
|
// index: 1-based index into the argument list
|
|
// returns: true if the index contains a valid argument
|
|
// value: the value to set. the function returns false then value is unchanged
|
|
virtual bool getVariant(int index, Variant& value) const = 0;
|
|
virtual bool getBool(int index, bool& value) const = 0;
|
|
virtual bool getLong(int index, long& value) const = 0;
|
|
virtual bool getDouble(int index, double& value) const = 0;
|
|
virtual bool getString(int index, std::string& value) const = 0;
|
|
virtual bool getVector3int16(int index, Vector3int16& value) const = 0;
|
|
virtual bool getRegion3int16(int index, Region3int16& value) const = 0;
|
|
virtual bool getVector3(int index, Vector3& value) const = 0;
|
|
virtual bool getRegion3(int index, Region3& value) const = 0;
|
|
virtual bool getRect(int index, Rect2D& value) const = 0;
|
|
virtual bool getObject(int index, shared_ptr<DescribedBase>& value) const = 0;
|
|
virtual bool getEnum(int index, const EnumDescriptor& desc, int& value) const = 0;
|
|
};
|
|
typedef Function ConstMember;
|
|
typedef Function Member;
|
|
|
|
protected:
|
|
SignatureDescriptor signature;
|
|
Kind kind;
|
|
FunctionDescriptor(ClassDescriptor& classDescriptor, const char* name, Security::Permissions security, Attributes attributes);
|
|
|
|
public:
|
|
const SignatureDescriptor& getSignature() const { return signature; }
|
|
|
|
Kind getKind() const { return kind; }
|
|
|
|
virtual int executeCustom(DescribedBase* instance, lua_State*) const { return 0; }
|
|
|
|
virtual void execute(DescribedBase* instance, Arguments& arguments) const = 0;
|
|
};
|
|
|
|
|
|
// A light-weight convenience class that associates a FunctionDescriptor
|
|
// with a described object to create a "Function"
|
|
class Function
|
|
{
|
|
protected:
|
|
const FunctionDescriptor* descriptor;
|
|
DescribedBase* instance;
|
|
public:
|
|
inline Function(const FunctionDescriptor& descriptor, DescribedBase* instance)
|
|
:descriptor(&descriptor),instance(instance)
|
|
{}
|
|
|
|
inline Function(const Function& other)
|
|
:descriptor(other.descriptor),instance(other.instance)
|
|
{}
|
|
inline Function& operator =(const Function& other)
|
|
{
|
|
this->descriptor = other.descriptor;
|
|
this->instance = other.instance;
|
|
return *this;
|
|
}
|
|
|
|
inline const RBX::Name& getName() const {
|
|
return descriptor->name;
|
|
}
|
|
|
|
inline const FunctionDescriptor* getDescriptor() const {
|
|
return descriptor;
|
|
}
|
|
|
|
void execute(FunctionDescriptor::Arguments& arguments) const {
|
|
return descriptor->execute(const_cast<DescribedBase*>(instance), arguments);
|
|
}
|
|
};
|
|
}
|
|
}
|