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 {
 

Reply via email to