Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Gennadiy Civil 2017-10-05 19:52:46 -04:00
commit 764d4bd0fe
7 changed files with 56 additions and 16 deletions

View file

@ -67,7 +67,7 @@ Abseil contains the following C++ library components:
time zones. time zones.
* [`types`](absl/types/) * [`types`](absl/types/)
<br /> The `types` library contains non-container utility types, like a <br /> The `types` library contains non-container utility types, like a
C++11-compatible version of `absl::optional`. C++11-compatible version of the C++17 `std::optional` type.
## License ## License

View file

@ -180,7 +180,7 @@
#ifdef ABSL_HAVE_INTRINSIC_INT128 #ifdef ABSL_HAVE_INTRINSIC_INT128
#error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set #error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set
#elif (defined(__clang__) && defined(__SIZEOF_INT128__) && \ #elif (defined(__clang__) && defined(__SIZEOF_INT128__) && \
!defined(__ppc64__) && !defined(__aarch64__)) || \ !defined(__aarch64__)) || \
(defined(__CUDACC__) && defined(__SIZEOF_INT128__) && \ (defined(__CUDACC__) && defined(__SIZEOF_INT128__) && \
__CUDACC_VER__ >= 70000) || \ __CUDACC_VER__ >= 70000) || \
(!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__) && \ (!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__) && \

View file

