1 /* 2 * 3 * Copyright 2015 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H 20 #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H 21 22 #include <grpc/support/port_platform.h> 23 24 #include <stddef.h> 25 26 /* Data structure to map a uint32_t to a data object (represented by a void*) 27 28 Represented as a sorted array of keys, and a corresponding array of values. 29 Lookups are performed with binary search. 30 Adds are restricted to strictly higher keys than previously seen (this is 31 guaranteed by http2). */ 32 typedef struct { 33 uint32_t* keys; 34 void** values; 35 size_t count; 36 size_t free; 37 size_t capacity; 38 } grpc_chttp2_stream_map; 39 40 void grpc_chttp2_stream_map_init(grpc_chttp2_stream_map* map, 41 size_t initial_capacity); 42 void grpc_chttp2_stream_map_destroy(grpc_chttp2_stream_map* map); 43 44 /* Add a new key: given http2 semantics, new keys must always be greater than 45 existing keys - this is asserted */ 46 void grpc_chttp2_stream_map_add(grpc_chttp2_stream_map* map, uint32_t key, 47 void* value); 48 49 /* Delete an existing key - returns the previous value of the key if it existed, 50 or NULL otherwise */ 51 void* grpc_chttp2_stream_map_delete(grpc_chttp2_stream_map* map, uint32_t key); 52 53 /* Return an existing key, or NULL if it does not exist */ 54 void* grpc_chttp2_stream_map_find(grpc_chttp2_stream_map* map, uint32_t key); 55 56 /* Return a random entry */ 57 void* grpc_chttp2_stream_map_rand(grpc_chttp2_stream_map* map); 58 59 /* How many (populated) entries are in the stream map? */ 60 size_t grpc_chttp2_stream_map_size(grpc_chttp2_stream_map* map); 61 62 /* Callback on each stream */ 63 void grpc_chttp2_stream_map_for_each(grpc_chttp2_stream_map* map, 64 void (*f)(void* user_data, uint32_t key, 65 void* value), 66 void* user_data); 67 68 #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H */ 69