clang 23.0.0git
SummaryDataStore.h
Go to the documentation of this file.
1//===- SummaryDataStore.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Owns a collection of SummaryData objects keyed by SummaryName.
10// Produced by LUSummaryConsumer::run() variants.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SUMMARYDATA_SUMMARYDATASTORE_H
15#define LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SUMMARYDATA_SUMMARYDATASTORE_H
16
21#include "llvm/Support/Error.h"
22#include <map>
23#include <memory>
24
25namespace clang::ssaf {
26
28
29/// Owns a collection of SummaryData objects keyed by SummaryName.
30/// Produced by LUSummaryConsumer::run() variants.
32 friend class LUSummaryConsumer;
33
34 std::map<SummaryName, std::unique_ptr<SummaryData>> Data;
35
36public:
37 /// Returns true if data for \p Name is stored.
38 [[nodiscard]] bool contains(const SummaryName &Name) const {
39 return Data.find(Name) != Data.end();
40 }
41
42 /// Returns true if data for \p DataT is stored.
43 template <typename DataT> [[nodiscard]] bool contains() const {
44 static_assert(std::is_base_of_v<SummaryData, DataT>,
45 "DataT must derive from SummaryData");
46 static_assert(HasSummaryName<DataT>::value,
47 "DataT must have a static summaryName() method");
48
49 return contains(DataT::summaryName());
50 }
51
52 /// Returns a reference to the data for \p DataT, or an error if
53 /// no data for \p DataT is stored.
54 template <typename DataT> [[nodiscard]] llvm::Expected<DataT &> get() {
55 static_assert(std::is_base_of_v<SummaryData, DataT>,
56 "DataT must derive from SummaryData");
57 static_assert(HasSummaryName<DataT>::value,
58 "DataT must have a static summaryName() method");
59
60 auto Result = get(DataT::summaryName());
61 if (!Result) {
62 return Result.takeError();
63 }
64 return static_cast<DataT &>(*Result);
65 }
66
67 /// Returns a reference to the data for \p Name, or an error if
68 /// no data for \p Name is stored.
69 [[nodiscard]] llvm::Expected<SummaryData &> get(const SummaryName &Name) {
70 auto It = Data.find(Name);
71 if (It == Data.end()) {
72 return ErrorBuilder::create(std::errc::invalid_argument,
73 "no data for analysis '{0}' in store",
74 Name.str())
75 .build();
76 }
77 return *It->second;
78 }
79
80 /// Transfers ownership of the data for \p DataT to the caller, or returns
81 /// an error if no data for \p DataT is stored.
82 template <typename DataT>
84 static_assert(std::is_base_of_v<SummaryData, DataT>,
85 "DataT must derive from SummaryData");
86 static_assert(HasSummaryName<DataT>::value,
87 "DataT must have a static summaryName() method");
88
89 auto Result = take(DataT::summaryName());
90 if (!Result) {
91 return Result.takeError();
92 }
93 return std::unique_ptr<DataT>(static_cast<DataT *>(Result->release()));
94 }
95
96 /// Transfers ownership of the data for \p Name to the caller, or returns
97 /// an error if no data for \p Name is stored.
99 take(const SummaryName &Name) {
100 auto It = Data.find(Name);
101 if (It == Data.end()) {
102 return ErrorBuilder::create(std::errc::invalid_argument,
103 "no data for analysis '{0}' in store",
104 Name.str())
105 .build();
106 }
107 auto Ptr = std::move(It->second);
108 Data.erase(It);
109 return Ptr;
110 }
111};
112
113} // namespace clang::ssaf
114
115#endif // LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SUMMARYDATA_SUMMARYDATASTORE_H
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
llvm::Error build() const
Build and return the final error.
Consumes a LUSummary by dispatching its entity data to registered SummaryDataBuilders and returning t...
Owns a collection of SummaryData objects keyed by SummaryName.
llvm::Expected< SummaryData & > get(const SummaryName &Name)
Returns a reference to the data for Name, or an error if no data for Name is stored.
llvm::Expected< DataT & > get()
Returns a reference to the data for DataT, or an error if no data for DataT is stored.
bool contains() const
Returns true if data for DataT is stored.
bool contains(const SummaryName &Name) const
Returns true if data for Name is stored.
llvm::Expected< std::unique_ptr< DataT > > take()
Transfers ownership of the data for DataT to the caller, or returns an error if no data for DataT is ...
llvm::Expected< std::unique_ptr< SummaryData > > take(const SummaryName &Name)
Transfers ownership of the data for Name to the caller, or returns an error if no data for Name is st...
Uniquely identifies an analysis summary.
Definition SummaryName.h:22
llvm::StringRef str() const
Explicit conversion to the underlying string representation.
Definition SummaryName.h:31
@ Result
The result type of a method or function.
Definition TypeBase.h:905
Type trait that checks whether T has a static summaryName() method returning SummaryName.