Export of internal Abseil changes.
-- c2e2e2b21c3fe59b63279e7418c93c7289ee3e27 by Mark Barolak <mbar@google.com>: Import of CCTZ from GitHub. PiperOrigin-RevId: 256220326 -- 3996b01f0c3eb60f72825b154dce8019b6215f1d by Derek Mauro <dmauro@google.com>: Add GCC 4.9 test script. This will become our new minumum version and GCC 4.8 will be removed soon. PiperOrigin-RevId: 256160891 -- 2c13aa44bc8e497ebae9abe8b8adf73c2152622d by Abseil Team <absl-team@google.com>: [Trivial] tweak flat_hash_map.h doc comment The comment is probably right both ways, but the lack of an "if" here seemed jarring to me. PiperOrigin-RevId: 256089069 -- 16bc03b9b30fbf08d7dc61025fa8ec4b57077be8 by Abseil Team <absl-team@google.com>: Fix symbolization for elf files whose SYMTAB section is stripped, but have a DYNSYM section. Previously, if we did not find a SYMTAB section, we would bail out of symbolization early, rather than checking the DYNSYM section. PiperOrigin-RevId: 256061954 -- 4c60ee329b1eeb0b0d10c4f76f282e5fbae2c5b2 by Derek Mauro <dmauro@google.com>: Update to LLVM r363242 and Bazel 0.27.0 PiperOrigin-RevId: 256024405 -- 18e1ba970d33f122026803d8ca90035b9088949d by Eric Fiselier <ericwf@google.com>: Disable variant tests that break with P0608R3 PiperOrigin-RevId: 255975764 -- 0a89858464977e86096b62476faa3b64eb94aa1d by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 255891019 -- 9b7424cac66f5407f0ed74ed288bf3099a4fa330 by CJ Johnson <johnsoncj@google.com>: Updates the implementation of InlinedVector::insert(...) to be exception safe and adds an exception safety tests for insert(...) PiperOrigin-RevId: 255881809 -- 1288f4ba3883c510d92b09437fb8b051c19aa241 by CJ Johnson <johnsoncj@google.com>: Updates the implementation of InlinedVector::insert(...) to be exception safe and adds an exception safety tests for insert(...) PiperOrigin-RevId: 255875277 -- 39c04f3621491eaff9e2eda619718d5b5f20fbd9 by Abseil Team <absl-team@google.com>: Use a typedef to allow building with NVCC Without this change NVCC fails to compile compressed_tuple.h. NVCC is relevant because TensorFlow uses NVCC on Ubuntu and inclues abseil. PiperOrigin-RevId: 255850176 -- e23f0309ccad69eb508ca02c9034cd4cdd740da0 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 255787167 -- 054aafcebf595077054164f1da3703124ab209b4 by Abseil Team <absl-team@google.com>: Updates the ScopedAllocatorWorks test for InlinedVector to not rely on the byte count allocated by the standard library In doing so, removes LegacyNextCapacityFrom(...) impl function from InlinedVector Also applies clang-format to the test file PiperOrigin-RevId: 255760356 -- eb05fc9f78e3a163c93f1866e9fe9a8ad0d01622 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 255706834 -- 97abb824417604c45d9fcbb3e4ff1aa3000836f2 by Jorg Brown <jorg@google.com>: Enhance compatibility of abseil's strings package with nvcc. PiperOrigin-RevId: 255688500 -- efc5b9c221ee31e15d10b35d31c8f3ae6eddaa8c by Abseil Team <absl-team@google.com>: Follow CCTZ's lead and allow GetWeekday() and GetYearDay() to be called with any civil-time type. A CivilSecond, for example, has a weekday just as much as a CivilDay does. PiperOrigin-RevId: 255659840 -- a75acbe954457919d8c6c8f4c2339b543760b375 by Derek Mauro <dmauro@google.com>: Increase the timeout of randen_engine_test. It seems to timeout under TSAN often enough to justify the increase. PiperOrigin-RevId: 255628086 -- 160976ba47c7c6eb57af08e21f8eb640aa51e91b by Derek Mauro <dmauro@google.com>: Update CMake documentation Fixes https://github.com/abseil/abseil-cpp/issues/332 PiperOrigin-RevId: 255607313 GitOrigin-RevId: c2e2e2b21c3fe59b63279e7418c93c7289ee3e27 Change-Id: Iba4ac7ed23cbcdb22965b4958601f689be92cda4
This commit is contained in:
		
							parent
							
								
									c964fcffac
								
							
						
					
					
						commit
						e6b050212c
					
				
					 27 changed files with 277 additions and 152 deletions
				
			
		|  | @ -37,20 +37,12 @@ section of your executable or of your library.<br> | ||||||
| Here is a short CMakeLists.txt example of a project file using Abseil. | Here is a short CMakeLists.txt example of a project file using Abseil. | ||||||
| 
 | 
 | ||||||
| ```cmake | ```cmake | ||||||
| cmake_minimum_required(VERSION 2.8.12) | cmake_minimum_required(VERSION 3.5) | ||||||
| project(my_project) | project(my_project) | ||||||
| 
 | 
 | ||||||
| set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++ ${CMAKE_CXX_FLAGS}") | # Pick the C++ standard to compile with. | ||||||
| 
 | # Abseil currently supports C++11, C++14, and C++17. | ||||||
| if(MSVC) | set(CMAKE_CXX_STANDARD 11) | ||||||
|   # /wd4005  macro-redefinition |  | ||||||
|   # /wd4068  unknown pragma |  | ||||||
|   # /wd4244  conversion from 'type1' to 'type2' |  | ||||||
|   # /wd4267  conversion from 'size_t' to 'type2' |  | ||||||
|   # /wd4800  force value to bool 'true' or 'false' (performance warning) |  | ||||||
|   add_compile_options(/wd4005 /wd4068 /wd4244 /wd4267 /wd4800) |  | ||||||
|   add_definitions(/DNOMINMAX /DWIN32_LEAN_AND_MEAN=1 /D_CRT_SECURE_NO_WARNINGS) |  | ||||||
| endif() |  | ||||||
| 
 | 
 | ||||||
| add_subdirectory(abseil-cpp) | add_subdirectory(abseil-cpp) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -77,7 +77,7 @@ struct FlatHashMapPolicy; | ||||||
| // NOTE: A `flat_hash_map` stores its value types directly inside its
 | // NOTE: A `flat_hash_map` stores its value types directly inside its
 | ||||||
| // implementation array to avoid memory indirection. Because a `flat_hash_map`
 | // implementation array to avoid memory indirection. Because a `flat_hash_map`
 | ||||||
| // is designed to move data when rehashed, map values will not retain pointer
 | // is designed to move data when rehashed, map values will not retain pointer
 | ||||||
| // stability. If you require pointer stability, or your values are large,
 | // stability. If you require pointer stability, or if your values are large,
 | ||||||
| // consider using `absl::flat_hash_map<Key, std::unique_ptr<Value>>` instead.
 | // consider using `absl::flat_hash_map<Key, std::unique_ptr<Value>>` instead.
 | ||||||
| // If your types are not moveable or you require pointer stability for keys,
 | // If your types are not moveable or you require pointer stability for keys,
 | ||||||
| // consider `absl::node_hash_map`.
 | // consider `absl::node_hash_map`.
 | ||||||
|  |  | ||||||
|  | @ -76,9 +76,12 @@ TYPED_TEST_SUITE_P(InstanceTest); | ||||||
| // destroyed in the erase(begin, end) test.
 | // destroyed in the erase(begin, end) test.
 | ||||||
