OSDN Git Service

DiffFileData optimization for same-files (#1579)
authorYurii Hordiienko <45203053+hordi@users.noreply.github.com>
Sat, 19 Nov 2022 12:05:51 +0000 (07:05 -0500)
committerGitHub <noreply@github.com>
Sat, 19 Nov 2022 12:05:51 +0000 (21:05 +0900)
* light optimization

- diffFileData same-files optimization;
- light code generation improvement;

* Add files via upload

* Delete CompareStats.cpp

* Add files via upload

Src/CompareStats.cpp
Src/DiffFileData.cpp
Src/DiffItem.h

index 5875eab..689d4f0 100644 (file)
@@ -39,7 +39,7 @@ void CompareStats::AddItem(int code)
        {
                RESULT res = GetResultFromCode(code);
                int index = static_cast<int>(res);
-               m_counts[index] += 1;
+               m_counts[index]++;
        }
        ++m_nComparedItems;
        assert(m_nComparedItems <= m_nTotalItems);
@@ -108,21 +108,22 @@ CompareStats::RESULT CompareStats::GetResultFromCode(unsigned diffcode) const
 {
        DIFFCODE di(diffcode);
        
+       bool is_dir = di.isDirectory();
        // Test first for skipped so we pick all skipped items as such 
        if (di.isResultFiltered())
        {
                // skipped
-               return di.isDirectory() ? RESULT_DIRSKIP : RESULT_SKIP;
+               return is_dir ? RESULT_DIRSKIP : RESULT_SKIP;
        }
        else if (di.isSideFirstOnly())
        {
                // left-only
-               return di.isDirectory() ? RESULT_LDIRUNIQUE : RESULT_LUNIQUE;
+               return is_dir ? RESULT_LDIRUNIQUE : RESULT_LUNIQUE;
        }
        else if (di.isSideSecondOnly())
        {
                // right-only
-               if (di.isDirectory())
+               if (is_dir)
                        return (m_nDirs < 3) ? RESULT_RDIRUNIQUE : RESULT_MDIRUNIQUE;
                else
                        return (m_nDirs < 3) ? RESULT_RUNIQUE : RESULT_MUNIQUE;
@@ -130,15 +131,18 @@ CompareStats::RESULT CompareStats::GetResultFromCode(unsigned diffcode) const
        else if (di.isSideThirdOnly())
        {
                // right-only
-               return di.isDirectory() ? RESULT_RDIRUNIQUE : RESULT_RUNIQUE;
+               return is_dir ? RESULT_RDIRUNIQUE : RESULT_RUNIQUE;
        }
-       else if (m_nDirs > 2 && !di.exists(0) && di.exists(1) && di.exists(2))
-               return di.isDirectory() ? RESULT_LDIRMISSING : RESULT_LMISSING;
-       else if (m_nDirs > 2 && di.exists(0) && !di.exists(1) && di.exists(2))
-               return di.isDirectory() ? RESULT_MDIRMISSING : RESULT_MMISSING;
-       else if (m_nDirs > 2 && di.exists(0) && di.exists(1) && !di.exists(2))
-               return di.isDirectory() ? RESULT_RDIRMISSING : RESULT_RMISSING;
-       else if (di.isResultError())
+       else if (m_nDirs > 2)
+       {
+               switch (diffcode & DIFFCODE::ALL)
+               {
+               case (DIFFCODE::SECOND | DIFFCODE::THIRD) : return is_dir ? RESULT_LDIRMISSING : RESULT_LMISSING;
+               case (DIFFCODE::FIRST  | DIFFCODE::THIRD) : return is_dir ? RESULT_MDIRMISSING : RESULT_MMISSING;
+               case (DIFFCODE::FIRST  | DIFFCODE::SECOND): return is_dir ? RESULT_RDIRMISSING : RESULT_RMISSING;
+               }
+       }
+       if (di.isResultError())
        {
                // could be directory error ?
                return RESULT_ERROR;
@@ -147,7 +151,7 @@ CompareStats::RESULT CompareStats::GetResultFromCode(unsigned diffcode) const
        else if (di.isResultSame())
        {
                // same
-               if (di.isDirectory())
+               if (is_dir)
                {
                        return RESULT_DIRSAME;
                }
@@ -158,7 +162,7 @@ CompareStats::RESULT CompareStats::GetResultFromCode(unsigned diffcode) const
        }
        else
        {
-               if (di.isDirectory())
+               if (is_dir)
                {
                        return RESULT_DIRDIFF;
                }
index d211fad..c3711f6 100644 (file)
@@ -26,7 +26,7 @@ DiffFileData::DiffFileData()
 : m_inf(new file_data[2]{})
 , m_used(false)
 {
-       Reset();
+       //Reset(); //this call not needed because memset implicitly used in line 26
 }
 
 /** @brief deallocate member data */
@@ -54,12 +54,13 @@ void DiffFileData::SetDisplayFilepaths(const String& szTrueFilepath1, const Stri
        m_sDisplayFilepath[1] = szTrueFilepath2;
 }
 
-
 /** @brief Open file descriptors in the inf structure (return false if failure) */
 bool DiffFileData::DoOpenFiles()
 {
        Reset();
 
+       const bool same_file = !strutils::compare_nocase(m_FileLocation[0].filepath, m_FileLocation[1].filepath);
+
        for (int i = 0; i < 2; ++i)
        {
                // Fill in 8-bit versions of names for diffutils (WinMerge doesn't use these)
@@ -77,20 +78,19 @@ bool DiffFileData::DoOpenFiles()
                {
                        _tsopen_s(&m_inf[i].desc, TFile(m_FileLocation[i].filepath).wpath().c_str(),
                                        O_RDONLY | O_BINARY, _SH_DENYNO, _S_IREAD);
-               }
-               if (m_inf[i].desc < 0)
-                       return false;
 
-               // Get file stats (diffutils uses these)
-               if (myfstat(m_inf[i].desc, &m_inf[i].stat) != 0)
-               {
-                       return false;
+                       if (m_inf[i].desc < 0)
+                               return false;
+
+                       // Get file stats (diffutils uses these)
+                       if (myfstat(m_inf[i].desc, &m_inf[i].stat) != 0)
+                               return false;
                }
                
-               if (strutils::compare_nocase(m_FileLocation[0].filepath,
-                               m_FileLocation[1].filepath) == 0)
+               if (same_file)
                {
                        m_inf[1].desc = m_inf[0].desc;
+                       m_inf[1].stat = m_inf[0].stat;
                }
        }
 
@@ -110,20 +110,18 @@ void DiffFileData::Reset()
        }
        // clean up any open file handles, and zero stuff out
        // open file handles might be leftover from a failure in DiffFileData::OpenFiles
+       if (m_inf[1].desc == m_inf[0].desc)
+       {
+               m_inf[1].desc = 0;
+       }
        for (int i = 0; i < 2; ++i)
        {
-               if (m_inf[1].desc == m_inf[0].desc)
-               {
-                       m_inf[1].desc = 0;
-               }
                free((void *)m_inf[i].name);
-               m_inf[i].name = nullptr;
 
                if (m_inf[i].desc > 0)
                {
                        _close(m_inf[i].desc);
                }
-               m_inf[i].desc = 0;
                m_inf[i] = {};
        }
 }
index 4c581ff..72e7f9d 100644 (file)
@@ -133,10 +133,7 @@ public:
        }
        bool existAll() const
        {
-               if ((diffcode & DIFFCODE::THREEWAY) == 0)
-                       return (existsFirst() && existsSecond());
-               else
-                       return (existsFirst() && existsSecond() && existsThird());
+               return ((diffcode & DIFFCODE::THREEWAY) ? DIFFCODE::ALL : DIFFCODE::BOTH) == (diffcode & DIFFCODE::ALL);
        }
 
        // compare result