Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions ElunaTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,6 @@ class ElunaObjectValueImpl : public ElunaObject
T _obj;
};

#define ELUNA_MATH_OP(type, func, op) \
template<> \
int ElunaTemplate<type>::func(lua_State* L) { \
return ElunaTemplateHelper<type>::PerformOp(L, std::op()); \
}

#define ELUNA_SIMPLE_FORWARD(type, func) \
template<> \
int ElunaTemplate<type>::func(lua_State* L) { \
return ElunaTemplateHelper<type>::func(L); \
}

#define MAKE_ELUNA_OBJECT_VALUE_IMPL(type) \
template <> \
class ElunaObjectImpl<type> : public ElunaObjectValueImpl<type> \
Expand Down Expand Up @@ -508,48 +496,4 @@ class ElunaTemplate

template<typename T> const char* ElunaTemplate<T>::tname = NULL;

template <typename T>
class ElunaTemplateHelper
{
public:
static int PerformOp(lua_State* L, std::function<T(T, T)> op)
{
Eluna* E = Eluna::GetEluna(L);
T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(op(val1, val2));
return 1;
}

static int PerformOp(lua_State* L, std::function<T(T)> op)
{
Eluna* E = Eluna::GetEluna(L);

T val = E->CHECKVAL<T>(1);
E->Push(op(val));
return 1;
}

static int ToString(lua_State* L)
{
Eluna* E = Eluna::GetEluna(L);

T val = E->CHECKVAL<T>(1);
std::ostringstream ss;
ss << val;
E->Push(ss.str());
return 1;
}

static int Pow(lua_State* L)
{
Eluna* E = Eluna::GetEluna(L);

T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(static_cast<T>(powl(static_cast<long double>(val1), static_cast<long double>(val2))));
return 1;
}
};

#endif
147 changes: 147 additions & 0 deletions methods/CMangos/BigIntMethods.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*
* Copyright (C) 2010 - 2025 Eluna Lua Engine <https://elunaluaengine.github.io/>
* This program is free software licensed under GPL version 3
* Please see the included DOCS/LICENSE.md for more information
*/

#ifndef BIGINTMETHODS_H
#define BIGINTMETHODS_H

namespace LuaBigInt
{
template <typename T, typename Op>
constexpr int PerformOp(Eluna* E, Op op)
{
T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(op(val1, val2));
return 1;
}

template<typename T>
int Add(Eluna* E, T*)
{
return PerformOp<T>(E, std::plus<T>{});
}

template<typename T>
int Subtract(Eluna* E, T*)
{
return PerformOp<T>(E, std::minus<T>{});
}

template<typename T>
int Multiply(Eluna* E, T*)
{
return PerformOp<T>(E, std::multiplies<T>{});
}

template<typename T>
int Divide(Eluna* E, T*)
{
return PerformOp<T>(E, std::divides<T>{});
}

template<typename T>
int Mod(Eluna* E, T*)
{
return PerformOp<T>(E, std::modulus<T>{});
}

template<typename T>
int UnaryMinus(Eluna* E, T*)
{
T val = E->CHECKVAL<T>(1);
E->Push(std::negate<T>{}(val));
return 1;
}

template<typename T>
int Equal(Eluna* E, T*)
{
return PerformOp<T>(E, std::equal_to<T>{});
}

template<typename T>
int Less(Eluna* E, T*)
{
return PerformOp<T>(E, std::less<T>{});
}

template<typename T>
int LessOrEqual(Eluna* E, T*)
{
return PerformOp<T>(E, std::less_equal<T>{});
}

template<typename T>
int ToString(Eluna* E, T*)
{
T val = E->CHECKVAL<T>(1);
std::ostringstream ss;
ss << val;
E->Push(ss.str());
return 1;
}

template<typename T>
int Pow(Eluna* E, T*)
{
T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(static_cast<T>(powl(static_cast<long double>(val1), static_cast<long double>(val2))));
return 1;
}

int Equal(Eluna* E, ObjectGuid*)
{
E->Push(E->CHECKVAL<ObjectGuid>(1) == E->CHECKVAL<ObjectGuid>(2));
return 1;
}

int ToString(Eluna* E, ObjectGuid*)
{
#if defined ELUNA_TRINITY
E->Push(E->CHECKVAL<ObjectGuid>(1).ToString());
#else
E->Push(E->CHECKVAL<ObjectGuid>(1).GetString());
#endif
return 1;
}

ElunaRegister<long long> LongLongMethods[] =
{
{ "__add", &LuaBigInt::Add<long long> },
{ "__sub", &LuaBigInt::Subtract<long long> },
{ "__mul", &LuaBigInt::Multiply<long long> },
{ "__div", &LuaBigInt::Divide<long long> },
{ "__mod", &LuaBigInt::Mod<long long> },
{ "__unm", &LuaBigInt::UnaryMinus<long long> },
{ "__eq", &LuaBigInt::Equal<long long> },
{ "__lt", &LuaBigInt::Less<long long> },
{ "__le", &LuaBigInt::LessOrEqual<long long> },
{ "__tostring", &LuaBigInt::ToString<long long> },
{ "__pow", &LuaBigInt::Pow<long long> },
};

ElunaRegister<unsigned long long> ULongLongMethods[] =
{
{ "__sub", &LuaBigInt::Subtract<unsigned long long> },
{ "__mul", &LuaBigInt::Multiply<unsigned long long> },
{ "__div", &LuaBigInt::Divide<unsigned long long> },
{ "__mod", &LuaBigInt::Mod<unsigned long long> },
{ "__eq", &LuaBigInt::Equal<unsigned long long> },
{ "__lt", &LuaBigInt::Less<unsigned long long> },
{ "__le", &LuaBigInt::LessOrEqual<unsigned long long> },
{ "__tostring", &LuaBigInt::ToString<unsigned long long> },
{ "__pow", &LuaBigInt::Pow<unsigned long long> },
};

ElunaRegister<ObjectGuid> ObjectGuidMethods[] =
{
{ "__tostring", &LuaBigInt::ToString<ObjectGuid> },
{ "__eq", &LuaBigInt::Equal<ObjectGuid> },
};
};