| class RefCounted { | class RefCounted { | ||||||
|  public: |  public: | ||||||
|   RefCounted(int value, int* count) : value_(value), count_(count) { Ref(); } |   RefCounted(int value, int* count) : value_(value), count_(count) { | ||||||
|  |     Ref(); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|   RefCounted(const RefCounted& v) : value_(v.value_), count_(v.count_) { |   RefCounted(const RefCounted& v) | ||||||
|  |       : value_(v.value_), count_(v.count_) { | ||||||
|     Ref(); |     Ref(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -287,7 +290,7 @@ TEST(RefCountedVec, EraseBeginEnd) { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // Check that the elements at the end are preserved.
 |         // Check that the elements at the end are preserved.
 | ||||||
|         for (int i = erase_end; i < len; ++i) { |         for (int i = erase_end; i< len; ++i) { | ||||||
|           EXPECT_EQ(1, counts[i]); |           EXPECT_EQ(1, counts[i]); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  | @ -549,10 +552,10 @@ TEST(IntVec, Resize) { | ||||||
|     static const int kResizeElem = 1000000; |     static const int kResizeElem = 1000000; | ||||||
|     for (int k = 0; k < 10; k++) { |     for (int k = 0; k < 10; k++) { | ||||||
|       // Enlarging resize
 |       // Enlarging resize
 | ||||||
|       v.resize(len + k, kResizeElem); |       v.resize(len+k, kResizeElem); | ||||||
|       EXPECT_EQ(len + k, v.size()); |       EXPECT_EQ(len+k, v.size()); | ||||||
|       EXPECT_LE(len + k, v.capacity()); |       EXPECT_LE(len+k, v.capacity()); | ||||||
|       for (int i = 0; i < len + k; i++) { |       for (int i = 0; i < len+k; i++) { | ||||||
|         if (i < len) { |         if (i < len) { | ||||||
|           EXPECT_EQ(i, v[i]); |           EXPECT_EQ(i, v[i]); | ||||||
|         } else { |         } else { | ||||||
|  | @ -863,7 +866,7 @@ TYPED_TEST_P(InstanceTest, Swap) { | ||||||
|       auto min_len = std::min(l1, l2); |       auto min_len = std::min(l1, l2); | ||||||
|       auto max_len = std::max(l1, l2); |       auto max_len = std::max(l1, l2); | ||||||
|       for (int i = 0; i < l1; i++) a.push_back(Instance(i)); |       for (int i = 0; i < l1; i++) a.push_back(Instance(i)); | ||||||
|       for (int i = 0; i < l2; i++) b.push_back(Instance(100 + i)); |       for (int i = 0; i < l2; i++) b.push_back(Instance(100+i)); | ||||||
|       EXPECT_EQ(tracker.instances(), l1 + l2); |       EXPECT_EQ(tracker.instances(), l1 + l2); | ||||||
|       tracker.ResetCopiesMovesSwaps(); |       tracker.ResetCopiesMovesSwaps(); | ||||||
|       { |       { | ||||||
|  | @ -931,7 +934,7 @@ TEST(IntVec, EqualAndNotEqual) { | ||||||
|     EXPECT_FALSE(a == b); |     EXPECT_FALSE(a == b); | ||||||
|     EXPECT_TRUE(a != b); |     EXPECT_TRUE(a != b); | ||||||
| 
 | 
 | ||||||
|     b[i] = b[i] - 1;  // Back to before
 |     b[i] = b[i] - 1;    // Back to before
 | ||||||
|     EXPECT_TRUE(a == b); |     EXPECT_TRUE(a == b); | ||||||
|     EXPECT_FALSE(a != b); |     EXPECT_FALSE(a != b); | ||||||
|   } |   } | ||||||
|  | @ -998,7 +1001,7 @@ TYPED_TEST_P(InstanceTest, CountConstructorsDestructors) { | ||||||
| 
 | 
 | ||||||
|     // reserve() must not increase the number of initialized objects
 |     // reserve() must not increase the number of initialized objects
 | ||||||
|     SCOPED_TRACE("reserve"); |     SCOPED_TRACE("reserve"); | ||||||
|     v.reserve(len + 1000); |     v.reserve(len+1000); | ||||||
|     EXPECT_EQ(tracker.instances(), len); |     EXPECT_EQ(tracker.instances(), len); | ||||||
|     EXPECT_EQ(tracker.copies() + tracker.moves(), len); |     EXPECT_EQ(tracker.copies() + tracker.moves(), len); | ||||||
| 
 | 
 | ||||||
|  | @ -1244,8 +1247,9 @@ void InstanceCountElemAssignWithAllocationTest() { | ||||||
|     absl::InlinedVector<Instance, 2> v(original_contents.begin(), |     absl::InlinedVector<Instance, 2> v(original_contents.begin(), | ||||||
|                                        original_contents.end()); |                                        original_contents.end()); | ||||||
|     v.assign(3, Instance(123)); |     v.assign(3, Instance(123)); | ||||||
|     EXPECT_THAT(v, AllOf(SizeIs(3), ElementsAre(ValueIs(123), ValueIs(123), |     EXPECT_THAT(v, | ||||||
|                                                 ValueIs(123)))); |                 AllOf(SizeIs(3), | ||||||
|  |                       ElementsAre(ValueIs(123), ValueIs(123), ValueIs(123)))); | ||||||
|     EXPECT_LE(v.size(), v.capacity()); |     EXPECT_LE(v.size(), v.capacity()); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | @ -1524,8 +1528,8 @@ TYPED_TEST_P(InstanceTest, InitializerListAssign) { | ||||||
|     SCOPED_TRACE(original_size); |     SCOPED_TRACE(original_size); | ||||||
|     absl::InlinedVector<Instance, 2> v(original_size, Instance(12345)); |     absl::InlinedVector<Instance, 2> v(original_size, Instance(12345)); | ||||||
|     v.assign({Instance(3), Instance(4), Instance(5)}); |     v.assign({Instance(3), Instance(4), Instance(5)}); | ||||||
|     EXPECT_THAT( |     EXPECT_THAT(v, AllOf(SizeIs(3), | ||||||
|         v, AllOf(SizeIs(3), ElementsAre(ValueIs(3), ValueIs(4), ValueIs(5)))); |                          ElementsAre(ValueIs(3), ValueIs(4), ValueIs(5)))); | ||||||
|     EXPECT_LE(3, v.capacity()); |     EXPECT_LE(3, v.capacity()); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | @ -1550,7 +1554,7 @@ TEST(DynamicVec, DynamicVecCompiles) { | ||||||
| TEST(AllocatorSupportTest, Constructors) { | TEST(AllocatorSupportTest, Constructors) { | ||||||
|   using MyAlloc = CountingAllocator<int>; |   using MyAlloc = CountingAllocator<int>; | ||||||
|   using AllocVec = absl::InlinedVector<int, 4, MyAlloc>; |   using AllocVec = absl::InlinedVector<int, 4, MyAlloc>; | ||||||
|   const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; |   const int ia[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; | ||||||
|   int64_t allocated = 0; |   int64_t allocated = 0; | ||||||
|   MyAlloc alloc(&allocated); |   MyAlloc alloc(&allocated); | ||||||
|   { AllocVec ABSL_ATTRIBUTE_UNUSED v; } |   { AllocVec ABSL_ATTRIBUTE_UNUSED v; } | ||||||
|  | @ -1566,7 +1570,7 @@ TEST(AllocatorSupportTest, Constructors) { | ||||||
| TEST(AllocatorSupportTest, CountAllocations) { | TEST(AllocatorSupportTest, CountAllocations) { | ||||||
|   using MyAlloc = CountingAllocator<int>; |   using MyAlloc = CountingAllocator<int>; | ||||||
|   using AllocVec = absl::InlinedVector<int, 4, MyAlloc>; |   using AllocVec = absl::InlinedVector<int, 4, MyAlloc>; | ||||||
|   const int ia[] = {0, 1, 2, 3, 4, 5, 6, 7}; |   const int ia[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; | ||||||
|   int64_t allocated = 0; |   int64_t allocated = 0; | ||||||
|   MyAlloc alloc(&allocated); |   MyAlloc alloc(&allocated); | ||||||
|   { |   { | ||||||
|  | @ -1630,8 +1634,8 @@ TEST(AllocatorSupportTest, SwapBothAllocated) { | ||||||
|   int64_t allocated1 = 0; |   int64_t allocated1 = 0; | ||||||
|   int64_t allocated2 = 0; |   int64_t allocated2 = 0; | ||||||
|   { |   { | ||||||
|     const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7}; |     const int ia1[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; | ||||||
|     const int ia2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; |     const int ia2[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; | ||||||
|     MyAlloc a1(&allocated1); |     MyAlloc a1(&allocated1); | ||||||
|     MyAlloc a2(&allocated2); |     MyAlloc a2(&allocated2); | ||||||
|     AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); |     AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); | ||||||
|  | @ -1655,8 +1659,8 @@ TEST(AllocatorSupportTest, SwapOneAllocated) { | ||||||
|   int64_t allocated1 = 0; |   int64_t allocated1 = 0; | ||||||
|   int64_t allocated2 = 0; |   int64_t allocated2 = 0; | ||||||
|   { |   { | ||||||
|     const int ia1[] = {0, 1, 2, 3, 4, 5, 6, 7}; |     const int ia1[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; | ||||||
|     const int ia2[] = {0, 1, 2, 3}; |     const int ia2[] = { 0, 1, 2, 3 }; | ||||||
|     MyAlloc a1(&allocated1); |     MyAlloc a1(&allocated1); | ||||||
|     MyAlloc a2(&allocated2); |     MyAlloc a2(&allocated2); | ||||||
|     AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); |     AllocVec v1(ia1, ia1 + ABSL_ARRAYSIZE(ia1), a1); | ||||||
|  | @ -1677,42 +1681,65 @@ TEST(AllocatorSupportTest, SwapOneAllocated) { | ||||||
| 
 | 
 | ||||||
| TEST(AllocatorSupportTest, ScopedAllocatorWorks) { | TEST(AllocatorSupportTest, ScopedAllocatorWorks) { | ||||||
|   using StdVector = std::vector<int, CountingAllocator<int>>; |   using StdVector = std::vector<int, CountingAllocator<int>>; | ||||||
|   using Alloc = CountingAllocator<StdVector>; |   using MyAlloc = | ||||||
|   using ScopedAlloc = std::scoped_allocator_adaptor<Alloc>; |       std::scoped_allocator_adaptor<CountingAllocator<StdVector>>; | ||||||
|   using AllocVec = absl::InlinedVector<StdVector, 1, ScopedAlloc>; |   using AllocVec = absl::InlinedVector<StdVector, 4, MyAlloc>; | ||||||
| 
 | 
 | ||||||
|   { |   // MSVC 2017's std::vector allocates different amounts of memory in debug
 | ||||||
|     int64_t total_allocated_byte_count = 0; |   // versus opt mode.
 | ||||||
|  |   int64_t test_allocated = 0; | ||||||
|  |   StdVector v(CountingAllocator<int>{&test_allocated}); | ||||||
|  |   // The amount of memory allocated by a default constructed vector<int>
 | ||||||
|  |   auto default_std_vec_allocated = test_allocated; | ||||||
|  |   v.push_back(1); | ||||||
|  |   // The amound of memory allocated by a copy-constructed vector<int> with one
 | ||||||
|  |   // element.
 | ||||||
|  |   int64_t one_element_std_vec_copy_allocated = test_allocated; | ||||||
| 
 | 
 | ||||||
|     AllocVec inlined_case(ScopedAlloc(Alloc(+&total_allocated_byte_count))); |   int64_t allocated = 0; | ||||||
|     inlined_case.emplace_back(); |   AllocVec vec(MyAlloc{CountingAllocator<StdVector>{&allocated}}); | ||||||
|  |   EXPECT_EQ(allocated, 0); | ||||||
| 
 | 
 | ||||||
|     int64_t absl_responsible_for_count = total_allocated_byte_count; |   // This default constructs a vector<int>, but the allocator should pass itself
 | ||||||
|     EXPECT_EQ(absl_responsible_for_count, 0); |   // into the vector<int>, so check allocation compared to that.
 | ||||||
|  |   // The absl::InlinedVector does not allocate any memory.
 | ||||||
|  |   // The vector<int> may allocate any memory.
 | ||||||
|  |   auto expected = default_std_vec_allocated; | ||||||
|  |   vec.resize(1); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|     inlined_case[0].emplace_back(); |   // We make vector<int> allocate memory.
 | ||||||
|     EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count); |   // It must go through the allocator even though we didn't construct the
 | ||||||
|  |   // vector directly.  This assumes that vec[0] doesn't need to grow its
 | ||||||
|  |   // allocation.
 | ||||||
|  |   expected += sizeof(int); | ||||||
|  |   vec[0].push_back(1); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|     inlined_case.clear(); |   // Another allocating vector.
 | ||||||
|     EXPECT_EQ(total_allocated_byte_count, 0); |   expected += one_element_std_vec_copy_allocated; | ||||||
|   } |   vec.push_back(vec[0]); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|   { |   // Overflow the inlined memory.
 | ||||||
|     int64_t total_allocated_byte_count = 0; |   // The absl::InlinedVector will now allocate.
 | ||||||
|  |   expected += sizeof(StdVector) * 8 + default_std_vec_allocated * 3; | ||||||
|  |   vec.resize(5); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|     AllocVec allocated_case(ScopedAlloc(Alloc(+&total_allocated_byte_count))); |   // Adding one more in external mode should also work.
 | ||||||
|     allocated_case.emplace_back(); |   expected += one_element_std_vec_copy_allocated; | ||||||
|     allocated_case.emplace_back(); |   vec.push_back(vec[0]); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|     int64_t absl_responsible_for_count = total_allocated_byte_count; |   // And extending these should still work.  This assumes that vec[0] does not
 | ||||||
|     EXPECT_GT(absl_responsible_for_count, 0); |   // need to grow its allocation.
 | ||||||
|  |   expected += sizeof(int); | ||||||
|  |   vec[0].push_back(1); | ||||||
|  |   EXPECT_EQ(allocated, expected); | ||||||
| 
 | 
 | ||||||
|     allocated_case[1].emplace_back(); |   vec.clear(); | ||||||
|     EXPECT_GT(total_allocated_byte_count, absl_responsible_for_count); |   EXPECT_EQ(allocated, 0); | ||||||
| 
 |  | ||||||
|     allocated_case.clear(); |  | ||||||
|     EXPECT_EQ(total_allocated_byte_count, 0); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(AllocatorSupportTest, SizeAllocConstructor) { | TEST(AllocatorSupportTest, SizeAllocConstructor) { | ||||||
|  |  | ||||||
|  | @ -188,6 +188,9 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple | ||||||
|   template <int I> |   template <int I> | ||||||
|   using ElemT = internal_compressed_tuple::ElemT<CompressedTuple, I>; |   using ElemT = internal_compressed_tuple::ElemT<CompressedTuple, I>; | ||||||
| 
 | 
 | ||||||
|  |   template <int I> | ||||||
|  |   using StorageT = internal_compressed_tuple::Storage<ElemT<I>, I>; | ||||||
|  | 
 | ||||||
|  public: |  public: | ||||||
|   constexpr CompressedTuple() = default; |   constexpr CompressedTuple() = default; | ||||||
|   explicit constexpr CompressedTuple(Ts... base) |   explicit constexpr CompressedTuple(Ts... base) | ||||||
|  | @ -200,19 +203,17 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple | ||||||
| 
 | 
 | ||||||
|   template <int I> |   template <int I> | ||||||
|   constexpr const ElemT<I>& get() const& { |   constexpr const ElemT<I>& get() const& { | ||||||
|     return internal_compressed_tuple::Storage<ElemT<I>, I>::get(); |     return StorageT<I>::get(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   template <int I> |   template <int I> | ||||||
|   ElemT<I>&& get() && { |   ElemT<I>&& get() && { | ||||||
|     return std::move(*this) |     return std::move(*this).StorageT<I>::get(); | ||||||
|         .internal_compressed_tuple::template Storage<ElemT<I>, I>::get(); |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   template <int I> |   template <int I> | ||||||
|   constexpr const ElemT<I>&& get() const&& { |   constexpr const ElemT<I>&& get() const&& { | ||||||
|     return absl::move(*this) |     return absl::move(*this).StorageT<I>::get(); | ||||||
|         .internal_compressed_tuple::template Storage<ElemT<I>, I>::get(); |  | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -402,6 +402,16 @@ class Storage { | ||||||
|     return current_capacity * 2; |     return current_capacity * 2; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   static size_type LegacyNextCapacityFrom(size_type current_capacity, | ||||||
|  |                                           size_type requested_capacity) { | ||||||
|  |     // TODO(johnsoncj): Get rid of this old behavior.
 | ||||||
|  |     size_type new_capacity = current_capacity; | ||||||
|  |     while (new_capacity < requested_capacity) { | ||||||
|  |       new_capacity *= 2; | ||||||
|  |     } | ||||||
|  |     return new_capacity; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   using Metadata = |   using Metadata = | ||||||
|       container_internal::CompressedTuple<allocator_type, size_type>; |       container_internal::CompressedTuple<allocator_type, size_type>; | ||||||
| 
 | 
 | ||||||
|  | @ -512,7 +522,8 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, size_type new_size) -> void { | ||||||
|   absl::Span<value_type> destroy_loop; |   absl::Span<value_type> destroy_loop; | ||||||
| 
 | 
 | ||||||
|   if (new_size > storage_view.capacity) { |   if (new_size > storage_view.capacity) { | ||||||
|     pointer new_data = allocation_tx.Allocate(new_size); |     pointer new_data = allocation_tx.Allocate( | ||||||
|  |         LegacyNextCapacityFrom(storage_view.capacity, new_size)); | ||||||
| 
 | 
 | ||||||
|     // Construct new objects in `new_data`
 |     // Construct new objects in `new_data`
 | ||||||
|     construct_loop = {new_data + storage_view.size, |     construct_loop = {new_data + storage_view.size, | ||||||
|  | @ -632,7 +643,8 @@ auto Storage<T, N, A>::Reserve(size_type requested_capacity) -> void { | ||||||
|   IteratorValueAdapter<MoveIterator> move_values( |   IteratorValueAdapter<MoveIterator> move_values( | ||||||
|       MoveIterator(storage_view.data)); |       MoveIterator(storage_view.data)); | ||||||
| 
 | 
 | ||||||
|   pointer new_data = allocation_tx.Allocate(requested_capacity); |   pointer new_data = allocation_tx.Allocate( | ||||||
|  |       LegacyNextCapacityFrom(storage_view.capacity, requested_capacity)); | ||||||
| 
 | 
 | ||||||
|   inlined_vector_internal::ConstructElements(GetAllocPtr(), new_data, |   inlined_vector_internal::ConstructElements(GetAllocPtr(), new_data, | ||||||
|                                              &move_values, storage_view.size); |                                              &move_values, storage_view.size); | ||||||
|  |  | ||||||
|  | @ -77,7 +77,6 @@ list(APPEND ABSL_CLANG_CL_TEST_FLAGS | ||||||
|     "-Wno-unused-template" |     "-Wno-unused-template" | ||||||
|     "-Wno-used-but-marked-unused" |     "-Wno-used-but-marked-unused" | ||||||
|     "-Wno-zero-as-null-pointer-constant" |     "-Wno-zero-as-null-pointer-constant" | ||||||
|     "-Wno-gnu-include-next" |  | ||||||
|     "-Wno-gnu-zero-variadic-macro-arguments" |     "-Wno-gnu-zero-variadic-macro-arguments" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -181,7 +180,6 @@ list(APPEND ABSL_LLVM_TEST_FLAGS | ||||||
|     "-Wno-unused-template" |     "-Wno-unused-template" | ||||||
|     "-Wno-used-but-marked-unused" |     "-Wno-used-but-marked-unused" | ||||||
|     "-Wno-zero-as-null-pointer-constant" |     "-Wno-zero-as-null-pointer-constant" | ||||||
|     "-Wno-gnu-include-next" |  | ||||||
|     "-Wno-gnu-zero-variadic-macro-arguments" |     "-Wno-gnu-zero-variadic-macro-arguments" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -78,7 +78,6 @@ ABSL_CLANG_CL_TEST_FLAGS = [ | ||||||
|     "-Wno-unused-template", |     "-Wno-unused-template", | ||||||
|     "-Wno-used-but-marked-unused", |     "-Wno-used-but-marked-unused", | ||||||
|     "-Wno-zero-as-null-pointer-constant", |     "-Wno-zero-as-null-pointer-constant", | ||||||
|     "-Wno-gnu-include-next", |  | ||||||
|     "-Wno-gnu-zero-variadic-macro-arguments", |     "-Wno-gnu-zero-variadic-macro-arguments", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | @ -182,7 +181,6 @@ ABSL_LLVM_TEST_FLAGS = [ | ||||||
|     "-Wno-unused-template", |     "-Wno-unused-template", | ||||||
|     "-Wno-used-but-marked-unused", |     "-Wno-used-but-marked-unused", | ||||||
|     "-Wno-zero-as-null-pointer-constant", |     "-Wno-zero-as-null-pointer-constant", | ||||||
|     "-Wno-gnu-include-next", |  | ||||||
|     "-Wno-gnu-zero-variadic-macro-arguments", |     "-Wno-gnu-zero-variadic-macro-arguments", | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -105,8 +105,6 @@ LLVM_TEST_DISABLE_WARNINGS_FLAGS = [ | ||||||
|     "-Wno-unused-template", |     "-Wno-unused-template", | ||||||
|     "-Wno-used-but-marked-unused", |     "-Wno-used-but-marked-unused", | ||||||
|     "-Wno-zero-as-null-pointer-constant", |     "-Wno-zero-as-null-pointer-constant", | ||||||
|     # For a libc++ bug fixed in r357267 |  | ||||||
|     "-Wno-gnu-include-next", |  | ||||||
|     # gtest depends on this GNU extension being offered. |     # gtest depends on this GNU extension being offered. | ||||||
|     "-Wno-gnu-zero-variadic-macro-arguments", |     "-Wno-gnu-zero-variadic-macro-arguments", | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | @ -762,37 +762,27 @@ FindSymbolResult Symbolizer::GetSymbolFromObjectFile( | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Consult a regular symbol table first.
 |   // Consult a regular symbol table, then fall back to the dynamic symbol table.
 | ||||||
|   if (!GetSectionHeaderByType(obj.fd, obj.elf_header.e_shnum, |   for (const auto symbol_table_type : {SHT_SYMTAB, SHT_DYNSYM}) { | ||||||
|                               obj.elf_header.e_shoff, SHT_SYMTAB, &symtab, |     if (!GetSectionHeaderByType(obj.fd, obj.elf_header.e_shnum, | ||||||
|                               tmp_buf, tmp_buf_size)) { |                                 obj.elf_header.e_shoff, symbol_table_type, | ||||||
|     return SYMBOL_NOT_FOUND; |                                 &symtab, tmp_buf, tmp_buf_size)) { | ||||||
|   } |       continue; | ||||||
|   if (!ReadFromOffsetExact( |     } | ||||||
|           obj.fd, &strtab, sizeof(strtab), |     if (!ReadFromOffsetExact( | ||||||
|           obj.elf_header.e_shoff + symtab.sh_link * sizeof(symtab))) { |             obj.fd, &strtab, sizeof(strtab), | ||||||
|     return SYMBOL_NOT_FOUND; |             obj.elf_header.e_shoff + symtab.sh_link * sizeof(symtab))) { | ||||||
|   } |       continue; | ||||||
|   const FindSymbolResult rc = |     } | ||||||
|       FindSymbol(pc, obj.fd, out, out_size, relocation, &strtab, &symtab, |     const FindSymbolResult rc = | ||||||
|                  opd_ptr, tmp_buf, tmp_buf_size); |         FindSymbol(pc, obj.fd, out, out_size, relocation, &strtab, &symtab, | ||||||
|   if (rc != SYMBOL_NOT_FOUND) { |                    opd_ptr, tmp_buf, tmp_buf_size); | ||||||
|     return rc;  // Found the symbol in a regular symbol table.
 |     if (rc != SYMBOL_NOT_FOUND) { | ||||||
|  |       return rc; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // If the symbol is not found, then consult a dynamic symbol table.
 |   return SYMBOL_NOT_FOUND; | ||||||
|   if (!GetSectionHeaderByType(obj.fd, obj.elf_header.e_shnum, |  | ||||||
|                               obj.elf_header.e_shoff, SHT_DYNSYM, &symtab, |  | ||||||
|                               tmp_buf, tmp_buf_size)) { |  | ||||||
|     return SYMBOL_NOT_FOUND; |  | ||||||
|   } |  | ||||||
|   if (!ReadFromOffsetExact( |  | ||||||
|           obj.fd, &strtab, sizeof(strtab), |  | ||||||
|           obj.elf_header.e_shoff + symtab.sh_link * sizeof(symtab))) { |  | ||||||
|     return SYMBOL_NOT_FOUND; |  | ||||||
|   } |  | ||||||
|   return FindSymbol(pc, obj.fd, out, out_size, relocation, &strtab, &symtab, |  | ||||||
|                     opd_ptr, tmp_buf, tmp_buf_size); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| namespace { | namespace { | ||||||
|  |  | ||||||
|  | @ -522,7 +522,7 @@ cc_test( | ||||||
| 
 | 
 | ||||||
| cc_test( | cc_test( | ||||||
|     name = "randen_engine_test", |     name = "randen_engine_test", | ||||||
|     size = "small", |     size = "medium", | ||||||
|     srcs = [ |     srcs = [ | ||||||
|         "randen_engine_test.cc", |         "randen_engine_test.cc", | ||||||
|     ], |     ], | ||||||
|  | @ -598,12 +598,12 @@ cc_library( | ||||||
|     copts = ABSL_DEFAULT_COPTS, |     copts = ABSL_DEFAULT_COPTS, | ||||||
|     linkopts = ABSL_DEFAULT_LINKOPTS, |     linkopts = ABSL_DEFAULT_LINKOPTS, | ||||||
|     deps = [ |     deps = [ | ||||||
|  |         ":distribution_impl", | ||||||
|  |         ":fast_uniform_bits", | ||||||
|  |         ":iostream_state_saver", | ||||||
|  |         ":traits", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|         "//absl/meta:type_traits", |         "//absl/meta:type_traits", | ||||||
|         "//absl/random/internal:distribution_impl", |  | ||||||
|         "//absl/random/internal:fast_uniform_bits", |  | ||||||
|         "//absl/random/internal:iostream_state_saver", |  | ||||||
|         "//absl/random/internal:traits", |  | ||||||
|     ], |     ], | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -559,7 +559,6 @@ cc_library( | ||||||
|         ":strings", |         ":strings", | ||||||
|         "//absl/base:config", |         "//absl/base:config", | ||||||
|         "//absl/base:core_headers", |         "//absl/base:core_headers", | ||||||
|         "//absl/container:inlined_vector", |  | ||||||
|         "//absl/meta:type_traits", |         "//absl/meta:type_traits", | ||||||
|         "//absl/numeric:int128", |         "//absl/numeric:int128", | ||||||
|         "//absl/types:span", |         "//absl/types:span", | ||||||
|  |  | ||||||
|  | @ -387,7 +387,6 @@ absl_cc_library( | ||||||
|     absl::strings |     absl::strings | ||||||
|     absl::config |     absl::config | ||||||
|     absl::core_headers |     absl::core_headers | ||||||
|     absl::inlined_vector |  | ||||||
|     absl::type_traits |     absl::type_traits | ||||||
|     absl::int128 |     absl::int128 | ||||||
|     absl::span |     absl::span | ||||||
|  |  | ||||||
|  | @ -7,7 +7,6 @@ | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| #include "absl/base/port.h" | #include "absl/base/port.h" | ||||||
| #include "absl/container/inlined_vector.h" |  | ||||||
| #include "absl/strings/internal/str_format/arg.h" | #include "absl/strings/internal/str_format/arg.h" | ||||||
| #include "absl/strings/internal/str_format/checker.h" | #include "absl/strings/internal/str_format/checker.h" | ||||||
| #include "absl/strings/internal/str_format/parser.h" | #include "absl/strings/internal/str_format/parser.h" | ||||||
|  | @ -138,7 +137,17 @@ class Streamable { | ||||||
|  public: |  public: | ||||||
|   Streamable(const UntypedFormatSpecImpl& format, |   Streamable(const UntypedFormatSpecImpl& format, | ||||||
|              absl::Span<const FormatArgImpl> args) |              absl::Span<const FormatArgImpl> args) | ||||||
|       : format_(format), args_(args.begin(), args.end()) {} |       : format_(format) { | ||||||
|  |     if (args.size() <= ABSL_ARRAYSIZE(few_args_)) { | ||||||
|  |       for (size_t i = 0; i < args.size(); ++i) { | ||||||
|  |         few_args_[i] = args[i]; | ||||||
|  |       } | ||||||
|  |       args_ = absl::MakeSpan(few_args_, args.size()); | ||||||
|  |     } else { | ||||||
|  |       many_args_.assign(args.begin(), args.end()); | ||||||
|  |       args_ = many_args_; | ||||||
|  |     } | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|   std::ostream& Print(std::ostream& os) const; |   std::ostream& Print(std::ostream& os) const; | ||||||
| 
 | 
 | ||||||
|  | @ -148,7 +157,12 @@ class Streamable { | ||||||
| 
 | 
 | ||||||
|  private: |  private: | ||||||
|   const UntypedFormatSpecImpl& format_; |   const UntypedFormatSpecImpl& format_; | ||||||
|   absl::InlinedVector<FormatArgImpl, 4> args_; |   absl::Span<const FormatArgImpl> args_; | ||||||
|  |   // if args_.size() is 4 or less:
 | ||||||
|  |   FormatArgImpl few_args_[4] = {FormatArgImpl(0), FormatArgImpl(0), | ||||||
|  |                                 FormatArgImpl(0), FormatArgImpl(0)}; | ||||||
|  |   // if args_.size() is more than 4:
 | ||||||
|  |   std::vector<FormatArgImpl> many_args_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // for testing
 | // for testing
 | ||||||
|  |  | ||||||
|  | @ -30,8 +30,8 @@ TEST_F(FormatEntryPointTest, UntypedFormat) { | ||||||
|     "", |     "", | ||||||
|     "a", |     "a", | ||||||
|     "%80d", |     "%80d", | ||||||
| #if !defined(_MSC_VER) && !defined(__ANDROID__) | #if !defined(_MSC_VER) && !defined(__ANDROID__) && !defined(__native_client__) | ||||||
|     // MSVC and Android don't support positional syntax.
 |     // MSVC, NaCL and Android don't support positional syntax.
 | ||||||
|     "complicated multipart %% %1$d format %1$0999d", |     "complicated multipart %% %1$d format %1$0999d", | ||||||
| #endif  // _MSC_VER
 | #endif  // _MSC_VER
 | ||||||
|   }; |   }; | ||||||
|  | @ -153,17 +153,20 @@ TEST_F(FormatEntryPointTest, Stream) { | ||||||
|     "", |     "", | ||||||
|     "a", |     "a", | ||||||
|     "%80d", |     "%80d", | ||||||
| #if !defined(_MSC_VER) && !defined(__ANDROID__) |     "%d %u %c %s %f %g", | ||||||
|     // MSVC doesn't support positional syntax.
 | #if !defined(_MSC_VER) && !defined(__ANDROID__) && !defined(__native_client__) | ||||||
|  |     // MSVC, NaCL and Android don't support positional syntax.
 | ||||||
|     "complicated multipart %% %1$d format %1$080d", |     "complicated multipart %% %1$d format %1$080d", | ||||||
| #endif  // _MSC_VER
 | #endif  // _MSC_VER
 | ||||||
|   }; |   }; | ||||||
|   std::string buf(4096, '\0'); |   std::string buf(4096, '\0'); | ||||||
|   for (const auto& fmt : formats) { |   for (const auto& fmt : formats) { | ||||||
|     const auto parsed = ParsedFormat<'d'>::NewAllowIgnored(fmt); |     const auto parsed = | ||||||
|  |         ParsedFormat<'d', 'u', 'c', 's', 'f', 'g'>::NewAllowIgnored(fmt); | ||||||
|     std::ostringstream oss; |     std::ostringstream oss; | ||||||
|     oss << StreamFormat(*parsed, 123); |     oss << StreamFormat(*parsed, 123, 3, 49, "multistreaming!!!", 1.01, 1.01); | ||||||
|     int fmt_result = snprintf(&*buf.begin(), buf.size(), fmt.c_str(), 123); |     int fmt_result = snprintf(&*buf.begin(), buf.size(), fmt.c_str(),  //
 | ||||||
|  |                                  123, 3, 49, "multistreaming!!!", 1.01, 1.01); | ||||||
|     ASSERT_TRUE(oss) << fmt; |     ASSERT_TRUE(oss) << fmt; | ||||||
|     ASSERT_TRUE(fmt_result >= 0 && static_cast<size_t>(fmt_result) < buf.size()) |     ASSERT_TRUE(fmt_result >= 0 && static_cast<size_t>(fmt_result) < buf.size()) | ||||||
|         << fmt_result; |         << fmt_result; | ||||||
|  |  | ||||||
|  | @ -370,15 +370,15 @@ using Weekday = time_internal::cctz::weekday; | ||||||
| 
 | 
 | ||||||
| // GetWeekday()
 | // GetWeekday()
 | ||||||
| //
 | //
 | ||||||
| // Returns the absl::Weekday for the given absl::CivilDay.
 | // Returns the absl::Weekday for the given (realigned) civil-time value.
 | ||||||
| //
 | //
 | ||||||
| // Example:
 | // Example:
 | ||||||
| //
 | //
 | ||||||
| //   absl::CivilDay a(2015, 8, 13);
 | //   absl::CivilDay a(2015, 8, 13);
 | ||||||
| //   absl::Weekday wd = absl::GetWeekday(a);  // wd == absl::Weekday::thursday
 | //   absl::Weekday wd = absl::GetWeekday(a);  // wd == absl::Weekday::thursday
 | ||||||
| //
 | //
 | ||||||
| inline Weekday GetWeekday(CivilDay cd) { | inline Weekday GetWeekday(CivilSecond cs) { | ||||||
|   return time_internal::cctz::get_weekday(cd); |   return time_internal::cctz::get_weekday(cs); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NextWeekday()
 | // NextWeekday()
 | ||||||
|  | @ -420,7 +420,7 @@ inline CivilDay PrevWeekday(CivilDay cd, Weekday wd) { | ||||||
| 
 | 
 | ||||||
| // GetYearDay()
 | // GetYearDay()
 | ||||||
| //
 | //
 | ||||||
| // Returns the day-of-year for the given absl::CivilDay.
 | // Returns the day-of-year for the given (realigned) civil-time value.
 | ||||||
| //
 | //
 | ||||||
| // Example:
 | // Example:
 | ||||||
| //
 | //
 | ||||||
|  | @ -429,8 +429,8 @@ inline CivilDay PrevWeekday(CivilDay cd, Weekday wd) { | ||||||
| //   absl::CivilDay b(2015, 12, 31);
 | //   absl::CivilDay b(2015, 12, 31);
 | ||||||
| //   int yd_dec_31 = absl::GetYearDay(b);  // yd_dec_31 = 365
 | //   int yd_dec_31 = absl::GetYearDay(b);  // yd_dec_31 = 365
 | ||||||
| //
 | //
 | ||||||
| inline int GetYearDay(CivilDay cd) { | inline int GetYearDay(CivilSecond cs) { | ||||||
|   return time_internal::cctz::get_yearday(cd); |   return time_internal::cctz::get_yearday(cs); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // FormatCivilTime()
 | // FormatCivilTime()
 | ||||||
|  |  | ||||||
|  | @ -616,6 +616,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(4, ss.hour()); |   EXPECT_EQ(4, ss.hour()); | ||||||
|   EXPECT_EQ(5, ss.minute()); |   EXPECT_EQ(5, ss.minute()); | ||||||
|   EXPECT_EQ(6, ss.second()); |   EXPECT_EQ(6, ss.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(ss)); | ||||||
|  |   EXPECT_EQ(34, absl::GetYearDay(ss)); | ||||||
| 
 | 
 | ||||||
|   absl::CivilMinute mm(2015, 2, 3, 4, 5, 6); |   absl::CivilMinute mm(2015, 2, 3, 4, 5, 6); | ||||||
|   EXPECT_EQ(2015, mm.year()); |   EXPECT_EQ(2015, mm.year()); | ||||||
|  | @ -624,6 +626,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(4, mm.hour()); |   EXPECT_EQ(4, mm.hour()); | ||||||
|   EXPECT_EQ(5, mm.minute()); |   EXPECT_EQ(5, mm.minute()); | ||||||
|   EXPECT_EQ(0, mm.second()); |   EXPECT_EQ(0, mm.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(mm)); | ||||||
|  |   EXPECT_EQ(34, absl::GetYearDay(mm)); | ||||||
| 
 | 
 | ||||||
|   absl::CivilHour hh(2015, 2, 3, 4, 5, 6); |   absl::CivilHour hh(2015, 2, 3, 4, 5, 6); | ||||||
|   EXPECT_EQ(2015, hh.year()); |   EXPECT_EQ(2015, hh.year()); | ||||||
|  | @ -632,6 +636,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(4, hh.hour()); |   EXPECT_EQ(4, hh.hour()); | ||||||
|   EXPECT_EQ(0, hh.minute()); |   EXPECT_EQ(0, hh.minute()); | ||||||
|   EXPECT_EQ(0, hh.second()); |   EXPECT_EQ(0, hh.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(hh)); | ||||||
|  |   EXPECT_EQ(34, absl::GetYearDay(hh)); | ||||||
| 
 | 
 | ||||||
|   absl::CivilDay d(2015, 2, 3, 4, 5, 6); |   absl::CivilDay d(2015, 2, 3, 4, 5, 6); | ||||||
|   EXPECT_EQ(2015, d.year()); |   EXPECT_EQ(2015, d.year()); | ||||||
|  | @ -640,6 +646,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(0, d.hour()); |   EXPECT_EQ(0, d.hour()); | ||||||
|   EXPECT_EQ(0, d.minute()); |   EXPECT_EQ(0, d.minute()); | ||||||
|   EXPECT_EQ(0, d.second()); |   EXPECT_EQ(0, d.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(d)); | ||||||
|  |   EXPECT_EQ(34, absl::GetYearDay(d)); | ||||||
| 
 | 
 | ||||||
|   absl::CivilMonth m(2015, 2, 3, 4, 5, 6); |   absl::CivilMonth m(2015, 2, 3, 4, 5, 6); | ||||||
|   EXPECT_EQ(2015, m.year()); |   EXPECT_EQ(2015, m.year()); | ||||||
|  | @ -648,6 +656,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(0, m.hour()); |   EXPECT_EQ(0, m.hour()); | ||||||
|   EXPECT_EQ(0, m.minute()); |   EXPECT_EQ(0, m.minute()); | ||||||
|   EXPECT_EQ(0, m.second()); |   EXPECT_EQ(0, m.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(m)); | ||||||
|  |   EXPECT_EQ(32, absl::GetYearDay(m)); | ||||||
| 
 | 
 | ||||||
|   absl::CivilYear y(2015, 2, 3, 4, 5, 6); |   absl::CivilYear y(2015, 2, 3, 4, 5, 6); | ||||||
|   EXPECT_EQ(2015, y.year()); |   EXPECT_EQ(2015, y.year()); | ||||||
|  | @ -656,6 +666,8 @@ TEST(CivilTime, Properties) { | ||||||
|   EXPECT_EQ(0, y.hour()); |   EXPECT_EQ(0, y.hour()); | ||||||
|   EXPECT_EQ(0, y.minute()); |   EXPECT_EQ(0, y.minute()); | ||||||
|   EXPECT_EQ(0, y.second()); |   EXPECT_EQ(0, y.second()); | ||||||
|  |   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(y)); | ||||||
|  |   EXPECT_EQ(1, absl::GetYearDay(y)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(CivilTime, Format) { | TEST(CivilTime, Format) { | ||||||
|  |  | ||||||
|  | @ -535,8 +535,7 @@ enum class weekday { | ||||||
|   sunday, |   sunday, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template <typename T> | CONSTEXPR_F weekday get_weekday(const civil_second& cs) noexcept { | ||||||
| CONSTEXPR_F weekday get_weekday(const civil_time<T>& ct) noexcept { |  | ||||||
|   CONSTEXPR_D weekday k_weekday_by_mon_off[13] = { |   CONSTEXPR_D weekday k_weekday_by_mon_off[13] = { | ||||||
|       weekday::monday,    weekday::tuesday,  weekday::wednesday, |       weekday::monday,    weekday::tuesday,  weekday::wednesday, | ||||||
|       weekday::thursday,  weekday::friday,   weekday::saturday, |       weekday::thursday,  weekday::friday,   weekday::saturday, | ||||||
|  | @ -547,9 +546,9 @@ CONSTEXPR_F weekday get_weekday(const civil_time<T>& ct) noexcept { | ||||||
|   CONSTEXPR_D int k_weekday_offsets[1 + 12] = { |   CONSTEXPR_D int k_weekday_offsets[1 + 12] = { | ||||||
|       -1, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4, |       -1, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4, | ||||||
|   }; |   }; | ||||||
|   year_t wd = 2400 + (ct.year() % 400) - (ct.month() < 3); |   year_t wd = 2400 + (cs.year() % 400) - (cs.month() < 3); | ||||||
|   wd += wd / 4 - wd / 100 + wd / 400; |   wd += wd / 4 - wd / 100 + wd / 400; | ||||||
|   wd += k_weekday_offsets[ct.month()] + ct.day(); |   wd += k_weekday_offsets[cs.month()] + cs.day(); | ||||||
|   return k_weekday_by_mon_off[wd % 7 + 6]; |   return k_weekday_by_mon_off[wd % 7 + 6]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -595,13 +594,12 @@ CONSTEXPR_F civil_day prev_weekday(civil_day cd, weekday wd) noexcept { | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template <typename T> | CONSTEXPR_F int get_yearday(const civil_second& cs) noexcept { | ||||||
| CONSTEXPR_F int get_yearday(const civil_time<T>& ct) noexcept { |  | ||||||
|   CONSTEXPR_D int k_month_offsets[1 + 12] = { |   CONSTEXPR_D int k_month_offsets[1 + 12] = { | ||||||
|       -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, |       -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, | ||||||
|   }; |   }; | ||||||
|   const int feb29 = (ct.month() > 2 && impl::is_leap_year(ct.year())); |   const int feb29 = (cs.month() > 2 && impl::is_leap_year(cs.year())); | ||||||
|   return k_month_offsets[ct.month()] + feb29 + ct.day(); |   return k_month_offsets[cs.month()] + feb29 + cs.day(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////
 | ||||||
|  |  | ||||||
|  | @ -505,9 +505,9 @@ bool TimeZoneInfo::Load(const std::string& name, ZoneInfoSource* zip) { | ||||||
|   if (tzh.tzh_version[0] != '\0') { |   if (tzh.tzh_version[0] != '\0') { | ||||||
|     // Snarf up the NL-enclosed future POSIX spec. Note
 |     // Snarf up the NL-enclosed future POSIX spec. Note
 | ||||||
|     // that version '3' files utilize an extended format.
 |     // that version '3' files utilize an extended format.
 | ||||||
|     auto get_char = [](ZoneInfoSource* zip) -> int { |     auto get_char = [](ZoneInfoSource* azip) -> int { | ||||||
|       unsigned char ch;  // all non-EOF results are positive
 |       unsigned char ch;  // all non-EOF results are positive
 | ||||||
|       return (zip->Read(&ch, 1) == 1) ? ch : EOF; |       return (azip->Read(&ch, 1) == 1) ? ch : EOF; | ||||||
|     }; |     }; | ||||||
|     if (get_char(zip) != '\n') |     if (get_char(zip) != '\n') | ||||||
|       return false; |       return false; | ||||||
|  |  | ||||||
|  | @ -457,8 +457,7 @@ struct tm ToTM(absl::Time t, absl::TimeZone tz) { | ||||||
|     tm.tm_year = static_cast<int>(cs.year() - 1900); |     tm.tm_year = static_cast<int>(cs.year() - 1900); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const CivilDay cd(cs); |   switch (GetWeekday(cs)) { | ||||||
|   switch (GetWeekday(cd)) { |  | ||||||
|     case Weekday::sunday: |     case Weekday::sunday: | ||||||
|       tm.tm_wday = 0; |       tm.tm_wday = 0; | ||||||
|       break; |       break; | ||||||
|  | @ -481,7 +480,7 @@ struct tm ToTM(absl::Time t, absl::TimeZone tz) { | ||||||
|       tm.tm_wday = 6; |       tm.tm_wday = 6; | ||||||
|       break; |       break; | ||||||
|   } |   } | ||||||
|   tm.tm_yday = GetYearDay(cd) - 1; |   tm.tm_yday = GetYearDay(cs) - 1; | ||||||
|   tm.tm_isdst = ci.is_dst ? 1 : 0; |   tm.tm_isdst = ci.is_dst ? 1 : 0; | ||||||
| 
 | 
 | ||||||
|   return tm; |   return tm; | ||||||
|  |  | ||||||
|  | @ -112,7 +112,7 @@ TEST(Time, UnixEpoch) { | ||||||
|   const auto ci = absl::UTCTimeZone().At(absl::UnixEpoch()); |   const auto ci = absl::UTCTimeZone().At(absl::UnixEpoch()); | ||||||
|   EXPECT_EQ(absl::CivilSecond(1970, 1, 1, 0, 0, 0), ci.cs); |   EXPECT_EQ(absl::CivilSecond(1970, 1, 1, 0, 0, 0), ci.cs); | ||||||
|   EXPECT_EQ(absl::ZeroDuration(), ci.subsecond); |   EXPECT_EQ(absl::ZeroDuration(), ci.subsecond); | ||||||
|   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(ci.cs)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(Time, Breakdown) { | TEST(Time, Breakdown) { | ||||||
|  | @ -123,14 +123,14 @@ TEST(Time, Breakdown) { | ||||||
|   auto ci = tz.At(t); |   auto ci = tz.At(t); | ||||||
|   EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 19, 0, 0, -18000, false); |   EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 19, 0, 0, -18000, false); | ||||||
|   EXPECT_EQ(absl::ZeroDuration(), ci.subsecond); |   EXPECT_EQ(absl::ZeroDuration(), ci.subsecond); | ||||||
|   EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(ci.cs)); | ||||||
| 
 | 
 | ||||||
|   // Just before the epoch.
 |   // Just before the epoch.
 | ||||||
|   t -= absl::Nanoseconds(1); |   t -= absl::Nanoseconds(1); | ||||||
|   ci = tz.At(t); |   ci = tz.At(t); | ||||||
|   EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 18, 59, 59, -18000, false); |   EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 18, 59, 59, -18000, false); | ||||||
|   EXPECT_EQ(absl::Nanoseconds(999999999), ci.subsecond); |   EXPECT_EQ(absl::Nanoseconds(999999999), ci.subsecond); | ||||||
|   EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(ci.cs)); | ||||||
| 
 | 
 | ||||||
|   // Some time later.
 |   // Some time later.
 | ||||||
|   t += absl::Hours(24) * 2735; |   t += absl::Hours(24) * 2735; | ||||||
|  | @ -139,7 +139,7 @@ TEST(Time, Breakdown) { | ||||||
|   ci = tz.At(t); |   ci = tz.At(t); | ||||||
|   EXPECT_CIVIL_INFO(ci, 1977, 6, 28, 14, 30, 15, -14400, true); |   EXPECT_CIVIL_INFO(ci, 1977, 6, 28, 14, 30, 15, -14400, true); | ||||||
|   EXPECT_EQ(8, ci.subsecond / absl::Nanoseconds(1)); |   EXPECT_EQ(8, ci.subsecond / absl::Nanoseconds(1)); | ||||||
|   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(ci.cs)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(Time, AdditiveOperators) { | TEST(Time, AdditiveOperators) { | ||||||
|  | @ -979,15 +979,15 @@ TEST(Time, ConversionSaturation) { | ||||||
|   EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::max(), 12, 31, 23, |   EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::max(), 12, 31, 23, | ||||||
|                             59, 59, 0, false); |                             59, 59, 0, false); | ||||||
|   EXPECT_EQ(absl::InfiniteDuration(), ci.subsecond); |   EXPECT_EQ(absl::InfiniteDuration(), ci.subsecond); | ||||||
|   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(ci.cs)); | ||||||
|   EXPECT_EQ(365, absl::GetYearDay(absl::CivilDay(ci.cs))); |   EXPECT_EQ(365, absl::GetYearDay(ci.cs)); | ||||||
|   EXPECT_STREQ("-00", ci.zone_abbr);  // artifact of TimeZone::At()
 |   EXPECT_STREQ("-00", ci.zone_abbr);  // artifact of TimeZone::At()
 | ||||||
|   ci = utc.At(absl::InfinitePast()); |   ci = utc.At(absl::InfinitePast()); | ||||||
|   EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::min(), 1, 1, 0, 0, |   EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::min(), 1, 1, 0, 0, | ||||||
|                             0, 0, false); |                             0, 0, false); | ||||||
|   EXPECT_EQ(-absl::InfiniteDuration(), ci.subsecond); |   EXPECT_EQ(-absl::InfiniteDuration(), ci.subsecond); | ||||||
|   EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(absl::CivilDay(ci.cs))); |   EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(ci.cs)); | ||||||
|   EXPECT_EQ(1, absl::GetYearDay(absl::CivilDay(ci.cs))); |   EXPECT_EQ(1, absl::GetYearDay(ci.cs)); | ||||||
|   EXPECT_STREQ("-00", ci.zone_abbr);  // artifact of TimeZone::At()
 |   EXPECT_STREQ("-00", ci.zone_abbr);  // artifact of TimeZone::At()
 | ||||||
| 
 | 
 | ||||||
|   // Approach the maximal Time value from below.
 |   // Approach the maximal Time value from below.
 | ||||||
|  |  | ||||||
|  | @ -2112,7 +2112,8 @@ TEST(VariantTest, Hash) { | ||||||
| // Miscellaneous and deprecated tests //
 | // Miscellaneous and deprecated tests //
 | ||||||
| ////////////////////////////////////////
 | ////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
| // Test that a set requiring a basic type conversion works correctly.
 | // Test that a set requiring a basic type conversion works correctly
 | ||||||
|  | #if !defined(ABSL_HAVE_STD_VARIANT) | ||||||
| TEST(VariantTest, TestConvertingSet) { | TEST(VariantTest, TestConvertingSet) { | ||||||
|   typedef variant<double> Variant; |   typedef variant<double> Variant; | ||||||
|   Variant v(1.0); |   Variant v(1.0); | ||||||
|  | @ -2122,6 +2123,7 @@ TEST(VariantTest, TestConvertingSet) { | ||||||
|   ASSERT_TRUE(nullptr != absl::get_if<double>(&v)); |   ASSERT_TRUE(nullptr != absl::get_if<double>(&v)); | ||||||
|   EXPECT_DOUBLE_EQ(2, absl::get<double>(v)); |   EXPECT_DOUBLE_EQ(2, absl::get<double>(v)); | ||||||
| } | } | ||||||
|  | #endif  // ABSL_HAVE_STD_VARIANT
 | ||||||
| 
 | 
 | ||||||
| // Test that a vector of variants behaves reasonably.
 | // Test that a vector of variants behaves reasonably.
 | ||||||
| TEST(VariantTest, Container) { | TEST(VariantTest, Container) { | ||||||
|  | @ -2273,6 +2275,7 @@ struct Convertible2 { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| TEST(VariantTest, TestRvalueConversion) { | TEST(VariantTest, TestRvalueConversion) { | ||||||
|  | #if !defined(ABSL_HAVE_STD_VARIANT) | ||||||
|   variant<double, std::string> var( |   variant<double, std::string> var( | ||||||
|       ConvertVariantTo<variant<double, std::string>>( |       ConvertVariantTo<variant<double, std::string>>( | ||||||
|           variant<std::string, int>(0))); |           variant<std::string, int>(0))); | ||||||
|  | @ -2305,6 +2308,7 @@ TEST(VariantTest, TestRvalueConversion) { | ||||||
|   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42)); |   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42)); | ||||||
|   ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2)); |   ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2)); | ||||||
|   EXPECT_EQ(42, absl::get<uint32_t>(variant2)); |   EXPECT_EQ(42, absl::get<uint32_t>(variant2)); | ||||||
|  | #endif  // !ABSL_HAVE_STD_VARIANT
 | ||||||
| 
 | 
 | ||||||
|   variant<Convertible1, Convertible2> variant3( |   variant<Convertible1, Convertible2> variant3( | ||||||
|       ConvertVariantTo<variant<Convertible1, Convertible2>>( |       ConvertVariantTo<variant<Convertible1, Convertible2>>( | ||||||
|  | @ -2317,6 +2321,7 @@ TEST(VariantTest, TestRvalueConversion) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(VariantTest, TestLvalueConversion) { | TEST(VariantTest, TestLvalueConversion) { | ||||||
|  | #if !defined(ABSL_HAVE_STD_VARIANT) | ||||||
|   variant<std::string, int> source1 = 0; |   variant<std::string, int> source1 = 0; | ||||||
|   variant<double, std::string> destination( |   variant<double, std::string> destination( | ||||||
|       ConvertVariantTo<variant<double, std::string>>(source1)); |       ConvertVariantTo<variant<double, std::string>>(source1)); | ||||||
|  | @ -2353,6 +2358,7 @@ TEST(VariantTest, TestLvalueConversion) { | ||||||
|   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6); |   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6); | ||||||
|   ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2)); |   ASSERT_TRUE(absl::holds_alternative<uint32_t>(variant2)); | ||||||
|   EXPECT_EQ(42, absl::get<uint32_t>(variant2)); |   EXPECT_EQ(42, absl::get<uint32_t>(variant2)); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|   variant<Convertible2, Convertible1> source7((Convertible1())); |   variant<Convertible2, Convertible1> source7((Convertible1())); | ||||||
|   variant<Convertible1, Convertible2> variant3( |   variant<Convertible1, Convertible2> variant3( | ||||||
|  | @ -2417,6 +2423,7 @@ TEST(VariantTest, DoesNotMoveFromLvalues) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) { | TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) { | ||||||
|  | #if !defined(ABSL_HAVE_STD_VARIANT) | ||||||
|   variant<double, std::string> var( |   variant<double, std::string> var( | ||||||
|       ConvertVariantTo<variant<double, std::string>>( |       ConvertVariantTo<variant<double, std::string>>( | ||||||
|           variant<std::string, int>(3))); |           variant<std::string, int>(3))); | ||||||
|  | @ -2442,6 +2449,7 @@ TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) { | ||||||
| 
 | 
 | ||||||
|   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42)); |   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(variant<uint32_t>(42)); | ||||||
|   EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42)); |   EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42)); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
|   variant<Convertible1, Convertible2> variant3( |   variant<Convertible1, Convertible2> variant3( | ||||||
|       ConvertVariantTo<variant<Convertible1, Convertible2>>( |       ConvertVariantTo<variant<Convertible1, Convertible2>>( | ||||||
|  | @ -2454,6 +2462,7 @@ TEST(VariantTest, TestRvalueConversionViaConvertVariantTo) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TEST(VariantTest, TestLvalueConversionViaConvertVariantTo) { | TEST(VariantTest, TestLvalueConversionViaConvertVariantTo) { | ||||||
|  | #if !defined(ABSL_HAVE_STD_VARIANT) | ||||||
|   variant<std::string, int> source1 = 3; |   variant<std::string, int> source1 = 3; | ||||||
|   variant<double, std::string> destination( |   variant<double, std::string> destination( | ||||||
|       ConvertVariantTo<variant<double, std::string>>(source1)); |       ConvertVariantTo<variant<double, std::string>>(source1)); | ||||||
|  | @ -2485,6 +2494,7 @@ TEST(VariantTest, TestLvalueConversionViaConvertVariantTo) { | ||||||
|   variant<uint32_t> source6(42); |   variant<uint32_t> source6(42); | ||||||
|   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6); |   variant2 = ConvertVariantTo<variant<int32_t, uint32_t>>(source6); | ||||||
|   EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42)); |   EXPECT_THAT(absl::get_if<uint32_t>(&variant2), Pointee(42)); | ||||||
|  | #endif  // !ABSL_HAVE_STD_VARIANT
 | ||||||
| 
 | 
 | ||||||
|   variant<Convertible2, Convertible1> source7((Convertible1())); |   variant<Convertible2, Convertible1> source7((Convertible1())); | ||||||
|   variant<Convertible1, Convertible2> variant3( |   variant<Convertible1, Convertible2> variant3( | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|   COMPILATION_MODE="fastbuild opt" |   COMPILATION_MODE="fastbuild opt" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190508" | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190701" | ||||||
| 
 | 
 | ||||||
| # USE_BAZEL_CACHE=1 only works on Kokoro. | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
| # Without access to the credentials this won't work. | # Without access to the credentials this won't work. | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|   COMPILATION_MODE="fastbuild opt" |   COMPILATION_MODE="fastbuild opt" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190508" | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190701" | ||||||
| 
 | 
 | ||||||
| # USE_BAZEL_CACHE=1 only works on Kokoro. | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
| # Without access to the credentials this won't work. | # Without access to the credentials this won't work. | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|   COMPILATION_MODE="fastbuild opt" |   COMPILATION_MODE="fastbuild opt" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190508" | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190701" | ||||||
| 
 | 
 | ||||||
| # USE_BAZEL_CACHE=1 only works on Kokoro. | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
| # Without access to the credentials this won't work. | # Without access to the credentials this won't work. | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|   COMPILATION_MODE="fastbuild opt" |   COMPILATION_MODE="fastbuild opt" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190508" | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_clang-latest:20190701" | ||||||
| 
 | 
 | ||||||
| # USE_BAZEL_CACHE=1 only works on Kokoro. | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
| # Without access to the credentials this won't work. | # Without access to the credentials this won't work. | ||||||
|  |  | ||||||
							
								
								
									
										75
									
								
								ci/linux_gcc-4.9_libstdcxx_bazel.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								ci/linux_gcc-4.9_libstdcxx_bazel.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,75 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # | ||||||
|  | # Copyright 2019 The Abseil Authors. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #    https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  | 
 | ||||||
|  | # This script that can be invoked to test abseil-cpp in a hermetic environment | ||||||
|  | # using a Docker image on Linux. You must have Docker installed to use this | ||||||
|  | # script. | ||||||
|  | 
 | ||||||
|  | set -euox pipefail | ||||||
|  | 
 | ||||||
|  | if [ -z ${ABSEIL_ROOT:-} ]; then | ||||||
|  |   ABSEIL_ROOT="$(realpath $(dirname ${0})/..)" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z ${STD:-} ]; then | ||||||
|  |   STD="c++11 c++14" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|  |   COMPILATION_MODE="fastbuild opt" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-4.9:20190702" | ||||||
|  | 
 | ||||||
|  | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
|  | # Without access to the credentials this won't work. | ||||||
|  | if [ ${USE_BAZEL_CACHE:-0} -ne 0 ]; then | ||||||
|  |   DOCKER_EXTRA_ARGS="--volume=${KOKORO_KEYSTORE_DIR}:/keystore:ro ${DOCKER_EXTRA_ARGS:-}" | ||||||
|  |   # Bazel doesn't track changes to tools outside of the workspace | ||||||
|  |   # (e.g. /usr/bin/gcc), so by appending the docker container to the | ||||||
|  |   # remote_http_cache url, we make changes to the container part of | ||||||
|  |   # the cache key. Hashing the key is to make it shorter and url-safe. | ||||||
|  |   container_key=$(echo ${DOCKER_CONTAINER} | sha256sum | head -c 16) | ||||||
|  |   BAZEL_EXTRA_ARGS="--remote_http_cache=https://storage.googleapis.com/absl-bazel-remote-cache/${container_key} --google_credentials=/keystore/73103_absl-bazel-remote-cache ${BAZEL_EXTRA_ARGS:-}" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | for std in ${STD}; do | ||||||
|  |   for compilation_mode in ${COMPILATION_MODE}; do | ||||||
|  |     echo "--------------------------------------------------------------------" | ||||||
|  |     echo "Testing with --compilation_mode=${compilation_mode} and --std=${std}" | ||||||
|  | 
 | ||||||
|  |     time docker run \ | ||||||
|  |       --volume="${ABSEIL_ROOT}:/abseil-cpp:ro" \ | ||||||
|  |       --workdir=/abseil-cpp \ | ||||||
|  |       --cap-add=SYS_PTRACE \ | ||||||
|  |       --rm \ | ||||||
|  |       -e CC="/usr/bin/gcc-4.9" \ | ||||||
|  |       -e BAZEL_CXXOPTS="-std=${std}" \ | ||||||
|  |       ${DOCKER_EXTRA_ARGS:-} \ | ||||||
|  |       ${DOCKER_CONTAINER} \ | ||||||
|  |       /usr/local/bin/bazel test ... \ | ||||||
|  |         --compilation_mode=${compilation_mode} \ | ||||||
|  |         --copt=-Werror \ | ||||||
|  |         --define="absl=1" \ | ||||||
|  |         --keep_going \ | ||||||
|  |         --show_timestamps \ | ||||||
|  |         --test_env="GTEST_INSTALL_FAILURE_SIGNAL_HANDLER=1" \ | ||||||
|  |         --test_env="TZDIR=/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo" \ | ||||||
|  |         --test_output=errors \ | ||||||
|  |         --test_tag_filters=-benchmark \ | ||||||
|  |         ${BAZEL_EXTRA_ARGS:-} | ||||||
|  |   done | ||||||
|  | done | ||||||
|  | @ -32,7 +32,7 @@ if [ -z ${COMPILATION_MODE:-} ]; then | ||||||
|   COMPILATION_MODE="fastbuild opt" |   COMPILATION_MODE="fastbuild opt" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-latest:20190318" | readonly DOCKER_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-latest:20190701" | ||||||
| 
 | 
 | ||||||
| # USE_BAZEL_CACHE=1 only works on Kokoro. | # USE_BAZEL_CACHE=1 only works on Kokoro. | ||||||
| # Without access to the credentials this won't work. | # Without access to the credentials this won't work. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue