1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- TypeCategoryMap.h ----------------------------------------*- C++ -*-===//
2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//                     The LLVM Compiler Infrastructure
4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source
6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details.
7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===//
9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
10f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef lldb_TypeCategoryMap_h_
11f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#define lldb_TypeCategoryMap_h_
12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes
14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes
15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes
17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes
18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-public.h"
19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-enumerations.h"
20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
21f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatNavigator.h"
22f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/TypeCategory.h"
23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
24f509c5ec066599a3399fced39ea36996184939e8Enrico Granatanamespace lldb_private {
25f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    class TypeCategoryMap
26f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    private:
28f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef ConstString KeyType;
29f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef TypeCategoryImpl ValueType;
30f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef ValueType::SharedPointer ValueSP;
31f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
32f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
33f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    public:
35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef std::map<KeyType, ValueSP> MapType;
36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef MapType::iterator MapIterator;
37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef bool(*CallbackType)(void*, const ValueSP&);
38f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        typedef uint32_t Position;
39f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
40f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        static const Position First = 0;
41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        static const Position Default = 1;
42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        static const Position Last = UINT32_MAX;
43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        TypeCategoryMap (IFormatChangeListener* lst);
45f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
47f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Add (KeyType name,
48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             const ValueSP& entry);
49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Delete (KeyType name);
52f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Enable (KeyType category_name,
55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                Position pos = Default);
56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
58f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Disable (KeyType category_name);
59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Enable (ValueSP category,
62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                Position pos = Default);
63f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
64f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Disable (ValueSP category);
66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Clear ();
69f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
70f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Get (KeyType name,
72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             ValueSP& entry);
73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Get (uint32_t pos,
76f509c5ec066599a3399fced39ea36996184939e8Enrico Granata             ValueSP& entry);
77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        void
79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        LoopThrough (CallbackType callback, void* param);
80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::TypeCategoryImplSP
82f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetAtIndex (uint32_t);
83f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        bool
85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        AnyMatches (ConstString type_name,
86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    bool only_enabled = true,
88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    const char** matching_category = NULL,
89f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                    TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        uint32_t
92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetCount ()
93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_map.size();
95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::TypeSummaryImplSP
98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSummaryFormat (ValueObject& valobj,
99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                          lldb::DynamicValueType use_dynamic);
100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON
102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        lldb::SyntheticChildrenSP
103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        GetSyntheticChildren (ValueObject& valobj,
104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                              lldb::DynamicValueType use_dynamic);
105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    private:
108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
109f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        class delete_matching_categories
110f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            lldb::TypeCategoryImplSP ptr;
112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        public:
113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p)
114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            {}
115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            bool operator()(const lldb::TypeCategoryImplSP& other)
117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            {
118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata                return ptr.get() == other.get();
119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            }
120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        };
121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Mutex m_map_mutex;
123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        IFormatChangeListener* listener;
124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        MapType m_map;
126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        ActiveCategoriesList m_active_categories;
127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        MapType& map ()
129f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_map;
131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        ActiveCategoriesList& active_list ()
134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_active_categories;
136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        Mutex& mutex ()
139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        {
140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata            return m_map_mutex;
141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        }
142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatNavigator<KeyType, ValueType>;
144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        friend class FormatManager;
145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    };
146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} // namespace lldb_private
147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
148f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif	// lldb_TypeCategoryMap_h_
149