Go to the documentation of this file.
34 #include <google/protobuf/pyext/repeated_scalar_container.h>
39 #include <google/protobuf/stubs/common.h>
40 #include <google/protobuf/stubs/logging.h>
41 #include <google/protobuf/descriptor.h>
42 #include <google/protobuf/dynamic_message.h>
43 #include <google/protobuf/message.h>
44 #include <google/protobuf/pyext/descriptor.h>
45 #include <google/protobuf/pyext/descriptor_pool.h>
46 #include <google/protobuf/pyext/message.h>
47 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
49 #define PyString_AsString(ob) \
50 (PyUnicode_Check(ob) ? PyUnicode_AsUTF8(ob) : PyBytes_AsString(ob))
56 namespace repeated_scalar_container {
62 for (Py_ssize_t
i = 0;
i < PyList_GET_SIZE(list); ++
i) {
63 PyObject*
value = PyList_GET_ITEM(list,
i);
71 static Py_ssize_t
Len(PyObject* pself) {
76 self->parent_field_descriptor);
85 const FieldDescriptor* field_descriptor =
self->parent_field_descriptor;
92 if (index < 0 || index >= field_size) {
93 PyErr_Format(PyExc_IndexError,
"list assignment index (%d) out of range",
94 static_cast<int>(
index));
104 if (PySequence_Check(
arg) && !(PyBytes_Check(
arg) || PyUnicode_Check(
arg))) {
105 PyErr_SetString(PyExc_TypeError,
"Value must be scalar");
109 switch (field_descriptor->
cpp_type()) {
161 if (enum_value !=
nullptr) {
167 PyErr_Format(PyExc_ValueError,
"Unknown enum value: %s",
176 PyErr_Format(PyExc_SystemError,
177 "Adding value to a field of unknown type %d",
184 static PyObject*
Item(PyObject* pself, Py_ssize_t
index) {
189 const FieldDescriptor* field_descriptor =
self->parent_field_descriptor;
196 if (index < 0 || index >= field_size) {
197 PyErr_Format(PyExc_IndexError,
"list index (%zd) out of range",
index);
201 PyObject*
result =
nullptr;
202 switch (field_descriptor->
cpp_type()) {
247 message->GetReflection()->GetRepeatedEnum(*
message, field_descriptor,
260 PyErr_Format(PyExc_SystemError,
261 "Getting value from a repeated field of unknown type %d",
273 Py_ssize_t slicelength;
274 bool return_list =
false;
275 if (PyLong_Check(
slice)) {
277 }
else if (PySlice_Check(
slice)) {
285 PyErr_SetString(PyExc_TypeError,
"list indices must be integers");
293 PyObject* list = PyList_New(0);
294 if (list ==
nullptr) {
302 if (index < 0 || index >=
length) {
306 PyList_Append(list, s.get());
313 if (index < 0 || index >=
length) {
317 PyList_Append(list, s.get());
326 const FieldDescriptor* field_descriptor =
self->parent_field_descriptor;
329 switch (field_descriptor->
cpp_type()) {
380 if (enum_value !=
nullptr) {
385 PyErr_Format(PyExc_ValueError,
"Unknown enum value: %s",
394 PyErr_Format(PyExc_SystemError,
395 "Adding value to a field of unknown type %d",
415 Py_ssize_t slicelength;
416 bool create_list =
false;
420 const FieldDescriptor* field_descriptor =
self->parent_field_descriptor;
422 if (PyLong_Check(
slice)) {
424 }
else if (PySlice_Check(
slice)) {
433 PyErr_SetString(PyExc_TypeError,
"list indices must be integers");
437 if (
value ==
nullptr) {
446 if (full_slice ==
nullptr) {
450 if (new_list ==
nullptr) {
464 if (
value == Py_None) {
472 if (
iter ==
nullptr) {
473 PyErr_SetString(PyExc_TypeError,
"Value must be iterable");
477 while ((
next.reset(PyIter_Next(
iter.get()))) !=
nullptr) {
482 if (PyErr_Occurred()) {
510 Py_ssize_t match_index = -1;
511 for (Py_ssize_t
i = 0;
i <
Len(pself); ++
i) {
513 if (PyObject_RichCompareBool(
elem.get(),
value, Py_EQ)) {
518 if (match_index == -1) {
519 PyErr_SetString(PyExc_ValueError,
"remove(x): x not in container");
522 if (
AssignItem(pself, match_index,
nullptr) < 0) {
532 static PyObject*
RichCompare(PyObject* pself, PyObject* other,
int opid) {
533 if (opid != Py_EQ && opid != Py_NE) {
534 Py_INCREF(Py_NotImplemented);
535 return Py_NotImplemented;
543 if (full_slice ==
nullptr) {
550 other = other_list_deleter.
get();
554 if (list ==
nullptr) {
557 return PyObject_RichCompare(list.
get(), other, opid);
560 PyObject*
Reduce(PyObject* unused_self, PyObject* unused_other) {
562 "can't pickle repeated message fields, convert to list first");
566 static PyObject*
Sort(PyObject* pself, PyObject*
args, PyObject* kwds) {
569 if (kwds !=
nullptr) {
570 PyObject* sort_func = PyDict_GetItemString(kwds,
"sort_function");
571 if (sort_func !=
nullptr) {
574 if (PyDict_SetItemString(kwds,
"cmp", sort_func) == -1)
return nullptr;
575 if (PyDict_DelItemString(kwds,
"sort_function") == -1)
return nullptr;
580 if (full_slice ==
nullptr) {
584 if (list ==
nullptr) {
592 if (res ==
nullptr) {
605 if (full_slice ==
nullptr) {
609 if (list ==
nullptr) {
613 if (res ==
nullptr) {
624 static PyObject*
Pop(PyObject* pself, PyObject*
args) {
625 Py_ssize_t
index = -1;
626 if (!PyArg_ParseTuple(
args,
"|n", &
index)) {
630 if (item ==
nullptr) {
631 PyErr_Format(PyExc_IndexError,
"list index (%zd) out of range",
index);
640 static PyObject*
ToStr(PyObject* pself) {
642 if (full_slice ==
nullptr) {
646 if (list ==
nullptr) {
649 return PyObject_Repr(list.
get());
665 if (
self ==
nullptr) {
670 self->parent = parent;
676 PyObject*
DeepCopy(PyObject* pself, PyObject*
arg) {
682 Py_TYPE(pself)->tp_free(pself);
701 {
"__deepcopy__",
DeepCopy, METH_VARARGS,
"Makes a deep copy of the class."},
702 {
"__reduce__",
Reduce, METH_NOARGS,
703 "Outputs picklable representation of the repeated field."},
705 "Appends an object to the repeated container."},
707 "Appends objects to the repeated container."},
708 {
"insert",
Insert, METH_VARARGS,
709 "Inserts an object at the specified position in the container."},
710 {
"pop",
Pop, METH_VARARGS,
711 "Removes an object from the repeated container and returns it."},
712 {
"remove",
Remove, METH_O,
713 "Removes an object from the repeated container."},
714 {
"sort",
reinterpret_cast<PyCFunction
>(
Sort), METH_VARARGS | METH_KEYWORDS,
715 "Sorts the repeated container."},
716 {
"reverse",
reinterpret_cast<PyCFunction
>(
Reverse), METH_NOARGS,
717 "Reverses elements order of the repeated container."},
718 {
"MergeFrom",
static_cast<PyCFunction
>(
MergeFrom), METH_O,
719 "Merges a repeated container into the current container."},
729 repeated_scalar_container::
Dealloc,
730 #if PY_VERSION_HEX >= 0x03080000
742 PyObject_HashNotImplemented,
749 "A Repeated scalar container",
void AddUInt32(Message *message, const FieldDescriptor *field, uint32 value) const
static PyObject * RichCompare(PyObject *pself, PyObject *other, int opid)
PyObject * Extend(RepeatedScalarContainer *self, PyObject *value)
#define GOOGLE_CHECK_GET_FLOAT(arg, value, err)
const Descriptor::ReservedRange value
PyObject * PickleError_class
PyObjectStruct * reset(PyObjectStruct *p=NULL)
float GetRepeatedFloat(const Message &message, const FieldDescriptor *field, int index) const
static PyMappingMethods MpMethods
static PyObject * Remove(PyObject *pself, PyObject *value)
PyObject * ToStringObject(const FieldDescriptor *descriptor, const string &value)
PyObject * Reduce(PyObject *unused_self, PyObject *unused_other)
const std::string & GetRepeatedStringReference(const Message &message, const FieldDescriptor *field, int index, std::string *scratch) const
PyObjectStruct * get() const
ScopedPythonPtr< PyObject > ScopedPyObjectPtr
#define GOOGLE_CHECK_GET_INT64(arg, value, err)
static PyObject * Sort(PyObject *pself, PyObject *args, PyObject *kwds)
PyTypeObject RepeatedScalarContainer_Type
#define PyString_AsString(ob)
#define GOOGLE_CHECK_GET_INT32(arg, value, err)
bool SupportsUnknownEnumValues() const
void AddInt32(Message *message, const FieldDescriptor *field, int32 value) const
static PyObject * Insert(PyObject *pself, PyObject *args)
void AddDouble(Message *message, const FieldDescriptor *field, double value) const
#define GOOGLE_CHECK_GET_UINT32(arg, value, err)
static Py_ssize_t Len(PyObject *pself)
static int AssSubscript(PyObject *pself, PyObject *slice, PyObject *value)
#define GOOGLE_CHECK_GET_BOOL(arg, value, err)
double GetRepeatedDouble(const Message &message, const FieldDescriptor *field, int index) const
void AddEnum(Message *message, const FieldDescriptor *field, const EnumValueDescriptor *value) const
uint32 GetRepeatedUInt32(const Message &message, const FieldDescriptor *field, int index) const
int32 GetRepeatedInt32(const Message &message, const FieldDescriptor *field, int index) const
const FieldDescriptor * parent_field_descriptor
unsigned __int64 uint64_t
static PyObject * ToStr(PyObject *pself)
void AddEnumValue(Message *message, const FieldDescriptor *field, int value) const
void SetRepeatedEnumValue(Message *message, const FieldDescriptor *field, int index, int value) const
void SetRepeatedDouble(Message *message, const FieldDescriptor *field, int index, double value) const
PyObject * Append(RepeatedScalarContainer *self, PyObject *item)
static void Dealloc(PyObject *pself)
#define GOOGLE_CHECK_GET_UINT64(arg, value, err)
int FieldSize(const Message &message, const FieldDescriptor *field) const
int64 GetRepeatedInt64(const Message &message, const FieldDescriptor *field, int index) const
void SetRepeatedUInt32(Message *message, const FieldDescriptor *field, int index, uint32 value) const
const EnumDescriptor * enum_type
int AssureWritable(CMessage *self)
void SetRepeatedInt64(Message *message, const FieldDescriptor *field, int index, int64 value) const
static PyObject * MergeFrom(PyObject *pself, PyObject *arg)
static PyObject * Pop(PyObject *pself, PyObject *args)
static PyObject * AppendMethod(PyObject *self, PyObject *item)
void SetRepeatedInt32(Message *message, const FieldDescriptor *field, int index, int32 value) const
static PyMethodDef Methods[]
static PySequenceMethods SqMethods
PyObject * DeepCopy(PyObject *pself, PyObject *arg)
bool CheckFieldBelongsToMessage(const FieldDescriptor *field_descriptor, const Message *message)
UniquePtr< SSL_SESSION > ret
void AddFloat(Message *message, const FieldDescriptor *field, float value) const
int DeleteRepeatedField(CMessage *self, const FieldDescriptor *field_descriptor, PyObject *slice)
AllocList * next[kMaxLevel]
static int AssignItem(PyObject *pself, Py_ssize_t index, PyObject *arg)
#define GOOGLE_CHECK_GET_DOUBLE(arg, value, err)
void SetRepeatedUInt64(Message *message, const FieldDescriptor *field, int index, uint64 value) const
uint64 GetRepeatedUInt64(const Message &message, const FieldDescriptor *field, int index) const
void AddInt64(Message *message, const FieldDescriptor *field, int64 value) const
static PyObject * ExtendMethod(PyObject *self, PyObject *value)
static PyObject * Item(PyObject *pself, Py_ssize_t index)
google::protobuf::python::RepeatedScalarContainer RepeatedScalarContainer
static PyObject * Reverse(PyObject *pself)
bool CheckAndSetString(PyObject *arg, Message *message, const FieldDescriptor *descriptor, const Reflection *reflection, bool append, int index)
#define PyVarObject_HEAD_INIT(type, size)
static PyObject * Subscript(PyObject *pself, PyObject *slice)
void SetRepeatedBool(Message *message, const FieldDescriptor *field, int index, bool value) const
void SetRepeatedEnum(Message *message, const FieldDescriptor *field, int index, const EnumValueDescriptor *value) const
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
bool GetRepeatedBool(const Message &message, const FieldDescriptor *field, int index) const
VALUE enum_descriptor(VALUE self)
static int InternalAssignRepeatedField(RepeatedScalarContainer *self, PyObject *list)
void AddBool(Message *message, const FieldDescriptor *field, bool value) const
void AddUInt64(Message *message, const FieldDescriptor *field, uint64 value) const
RepeatedScalarContainer * NewContainer(CMessage *parent, const FieldDescriptor *parent_field_descriptor)
void SetRepeatedFloat(Message *message, const FieldDescriptor *field, int index, float value) const
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:04