https://github.com/ananace/ashes
Angelscript Helpers
https://github.com/ananace/ashes
Last synced: 9 months ago
JSON representation
Angelscript Helpers
- Host: GitHub
- URL: https://github.com/ananace/ashes
- Owner: ananace
- License: other
- Created: 2016-11-20T17:48:56.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2016-12-04T20:31:07.000Z (over 9 years ago)
- Last Synced: 2025-02-24T05:12:12.585Z (over 1 year ago)
- Language: C++
- Size: 15.6 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
ASHes
=====
AngelScript Helper library.
This library contains objects and methods to simplify the registering and usage of an Angelscript application interface.
Usage
-----
```c++
#include
class DataType
{
public:
struct POD
{
int data;
};
enum Value
{
One = 1,
Two,
Three,
Five = 5
};
DataType() = default;
DataType(int data);
DataType(const DataType&) = default;
~DataTYpe() = default;
DataType& operator=(const DataType&) = default;
void init();
void setData(int data);
int getData() const;
Value getValue() const;
POD toPod() const;
};
void constructData(void* mem)
{
new(mem) DataType();
}
void constructDataVal(void* mem, int data)
{
new(mem) DataType(data);
}
void constructDataCopy(void* mem, const DataType& copy)
{
new(mem) DataType(copy);
}
void destructData(DataType* mem)
{
mem->~DataType();
}
void registerAS(asIScriptEngine* eng)
{
int r = eng->RegisterObjectType("DataType", sizeof(DataType), asOBJ_VALUE | asTypeGetInfo()); assert(r >= 0);
r = eng->RegisterObjectType("DataType::POD", sizeof(DataType::POD), asOBJ_VALUE | asOBJ_POD); assert(r >= 0);
r = eng->RegisterEnum("DataType::Value"); assert(r >= 0);
r = eng->RegisterEnumValue("DataType::Value", "One", DataType::One); assert(r >= 0);
r = eng->RegisterEnumValue("DataType::Value", "Two", DataType::Two); assert(r >= 0);
r = eng->RegisterEnumValue("DataType::Value", "Three", DataType::Three); assert(r >= 0);
r = eng->RegisterEnumValue("DataType::Value", "Five", DataType::Five); assert(r >= 0);
r = eng->RegisterObjectProperty("DataType::POD", "int data", asOFFSET(DataType::POD, data)); assert(r >= 0);
r = eng->RegisterObjectBehaviour("DataType", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(constructData), asCALL_CDECL_OBJFIRST); assert(r >= 0);
r = eng->RegisterObjectBehaviour("DataType", asBEHAVE_CONSTRUCT, "void f(int)", asFUNCTION(constructDataVal), asCALL_CDECL_OBJFIRST); assert(r >= 0);
r = eng->RegisterObjectBehaviour("DataType", asBEHAVE_CONSTRUCT, "void f(DataType&in)", asFUNCTION(constructDataCopy), asCALL_CDECL_OBJFIRST); assert(r >= 0);
r = eng->RegisterObjectBehaviour("DataType", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(destructData), asCALL_CDECL_OBJFIRST); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "DataType& opAssign(DataType&in)", asMETHOD(DataType, operator=), asCALL_THISCALL); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "void init()", asMETHOD(DataType, init), asCALL_THISCALL); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "void set_Data(int)", asMETHOD(DataType, setData), asCALL_THISCALL); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "int get_Data() const", asMETHOD(DataType, getData), asCALL_THISCALL); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "DataType::Value get_Value() const", asMETHOD(DataType, getValue), asCALL_THISCALL); assert(r >= 0);
r = eng->RegisterObjectMethod("DataType", "DataType::POD get_POD() const", asMETHOD(DataType, toPod), asCALL_THISCALL); assert(r >= 0);
// Function call
auto* ctx = eng->RequestContext(); assert(ctx);
auto* type = eng->GetTypeInfoByName("DataType"); assert(type);
auto* obj = eng->CreateScriptObject(type); assert(obj);
auto* func = obj->GetMethodByName("get_POD"); assert(func);
r = ctx->Prepare(func); assert(r >= 0);
r = ctx->SetObject(obj); assert(r >= 0);
r = ctx->Execute(); assert(r >= 0);
DataType::POD value = *reinterpret_cast(ctx->GetAddressOfReturnValue());
eng->ReturnContext(ctx);
}
void registerASH(ash::Engine& eng)
{
auto dt = eng.registerValueType("DataType");
auto pod = eng.registerValueType("DataType::POD", asOBJ_POD);
auto value = eng.registerEnum("DataType::Value");
value["One"] = DataType::One;
value["Two"] = DataType::Two;
value["Three"] = DataType::Three;
value["Five"] = DataType::Five;
pod.registerProperty("data");
dt.registerCDAK();
dt.registerConstructor();
dt.registerMethod("init");
dt.registerMethod("set_Data");
dt.registerMethod("get_Data");
dt.registerMethod("get_Value");
dt.registerMethod("get_POD");
}
```