@ -124,9 +124,24 @@ class InlinedVector {
InlinedVector(const InlinedVector& v); InlinedVector(const InlinedVector& v);
InlinedVector(const InlinedVector& v, const allocator_type& alloc); InlinedVector(const InlinedVector& v, const allocator_type& alloc);
// This move constructor does not allocate and only moves the underlying
// objects, so its `noexcept` specification depends on whether moving the
// underlying objects can throw or not. We assume
// a) move constructors should only throw due to allocation failure and
// b) if `value_type`'s move constructor allocates, it uses the same
// allocation function as the `InlinedVector`'s allocator, so the move
// constructor is non-throwing if the allocator is non-throwing or
// `value_type`'s move constructor is specified as `noexcept`.
InlinedVector(InlinedVector&& v) noexcept( InlinedVector(InlinedVector&& v) noexcept(
absl::allocator_is_nothrow<allocator_type>::value || absl::allocator_is_nothrow<allocator_type>::value ||
std::is_nothrow_move_constructible<value_type>::value); std::is_nothrow_move_constructible<value_type>::value);
// This move constructor allocates and also moves the underlying objects, so
// its `noexcept` specification depends on whether the allocation can throw
// and whether moving the underlying objects can throw. Based on the same
// assumptions above, the `noexcept` specification is dominated by whether the
// allocation can throw regardless of whether `value_type`'s move constructor
// is specified as `noexcept`.
InlinedVector(InlinedVector&& v, const allocator_type& alloc) noexcept( InlinedVector(InlinedVector&& v, const allocator_type& alloc) noexcept(
absl::allocator_is_nothrow<allocator_type>::value); absl::allocator_is_nothrow<allocator_type>::value);

View file

@ -135,8 +135,11 @@ struct negation : std::integral_constant<bool, !T::value> {};
// //
// Determines whether the passed type `T` is trivially destructable. // Determines whether the passed type `T` is trivially destructable.
// //
// This metafunction is designed to be a drop-in replacement for the C++17 // This metafunction is designed to be a drop-in replacement for the C++11
// `std::is_trivially_destructible()` metafunction. // `std::is_trivially_destructible()` metafunction for platforms that have
// incomplete C++11 support (such as libstdc++ 4.x). On any platforms that do
// fully support C++11, we check whether this yields the same result as the std
// implementation.
// //
// NOTE: the extensions (__has_trivial_xxx) are implemented in gcc (version >= // NOTE: the extensions (__has_trivial_xxx) are implemented in gcc (version >=
// 4.3) and clang. Since we are supporting libstdc++ > 4.7, they should always // 4.3) and clang. Since we are supporting libstdc++ > 4.7, they should always
@ -157,8 +160,11 @@ struct is_trivially_destructible
// //
// Determines whether the passed type `T` is trivially default constructible. // Determines whether the passed type `T` is trivially default constructible.
// //
// This metafunction is designed to be a drop-in replacement for the C++17 // This metafunction is designed to be a drop-in replacement for the C++11
// `std::is_trivially_default_constructible()` metafunction. // `std::is_trivially_default_constructible()` metafunction for platforms that
// have incomplete C++11 support (such as libstdc++ 4.x). On any platforms that
// do fully support C++11, we check whether this yields the same result as the
// std implementation.
// //
// NOTE: according to the C++ standard, Section: 20.15.4.3 [meta.unary.prop] // NOTE: according to the C++ standard, Section: 20.15.4.3 [meta.unary.prop]
// "The predicate condition for a template specialization is_constructible<T, // "The predicate condition for a template specialization is_constructible<T,
@ -199,8 +205,11 @@ struct is_trivially_default_constructible
// //
// Determines whether the passed type `T` is trivially copy constructible. // Determines whether the passed type `T` is trivially copy constructible.
// //
// This metafunction is designed to be a drop-in replacement for the C++17 // This metafunction is designed to be a drop-in replacement for the C++11
// `std::is_trivially_copy_constructible()` metafunction. // `std::is_trivially_copy_constructible()` metafunction for platforms that have
// incomplete C++11 support (such as libstdc++ 4.x). On any platforms that do
// fully support C++11, we check whether this yields the same result as the std
// implementation.
// //
// NOTE: `T obj(declval<const T&>());` needs to be well-formed and not call any // NOTE: `T obj(declval<const T&>());` needs to be well-formed and not call any
// nontrivial operation. Nontrivally destructible types will cause the // nontrivial operation. Nontrivally destructible types will cause the
@ -221,8 +230,11 @@ struct is_trivially_copy_constructible
// //
// Determines whether the passed type `T` is trivially copy assignable. // Determines whether the passed type `T` is trivially copy assignable.
// //
// This metafunction is designed to be a drop-in replacement for the C++17 // This metafunction is designed to be a drop-in replacement for the C++11
// `std::is_trivially_copy_assignable()` metafunction. // `std::is_trivially_copy_assignable()` metafunction for platforms that have
// incomplete C++11 support (such as libstdc++ 4.x). On any platforms that do
// fully support C++11, we check whether this yields the same result as the std
// implementation.
// //
// NOTE: `is_assignable<T, U>::value` is `true` if the expression // NOTE: `is_assignable<T, U>::value` is `true` if the expression
// `declval<T>() = declval<U>()` is well-formed when treated as an unevaluated // `declval<T>() = declval<U>()` is well-formed when treated as an unevaluated

View file

@ -300,6 +300,12 @@ TEST(StrAppend, Basics) {
"World" "World"
}; };
std::string stdstrs[] = {
"std::Hello",
"std::Cruel",
"std::World"
};
absl::string_view pieces[] = {"Hello", "Cruel", "World"}; absl::string_view pieces[] = {"Hello", "Cruel", "World"};
const char* c_strs[] = { const char* c_strs[] = {
@ -324,12 +330,12 @@ TEST(StrAppend, Basics) {
EXPECT_EQ(result.substr(old_size), "CruelWorld"); EXPECT_EQ(result.substr(old_size), "CruelWorld");
old_size = result.size(); old_size = result.size();
absl::StrAppend(&result, strs[0], ", ", pieces[2]); absl::StrAppend(&result, stdstrs[0], ", ", pieces[2]);
EXPECT_EQ(result.substr(old_size), "Hello, World"); EXPECT_EQ(result.substr(old_size), "std::Hello, World");
old_size = result.size(); old_size = result.size();
absl::StrAppend(&result, strs[0], ", ", strs[1], " ", strs[2], "!"); absl::StrAppend(&result, strs[0], ", ", stdstrs[1], " ", strs[2], "!");
EXPECT_EQ(result.substr(old_size), "Hello, Cruel World!"); EXPECT_EQ(result.substr(old_size), "Hello, std::Cruel World!");
old_size = result.size(); old_size = result.size();
absl::StrAppend(&result, pieces[0], ", ", pieces[1], " ", pieces[2]); absl::StrAppend(&result, pieces[0], ", ", pieces[1], " ", pieces[2]);

View file

@ -41,7 +41,7 @@ TEST(SleepForTest, BasicSanity) {
absl::SleepFor(sleep_time); absl::SleepFor(sleep_time);
absl::Time end = absl::Now(); absl::Time end = absl::Now();
EXPECT_LE(sleep_time - absl::Milliseconds(100), end - start); EXPECT_LE(sleep_time - absl::Milliseconds(100), end - start);
EXPECT_GE(sleep_time + absl::Milliseconds(100), end - start); EXPECT_GE(sleep_time + absl::Milliseconds(200), end - start);
} }
#ifdef ABSL_HAVE_ALARM #ifdef ABSL_HAVE_ALARM
@ -62,7 +62,7 @@ TEST(SleepForTest, AlarmSupport) {
absl::Time end = absl::Now(); absl::Time end = absl::Now();
EXPECT_TRUE(alarm_handler_invoked); EXPECT_TRUE(alarm_handler_invoked);
EXPECT_LE(sleep_time - absl::Milliseconds(100), end - start); EXPECT_LE(sleep_time - absl::Milliseconds(100), end - start);
EXPECT_GE(sleep_time + absl::Milliseconds(100), end - start); EXPECT_GE(sleep_time + absl::Milliseconds(200), end - start);
signal(SIGALRM, old_alarm); signal(SIGALRM, old_alarm);
} }
#endif // ABSL_HAVE_ALARM #endif // ABSL_HAVE_ALARM

View file

@ -118,6 +118,13 @@ namespace absl {
// and `is_nothrow_swappable()` is the same as `std::is_trivial()`. // and `is_nothrow_swappable()` is the same as `std::is_trivial()`.
// * `make_optional()` cannot be declared `constexpr` due to the absence of // * `make_optional()` cannot be declared `constexpr` due to the absence of
// guaranteed copy elision. // guaranteed copy elision.
// * The move constructor's `noexcept` specification is stronger, i.e. if the
// default allocator is non-throwing (via setting
// `ABSL_ALLOCATOR_NOTHROW`), it evaluates to `noexcept(true)`, because
// we assume
// a) move constructors should only throw due to allocation failure and
// b) if T's move constructor allocates, it uses the same allocation
// function as the default allocator.
template <typename T> template <typename T>
class optional; class optional;