Потокобезопасная версия в отдельном классе и удаление лишних методов

This commit is contained in:
Andrei Astafev 2020-04-09 09:34:55 +03:00
parent df9b2ff599
commit a39e514278
4 changed files with 29 additions and 187 deletions

View File

@ -3,25 +3,34 @@
#include <myx/base/config.hpp> #include <myx/base/config.hpp>
#include <myx/filesystem/paths.hpp> #include <myx/filesystem/paths.hpp>
#include <myx/filesystem/paths_mt.hpp>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug>
namespace MF = myx::filesystem; namespace MF = myx::filesystem;
// Переменные для защиты экземпляра класса MF::Paths // Переменные для защиты экземпляра класса MF::PathsMT
std::atomic< MF::Paths* > MF::Paths::mInstance; std::atomic< MF::PathsMT* > MF::PathsMT::mInstance;
std::mutex MF::Paths::mMutex; std::mutex MF::PathsMT::mMutex;
int main( int argc, char** argv ) int main( int argc, char** argv )
{ {
(void)argc; (void)argc;
(void)argv; (void)argv;
QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) ); 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->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
paths->makeDefaultDirectories();
paths->findConfigFile( QStringLiteral( "test" ) ); paths->findConfigFile( QStringLiteral( "test" ) );
qDebug() << paths->systemConstDataDirectory();
qDebug() << paths->configFileName();
return( 0 ); return( 0 );
} }

View File

