From 697416445bc83cfa8e733ecb973e585285304dfd Mon Sep 17 00:00:00 2001 From: olyutorskii Date: Thu, 2 Feb 2017 18:18:19 +0900 Subject: [PATCH] Release/v1.102.4 (#17) * start v1.102.3-SNAPSHOT (#12) * Add SCM info to POM. * Add SCM info to POM. * Add CHANGELOG.md * Redundant description omitted with surefire report. * Add findbugs plugin for Maven. * Add Jacoco plugin for Maven. * Add PMD plugin for Maven. * Add checkstyle plugin for Maven. * modify WhitespaceAfter tokens for checkstyle * Specifying target attribute to external links. * Add Jacoco rules. * Speeding up register operation * remove redundant bit operation * Add bound check with getDigit() * modify CHANGELOG * modify EOL? * Release 1.102.4 preparation --- CHANGELOG.md | 16 + checkstyle-suppressions.xml | 40 ++ checkstyle.xml | 360 ++++++++++++++++++ pmdrules.xml | 108 ++++++ pom.xml | 147 ++++++- .../olyutorskii/doubdabc/BcdRegister.java | 182 +++++---- .../olyutorskii/doubdabc/package-info.java | 16 +- .../olyutorskii/doubdabc/BcdRegisterTest.java | 21 + 8 files changed, 811 insertions(+), 79 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 checkstyle-suppressions.xml create mode 100644 checkstyle.xml create mode 100644 pmdrules.xml diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3d54c78 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +DoubDabC Changelog +=================== + +## v1.102.4 +Released on 2017-02-XX +- Speed-up converting +- Add static code analysis report plugin. (checkstyle,PMD,FindBugs) +- Add code coverage report plugin. (Jacoco) +- Add SCM info to POM. #13 +- Add CHANGELOG.md #14 + +## v1.101.2 +Released on 2017-01-03 +- Initial Release + +--- EOF --- diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml new file mode 100644 index 0000000..2ff4b56 --- /dev/null +++ b/checkstyle-suppressions.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000..d9dbff2 --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pmdrules.xml b/pmdrules.xml new file mode 100644 index 0000000..738aa59 --- /dev/null +++ b/pmdrules.xml @@ -0,0 +1,108 @@ + + + + + + + + custom rulesets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index 20f6147..e26f1bb 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ io.github.olyutorskii doubdabc - 1.102.2 + 1.102.4 jar DoubDabC @@ -64,6 +64,12 @@ + + scm:git:git://github.com/olyutorskii/DoubDabC.git + scm:git:git@github.com:olyutorskii/DoubDabC.git + https://github.com/olyutorskii/DoubDabC + + GitHub https://github.com/olyutorskii/DoubDabC/issues @@ -85,6 +91,24 @@ en en + -Duser.language=en + + 0.7.8 + + 2.17 + 6.19 + ${project.basedir}/checkstyle.xml + ${project.basedir}/checkstyle-suppressions.xml + false + + 3.7 + + 3.0.4 + Max + Low + + true + @@ -104,7 +128,28 @@ - + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-plugin.version} + + + com.puppycrawl.tools + checkstyle + + ${checkstyleruntime.version} + + + + + + + @@ -185,6 +230,47 @@ + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + default-check + + check + + + + + BUNDLE + + + COMPLEXITY + COVEREDRATIO + 0.60 + + + + + + + + + org.apache.maven.plugins maven-jar-plugin @@ -264,6 +350,12 @@ + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-plugin.version} + + @@ -330,22 +422,69 @@ + + org.apache.maven.plugins + maven-jxr-plugin + 2.5 + + org.apache.maven.plugins maven-surefire-report-plugin 2.19.1 + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + + report + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-plugin.version} + + + + checkstyle + + + + + + + org.apache.maven.plugins + maven-pmd-plugin + ${pmd-plugin.version} - false + + ${project.basedir}/pmdrules.xml + - report-only + pmd + cpd + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs-plugin.version} + + diff --git a/src/main/java/io/github/olyutorskii/doubdabc/BcdRegister.java b/src/main/java/io/github/olyutorskii/doubdabc/BcdRegister.java index 02f080f..9782af5 100644 --- a/src/main/java/io/github/olyutorskii/doubdabc/BcdRegister.java +++ b/src/main/java/io/github/olyutorskii/doubdabc/BcdRegister.java @@ -23,13 +23,16 @@ * *

Signed(negative) decimal value is not supported. * - * @see + * @see * Double dabble (Wikipedia) * - * @see + * @see * Binary-coded decimal (Wikipedia) * - * @see + * @see * Bi-quinary coded decimal (Wikipedia) * */ @@ -40,25 +43,27 @@ public class BcdRegister { * *

("4294967295".length) */ - public static final int MAX_COL_UINT32 = 10; // 4294967295 + public static final int MAX_COL_UINT32 = 10; /** * Max decimal digits for unsigned int64. * *

("18446744073709551615".length) */ - public static final int MAX_COL_UINT64 = 20; // 18446744073709551615 - // ->12345678901234567890<- + public static final int MAX_COL_UINT64 = 20; private static final int PRIM_BITSIZE = Integer.SIZE; + private static final int BYTE_BITSIZE = Byte.SIZE; private static final int BCD_BITSIZE = 4; private static final int PRIM_SLOTS = PRIM_BITSIZE / BCD_BITSIZE; private static final int LSB_PRIMMASK = 0b1; private static final int MSB_PRIMMASK = 0b1 << (PRIM_BITSIZE - 1); - private static final int NIBBLE_MASK = // 0b1111 + private static final int NIBBLE_MASK = // 0b1111 (0b1 << BCD_BITSIZE) - 1; + private static final int BYTE_MASK = // 0b1111_1111 + (0b1 << BYTE_BITSIZE) - 1; private static final int PRIMIDX_SHIFT = 3; // [ / 8] [>>> 3] private static final int NBLIDX_MASK = // [mod 8] [& 0b111] @@ -68,27 +73,48 @@ public class BcdRegister { private static final char CH_OPEN = '['; private static final char CH_CLOSE = ']'; - private static final int[] NIBBLE_IDX; // {0,4,8...,24} private static final char[] HEXCH_TBL = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', }; + private static final int[] BQ_TBL; + + static{ - NIBBLE_IDX = new int[PRIM_SLOTS]; - for(int ct = 0; ct < PRIM_SLOTS; ct++){ - NIBBLE_IDX[ct] = BCD_BITSIZE * ct; + // build lookup table for Packed-BCD to Bi-quinary conversion + BQ_TBL = new int[256]; + + int idx = 0; + for(int highDec = 0; highDec < 16; highDec++){ + int highBq; + if (highDec >= 10) highBq = 0x0; + else if(highDec >= 5) highBq = highDec + 3; + else highBq = highDec; + + for(int lowDec = 0; lowDec < 16; lowDec++){ + int lowBq; + if (lowDec >= 10) lowBq = 0x0; + else if(lowDec >= 5) lowBq = lowDec + 3; + else lowBq = lowDec; + + int bqNblNbl = (highBq << BCD_BITSIZE) | lowBq; + + BQ_TBL[idx++] = bqNblNbl; + } } + + assert idx == BQ_TBL.length; } static{ assert 0b1 << PRIMIDX_SHIFT == PRIM_SLOTS; - assert NIBBLE_IDX.length == PRIM_SLOTS; + assert (-1 & NBLIDX_MASK) == PRIM_SLOTS - 1; assert HEXCH_TBL.length == 0b1 << BCD_BITSIZE; } - private final int digits; + private final int maxDigits; private final int[] ibuf; private int precision; // negative value if unknown. @@ -107,8 +133,8 @@ public BcdRegister(int maxDigits) throws IllegalArgumentException{ if(maxDigits <= 0) throw new IllegalArgumentException(); - this.digits = fittingContainer(maxDigits); - this.ibuf = new int[this.digits / PRIM_SLOTS]; + this.maxDigits = fittingContainer(maxDigits); + this.ibuf = new int[this.maxDigits / PRIM_SLOTS]; this.precision = 1; // Zero-value has precision 1 @@ -156,15 +182,23 @@ private static int fittingContainer(int digits){ * @return modified value */ public static int toBiQuinary(int iVal){ - int result = iVal; + int result; + int bVal; - for(int nibblePos : NIBBLE_IDX){ - int bcd = (iVal >>> nibblePos) & NIBBLE_MASK; - if(bcd > 0x4){ - int three = 0x3 << nibblePos; - result += three; // never carry over between nibbles - } - } + bVal = (iVal >>> 24); + result = BQ_TBL[bVal]; + + bVal = (iVal >>> 16) & BYTE_MASK; + result <<= BYTE_BITSIZE; + result |= BQ_TBL[bVal]; + + bVal = (iVal >>> 8) & BYTE_MASK; + result <<= BYTE_BITSIZE; + result |= BQ_TBL[bVal]; + + bVal = iVal & BYTE_MASK; + result <<= BYTE_BITSIZE; + result |= BQ_TBL[bVal]; return result; } @@ -192,7 +226,7 @@ public void clear(){ * @return digits holder width */ public int getMaxDigits(){ - return this.digits; + return this.maxDigits; } /** @@ -206,14 +240,16 @@ public int getDigit(int digitPos) throws IndexOutOfBoundsException{ int iIdx; int iMod; - iIdx = digitPos >> PRIMIDX_SHIFT; + iIdx = digitPos >> PRIMIDX_SHIFT; // Arithmetic shift to keep sign // = digitPos / 8; iMod = digitPos & NBLIDX_MASK; // = digitPos % 8; int iVal = this.ibuf[iIdx]; - int shiftWidth = NIBBLE_IDX[iMod]; + int shiftWidth = iMod << 2; + // = iMod * 4; + iVal >>>= shiftWidth; iVal &= NIBBLE_MASK; @@ -242,23 +278,19 @@ public int toIntArray(int[] dst, int offset) int digitsCt = getPrecision(); int addPos = digitsCt - 1; - int buflen = this.ibuf.length; - outer: - for(int iIdx = 0; iIdx < buflen; iIdx++){ - int iVal = this.ibuf[iIdx]; + for(int iVal : this.ibuf){ + for(int nblIdx = 0; nblIdx < PRIM_SLOTS; nblIdx++){ + int shPos = nblIdx << 2; + // = nblIdx * 4; - int lastNblIdx = NIBBLE_IDX.length - 1; - for(int nblIdx = 0; nblIdx <= lastNblIdx; nblIdx++){ - int shPos = NIBBLE_IDX[nblIdx]; - int shifted = iVal >>> shPos; - int maskedValue = shifted & NIBBLE_MASK; + dst[offset + addPos] = (iVal >>> shPos) & NIBBLE_MASK; - int dstPos = offset + addPos; - dst[dstPos] = maskedValue; + if(addPos <= 0) break; - if(addPos > 0) addPos--; - else break outer; + addPos--; } + + if(addPos <= 0) break; } return digitsCt; @@ -350,32 +382,30 @@ public int getPrecision(){ * @return decimal precision. */ private int calcPrecision(){ - int result = this.digits; + int result = this.maxDigits; int idxMax = this.ibuf.length - 1; - outer: for(int iIdx = idxMax; iIdx >= 0; iIdx--){ int iVal = this.ibuf[iIdx]; if(iVal == 0){ result -= PRIM_SLOTS; - continue; - } - - int lastNblIdx = NIBBLE_IDX.length - 1; - for(int nblIdx = lastNblIdx; nblIdx >= 0; nblIdx--){ - int shPos = NIBBLE_IDX[nblIdx]; - int nibbleMask = NIBBLE_MASK << shPos; - int maskedValue = iVal & nibbleMask; - - if(maskedValue != 0){ - break outer; + }else{ + // Count Leading Zero nibbles(BCD) + if((iVal & 0xff_ff_00_00) == 0){ + result -= 4; + iVal <<= 16; + } + if((iVal & 0xff_00_00_00) == 0){ + result -= 2; + iVal <<= 8; + } + if((iVal & 0xf0_00_00_00) == 0){ + result -= 1; } - result--; + break; } - - assert false; } return result; @@ -394,15 +424,17 @@ public String toString(){ boolean dumped = false; int validCols = getPrecision(); for(int colCt = validCols - 1; colCt >= 0; colCt--){ - int iIdx = colCt >>> PRIMIDX_SHIFT; // / PRIM_SLOTS; - int nblIdx = colCt & NBLIDX_MASK; // % PRIM_SLOTS; + int iIdx = colCt >>> PRIMIDX_SHIFT; + // = colCt / 8; + int nblIdx = colCt & NBLIDX_MASK; + // = colCt % 8; int iVal = this.ibuf[iIdx]; - int shPos = NIBBLE_IDX[nblIdx]; + int shiftWidth = nblIdx << 2; + // = nblIdx * 4; - int nibbleMask = NIBBLE_MASK << shPos; - int maskedValue = iVal & nibbleMask; - int nibble = maskedValue >>> shPos; + iVal >>>= shiftWidth; + int nibble = iVal & NIBBLE_MASK; if(dumped){ sb.append(SP); @@ -425,18 +457,24 @@ public String toString(){ * @param nibble BCD nibble value. (0 =< nibble < 10) */ private void dumpNibble(StringBuilder sb, int nibble){ - for(int bitIdx = BCD_BITSIZE - 1; bitIdx >= 0; bitIdx--){ - int bMask = LSB_PRIMMASK << bitIdx; - int bool = nibble & bMask; - - char boolCh; - if(bool == 0) boolCh = HEXCH_TBL[0]; - else boolCh = HEXCH_TBL[1]; - sb.append(boolCh); - } - - assert nibble < 10; + int b3 = (nibble >> 3) & LSB_PRIMMASK; + int b2 = (nibble >> 2) & LSB_PRIMMASK; + int b1 = (nibble >> 1) & LSB_PRIMMASK; + int b0 = (nibble ) & LSB_PRIMMASK; + + char c3 = HEXCH_TBL[b3]; + char c2 = HEXCH_TBL[b2]; + char c1 = HEXCH_TBL[b1]; + char c0 = HEXCH_TBL[b0]; + + sb.append(c3); + sb.append(c2); + sb.append(c1); + sb.append(c0); + + assert nibble < 16; char decCh = HEXCH_TBL[nibble]; + sb.append(CH_OPEN); sb.append(decCh); sb.append(CH_CLOSE); diff --git a/src/main/java/io/github/olyutorskii/doubdabc/package-info.java b/src/main/java/io/github/olyutorskii/doubdabc/package-info.java index 1e8c6fe..edb718c 100644 --- a/src/main/java/io/github/olyutorskii/doubdabc/package-info.java +++ b/src/main/java/io/github/olyutorskii/doubdabc/package-info.java @@ -15,13 +15,23 @@ * *

So, DoubDabC is Fast and GC-friendly. * - * @see + *

Project Home : + * + * DoubDabC GitHub Wiki page + * + * + * + * @see * Double dabble (Wikipedia) * - * @see + * @see * Binary-coded decimal (Wikipedia) * - * @see + * @see * Bi-quinary coded decimal (Wikipedia) * */ diff --git a/src/test/java/io/github/olyutorskii/doubdabc/BcdRegisterTest.java b/src/test/java/io/github/olyutorskii/doubdabc/BcdRegisterTest.java index 198047e..c3d4f49 100644 --- a/src/test/java/io/github/olyutorskii/doubdabc/BcdRegisterTest.java +++ b/src/test/java/io/github/olyutorskii/doubdabc/BcdRegisterTest.java @@ -71,6 +71,27 @@ public void testClear() { @Test public void testGetDigit() { System.out.println("getDigit"); + + BcdRegister bs; + + bs = new BcdRegister(8); + + assertEquals(0, bs.getDigit(0)); + assertEquals(0, bs.getDigit(1)); + assertEquals(0, bs.getDigit(7)); + + try{ + bs.getDigit(8); + fail(); + }catch(IndexOutOfBoundsException e){ + } + + try{ + bs.getDigit(-1); + fail(); + }catch(IndexOutOfBoundsException e){ + } + return; }