blob: 7b574263003d430423ce5ac1688c1b8f8e82e5ab [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- BreakpointLocationCollection.cpp ------------------------*- 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
11// C Includes
12// C++ Includes
13// Other libraries and framework includes
14// Project includes
15#include "lldb/Breakpoint/BreakpointLocationCollection.h"
16#include "lldb/Core/ModuleList.h"
17#include "lldb/Breakpoint/BreakpointLocation.h"
18#include "lldb/Breakpoint/BreakpointLocationList.h"
19
20using namespace lldb;
21using namespace lldb_private;
22
23//----------------------------------------------------------------------
24// BreakpointLocationCollection constructor
25//----------------------------------------------------------------------
26BreakpointLocationCollection::BreakpointLocationCollection() :
27 m_break_loc_collection()
28{
29}
30
31//----------------------------------------------------------------------
32// Destructor
33//----------------------------------------------------------------------
34BreakpointLocationCollection::~BreakpointLocationCollection()
35{
36}
37
38void
39BreakpointLocationCollection::Add(const BreakpointLocationSP &bp_loc)
40{
41 BreakpointLocationSP old_bp_loc = FindByIDPair (bp_loc->GetBreakpoint().GetID(), bp_loc->GetID());
42 if (!old_bp_loc.get())
43 m_break_loc_collection.push_back(bp_loc);
44}
45
46bool
47BreakpointLocationCollection::Remove (lldb::user_id_t bp_id, lldb::user_id_t bp_loc_id)
48{
49 collection::iterator pos = GetIDPairIterator(bp_id, bp_loc_id); // Predicate
50 if (pos != m_break_loc_collection.end())
51 {
52 m_break_loc_collection.erase(pos);
53 return true;
54 }
55 return false;
56
57}
58
59class BreakpointIDPairMatches
60{
61public:
62 BreakpointIDPairMatches (lldb::user_id_t break_id, lldb::user_id_t break_loc_id) :
63 m_break_id(break_id),
64 m_break_loc_id (break_loc_id)
65 {
66 }
67
68 bool operator() (const BreakpointLocationSP &bp_loc) const
69 {
70 return m_break_id == bp_loc->GetBreakpoint().GetID()
71 && m_break_loc_id == bp_loc->GetID();
72 }
73
74private:
75 const lldb::user_id_t m_break_id;
76 const lldb::user_id_t m_break_loc_id;
77};
78
79BreakpointLocationCollection::collection::iterator
80BreakpointLocationCollection::GetIDPairIterator (lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
81{
82 return std::find_if(m_break_loc_collection.begin(), m_break_loc_collection.end(), // Search full range
83 BreakpointIDPairMatches(break_id, break_loc_id)); // Predicate
84}
85
86BreakpointLocationCollection::collection::const_iterator
87BreakpointLocationCollection::GetIDPairConstIterator (lldb::user_id_t break_id, lldb::user_id_t break_loc_id) const
88{
89 return std::find_if(m_break_loc_collection.begin(), m_break_loc_collection.end(), // Search full range
90 BreakpointIDPairMatches(break_id, break_loc_id)); // Predicate
91}
92
93BreakpointLocationSP
94BreakpointLocationCollection::FindByIDPair (lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
95{
96 BreakpointLocationSP stop_sp;
97 collection::iterator pos = GetIDPairIterator(break_id, break_loc_id);
98 if (pos != m_break_loc_collection.end())
99 stop_sp = *pos;
100
101 return stop_sp;
102}
103
104const BreakpointLocationSP
105BreakpointLocationCollection::FindByIDPair (lldb::user_id_t break_id, lldb::user_id_t break_loc_id) const
106{
107 BreakpointLocationSP stop_sp;
108 collection::const_iterator pos = GetIDPairConstIterator(break_id, break_loc_id);
109 if (pos != m_break_loc_collection.end())
110 stop_sp = *pos;
111
112 return stop_sp;
113}
114
115BreakpointLocationSP
116BreakpointLocationCollection::GetByIndex (uint32_t i)
117{
118 BreakpointLocationSP stop_sp;
119 if (i >= 0 && i < m_break_loc_collection.size())
120 stop_sp = m_break_loc_collection[i];
121
122 return stop_sp;
123}
124
125const BreakpointLocationSP
126BreakpointLocationCollection::GetByIndex (uint32_t i) const
127{
128 BreakpointLocationSP stop_sp;
129 if (i >= 0 && i < m_break_loc_collection.size())
130 stop_sp = m_break_loc_collection[i];
131
132 return stop_sp;
133}
134
135bool
136BreakpointLocationCollection::ShouldStop (StoppointCallbackContext *context)
137{
138 bool shouldStop = false;
139
140 for (int i = 0; i < GetSize(); i++) {
141 bool one_result = GetByIndex(i)->ShouldStop(context);
142 if (one_result)
143 shouldStop = true;
144 }
145 return shouldStop;
146}
147
148void
149BreakpointLocationCollection::GetDescription (Stream *s, lldb::DescriptionLevel level)
150{
151 collection::iterator pos,
152 begin = m_break_loc_collection.begin(),
153 end = m_break_loc_collection.end();
154
155 for (pos = begin; pos != end; ++pos)
156 {
157 if (pos != begin)
158 s->PutChar(' ');
159 (*pos)->GetDescription(s, level);
160 }
161}