1 /*
2  * This file is licensed under the GNU General Public License, version 3
3  * http://www.gnu.org/licenses/gpl-3.0.html
4  *
5  * Author: Darius Markauskas
6  *
7  */
8 
9 #include "jumptracker.h"
10 
JumpTracker()11 JumpTracker::JumpTracker()
12 {
13     m_HomeIsStart = true;
14 }
15 
~JumpTracker()16 JumpTracker::~JumpTracker()
17 {
18 }
19 
TakeJump(LineAddress & jumpStart,LineAddress & jumpFinish)20 void JumpTracker::TakeJump(LineAddress& jumpStart, LineAddress& jumpFinish)
21 {
22     if (jumpStart.IsSameAs(jumpFinish) && jumpStart.IsSameAs(m_JumpHome))
23     {
24         //do nothing
25     }
26     else if (jumpStart.IsSameAs(jumpFinish) && !m_JumpHome.GetFilename().IsEmpty())
27     {
28         if (m_JumpHome.IsFinish())
29             m_JumpBack.push_front(m_JumpHome);
30         m_JumpHome = jumpFinish;
31     }
32     else if ( m_JumpHome.IsSameAs(jumpStart) && !m_JumpForward.empty() && jumpFinish.IsSameAs(m_JumpForward.front()) )
33     {
34         m_JumpBack.push_front(m_JumpHome);
35         m_JumpHome = m_JumpForward.front();
36         m_JumpForward.pop_front();
37     }
38     else if (m_JumpHome.IsSameAs(jumpFinish) && !m_JumpBack.empty() && m_JumpBack.front().IsSameAs(jumpStart))
39     {
40         // jump was repeated. Do nothing.
41     }
42     else
43     {
44         if (!m_JumpHome.GetFilename().IsEmpty() && m_JumpHome.IsFinish() && !m_JumpHome.IsSameAs(jumpStart))
45         {
46             m_JumpBack.push_front(m_JumpHome);
47         }
48         m_JumpBack.push_front(jumpStart);
49         m_JumpHome = jumpFinish;
50         m_JumpForward.clear();
51     }
52     while (m_JumpBack.size() > 50)
53     {
54         m_JumpBack.pop_back();
55     }
56 }
57 
IsJumpBackEmpty()58 bool JumpTracker::IsJumpBackEmpty()
59 {
60     return m_JumpBack.empty();
61 }
62 
IsJumpHomeEmpty()63 bool JumpTracker::IsJumpHomeEmpty()
64 {
65     return m_JumpHome.GetFilename().IsEmpty();
66 }
67 
IsJumpForwardEmpty()68 bool JumpTracker::IsJumpForwardEmpty()
69 {
70     return m_JumpForward.empty();
71 }
72 
MakeJumpBack()73 void JumpTracker::MakeJumpBack()
74 {
75     if (!IsJumpBackEmpty())
76     {
77         m_JumpForward.push_front(m_JumpHome);
78         m_JumpHome = m_JumpBack.front();
79         m_JumpBack.pop_front();
80     }
81 }
82 
MakeJumpForward()83 void JumpTracker::MakeJumpForward()
84 {
85     if (!IsJumpForwardEmpty())
86     {
87         m_JumpBack.push_front(m_JumpHome);
88         m_JumpHome = m_JumpForward.front();
89         m_JumpForward.pop_front();
90     }
91 }
92 
GetHomeAddress()93 const LineAddress& JumpTracker::GetHomeAddress()
94 {
95     return m_JumpHome;
96 }
97