From a39e514278cfb36ef3160238833553236498fe62 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Thu, 9 Apr 2020 09:34:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0=D1=81=D0=BD=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B5=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/filesystem/01_minimal/minimal.cpp | 19 +++-- src/myx/filesystem/CMakeLists.txt | 2 + src/myx/filesystem/paths.cpp | 99 +--------------------- src/myx/filesystem/paths.hpp | 96 +++------------------ 4 files changed, 29 insertions(+), 187 deletions(-) diff --git a/examples/filesystem/01_minimal/minimal.cpp b/examples/filesystem/01_minimal/minimal.cpp index fa3276a..d43fd43 100644 --- a/examples/filesystem/01_minimal/minimal.cpp +++ b/examples/filesystem/01_minimal/minimal.cpp @@ -3,25 +3,34 @@ #include #include +#include #include +#include namespace MF = myx::filesystem; -// Переменные для защиты экземпляра класса MF::Paths -std::atomic< MF::Paths* > MF::Paths::mInstance; -std::mutex MF::Paths::mMutex; +// Переменные для защиты экземпляра класса MF::PathsMT +std::atomic< MF::PathsMT* > MF::PathsMT::mInstance; +std::mutex MF::PathsMT::mMutex; int main( int argc, char** argv ) { (void)argc; (void)argv; QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) ); - MF::Paths* paths = MF::Paths::getInstance(); + MF::PathsMT* pathsMT = MF::PathsMT::instance(); + MF::Paths* paths = MF::Paths::instance(); + + pathsMT->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) ); + pathsMT->findConfigFile( QStringLiteral( "test" ) ); + qDebug() << pathsMT->systemLogDirectory(); + qDebug() << pathsMT->systemConfigDirectory(); paths->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) ); - paths->makeDefaultDirectories(); paths->findConfigFile( QStringLiteral( "test" ) ); + qDebug() << paths->systemConstDataDirectory(); + qDebug() << paths->configFileName(); return( 0 ); } diff --git a/src/myx/filesystem/CMakeLists.txt b/src/myx/filesystem/CMakeLists.txt index 0d0b8c4..b0bdab1 100644 --- a/src/myx/filesystem/CMakeLists.txt +++ b/src/myx/filesystem/CMakeLists.txt @@ -5,12 +5,14 @@ set(current_target filesystem) set(current_target_sources ${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.cpp ) # Список заголовочных файлов (используется для установки) set(current_target_headers ${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp ) add_common_library(TARGET ${current_target} diff --git a/src/myx/filesystem/paths.cpp b/src/myx/filesystem/paths.cpp index 9295e88..d20f39d 100644 --- a/src/myx/filesystem/paths.cpp +++ b/src/myx/filesystem/paths.cpp @@ -13,23 +13,6 @@ namespace filesystem { Paths::Paths() = default; -Paths* Paths::getInstance() -{ - volatile Paths* localInstance = mInstance.load( std::memory_order_acquire ); - if ( localInstance == nullptr ) - { - std::lock_guard< std::mutex > myLock( mMutex ); - localInstance = mInstance.load( std::memory_order_relaxed ); - if ( localInstance == nullptr ) // -V1036 - { - localInstance = new Paths(); - mInstance.store( const_cast< Paths* >( localInstance ), std::memory_order_release ); // NOLINT - } - } - return( const_cast< Paths* >( localInstance ) ); // NOLINT -} - - Paths::HierarchyType Paths::getHierarchyType() { QRegExp binRegexp( "/s*bin$" ); @@ -143,7 +126,7 @@ bool Paths::init( const QString& projectDir, const QString& configFileExtension m_homeDirectory = QString::fromLocal8Bit( qgetenv( "HOME" ) ); m_tempDirectory = QString::fromLocal8Bit( qgetenv( "TMPDIR" ) ); - if ( m_tempDirectory.canonicalPath().isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) ) + if ( m_tempDirectory.isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) ) { m_tempDirectory = QStringLiteral( _PATH_TMP ); } @@ -230,162 +213,84 @@ const QDir& Paths::userConfigDirectory() const } -void Paths::setUserConfigDirectory( const QString& userConfigDirectory ) -{ - m_userConfigDirectory = userConfigDirectory; -} - - const QDir& Paths::systemConfigDirectory() const { return( m_systemConfigDirectory ); } -void Paths::setSystemConfigDirectory( const QString& systemConfigDirectory ) -{ - m_systemConfigDirectory = systemConfigDirectory; -} - - const QFileInfo& Paths::configFilePath() const { return( m_configFilePath ); } -void Paths::setConfigFilePath( const QFileInfo& configFilePath ) -{ - m_configFilePath = configFilePath; -} - - const QString& Paths::configFileName() const { return( m_configFileName ); } -void Paths::setConfigFileName( const QString& configFileName ) -{ - m_configFileName = configFileName; -} - - const QString& Paths::configFileExtension() const { return( m_configFileExtension ); } -void Paths::setConfigFileExtension( const QString& configFileExtension ) -{ - m_configFileExtension = configFileExtension; -} - - const QDir& Paths::userVarDataDirectory() const { return( m_userVarDataDirectory ); } -void Paths::setUserVarDataDirectory( const QString& userVarDataDirectory ) -{ - m_userVarDataDirectory = userVarDataDirectory; -} - - const QDir& Paths::systemVarDataDirectory() const { return( m_systemVarDataDirectory ); } -void Paths::setSystemVarDataDirectory( const QString& systemVarDataDirectory ) -{ - m_systemVarDataDirectory = systemVarDataDirectory; -} - - const QDir& Paths::userConstDataDirectory() const { return( m_userConstDataDirectory ); } -void Paths::setUserConstDataDirectory( const QString& userConstDataDirectory ) -{ - m_userConstDataDirectory = userConstDataDirectory; -} - - const QDir& Paths::systemConstDataDirectory() const { return( m_systemConstDataDirectory ); } -void Paths::setSystemConstDataDirectory( const QString& systemConstDataDirectory ) -{ - m_systemConstDataDirectory = systemConstDataDirectory; -} - - const QDir& Paths::userLogDirectory() const { return( m_userLogDirectory ); } -void Paths::setUserLogDirectory( const QString& userLogDirectory ) -{ - m_userLogDirectory = userLogDirectory; -} - - const QDir& Paths::systemLogDirectory() const { return( m_systemLogDirectory ); } -void Paths::setSystemLogDirectory( const QString& systemLogDirectory ) -{ - m_systemLogDirectory = systemLogDirectory; -} - - const QDir& Paths::tempDirectory() const { return( m_tempDirectory ); } -void Paths::setTempDirectory( const QString& tempDirectory ) -{ - m_tempDirectory = tempDirectory; -} - - const QDir& Paths::homeDirectory() const { return( m_homeDirectory ); } -const QString& Paths::projectDirectoryName() const +const QString& Paths::projectName() const { return( m_projectName ); } -void Paths::setProjectDirectoryName( const QString& projectDirectoryName ) -{ - m_projectName = projectDirectoryName; -} - - QString Paths::executableFileName() const { return( m_currentExecutable.m_canonicalFilePath.fileName() ); diff --git a/src/myx/filesystem/paths.hpp b/src/myx/filesystem/paths.hpp index ec6608f..54b229f 100644 --- a/src/myx/filesystem/paths.hpp +++ b/src/myx/filesystem/paths.hpp @@ -14,15 +14,11 @@ #include #include -#include -#include -#include -#include - namespace myx { namespace filesystem { +/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам class Paths { enum class HierarchyType : intptr_t @@ -76,22 +72,25 @@ class Paths /// @brief Расширение для файла настройки QString m_configFileExtension; + HierarchyType getHierarchyType(); + +protected: Paths(); ~Paths() = default; Paths( const Paths& ) = delete; Paths& operator=( const Paths& ) = delete; - HierarchyType getHierarchyType(); - - static std::atomic< Paths* > mInstance; - static std::mutex mMutex; - public: /** * @brief getInstance * @return Уникальный экземпляр класса Paths */ - static Paths* getInstance(); + static Paths* instance() + { + static Paths p; + return( &p ); + } + /** * @brief Обновление путей с учётом расположения исполняемого файла @@ -137,28 +136,16 @@ public: * @brief Полный путь к файлу настройки */ const QFileInfo& configFilePath() const; - /** - * @brief Установка полного пути к файлу настройки - */ - void setConfigFilePath( const QFileInfo& configFilePath ); /** * @brief Имя файла настройки */ const QString& configFileName() const; - /** - * @brief Установка имени файла настройки - */ - void setConfigFileName( const QString& configFileName ); /** * @brief Расширение у файла настройки */ const QString& configFileExtension() const; - /** - * @brief Установка расширения у файла настройки - */ - void setConfigFileExtension( const QString& configFileExtension ); /** * @brief Получение пути к пользовательскому каталогу с изменяемыми файлами @@ -203,7 +190,7 @@ public: /** * @brief Имя подкаталога для проекта */ - const QString& projectDirectoryName() const; + const QString& projectName() const; /** * @brief Имя исполняемого файла @@ -214,67 +201,6 @@ public: * @brief Полный путь к исполняемому файлу */ const QFileInfo& executableFilePath() const; - -private: - /** - * @brief Установка пути к базовому каталогу - */ - void setPrefixDirectory( const QString& prefixDirectory ); - - /** - * @brief Установка пути к каталогу с исполняемым файлом - */ - void setBinaryDirectory( const QString& binaryDirectory ); - - /** - * @brief Установка пути к пользовательскому каталогу с файлами настройки - */ - void setUserConfigDirectory( const QString& userConfigDirectory ); - - /** - * @brief Установка пути к системному каталогу с файлами настройки - */ - void setSystemConfigDirectory( const QString& systemConfigDirectory ); - - /** - * @brief Установка пути к пользовательскому каталогу с изменяемыми файлами - */ - void setUserVarDataDirectory( const QString& userVarDataDirectory ); - - /** - * @brief Установка пути к системному каталогу с изменяемыми файлами - */ - void setSystemVarDataDirectory( const QString& systemVarDataDirectory ); - - /** - * @brief Установка пути к пользовательскому каталогу с неизменяемыми файлами - */ - void setUserConstDataDirectory( const QString& userConstDataDirectory ); - - /** - * @brief Установка пути к системному каталогу с неизменяемыми файлами - */ - void setSystemConstDataDirectory( const QString& systemConstDataDirectory ); - - /** - * @brief Установка пути к пользовательскому каталогу с журналами работы - */ - void setUserLogDirectory( const QString& userLogDirectory ); - - /** - * @brief Установка пути к системному каталогу с журналами работы - */ - void setSystemLogDirectory( const QString& systemLogDirectory ); - - /** - * @brief Установка пути к каталогу с временными файлами - */ - void setTempDirectory( const QString& tempDirectory ); - - /** - * @brief Установка имени подкаталога для проекта - */ - void setProjectDirectoryName( const QString& projectDirectoryName ); }; // class Paths } // namespace filesystem