Export of internal Abseil changes

--
017c3924d21132085bc20c9be0ae469bfbf2c56c by Gennadiy Rozental <rogeeff@google.com>:

Import of CCTZ from GitHub.

PiperOrigin-RevId: 338723934

--
8b08c23d7b05232e283b1388cee3eb5bebc2d9c4 by Derek Mauro <dmauro@google.com>:

Add script to test GCC floor (the minimum version of GCC we support,
currently the GCC 5 series)

PiperOrigin-RevId: 338708581

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

Fix typo in documentation of StatusOr::value_or() ('of' -> 'if').

PiperOrigin-RevId: 338690089

--
97d5008865327fc36b942b96de0d0cacfb909df5 by Derek Mauro <dmauro@google.com>:

Import of CCTZ from GitHub.

PiperOrigin-RevId: 338568224

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

Add `absl_btree_prefer_linear_node_search`

Allow keys of `btree_set`, `btree_map`, `btree_multiset`, and `btree_multimap`
to opt-in to linear search (instead of binary search).  Linear search was
used previously for arithmetic types with `key_compare` of `std::greater`
or `std::less`.

For example, this would be useful for key types that wrap an integer
and define their own cheap `operator<()`.

```
 class K {
  public:
   using absl_btree_prefer_linear_node_search = std::true_type;
   ...
  private:
   friend bool operator<(K a, K b) { return a.k_ < b.k_; }
   int k_;
 };

 absl::btree_map<K, V> m;  // Uses linear search
 assert((absl::btree_map<K, V>::testonly_uses_linear_node_search()));
```

PiperOrigin-RevId: 338476553

--
c56ead7ce6b0a5ad32e3a42904c686448a69451e by Gennadiy Rozental <rogeeff@google.com>:

Import of CCTZ from GitHub.

