blob: 8cd38721a566a03c409b60bf0b9cb2998d37a6fe [file] [log] [blame]
Joshua Haberman455426e2021-12-08 23:32:05 -08001/*
2 * Copyright (c) 2009-2021, Google LLC
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Google LLC nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef PYUPB_REPEATED_H__
29#define PYUPB_REPEATED_H__
30
31#include <stdbool.h>
32
Protobuf Teamee6b1ab2022-04-13 09:06:17 -070033#include "python/python_api.h"
Eric Saloedecfd52022-09-15 10:26:14 -070034#include "upb/reflection/def.h"
Joshua Haberman455426e2021-12-08 23:32:05 -080035
Joshua Habermanfaac2d82021-12-30 01:04:49 -080036// Creates a new repeated field stub for field `f` of message object `parent`.
Joshua Habermane5d8d282022-01-05 15:47:59 -080037// Precondition: `parent` must be a stub.
Joshua Habermanfaac2d82021-12-30 01:04:49 -080038PyObject* PyUpb_RepeatedContainer_NewStub(PyObject* parent,
Joshua Haberman1c955f32022-01-12 07:19:28 -080039 const upb_FieldDef* f,
Joshua Habermanfaac2d82021-12-30 01:04:49 -080040 PyObject* arena);
Joshua Haberman455426e2021-12-08 23:32:05 -080041
Joshua Habermanc8f1de82021-12-28 20:46:58 -080042// Returns a repeated field object wrapping `arr`, of field type `f`, which
Joshua Haberman455426e2021-12-08 23:32:05 -080043// must be on `arena`. If an existing wrapper object exists, it will be
44// returned, otherwise a new object will be created. The caller always owns a
45// ref on the returned value.
Joshua Haberman1c955f32022-01-12 07:19:28 -080046PyObject* PyUpb_RepeatedContainer_GetOrCreateWrapper(upb_Array* arr,
47 const upb_FieldDef* f,
Joshua Haberman455426e2021-12-08 23:32:05 -080048 PyObject* arena);
49
Joshua Habermanfaac2d82021-12-30 01:04:49 -080050// Reifies a repeated field stub to point to the concrete data in `arr`.
Joshua Haberman5953ac42022-01-09 23:52:23 -080051// If `arr` is NULL, an appropriate empty array will be constructed.
Joshua Haberman1c955f32022-01-12 07:19:28 -080052void PyUpb_RepeatedContainer_Reify(PyObject* self, upb_Array* arr);
Joshua Haberman455426e2021-12-08 23:32:05 -080053
Joshua Haberman54b775d2022-01-05 12:55:52 -080054// Reifies this repeated object if it is not already reified.
Joshua Haberman1c955f32022-01-12 07:19:28 -080055upb_Array* PyUpb_RepeatedContainer_EnsureReified(PyObject* self);
Joshua Haberman54b775d2022-01-05 12:55:52 -080056
Joshua Habermanc8f1de82021-12-28 20:46:58 -080057// Implements repeated_field.extend(iterable). `_self` must be a repeated
58// field (either repeated composite or repeated scalar).
Joshua Haberman455426e2021-12-08 23:32:05 -080059PyObject* PyUpb_RepeatedContainer_Extend(PyObject* _self, PyObject* value);
Joshua Habermanc8f1de82021-12-28 20:46:58 -080060
61// Implements repeated_field.add(initial_values). `_self` must be a repeated
62// composite field.
Joshua Haberman455426e2021-12-08 23:32:05 -080063PyObject* PyUpb_RepeatedCompositeContainer_Add(PyObject* _self, PyObject* args,
64 PyObject* kwargs);
65
66// Module-level init.
67bool PyUpb_Repeated_Init(PyObject* m);
68
69#endif // PYUPB_REPEATED_H__