summaryrefslogtreecommitdiff
path: root/src/mongo/platform
diff options
context:
space:
mode:
authorlukebhan <luke.bhan@vanderbilt.edu>2021-08-06 18:06:11 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-08-12 21:45:10 +0000
commit691d4c3db4b13c60a1c4cd3e210de4c983f186b3 (patch)
treee49487cb7bf9ca4971baee58bdbeeaa611335a54 /src/mongo/platform
parent4cdb2c6340c7c13be51ba12e0f3d5437e27c9bf0 (diff)
downloadmongo-691d4c3db4b13c60a1c4cd3e210de4c983f186b3.tar.gz
SERVER-59139 refactor to use abseil for int128
Diffstat (limited to 'src/mongo/platform')
-rw-r--r--src/mongo/platform/SConscript1
-rw-r--r--src/mongo/platform/int128.h6
-rw-r--r--src/mongo/platform/int128_test.cpp59
3 files changed, 63 insertions, 3 deletions
diff --git a/src/mongo/platform/SConscript b/src/mongo/platform/SConscript
index 68ab49dad4c..71a0a57772d 100644
--- a/src/mongo/platform/SConscript
+++ b/src/mongo/platform/SConscript
@@ -13,6 +13,7 @@ env.CppUnitTest(
'atomic_word_test.cpp',
'bits_test.cpp',
'endian_test.cpp',
+ 'int128_test.cpp',
'mutex_test.cpp',
'process_id_test.cpp',
'random_test.cpp',
diff --git a/src/mongo/platform/int128.h b/src/mongo/platform/int128.h
index 67c3b27232a..093c33cfe6d 100644
--- a/src/mongo/platform/int128.h
+++ b/src/mongo/platform/int128.h
@@ -29,7 +29,7 @@
#pragma once
-#include <boost/multiprecision/cpp_int.hpp>
+#include <absl/numeric/int128.h>
-using uint128_t = boost::multiprecision::uint128_t;
-using int128_t = boost::multiprecision::int128_t;
+using uint128_t = absl::uint128;
+using int128_t = absl::int128;
diff --git a/src/mongo/platform/int128_test.cpp b/src/mongo/platform/int128_test.cpp
new file mode 100644
index 00000000000..be36cd3c4ed
--- /dev/null
+++ b/src/mongo/platform/int128_test.cpp
@@ -0,0 +1,59 @@
+/**
+ * Copyright (C) 2021-present MongoDB, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the Server Side Public License, version 1,
+ * as published by MongoDB, Inc.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Server Side Public License for more details.
+ *
+ * You should have received a copy of the Server Side Public License
+ * along with this program. If not, see
+ * <http://www.mongodb.com/licensing/server-side-public-license>.
+ *
+ * As a special exception, the copyright holders give permission to link the
+ * code of portions of this program with the OpenSSL library under certain
+ * conditions as described in each individual source file and distribute
+ * linked combinations including the program with the OpenSSL library. You
+ * must comply with the Server Side Public License in all respects for
+ * all of the code used other than as permitted herein. If you modify file(s)
+ * with this exception, you may extend this exception to your version of the
+ * file(s), but you are not obligated to do so. If you do not wish to do so,
+ * delete this exception statement from your version. If you delete this
+ * exception statement from all source files in the program, then also delete
+ * it in the license file.
+ */
+
+#include "mongo/platform/int128.h"
+#include "mongo/unittest/unittest.h"
+
+using namespace mongo;
+
+// Asserts that we can cast to uint128_t and cast back as well that the expected high and low bits
+// after cast are following 2's complement.
+void assertCastIsValid(int128_t val, uint64_t expectedHi, uint64_t expectedLo) {
+ uint128_t castedInt = static_cast<uint128_t>(val);
+ ASSERT_EQUALS(absl::Uint128High64(castedInt), expectedHi);
+ ASSERT_EQUALS(absl::Uint128Low64(castedInt), expectedLo);
+ int128_t backToSigned = static_cast<int128_t>(castedInt);
+ ASSERT_EQUALS(val, backToSigned);
+}
+
+TEST(Int128, TestCastingPositive) {
+ assertCastIsValid(12345, 0, 12345);
+}
+
+TEST(Int128, TestCastingNegative) {
+ assertCastIsValid(-12345, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFCFC7);
+}
+
+TEST(Int128, MaxPositiveInt) {
+ assertCastIsValid(std::numeric_limits<int128_t>::max(), 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF);
+}
+
+TEST(Int128, MaxNegativeInt) {
+ assertCastIsValid(std::numeric_limits<int128_t>::min(), 0x8000000000000000, 0);
+}