Commit 666fc126 by Abseil Team Committed by Gennadiy Rozental

Export of internal Abseil changes.

--
bc89d3221e3927d08881d75eeee0e8db862300fa by Benjamin Barenblat <bbaren@google.com>:

Clean up C-style casts in `ABSL_ASSERT`

PiperOrigin-RevId: 241932756

--
17482daae4b3e2fc725b759586590ac466b72a1e by Jon Cohen <cohenjon@google.com>:

Move Gtest-specific CMake code to its own directory

PiperOrigin-RevId: 241920192

--
9ae52b4f665625352c0a789cff884bde492c28f5 by CJ Johnson <johnsoncj@google.com>:

Moves private data methods from InlinedVector to InlinedVector Storage in anticipation of migrating the Rep union type

PiperOrigin-RevId: 241794144

--
95315bc50a61a0aae4f171b44c2312158a43e72e by Jon Cohen <cohenjon@google.com>:

Use /DNOMINMAX in Abseil tests.  This offsets inlcudes of <windows.h> from gtest.

PiperOrigin-RevId: 241790584

--
ee505c7f2ab99d29c165ea21a07190474f64053d by CJ Johnson <johnsoncj@google.com>:

Adds inlined_vector_internal to the deps of inlined_vector in CMakeLists.txt

PiperOrigin-RevId: 241775332

--
94eb5165b49bab59ce7de143be38a4581d5658da by CJ Johnson <johnsoncj@google.com>:

Migrates InlinedVector Storage to class Metadata for compatibility with the eventual member-wise migration to the new exception safe implementation

PiperOrigin-RevId: 241633420

--
f99e172caad1ec8b35bf7bbabaf2833d55a6f055 by Abseil Team <absl-team@google.com>:

Add MSVC specific linker flags only to MSVC builds.

PiperOrigin-RevId: 241615711

--
3ad19d2779281e945bdf56643dc5cee3f730eb4f by Abseil Team <absl-team@google.com>:

Add a comment about per-process randomization of absl::Hash.

PiperOrigin-RevId: 241583697

--
8dfb02d725fee3528351b2da4ed32a7455f9858a by Tom Manshreck <shreck@google.com>:

Internal change

