From f0f15c2778b0e4959244dd25e63f445a455870f5 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 9 Aug 2018 11:32:15 -0700 Subject: Export of internal Abseil changes. -- 7fb969986d7d5a1b30233a94ae7ea29e1abf8937 by Greg Falcon : Fix whitespace in str_join.h. PiperOrigin-RevId: 208082852 -- 85428003a8a29fbcd92c0b48708a69460eeb0e8f by Abseil Team : Add missing back-ticks to the comments. PiperOrigin-RevId: 207985417 -- 0bbac248d5649ac1d7bc71ff1025a11332fb2026 by Abseil Team : Internal change. PiperOrigin-RevId: 207927484 -- f587324b99570b403b4626fb03fce16f0d950b05 by Abseil Team : Update BaseCountedInstance to have comparison operators and allow them to be tracked by InstanceTracker. PiperOrigin-RevId: 207919218 -- d7f410e4f15328412941f16e25ba3735d5bdfda6 by Derek Mauro : Internal import of GitHub PR #153 Removed "warning treated as error" flag from MSVC PiperOrigin-RevId: 207908806 -- 59eefc78f8571ffc51cb636894015ce2580508d7 by Abseil Team : Fix namespace references in examples from 'std::' to 'absl::'. PiperOrigin-RevId: 207895230 -- 151df17b6544222e29913b034a1296c0e14374d5 by Abseil Team : Internal Change PiperOrigin-RevId: 207894949 GitOrigin-RevId: 7fb969986d7d5a1b30233a94ae7ea29e1abf8937 Change-Id: I00097afbe9610ddb3f2330a2a86dcffde7bb6675 --- absl/container/internal/test_instance_tracker.cc | 1 + absl/container/internal/test_instance_tracker.h | 52 +++++++++++++++++++--- .../internal/test_instance_tracker_test.cc | 22 +++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) (limited to 'absl/container/internal') diff --git a/absl/container/internal/test_instance_tracker.cc b/absl/container/internal/test_instance_tracker.cc index fe00aca8fb98..b18e0bb7a1ea 100644 --- a/absl/container/internal/test_instance_tracker.cc +++ b/absl/container/internal/test_instance_tracker.cc @@ -21,6 +21,7 @@ int BaseCountedInstance::num_live_instances_ = 0; int BaseCountedInstance::num_moves_ = 0; int BaseCountedInstance::num_copies_ = 0; int BaseCountedInstance::num_swaps_ = 0; +int BaseCountedInstance::num_comparisons_ = 0; } // namespace test_internal } // namespace absl diff --git a/absl/container/internal/test_instance_tracker.h b/absl/container/internal/test_instance_tracker.h index cf8f3a531e62..ec45f574037f 100644 --- a/absl/container/internal/test_instance_tracker.h +++ b/absl/container/internal/test_instance_tracker.h @@ -22,8 +22,8 @@ namespace absl { namespace test_internal { // A type that counts number of occurences of the type, the live occurrences of -// the type, as well as the number of copies, moves, and swaps that have -// occurred on the type. This is used as a base class for the copyable, +// the type, as well as the number of copies, moves, swaps, and comparisons that +// have occurred on the type. This is used as a base class for the copyable, // copyable+movable, and movable types below that are used in actual tests. Use // InstanceTracker in tests to track the number of instances. class BaseCountedInstance { @@ -66,6 +66,36 @@ class BaseCountedInstance { return *this; } + bool operator==(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ == x.value_; + } + + bool operator!=(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ != x.value_; + } + + bool operator<(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ < x.value_; + } + + bool operator>(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ > x.value_; + } + + bool operator<=(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ <= x.value_; + } + + bool operator>=(const BaseCountedInstance& x) const { + ++num_comparisons_; + return value_ >= x.value_; + } + int value() const { if (!is_live_) std::abort(); return value_; @@ -108,6 +138,9 @@ class BaseCountedInstance { // Number of times that BaseCountedInstance objects were swapped. static int num_swaps_; + + // Number of times that BaseCountedInstance objects were compared. + static int num_comparisons_; }; // Helper to track the BaseCountedInstance instance counters. Expects that the @@ -152,13 +185,21 @@ class InstanceTracker { // construction or the last call to ResetCopiesMovesSwaps(). int swaps() const { return BaseCountedInstance::num_swaps_ - start_swaps_; } - // Resets the base values for moves, copies and swaps to the current values, - // so that subsequent Get*() calls for moves, copies and swaps will compare to - // the situation at the point of this call. + // Returns the number of comparisons on BaseCountedInstance objects since + // construction or the last call to ResetCopiesMovesSwaps(). + int comparisons() const { + return BaseCountedInstance::num_comparisons_ - start_comparisons_; + } + + // Resets the base values for moves, copies, comparisons, and swaps to the + // current values, so that subsequent Get*() calls for moves, copies, + // comparisons, and swaps will compare to the situation at the point of this + // call. void ResetCopiesMovesSwaps() { start_moves_ = BaseCountedInstance::num_moves_; start_copies_ = BaseCountedInstance::num_copies_; start_swaps_ = BaseCountedInstance::num_swaps_; + start_comparisons_ = BaseCountedInstance::num_comparisons_; } private: @@ -167,6 +208,7 @@ class InstanceTracker { int start_moves_; int start_copies_; int start_swaps_; + int start_comparisons_; }; // Copyable, not movable. diff --git a/absl/container/internal/test_instance_tracker_test.cc b/absl/container/internal/test_instance_tracker_test.cc index 9efb6771cf08..0ae57636df21 100644 --- a/absl/container/internal/test_instance_tracker_test.cc +++ b/absl/container/internal/test_instance_tracker_test.cc @@ -157,4 +157,26 @@ TEST(TestInstanceTracker, ExistingInstances) { EXPECT_EQ(1, tracker.moves()); } +TEST(TestInstanceTracker, Comparisons) { + InstanceTracker tracker; + MovableOnlyInstance one(1), two(2); + + EXPECT_EQ(0, tracker.comparisons()); + EXPECT_FALSE(one == two); + EXPECT_EQ(1, tracker.comparisons()); + EXPECT_TRUE(one != two); + EXPECT_EQ(2, tracker.comparisons()); + EXPECT_TRUE(one < two); + EXPECT_EQ(3, tracker.comparisons()); + EXPECT_FALSE(one > two); + EXPECT_EQ(4, tracker.comparisons()); + EXPECT_TRUE(one <= two); + EXPECT_EQ(5, tracker.comparisons()); + EXPECT_FALSE(one >= two); + EXPECT_EQ(6, tracker.comparisons()); + + tracker.ResetCopiesMovesSwaps(); + EXPECT_EQ(0, tracker.comparisons()); +} + } // namespace -- cgit 1.4.1