@ -5,12 +5,14 @@ set(current_target filesystem)
set(current_target_sources set(current_target_sources
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.cpp
) )
# Список заголовочных файлов (используется для установки) # Список заголовочных файлов (используется для установки)
set(current_target_headers set(current_target_headers
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp ${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp
${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp ${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp
) )
add_common_library(TARGET ${current_target} add_common_library(TARGET ${current_target}

View File

@ -13,23 +13,6 @@ namespace filesystem {
Paths::Paths() = default; 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() Paths::HierarchyType Paths::getHierarchyType()
{ {
QRegExp binRegexp( "/s*bin$" ); QRegExp binRegexp( "/s*bin$" );
@ -143,7 +126,7 @@ bool Paths::init( const QString& projectDir, const QString& configFileExtension
m_homeDirectory = QString::fromLocal8Bit( qgetenv( "HOME" ) ); m_homeDirectory = QString::fromLocal8Bit( qgetenv( "HOME" ) );
m_tempDirectory = QString::fromLocal8Bit( qgetenv( "TMPDIR" ) ); 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 ); 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 const QDir& Paths::systemConfigDirectory() const
{ {
return( m_systemConfigDirectory ); return( m_systemConfigDirectory );
} }
void Paths::setSystemConfigDirectory( const QString& systemConfigDirectory )
{
m_systemConfigDirectory = systemConfigDirectory;
}
const QFileInfo& Paths::configFilePath() const const QFileInfo& Paths::configFilePath() const
{ {
return( m_configFilePath ); return( m_configFilePath );
} }
void Paths::setConfigFilePath( const QFileInfo& configFilePath )
{
m_configFilePath = configFilePath;
}
const QString& Paths::configFileName() const const QString& Paths::configFileName() const
{ {
return( m_configFileName ); return( m_configFileName );
} }
void Paths::setConfigFileName( const QString& configFileName )
{
m_configFileName = configFileName;
}
const QString& Paths::configFileExtension() const const QString& Paths::configFileExtension() const
{ {
return( m_configFileExtension ); return( m_configFileExtension );
} }
void Paths::setConfigFileExtension( const QString& configFileExtension )
{
m_configFileExtension = configFileExtension;
}
const QDir& Paths::userVarDataDirectory() const const QDir& Paths::userVarDataDirectory() const
{ {
return( m_userVarDataDirectory ); return( m_userVarDataDirectory );
} }
void Paths::setUserVarDataDirectory( const QString& userVarDataDirectory )
{
m_userVarDataDirectory = userVarDataDirectory;
}
const QDir& Paths::systemVarDataDirectory() const const QDir& Paths::systemVarDataDirectory() const
{ {
return( m_systemVarDataDirectory ); return( m_systemVarDataDirectory );
} }
void Paths::setSystemVarDataDirectory( const QString& systemVarDataDirectory )
{
m_systemVarDataDirectory = systemVarDataDirectory;
}
const QDir& Paths::userConstDataDirectory() const const QDir& Paths::userConstDataDirectory() const
{ {
return( m_userConstDataDirectory ); return( m_userConstDataDirectory );
} }
void Paths::setUserConstDataDirectory( const QString& userConstDataDirectory )
{
m_userConstDataDirectory = userConstDataDirectory;
}
const QDir& Paths::systemConstDataDirectory() const const QDir& Paths::systemConstDataDirectory() const
{ {
return( m_systemConstDataDirectory ); return( m_systemConstDataDirectory );
} }
void Paths::setSystemConstDataDirectory( const QString& systemConstDataDirectory )
{
m_systemConstDataDirectory = systemConstDataDirectory;
}
const QDir& Paths::userLogDirectory() const const QDir& Paths::userLogDirectory() const
{ {
return( m_userLogDirectory ); return( m_userLogDirectory );
} }
void Paths::setUserLogDirectory( const QString& userLogDirectory )
{
m_userLogDirectory = userLogDirectory;
}
const QDir& Paths::systemLogDirectory() const const QDir& Paths::systemLogDirectory() const
{ {
return( m_systemLogDirectory ); return( m_systemLogDirectory );
} }
void Paths::setSystemLogDirectory( const QString& systemLogDirectory )
{
m_systemLogDirectory = systemLogDirectory;
}
const QDir& Paths::tempDirectory() const const QDir& Paths::tempDirectory() const
{ {
return( m_tempDirectory ); return( m_tempDirectory );
} }
void Paths::setTempDirectory( const QString& tempDirectory )
{
m_tempDirectory = tempDirectory;
}
const QDir& Paths::homeDirectory() const const QDir& Paths::homeDirectory() const
{ {
return( m_homeDirectory ); return( m_homeDirectory );
} }
const QString& Paths::projectDirectoryName() const const QString& Paths::projectName() const
{ {
return( m_projectName ); return( m_projectName );
} }
void Paths::setProjectDirectoryName( const QString& projectDirectoryName )
{
m_projectName = projectDirectoryName;
}
QString Paths::executableFileName() const QString Paths::executableFileName() const
{ {
return( m_currentExecutable.m_canonicalFilePath.fileName() ); return( m_currentExecutable.m_canonicalFilePath.fileName() );

View File

@ -14,15 +14,11 @@
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <atomic>
#include <future>
#include <mutex>
#include <thread>
namespace myx { namespace myx {
namespace filesystem { namespace filesystem {
/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам
class Paths class Paths
{ {
enum class HierarchyType : intptr_t enum class HierarchyType : intptr_t
@ -76,22 +72,25 @@ class Paths
/// @brief Расширение для файла настройки /// @brief Расширение для файла настройки
QString m_configFileExtension; QString m_configFileExtension;
HierarchyType getHierarchyType();
protected:
Paths(); Paths();
~Paths() = default; ~Paths() = default;
Paths( const Paths& ) = delete; Paths( const Paths& ) = delete;
Paths& operator=( const Paths& ) = delete; Paths& operator=( const Paths& ) = delete;
HierarchyType getHierarchyType();
static std::atomic< Paths* > mInstance;
static std::mutex mMutex;
public: public:
/** /**
* @brief getInstance * @brief getInstance
* @return Уникальный экземпляр класса Paths * @return Уникальный экземпляр класса Paths
*/ */
static Paths* getInstance(); static Paths* instance()
{
static Paths p;
return( &p );
}
/** /**
* @brief Обновление путей с учётом расположения исполняемого файла * @brief Обновление путей с учётом расположения исполняемого файла
@ -137,28 +136,16 @@ public:
* @brief Полный путь к файлу настройки * @brief Полный путь к файлу настройки
*/ */
const QFileInfo& configFilePath() const; const QFileInfo& configFilePath() const;
/**
* @brief Установка полного пути к файлу настройки
*/
void setConfigFilePath( const QFileInfo& configFilePath );
/** /**
* @brief Имя файла настройки * @brief Имя файла настройки
*/ */
const QString& configFileName() const; const QString& configFileName() const;
/**
* @brief Установка имени файла настройки
*/
void setConfigFileName( const QString& configFileName );
/** /**
* @brief Расширение у файла настройки * @brief Расширение у файла настройки
*/ */
const QString& configFileExtension() const; const QString& configFileExtension() const;
/**
* @brief Установка расширения у файла настройки
*/
void setConfigFileExtension( const QString& configFileExtension );
/** /**
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами * @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
@ -203,7 +190,7 @@ public:
/** /**
* @brief Имя подкаталога для проекта * @brief Имя подкаталога для проекта
*/ */
const QString& projectDirectoryName() const; const QString& projectName() const;
/** /**
* @brief Имя исполняемого файла * @brief Имя исполняемого файла
@ -214,67 +201,6 @@ public:
* @brief Полный путь к исполняемому файлу * @brief Полный путь к исполняемому файлу
*/ */
const QFileInfo& executableFilePath() const; 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 }; // class Paths
} // namespace filesystem } // namespace filesystem