PiperOrigin-RevId: 241564734
GitOrigin-RevId: bc89d3221e3927d08881d75eeee0e8db862300fa
Change-Id: Ibad3da416d08a96ec1f8313f8b519b4270b7e01a
parent 93dfcf74
...@@ -90,7 +90,7 @@ endif() ...@@ -90,7 +90,7 @@ endif()
if(BUILD_TESTING) if(BUILD_TESTING)
if(${ABSL_USE_GOOGLETEST_HEAD}) if(${ABSL_USE_GOOGLETEST_HEAD})
include(CMake/DownloadGTest.cmake) include(CMake/Googletest/DownloadGTest.cmake)
set(absl_gtest_src_dir ${CMAKE_BINARY_DIR}/googletest-src) set(absl_gtest_src_dir ${CMAKE_BINARY_DIR}/googletest-src)
set(absl_gtest_build_dir ${CMAKE_BINARY_DIR}/googletest-build) set(absl_gtest_build_dir ${CMAKE_BINARY_DIR}/googletest-build)
endif() endif()
......
...@@ -191,10 +191,11 @@ enum LinkerInitialized { ...@@ -191,10 +191,11 @@ enum LinkerInitialized {
// This macro is inspired by // This macro is inspired by
// https://akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/ // https://akrzemi1.wordpress.com/2017/05/18/asserts-in-constexpr-functions/
#if defined(NDEBUG) #if defined(NDEBUG)
#define ABSL_ASSERT(expr) (false ? (void)(expr) : (void)0) #define ABSL_ASSERT(expr) \
(false ? static_cast<void>(expr) : static_cast<void>(0))
#else #else
#define ABSL_ASSERT(expr) \ #define ABSL_ASSERT(expr) \
(ABSL_PREDICT_TRUE((expr)) ? (void)0 \ (ABSL_PREDICT_TRUE((expr)) ? static_cast<void>(0) \
: [] { assert(false && #expr); }()) // NOLINT : [] { assert(false && #expr); }()) // NOLINT
#endif #endif
......
...@@ -123,6 +123,7 @@ cc_library( ...@@ -123,6 +123,7 @@ cc_library(
copts = ABSL_DEFAULT_COPTS, copts = ABSL_DEFAULT_COPTS,
linkopts = ABSL_DEFAULT_LINKOPTS, linkopts = ABSL_DEFAULT_LINKOPTS,
deps = [ deps = [
":compressed_tuple",
"//absl/meta:type_traits", "//absl/meta:type_traits",
], ],
) )
......
...@@ -115,6 +115,7 @@ absl_cc_library( ...@@ -115,6 +115,7 @@ absl_cc_library(
COPTS COPTS
${ABSL_DEFAULT_COPTS} ${ABSL_DEFAULT_COPTS}
DEPS DEPS
absl::compressed_tuple
absl::type_traits absl::type_traits
PUBLIC PUBLIC
) )
...@@ -129,6 +130,7 @@ absl_cc_library( ...@@ -129,6 +130,7 @@ absl_cc_library(
DEPS DEPS
absl::algorithm absl::algorithm
absl::core_headers absl::core_headers
absl::inlined_vector_internal
absl::throw_delegate absl::throw_delegate
absl::memory absl::memory
PUBLIC PUBLIC
......
...@@ -18,7 +18,9 @@ ...@@ -18,7 +18,9 @@
#include <cstddef> #include <cstddef>
#include <iterator> #include <iterator>
#include <memory> #include <memory>
#include <utility>
#include "absl/container/internal/compressed_tuple.h"
#include "absl/meta/type_traits.h" #include "absl/meta/type_traits.h"
namespace absl { namespace absl {
...@@ -31,6 +33,8 @@ template <template <typename, size_t, typename> class InlinedVector, typename T, ...@@ -31,6 +33,8 @@ template <template <typename, size_t, typename> class InlinedVector, typename T,
size_t N, typename A> size_t N, typename A>
class Storage<InlinedVector<T, N, A>> { class Storage<InlinedVector<T, N, A>> {
public: public:
class Allocation; // TODO(johnsoncj): Remove after migration
using allocator_type = A; using allocator_type = A;
using value_type = typename allocator_type::value_type; using value_type = typename allocator_type::value_type;
using pointer = typename allocator_type::pointer; using pointer = typename allocator_type::pointer;
...@@ -45,38 +49,63 @@ class Storage<InlinedVector<T, N, A>> { ...@@ -45,38 +49,63 @@ class Storage<InlinedVector<T, N, A>> {
using reverse_iterator = std::reverse_iterator<iterator>; using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>;
explicit Storage(const allocator_type& a) : allocator_and_tag_(a) {} explicit Storage(const allocator_type& alloc)
: metadata_(alloc, /* empty and inlined */ 0) {}
// TODO(johnsoncj): Make the below types and members private after migration size_type GetSize() const { return GetSizeAndIsAllocated() >> 1; }
// Holds whether the vector is allocated or not in the lowest bit and the size bool GetIsAllocated() const { return GetSizeAndIsAllocated() & 1; }
// in the high bits:
// `size_ = (size << 1) | is_allocated;`
class Tag {
size_type size_;
public: Allocation& GetAllocation() {
Tag() : size_(0) {} return reinterpret_cast<Allocation&>(rep_.allocation_storage.allocation);
size_type size() const { return size_ / 2; } }
void add_size(size_type n) { size_ += n * 2; }
void set_inline_size(size_type n) { size_ = n * 2; }
void set_allocated_size(size_type n) { size_ = (n * 2) + 1; }
bool allocated() const { return size_ % 2; }
};
// Derives from `allocator_type` to use the empty base class optimization. const Allocation& GetAllocation() const {
// If the `allocator_type` is stateless, we can store our instance for free. return reinterpret_cast<const Allocation&>(
class AllocatorAndTag : private allocator_type { rep_.allocation_storage.allocation);
Tag tag_; }
public: pointer GetInlinedData() {
explicit AllocatorAndTag(const allocator_type& a) : allocator_type(a) {} return reinterpret_cast<pointer>(
Tag& tag() { return tag_; } std::addressof(rep_.inlined_storage.inlined[0]));
const Tag& tag() const { return tag_; } }
allocator_type& allocator() { return *this; }
const allocator_type& allocator() const { return *this; } const_pointer GetInlinedData() const {
}; return reinterpret_cast<const_pointer>(
std::addressof(rep_.inlined_storage.inlined[0]));
}
pointer GetAllocatedData() { return GetAllocation().buffer(); }
const_pointer GetAllocatedData() const { return GetAllocation().buffer(); }
size_type GetAllocatedCapacity() const { return GetAllocation().capacity(); }
allocator_type& GetAllocator() { return metadata_.template get<0>(); }
const allocator_type& GetAllocator() const {
return metadata_.template get<0>();
}
void SetAllocatedSize(size_type size) {
GetSizeAndIsAllocated() = (size << 1) | static_cast<size_type>(1);
}
void SetInlinedSize(size_type size) { GetSizeAndIsAllocated() = size << 1; }
void AddSize(size_type count) { GetSizeAndIsAllocated() += count << 1; }
void InitAllocation(const Allocation& allocation) {
new (static_cast<void*>(std::addressof(rep_.allocation_storage.allocation)))
Allocation(allocation);
}
void SwapSizeAndIsAllocated(Storage& other) {
using std::swap;
swap(GetSizeAndIsAllocated(), other.GetSizeAndIsAllocated());
}
// TODO(johnsoncj): Make the below types private after migration
class Allocation { class Allocation {
size_type capacity_; size_type capacity_;
pointer buffer_; pointer buffer_;
...@@ -95,6 +124,13 @@ class Storage<InlinedVector<T, N, A>> { ...@@ -95,6 +124,13 @@ class Storage<InlinedVector<T, N, A>> {
} }
}; };
private:
size_type& GetSizeAndIsAllocated() { return metadata_.template get<1>(); }
const size_type& GetSizeAndIsAllocated() const {
return metadata_.template get<1>();
}
// Stores either the inlined or allocated representation // Stores either the inlined or allocated representation
union Rep { union Rep {
using ValueTypeBuffer = using ValueTypeBuffer =
...@@ -116,7 +152,7 @@ class Storage<InlinedVector<T, N, A>> { ...@@ -116,7 +152,7 @@ class Storage<InlinedVector<T, N, A>> {
AllocatedRep allocation_storage; AllocatedRep allocation_storage;
}; };
AllocatorAndTag allocator_and_tag_; container_internal::CompressedTuple<allocator_type, size_type> metadata_;
Rep rep_; Rep rep_;
}; };
......
...@@ -16,11 +16,11 @@ elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") ...@@ -16,11 +16,11 @@ elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(ABSL_DEFAULT_COPTS "${ABSL_CLANG_CL_FLAGS}") set(ABSL_DEFAULT_COPTS "${ABSL_CLANG_CL_FLAGS}")
set(ABSL_TEST_COPTS "${ABSL_CLANG_CL_FLAGS};${ABSL_CLANG_CL_TEST_FLAGS}") set(ABSL_TEST_COPTS "${ABSL_CLANG_CL_FLAGS};${ABSL_CLANG_CL_TEST_FLAGS}")
set(ABSL_EXCEPTIONS_FLAG "${ABSL_CLANG_CL_EXCEPTIONS_FLAGS}") set(ABSL_EXCEPTIONS_FLAG "${ABSL_CLANG_CL_EXCEPTIONS_FLAGS}")
set(ABSL_DEFAULT_LINKOPTS "${ABSL_MSVC_LINKOPTS}")
else() else()
set(ABSL_DEFAULT_COPTS "${ABSL_LLVM_FLAGS}") set(ABSL_DEFAULT_COPTS "${ABSL_LLVM_FLAGS}")
set(ABSL_TEST_COPTS "${ABSL_LLVM_FLAGS};${ABSL_LLVM_TEST_FLAGS}") set(ABSL_TEST_COPTS "${ABSL_LLVM_FLAGS};${ABSL_LLVM_TEST_FLAGS}")
set(ABSL_EXCEPTIONS_FLAG "${ABSL_LLVM_EXCEPTIONS_FLAGS}") set(ABSL_EXCEPTIONS_FLAG "${ABSL_LLVM_EXCEPTIONS_FLAGS}")
set(ABSL_DEFAULT_LINKOPTS "${ABSL_MSVC_LINKOPTS}")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# AppleClang doesn't have lsan # AppleClang doesn't have lsan
# https://developer.apple.com/documentation/code_diagnostics # https://developer.apple.com/documentation/code_diagnostics
......
...@@ -211,4 +211,5 @@ list(APPEND ABSL_MSVC_TEST_FLAGS ...@@ -211,4 +211,5 @@ list(APPEND ABSL_MSVC_TEST_FLAGS
"/wd4018" "/wd4018"
"/wd4101" "/wd4101"
"/wd4503" "/wd4503"
"/DNOMINMAX"
) )
...@@ -212,4 +212,5 @@ ABSL_MSVC_TEST_FLAGS = [ ...@@ -212,4 +212,5 @@ ABSL_MSVC_TEST_FLAGS = [
"/wd4018", "/wd4018",
"/wd4101", "/wd4101",
"/wd4503", "/wd4503",
"/DNOMINMAX",
] ]
...@@ -183,6 +183,7 @@ COPT_VARS = { ...@@ -183,6 +183,7 @@ COPT_VARS = {
"/wd4018", # signed/unsigned mismatch "/wd4018", # signed/unsigned mismatch
"/wd4101", # unreferenced local variable "/wd4101", # unreferenced local variable
"/wd4503", # decorated name length exceeded, name was truncated "/wd4503", # decorated name length exceeded, name was truncated
"/DNOMINMAX", # disable the min() and max() macros from <windows.h>
], ],
"ABSL_MSVC_EXCEPTIONS_FLAGS": "ABSL_MSVC_EXCEPTIONS_FLAGS":
MSVC_STYLE_EXCEPTIONS_FLAGS, MSVC_STYLE_EXCEPTIONS_FLAGS,
......
...@@ -36,6 +36,10 @@ ...@@ -36,6 +36,10 @@
// framework by simply combining its state with the state of known, hashable // framework by simply combining its state with the state of known, hashable
// types. Hashing of that combined state is separately done by `absl::Hash`. // types. Hashing of that combined state is separately done by `absl::Hash`.
// //
// One should assume that a hash algorithm is chosen randomly at the start of
// each process. E.g., absl::Hash<int>()(9) in one process and
// absl::Hash<int>()(9) in another process are likely to differ.
//
// Example: // Example:
// //
// // Suppose we have a class `Circle` for which we want to add hashing // // Suppose we have a class `Circle` for which we want to add hashing
......
...@@ -173,6 +173,7 @@ cc_test( ...@@ -173,6 +173,7 @@ cc_test(
cc_library( cc_library(
name = "optional", name = "optional",
srcs = ["internal/optional.h"],
hdrs = ["optional.h"], hdrs = ["optional.h"],
copts = ABSL_DEFAULT_COPTS, copts = ABSL_DEFAULT_COPTS,
linkopts = ABSL_DEFAULT_LINKOPTS, linkopts = ABSL_DEFAULT_LINKOPTS,
......
...@@ -174,6 +174,8 @@ absl_cc_library( ...@@ -174,6 +174,8 @@ absl_cc_library(
optional optional
HDRS HDRS
"optional.h" "optional.h"
SRCS
"internal/optional.h"
COPTS COPTS
${ABSL_DEFAULT_COPTS} ${ABSL_DEFAULT_COPTS}
DEPS DEPS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment