1 /*
2  * Copyright 2019 Google Inc. 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 
17 package com.google.flatbuffers;
18 
19 import java.nio.ByteBuffer;
20 
21 /// @cond FLATBUFFERS_INTERNAL
22 
23 /**
24  * All vector access objects derive from this class, and add their own accessors.
25  */
26 public class BaseVector {
27   /** Used to hold the vector data position. */
28   private int vector;
29   /** Used to hold the vector size. */
30   private int length;
31   /** Used to hold the vector element size in table. */
32   private int element_size;
33   /** The underlying ByteBuffer to hold the data of the vector. */
34   protected ByteBuffer bb;
35 
36   /**
37    * Get the start data of a vector.
38    *
39    * @return Returns the start of the vector data.
40    */
__vector()41   protected int __vector() {
42     return vector;
43   }
44 
45   /**
46    * Gets the element position in vector's ByteBuffer.
47    *
48    * @param j An `int` index of element into a vector.
49    * @return Returns the position of the vector element in a ByteBuffer.
50    */
__element(int j)51   protected int __element(int j) {
52     return vector + j * element_size;
53   }
54 
55   /**
56    * Re-init the internal state with an external buffer {@code ByteBuffer}, an offset within and
57    * element size.
58    *
59    * This method exists primarily to allow recycling vector instances without risking memory leaks
60    * due to {@code ByteBuffer} references.
61    */
__reset(int _vector, int _element_size, ByteBuffer _bb)62   protected void __reset(int _vector, int _element_size, ByteBuffer _bb) {
63     bb = _bb;
64     if (bb != null) {
65       vector = _vector;
66       length = bb.getInt(_vector - Constants.SIZEOF_INT);
67       element_size = _element_size;
68     } else {
69       vector = 0;
70       length = 0;
71       element_size = 0;
72     }
73   }
74 
75   /**
76    * Resets the internal state with a null {@code ByteBuffer} and a zero position.
77    *
78    * This method exists primarily to allow recycling vector instances without risking memory leaks
79    * due to {@code ByteBuffer} references. The instance will be unusable until it is assigned
80    * again to a {@code ByteBuffer}.
81    */
reset()82   public void reset() {
83     __reset(0, 0, null);
84   }
85 
86   /**
87    * Get the length of a vector.
88    *
89    * @return Returns the length of the vector.
90    */
length()91   public int length() {
92     return length;
93   }
94 }
95 
96 /// @endcond
97