@@ -54,93 +54,152 @@ public ByteBuffer nioBuffer(int index, int length) {
54
54
}
55
55
56
56
@ Override
57
- protected byte _getByte (int index ) {
57
+ public ByteBuffer [] nioBuffers (int index , int length ) {
58
+ checkIndex (index , length );
59
+ if (length == 0 ) {
60
+ return new ByteBuffer [] {EMPTY_NIO_BUFFER };
61
+ }
62
+ return _nioBuffers (index , length );
63
+ }
64
+
65
+ protected abstract ByteBuffer [] _nioBuffers (int index , int length );
66
+
67
+ @ Override
68
+ protected byte _getByte (final int index ) {
58
69
long ri = calculateRelativeIndex (index );
59
70
ByteBuf byteBuf = getPart (index );
60
71
61
- index = (int ) (ri & Integer .MAX_VALUE );
72
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
62
73
63
- return byteBuf .getByte (index );
74
+ return byteBuf .getByte (calculatedIndex );
64
75
}
65
76
66
77
@ Override
67
- protected short _getShort (int index ) {
78
+ protected short _getShort (final int index ) {
68
79
long ri = calculateRelativeIndex (index );
69
80
ByteBuf byteBuf = getPart (index );
70
81
71
- index = (int ) (ri & Integer .MAX_VALUE );
82
+ final int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
72
83
73
- return byteBuf .getShort (index );
84
+ if (calculatedIndex + Short .BYTES <= byteBuf .writerIndex ()) {
85
+ return byteBuf .getShort (calculatedIndex );
86
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
87
+ return (short ) ((_getByte (index ) & 0xff ) << 8 | _getByte (index + 1 ) & 0xff );
88
+ } else {
89
+ return (short ) (_getByte (index ) & 0xff | (_getByte (index + 1 ) & 0xff ) << 8 );
90
+ }
74
91
}
75
92
76
93
@ Override
77
94
protected short _getShortLE (int index ) {
78
95
long ri = calculateRelativeIndex (index );
79
96
ByteBuf byteBuf = getPart (index );
80
97
81
- index = (int ) (ri & Integer .MAX_VALUE );
98
+ final int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
82
99
83
- return byteBuf .getShortLE (index );
100
+ if (calculatedIndex + Short .BYTES <= byteBuf .writerIndex ()) {
101
+ return byteBuf .getShortLE (calculatedIndex );
102
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
103
+ return (short ) (_getByte (index ) & 0xff | (_getByte (index + 1 ) & 0xff ) << 8 );
104
+ } else {
105
+ return (short ) ((_getByte (index ) & 0xff ) << 8 | _getByte (index + 1 ) & 0xff );
106
+ }
84
107
}
85
108
86
109
@ Override
87
- protected int _getUnsignedMedium (int index ) {
110
+ protected int _getUnsignedMedium (final int index ) {
88
111
long ri = calculateRelativeIndex (index );
89
112
ByteBuf byteBuf = getPart (index );
90
113
91
- index = (int ) (ri & Integer .MAX_VALUE );
114
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
92
115
93
- return byteBuf .getUnsignedMedium (index );
116
+ if (calculatedIndex + 3 <= byteBuf .writerIndex ()) {
117
+ return byteBuf .getUnsignedMedium (calculatedIndex );
118
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
119
+ return (_getShort (index ) & 0xffff ) << 8 | _getByte (index + 2 ) & 0xff ;
120
+ } else {
121
+ return _getShort (index ) & 0xFFFF | (_getByte (index + 2 ) & 0xFF ) << 16 ;
122
+ }
94
123
}
95
124
96
125
@ Override
97
126
protected int _getUnsignedMediumLE (int index ) {
98
127
long ri = calculateRelativeIndex (index );
99
128
ByteBuf byteBuf = getPart (index );
100
129
101
- index = (int ) (ri & Integer .MAX_VALUE );
130
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
102
131
103
- return byteBuf .getUnsignedMediumLE (index );
132
+ if (calculatedIndex + 3 <= byteBuf .writerIndex ()) {
133
+ return byteBuf .getUnsignedMediumLE (calculatedIndex );
134
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
135
+ return _getShortLE (index ) & 0xffff | (_getByte (index + 2 ) & 0xff ) << 16 ;
136
+ } else {
137
+ return (_getShortLE (index ) & 0xffff ) << 8 | _getByte (index + 2 ) & 0xff ;
138
+ }
104
139
}
105
140
106
141
@ Override
107
- protected int _getInt (int index ) {
142
+ protected int _getInt (final int index ) {
108
143
long ri = calculateRelativeIndex (index );
109
144
ByteBuf byteBuf = getPart (index );
110
145
111
- index = (int ) (ri & Integer .MAX_VALUE );
146
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
112
147
113
- return byteBuf .getInt (index );
148
+ if (calculatedIndex + Integer .BYTES <= byteBuf .writerIndex ()) {
149
+ return byteBuf .getInt (calculatedIndex );
150
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
151
+ return (_getShort (index ) & 0xffff ) << 16 | _getShort (index + 2 ) & 0xffff ;
152
+ } else {
153
+ return _getShort (index ) & 0xFFFF | (_getShort (index + 2 ) & 0xFFFF ) << 16 ;
154
+ }
114
155
}
115
156
116
157
@ Override
117
- protected int _getIntLE (int index ) {
158
+ protected int _getIntLE (final int index ) {
118
159
long ri = calculateRelativeIndex (index );
119
160
ByteBuf byteBuf = getPart (index );
120
161
121
- index = (int ) (ri & Integer .MAX_VALUE );
162
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
122
163
123
- return byteBuf .getIntLE (index );
164
+ if (calculatedIndex + Integer .BYTES <= byteBuf .writerIndex ()) {
165
+ return byteBuf .getIntLE (calculatedIndex );
166
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
167
+ return _getShortLE (index ) & 0xffff | (_getShortLE (index + 2 ) & 0xffff ) << 16 ;
168
+ } else {
169
+ return (_getShortLE (index ) & 0xffff ) << 16 | _getShortLE (index + 2 ) & 0xffff ;
170
+ }
124
171
}
125
172
126
173
@ Override
127
- protected long _getLong (int index ) {
174
+ protected long _getLong (final int index ) {
128
175
long ri = calculateRelativeIndex (index );
129
176
ByteBuf byteBuf = getPart (index );
130
177
131
- index = (int ) (ri & Integer .MAX_VALUE );
178
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
132
179
133
- return byteBuf .getLong (index );
180
+ if (calculatedIndex + Long .BYTES <= byteBuf .writerIndex ()) {
181
+ return byteBuf .getLong (calculatedIndex );
182
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
183
+ return (_getInt (index ) & 0xffffffffL ) << 32 | _getInt (index + 4 ) & 0xffffffffL ;
184
+ } else {
185
+ return _getInt (index ) & 0xFFFFFFFFL | (_getInt (index + 4 ) & 0xFFFFFFFFL ) << 32 ;
186
+ }
134
187
}
135
188
136
189
@ Override
137
- protected long _getLongLE (int index ) {
190
+ protected long _getLongLE (final int index ) {
138
191
long ri = calculateRelativeIndex (index );
139
192
ByteBuf byteBuf = getPart (index );
140
193
141
- index = (int ) (ri & Integer .MAX_VALUE );
194
+ int calculatedIndex = (int ) (ri & Integer .MAX_VALUE );
142
195
143
- return byteBuf .getLongLE (index );
196
+ if (calculatedIndex + Long .BYTES <= byteBuf .writerIndex ()) {
197
+ return byteBuf .getLongLE (calculatedIndex );
198
+ } else if (order () == ByteOrder .BIG_ENDIAN ) {
199
+ return (_getInt (index ) & 0xffffffffL ) << 32 | _getInt (index + 4 ) & 0xffffffffL ;
200
+ } else {
201
+ return _getInt (index ) & 0xFFFFFFFFL | (_getInt (index + 4 ) & 0xFFFFFFFFL ) << 32 ;
202
+ }
144
203
}
145
204
146
205
@ Override
@@ -518,11 +577,6 @@ public long memoryAddress() {
518
577
throw new UnsupportedOperationException ();
519
578
}
520
579
521
- @ Override
522
- public int compareTo (ByteBuf buffer ) {
523
- return 0 ;
524
- }
525
-
526
580
@ Override
527
581
protected void _setByte (int index , int value ) {}
528
582
0 commit comments