OSDN Git Service

Statics: Sort commits by dates before processed by StatGraphDlg
authorJohan 't Hart <johanthart@gmail.com>
Thu, 10 Sep 2009 21:28:09 +0000 (23:28 +0200)
committerJohan 't Hart <johanthart@gmail.com>
Thu, 10 Sep 2009 21:28:09 +0000 (23:28 +0200)
src/TortoiseProc/LogDlg.cpp

index de323ac..45949eb 100644 (file)
@@ -1786,6 +1786,127 @@ void CLogDlg::OnEnLinkMsgview(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = 0;\r
 }\r
 \r
+class CDateSorter\r
+{\r
+public:\r
+       class CCommitPointer\r
+       {\r
+       public:\r
+               CCommitPointer():m_cont(NULL){}\r
+               CCommitPointer(const CCommitPointer& P_Right)\r
+               : m_cont(NULL)\r
+               {\r
+                       *this = P_Right;\r
+               }\r
+\r
+               CCommitPointer& operator = (const CCommitPointer& P_Right)\r
+               {\r
+                       if(IsPointer())\r
+                       {\r
+                               (*m_cont->m_parDates)[m_place]                  = P_Right.GetDate();\r
+                               (*m_cont->m_parFileChanges)[m_place]    = P_Right.GetChanges();\r
+                               (*m_cont->m_parAuthors)[m_place]                = P_Right.GetAuthor();\r
+                       }\r
+                       else \r
+                       {\r
+                               m_Date                                                          = P_Right.GetDate();\r
+                               m_Changes                                                       = P_Right.GetChanges();\r
+                               m_csAuthor                                                      = P_Right.GetAuthor();\r
+                       }\r
+                       return *this;\r
+               }\r
+\r
+               void Clone(const CCommitPointer& P_Right)\r
+               {\r
+                       m_cont = P_Right.m_cont;\r
+                       m_place = P_Right.m_place;\r
+                       m_Date = P_Right.m_Date;\r
+                       m_Changes = P_Right.m_Changes;\r
+                       m_csAuthor = P_Right.m_csAuthor;\r
+               }\r
+\r
+               DWORD            GetDate()              const {return IsPointer() ? (*m_cont->m_parDates)[m_place] : m_Date;}\r
+               DWORD            GetChanges()   const {return IsPointer() ? (*m_cont->m_parFileChanges)[m_place] : m_Changes;}\r
+               CString          GetAuthor()    const {return IsPointer() ? (*m_cont->m_parAuthors)[m_place] : m_csAuthor;}\r
+\r
+               bool            IsPointer() const {return m_cont != NULL;}\r
+               //When pointer\r
+               CDateSorter* m_cont;\r
+               int                      m_place;\r
+\r
+               //When element\r
+               DWORD            m_Date;\r
+               DWORD            m_Changes;\r
+               CString          m_csAuthor;\r
+\r
+       };\r
+       class iterator : public std::iterator<std::random_access_iterator_tag, CCommitPointer>\r
+       {\r
+       public:\r
+               CCommitPointer m_ptr;\r
+\r
+               iterator(){}\r
+               iterator(const iterator& P_Right){*this = P_Right;}\r
+               iterator& operator=(const iterator& P_Right)\r
+               {\r
+                       m_ptr.Clone(P_Right.m_ptr);\r
+                       return *this;\r
+               }\r
+\r
+               CCommitPointer& operator*(){return m_ptr;}\r
+               CCommitPointer* operator->(){return &m_ptr;}\r
+               const CCommitPointer& operator*()const{return m_ptr;}\r
+               const CCommitPointer* operator->()const{return &m_ptr;}\r
+\r
+               iterator& operator+=(size_t P_iOffset){m_ptr.m_place += P_iOffset;return *this;}\r
+               iterator& operator-=(size_t P_iOffset){m_ptr.m_place -= P_iOffset;return *this;}\r
+               iterator operator+(size_t P_iOffset)const{iterator it(*this); it += P_iOffset;return it;}\r
+               iterator operator-(size_t P_iOffset)const{iterator it(*this); it -= P_iOffset;return it;}\r
+\r
+               iterator& operator++(){++m_ptr.m_place;return *this;}\r
+               iterator& operator--(){--m_ptr.m_place;return *this;}\r
+               iterator operator++(int){iterator it(*this);++*this;return it;}\r
+               iterator operator--(int){iterator it(*this);--*this;return it;}\r
+\r
+               size_t operator-(const iterator& P_itRight)const{return m_ptr.m_place - P_itRight->m_place;}\r
+\r
+               bool operator<(const iterator& P_itRight)const{return m_ptr.m_place < P_itRight->m_place;}\r
+               bool operator!=(const iterator& P_itRight)const{return m_ptr.m_place != P_itRight->m_place;}\r
+               bool operator==(const iterator& P_itRight)const{return m_ptr.m_place == P_itRight->m_place;}\r
+               bool operator>(const iterator& P_itRight)const{return m_ptr.m_place > P_itRight->m_place;}\r
+       };\r
+       iterator begin()\r
+       {\r
+               iterator it;\r
+               it->m_place = 0;\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+       iterator end()\r
+       {\r
+               iterator it;\r
+               it->m_place = m_parDates->GetCount();\r
+               it->m_cont = this;\r
+               return it;\r
+       }\r
+\r
+       CDWordArray     *       m_parDates;\r
+       CDWordArray     *       m_parFileChanges;\r
+       CStringArray *  m_parAuthors;\r
+};\r
+\r
+class CDateSorterLess\r
+{\r
+public:\r
+       bool operator () (const CDateSorter::CCommitPointer& P_Left, const CDateSorter::CCommitPointer& P_Right) const\r
+       {\r
+               return P_Left.GetDate() > P_Right.GetDate(); //Last date first\r
+       }\r
+\r
+};\r
+\r
+\r
+\r
 void CLogDlg::OnBnClickedStatbutton()\r
 {\r
 \r
@@ -1813,6 +1934,13 @@ void CLogDlg::OnBnClickedStatbutton()
                m_arDatesFiltered.Add(pLogEntry->m_AuthorDate.GetTime());\r
                m_arFileChangesFiltered.Add(pLogEntry->m_Files.GetCount());\r
        }\r
+\r
+       CDateSorter W_Sorter;\r
+       W_Sorter.m_parAuthors           = &m_arAuthorsFiltered;\r
+       W_Sorter.m_parDates                     = &m_arDatesFiltered;\r
+       W_Sorter.m_parFileChanges       = &m_arFileChangesFiltered;\r
+       std::sort(W_Sorter.begin(), W_Sorter.end(), CDateSorterLess());\r
+\r
        CStatGraphDlg dlg;\r
        dlg.m_parAuthors = &m_arAuthorsFiltered;\r
        dlg.m_parDates = &m_arDatesFiltered;\r