diff options
author | lukebhan <luke.bhan@vanderbilt.edu> | 2021-08-06 18:06:11 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-08-12 21:45:10 +0000 |
commit | 691d4c3db4b13c60a1c4cd3e210de4c983f186b3 (patch) | |
tree | e49487cb7bf9ca4971baee58bdbeeaa611335a54 /src/mongo/platform | |
parent | 4cdb2c6340c7c13be51ba12e0f3d5437e27c9bf0 (diff) | |
download | mongo-691d4c3db4b13c60a1c4cd3e210de4c983f186b3.tar.gz |
SERVER-59139 refactor to use abseil for int128
Diffstat (limited to 'src/mongo/platform')
-rw-r--r-- | src/mongo/platform/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/platform/int128.h | 6 | ||||
-rw-r--r-- | src/mongo/platform/int128_test.cpp | 59 |
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); +} |