1 // Copyright 2022 The Pigweed Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4 // use this file except in compliance with the License. You may obtain a copy of 5 // the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12 // License for the specific language governing permissions and limitations under 13 // the License. 14 #pragma once 15 16 #include <atomic> 17 #include <cstdint> 18 19 namespace pw::internal { 20 21 // Base class for RefCounted. Separates ref count storage from the private 22 // API accessible by the IntrusivePtr through the RefCounted. 23 class RefCountedBase { 24 public: 25 RefCountedBase(const RefCountedBase&) = delete; 26 RefCountedBase(RefCountedBase&&) = delete; 27 RefCountedBase& operator=(const RefCountedBase&) = delete; 28 RefCountedBase& operator=(RefCountedBase&&) = delete; 29 30 protected: 31 constexpr RefCountedBase() = default; 32 ~RefCountedBase(); 33 34 // Increments reference counter. 35 void AddRef() const; 36 37 // Decrements reference count and returns true if the object should be 38 // deleted. 39 [[nodiscard]] bool ReleaseRef() const; 40 41 // Returns current ref count value. ref_count()42 [[nodiscard]] int32_t ref_count() const { 43 return ref_count_.load(std::memory_order_relaxed); 44 } 45 46 private: 47 mutable std::atomic_int32_t ref_count_{0}; 48 }; 49 50 } // namespace pw::internal 51