Add PbRemoveRepeatedFieldValue native (bug 6066, r=asherkin).
This commit is contained in:
parent
fb0fd0c6d2
commit
9215ddcf8a
@ -1093,6 +1093,24 @@ public:
|
|||||||
return msg->GetReflection()->FieldSize(*msg, field);
|
return msg->GetReflection()->FieldSize(*msg, field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool RemoveRepeatedFieldValue(const char *pszFieldName, int index)
|
||||||
|
{
|
||||||
|
GETCHECK_FIELD();
|
||||||
|
CHECK_FIELD_REPEATED();
|
||||||
|
CHECK_REPEATED_ELEMENT(index);
|
||||||
|
|
||||||
|
// Protobuf guarantees that repeated field values will stay in order and so must we.
|
||||||
|
const protobuf::Reflection *pReflection = msg->GetReflection();
|
||||||
|
for (int i = index; i < elemCount - 1; ++i)
|
||||||
|
{
|
||||||
|
pReflection->SwapElements(msg, field, i, i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pReflection->RemoveLast(msg, field);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
protobuf::Message *msg;
|
protobuf::Message *msg;
|
||||||
PBHandleList childHandles;
|
PBHandleList childHandles;
|
||||||
|
@ -716,6 +716,19 @@ static cell_t smn_PbAddVector2D(IPluginContext *pCtx, const cell_t *params)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cell_t smn_PbRemoveRepeatedFieldValue(IPluginContext *pCtx, const cell_t *params)
|
||||||
|
{
|
||||||
|
GET_MSG_FROM_HANDLE_OR_ERR();
|
||||||
|
GET_FIELD_NAME_OR_ERR();
|
||||||
|
|
||||||
|
if (!msg->RemoveRepeatedFieldValue(strField, params[3]))
|
||||||
|
{
|
||||||
|
return pCtx->ThrowNativeError("Invalid field \"%s\" for message \"%s\"", strField, msg->GetProtobufMessage()->GetTypeName().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static cell_t smn_PbReadMessage(IPluginContext *pCtx, const cell_t *params)
|
static cell_t smn_PbReadMessage(IPluginContext *pCtx, const cell_t *params)
|
||||||
{
|
{
|
||||||
GET_MSG_FROM_HANDLE_OR_ERR();
|
GET_MSG_FROM_HANDLE_OR_ERR();
|
||||||
@ -794,6 +807,7 @@ REGISTER_NATIVES(protobufnatives)
|
|||||||
{"PbAddAngle", smn_PbAddAngle},
|
{"PbAddAngle", smn_PbAddAngle},
|
||||||
{"PbAddVector", smn_PbAddVector},
|
{"PbAddVector", smn_PbAddVector},
|
||||||
{"PbAddVector2D", smn_PbAddVector2D},
|
{"PbAddVector2D", smn_PbAddVector2D},
|
||||||
|
{"PbRemoveRepeatedFieldValue", smn_PbRemoveRepeatedFieldValue},
|
||||||
{"PbReadMessage", smn_PbReadMessage},
|
{"PbReadMessage", smn_PbReadMessage},
|
||||||
{"PbReadRepeatedMessage", smn_PbReadRepeatedMessage},
|
{"PbReadRepeatedMessage", smn_PbReadRepeatedMessage},
|
||||||
{"PbAddMessage", smn_PbAddMessage},
|
{"PbAddMessage", smn_PbAddMessage},
|
||||||
|
@ -223,6 +223,7 @@ public __ext_core_SetNTVOptional()
|
|||||||
MarkNativeAsOptional("PbAddAngle");
|
MarkNativeAsOptional("PbAddAngle");
|
||||||
MarkNativeAsOptional("PbAddVector");
|
MarkNativeAsOptional("PbAddVector");
|
||||||
MarkNativeAsOptional("PbAddVector2D");
|
MarkNativeAsOptional("PbAddVector2D");
|
||||||
|
MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
|
||||||
MarkNativeAsOptional("PbReadMessage");
|
MarkNativeAsOptional("PbReadMessage");
|
||||||
MarkNativeAsOptional("PbReadRepeatedMessage");
|
MarkNativeAsOptional("PbReadRepeatedMessage");
|
||||||
MarkNativeAsOptional("PbAddMessage");
|
MarkNativeAsOptional("PbAddMessage");
|
||||||
|
@ -325,6 +325,17 @@ native PbAddVector(Handle:pb, const String:field[], const Float:vec[3]);
|
|||||||
*/
|
*/
|
||||||
native PbAddVector2D(Handle:pb, const String:field[], const Float:vec[2]);
|
native PbAddVector2D(Handle:pb, const String:field[], const Float:vec[2]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a value by index from a protobuf message repeated field.
|
||||||
|
*
|
||||||
|
* @param pb protobuf handle.
|
||||||
|
* @param field Field name.
|
||||||
|
* @param index Index into repeated field.
|
||||||
|
* @noreturn
|
||||||
|
* @error Invalid or incorrect Handle, non-existent field, or incorrect field type.
|
||||||
|
*/
|
||||||
|
native PbRemoveRepeatedFieldValue(Handle:pb, const String:field[], index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve a handle to an embedded protobuf message in a protobuf message.
|
* Retrieve a handle to an embedded protobuf message in a protobuf message.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user