mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 13:01:29 -10:00
This adds `EnumAND` and `EnumOR` which will return new enums based on the specified operations. These are handy for enums that correspond to bit fields, such as those used for object persistent sounds.
161 lines
4.8 KiB
C++
161 lines
4.8 KiB
C++
|
|
#include "bitops.h"
|
|
#include "scripting/ade_args.h"
|
|
#include "scripting/api/objs/enums.h"
|
|
|
|
namespace scripting {
|
|
namespace api {
|
|
|
|
//**********LIBRARY: Bitwise Ops
|
|
ADE_LIB(l_BitOps, "BitOps", "bit", "Bitwise Operations library");
|
|
|
|
ADE_FUNC(AND, l_BitOps, "number, number, [number, number, number, number, number, number, number, number]", "Values for which bitwise boolean AND operation is performed", "number", "Result of the AND operation")
|
|
{
|
|
int a[10], c;
|
|
int n = ade_get_args(L, "ii|iiiiiiii", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
|
|
if (n < 2)
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = a[0];
|
|
for (int i = 1; i < n; ++i)
|
|
c &= a[i];
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(OR, l_BitOps, "number, number, [number, number, number, number, number, number, number, number]", "Values for which bitwise boolean OR operation is performed", "number", "Result of the OR operation")
|
|
{
|
|
int a[10], c;
|
|
int n = ade_get_args(L, "ii|iiiiiiii", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
|
|
if (n < 2)
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = a[0];
|
|
for (int i = 1; i < n; ++i)
|
|
c |= a[i];
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(EnumAND, l_BitOps, "enumeration, enumeration, [enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration]", "Values for which bitwise boolean AND operation is performed", "number", "Result of the AND operation")
|
|
{
|
|
enum_h a[10];
|
|
int c;
|
|
int n = ade_get_args(L, "oo|oooooooo", l_Enum.Get(&a[0]), l_Enum.Get(&a[1]), l_Enum.Get(&a[2]), l_Enum.Get(&a[3]), l_Enum.Get(&a[4]), l_Enum.Get(&a[5]), l_Enum.Get(&a[6]), l_Enum.Get(&a[7]), l_Enum.Get(&a[8]), l_Enum.Get(&a[9]));
|
|
if (n < 2)
|
|
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
|
|
|
|
c = a[0].index;
|
|
for (int i = 1; i < n; ++i)
|
|
c &= a[i].index;
|
|
|
|
return ade_set_args(L, "o", l_Enum.Set(enum_h(c)));
|
|
}
|
|
|
|
ADE_FUNC(EnumOR, l_BitOps, "enumeration, enumeration, [enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration]", "Values for which bitwise boolean OR operation is performed", "number", "Result of the OR operation")
|
|
{
|
|
enum_h a[10];
|
|
int c;
|
|
int n = ade_get_args(L, "oo|oooooooo", l_Enum.Get(&a[0]), l_Enum.Get(&a[1]), l_Enum.Get(&a[2]), l_Enum.Get(&a[3]), l_Enum.Get(&a[4]), l_Enum.Get(&a[5]), l_Enum.Get(&a[6]), l_Enum.Get(&a[7]), l_Enum.Get(&a[8]), l_Enum.Get(&a[9]));
|
|
if (n < 2)
|
|
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
|
|
|
|
c = a[0].index;
|
|
for (int i = 1; i < n; ++i)
|
|
c |= a[i].index;
|
|
|
|
return ade_set_args(L, "o", l_Enum.Set(enum_h(c)));
|
|
}
|
|
|
|
ADE_FUNC(XOR, l_BitOps, "number, number", "Values for which bitwise boolean XOR operation is performed", "number", "Result of the XOR operation")
|
|
{
|
|
int a, b, c;
|
|
if(!ade_get_args(L, "ii", &a,&b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = (a ^ b);
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(toggleBit, l_BitOps, "number baseNumber, number bit", "Toggles the value of the set bit in the given number for 32 bit integer", "number", "Result of the operation")
|
|
{
|
|
int a, b, c;
|
|
if(!ade_get_args(L, "ii", &a,&b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if (!((b >= 0) && (b < 32)))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = a ^ (1 << b);
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(checkBit, l_BitOps, "number baseNumber, number bit", "Checks the value of the set bit in the given number for 32 bit integer", "boolean", "Was the bit true of false")
|
|
{
|
|
int a, b;
|
|
if(!ade_get_args(L, "ii", &a,&b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if (!((b >= 0) && (b < 32)))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if(a & (1<<b))
|
|
return ADE_RETURN_TRUE;
|
|
else
|
|
return ADE_RETURN_FALSE;
|
|
}
|
|
|
|
ADE_FUNC_DEPRECATED(addBit,
|
|
l_BitOps,
|
|
"number baseNumber, number bit",
|
|
"Performs inclusive or (OR) operation on the set bit of the value",
|
|
"number",
|
|
"Result of the operation",
|
|
gameversion::version(21, 4),
|
|
"BitOps.addBit has been replaced by BitOps.setBit")
|
|
{
|
|
int a, b, c;
|
|
if(!ade_get_args(L, "ii", &a,&b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if (!((b >= 0) && (b < 32)))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = (a | (1<<b));
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(setBit, l_BitOps, "number baseNumber, number bit", "Turns on the specified bit of baseNumber (sets it to 1)", "number", "Result of the operation")
|
|
{
|
|
int a, b, c;
|
|
if (!ade_get_args(L, "ii", &a, &b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if (!((b >= 0) && (b < 32)))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = (a | (1 << b));
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
ADE_FUNC(unsetBit, l_BitOps, "number baseNumber, number bit", "Turns off the specified bit of baseNumber (sets it to 0)", "number", "Result of the operation")
|
|
{
|
|
int a, b, c;
|
|
if (!ade_get_args(L, "ii", &a, &b))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
if (!((b >= 0) && (b < 32)))
|
|
return ade_set_error(L, "i", 0);
|
|
|
|
c = (a & ~(1 << b));
|
|
|
|
return ade_set_args(L, "i", c);
|
|
}
|
|
|
|
}
|
|
}
|