Skip to content

Commit 44d1f6d

Browse files
committed
wip
1 parent bb3e38a commit 44d1f6d

14 files changed

Lines changed: 1372 additions & 9 deletions

modules/platforms/cpp/ignite/common/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@ set(SOURCES
4747
big_integer.cpp
4848
detail/mpi.cpp
4949
detail/string_utils.cpp
50+
detail/string_extensions.cpp
5051
detail/thread_timer.cpp
5152
uuid.cpp
53+
detail/hash_calculator.cpp
54+
detail/hash_utils.cpp
55+
detail/Murmur3Hash.cpp
5256
)
5357

5458
add_library(${TARGET} STATIC ${SOURCES})
@@ -71,3 +75,4 @@ ignite_test(thread_timer_test DISCOVER SOURCES detail/thread_timer_test.cpp LIBS
7175
ignite_test(uuid_test DISCOVER SOURCES uuid_test.cpp LIBS ${TARGET})
7276
ignite_test(bignum_test DISCOVER SOURCES bignum_test.cpp LIBS ${TARGET})
7377
ignite_test(primitive_test DISCOVER SOURCES primitive_test.cpp LIBS ${TARGET})
78+
ignite_test(hash_utils_test DISCOVER SOURCES detail/hash_utils_test.cpp LIBS ${TARGET})

modules/platforms/cpp/ignite/common/big_decimal.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,34 @@ big_decimal::big_decimal(const std::byte *data, std::size_t size) {
4040
m_magnitude = big_integer(data + sizeof(m_scale), size - sizeof(m_scale));
4141
}
4242

43-
void big_decimal::set_scale(std::int16_t new_scale, big_decimal &res) const {
44-
if (m_scale == new_scale)
43+
void big_decimal::set_scale(std::int16_t new_scale, big_decimal &res, rounding_mode r_mode) const {
44+
if (m_scale == new_scale) {
45+
res = *this;
4546
return;
47+
}
48+
4649

4750
auto diff = std::int16_t(m_scale - new_scale);
4851

4952
big_integer adjustment;
5053

5154
if (diff > 0) {
5255
big_integer::get_power_of_ten(diff, adjustment);
56+
big_integer rem;
57+
58+
m_magnitude.divide(adjustment, res.m_magnitude, &rem);
5359

54-
m_magnitude.divide(adjustment, res.m_magnitude);
60+
if (r_mode == rounding_mode::HALF_UP) {
61+
rem.add(rem, rem);
62+
if (rem.compare(adjustment, true) >= 0) {
63+
static const big_integer plus_one{1};
64+
static const big_integer minus_one{-1};
65+
66+
auto& fix = rem.get_sign() == 1 ? plus_one : minus_one;
67+
68+
res.m_magnitude.add(fix, res.m_magnitude);
69+
}
70+
}
5571
} else {
5672
big_integer::get_power_of_ten(-diff, adjustment);
5773

modules/platforms/cpp/ignite/common/big_decimal.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ namespace ignite {
3434
*/
3535
class big_decimal {
3636
public:
37+
38+
enum class rounding_mode {
39+
// TODO support other rounding modes
40+
DOWN,
41+
HALF_UP
42+
};
43+
3744
// Default
3845
big_decimal() = default;
3946

@@ -51,7 +58,7 @@ class big_decimal {
5158
*/
5259
big_decimal(const std::int8_t *mag, std::int32_t len, std::int16_t scale, std::int8_t sign, bool big_endian = true)
5360
: m_scale(std::int16_t(scale & 0x7FFF))
54-
, m_magnitude(mag, len, sign, big_endian) {}
61+
, m_magnitude(mag, len, sign, big_endian) { }
5562

5663
/**
5764
* Constructs a big decimal from the byte array.
@@ -67,7 +74,7 @@ class big_decimal {
6774
* @param val Integer value.
6875
*/
6976
explicit big_decimal(int64_t val)
70-
: m_magnitude(val) {}
77+
: m_magnitude(val) { }
7178

7279
/**
7380
* Integer constructor with scale.
@@ -77,7 +84,7 @@ class big_decimal {
7784
*/
7885
big_decimal(int64_t val, int16_t scale)
7986
: m_scale(scale)
80-
, m_magnitude(val) {}
87+
, m_magnitude(val) { }
8188

8289
/**
8390
* big_integer constructor with scale.
@@ -87,7 +94,7 @@ class big_decimal {
8794
*/
8895
big_decimal(const big_integer &val, int16_t scale)
8996
: m_scale(scale)
90-
, m_magnitude(val) {}
97+
, m_magnitude(val) { }
9198

9299
/**
93100
* big_integer constructor with scale.
@@ -97,7 +104,7 @@ class big_decimal {
97104
*/
98105
big_decimal(big_integer &&val, int16_t scale)
99106
: m_scale(scale)
100-
, m_magnitude(std::forward<big_integer>(val)) {}
107+
, m_magnitude(std::forward<big_integer>(val)) { }
101108

102109
/**
103110
* String constructor.
@@ -212,7 +219,7 @@ class big_decimal {
212219
* @param scale Scale to set.
213220
* @param res Result is placed here. Can be *this.
214221
*/
215-
void set_scale(std::int16_t new_scale, big_decimal &res) const;
222+
void set_scale(std::int16_t new_scale, big_decimal &res, rounding_mode r_mode = rounding_mode::DOWN) const;
216223

217224
/**
218225
* Get precision of the Decimal.

modules/platforms/cpp/ignite/common/bignum_test.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,3 +1290,37 @@ TEST(bignum, TestDoubleCast) {
12901290
CheckDoubleCast(-0.00000000000001);
12911291
CheckDoubleCast(-0.000000000000001);
12921292
}
1293+
1294+
1295+
struct big_decimal_rounding_tc {
1296+
big_decimal initial;
1297+
int16_t new_scale;
1298+
big_decimal expected;
1299+
};
1300+
1301+
class big_decimal_rounding_test : public ::testing::TestWithParam<big_decimal_rounding_tc> {};
1302+
1303+
TEST_P(big_decimal_rounding_test, TestScaleWithRoundHalfUp) {
1304+
auto [initial, new_scale, expected] = GetParam();;
1305+
1306+
big_decimal actual;
1307+
initial.set_scale(new_scale, actual, big_decimal::rounding_mode::HALF_UP);
1308+
1309+
ASSERT_EQ(expected, actual);
1310+
}
1311+
1312+
INSTANTIATE_TEST_SUITE_P(
1313+
ScaleWithRoundHalfUp,
1314+
big_decimal_rounding_test,
1315+
::testing::Values(
1316+
big_decimal_rounding_tc{big_decimal{0}, 0, big_decimal{0}},
1317+
big_decimal_rounding_tc{big_decimal{1}, 0, big_decimal{1}},
1318+
big_decimal_rounding_tc{big_decimal{-1}, 0, big_decimal{-1}},
1319+
big_decimal_rounding_tc{big_decimal{"1.5"}, 0, big_decimal{2}},
1320+
big_decimal_rounding_tc{big_decimal{"-1.5"}, 0, big_decimal{-2}},
1321+
big_decimal_rounding_tc{big_decimal{"3.64586"}, 2, big_decimal{"3.65"}},
1322+
big_decimal_rounding_tc{big_decimal{"3.64586"}, 1, big_decimal{"3.6"}},
1323+
big_decimal_rounding_tc{big_decimal{"-3.64586"}, 2, big_decimal{"-3.65"}},
1324+
big_decimal_rounding_tc{big_decimal{"-3.64586"}, 1, big_decimal{"-3.6"}}
1325+
)
1326+
);

0 commit comments

Comments
 (0)