This is an automated email from the ASF dual-hosted git repository.
isapego pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 5cc7ace45d IGNITE-22534 Add double constructor and
serialization/deserialization code to the decimal type (#3949)
5cc7ace45d is described below
commit 5cc7ace45d34a9bc50f370460dafdb73eda93781
Author: Dmitriy Zabotlin <[email protected]>
AuthorDate: Wed Jun 19 12:55:26 2024 +0300
IGNITE-22534 Add double constructor and serialization/deserialization code
to the decimal type (#3949)
Co-authored-by: dzabotlin <[email protected]>
---
.../platforms/cpp/ignite/common/big_decimal.cpp | 19 +++
modules/platforms/cpp/ignite/common/big_decimal.h | 41 ++++++
modules/platforms/cpp/ignite/common/big_integer.h | 2 +-
.../platforms/cpp/ignite/common/bignum_test.cpp | 142 +++++++++++----------
modules/platforms/cpp/ignite/tuple/tuple_test.cpp | 24 ++--
.../platforms/cpp/tests/test-common/test_utils.cpp | 2 +-
6 files changed, 146 insertions(+), 84 deletions(-)
diff --git a/modules/platforms/cpp/ignite/common/big_decimal.cpp
b/modules/platforms/cpp/ignite/common/big_decimal.cpp
index bf06948cc0..f65fb2cbed 100644
--- a/modules/platforms/cpp/ignite/common/big_decimal.cpp
+++ b/modules/platforms/cpp/ignite/common/big_decimal.cpp
@@ -16,11 +16,30 @@
*/
#include "big_decimal.h"
+#include "bytes.h"
#include <cstring>
namespace ignite {
+std::size_t big_decimal::byte_size() const noexcept {
+ return sizeof(m_scale) + get_unscaled_value().byte_size();
+}
+
+void big_decimal::store_bytes(std::byte *data) const {
+ bytes::store<endian::LITTLE, std::int16_t>(data, m_scale);
+ get_unscaled_value().store_bytes(data + sizeof(m_scale));
+}
+
+big_decimal::big_decimal(const std::byte *data, std::size_t size) {
+ if (size < sizeof(m_scale)) {
+ return;
+ }
+
+ m_scale = bytes::load<endian::LITTLE, std::int16_t>(data);
+ m_magnitude = big_integer(data + sizeof(m_scale), size - sizeof(m_scale));
+}
+
void big_decimal::set_scale(std::int16_t new_scale, big_decimal &res) const {
if (m_scale == new_scale)
return;
diff --git a/modules/platforms/cpp/ignite/common/big_decimal.h
b/modules/platforms/cpp/ignite/common/big_decimal.h
index 37c3a21efc..e2e5c074f0 100644
--- a/modules/platforms/cpp/ignite/common/big_decimal.h
+++ b/modules/platforms/cpp/ignite/common/big_decimal.h
@@ -53,6 +53,21 @@ public:
: m_scale(std::int16_t(scale & 0x7FFF))
, m_magnitude(mag, len, sign, big_endian) {}
+ /**
+ * Constructs a big decimal from the byte array.
+ *
+ * @param data Bytes of the decimal. Scale in little byte order, magnitude
as a @ref big_integer.
+ * @param size The number of bytes.
+ */
+ big_decimal(const std::byte *data, std::size_t size);
+
+ /**
+ * Double constructor.
+ *
+ * @param val Double value.
+ */
+ explicit big_decimal(double val) { assign_double(val); }
+
/**
* Integer constructor.
*
@@ -112,6 +127,32 @@ public:
assign_string(val);
}
+ /**
+ * Get number of bytes required to store this decimal as byte array.
+ *
+ * @return Number of bytes required to store this decimal as byte array.
+ */
+ [[nodiscard]] std::size_t byte_size() const noexcept;
+
+ /**
+ * Store this decimal as a byte array.
+ *
+ * @param data Destination byte array. Its size must be at least as large
as the value returned by @ref
+ * byte_size();
+ */
+ void store_bytes(std::byte *data) const;
+
+ /**
+ * Convert value to bytes.
+ *
+ * @return Vector of bytes.
+ */
+ [[nodiscard]] std::vector<std::byte> to_bytes() const {
+ std::vector<std::byte> bytes(byte_size());
+ store_bytes(bytes.data());
+ return bytes;
+ }
+
/**
* Convert to double.
*/
diff --git a/modules/platforms/cpp/ignite/common/big_integer.h
b/modules/platforms/cpp/ignite/common/big_integer.h
index c72a754008..e1955d4be1 100644
--- a/modules/platforms/cpp/ignite/common/big_integer.h
+++ b/modules/platforms/cpp/ignite/common/big_integer.h
@@ -215,7 +215,7 @@ public:
* Store this number as a byte array.
*
* @param data Destination byte array. Its size must be at least as large
as the value returned by @ref
- * bytes_size();
+ * byte_size();
*/
void store_bytes(std::byte *data) const;
diff --git a/modules/platforms/cpp/ignite/common/bignum_test.cpp
b/modules/platforms/cpp/ignite/common/bignum_test.cpp
index 523cadf164..5049def1f3 100644
--- a/modules/platforms/cpp/ignite/common/bignum_test.cpp
+++ b/modules/platforms/cpp/ignite/common/bignum_test.cpp
@@ -62,11 +62,13 @@ void CheckOutputInput(const T &val) {
}
void CheckDoubleCast(double val) {
- big_decimal dec;
+ big_decimal dec1(val);
+ big_decimal dec2;
- dec.assign_double(val);
+ dec2.assign_double(val);
- EXPECT_NEAR(val, dec.to_double(), 1E-10);
+ EXPECT_NEAR(val, dec1.to_double(), 1E-10);
+ EXPECT_NEAR(val, dec2.to_double(), 1E-10);
}
TEST(bignum, TestMultiplyBigIntegerArguments) {
@@ -845,30 +847,30 @@ TEST(bignum, TestInputOutputSimpleDecimal) {
}
TEST(bignum, TestInputSimpleDecimal) {
- CheckOutputInput(big_decimal(0));
-
- CheckOutputInput(big_decimal(1));
- CheckOutputInput(big_decimal(9));
- CheckOutputInput(big_decimal(10));
- CheckOutputInput(big_decimal(11));
- CheckOutputInput(big_decimal(19));
- CheckOutputInput(big_decimal(123));
- CheckOutputInput(big_decimal(1234));
- CheckOutputInput(big_decimal(12345));
- CheckOutputInput(big_decimal(123456));
- CheckOutputInput(big_decimal(1234567));
- CheckOutputInput(big_decimal(12345678));
- CheckOutputInput(big_decimal(123456789));
- CheckOutputInput(big_decimal(1234567890));
- CheckOutputInput(big_decimal(12345678909));
- CheckOutputInput(big_decimal(123456789098));
- CheckOutputInput(big_decimal(1234567890987));
- CheckOutputInput(big_decimal(12345678909876));
- CheckOutputInput(big_decimal(123456789098765));
- CheckOutputInput(big_decimal(1234567890987654));
- CheckOutputInput(big_decimal(12345678909876543));
- CheckOutputInput(big_decimal(123456789098765432));
- CheckOutputInput(big_decimal(1234567890987654321));
+ CheckOutputInput(big_decimal(0L));
+
+ CheckOutputInput(big_decimal(1L));
+ CheckOutputInput(big_decimal(9L));
+ CheckOutputInput(big_decimal(10L));
+ CheckOutputInput(big_decimal(11L));
+ CheckOutputInput(big_decimal(19L));
+ CheckOutputInput(big_decimal(123L));
+ CheckOutputInput(big_decimal(1234L));
+ CheckOutputInput(big_decimal(12345L));
+ CheckOutputInput(big_decimal(123456L));
+ CheckOutputInput(big_decimal(1234567L));
+ CheckOutputInput(big_decimal(12345678L));
+ CheckOutputInput(big_decimal(123456789L));
+ CheckOutputInput(big_decimal(1234567890L));
+ CheckOutputInput(big_decimal(12345678909L));
+ CheckOutputInput(big_decimal(123456789098L));
+ CheckOutputInput(big_decimal(1234567890987L));
+ CheckOutputInput(big_decimal(12345678909876L));
+ CheckOutputInput(big_decimal(123456789098765L));
+ CheckOutputInput(big_decimal(1234567890987654L));
+ CheckOutputInput(big_decimal(12345678909876543L));
+ CheckOutputInput(big_decimal(123456789098765432L));
+ CheckOutputInput(big_decimal(1234567890987654321L));
CheckOutputInput(big_decimal(999999999999999999L));
CheckOutputInput(big_decimal(999999999099999999L));
CheckOutputInput(big_decimal(1000000000000000000L));
@@ -876,28 +878,28 @@ TEST(bignum, TestInputSimpleDecimal) {
CheckOutputInput(big_decimal(1000000005000000000L));
CheckOutputInput(big_decimal(INT64_MAX));
- CheckOutputInput(big_decimal(-1));
- CheckOutputInput(big_decimal(-9));
- CheckOutputInput(big_decimal(-10));
- CheckOutputInput(big_decimal(-11));
- CheckOutputInput(big_decimal(-19));
- CheckOutputInput(big_decimal(-123));
- CheckOutputInput(big_decimal(-1234));
- CheckOutputInput(big_decimal(-12345));
- CheckOutputInput(big_decimal(-123456));
- CheckOutputInput(big_decimal(-1234567));
- CheckOutputInput(big_decimal(-12345678));
- CheckOutputInput(big_decimal(-123456789));
- CheckOutputInput(big_decimal(-1234567890));
- CheckOutputInput(big_decimal(-12345678909));
- CheckOutputInput(big_decimal(-123456789098));
- CheckOutputInput(big_decimal(-1234567890987));
- CheckOutputInput(big_decimal(-12345678909876));
- CheckOutputInput(big_decimal(-123456789098765));
- CheckOutputInput(big_decimal(-1234567890987654));
- CheckOutputInput(big_decimal(-12345678909876543));
- CheckOutputInput(big_decimal(-123456789098765432));
- CheckOutputInput(big_decimal(-1234567890987654321));
+ CheckOutputInput(big_decimal(-1L));
+ CheckOutputInput(big_decimal(-9L));
+ CheckOutputInput(big_decimal(-10L));
+ CheckOutputInput(big_decimal(-11L));
+ CheckOutputInput(big_decimal(-19L));
+ CheckOutputInput(big_decimal(-123L));
+ CheckOutputInput(big_decimal(-1234L));
+ CheckOutputInput(big_decimal(-12345L));
+ CheckOutputInput(big_decimal(-123456L));
+ CheckOutputInput(big_decimal(-1234567L));
+ CheckOutputInput(big_decimal(-12345678L));
+ CheckOutputInput(big_decimal(-123456789L));
+ CheckOutputInput(big_decimal(-1234567890L));
+ CheckOutputInput(big_decimal(-12345678909L));
+ CheckOutputInput(big_decimal(-123456789098L));
+ CheckOutputInput(big_decimal(-1234567890987L));
+ CheckOutputInput(big_decimal(-12345678909876L));
+ CheckOutputInput(big_decimal(-123456789098765L));
+ CheckOutputInput(big_decimal(-1234567890987654L));
+ CheckOutputInput(big_decimal(-12345678909876543L));
+ CheckOutputInput(big_decimal(-123456789098765432L));
+ CheckOutputInput(big_decimal(-1234567890987654321L));
CheckOutputInput(big_decimal(-999999999999999999L));
CheckOutputInput(big_decimal(-999999999099999999L));
CheckOutputInput(big_decimal(-1000000000000000000L));
@@ -1052,27 +1054,27 @@ TEST(bignum, TestDecimalSimple) {
}
TEST(bignum, TestPrecisionSimple) {
- big_decimal test(1);
-
- EXPECT_EQ(big_decimal(-9).get_precision(), 1);
- EXPECT_EQ(big_decimal(-8).get_precision(), 1);
- EXPECT_EQ(big_decimal(-7).get_precision(), 1);
- EXPECT_EQ(big_decimal(-6).get_precision(), 1);
- EXPECT_EQ(big_decimal(-5).get_precision(), 1);
- EXPECT_EQ(big_decimal(-4).get_precision(), 1);
- EXPECT_EQ(big_decimal(-3).get_precision(), 1);
- EXPECT_EQ(big_decimal(-2).get_precision(), 1);
- EXPECT_EQ(big_decimal(-1).get_precision(), 1);
- EXPECT_EQ(big_decimal(0).get_precision(), 1);
- EXPECT_EQ(big_decimal(1).get_precision(), 1);
- EXPECT_EQ(big_decimal(2).get_precision(), 1);
- EXPECT_EQ(big_decimal(3).get_precision(), 1);
- EXPECT_EQ(big_decimal(4).get_precision(), 1);
- EXPECT_EQ(big_decimal(5).get_precision(), 1);
- EXPECT_EQ(big_decimal(6).get_precision(), 1);
- EXPECT_EQ(big_decimal(7).get_precision(), 1);
- EXPECT_EQ(big_decimal(8).get_precision(), 1);
- EXPECT_EQ(big_decimal(9).get_precision(), 1);
+ big_decimal test(1L);
+
+ EXPECT_EQ(big_decimal(-9L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-8L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-7L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-6L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-5L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-4L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-3L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-2L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(-1L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(0L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(1L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(2L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(3L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(4L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(5L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(6L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(7L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(8L).get_precision(), 1);
+ EXPECT_EQ(big_decimal(9L).get_precision(), 1);
EXPECT_EQ(big_decimal(2147483648L).get_precision(), 10); // 2^31: 10
digits
EXPECT_EQ(big_decimal(-2147483647L).get_precision(), 10); // -2^31+1:
10 digits
diff --git a/modules/platforms/cpp/ignite/tuple/tuple_test.cpp
b/modules/platforms/cpp/ignite/tuple/tuple_test.cpp
index f2ba8ae58f..6ef6877e26 100644
--- a/modules/platforms/cpp/ignite/tuple/tuple_test.cpp
+++ b/modules/platforms/cpp/ignite/tuple/tuple_test.cpp
@@ -1124,7 +1124,7 @@ TEST_P(tuple_big_decimal_zeros, DecimalZerosTest) { //
NOLINT(cert-err58-cpp)
}
INSTANTIATE_TEST_SUITE_P(zeros, tuple_big_decimal_zeros,
- testing::Values(big_decimal("0"), big_decimal("-0"),
big_decimal("0E1000"), big_decimal("0E-1000"), big_decimal(0),
+ testing::Values(big_decimal("0"), big_decimal("-0"),
big_decimal("0E1000"), big_decimal("0E-1000"), big_decimal(0L),
big_decimal(std::int64_t(0), 10)));
class tuple_big_decimal : public testing::TestWithParam<big_decimal> {};
@@ -1134,19 +1134,19 @@ TEST_P(tuple_big_decimal, WriteReadEqualityTest) { //
NOLINT(cert-err58-cpp)
}
INSTANTIATE_TEST_SUITE_P(positive_ints, tuple_big_decimal,
- testing::Values(big_decimal(1), big_decimal(9), big_decimal(10),
big_decimal(11), big_decimal(19), big_decimal(123),
- big_decimal(1234), big_decimal(12345), big_decimal(123456),
big_decimal(1234567), big_decimal(12345678),
- big_decimal(123456789), big_decimal(1234567890),
big_decimal(12345678909), big_decimal(123456789098),
- big_decimal(1234567890987), big_decimal(12345678909876),
big_decimal(123456789098765),
- big_decimal(1234567890987654), big_decimal(12345678909876543),
big_decimal(123456789098765432),
- big_decimal(1234567890987654321), big_decimal(999999999999999999L),
big_decimal(999999999099999999L),
- big_decimal(1000000000000000000L), big_decimal(1000000000000000001L),
big_decimal(1000000005000000000L),
- big_decimal(INT64_MAX)));
+ testing::Values(big_decimal(1L), big_decimal(9L), big_decimal(10L),
big_decimal(11L), big_decimal(19L),
+ big_decimal(123L), big_decimal(1234L), big_decimal(12345L),
big_decimal(123456L), big_decimal(1234567L),
+ big_decimal(12345678L), big_decimal(123456789L),
big_decimal(1234567890L), big_decimal(12345678909),
+ big_decimal(123456789098), big_decimal(1234567890987),
big_decimal(12345678909876),
+ big_decimal(123456789098765), big_decimal(1234567890987654),
big_decimal(12345678909876543),
+ big_decimal(123456789098765432), big_decimal(1234567890987654321),
big_decimal(999999999999999999L),
+ big_decimal(999999999099999999L), big_decimal(1000000000000000000L),
big_decimal(1000000000000000001L),
+ big_decimal(1000000005000000000L), big_decimal(INT64_MAX)));
INSTANTIATE_TEST_SUITE_P(negative_ints, tuple_big_decimal,
- testing::Values(big_decimal(-1), big_decimal(-9), big_decimal(-10),
big_decimal(-11), big_decimal(-19),
- big_decimal(-123), big_decimal(-1234), big_decimal(-12345),
big_decimal(-123456), big_decimal(-1234567),
- big_decimal(-12345678), big_decimal(-123456789),
big_decimal(-1234567890), big_decimal(-12345678909),
+ testing::Values(big_decimal(-1L), big_decimal(-9L), big_decimal(-10L),
big_decimal(-11L), big_decimal(-19L),
+ big_decimal(-123L), big_decimal(-1234L), big_decimal(-12345L),
big_decimal(-123456L), big_decimal(-1234567L),
+ big_decimal(-12345678L), big_decimal(-123456789L),
big_decimal(-1234567890L), big_decimal(-12345678909),
big_decimal(-123456789098), big_decimal(-1234567890987),
big_decimal(-12345678909876),
big_decimal(-123456789098765), big_decimal(-1234567890987654),
big_decimal(-12345678909876543),
big_decimal(-123456789098765432), big_decimal(-1234567890987654321),
big_decimal(-999999999999999999L),
diff --git a/modules/platforms/cpp/tests/test-common/test_utils.cpp
b/modules/platforms/cpp/tests/test-common/test_utils.cpp
index abec68787a..c6f74173d8 100644
--- a/modules/platforms/cpp/tests/test-common/test_utils.cpp
+++ b/modules/platforms/cpp/tests/test-common/test_utils.cpp
@@ -23,7 +23,7 @@
#include <filesystem>
#include <functional>
#include <iostream>
-#include <vector>
+#include <thread>
namespace ignite {