1254721Semaste//===-- TypeFormat.h ----------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef lldb_TypeFormat_h_
11254721Semaste#define lldb_TypeFormat_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste
15254721Semaste// C++ Includes
16254721Semaste#include <string>
17254721Semaste
18254721Semaste// Other libraries and framework includes
19254721Semaste
20254721Semaste// Project includes
21254721Semaste#include "lldb/lldb-public.h"
22254721Semaste#include "lldb/lldb-enumerations.h"
23254721Semaste
24254721Semaste#include "lldb/Core/ValueObject.h"
25254721Semaste
26254721Semastenamespace lldb_private {
27254721Semaste    class TypeFormatImpl
28254721Semaste    {
29254721Semaste    public:
30254721Semaste        class Flags
31254721Semaste        {
32254721Semaste        public:
33254721Semaste
34254721Semaste            Flags () :
35254721Semaste            m_flags (lldb::eTypeOptionCascade)
36254721Semaste            {}
37254721Semaste
38254721Semaste            Flags (const Flags& other) :
39254721Semaste            m_flags (other.m_flags)
40254721Semaste            {}
41254721Semaste
42254721Semaste            Flags (uint32_t value) :
43254721Semaste            m_flags (value)
44254721Semaste            {}
45254721Semaste
46254721Semaste            Flags&
47254721Semaste            operator = (const Flags& rhs)
48254721Semaste            {
49254721Semaste                if (&rhs != this)
50254721Semaste                    m_flags = rhs.m_flags;
51254721Semaste
52254721Semaste                return *this;
53254721Semaste            }
54254721Semaste
55254721Semaste            Flags&
56254721Semaste            operator = (const uint32_t& rhs)
57254721Semaste            {
58254721Semaste                m_flags = rhs;
59254721Semaste                return *this;
60254721Semaste            }
61254721Semaste
62254721Semaste            Flags&
63254721Semaste            Clear()
64254721Semaste            {
65254721Semaste                m_flags = 0;
66254721Semaste                return *this;
67254721Semaste            }
68254721Semaste
69254721Semaste            bool
70254721Semaste            GetCascades () const
71254721Semaste            {
72254721Semaste                return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
73254721Semaste            }
74254721Semaste
75254721Semaste            Flags&
76254721Semaste            SetCascades (bool value = true)
77254721Semaste            {
78254721Semaste                if (value)
79254721Semaste                    m_flags |= lldb::eTypeOptionCascade;
80254721Semaste                else
81254721Semaste                    m_flags &= ~lldb::eTypeOptionCascade;
82254721Semaste                return *this;
83254721Semaste            }
84254721Semaste
85254721Semaste            bool
86254721Semaste            GetSkipPointers () const
87254721Semaste            {
88254721Semaste                return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
89254721Semaste            }
90254721Semaste
91254721Semaste            Flags&
92254721Semaste            SetSkipPointers (bool value = true)
93254721Semaste            {
94254721Semaste                if (value)
95254721Semaste                    m_flags |= lldb::eTypeOptionSkipPointers;
96254721Semaste                else
97254721Semaste                    m_flags &= ~lldb::eTypeOptionSkipPointers;
98254721Semaste                return *this;
99254721Semaste            }
100254721Semaste
101254721Semaste            bool
102254721Semaste            GetSkipReferences () const
103254721Semaste            {
104254721Semaste                return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
105254721Semaste            }
106254721Semaste
107254721Semaste            Flags&
108254721Semaste            SetSkipReferences (bool value = true)
109254721Semaste            {
110254721Semaste                if (value)
111254721Semaste                    m_flags |= lldb::eTypeOptionSkipReferences;
112254721Semaste                else
113254721Semaste                    m_flags &= ~lldb::eTypeOptionSkipReferences;
114254721Semaste                return *this;
115254721Semaste            }
116254721Semaste
117254721Semaste            uint32_t
118254721Semaste            GetValue ()
119254721Semaste            {
120254721Semaste                return m_flags;
121254721Semaste            }
122254721Semaste
123254721Semaste            void
124254721Semaste            SetValue (uint32_t value)
125254721Semaste            {
126254721Semaste                m_flags = value;
127254721Semaste            }
128254721Semaste
129254721Semaste        private:
130254721Semaste            uint32_t m_flags;
131254721Semaste        };
132254721Semaste
133254721Semaste        TypeFormatImpl (lldb::Format f = lldb::eFormatInvalid,
134254721Semaste                        const Flags& flags = Flags());
135254721Semaste
136254721Semaste        typedef std::shared_ptr<TypeFormatImpl> SharedPointer;
137254721Semaste        typedef bool(*ValueCallback)(void*, ConstString, const lldb::TypeFormatImplSP&);
138254721Semaste
139254721Semaste        ~TypeFormatImpl ()
140254721Semaste        {
141254721Semaste        }
142254721Semaste
143254721Semaste        bool
144254721Semaste        Cascades () const
145254721Semaste        {
146254721Semaste            return m_flags.GetCascades();
147254721Semaste        }
148254721Semaste        bool
149254721Semaste        SkipsPointers () const
150254721Semaste        {
151254721Semaste            return m_flags.GetSkipPointers();
152254721Semaste        }
153254721Semaste        bool
154254721Semaste        SkipsReferences () const
155254721Semaste        {
156254721Semaste            return m_flags.GetSkipReferences();
157254721Semaste        }
158254721Semaste
159254721Semaste        void
160254721Semaste        SetCascades (bool value)
161254721Semaste        {
162254721Semaste            m_flags.SetCascades(value);
163254721Semaste        }
164254721Semaste
165254721Semaste        void
166254721Semaste        SetSkipsPointers (bool value)
167254721Semaste        {
168254721Semaste            m_flags.SetSkipPointers(value);
169254721Semaste        }
170254721Semaste
171254721Semaste        void
172254721Semaste        SetSkipsReferences (bool value)
173254721Semaste        {
174254721Semaste            m_flags.SetSkipReferences(value);
175254721Semaste        }
176254721Semaste
177254721Semaste        lldb::Format
178254721Semaste        GetFormat () const
179254721Semaste        {
180254721Semaste            return m_format;
181254721Semaste        }
182254721Semaste
183254721Semaste        void
184254721Semaste        SetFormat (lldb::Format fmt)
185254721Semaste        {
186254721Semaste            m_format = fmt;
187254721Semaste        }
188254721Semaste
189254721Semaste        uint32_t
190254721Semaste        GetOptions ()
191254721Semaste        {
192254721Semaste            return m_flags.GetValue();
193254721Semaste        }
194254721Semaste
195254721Semaste        void
196254721Semaste        SetOptions (uint32_t value)
197254721Semaste        {
198254721Semaste            m_flags.SetValue(value);
199254721Semaste        }
200254721Semaste
201254721Semaste        uint32_t&
202254721Semaste        GetRevision ()
203254721Semaste        {
204254721Semaste            return m_my_revision;
205254721Semaste        }
206254721Semaste
207254721Semaste        std::string
208254721Semaste        GetDescription();
209254721Semaste
210254721Semaste    protected:
211254721Semaste        Flags m_flags;
212254721Semaste        lldb::Format m_format;
213254721Semaste        uint32_t m_my_revision;
214254721Semaste
215254721Semaste    private:
216254721Semaste        DISALLOW_COPY_AND_ASSIGN(TypeFormatImpl);
217254721Semaste    };
218254721Semaste} // namespace lldb_private
219254721Semaste
220254721Semaste#endif	// lldb_TypeFormat_h_
221