CXXFormatterFunctions.h revision 263367
1//===-- CXXFormatterFunctions.h------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_CXXFormatterFunctions_h_
11#define liblldb_CXXFormatterFunctions_h_
12
13#include <stdint.h>
14#include <time.h>
15
16#include "lldb/lldb-forward.h"
17
18#include "lldb/Core/ConstString.h"
19#include "lldb/DataFormatters/FormatClasses.h"
20#include "lldb/DataFormatters/TypeSynthetic.h"
21#include "lldb/Target/ExecutionContext.h"
22#include "lldb/Target/Target.h"
23
24#include "clang/AST/ASTContext.h"
25
26namespace lldb_private {
27    namespace formatters
28    {
29        bool
30        ExtractValueFromObjCExpression (ValueObject &valobj,
31                                        const char* target_type,
32                                        const char* selector,
33                                        uint64_t &value);
34
35        bool
36        ExtractSummaryFromObjCExpression (ValueObject &valobj,
37                                          const char* target_type,
38                                          const char* selector,
39                                          Stream &stream);
40
41        lldb::ValueObjectSP
42        CallSelectorOnObject (ValueObject &valobj,
43                              const char* return_type,
44                              const char* selector,
45                              uint64_t index);
46
47        lldb::ValueObjectSP
48        CallSelectorOnObject (ValueObject &valobj,
49                              const char* return_type,
50                              const char* selector,
51                              const char* key);
52
53        size_t
54        ExtractIndexFromString (const char* item_name);
55
56        time_t
57        GetOSXEpoch ();
58
59        bool
60        Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
61
62        bool
63        Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
64
65        bool
66        WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
67
68        bool
69        Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
70
71        bool
72        Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
73
74        bool
75        WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
76
77        bool
78        LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
79
80        bool
81        LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
82
83        bool
84        ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream);
85
86        SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
87
88        template<bool name_entries>
89        bool
90        NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
91
92        bool
93        NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream);
94
95        bool
96        NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
97
98        template<bool cf_style>
99        bool
100        NSSetSummaryProvider (ValueObject& valobj, Stream& stream);
101
102        template<bool needs_at>
103        bool
104        NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
105
106        bool
107        NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
108
109        bool
110        NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream);
111
112        bool
113        NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream);
114
115        bool
116        NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream);
117
118        bool
119        CFBagSummaryProvider (ValueObject& valobj, Stream& stream);
120
121        bool
122        CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream);
123
124        bool
125        CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream);
126
127        bool
128        NSDateSummaryProvider (ValueObject& valobj, Stream& stream);
129
130        bool
131        CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream);
132
133        bool
134        NSBundleSummaryProvider (ValueObject& valobj, Stream& stream);
135
136        bool
137        NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
138
139        bool
140        NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
141
142        bool
143        NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
144
145        bool
146        NSURLSummaryProvider (ValueObject& valobj, Stream& stream);
147
148        bool
149        ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
150
151        template <bool is_sel_ptr>
152        bool
153        ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
154
155        bool
156        RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
157
158        extern template bool
159        NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
160
161        extern template bool
162        NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
163
164        extern template bool
165        NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
166
167        extern template bool
168        NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
169
170        extern template bool
171        ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
172
173        extern template bool
174        ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
175
176        class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
177        {
178        private:
179            struct DataDescriptor_32
180            {
181                uint32_t _used;
182                uint32_t _priv1 : 2 ;
183                uint32_t _size : 30;
184                uint32_t _priv2 : 2;
185                uint32_t offset : 30;
186                uint32_t _priv3;
187                uint32_t _data;
188            };
189            struct DataDescriptor_64
190            {
191                uint64_t _used;
192                uint64_t _priv1 : 2 ;
193                uint64_t _size : 62;
194                uint64_t _priv2 : 2;
195                uint64_t offset : 62;
196                uint32_t _priv3;
197                uint64_t _data;
198            };
199        public:
200            NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
201
202            virtual size_t
203            CalculateNumChildren ();
204
205            virtual lldb::ValueObjectSP
206            GetChildAtIndex (size_t idx);
207
208            virtual bool
209            Update();
210
211            virtual bool
212            MightHaveChildren ();
213
214            virtual size_t
215            GetIndexOfChildWithName (const ConstString &name);
216
217            virtual
218            ~NSArrayMSyntheticFrontEnd ();
219        private:
220            ExecutionContextRef m_exe_ctx_ref;
221            uint8_t m_ptr_size;
222            DataDescriptor_32 *m_data_32;
223            DataDescriptor_64 *m_data_64;
224            ClangASTType m_id_type;
225            std::vector<lldb::ValueObjectSP> m_children;
226        };
227
228        class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
229        {
230        public:
231            NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
232
233            virtual size_t
234            CalculateNumChildren ();
235
236            virtual lldb::ValueObjectSP
237            GetChildAtIndex (size_t idx);
238
239            virtual bool
240            Update();
241
242            virtual bool
243            MightHaveChildren ();
244
245            virtual size_t
246            GetIndexOfChildWithName (const ConstString &name);
247
248            virtual
249            ~NSArrayISyntheticFrontEnd ();
250        private:
251            ExecutionContextRef m_exe_ctx_ref;
252            uint8_t m_ptr_size;
253            uint64_t m_items;
254            lldb::addr_t m_data_ptr;
255            ClangASTType m_id_type;
256            std::vector<lldb::ValueObjectSP> m_children;
257        };
258
259        class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
260        {
261        public:
262            NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
263
264            virtual size_t
265            CalculateNumChildren ();
266
267            virtual lldb::ValueObjectSP
268            GetChildAtIndex (size_t idx);
269
270            virtual bool
271            Update();
272
273            virtual bool
274            MightHaveChildren ();
275
276            virtual size_t
277            GetIndexOfChildWithName (const ConstString &name);
278
279            virtual
280            ~NSArrayCodeRunningSyntheticFrontEnd ();
281        };
282
283        SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
284
285        class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
286        {
287        private:
288            struct DataDescriptor_32
289            {
290                uint32_t _used : 26;
291                uint32_t _szidx : 6;
292            };
293            struct DataDescriptor_64
294            {
295                uint64_t _used : 58;
296                uint32_t _szidx : 6;
297            };
298
299            struct DictionaryItemDescriptor
300            {
301                lldb::addr_t key_ptr;
302                lldb::addr_t val_ptr;
303                lldb::ValueObjectSP valobj_sp;
304            };
305
306        public:
307            NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
308
309            virtual size_t
310            CalculateNumChildren ();
311
312            virtual lldb::ValueObjectSP
313            GetChildAtIndex (size_t idx);
314
315            virtual bool
316            Update();
317
318            virtual bool
319            MightHaveChildren ();
320
321            virtual size_t
322            GetIndexOfChildWithName (const ConstString &name);
323
324            virtual
325            ~NSDictionaryISyntheticFrontEnd ();
326        private:
327            ExecutionContextRef m_exe_ctx_ref;
328            uint8_t m_ptr_size;
329            lldb::ByteOrder m_order;
330            DataDescriptor_32 *m_data_32;
331            DataDescriptor_64 *m_data_64;
332            lldb::addr_t m_data_ptr;
333            ClangASTType m_pair_type;
334            std::vector<DictionaryItemDescriptor> m_children;
335        };
336
337        class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
338        {
339        private:
340            struct DataDescriptor_32
341            {
342                uint32_t _used : 26;
343                uint32_t _kvo : 1;
344                uint32_t _size;
345                uint32_t _mutations;
346                uint32_t _objs_addr;
347                uint32_t _keys_addr;
348            };
349            struct DataDescriptor_64
350            {
351                uint64_t _used : 58;
352                uint32_t _kvo : 1;
353                uint64_t _size;
354                uint64_t _mutations;
355                uint64_t _objs_addr;
356                uint64_t _keys_addr;
357            };
358            struct DictionaryItemDescriptor
359            {
360                lldb::addr_t key_ptr;
361                lldb::addr_t val_ptr;
362                lldb::ValueObjectSP valobj_sp;
363            };
364        public:
365            NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
366
367            virtual size_t
368            CalculateNumChildren ();
369
370            virtual lldb::ValueObjectSP
371            GetChildAtIndex (size_t idx);
372
373            virtual bool
374            Update();
375
376            virtual bool
377            MightHaveChildren ();
378
379            virtual size_t
380            GetIndexOfChildWithName (const ConstString &name);
381
382            virtual
383            ~NSDictionaryMSyntheticFrontEnd ();
384        private:
385            ExecutionContextRef m_exe_ctx_ref;
386            uint8_t m_ptr_size;
387            lldb::ByteOrder m_order;
388            DataDescriptor_32 *m_data_32;
389            DataDescriptor_64 *m_data_64;
390            ClangASTType m_pair_type;
391            std::vector<DictionaryItemDescriptor> m_children;
392        };
393
394        class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
395        {
396        public:
397            NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
398
399            virtual size_t
400            CalculateNumChildren ();
401
402            virtual lldb::ValueObjectSP
403            GetChildAtIndex (size_t idx);
404
405            virtual bool
406            Update();
407
408            virtual bool
409            MightHaveChildren ();
410
411            virtual size_t
412            GetIndexOfChildWithName (const ConstString &name);
413
414            virtual
415            ~NSDictionaryCodeRunningSyntheticFrontEnd ();
416        };
417
418        SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
419
420        class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
421        {
422        private:
423            struct DataDescriptor_32
424            {
425                uint32_t _used : 26;
426                uint32_t _szidx : 6;
427            };
428            struct DataDescriptor_64
429            {
430                uint64_t _used : 58;
431                uint32_t _szidx : 6;
432            };
433
434            struct SetItemDescriptor
435            {
436                lldb::addr_t item_ptr;
437                lldb::ValueObjectSP valobj_sp;
438            };
439
440        public:
441            NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
442
443            virtual size_t
444            CalculateNumChildren ();
445
446            virtual lldb::ValueObjectSP
447            GetChildAtIndex (size_t idx);
448
449            virtual bool
450            Update();
451
452            virtual bool
453            MightHaveChildren ();
454
455            virtual size_t
456            GetIndexOfChildWithName (const ConstString &name);
457
458            virtual
459            ~NSSetISyntheticFrontEnd ();
460        private:
461            ExecutionContextRef m_exe_ctx_ref;
462            uint8_t m_ptr_size;
463            DataDescriptor_32 *m_data_32;
464            DataDescriptor_64 *m_data_64;
465            lldb::addr_t m_data_ptr;
466            std::vector<SetItemDescriptor> m_children;
467        };
468
469        class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd
470        {
471        private:
472
473        public:
474            NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
475
476            virtual size_t
477            CalculateNumChildren ();
478
479            virtual lldb::ValueObjectSP
480            GetChildAtIndex (size_t idx);
481
482            virtual bool
483            Update();
484
485            virtual bool
486            MightHaveChildren ();
487
488            virtual size_t
489            GetIndexOfChildWithName (const ConstString &name);
490
491            virtual
492            ~NSOrderedSetSyntheticFrontEnd ();
493        private:
494            uint32_t m_count;
495            std::map<uint32_t,lldb::ValueObjectSP> m_children;
496        };
497
498        class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
499        {
500        private:
501            struct DataDescriptor_32
502            {
503                uint32_t _used : 26;
504                uint32_t _size;
505                uint32_t _mutations;
506                uint32_t _objs_addr;
507            };
508            struct DataDescriptor_64
509            {
510                uint64_t _used : 58;
511                uint64_t _size;
512                uint64_t _mutations;
513                uint64_t _objs_addr;
514            };
515            struct SetItemDescriptor
516            {
517                lldb::addr_t item_ptr;
518                lldb::ValueObjectSP valobj_sp;
519            };
520        public:
521            NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
522
523            virtual size_t
524            CalculateNumChildren ();
525
526            virtual lldb::ValueObjectSP
527            GetChildAtIndex (size_t idx);
528
529            virtual bool
530            Update();
531
532            virtual bool
533            MightHaveChildren ();
534
535            virtual size_t
536            GetIndexOfChildWithName (const ConstString &name);
537
538            virtual
539            ~NSSetMSyntheticFrontEnd ();
540        private:
541            ExecutionContextRef m_exe_ctx_ref;
542            uint8_t m_ptr_size;
543            DataDescriptor_32 *m_data_32;
544            DataDescriptor_64 *m_data_64;
545            std::vector<SetItemDescriptor> m_children;
546        };
547
548        class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
549        {
550        public:
551            NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
552
553            virtual size_t
554            CalculateNumChildren ();
555
556            virtual lldb::ValueObjectSP
557            GetChildAtIndex (size_t idx);
558
559            virtual bool
560            Update();
561
562            virtual bool
563            MightHaveChildren ();
564
565            virtual size_t
566            GetIndexOfChildWithName (const ConstString &name);
567
568            virtual
569            ~NSSetCodeRunningSyntheticFrontEnd ();
570        };
571
572        SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
573
574        class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
575        {
576        public:
577            LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
578
579            virtual size_t
580            CalculateNumChildren ();
581
582            virtual lldb::ValueObjectSP
583            GetChildAtIndex (size_t idx);
584
585            virtual bool
586            Update();
587
588            virtual bool
589            MightHaveChildren ();
590
591            virtual size_t
592            GetIndexOfChildWithName (const ConstString &name);
593
594            virtual
595            ~LibcxxVectorBoolSyntheticFrontEnd ();
596        private:
597            ExecutionContextRef m_exe_ctx_ref;
598            uint64_t m_count;
599            lldb::addr_t m_base_data_address;
600            EvaluateExpressionOptions m_options;
601        };
602
603        SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
604
605        bool
606        LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream);
607
608        class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
609        {
610        public:
611            LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
612
613            virtual size_t
614            CalculateNumChildren ();
615
616            virtual lldb::ValueObjectSP
617            GetChildAtIndex (size_t idx);
618
619            virtual bool
620            Update();
621
622            virtual bool
623            MightHaveChildren ();
624
625            virtual size_t
626            GetIndexOfChildWithName (const ConstString &name);
627
628            virtual
629            ~LibstdcppVectorBoolSyntheticFrontEnd ();
630        private:
631            ExecutionContextRef m_exe_ctx_ref;
632            uint64_t m_count;
633            lldb::addr_t m_base_data_address;
634            EvaluateExpressionOptions m_options;
635        };
636
637        SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
638
639        class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
640        {
641        public:
642            LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
643
644            virtual size_t
645            CalculateNumChildren ();
646
647            virtual lldb::ValueObjectSP
648            GetChildAtIndex (size_t idx);
649
650            virtual bool
651            Update();
652
653            virtual bool
654            MightHaveChildren ();
655
656            virtual size_t
657            GetIndexOfChildWithName (const ConstString &name);
658
659            virtual
660            ~LibstdcppMapIteratorSyntheticFrontEnd ();
661        private:
662            ExecutionContextRef m_exe_ctx_ref;
663            lldb::addr_t m_pair_address;
664            ClangASTType m_pair_type;
665            EvaluateExpressionOptions m_options;
666            lldb::ValueObjectSP m_pair_sp;
667        };
668
669        SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
670
671        class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
672        {
673        public:
674            LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
675
676            virtual size_t
677            CalculateNumChildren ();
678
679            virtual lldb::ValueObjectSP
680            GetChildAtIndex (size_t idx);
681
682            virtual bool
683            Update();
684
685            virtual bool
686            MightHaveChildren ();
687
688            virtual size_t
689            GetIndexOfChildWithName (const ConstString &name);
690
691            virtual
692            ~LibCxxMapIteratorSyntheticFrontEnd ();
693        private:
694            ValueObject *m_pair_ptr;
695        };
696
697        SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
698
699        class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
700        {
701        public:
702            VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
703                                             ConstString item_name);
704
705            virtual size_t
706            CalculateNumChildren ();
707
708            virtual lldb::ValueObjectSP
709            GetChildAtIndex (size_t idx);
710
711            virtual bool
712            Update();
713
714            virtual bool
715            MightHaveChildren ();
716
717            virtual size_t
718            GetIndexOfChildWithName (const ConstString &name);
719
720            virtual
721            ~VectorIteratorSyntheticFrontEnd ();
722        private:
723            ExecutionContextRef m_exe_ctx_ref;
724            ConstString m_item_name;
725            lldb::ValueObjectSP m_item_sp;
726        };
727
728        SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
729
730        SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
731
732        class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd
733        {
734        public:
735            LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
736
737            virtual size_t
738            CalculateNumChildren ();
739
740            virtual lldb::ValueObjectSP
741            GetChildAtIndex (size_t idx);
742
743            virtual bool
744            Update();
745
746            virtual bool
747            MightHaveChildren ();
748
749            virtual size_t
750            GetIndexOfChildWithName (const ConstString &name);
751
752            virtual
753            ~LibcxxSharedPtrSyntheticFrontEnd ();
754        private:
755            ValueObject* m_cntrl;
756            lldb::ValueObjectSP m_count_sp;
757            lldb::ValueObjectSP m_weak_count_sp;
758            uint8_t m_ptr_size;
759            lldb::ByteOrder m_byte_order;
760        };
761
762        SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
763
764        class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
765        {
766        public:
767            LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
768
769            virtual size_t
770            CalculateNumChildren ();
771
772            virtual lldb::ValueObjectSP
773            GetChildAtIndex (size_t idx);
774
775            virtual bool
776            Update();
777
778            virtual bool
779            MightHaveChildren ();
780
781            virtual size_t
782            GetIndexOfChildWithName (const ConstString &name);
783
784            virtual
785            ~LibcxxStdVectorSyntheticFrontEnd ();
786        private:
787            ValueObject* m_start;
788            ValueObject* m_finish;
789            ClangASTType m_element_type;
790            uint32_t m_element_size;
791            std::map<size_t,lldb::ValueObjectSP> m_children;
792        };
793
794        SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
795
796        class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd
797        {
798        public:
799            LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
800
801            virtual size_t
802            CalculateNumChildren ();
803
804            virtual lldb::ValueObjectSP
805            GetChildAtIndex (size_t idx);
806
807            virtual bool
808            Update();
809
810            virtual bool
811            MightHaveChildren ();
812
813            virtual size_t
814            GetIndexOfChildWithName (const ConstString &name);
815
816            virtual
817            ~LibcxxStdListSyntheticFrontEnd ();
818        private:
819            bool
820            HasLoop();
821
822            size_t m_list_capping_size;
823            static const bool g_use_loop_detect = true;
824            lldb::addr_t m_node_address;
825            ValueObject* m_head;
826            ValueObject* m_tail;
827            ClangASTType m_element_type;
828            size_t m_count;
829            std::map<size_t,lldb::ValueObjectSP> m_children;
830        };
831
832        SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
833
834        class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
835        {
836        public:
837            LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
838
839            virtual size_t
840            CalculateNumChildren ();
841
842            virtual lldb::ValueObjectSP
843            GetChildAtIndex (size_t idx);
844
845            virtual bool
846            Update();
847
848            virtual bool
849            MightHaveChildren ();
850
851            virtual size_t
852            GetIndexOfChildWithName (const ConstString &name);
853
854            virtual
855            ~LibcxxStdMapSyntheticFrontEnd ();
856        private:
857            bool
858            GetDataType();
859
860            void
861            GetValueOffset (const lldb::ValueObjectSP& node);
862
863            ValueObject* m_tree;
864            ValueObject* m_root_node;
865            ClangASTType m_element_type;
866            uint32_t m_skip_size;
867            size_t m_count;
868            std::map<size_t,lldb::ValueObjectSP> m_children;
869        };
870
871        SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
872
873        class LibcxxStdUnorderedMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
874        {
875        public:
876            LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
877
878            virtual size_t
879            CalculateNumChildren ();
880
881            virtual lldb::ValueObjectSP
882            GetChildAtIndex (size_t idx);
883
884            virtual bool
885            Update();
886
887            virtual bool
888            MightHaveChildren ();
889
890            virtual size_t
891            GetIndexOfChildWithName (const ConstString &name);
892
893            virtual
894            ~LibcxxStdUnorderedMapSyntheticFrontEnd ();
895        private:
896
897            ValueObject* m_tree;
898            size_t m_num_elements;
899            ValueObject* m_next_element;
900            std::map<size_t,lldb::ValueObjectSP> m_children;
901            std::vector<std::pair<ValueObject*, uint64_t> > m_elements_cache;
902        };
903
904        SyntheticChildrenFrontEnd* LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
905
906    } // namespace formatters
907} // namespace lldb_private
908
909#endif // liblldb_CXXFormatterFunctions_h_
910