blob: 0c03ed06dd938de8d4de4420fb14c803ab6cbec0 [file] [log] [blame]
Joshua Habermanbf74b3e2021-12-30 00:52:12 -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_MAP_H__
29#define PYUPB_MAP_H__
30
31#include <stdbool.h>
32
33#include "python/python.h"
34#include "upb/def.h"
35
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 Haberman1c955f32022-01-12 07:19:28 -080038PyObject* PyUpb_MapContainer_NewStub(PyObject* parent, const upb_FieldDef* f,
Joshua Habermanfaac2d82021-12-30 01:04:49 -080039 PyObject* arena);
40
41// Returns a map object wrapping `map`, of field type `f`, which must be on
42// `arena`. If an existing wrapper object exists, it will be returned,
43// otherwise a new object will be created. The caller always owns a ref on the
44// returned value.
Joshua Haberman1c955f32022-01-12 07:19:28 -080045PyObject* PyUpb_MapContainer_GetOrCreateWrapper(upb_Map* map,
46 const upb_FieldDef* f,
Joshua Habermanbf74b3e2021-12-30 00:52:12 -080047 PyObject* arena);
Joshua Habermanfaac2d82021-12-30 01:04:49 -080048
49// Reifies a map stub to point to the concrete data in `map`.
Joshua Haberman5953ac42022-01-09 23:52:23 -080050// If `map` is NULL, an appropriate empty map will be constructed.
Joshua Haberman1c955f32022-01-12 07:19:28 -080051void PyUpb_MapContainer_Reify(PyObject* self, upb_Map* map);
Joshua Habermanfaac2d82021-12-30 01:04:49 -080052
Joshua Haberman54b775d2022-01-05 12:55:52 -080053// Reifies this map object if it is not already reified.
Joshua Haberman1c955f32022-01-12 07:19:28 -080054upb_Map* PyUpb_MapContainer_EnsureReified(PyObject* self);
Joshua Haberman54b775d2022-01-05 12:55:52 -080055
Joshua Habermanfaac2d82021-12-30 01:04:49 -080056// Assigns `self[key] = val` for the map `self`.
Joshua Habermanbf74b3e2021-12-30 00:52:12 -080057int PyUpb_MapContainer_AssignSubscript(PyObject* self, PyObject* key,
58 PyObject* val);
Joshua Habermanfaac2d82021-12-30 01:04:49 -080059
60// Invalidates any existing iterators for the map `obj`.
Joshua Habermanbf74b3e2021-12-30 00:52:12 -080061void PyUpb_MapContainer_Invalidate(PyObject* obj);
62
Joshua Habermanfaac2d82021-12-30 01:04:49 -080063// Module-level init.
Joshua Habermanbf74b3e2021-12-30 00:52:12 -080064bool PyUpb_Map_Init(PyObject* m);
65
66#endif // PYUPB_MAP_H__