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