PiperOrigin-RevId: 338419417
GitOrigin-RevId: 017c3924d21132085bc20c9be0ae469bfbf2c56c
Change-Id: I1199f3ae917280a3ef20ccc6038abbe34d96ec0b
pull/833/head
Abseil Team 4 years ago committed by Gennadiy Rozental
parent eb317a701b
commit 1e3d25b265
  1. 64
      absl/container/btree_test.cc
  2. 45
      absl/container/internal/btree.h
  3. 2
      absl/status/statusor.h
  4. 18
      absl/time/internal/cctz/include/cctz/civil_time_detail.h
  5. 2
      absl/time/internal/cctz/testdata/version
  6. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan
  7. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra
  8. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa
  9. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers
  10. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara
  11. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera
  12. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako
  13. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui
  14. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul
  15. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau
  16. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre
  17. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville
  18. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura
  19. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo
  20. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Casablanca
  21. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta
  22. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry
  23. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar
  24. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam
  25. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti
  26. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala
  27. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun
  28. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown
  29. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone
  30. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare
  31. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg
  32. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba
  33. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala
  34. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum
  35. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali
  36. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa
  37. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos
  38. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville
  39. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome
  40. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda
  41. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi
  42. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka
  43. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo
  44. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo
  45. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru
  46. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane
  47. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu
  48. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia
  49. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi
  50. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena
  51. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey
  52. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott
  53. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou
  54. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo
  55. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome
  56. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu
  57. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli
  58. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis
  59. BIN
      absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek
  60. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Adak
  61. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage
  62. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla
  63. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Antigua
  64. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina
  65. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires
  66. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca
  67. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia
  68. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba
  69. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy
  70. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja
  71. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza
  72. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos
  73. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta
  74. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan
  75. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis
  76. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman
  77. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia
  78. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Aruba
  79. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion
  80. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan
  81. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Atka
  82. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Bahia
  83. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas
  84. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Barbados
  85. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Belem
  86. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Belize
  87. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon
  88. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista
  89. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Bogota
  90. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Boise
  91. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires
  92. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay
  93. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande
  94. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Cancun
  95. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Caracas
  96. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Catamarca
  97. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne
  98. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Cayman
  99. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Chicago
  100. BIN
      absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1216,6 +1216,70 @@ class BtreeNodePeer {
namespace {
class BtreeMapTest : public ::testing::Test {
public:
struct Key {};
struct Cmp {
template <typename T>
bool operator()(T, T) const {
return false;
}
};
struct KeyLin {
using absl_btree_prefer_linear_node_search = std::true_type;
};
struct CmpLin : Cmp {
using absl_btree_prefer_linear_node_search = std::true_type;
};
struct KeyBin {
using absl_btree_prefer_linear_node_search = std::false_type;
};
struct CmpBin : Cmp {
using absl_btree_prefer_linear_node_search = std::false_type;
};
template <typename K, typename C>
static bool IsLinear() {
return BtreeNodePeer::UsesLinearNodeSearch<absl::btree_map<K, int, C>>();
}
};
TEST_F(BtreeMapTest, TestLinearSearchPreferredForKeyLinearViaAlias) {
// Test requesting linear search by directly exporting an alias.
EXPECT_FALSE((IsLinear<Key, Cmp>()));
EXPECT_TRUE((IsLinear<KeyLin, Cmp>()));
EXPECT_TRUE((IsLinear<Key, CmpLin>()));
EXPECT_TRUE((IsLinear<KeyLin, CmpLin>()));
}
TEST_F(BtreeMapTest, LinearChoiceTree) {
// Cmp has precedence, and is forcing binary
EXPECT_FALSE((IsLinear<Key, CmpBin>()));
EXPECT_FALSE((IsLinear<KeyLin, CmpBin>()));
EXPECT_FALSE((IsLinear<KeyBin, CmpBin>()));
EXPECT_FALSE((IsLinear<int, CmpBin>()));
EXPECT_FALSE((IsLinear<std::string, CmpBin>()));
// Cmp has precedence, and is forcing linear
EXPECT_TRUE((IsLinear<Key, CmpLin>()));
EXPECT_TRUE((IsLinear<KeyLin, CmpLin>()));
EXPECT_TRUE((IsLinear<KeyBin, CmpLin>()));
EXPECT_TRUE((IsLinear<int, CmpLin>()));
EXPECT_TRUE((IsLinear<std::string, CmpLin>()));
// Cmp has no preference, Key determines linear vs binary.
EXPECT_FALSE((IsLinear<Key, Cmp>()));
EXPECT_TRUE((IsLinear<KeyLin, Cmp>()));
EXPECT_FALSE((IsLinear<KeyBin, Cmp>()));
// arithmetic key w/ std::less or std::greater: linear
EXPECT_TRUE((IsLinear<int, std::less<int>>()));
EXPECT_TRUE((IsLinear<double, std::greater<double>>()));
// arithmetic key w/ custom compare: binary
EXPECT_FALSE((IsLinear<int, Cmp>()));
// non-arithmetic key: binary
EXPECT_FALSE((IsLinear<std::string, std::less<std::string>>()));
}
TEST(Btree, BtreeMapCanHoldMoveOnlyTypes) {
absl::btree_map<std::string, std::unique_ptr<std::string>> m;

@ -182,6 +182,38 @@ struct key_compare_to_adapter<std::greater<absl::Cord>> {
using type = StringBtreeDefaultGreater;
};
// Detects an 'absl_btree_prefer_linear_node_search' member. This is
// a protocol used as an opt-in or opt-out of linear search.
//
// For example, this would be useful for key types that wrap an integer
// and define their own cheap operator<(). For example:
//
// class K {
// public:
// using absl_btree_prefer_linear_node_search = std::true_type;
// ...
// private:
// friend bool operator<(K a, K b) { return a.k_ < b.k_; }
// int k_;
// };
//
// btree_map<K, V> m; // Uses linear search
//
// If T has the preference tag, then it has a preference.
// Btree will use the tag's truth value.
template <typename T, typename = void>
struct has_linear_node_search_preference : std::false_type {};
template <typename T, typename = void>
struct prefers_linear_node_search : std::false_type {};
template <typename T>
struct has_linear_node_search_preference<
T, absl::void_t<typename T::absl_btree_prefer_linear_node_search>>
: std::true_type {};
template <typename T>
struct prefers_linear_node_search<
T, absl::void_t<typename T::absl_btree_prefer_linear_node_search>>
: T::absl_btree_prefer_linear_node_search {};
template <typename Key, typename Compare, typename Alloc, int TargetNodeSize,
bool Multi, typename SlotPolicy>
struct common_params {
@ -424,15 +456,22 @@ class btree_node {
using difference_type = typename Params::difference_type;
// Btree decides whether to use linear node search as follows:
// - If the comparator expresses a preference, use that.
// - If the key expresses a preference, use that.
// - If the key is arithmetic and the comparator is std::less or
// std::greater, choose linear.
// - Otherwise, choose binary.
// TODO(ezb): Might make sense to add condition(s) based on node-size.
using use_linear_search = std::integral_constant<
bool,
std::is_arithmetic<key_type>::value &&
(std::is_same<std::less<key_type>, key_compare>::value ||
std::is_same<std::greater<key_type>, key_compare>::value)>;
has_linear_node_search_preference<key_compare>::value
? prefers_linear_node_search<key_compare>::value
: has_linear_node_search_preference<key_type>::value
? prefers_linear_node_search<key_type>::value
: std::is_arithmetic<key_type>::value &&
(std::is_same<std::less<key_type>, key_compare>::value ||
std::is_same<std::greater<key_type>,
key_compare>::value)>;
// This class is organized by gtl::Layout as if it had the following
// structure:

@ -542,7 +542,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
// StatusOr<T>::value_or()
//
// Returns the current value of `this->ok() == true`. Otherwise constructs a
// Returns the current value if `this->ok() == true`. Otherwise constructs a
// value using the provided `default_value`.
//
// Unlike `value`, this function returns by value, copying the current value

@ -416,16 +416,10 @@ class civil_time {
// Assigning arithmetic.
CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept {
f_ = step(T{}, f_, n);
return *this;
return *this = *this + n;
}
CONSTEXPR_M civil_time& operator-=(diff_t n) noexcept {
if (n != (std::numeric_limits<diff_t>::min)()) {
f_ = step(T{}, f_, -n);
} else {
f_ = step(T{}, step(T{}, f_, -(n + 1)), 1);
}
return *this;
return *this = *this - n;
}
CONSTEXPR_M civil_time& operator++() noexcept { return *this += 1; }
CONSTEXPR_M civil_time operator++(int) noexcept {
@ -442,13 +436,15 @@ class civil_time {
// Binary arithmetic operators.
friend CONSTEXPR_F civil_time operator+(civil_time a, diff_t n) noexcept {
return a += n;
return civil_time(step(T{}, a.f_, n));
}
friend CONSTEXPR_F civil_time operator+(diff_t n, civil_time a) noexcept {
return a += n;
return a + n;
}
friend CONSTEXPR_F civil_time operator-(civil_time a, diff_t n) noexcept {
return a -= n;
return n != (std::numeric_limits<diff_t>::min)()
? civil_time(step(T{}, a.f_, -n))
: civil_time(step(T{}, step(T{}, a.f_, -(n + 1)), 1));
}
friend CONSTEXPR_F diff_t operator-(civil_time lhs, civil_time rhs) noexcept {
return difference(T{}, lhs.f_, rhs.f_);

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save