From 1167862c866cd46bb28aed77bc0fd0b518ba640c Mon Sep 17 00:00:00 2001 From: Marek Roszko Date: Sun, 25 Oct 2020 14:53:05 -0400 Subject: [PATCH] Split wx_filename out of common --- common/CMakeLists.txt | 1 + common/common.cpp | 65 --------------------- common/wx_filename.cpp | 81 +++++++++++++++++++++++++++ include/common.h | 31 ---------- include/wx_filename.h | 60 ++++++++++++++++++++ pcbnew/plugins/geda/gpcb_plugin.cpp | 1 + pcbnew/plugins/kicad/kicad_plugin.cpp | 1 + qa/common/test_wx_filename.cpp | 2 +- 8 files changed, 145 insertions(+), 97 deletions(-) create mode 100644 common/wx_filename.cpp create mode 100644 include/wx_filename.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index b718779b85..a74829250c 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -389,6 +389,7 @@ set( COMMON_SRCS wildcards_and_files_ext.cpp page_layout/ws_painter.cpp wxdataviewctrl_helpers.cpp + wx_filename.cpp xnode.cpp ) diff --git a/common/common.cpp b/common/common.cpp index 64689ab62c..b159403122 100644 --- a/common/common.cpp +++ b/common/common.cpp @@ -431,71 +431,6 @@ std::ostream& operator<<( std::ostream& out, const wxPoint& pt ) * SIGNIFICANT performance benefits. */ -/** - * WX_FILENAME - * - * A wrapper around a wxFileName which avoids expensive calls to wxFileName::SplitPath() - * and string concatenations by caching the path and filename locally and only resolving - * the wxFileName when it has to. - */ -WX_FILENAME::WX_FILENAME( const wxString& aPath, const wxString& aFilename ) : - m_fn( aPath, aFilename ), - m_path( aPath ), - m_fullName( aFilename ) -{ } - - -void WX_FILENAME::SetFullName( const wxString& aFileNameAndExtension ) -{ - m_fullName = aFileNameAndExtension; -} - - -wxString WX_FILENAME::GetName() const -{ - size_t dot = m_fullName.find_last_of( wxT( '.' ) ); - return m_fullName.substr( 0, dot ); -} - - -wxString WX_FILENAME::GetFullName() const -{ - return m_fullName; -} - - -wxString WX_FILENAME::GetPath() const -{ - return m_path; -} - - -wxString WX_FILENAME::GetFullPath() const -{ - return m_path + wxT( '/' ) + m_fullName; -} - - -// Write locally-cached values to the wxFileName. MUST be called before using m_fn. -void WX_FILENAME::resolve() -{ - size_t dot = m_fullName.find_last_of( wxT( '.' ) ); - m_fn.SetName( m_fullName.substr( 0, dot ) ); - m_fn.SetExt( m_fullName.substr( dot + 1 ) ); -} - - -long long WX_FILENAME::GetTimestamp() -{ - resolve(); - - if( m_fn.FileExists() ) - return m_fn.GetModificationTime().GetValue().GetValue(); - - return 0; -} - - /** * A copy of wxMatchWild(), which wxWidgets attributes to Douglas A. Lewis * and ircII's reg.c. diff --git a/common/wx_filename.cpp b/common/wx_filename.cpp new file mode 100644 index 0000000000..805dbbc781 --- /dev/null +++ b/common/wx_filename.cpp @@ -0,0 +1,81 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + + +WX_FILENAME::WX_FILENAME( const wxString& aPath, const wxString& aFilename ) + : m_fn( aPath, aFilename ), m_path( aPath ), m_fullName( aFilename ) +{ +} + + +void WX_FILENAME::SetFullName( const wxString& aFileNameAndExtension ) +{ + m_fullName = aFileNameAndExtension; +} + + +wxString WX_FILENAME::GetName() const +{ + size_t dot = m_fullName.find_last_of( wxT( '.' ) ); + return m_fullName.substr( 0, dot ); +} + + +wxString WX_FILENAME::GetFullName() const +{ + return m_fullName; +} + + +wxString WX_FILENAME::GetPath() const +{ + return m_path; +} + + +wxString WX_FILENAME::GetFullPath() const +{ + return m_path + wxT( '/' ) + m_fullName; +} + + +// Write locally-cached values to the wxFileName. MUST be called before using m_fn. +void WX_FILENAME::resolve() +{ + size_t dot = m_fullName.find_last_of( wxT( '.' ) ); + m_fn.SetName( m_fullName.substr( 0, dot ) ); + m_fn.SetExt( m_fullName.substr( dot + 1 ) ); +} + + +long long WX_FILENAME::GetTimestamp() +{ + resolve(); + + if( m_fn.FileExists() ) + return m_fn.GetModificationTime().GetValue().GetValue(); + + return 0; +} \ No newline at end of file diff --git a/include/common.h b/include/common.h index f1ec6452cd..0cd83faf1f 100644 --- a/include/common.h +++ b/include/common.h @@ -196,38 +196,7 @@ std::ostream& operator<<( std::ostream& out, const wxSize& size ); */ std::ostream& operator<<( std::ostream& out, const wxPoint& pt ); - -/** - * A wrapper around a wxFileName which is much more performant with a subset of the API. - */ -class WX_FILENAME -{ -public: - WX_FILENAME( const wxString& aPath, const wxString& aFilename ); - - void SetFullName( const wxString& aFileNameAndExtension ); - - wxString GetName() const; - wxString GetFullName() const; - wxString GetPath() const; - wxString GetFullPath() const; - - // Avoid multiple calls to stat() on POSIX kernels. - long long GetTimestamp(); - -private: - // Write cached values to the wrapped wxFileName. MUST be called before using m_fn. - void resolve(); - - wxFileName m_fn; - wxString m_path; - wxString m_fullName; -}; - - long long TimestampDir( const wxString& aDirPath, const wxString& aFilespec ); - - #endif // INCLUDE__COMMON_H_ diff --git a/include/wx_filename.h b/include/wx_filename.h new file mode 100644 index 0000000000..6471218bae --- /dev/null +++ b/include/wx_filename.h @@ -0,0 +1,60 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2020 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef WX_FILENAME_H +#define WX_FILENAME_H + +#include + +/** + * WX_FILENAME - A wrapper around a wxFileName which is much more performant with a subset of the API. + * + * A wrapper around a wxFileName which avoids expensive calls to wxFileName::SplitPath() + * and string concatenations by caching the path and filename locally and only resolving + * the wxFileName when it has to. + */ +class WX_FILENAME +{ +public: + WX_FILENAME( const wxString& aPath, const wxString& aFilename ); + + void SetFullName( const wxString& aFileNameAndExtension ); + + wxString GetName() const; + wxString GetFullName() const; + wxString GetPath() const; + wxString GetFullPath() const; + + // Avoid multiple calls to stat() on POSIX kernels. + long long GetTimestamp(); + +private: + // Write cached values to the wrapped wxFileName. MUST be called before using m_fn. + void resolve(); + + wxFileName m_fn; + wxString m_path; + wxString m_fullName; +}; + +#endif // WX_FILENAME_H \ No newline at end of file diff --git a/pcbnew/plugins/geda/gpcb_plugin.cpp b/pcbnew/plugins/geda/gpcb_plugin.cpp index efde4b6c78..0d3343903b 100644 --- a/pcbnew/plugins/geda/gpcb_plugin.cpp +++ b/pcbnew/plugins/geda/gpcb_plugin.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include diff --git a/pcbnew/plugins/kicad/kicad_plugin.cpp b/pcbnew/plugins/kicad/kicad_plugin.cpp index b017b16318..4363816183 100644 --- a/pcbnew/plugins/kicad/kicad_plugin.cpp +++ b/pcbnew/plugins/kicad/kicad_plugin.cpp @@ -45,6 +45,7 @@ #include #include // for enum RECT_CHAMFER_POSITIONS definition #include +#include using namespace PCB_KEYS_T; diff --git a/qa/common/test_wx_filename.cpp b/qa/common/test_wx_filename.cpp index 6dfdad0b73..0f7b6e5627 100644 --- a/qa/common/test_wx_filename.cpp +++ b/qa/common/test_wx_filename.cpp @@ -29,7 +29,7 @@ #include // Code under test -#include +#include /** * Declare the test suite