Separate byte-level atomic-storage access
[controller.git] / atomix-storage / src / main / java / io / atomix / storage / journal / ByteBufReader.java
1 /*
2  * Copyright (c) 2024 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package io.atomix.storage.journal;
17
18 import io.netty.buffer.ByteBuf;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21
22 /**
23  * A reader of {@link ByteBufJournal} entries.
24  */
25 @NonNullByDefault
26 public interface ByteBufReader extends AutoCloseable {
27     /**
28      * A journal entry processor. Responsible for transforming bytes into their internal representation.
29      *
30      * @param <T> Internal representation type
31      */
32     @FunctionalInterface
33     interface EntryMapper<T> {
34         /**
35          * Process an entry.
36          *
37          * @param index entry index
38          * @param bytes entry bytes
39          * @return resulting internal representation
40          */
41         T mapEntry(long index, ByteBuf bytes);
42     }
43
44     /**
45      * Returns the first index in the journal.
46      *
47      * @return The first index in the journal
48      */
49     long firstIndex();
50
51     /**
52      * Returns the next reader index.
53      *
54      * @return The next reader index
55      */
56     long nextIndex();
57
58     /**
59      * Try to move to the next binary data block
60      *
61      * @param entryMapper callback to be invoked on binary data
62      * @return processed binary data, or {@code null}
63      */
64     <T> @Nullable T tryNext(EntryMapper<T> entryMapper);
65
66     /**
67      * Resets the reader to the start.
68      */
69     void reset();
70
71     /**
72      * Resets the reader to the given index.
73      *
74      * @param index The index to which to reset the reader
75      */
76     void reset(long index);
77
78     @Override
79     void close();
80 }