From 7eecb2660149b0868e67dd24a23989acdef77d88 Mon Sep 17 00:00:00 2001 From: Paolo Di Tommaso Date: Thu, 8 Dec 2022 16:51:40 +0100 Subject: [PATCH] Add MathHelper utility class [ci fast] Signed-off-by: Paolo Di Tommaso --- .../src/main/nextflow/util/MathHelper.groovy | 42 +++++++++++++ .../test/nextflow/util/MathHelperTest.groovy | 62 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 modules/nf-commons/src/main/nextflow/util/MathHelper.groovy create mode 100644 modules/nf-commons/src/test/nextflow/util/MathHelperTest.groovy diff --git a/modules/nf-commons/src/main/nextflow/util/MathHelper.groovy b/modules/nf-commons/src/main/nextflow/util/MathHelper.groovy new file mode 100644 index 0000000000..5478e34ee6 --- /dev/null +++ b/modules/nf-commons/src/main/nextflow/util/MathHelper.groovy @@ -0,0 +1,42 @@ +/* + * Copyright 2020-2022, Seqera Labs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package nextflow.util + +import groovy.transform.CompileStatic + +/** + * Math helper functions + * + * @author Paolo Di Tommaso + */ +@CompileStatic +class MathHelper { + + static int ceilDiv(int x, int y) { + return -Math.floorDiv(-x,y) + } + + static long ceilDiv(long x, long y){ + return -Math.floorDiv(-x,y) + } + + static long ceilDiv(long x, int y){ + return -Math.floorDiv(-x,y) + } + +} diff --git a/modules/nf-commons/src/test/nextflow/util/MathHelperTest.groovy b/modules/nf-commons/src/test/nextflow/util/MathHelperTest.groovy new file mode 100644 index 0000000000..946af2c5a0 --- /dev/null +++ b/modules/nf-commons/src/test/nextflow/util/MathHelperTest.groovy @@ -0,0 +1,62 @@ +/* + * Copyright 2020-2022, Seqera Labs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package nextflow.util + +import spock.lang.Specification +import spock.lang.Unroll + +/** + * + * @author Paolo Di Tommaso + */ +class MathHelperTest extends Specification { + + @Unroll + def 'should validate ceil div int' () { + expect: + MathHelper.ceilDiv(X, Y) == Z + where: + X | Y | Z + 0 | 10 | 0 + 1 | 10 | 1 + 9 | 10 | 1 + 10 | 10 | 1 + 11 | 10 | 2 + 19 | 10 | 2 + 20 | 10 | 2 + 21 | 10 | 3 + } + + @Unroll + def 'should validate ceil div long' () { + expect: + MathHelper.ceilDiv(X, Y) == Z + where: + X | Y | Z + 0 | 10_000_000_000 | 0 + 1 | 10_000_000_000 | 1 + 10_000_000_000-1 | 10_000_000_000 | 1 + 10_000_000_000 | 10_000_000_000 | 1 + and: + 10_000_000_001 | 10_000_000_000 | 2 + 20_000_000_000 | 10_000_000_000 | 2 + and: + 20_000_000_001 | 10_000_000_000 | 3 + 30_000_000_000 | 10_000_000_000 | 3 + } +}