xref: /freebsd/contrib/llvm-project/lldb/source/Plugins/Language/ObjC/NSDictionary.h (revision 6966ac055c3b7a39266fb982493330df7a097997)
1 //===-- NSDictionary.h ---------------------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_NSDictionary_h_
11 #define liblldb_NSDictionary_h_
12 
13 #include "lldb/Core/ValueObject.h"
14 #include "lldb/DataFormatters/TypeSummary.h"
15 #include "lldb/DataFormatters/TypeSynthetic.h"
16 #include "lldb/Utility/ConstString.h"
17 #include "lldb/Utility/Stream.h"
18 
19 #include <map>
20 #include <memory>
21 
22 namespace lldb_private {
23 namespace formatters {
24 template <bool name_entries>
25 bool NSDictionarySummaryProvider(ValueObject &valobj, Stream &stream,
26                                  const TypeSummaryOptions &options);
27 
28 extern template bool
29 NSDictionarySummaryProvider<true>(ValueObject &, Stream &,
30                                   const TypeSummaryOptions &);
31 
32 extern template bool
33 NSDictionarySummaryProvider<false>(ValueObject &, Stream &,
34                                    const TypeSummaryOptions &);
35 
36 SyntheticChildrenFrontEnd *
37 NSDictionarySyntheticFrontEndCreator(CXXSyntheticChildren *,
38                                      lldb::ValueObjectSP);
39 
40 class NSDictionary_Additionals {
41 public:
42   class AdditionalFormatterMatching {
43   public:
44     class Matcher {
45     public:
46       virtual ~Matcher() = default;
47       virtual bool Match(ConstString class_name) = 0;
48 
49       typedef std::unique_ptr<Matcher> UP;
50     };
51     class Prefix : public Matcher {
52     public:
53       Prefix(ConstString p);
54       ~Prefix() override = default;
55       bool Match(ConstString class_name) override;
56 
57     private:
58       ConstString m_prefix;
59     };
60     class Full : public Matcher {
61     public:
62       Full(ConstString n);
63       ~Full() override = default;
64       bool Match(ConstString class_name) override;
65 
66     private:
67       ConstString m_name;
68     };
69     typedef Matcher::UP MatcherUP;
70 
71     MatcherUP GetFullMatch(ConstString n) { return llvm::make_unique<Full>(n); }
72 
73     MatcherUP GetPrefixMatch(ConstString p) {
74       return llvm::make_unique<Prefix>(p);
75     }
76   };
77 
78   template <typename FormatterType>
79   using AdditionalFormatter =
80       std::pair<AdditionalFormatterMatching::MatcherUP, FormatterType>;
81 
82   template <typename FormatterType>
83   using AdditionalFormatters = std::vector<AdditionalFormatter<FormatterType>>;
84 
85   static AdditionalFormatters<CXXFunctionSummaryFormat::Callback> &
86   GetAdditionalSummaries();
87 
88   static AdditionalFormatters<CXXSyntheticChildren::CreateFrontEndCallback> &
89   GetAdditionalSynthetics();
90 };
91 } // namespace formatters
92 } // namespace lldb_private
93 
94 #endif // liblldb_NSDictionary_h_
95