xref: /aosp_15_r20/system/nfc/utils/include/ringbuffer.h (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker /******************************************************************************
2*7eba2f3bSAndroid Build Coastguard Worker  *
3*7eba2f3bSAndroid Build Coastguard Worker  *  Copyright (C) 2017 Google Inc.
4*7eba2f3bSAndroid Build Coastguard Worker  *
5*7eba2f3bSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*7eba2f3bSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*7eba2f3bSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*7eba2f3bSAndroid Build Coastguard Worker  *
9*7eba2f3bSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*7eba2f3bSAndroid Build Coastguard Worker  *
11*7eba2f3bSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*7eba2f3bSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*7eba2f3bSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*7eba2f3bSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*7eba2f3bSAndroid Build Coastguard Worker  *  limitations under the License.
16*7eba2f3bSAndroid Build Coastguard Worker  *
17*7eba2f3bSAndroid Build Coastguard Worker  ******************************************************************************/
18*7eba2f3bSAndroid Build Coastguard Worker 
19*7eba2f3bSAndroid Build Coastguard Worker #pragma once
20*7eba2f3bSAndroid Build Coastguard Worker 
21*7eba2f3bSAndroid Build Coastguard Worker #include <stdint.h>
22*7eba2f3bSAndroid Build Coastguard Worker #include <sys/types.h>
23*7eba2f3bSAndroid Build Coastguard Worker 
24*7eba2f3bSAndroid Build Coastguard Worker typedef struct ringbuffer_t ringbuffer_t;
25*7eba2f3bSAndroid Build Coastguard Worker 
26*7eba2f3bSAndroid Build Coastguard Worker // NOTE:
27*7eba2f3bSAndroid Build Coastguard Worker // None of the functions below are thread safe when it comes to accessing the
28*7eba2f3bSAndroid Build Coastguard Worker // *rb pointer. It is *NOT* possible to insert and pop/delete at the same time.
29*7eba2f3bSAndroid Build Coastguard Worker // Callers must protect the *rb pointer separately.
30*7eba2f3bSAndroid Build Coastguard Worker 
31*7eba2f3bSAndroid Build Coastguard Worker // Create a ringbuffer with the specified size
32*7eba2f3bSAndroid Build Coastguard Worker // Returns NULL if memory allocation failed. Resulting pointer must be freed
33*7eba2f3bSAndroid Build Coastguard Worker // using |ringbuffer_free|.
34*7eba2f3bSAndroid Build Coastguard Worker ringbuffer_t* ringbuffer_init(const size_t size);
35*7eba2f3bSAndroid Build Coastguard Worker 
36*7eba2f3bSAndroid Build Coastguard Worker // Frees the ringbuffer structure and buffer
37*7eba2f3bSAndroid Build Coastguard Worker // Save to call with NULL.
38*7eba2f3bSAndroid Build Coastguard Worker void ringbuffer_free(ringbuffer_t* rb);
39*7eba2f3bSAndroid Build Coastguard Worker 
40*7eba2f3bSAndroid Build Coastguard Worker // Returns remaining buffer size
41*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_available(const ringbuffer_t* rb);
42*7eba2f3bSAndroid Build Coastguard Worker 
43*7eba2f3bSAndroid Build Coastguard Worker // Returns size of data in buffer
44*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_size(const ringbuffer_t* rb);
45*7eba2f3bSAndroid Build Coastguard Worker 
46*7eba2f3bSAndroid Build Coastguard Worker // Attempts to insert up to |length| bytes of data at |p| into the buffer
47*7eba2f3bSAndroid Build Coastguard Worker // Return actual number of bytes added. Can be less than |length| if buffer
48*7eba2f3bSAndroid Build Coastguard Worker // is full.
49*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_insert(ringbuffer_t* rb, const uint8_t* p, size_t length);
50*7eba2f3bSAndroid Build Coastguard Worker 
51*7eba2f3bSAndroid Build Coastguard Worker // Peek |length| number of bytes from the ringbuffer, starting at |offset|,
52*7eba2f3bSAndroid Build Coastguard Worker // into the buffer |p|. Return the actual number of bytes peeked. Can be less
53*7eba2f3bSAndroid Build Coastguard Worker // than |length| if there is less than |length| data available. |offset| must
54*7eba2f3bSAndroid Build Coastguard Worker // be non-negative.
55*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_peek(const ringbuffer_t* rb, off_t offset, uint8_t* p,
56*7eba2f3bSAndroid Build Coastguard Worker                        size_t length);
57*7eba2f3bSAndroid Build Coastguard Worker 
58*7eba2f3bSAndroid Build Coastguard Worker // Does the same as |ringbuffer_peek|, but also advances the ring buffer head
59*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_pop(ringbuffer_t* rb, uint8_t* p, size_t length);
60*7eba2f3bSAndroid Build Coastguard Worker 
61*7eba2f3bSAndroid Build Coastguard Worker // Deletes |length| bytes from the ringbuffer starting from the head
62*7eba2f3bSAndroid Build Coastguard Worker // Return actual number of bytes deleted.
63*7eba2f3bSAndroid Build Coastguard Worker size_t ringbuffer_delete(ringbuffer_t* rb, size_t length);
64