730 int start = index;
731 index = mid;
732 return new LinesSpliterator(value, start, mid - start);
733 }
734 return null;
735 }
736
737 @Override
738 public long estimateSize() {
739 return fence - index + 1;
740 }
741
742 @Override
743 public int characteristics() {
744 return Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL;
745 }
746
747 static LinesSpliterator spliterator(byte[] value) {
748 return new LinesSpliterator(value, 0, value.length);
749 }
750
751 static LinesSpliterator spliterator(byte[] value, int leading, int trailing) {
752 int length = value.length;
753 int left = 0;
754 int index;
755 for (int l = 0; l < leading; l++) {
756 index = skipBlankForward(value, left, length);
757 if (index == left) {
758 break;
759 }
760 left = index;
761 }
762 int right = length;
763 for (int t = 0; t < trailing; t++) {
764 index = skipBlankBackward(value, left, right);
765 if (index == right) {
766 break;
767 }
768 right = index;
769 }
770 return new LinesSpliterator(value, left, right - left);
771 }
772
773 private static int skipBlankForward(byte[] value, int start, int length) {
774 int index = start;
775 while (index < length) {
776 char ch = getChar(value, index++);
777 if (ch == '\n') {
778 return index;
779 }
780 if (ch == '\r') {
781 if (index < length && getChar(value, index) == '\n') {
782 return index + 1;
783 }
784 return index;
785 }
786 if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
787 return start;
788 }
789 }
790 return length;
791 }
792
793 private static int skipBlankBackward(byte[] value, int start, int fence) {
794 int index = fence;
795 if (start < index && getChar(value, index - 1) == '\n') {
796 index--;
797 }
798 if (start < index && getChar(value, index - 1) == '\r') {
799 index--;
800 }
801 while (start < index) {
802 char ch = getChar(value, --index);
803 if (ch == '\r' || ch == '\n') {
804 return index + 1;
805 }
806 if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
807 return fence;
808 }
809 }
810 return start;
811 }
812 }
813
814 static Stream<String> lines(byte[] value, int leading, int trailing) {
815 if (leading == 0 && trailing == 0) {
816 return StreamSupport.stream(LinesSpliterator.spliterator(value), false);
817 } else {
818 return StreamSupport.stream(LinesSpliterator.spliterator(value, leading, trailing), false);
819 }
820 }
821
822 public static void putChar(byte[] val, int index, int c) {
823 //assert (canEncode(c));
824 val[index] = (byte)(c);
825 }
826
827 public static char getChar(byte[] val, int index) {
828 return (char)(val[index] & 0xff);
829 }
830
831 public static byte[] toBytes(int[] val, int off, int len) {
832 byte[] ret = new byte[len];
833 for (int i = 0; i < len; i++) {
834 int cp = val[off++];
835 if (!canEncode(cp)) {
836 return null;
837 }
838 ret[i] = (byte)cp;
839 }
|
730 int start = index;
731 index = mid;
732 return new LinesSpliterator(value, start, mid - start);
733 }
734 return null;
735 }
736
737 @Override
738 public long estimateSize() {
739 return fence - index + 1;
740 }
741
742 @Override
743 public int characteristics() {
744 return Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL;
745 }
746
747 static LinesSpliterator spliterator(byte[] value) {
748 return new LinesSpliterator(value, 0, value.length);
749 }
750 }
751
752 static Stream<String> lines(byte[] value) {
753 return StreamSupport.stream(LinesSpliterator.spliterator(value), false);
754 }
755
756 public static void putChar(byte[] val, int index, int c) {
757 //assert (canEncode(c));
758 val[index] = (byte)(c);
759 }
760
761 public static char getChar(byte[] val, int index) {
762 return (char)(val[index] & 0xff);
763 }
764
765 public static byte[] toBytes(int[] val, int off, int len) {
766 byte[] ret = new byte[len];
767 for (int i = 0; i < len; i++) {
768 int cp = val[off++];
769 if (!canEncode(cp)) {
770 return null;
771 }
772 ret[i] = (byte)cp;
773 }
|