16f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong/* 26f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 36f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 46f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 56f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * This code is free software; you can redistribute it and/or modify it 66f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * under the terms of the GNU General Public License version 2 only, as 76f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * published by the Free Software Foundation. Oracle designates this 86f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * particular file as subject to the "Classpath" exception as provided 96f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * by Oracle in the LICENSE file that accompanied this code. 106f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 116f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * This code is distributed in the hope that it will be useful, but WITHOUT 126f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 136f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 146f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * version 2 for more details (a copy is included in the LICENSE file that 156f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * accompanied this code). 166f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 176f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * You should have received a copy of the GNU General Public License version 186f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 2 along with this work; if not, write to the Free Software Foundation, 196f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 206f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 216f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 226f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * or visit www.oracle.com if you need additional information or have any 236f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * questions. 246f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong */ 256f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 266f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kongpackage java.nio; 276f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 286f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kongimport java.util.Comparator; 296f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kongimport java.util.Spliterator; 306f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kongimport java.util.function.IntConsumer; 316f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 326f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong/** 336f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * A Spliterator.OfInt for sources that traverse and split elements 346f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * maintained in a CharBuffer. 356f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * 366f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * @implNote 376f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong * The implementation is based on the code for the Array-based spliterators. 386f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong */ 396f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kongclass CharBufferSpliterator implements Spliterator.OfInt { 406f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong private final CharBuffer buffer; 416f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong private int index; // current index, modified on advance/split 426f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong private final int limit; 436f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 446f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong CharBufferSpliterator(CharBuffer buffer) { 456f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong this(buffer, buffer.position(), buffer.limit()); 466f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 476f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 486f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong CharBufferSpliterator(CharBuffer buffer, int origin, int limit) { 496f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong assert origin <= limit; 506f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong this.buffer = buffer; 516f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong this.index = (origin <= limit) ? origin : limit; 526f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong this.limit = limit; 536f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 546f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 556f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong @Override 566f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong public OfInt trySplit() { 576f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong int lo = index, mid = (lo + limit) >>> 1; 586f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong return (lo >= mid) 596f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong ? null 606f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong : new CharBufferSpliterator(buffer, lo, index = mid); 616f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 626f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 636f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong @Override 646f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong public void forEachRemaining(IntConsumer action) { 656f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong if (action == null) 666f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong throw new NullPointerException(); 676f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong CharBuffer cb = buffer; 686f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong int i = index; 696f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong int hi = limit; 706f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong index = hi; 716f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong while (i < hi) { 726f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong action.accept(cb.getUnchecked(i++)); 736f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 746f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 756f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 766f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong @Override 776f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong public boolean tryAdvance(IntConsumer action) { 786f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong if (action == null) 796f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong throw new NullPointerException(); 806f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong if (index >= 0 && index < limit) { 816f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong action.accept(buffer.getUnchecked(index++)); 826f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong return true; 836f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 846f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong return false; 856f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 866f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 876f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong @Override 886f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong public long estimateSize() { 896f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong return (long)(limit - index); 906f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 916f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong 926f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong @Override 936f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong public int characteristics() { 946f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong return Buffer.SPLITERATOR_CHARACTERISTICS; 956f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong } 966f07fc6c80a7e85fdfffbc2ac4e15b53cdd04a3eYi Kong} 97