001//////////////////////////////////////////////////////////////////////////////// 002// checkstyle: Checks Java source code for adherence to a set of rules. 003// Copyright (C) 2001-2022 the original author or authors. 004// 005// This library is free software; you can redistribute it and/or 006// modify it under the terms of the GNU Lesser General Public 007// License as published by the Free Software Foundation; either 008// version 2.1 of the License, or (at your option) any later version. 009// 010// This library is distributed in the hope that it will be useful, 011// but WITHOUT ANY WARRANTY; without even the implied warranty of 012// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013// Lesser General Public License for more details. 014// 015// You should have received a copy of the GNU Lesser General Public 016// License along with this library; if not, write to the Free Software 017// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018//////////////////////////////////////////////////////////////////////////////// 019 020package com.puppycrawl.tools.checkstyle.utils; 021 022import java.util.Arrays; 023 024/** 025 * Contains utility methods for code point. 026 */ 027public final class CodePointUtil { 028 029 /** Stop instances being created. **/ 030 private CodePointUtil() { 031 } 032 033 /** 034 * Checks if given code point array is blank by either being empty, 035 * or contains only whitespace characters. 036 * 037 * @param codePoints The array of unicode code points of string to check. 038 * @return true if codePoints is blank. 039 */ 040 public static boolean isBlank(int... codePoints) { 041 return hasWhitespaceBefore(codePoints.length, codePoints); 042 } 043 044 /** 045 * Checks if the given code point array contains only whitespace up to specified index. 046 * 047 * @param codePoints 048 * array of Unicode code point of string to check 049 * @param index 050 * index to check up to (exclusive) 051 * @return true if all code points preceding given index are whitespace 052 */ 053 public static boolean hasWhitespaceBefore(int index, int... codePoints) { 054 return Arrays.stream(codePoints, 0, index) 055 .allMatch(Character::isWhitespace); 056 } 057 058 /** 059 * Removes trailing whitespaces. 060 * 061 * @param codePoints array of unicode code points 062 * @return unicode code points array with trailing whitespaces removed 063 */ 064 public static int[] stripTrailing(int... codePoints) { 065 int lastIndex = codePoints.length; 066 while (lastIndex > 0 && CommonUtil.isCodePointWhitespace(codePoints, lastIndex - 1)) { 067 lastIndex--; 068 } 069 return Arrays.copyOfRange(codePoints, 0, lastIndex); 070 } 071 072 /** 073 * Removes leading whitespaces. 074 * 075 * @param codePoints array of unicode code points 076 * @return unicode code points array with leading whitespaces removed 077 */ 078 public static int[] stripLeading(int... codePoints) { 079 int startIndex = 0; 080 while (startIndex < codePoints.length 081 && CommonUtil.isCodePointWhitespace(codePoints, startIndex)) { 082 startIndex++; 083 } 084 return Arrays.copyOfRange(codePoints, startIndex, codePoints.length); 085 } 086 087 /** 088 * Removes leading and trailing whitespaces. 089 * 090 * @param codePoints array of unicode code points 091 * @return unicode code points array with leading and trailing whitespaces removed 092 */ 093 public static int[] trim(int... codePoints) { 094 final int[] strippedCodePoints = stripTrailing(codePoints); 095 return stripLeading(strippedCodePoints); 096 } 097 098 /** 099 * Tests if the unicode code points array 100 * ends with the specified suffix. 101 * 102 * @param suffix the suffix 103 * @param codePoints the array of unicode code points to check 104 * @return {@code true}, if the unicode code points array ends with provided suffix 105 */ 106 public static boolean endsWith(int[] codePoints, String suffix) { 107 final int startIndex = codePoints.length - suffix.length(); 108 return startIndex > -1 && Arrays.equals(Arrays 109 .copyOfRange(codePoints, startIndex, codePoints.length), 110 suffix.codePoints().toArray()); 111 } 112}