Split wx_filename out of common

This commit is contained in:
Marek Roszko 2020-10-25 14:53:05 -04:00
parent 36e4b318f0
commit 1167862c86
8 changed files with 145 additions and 97 deletions

View File

@ -389,6 +389,7 @@ set( COMMON_SRCS
wildcards_and_files_ext.cpp wildcards_and_files_ext.cpp
page_layout/ws_painter.cpp page_layout/ws_painter.cpp
wxdataviewctrl_helpers.cpp wxdataviewctrl_helpers.cpp
wx_filename.cpp
xnode.cpp xnode.cpp
) )

View File

@ -431,71 +431,6 @@ std::ostream& operator<<( std::ostream& out, const wxPoint& pt )
* SIGNIFICANT performance benefits. * 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 * A copy of wxMatchWild(), which wxWidgets attributes to Douglas A. Lewis
* <dalewis@cs.Buffalo.EDU> and ircII's reg.c. * <dalewis@cs.Buffalo.EDU> and ircII's reg.c.

81
common/wx_filename.cpp Normal file
View File

@ -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.h>
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;
}

View File

@ -196,38 +196,7 @@ std::ostream& operator<<( std::ostream& out, const wxSize& size );
*/ */
std::ostream& operator<<( std::ostream& out, const wxPoint& pt ); 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 ); long long TimestampDir( const wxString& aDirPath, const wxString& aFilespec );
#endif // INCLUDE__COMMON_H_ #endif // INCLUDE__COMMON_H_

60
include/wx_filename.h Normal file
View File

@ -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.h>
/**
* 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

View File

@ -39,6 +39,7 @@
#include <pcb_shape.h> #include <pcb_shape.h>
#include <fp_shape.h> #include <fp_shape.h>
#include <plugins/geda/gpcb_plugin.h> #include <plugins/geda/gpcb_plugin.h>
#include <wx_filename.h>
#include <wx/dir.h> #include <wx/dir.h>
#include <wx/filename.h> #include <wx/filename.h>

View File

@ -45,6 +45,7 @@
#include <boost/ptr_container/ptr_map.hpp> #include <boost/ptr_container/ptr_map.hpp>
#include <convert_basic_shapes_to_polygon.h> // for enum RECT_CHAMFER_POSITIONS definition #include <convert_basic_shapes_to_polygon.h> // for enum RECT_CHAMFER_POSITIONS definition
#include <kiface_i.h> #include <kiface_i.h>
#include <wx_filename.h>
using namespace PCB_KEYS_T; using namespace PCB_KEYS_T;

View File

@ -29,7 +29,7 @@
#include <unit_test_utils/unit_test_utils.h> #include <unit_test_utils/unit_test_utils.h>
// Code under test // Code under test
#include <common.h> #include <wx_filename.h>
/** /**
* Declare the test suite * Declare the test suite