| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #include "lifetime_annotations/lifetime.h" |
| |
| #include <atomic> |
| #include <cassert> |
| #include <ostream> |
| #include <string> |
| |
| #include "absl/strings/str_cat.h" |
| |
| namespace clang { |
| namespace tidy { |
| namespace lifetimes { |
| |
| constexpr int INVALID_LIFETIME_ID_EMPTY = 0; |
| constexpr int INVALID_LIFETIME_ID_TOMBSTONE = 1; |
| constexpr int STATIC_LIFETIME_ID = -1; |
| constexpr int FIRST_VARIABLE_LIFETIME_ID = 2; |
| constexpr int FIRST_LOCAL_LIFETIME_ID = -2; |
| |
| std::atomic<int> Lifetime::next_variable_id_{FIRST_VARIABLE_LIFETIME_ID}; |
| |
| std::atomic<int> Lifetime::next_local_id_{FIRST_LOCAL_LIFETIME_ID}; |
| |
| Lifetime::Lifetime() : id_(INVALID_LIFETIME_ID_EMPTY) {} |
| |
| Lifetime Lifetime::CreateVariable() { return Lifetime(next_variable_id_++); } |
| |
| Lifetime Lifetime::Static() { return Lifetime(STATIC_LIFETIME_ID); } |
| |
| Lifetime Lifetime::CreateLocal() { return Lifetime(next_local_id_--); } |
| |
| bool Lifetime::IsVariable() const { |
| assert(IsValid()); |
| return id_ > 0; |
| } |
| |
| bool Lifetime::IsConstant() const { |
| assert(IsValid()); |
| return !IsVariable(); |
| } |
| |
| bool Lifetime::IsLocal() const { |
| assert(IsValid()); |
| return id_ <= FIRST_LOCAL_LIFETIME_ID; |
| } |
| |
| std::string Lifetime::DebugString() const { |
| assert(IsValid()); |
| |
| switch (id_) { |
| case INVALID_LIFETIME_ID_EMPTY: |
| return "INVALID_EMPTY"; |
| case INVALID_LIFETIME_ID_TOMBSTONE: |
| return "INVALID_TOMBSTONE"; |
| case STATIC_LIFETIME_ID: |
| return "'static"; |
| default: |
| if (id_ <= FIRST_LOCAL_LIFETIME_ID) { |
| return absl::StrCat("'local", -id_); |
| } else { |
| return absl::StrCat("'", id_); |
| } |
| } |
| } |
| |
| Lifetime::Lifetime(int id) : id_(id) {} |
| |
| Lifetime Lifetime::InvalidEmpty() { |
| return Lifetime(INVALID_LIFETIME_ID_EMPTY); |
| } |
| |
| Lifetime Lifetime::InvalidTombstone() { |
| return Lifetime(INVALID_LIFETIME_ID_TOMBSTONE); |
| } |
| |
| bool Lifetime::IsValid() const { |
| return id_ != INVALID_LIFETIME_ID_EMPTY && |
| id_ != INVALID_LIFETIME_ID_TOMBSTONE; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, Lifetime lifetime) { |
| return os << lifetime.DebugString(); |
| } |
| |
| } // namespace lifetimes |
| } // namespace tidy |
| } // namespace clang |