| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | // Copyright 2018 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.#ifndef ABSL_CONTAINER_INTERNAL_TRACKED_H_#define ABSL_CONTAINER_INTERNAL_TRACKED_H_#include <stddef.h>#include <memory>#include <utility>#include "absl/base/config.h"namespace absl {ABSL_NAMESPACE_BEGINnamespace container_internal {// A class that tracks its copies and moves so that it can be queried in tests.template <class T>class Tracked { public:  Tracked() {}  // NOLINTNEXTLINE(runtime/explicit)  Tracked(const T& val) : val_(val) {}  Tracked(const Tracked& that)      : val_(that.val_),        num_moves_(that.num_moves_),        num_copies_(that.num_copies_) {    ++(*num_copies_);  }  Tracked(Tracked&& that)      : val_(std::move(that.val_)),        num_moves_(std::move(that.num_moves_)),        num_copies_(std::move(that.num_copies_)) {    ++(*num_moves_);  }  Tracked& operator=(const Tracked& that) {    val_ = that.val_;    num_moves_ = that.num_moves_;    num_copies_ = that.num_copies_;    ++(*num_copies_);  }  Tracked& operator=(Tracked&& that) {    val_ = std::move(that.val_);    num_moves_ = std::move(that.num_moves_);    num_copies_ = std::move(that.num_copies_);    ++(*num_moves_);  }  const T& val() const { return val_; }  friend bool operator==(const Tracked& a, const Tracked& b) {    return a.val_ == b.val_;  }  friend bool operator!=(const Tracked& a, const Tracked& b) {    return !(a == b);  }  size_t num_copies() { return *num_copies_; }  size_t num_moves() { return *num_moves_; } private:  T val_;  std::shared_ptr<size_t> num_moves_ = std::make_shared<size_t>(0);  std::shared_ptr<size_t> num_copies_ = std::make_shared<size_t>(0);};}  // namespace container_internalABSL_NAMESPACE_END}  // namespace absl#endif  // ABSL_CONTAINER_INTERNAL_TRACKED_H_
 |