#endif
147 changes: 147 additions & 0 deletions methods/Mangos/BigIntMethods.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*
* Copyright (C) 2010 - 2025 Eluna Lua Engine <https://elunaluaengine.github.io/>
* This program is free software licensed under GPL version 3
* Please see the included DOCS/LICENSE.md for more information
*/

#ifndef BIGINTMETHODS_H
#define BIGINTMETHODS_H

namespace LuaBigInt
{
template <typename T, typename Op>
constexpr int PerformOp(Eluna* E, Op op)
{
T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(op(val1, val2));
return 1;
}

template<typename T>
int Add(Eluna* E, T*)
{
return PerformOp<T>(E, std::plus<T>{});
}

template<typename T>
int Subtract(Eluna* E, T*)
{
return PerformOp<T>(E, std::minus<T>{});
}

template<typename T>
int Multiply(Eluna* E, T*)
{
return PerformOp<T>(E, std::multiplies<T>{});
}

template<typename T>
int Divide(Eluna* E, T*)
{
return PerformOp<T>(E, std::divides<T>{});
}

template<typename T>
int Mod(Eluna* E, T*)
{
return PerformOp<T>(E, std::modulus<T>{});
}

template<typename T>
int UnaryMinus(Eluna* E, T*)
{
T val = E->CHECKVAL<T>(1);
E->Push(std::negate<T>{}(val));
return 1;
}

template<typename T>
int Equal(Eluna* E, T*)
{
return PerformOp<T>(E, std::equal_to<T>{});
}

template<typename T>
int Less(Eluna* E, T*)
{
return PerformOp<T>(E, std::less<T>{});
}

template<typename T>
int LessOrEqual(Eluna* E, T*)
{
return PerformOp<T>(E, std::less_equal<T>{});
}

template<typename T>
int ToString(Eluna* E, T*)
{
T val = E->CHECKVAL<T>(1);
std::ostringstream ss;
ss << val;
E->Push(ss.str());
return 1;
}

template<typename T>
int Pow(Eluna* E, T*)
{
T val1 = E->CHECKVAL<T>(1);
T val2 = E->CHECKVAL<T>(2);
E->Push(static_cast<T>(powl(static_cast<long double>(val1), static_cast<long double>(val2))));
return 1;
}

int Equal(Eluna* E, ObjectGuid*)
{
E->Push(E->CHECKVAL<ObjectGuid>(1) == E->CHECKVAL<ObjectGuid>(2));
return 1;
}

int ToString(Eluna* E, ObjectGuid*)
{
#if defined ELUNA_TRINITY
E->Push(E->CHECKVAL<ObjectGuid>(1).ToString());
#else
E->Push(E->CHECKVAL<ObjectGuid>(1).GetString());
#endif
return 1;
}

ElunaRegister<long long> LongLongMethods[] =
{
{ "__add", &LuaBigInt::Add<long long> },
{ "__sub", &LuaBigInt::Subtract<long long> },
{ "__mul", &LuaBigInt::Multiply<long long> },
{ "__div", &LuaBigInt::Divide<long long> },
{ "__mod", &LuaBigInt::Mod<long long> },
{ "__unm", &LuaBigInt::UnaryMinus<long long> },
{ "__eq", &LuaBigInt::Equal<long long> },
{ "__lt", &LuaBigInt::Less<long long> },
{ "__le", &LuaBigInt::LessOrEqual<long long> },
{ "__tostring", &LuaBigInt::ToString<long long> },
{ "__pow", &LuaBigInt::Pow<long long> },
};

ElunaRegister<unsigned long long> ULongLongMethods[] =
{
{ "__sub", &LuaBigInt::Subtract<unsigned long long> },
{ "__mul", &LuaBigInt::Multiply<unsigned long long> },
{ "__div", &LuaBigInt::Divide<unsigned long long> },
{ "__mod", &LuaBigInt::Mod<unsigned long long> },
{ "__eq", &LuaBigInt::Equal<unsigned long long> },
{ "__lt", &LuaBigInt::Less<unsigned long long> },
{ "__le", &LuaBigInt::LessOrEqual<unsigned long long> },
{ "__tostring", &LuaBigInt::ToString<unsigned long long> },
{ "__pow", &LuaBigInt::Pow<unsigned long long> },
};

ElunaRegister<ObjectGuid> ObjectGuidMethods[] =
{
{ "__tostring", &LuaBigInt::ToString<ObjectGuid> },
{ "__eq", &LuaBigInt::Equal<ObjectGuid> },
};
};

#endif
Loading
Loading