Skip to content

Commit

Permalink
MINIFICPP-1383 fix negative numbers, constexpr
Browse files Browse the repository at this point in the history
  • Loading branch information
szaszm committed Oct 1, 2020
1 parent c3205e7 commit fcdecd3
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 20 deletions.
8 changes: 4 additions & 4 deletions libminifi/include/utils/GeneralUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#ifndef LIBMINIFI_INCLUDE_UTILS_GENERALUTILS_H_
#define LIBMINIFI_INCLUDE_UTILS_GENERALUTILS_H_

#include <cmath>
#include <memory>
#include <type_traits>
#include <utility>
Expand All @@ -43,10 +42,11 @@ using std::make_unique;
#endif /* < C++14 */

template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
T intdiv_ceil(T numerator, T denominator) {
gsl_Expects(numerator >= 0 && denominator > 0);
constexpr T intdiv_ceil(T numerator, T denominator) {
// note: division and remainder is 1 instruction on x86
return numerator / denominator + (numerator % denominator > 0);
return gsl_Expects(denominator != 0), ((numerator >= 0) != (denominator > 0)
? numerator / denominator // negative result rounds towards zero, i.e. up
: numerator / denominator + (numerator % denominator != 0));
}

using gsl::owner;
Expand Down
30 changes: 14 additions & 16 deletions libminifi/test/unit/GeneralUtilsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,20 @@ TEST_CASE("GeneralUtils::make_unique", "[make_unique]") {
REQUIRE("test string" == *pstr);
}

TEST_CASE("GeneralUtils::intdiv_ceil", "[intdiv_ceil]") {
REQUIRE(0 == utils::intdiv_ceil(0, 1));
REQUIRE(0 == utils::intdiv_ceil(0, 2));
REQUIRE(1 == utils::intdiv_ceil(1, 2));
REQUIRE(1 == utils::intdiv_ceil(1, 3));
REQUIRE(1 == utils::intdiv_ceil(3, 3));
REQUIRE(2 == utils::intdiv_ceil(4, 3));
REQUIRE(2 == utils::intdiv_ceil(4, 3));
//REQUIRE(0 == utils::intdiv_ceil(-1, 3));
//REQUIRE(-1 == utils::intdiv_ceil(-3, 3));
//REQUIRE(-1 == utils::intdiv_ceil(-4, 3));
//REQUIRE(2 == utils::intdiv_ceil(-4, -3));
//REQUIRE(2 == utils::intdiv_ceil(-5, -3));
//REQUIRE(0 == utils::intdiv_ceil(1, -3));
//REQUIRE(-1 == utils::intdiv_ceil(5, -3));
}
static_assert(0 == utils::intdiv_ceil(0, 1), "");
static_assert(0 == utils::intdiv_ceil(0, 2), "");
static_assert(1 == utils::intdiv_ceil(1, 2), "");
static_assert(1 == utils::intdiv_ceil(1, 3), "");
static_assert(1 == utils::intdiv_ceil(3, 3), "");
static_assert(2 == utils::intdiv_ceil(4, 3), "");
static_assert(2 == utils::intdiv_ceil(4, 3), "");
static_assert(0 == utils::intdiv_ceil(-1, 3), "");
static_assert(-1 == utils::intdiv_ceil(-3, 3), "");
static_assert(-1 == utils::intdiv_ceil(-4, 3), "");
static_assert(2 == utils::intdiv_ceil(-4, -3), "");
static_assert(2 == utils::intdiv_ceil(-5, -3), "");
static_assert(0 == utils::intdiv_ceil(1, -3), "");
static_assert(-1 == utils::intdiv_ceil(5, -3), "");

TEST_CASE("GeneralUtils::exchange", "[exchange]") {
int a = 1;
Expand Down

0 comments on commit fcdecd3

Please sign in to comment.