Compare commits
5 Commits
44817a8a94
...
f550594b85
Author | SHA1 | Date | |
---|---|---|---|
f550594b85 | |||
d6143953f6 | |||
352bf756bd | |||
b2731ac32f | |||
4e2cff180c |
@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.3)
|
|||||||
cmake_policy(VERSION 3.0.2..3.7)
|
cmake_policy(VERSION 3.0.2..3.7)
|
||||||
|
|
||||||
# Название проекта
|
# Название проекта
|
||||||
project(myx VERSION 0.3.0 LANGUAGES C CXX)
|
project(myx VERSION 0.4.0 LANGUAGES C CXX)
|
||||||
|
|
||||||
# В каталоге cmake/lib находятся файлы с библиотечными функциями
|
# В каталоге cmake/lib находятся файлы с библиотечными функциями
|
||||||
if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/cmlib)
|
if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/cmlib)
|
||||||
@ -13,10 +13,21 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find)
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find)
|
||||||
|
|
||||||
|
if(NOT DEFINED MYXLIB_MASTER_PROJECT)
|
||||||
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||||||
|
set(MYXLIB_MASTER_PROJECT ON)
|
||||||
|
else()
|
||||||
|
set(MYXLIB_MASTER_PROJECT OFF)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
include(CMLibCommon)
|
include(CMLibCommon)
|
||||||
|
|
||||||
option(MYXLIB_HEADER_ONLY "Build header only version of library" ON)
|
option(MYXLIB_BUILD_LIBRARIES "Build libraries" OFF)
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
option(MYXLIB_BUILD_EXAMPLES "Build examples" OFF)
|
option(MYXLIB_BUILD_EXAMPLES "Build examples" OFF)
|
||||||
|
endif()
|
||||||
|
option(MYXLIB_BUILD_EXAMPLES_HO "Build examples using header only version" OFF)
|
||||||
|
|
||||||
# Поиск библиотек с помощью pkgconfig
|
# Поиск библиотек с помощью pkgconfig
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
@ -26,40 +37,19 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)
|
|||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
# Qt5
|
# Qt5
|
||||||
find_package(
|
find_package(Qt5 COMPONENTS Core Network REQUIRED)
|
||||||
Qt5
|
|
||||||
COMPONENTS
|
|
||||||
Core
|
|
||||||
Network
|
|
||||||
Gui
|
|
||||||
Widgets
|
|
||||||
DBus
|
|
||||||
Concurrent
|
|
||||||
Sql
|
|
||||||
REQUIRED)
|
|
||||||
|
|
||||||
# Автоматически генерируемый заголовочный файл
|
|
||||||
cmlib_config_hpp_generate()
|
|
||||||
|
|
||||||
configure_file(${CMAKE_SOURCE_DIR}/src/myx/base/config_flags.hpp.in
|
|
||||||
${CMAKE_BINARY_DIR}/include/myx/base/config_flags.hpp)
|
|
||||||
|
|
||||||
# Подключение внешних проектов
|
|
||||||
include(ExternalProject)
|
|
||||||
|
|
||||||
# Библиотеки
|
# Библиотеки
|
||||||
add_subdirectory(src/myx/base)
|
add_subdirectory(src/myx/base)
|
||||||
add_subdirectory(src/myx/filesystem)
|
add_subdirectory(src/myx/filesystem)
|
||||||
add_subdirectory(src/myx/qt)
|
add_subdirectory(src/myx/qt)
|
||||||
add_subdirectory(src/myx/math)
|
add_subdirectory(src/myx/math)
|
||||||
add_subdirectory(src/myx/redis)
|
# add_subdirectory(src/myx/redis)
|
||||||
|
|
||||||
# Примеры
|
# Примеры
|
||||||
if(BUILD_EXAMPLES)
|
if(MYXLIB_BUILD_EXAMPLES OR MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
add_subdirectory(examples/filesystem)
|
add_subdirectory(examples/filesystem)
|
||||||
add_subdirectory(examples/qt)
|
add_subdirectory(examples/qt)
|
||||||
|
|
||||||
add_dependencies(example-filesystem-minimal create_auxilary_symlinks)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Документация
|
# Документация
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit e5fbb9023546a5e98c832e8596586c71edcc5b2f
|
Subproject commit 197e5b3939709a0cc4924e44c355aa8ad7358b8e
|
@ -4,9 +4,9 @@ set(TRGT example-filesystem-minimal)
|
|||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/minimal.cpp)
|
set(TRGT_cpp ${CMAKE_CURRENT_SOURCE_DIR}/minimal.cpp)
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES)
|
||||||
# Путь поиска библиотек внутри проекта
|
# Путь поиска библиотек внутри проекта
|
||||||
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
||||||
link_directories(${CMAKE_BINARY_DIR}/src/myx/filesystem/lib)
|
|
||||||
|
|
||||||
# Цель для создания исполняемого файла
|
# Цель для создания исполняемого файла
|
||||||
add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc})
|
add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc})
|
||||||
@ -27,19 +27,18 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp})
|
add_format_sources(${TRGT} ${TRGT_cpp})
|
||||||
|
|
||||||
add_dependencies(${TRGT} base_static)
|
|
||||||
add_dependencies(${TRGT} filesystem_static)
|
|
||||||
|
|
||||||
target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT} base_static filesystem_static)
|
||||||
target_link_libraries(${TRGT} myx-filesystem)
|
target_link_libraries(${TRGT} myx-filesystem)
|
||||||
|
|
||||||
target_link_libraries(${TRGT} Qt5::Core)
|
target_link_libraries(${TRGT} Qt5::Core)
|
||||||
target_link_libraries(${TRGT} Threads::Threads)
|
target_link_libraries(${TRGT} Threads::Threads)
|
||||||
|
|
||||||
# Имя выходного файла для цели
|
# Имя выходного файла для цели
|
||||||
set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME filesystem-minimal
|
set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME filesystem-minimal)
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
||||||
|
|
||||||
add_sanitizers(${TRGT})
|
add_sanitizers(${TRGT})
|
||||||
|
|
||||||
@ -48,4 +47,30 @@ cotire(${TRGT})
|
|||||||
add_dependencies(${TRGT} create_auxilary_symlinks)
|
add_dependencies(${TRGT} create_auxilary_symlinks)
|
||||||
|
|
||||||
# Правила для установки
|
# Правила для установки
|
||||||
install(TARGETS ${TRGT} COMPONENT EXAMPLES RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
|
# Цель для создания исполняемого файла
|
||||||
|
add_executable(${TRGT}-ho ${TRGT_cpp} ${TRGT_qrc})
|
||||||
|
common_target_properties(${TRGT}-ho)
|
||||||
|
|
||||||
|
target_include_directories(${TRGT}-ho PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
target_include_directories(${TRGT}-ho SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho base-header-only filesystem-header-only)
|
||||||
|
|
||||||
|
target_link_libraries(${TRGT}-ho Qt5::Core)
|
||||||
|
target_link_libraries(${TRGT}-ho Threads::Threads)
|
||||||
|
|
||||||
|
# Имя выходного файла для цели
|
||||||
|
set_target_properties(${TRGT}-ho PROPERTIES OUTPUT_NAME filesystem-minimal-ho)
|
||||||
|
|
||||||
|
add_sanitizers(${TRGT}-ho)
|
||||||
|
cotire(${TRGT}-ho)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho create_auxilary_symlinks)
|
||||||
|
|
||||||
|
# Правила для установки
|
||||||
|
install(TARGETS ${TRGT}-ho COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#include "cmlib_private_config.hpp"
|
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <myx/filesystem/paths.hpp>
|
#include <myx/filesystem/paths.hpp>
|
||||||
@ -8,12 +6,15 @@
|
|||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
#define CMLIB_PROJECT_NAME "myxlib"
|
||||||
|
|
||||||
namespace MF = myx::filesystem;
|
namespace MF = myx::filesystem;
|
||||||
|
|
||||||
// Переменные для защиты экземпляра класса MF::PathsMT
|
// Переменные для защиты экземпляра класса MF::PathsMT
|
||||||
std::atomic< MF::PathsMT* > MF::PathsMT::mInstance;
|
std::atomic< MF::PathsMT* > MF::PathsMT::mInstance;
|
||||||
std::mutex MF::PathsMT::mMutex;
|
std::mutex MF::PathsMT::mMutex;
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
(void)argc;
|
(void)argc;
|
||||||
|
@ -10,9 +10,10 @@ qt5_translation(
|
|||||||
BASE_NAME ${TRGT}
|
BASE_NAME ${TRGT}
|
||||||
LANGUAGES ru_RU)
|
LANGUAGES ru_RU)
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES)
|
||||||
|
|
||||||
# Путь поиска библиотек внутри проекта
|
# Путь поиска библиотек внутри проекта
|
||||||
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
link_directories(${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
|
||||||
link_directories(${CMAKE_BINARY_DIR}/src/myx/qt/lib)
|
|
||||||
|
|
||||||
# Цель для создания исполняемого файла
|
# Цель для создания исполняемого файла
|
||||||
add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc})
|
add_executable(${TRGT} ${TRGT_cpp} ${TRGT_qrc})
|
||||||
@ -33,19 +34,18 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp})
|
add_format_sources(${TRGT} ${TRGT_cpp})
|
||||||
|
|
||||||
add_dependencies(${TRGT} base_static)
|
|
||||||
add_dependencies(${TRGT} qt_static)
|
|
||||||
|
|
||||||
# Qt5
|
# Qt5
|
||||||
target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
target_link_libraries(${TRGT} myx-qt)
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_HEADER_ONLY)
|
||||||
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
add_dependencies(${TRGT} base qt)
|
||||||
|
|
||||||
target_link_libraries(${TRGT} Qt5::Core)
|
target_link_libraries(${TRGT} Qt5::Core)
|
||||||
|
|
||||||
# Имя выходного файла для цели
|
# Имя выходного файла для цели
|
||||||
set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-translators
|
set_target_properties(${TRGT} PROPERTIES OUTPUT_NAME qt-translators)
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
|
|
||||||
|
|
||||||
add_sanitizers(${TRGT})
|
add_sanitizers(${TRGT})
|
||||||
|
|
||||||
@ -54,4 +54,30 @@ cotire(${TRGT})
|
|||||||
add_dependencies(${TRGT} create_auxilary_symlinks)
|
add_dependencies(${TRGT} create_auxilary_symlinks)
|
||||||
|
|
||||||
# Правила для установки
|
# Правила для установки
|
||||||
install(TARGETS ${TRGT} COMPONENT EXAMPLES RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS ${TRGT} COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_EXAMPLES_HO)
|
||||||
|
# Цель для создания исполняемого файла
|
||||||
|
add_executable(${TRGT}-ho ${TRGT_cpp} ${TRGT_qrc})
|
||||||
|
common_target_properties(${TRGT}-ho)
|
||||||
|
|
||||||
|
target_include_directories(${TRGT}-ho PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
target_include_directories(${TRGT}-ho SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho base-header-only qt-header-only)
|
||||||
|
|
||||||
|
target_link_libraries(${TRGT}-ho Qt5::Core)
|
||||||
|
target_link_libraries(${TRGT}-ho Threads::Threads)
|
||||||
|
|
||||||
|
# Имя выходного файла для цели
|
||||||
|
set_target_properties(${TRGT}-ho PROPERTIES OUTPUT_NAME qt-translators-ho)
|
||||||
|
|
||||||
|
add_sanitizers(${TRGT}-ho)
|
||||||
|
cotire(${TRGT}-ho)
|
||||||
|
|
||||||
|
add_dependencies(${TRGT}-ho create_auxilary_symlinks)
|
||||||
|
|
||||||
|
# Правила для установки
|
||||||
|
install(TARGETS ${TRGT}-ho COMPONENT examples RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
endif()
|
||||||
|
@ -16,6 +16,12 @@ set(TRGT_hpp
|
|||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -34,19 +40,20 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
cotire(${TRGT})
|
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(FILES ${TRGT_headers} ${CMAKE_BINARY_DIR}/include/myx/base/compiler_features.hpp COMPONENT headers
|
||||||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT headers DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
if(BUILD_SHARED_LIBS)
|
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
endif()
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/include/config_flags.hpp ${TRGT_headers} COMPONENT DEV
|
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
|
@ -1 +1,5 @@
|
|||||||
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "config.hpp"
|
#include "config.hpp"
|
||||||
|
@ -3,7 +3,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <myx/base/config_flags.hpp>
|
#ifdef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#undef MYXLIB_HEADER_ONLY
|
||||||
|
#define MYXLIB_INLINE inline
|
||||||
|
#else
|
||||||
|
#define MYXLIB_HEADER_ONLY
|
||||||
|
#define MYXLIB_INLINE inline
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MYXLIB_HEADER_ONLY
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
#include "config-inl.hpp"
|
#include "config-inl.hpp"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#ifndef MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_
|
#ifndef MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_
|
||||||
#define MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_
|
#define MYX_BASE_ENUM_BITWISE_OPERATIONS_HPP_
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
@ -12,11 +12,21 @@ set(TRGT_cpp
|
|||||||
set(TRGT_hpp
|
set(TRGT_hpp
|
||||||
${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)
|
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/current_executable-inl.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths-inl.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt-inl.hpp)
|
||||||
|
|
||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
|
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -35,19 +45,20 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
|
|
||||||
|
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
if(BUILD_SHARED_LIBS)
|
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
endif()
|
|
||||||
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
|
41
src/myx/filesystem/current_executable-inl.hpp
Normal file
41
src/myx/filesystem/current_executable-inl.hpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef MYX_BASE_CURRENT_EXECUTABLE_INL_HPP_
|
||||||
|
#define MYX_BASE_CURRENT_EXECUTABLE_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
#if !defined ( __linux__ )
|
||||||
|
error "Class CurrentExecutable is supported only in Linux"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MYXLIB_INLINE CurrentExecutable::CurrentExecutable() :
|
||||||
|
m_procFilePath( QStringLiteral( "/proc/self/exe" ) )
|
||||||
|
{
|
||||||
|
m_canonicalFilePath = m_procFilePath.canonicalFilePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QFileInfo& CurrentExecutable::canonicalFilePath() const
|
||||||
|
{
|
||||||
|
return( m_canonicalFilePath );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_BASE_CURRENT_EXECUTABLE_INL_HPP_
|
@ -1,31 +1,5 @@
|
|||||||
#include <myx/base/config.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
#include <myx/filesystem/current_executable.hpp>
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
|
||||||
#include <paths.h>
|
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace filesystem {
|
|
||||||
|
|
||||||
#if !defined ( __linux__ )
|
|
||||||
error "Class CurrentExecutable is supported only in Linux"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CurrentExecutable::CurrentExecutable() :
|
#include <myx/filesystem/current_executable-inl.hpp>
|
||||||
m_procFilePath( QStringLiteral( "/proc/self/exe" ) )
|
|
||||||
{
|
|
||||||
m_canonicalFilePath = m_procFilePath.canonicalFilePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QFileInfo& CurrentExecutable::canonicalFilePath() const
|
|
||||||
{
|
|
||||||
return( m_canonicalFilePath );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace filesystem
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@ -42,4 +44,8 @@ public:
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "current_executable-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_FILESYSTEM_CURRENT_EXECUTABLE_HPP_
|
#endif // MYX_FILESYSTEM_CURRENT_EXECUTABLE_HPP_
|
||||||
|
359
src/myx/filesystem/paths-inl.hpp
Normal file
359
src/myx/filesystem/paths-inl.hpp
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
#ifndef MYX_BASE_PATHS_INL_HPP_
|
||||||
|
#define MYX_BASE_PATHS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/filesystem/paths.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
MYXLIB_INLINE Paths::Paths() = default;
|
||||||
|
|
||||||
|
MYXLIB_INLINE Paths::HierarchyType Paths::getHierarchyType()
|
||||||
|
{
|
||||||
|
QRegExp binUnityRegexp( "/s*bin/unity$" );
|
||||||
|
QRegExp binRegexp( "/s*bin$" );
|
||||||
|
auto binaryDir = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
||||||
|
|
||||||
|
if ( binUnityRegexp.indexIn( binaryDir ) >= 0 )
|
||||||
|
{
|
||||||
|
binaryDir.remove( binUnityRegexp );
|
||||||
|
|
||||||
|
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return ( HierarchyType::kDevelopment );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( binRegexp.indexIn( binaryDir ) == -1 )
|
||||||
|
{
|
||||||
|
return ( HierarchyType::kFlat );
|
||||||
|
}
|
||||||
|
|
||||||
|
QRegExp optRegexp( "^/opt(/|/.+/)" + m_projectName + "/" );
|
||||||
|
|
||||||
|
if ( optRegexp.indexIn( binaryDir ) >= 0 )
|
||||||
|
{
|
||||||
|
binaryDir.remove( binRegexp );
|
||||||
|
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return ( HierarchyType::kOpt );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( binaryDir.startsWith( QStringLiteral( "/usr/local" ) ) )
|
||||||
|
{
|
||||||
|
QFileInfo etcDirInfo { "/usr/local/etc/" + m_projectName };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { "/usr/local/share/" + m_projectName };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { "/var/lib/" + m_projectName };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { "/var/log/" + m_projectName };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return ( HierarchyType::kUsr );
|
||||||
|
}
|
||||||
|
if ( binaryDir.startsWith( QStringLiteral( "/usr" ) ) )
|
||||||
|
{
|
||||||
|
QFileInfo etcDirInfo { "/etc/" + m_projectName };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { "/usr/share/" + m_projectName };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { "/var/lib/" + m_projectName };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { "/var/log/" + m_projectName };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return ( HierarchyType::kUsr );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/.local/bin" ) ||
|
||||||
|
binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/bin" ) )
|
||||||
|
{
|
||||||
|
QFileInfo etcDirInfo { m_userConfigDirectory.canonicalPath() };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { m_userConstDataDirectory.canonicalPath() };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { m_userVarDataDirectory.canonicalPath() };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { m_userLogDirectory.canonicalPath() };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return( HierarchyType::kHome );
|
||||||
|
}
|
||||||
|
|
||||||
|
binaryDir.remove( binRegexp );
|
||||||
|
|
||||||
|
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
||||||
|
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
||||||
|
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
||||||
|
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
||||||
|
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
||||||
|
|
||||||
|
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
||||||
|
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
||||||
|
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
||||||
|
|
||||||
|
return ( HierarchyType::kDevelopment );
|
||||||
|
} // Paths::getHierarchyType
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool Paths::init( const QString& projectDir, const QString& configFileExtension )
|
||||||
|
{
|
||||||
|
m_projectName = projectDir.isEmpty() ? m_currentExecutable.m_canonicalFilePath.fileName()
|
||||||
|
: projectDir;
|
||||||
|
m_configFileExtension = configFileExtension.isEmpty() ? QStringLiteral( "conf" )
|
||||||
|
: configFileExtension;
|
||||||
|
m_configFileName = m_projectName + "." + m_configFileExtension;
|
||||||
|
|
||||||
|
m_homeDirectory = QDir::homePath();
|
||||||
|
m_tempDirectory = QDir::tempPath();
|
||||||
|
|
||||||
|
auto configHome = QString::fromLocal8Bit( qgetenv( "XDG_CONFIG_HOME" ) );
|
||||||
|
if ( configHome.isEmpty() )
|
||||||
|
{
|
||||||
|
configHome = m_homeDirectory.canonicalPath() + "/.config";
|
||||||
|
}
|
||||||
|
m_userConfigDirectory = configHome + "/" + m_projectName;
|
||||||
|
|
||||||
|
auto dataHome = QString::fromLocal8Bit( qgetenv( "XDG_DATA_HOME" ) );
|
||||||
|
if ( dataHome.isEmpty() )
|
||||||
|
{
|
||||||
|
dataHome = m_homeDirectory.canonicalPath() + "/.local/share";
|
||||||
|
}
|
||||||
|
dataHome += "/" + m_projectName;
|
||||||
|
m_userConstDataDirectory = dataHome + "/data";
|
||||||
|
m_userVarDataDirectory = dataHome + "/lib";
|
||||||
|
m_userLogDirectory = dataHome + "/log";
|
||||||
|
|
||||||
|
m_hierarchyType = getHierarchyType();
|
||||||
|
|
||||||
|
if ( m_hierarchyType == HierarchyType::kFlat )
|
||||||
|
{
|
||||||
|
m_systemConstDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
||||||
|
m_systemVarDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
||||||
|
m_systemConfigDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
||||||
|
m_systemLogDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_configFilePath = m_systemConfigDirectory.canonicalPath() + "/" + m_configFileName;
|
||||||
|
|
||||||
|
return( true );
|
||||||
|
} // Paths::updatePaths
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool Paths::makeDefaultDirectories()
|
||||||
|
{
|
||||||
|
bool status = true;
|
||||||
|
|
||||||
|
if ( !m_userConfigDirectory.mkpath( m_userConfigDirectory.absolutePath() ) ) { status = false; }
|
||||||
|
if ( !m_userVarDataDirectory.mkpath( m_userVarDataDirectory.absolutePath() ) ) { status = false; }
|
||||||
|
if ( !m_userConstDataDirectory.mkpath( m_userConstDataDirectory.absolutePath() ) ) { status = false; }
|
||||||
|
if ( !m_userLogDirectory.mkpath( m_userLogDirectory.absolutePath() ) ) { status = false; }
|
||||||
|
return( status );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE QString Paths::findConfigFile( const QString& defaultConfigFile )
|
||||||
|
{
|
||||||
|
if ( !defaultConfigFile.isEmpty() && QFileInfo( defaultConfigFile ).isReadable() )
|
||||||
|
{
|
||||||
|
m_configFilePath = defaultConfigFile;
|
||||||
|
return( defaultConfigFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
auto fileName = QString::fromLocal8Bit( qgetenv( QCoreApplication::applicationName()
|
||||||
|
.toUpper().toUtf8() + "_CONFIG" ) );
|
||||||
|
if ( QFileInfo( fileName ).isReadable() )
|
||||||
|
{
|
||||||
|
m_configFilePath = fileName;
|
||||||
|
return( fileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( QFileInfo( m_configFilePath ).isReadable() )
|
||||||
|
{
|
||||||
|
return( m_configFilePath.absoluteFilePath() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( QString() );
|
||||||
|
} // Paths::findConfigFile
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE QDir Paths::executableFileDirectory() const
|
||||||
|
{
|
||||||
|
return( m_currentExecutable.m_canonicalFilePath.dir() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::userConfigDirectory() const
|
||||||
|
{
|
||||||
|
return( m_userConfigDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::systemConfigDirectory() const
|
||||||
|
{
|
||||||
|
return( m_systemConfigDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QFileInfo& Paths::configFilePath() const
|
||||||
|
{
|
||||||
|
return( m_configFilePath );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QString& Paths::configFileName() const
|
||||||
|
{
|
||||||
|
return( m_configFileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QString& Paths::configFileExtension() const
|
||||||
|
{
|
||||||
|
return( m_configFileExtension );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::userVarDataDirectory() const
|
||||||
|
{
|
||||||
|
return( m_userVarDataDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::systemVarDataDirectory() const
|
||||||
|
{
|
||||||
|
return( m_systemVarDataDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::userConstDataDirectory() const
|
||||||
|
{
|
||||||
|
return( m_userConstDataDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::systemConstDataDirectory() const
|
||||||
|
{
|
||||||
|
return( m_systemConstDataDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::userLogDirectory() const
|
||||||
|
{
|
||||||
|
return( m_userLogDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::systemLogDirectory() const
|
||||||
|
{
|
||||||
|
return( m_systemLogDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::tempDirectory() const
|
||||||
|
{
|
||||||
|
return( m_tempDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QDir& Paths::homeDirectory() const
|
||||||
|
{
|
||||||
|
return( m_homeDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QString& Paths::projectName() const
|
||||||
|
{
|
||||||
|
return( m_projectName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE QString Paths::executableFileName() const
|
||||||
|
{
|
||||||
|
return( m_currentExecutable.m_canonicalFilePath.fileName() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE const QFileInfo& Paths::executableFilePath() const
|
||||||
|
{
|
||||||
|
return( m_currentExecutable.m_canonicalFilePath );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_BASE_PATHS_INL_HPP_
|
@ -1,349 +1,5 @@
|
|||||||
#include <myx/base/config.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
#include <myx/filesystem/current_executable.hpp>
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
#include <myx/filesystem/paths.hpp>
|
#endif
|
||||||
|
|
||||||
#include <paths.h>
|
#include <myx/filesystem/paths-inl.hpp>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace filesystem {
|
|
||||||
|
|
||||||
Paths::Paths() = default;
|
|
||||||
|
|
||||||
Paths::HierarchyType Paths::getHierarchyType()
|
|
||||||
{
|
|
||||||
QRegExp binUnityRegexp( "/s*bin/unity$" );
|
|
||||||
QRegExp binRegexp( "/s*bin$" );
|
|
||||||
auto binaryDir = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
|
||||||
|
|
||||||
if ( binUnityRegexp.indexIn( binaryDir ) >= 0 )
|
|
||||||
{
|
|
||||||
binaryDir.remove( binUnityRegexp );
|
|
||||||
|
|
||||||
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return ( HierarchyType::kDevelopment );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( binRegexp.indexIn( binaryDir ) == -1 )
|
|
||||||
{
|
|
||||||
return ( HierarchyType::kFlat );
|
|
||||||
}
|
|
||||||
|
|
||||||
QRegExp optRegexp( "^/opt(/|/.+/)" + m_projectName + "/" );
|
|
||||||
|
|
||||||
if ( optRegexp.indexIn( binaryDir ) >= 0 )
|
|
||||||
{
|
|
||||||
binaryDir.remove( binRegexp );
|
|
||||||
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return ( HierarchyType::kOpt );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( binaryDir.startsWith( QStringLiteral( "/usr/local" ) ) )
|
|
||||||
{
|
|
||||||
QFileInfo etcDirInfo { "/usr/local/etc/" + m_projectName };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { "/usr/local/share/" + m_projectName };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { "/var/lib/" + m_projectName };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { "/var/log/" + m_projectName };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return ( HierarchyType::kUsr );
|
|
||||||
}
|
|
||||||
if ( binaryDir.startsWith( QStringLiteral( "/usr" ) ) )
|
|
||||||
{
|
|
||||||
QFileInfo etcDirInfo { "/etc/" + m_projectName };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { "/usr/share/" + m_projectName };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { "/var/lib/" + m_projectName };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { "/var/log/" + m_projectName };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return ( HierarchyType::kUsr );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/.local/bin" ) ||
|
|
||||||
binaryDir.startsWith( m_homeDirectory.canonicalPath() + "/bin" ) )
|
|
||||||
{
|
|
||||||
QFileInfo etcDirInfo { m_userConfigDirectory.canonicalPath() };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { m_userConstDataDirectory.canonicalPath() };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { m_userVarDataDirectory.canonicalPath() };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { m_userLogDirectory.canonicalPath() };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return( HierarchyType::kHome );
|
|
||||||
}
|
|
||||||
|
|
||||||
binaryDir.remove( binRegexp );
|
|
||||||
|
|
||||||
QFileInfo etcDirInfo { binaryDir + "/etc" };
|
|
||||||
if ( !etcDirInfo.isDir() || !etcDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo constDataDirInfo { binaryDir + "/files/data" };
|
|
||||||
if ( !constDataDirInfo.isDir() || !constDataDirInfo.isReadable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo varDataDirInfo { binaryDir + "/files/lib" };
|
|
||||||
if ( !varDataDirInfo.isDir() || !varDataDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
QFileInfo logDirInfo { binaryDir + "/files/log" };
|
|
||||||
if ( !logDirInfo.isDir() || !logDirInfo.isWritable() ) { return( HierarchyType::kFlat ); }
|
|
||||||
|
|
||||||
m_systemConfigDirectory = etcDirInfo.canonicalFilePath();
|
|
||||||
m_systemConstDataDirectory = constDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemVarDataDirectory = varDataDirInfo.canonicalFilePath();
|
|
||||||
m_systemLogDirectory = logDirInfo.canonicalFilePath();
|
|
||||||
|
|
||||||
return ( HierarchyType::kDevelopment );
|
|
||||||
} // Paths::getHierarchyType
|
|
||||||
|
|
||||||
|
|
||||||
bool Paths::init( const QString& projectDir, const QString& configFileExtension )
|
|
||||||
{
|
|
||||||
m_projectName = projectDir.isEmpty() ? m_currentExecutable.m_canonicalFilePath.fileName()
|
|
||||||
: projectDir;
|
|
||||||
m_configFileExtension = configFileExtension.isEmpty() ? QStringLiteral( "conf" )
|
|
||||||
: configFileExtension;
|
|
||||||
m_configFileName = m_projectName + "." + m_configFileExtension;
|
|
||||||
|
|
||||||
m_homeDirectory = QDir::homePath();
|
|
||||||
m_tempDirectory = QDir::tempPath();
|
|
||||||
|
|
||||||
auto configHome = QString::fromLocal8Bit( qgetenv( "XDG_CONFIG_HOME" ) );
|
|
||||||
if ( configHome.isEmpty() )
|
|
||||||
{
|
|
||||||
configHome = m_homeDirectory.canonicalPath() + "/.config";
|
|
||||||
}
|
|
||||||
m_userConfigDirectory = configHome + "/" + m_projectName;
|
|
||||||
|
|
||||||
auto dataHome = QString::fromLocal8Bit( qgetenv( "XDG_DATA_HOME" ) );
|
|
||||||
if ( dataHome.isEmpty() )
|
|
||||||
{
|
|
||||||
dataHome = m_homeDirectory.canonicalPath() + "/.local/share";
|
|
||||||
}
|
|
||||||
dataHome += "/" + m_projectName;
|
|
||||||
m_userConstDataDirectory = dataHome + "/data";
|
|
||||||
m_userVarDataDirectory = dataHome + "/lib";
|
|
||||||
m_userLogDirectory = dataHome + "/log";
|
|
||||||
|
|
||||||
m_hierarchyType = getHierarchyType();
|
|
||||||
|
|
||||||
if ( m_hierarchyType == HierarchyType::kFlat )
|
|
||||||
{
|
|
||||||
m_systemConstDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
|
||||||
m_systemVarDataDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
|
||||||
m_systemConfigDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
|
||||||
m_systemLogDirectory = m_currentExecutable.m_canonicalFilePath.canonicalPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_configFilePath = m_systemConfigDirectory.canonicalPath() + "/" + m_configFileName;
|
|
||||||
|
|
||||||
return( true );
|
|
||||||
} // Paths::updatePaths
|
|
||||||
|
|
||||||
|
|
||||||
bool Paths::makeDefaultDirectories()
|
|
||||||
{
|
|
||||||
bool status = true;
|
|
||||||
|
|
||||||
if ( !m_userConfigDirectory.mkpath( m_userConfigDirectory.absolutePath() ) ) { status = false; }
|
|
||||||
if ( !m_userVarDataDirectory.mkpath( m_userVarDataDirectory.absolutePath() ) ) { status = false; }
|
|
||||||
if ( !m_userConstDataDirectory.mkpath( m_userConstDataDirectory.absolutePath() ) ) { status = false; }
|
|
||||||
if ( !m_userLogDirectory.mkpath( m_userLogDirectory.absolutePath() ) ) { status = false; }
|
|
||||||
return( status );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString Paths::findConfigFile( const QString& defaultConfigFile )
|
|
||||||
{
|
|
||||||
if ( !defaultConfigFile.isEmpty() && QFileInfo( defaultConfigFile ).isReadable() )
|
|
||||||
{
|
|
||||||
m_configFilePath = defaultConfigFile;
|
|
||||||
return( defaultConfigFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
auto fileName = QString::fromLocal8Bit( qgetenv( QCoreApplication::applicationName()
|
|
||||||
.toUpper().toUtf8() + "_CONFIG" ) );
|
|
||||||
if ( QFileInfo( fileName ).isReadable() )
|
|
||||||
{
|
|
||||||
m_configFilePath = fileName;
|
|
||||||
return( fileName );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( QFileInfo( m_configFilePath ).isReadable() )
|
|
||||||
{
|
|
||||||
return( m_configFilePath.absoluteFilePath() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( QString() );
|
|
||||||
} // Paths::findConfigFile
|
|
||||||
|
|
||||||
|
|
||||||
QDir Paths::executableFileDirectory() const
|
|
||||||
{
|
|
||||||
return( m_currentExecutable.m_canonicalFilePath.dir() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::userConfigDirectory() const
|
|
||||||
{
|
|
||||||
return( m_userConfigDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::systemConfigDirectory() const
|
|
||||||
{
|
|
||||||
return( m_systemConfigDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QFileInfo& Paths::configFilePath() const
|
|
||||||
{
|
|
||||||
return( m_configFilePath );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QString& Paths::configFileName() const
|
|
||||||
{
|
|
||||||
return( m_configFileName );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QString& Paths::configFileExtension() const
|
|
||||||
{
|
|
||||||
return( m_configFileExtension );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::userVarDataDirectory() const
|
|
||||||
{
|
|
||||||
return( m_userVarDataDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::systemVarDataDirectory() const
|
|
||||||
{
|
|
||||||
return( m_systemVarDataDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::userConstDataDirectory() const
|
|
||||||
{
|
|
||||||
return( m_userConstDataDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::systemConstDataDirectory() const
|
|
||||||
{
|
|
||||||
return( m_systemConstDataDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::userLogDirectory() const
|
|
||||||
{
|
|
||||||
return( m_userLogDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::systemLogDirectory() const
|
|
||||||
{
|
|
||||||
return( m_systemLogDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::tempDirectory() const
|
|
||||||
{
|
|
||||||
return( m_tempDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QDir& Paths::homeDirectory() const
|
|
||||||
{
|
|
||||||
return( m_homeDirectory );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QString& Paths::projectName() const
|
|
||||||
{
|
|
||||||
return( m_projectName );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString Paths::executableFileName() const
|
|
||||||
{
|
|
||||||
return( m_currentExecutable.m_canonicalFilePath.fileName() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const QFileInfo& Paths::executableFilePath() const
|
|
||||||
{
|
|
||||||
return( m_currentExecutable.m_canonicalFilePath );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace filesystem
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
#include <myx/filesystem/current_executable.hpp>
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
@ -218,4 +219,8 @@ public:
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "paths-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_FILESYSTEM_PATHS_HPP_
|
#endif // MYX_FILESYSTEM_PATHS_HPP_
|
||||||
|
44
src/myx/filesystem/paths_mt-inl.hpp
Normal file
44
src/myx/filesystem/paths_mt-inl.hpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#ifndef MYX_BASE_PATHS_MT_INL_HPP_
|
||||||
|
#define MYX_BASE_PATHS_MT_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/filesystem/paths_mt.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
|
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace filesystem {
|
||||||
|
|
||||||
|
MYXLIB_INLINE PathsMT::PathsMT() = default;
|
||||||
|
|
||||||
|
MYXLIB_INLINE PathsMT& PathsMT::instance()
|
||||||
|
{
|
||||||
|
volatile PathsMT* 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 PathsMT();
|
||||||
|
mInstance.store( const_cast< PathsMT* >( localInstance ), std::memory_order_release ); // NOLINT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return( const_cast< PathsMT& >( *localInstance ) ); // NOLINT
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace filesystem
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_BASE_PATHS_MT_INL_HPP_
|
@ -1,34 +1,5 @@
|
|||||||
#include <myx/base/config.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
#include <myx/filesystem/current_executable.hpp>
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
#include <myx/filesystem/paths_mt.hpp>
|
#endif
|
||||||
|
|
||||||
#include <paths.h>
|
#include <myx/filesystem/paths_mt-inl.hpp>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace filesystem {
|
|
||||||
|
|
||||||
PathsMT::PathsMT() = default;
|
|
||||||
|
|
||||||
PathsMT& PathsMT::instance()
|
|
||||||
{
|
|
||||||
volatile PathsMT* 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 PathsMT();
|
|
||||||
mInstance.store( const_cast< PathsMT* >( localInstance ), std::memory_order_release ); // NOLINT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return( const_cast< PathsMT& >( *localInstance ) ); // NOLINT
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace filesystem
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
#include <myx/filesystem/current_executable.hpp>
|
#include <myx/filesystem/current_executable.hpp>
|
||||||
#include <myx/filesystem/paths.hpp>
|
#include <myx/filesystem/paths.hpp>
|
||||||
|
|
||||||
@ -47,4 +48,8 @@ public:
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "paths_mt-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_FILESYSTEM_PATHS_MT_HPP_
|
#endif // MYX_FILESYSTEM_PATHS_MT_HPP_
|
||||||
|
@ -3,7 +3,7 @@ set(TRGT math)
|
|||||||
|
|
||||||
# cmake-format: off
|
# cmake-format: off
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
set(TRGT_sources
|
set(TRGT_cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative_and_abs.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative_and_abs.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps.cpp
|
||||||
@ -14,10 +14,15 @@ set(TRGT_sources
|
|||||||
set(TRGT_hpp
|
set(TRGT_hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/all.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/all.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative-inl.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative_and_abs.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative_and_abs.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_relative_and_abs-inl.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps-inl.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps_and_abs.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps_and_abs.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/almost_equal_ulps_and_abs-inl.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/constants.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/constants.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/constants-inl.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/float_cmp_types.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/float_cmp_types.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/functions.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/functions.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/radar.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/radar.hpp
|
||||||
@ -26,7 +31,15 @@ set(TRGT_hpp
|
|||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_sources} ${TRGT_headers})
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_sources(${TRGT}-header-only INTERFACE ${TRGT_headers})
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
|
|
||||||
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
# Создание цели для проверки утилитой clang-tidy
|
# Создание цели для проверки утилитой clang-tidy
|
||||||
@ -44,18 +57,19 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_sources} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_sources} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
|
||||||
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
||||||
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
#ifndef MYX_MATH_ALL_HPP_
|
||||||
|
#define MYX_MATH_ALL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <myx/math/almost_equal_relative.hpp>
|
#include <myx/math/almost_equal_relative.hpp>
|
||||||
#include <myx/math/almost_equal_relative_and_abs.hpp>
|
#include <myx/math/almost_equal_relative_and_abs.hpp>
|
||||||
#include <myx/math/almost_equal_ulps.hpp>
|
#include <myx/math/almost_equal_ulps.hpp>
|
||||||
@ -6,3 +11,5 @@
|
|||||||
#include <myx/math/functions.hpp>
|
#include <myx/math/functions.hpp>
|
||||||
#include <myx/math/radar.hpp>
|
#include <myx/math/radar.hpp>
|
||||||
#include <myx/math/units.hpp>
|
#include <myx/math/units.hpp>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
51
src/myx/math/almost_equal_relative-inl.hpp
Normal file
51
src/myx/math/almost_equal_relative-inl.hpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_INL_HPP_
|
||||||
|
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/math/almost_equal_relative.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace math {
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_relative( const float a, const float b,
|
||||||
|
const float maxRelDiff )
|
||||||
|
{
|
||||||
|
float diff = fabsf( a - b );
|
||||||
|
float aN = fabsf( a );
|
||||||
|
float bN = fabsf( b );
|
||||||
|
float largest = ( bN > aN ) ? bN : aN;
|
||||||
|
|
||||||
|
if ( diff <= largest * maxRelDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_relative( const double a, const double b,
|
||||||
|
const double maxRelDiff )
|
||||||
|
{
|
||||||
|
double diff = fabs( a - b );
|
||||||
|
double aN = fabs( a );
|
||||||
|
double bN = fabs( b );
|
||||||
|
double largest = ( bN > aN ) ? bN : aN;
|
||||||
|
|
||||||
|
if ( diff <= largest * maxRelDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace math
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif
|
@ -1,42 +1,5 @@
|
|||||||
#include <myx/math/almost_equal_relative.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cmath>
|
#include <myx/math/almost_equal_relative-inl.hpp>
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace math {
|
|
||||||
|
|
||||||
bool almost_equal_relative( const float a, const float b,
|
|
||||||
const float maxRelDiff )
|
|
||||||
{
|
|
||||||
float diff = fabsf( a - b );
|
|
||||||
float aN = fabsf( a );
|
|
||||||
float bN = fabsf( b );
|
|
||||||
float largest = ( bN > aN ) ? bN : aN;
|
|
||||||
|
|
||||||
if ( diff <= largest * maxRelDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool almost_equal_relative( const double a, const double b,
|
|
||||||
const double maxRelDiff )
|
|
||||||
{
|
|
||||||
double diff = fabs( a - b );
|
|
||||||
double aN = fabs( a );
|
|
||||||
double bN = fabs( b );
|
|
||||||
double largest = ( bN > aN ) ? bN : aN;
|
|
||||||
|
|
||||||
if ( diff <= largest * maxRelDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace math
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
||||||
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
|
|
||||||
// https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
|
// https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
|
||||||
@ -28,4 +32,8 @@ bool almost_equal_relative( double a, double b,
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "almost_equal_relative-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
#endif // MYX_MATH_ALMOST_EQUAL_RELATIVE_HPP_
|
||||||
|
65
src/myx/math/almost_equal_relative_and_abs-inl.hpp
Normal file
65
src/myx/math/almost_equal_relative_and_abs-inl.hpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_INL_HPP_
|
||||||
|
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/math/almost_equal_relative_and_abs.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace math {
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_relative_and_abs( const float a, const float b,
|
||||||
|
const float maxAbsDiff, const float maxRelDiff )
|
||||||
|
{
|
||||||
|
// Check if the numbers are really close -- needed
|
||||||
|
// when comparing numbers near zero.
|
||||||
|
float diff = fabsf( a - b );
|
||||||
|
if ( diff <= maxAbsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
float aN = fabsf( a );
|
||||||
|
float bN = fabsf( b );
|
||||||
|
float largest = ( bN > aN ) ? bN : aN;
|
||||||
|
|
||||||
|
if ( diff <= largest * maxRelDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_relative_and_abs( const double a, const double b,
|
||||||
|
const double maxAbsDiff, const double maxRelDiff )
|
||||||
|
{
|
||||||
|
// Check if the numbers are really close -- needed
|
||||||
|
// when comparing numbers near zero.
|
||||||
|
double diff = fabs( a - b );
|
||||||
|
if ( diff <= maxAbsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
double aN = fabs( a );
|
||||||
|
double bN = fabs( b );
|
||||||
|
double largest = ( bN > aN ) ? bN : aN;
|
||||||
|
|
||||||
|
if ( diff <= largest * maxRelDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace math
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif
|
@ -1,56 +1,5 @@
|
|||||||
#include <myx/math/almost_equal_relative_and_abs.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cmath>
|
#include <myx/math/almost_equal_relative_and_abs-inl.hpp>
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace math {
|
|
||||||
|
|
||||||
bool almost_equal_relative_and_abs( const float a, const float b,
|
|
||||||
const float maxAbsDiff, const float maxRelDiff )
|
|
||||||
{
|
|
||||||
// Check if the numbers are really close -- needed
|
|
||||||
// when comparing numbers near zero.
|
|
||||||
float diff = fabsf( a - b );
|
|
||||||
if ( diff <= maxAbsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
float aN = fabsf( a );
|
|
||||||
float bN = fabsf( b );
|
|
||||||
float largest = ( bN > aN ) ? bN : aN;
|
|
||||||
|
|
||||||
if ( diff <= largest * maxRelDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool almost_equal_relative_and_abs( const double a, const double b,
|
|
||||||
const double maxAbsDiff, const double maxRelDiff )
|
|
||||||
{
|
|
||||||
// Check if the numbers are really close -- needed
|
|
||||||
// when comparing numbers near zero.
|
|
||||||
double diff = fabs( a - b );
|
|
||||||
if ( diff <= maxAbsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
double aN = fabs( a );
|
|
||||||
double bN = fabs( b );
|
|
||||||
double largest = ( bN > aN ) ? bN : aN;
|
|
||||||
|
|
||||||
if ( diff <= largest * maxRelDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace math
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
#ifndef MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
||||||
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
#define MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <cfloat>
|
#include <cfloat>
|
||||||
|
|
||||||
namespace myx {
|
namespace myx {
|
||||||
@ -28,4 +32,8 @@ bool almost_equal_relative_and_abs( double a, double b,
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "almost_equal_relative_and_abs-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
#endif // MYX_MATH_ALMOST_EQUAL_RELATIVE_AND_ABS_HPP_
|
||||||
|
93
src/myx/math/almost_equal_ulps-inl.hpp
Normal file
93
src/myx/math/almost_equal_ulps-inl.hpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_INL_HPP_
|
||||||
|
#define MYX_MATH_ALMOST_EQUAL_ULPS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/math/almost_equal_ulps.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/math/float_cmp_types.hpp>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace math {
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_ulps( const float a, const float b,
|
||||||
|
const int maxUlpsDiff )
|
||||||
|
{
|
||||||
|
FloatCmp uA( a );
|
||||||
|
FloatCmp uB( b );
|
||||||
|
|
||||||
|
// Если знаки разные, то числа не равны.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
if ( uA.negative() != uB.negative() )
|
||||||
|
{
|
||||||
|
// Кроме случая, когда +0==-0
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
||||||
|
#endif
|
||||||
|
if ( a == b ) // -V550
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Разница в младших битах.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
auto ulpsDiff = std::abs( uA.i - uB.i );
|
||||||
|
if ( ulpsDiff <= maxUlpsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
} // almost_equal_ulps
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_ulps( const double a, const double b,
|
||||||
|
const int maxUlpsDiff )
|
||||||
|
{
|
||||||
|
DoubleCmp uA( a );
|
||||||
|
DoubleCmp uB( b );
|
||||||
|
|
||||||
|
// Если знаки разные, то числа не равны.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
if ( uA.negative() != uB.negative() )
|
||||||
|
{
|
||||||
|
// Кроме случая, когда +0==-0
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
||||||
|
#endif
|
||||||
|
if ( a == b ) // -V550
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Разница в младших битах.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
auto ulpsDiff = std::abs( uA.i - uB.i );
|
||||||
|
if ( ulpsDiff <= maxUlpsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
return( false );
|
||||||
|
} // almost_equal_ulps
|
||||||
|
|
||||||
|
} // namespace math
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif
|
@ -1,83 +1,5 @@
|
|||||||
#include <myx/math/almost_equal_ulps.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
#include <myx/math/float_cmp_types.hpp>
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace math {
|
|
||||||
|
|
||||||
bool almost_equal_ulps( const float a, const float b,
|
|
||||||
const int maxUlpsDiff )
|
|
||||||
{
|
|
||||||
FloatCmp uA( a );
|
|
||||||
FloatCmp uB( b );
|
|
||||||
|
|
||||||
// Если знаки разные, то числа не равны.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
if ( uA.negative() != uB.negative() )
|
|
||||||
{
|
|
||||||
// Кроме случая, когда +0==-0
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
|
||||||
#endif
|
#endif
|
||||||
if ( a == b ) // -V550
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Разница в младших битах.
|
#include <myx/math/almost_equal_ulps-inl.hpp>
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
auto ulpsDiff = std::abs( uA.i - uB.i );
|
|
||||||
if ( ulpsDiff <= maxUlpsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
} // almost_equal_ulps
|
|
||||||
|
|
||||||
|
|
||||||
bool almost_equal_ulps( const double a, const double b,
|
|
||||||
const int maxUlpsDiff )
|
|
||||||
{
|
|
||||||
DoubleCmp uA( a );
|
|
||||||
DoubleCmp uB( b );
|
|
||||||
|
|
||||||
// Если знаки разные, то числа не равны.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
if ( uA.negative() != uB.negative() )
|
|
||||||
{
|
|
||||||
// Кроме случая, когда +0==-0
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wfloat-equal"
|
|
||||||
#endif
|
|
||||||
if ( a == b ) // -V550
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Разница в младших битах.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
auto ulpsDiff = std::abs( uA.i - uB.i );
|
|
||||||
if ( ulpsDiff <= maxUlpsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
return( false );
|
|
||||||
} // almost_equal_ulps
|
|
||||||
|
|
||||||
} // namespace math
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
#define MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#define MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
#include <myx/math/float_cmp_types.hpp>
|
#include <myx/math/float_cmp_types.hpp>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -28,4 +31,8 @@ bool almost_equal_ulps( double a, double b,
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "almost_equal_ulps-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#endif // MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
|
87
src/myx/math/almost_equal_ulps_and_abs-inl.hpp
Normal file
87
src/myx/math/almost_equal_ulps_and_abs-inl.hpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_INL_HPP_
|
||||||
|
#define MYX_MATH_ALMOST_EQUAL_ULPS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/math/almost_equal_ulps_and_abs.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/math/float_cmp_types.hpp>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace math {
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_ulps_and_abs( const float a, const float b,
|
||||||
|
const float maxAbsDiff, const int maxUlpsDiff )
|
||||||
|
{
|
||||||
|
// Check if the numbers are really close -- needed
|
||||||
|
// when comparing numbers near zero.
|
||||||
|
float absDiff = fabsf( a - b );
|
||||||
|
if ( absDiff <= maxAbsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
FloatCmp uA( a );
|
||||||
|
FloatCmp uB( b );
|
||||||
|
|
||||||
|
// Different signs means they do not match.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
if ( uA.negative() != uB.negative() )
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the difference in ULPs.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
int ulpsDiff = std::abs( uA.i - uB.i );
|
||||||
|
if ( ulpsDiff <= maxUlpsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( false );
|
||||||
|
} // almost_equal_ulps_and_abs
|
||||||
|
|
||||||
|
|
||||||
|
MYXLIB_INLINE bool almost_equal_ulps_and_abs( const double a, const double b,
|
||||||
|
const double maxAbsDiff, const int maxUlpsDiff )
|
||||||
|
{
|
||||||
|
// Check if the numbers are really close -- needed
|
||||||
|
// when comparing numbers near zero.
|
||||||
|
double absDiff = fabs( a - b );
|
||||||
|
if ( absDiff <= maxAbsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
DoubleCmp uA( a );
|
||||||
|
DoubleCmp uB( b );
|
||||||
|
|
||||||
|
// Different signs means they do not match.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
if ( uA.negative() != uB.negative() )
|
||||||
|
{
|
||||||
|
return( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the difference in ULPs.
|
||||||
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
||||||
|
auto ulpsDiff = std::abs( uA.i - uB.i );
|
||||||
|
if ( ulpsDiff <= maxUlpsDiff )
|
||||||
|
{
|
||||||
|
return( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( false );
|
||||||
|
} // almost_equal_ulps_and_abs
|
||||||
|
|
||||||
|
} // namespace math
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif
|
@ -1,77 +1,5 @@
|
|||||||
#include <myx/math/almost_equal_ulps_and_abs.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
#include <myx/math/float_cmp_types.hpp>
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cmath>
|
#include <myx/math/almost_equal_ulps_and_abs-inl.hpp>
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace math {
|
|
||||||
|
|
||||||
bool almost_equal_ulps_and_abs( const float a, const float b,
|
|
||||||
const float maxAbsDiff, const int maxUlpsDiff )
|
|
||||||
{
|
|
||||||
// Check if the numbers are really close -- needed
|
|
||||||
// when comparing numbers near zero.
|
|
||||||
float absDiff = fabsf( a - b );
|
|
||||||
if ( absDiff <= maxAbsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
FloatCmp uA( a );
|
|
||||||
FloatCmp uB( b );
|
|
||||||
|
|
||||||
// Different signs means they do not match.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
if ( uA.negative() != uB.negative() )
|
|
||||||
{
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the difference in ULPs.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
int ulpsDiff = std::abs( uA.i - uB.i );
|
|
||||||
if ( ulpsDiff <= maxUlpsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( false );
|
|
||||||
} // almost_equal_ulps_and_abs
|
|
||||||
|
|
||||||
|
|
||||||
bool almost_equal_ulps_and_abs( const double a, const double b,
|
|
||||||
const double maxAbsDiff, const int maxUlpsDiff )
|
|
||||||
{
|
|
||||||
// Check if the numbers are really close -- needed
|
|
||||||
// when comparing numbers near zero.
|
|
||||||
double absDiff = fabs( a - b );
|
|
||||||
if ( absDiff <= maxAbsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
DoubleCmp uA( a );
|
|
||||||
DoubleCmp uB( b );
|
|
||||||
|
|
||||||
// Different signs means they do not match.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
if ( uA.negative() != uB.negative() )
|
|
||||||
{
|
|
||||||
return( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the difference in ULPs.
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-union-access)
|
|
||||||
auto ulpsDiff = std::abs( uA.i - uB.i );
|
|
||||||
if ( ulpsDiff <= maxUlpsDiff )
|
|
||||||
{
|
|
||||||
return( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( false );
|
|
||||||
} // almost_equal_ulps_and_abs
|
|
||||||
|
|
||||||
} // namespace math
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#ifndef MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
#define MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#define MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
namespace myx {
|
namespace myx {
|
||||||
|
|
||||||
namespace math {
|
namespace math {
|
||||||
@ -26,4 +30,8 @@ bool almost_equal_ulps_and_abs( double a, double b,
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "almost_equal_ulps_and_abs-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
#endif // MYX_MATH_ALMOST_EQUAL_ULPS_HPP_
|
||||||
|
18
src/myx/math/constants-inl.hpp
Normal file
18
src/myx/math/constants-inl.hpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef MYX_MATH_CONSTANTS_INL_HPP_
|
||||||
|
#define MYX_MATH_CONSTANTS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/math/constants.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace math {
|
||||||
|
|
||||||
|
} // namespace math
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif
|
@ -1,9 +1,5 @@
|
|||||||
#include <myx/math/constants.hpp>
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace myx {
|
#include <myx/math/constants-inl.hpp>
|
||||||
|
|
||||||
namespace math {
|
|
||||||
|
|
||||||
} // namespace math
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
#ifndef MYX_MATH_CONSTANTS_HPP_
|
#ifndef MYX_MATH_CONSTANTS_HPP_
|
||||||
#define MYX_MATH_CONSTANTS_HPP_
|
#define MYX_MATH_CONSTANTS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
@ -8,11 +12,14 @@ namespace myx {
|
|||||||
|
|
||||||
namespace math {
|
namespace math {
|
||||||
|
|
||||||
const auto ImpedanceOfFreeSpace = 376.7303136675757;
|
const auto ImpedanceOfFreeSpace = (M_PI * 119.9169832);
|
||||||
|
|
||||||
} // namespace math
|
} // namespace math
|
||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "constants-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // MYX_MATH_CONSTANTS_HPP_
|
#endif // MYX_MATH_CONSTANTS_HPP_
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef MYX_MATH_FLOAT_CMP_TYPES_HPP_
|
#ifndef MYX_MATH_FLOAT_CMP_TYPES_HPP_
|
||||||
#define MYX_MATH_FLOAT_CMP_TYPES_HPP_
|
#define MYX_MATH_FLOAT_CMP_TYPES_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef MYX_MATH_FUNCTIONS_HPP_
|
#ifndef MYX_MATH_FUNCTIONS_HPP_
|
||||||
#define MYX_MATH_FUNCTIONS_HPP_
|
#define MYX_MATH_FUNCTIONS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <boost/math/special_functions/pow.hpp>
|
#include <boost/math/special_functions/pow.hpp>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef MYX_MATH_RADAR_HPP_
|
#ifndef MYX_MATH_RADAR_HPP_
|
||||||
#define MYX_MATH_RADAR_HPP_
|
#define MYX_MATH_RADAR_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef MYX_MATH_UNITS_HPP_
|
#ifndef MYX_MATH_UNITS_HPP_
|
||||||
#define MYX_MATH_UNITS_HPP_
|
#define MYX_MATH_UNITS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
@ -88,5 +90,4 @@ T magnitude_to_decibel( T const& magnitude )
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
|
|
||||||
#endif // MYX_MATH_UNITS_HPP_
|
#endif // MYX_MATH_UNITS_HPP_
|
||||||
|
@ -3,17 +3,26 @@ set(TRGT qt)
|
|||||||
|
|
||||||
# cmake-format: off
|
# cmake-format: off
|
||||||
# Список файлов исходных текстов
|
# Список файлов исходных текстов
|
||||||
|
if(NOT MYXLIB_HEADER_ONLY)
|
||||||
set(TRGT_cpp
|
set(TRGT_cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translators.cpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/translators.cpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Список заголовочных файлов (используется для установки)
|
# Список заголовочных файлов (используется для установки)
|
||||||
set(TRGT_hpp
|
set(TRGT_hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/backports.hpp
|
${CMAKE_CURRENT_SOURCE_DIR}/backports.hpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/translators.hpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/translators.hpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/translators-inl.hpp)
|
||||||
|
|
||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -32,19 +41,21 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
install(TARGETS ${TRGT}_static COMPONENT libs-dev ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=DEV -P
|
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT main LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
endif()
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
|
install(FILES ${TRGT_headers} COMPONENT headers
|
||||||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT headers DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
|
||||||
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
|
add_custom_target(${TRGT}-install-headers COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=headers -P
|
||||||
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef MYX_QT_BACKPORTS_HPP_
|
#ifndef MYX_QT_BACKPORTS_HPP_
|
||||||
#define MYX_QT_BACKPORTS_HPP_
|
#define MYX_QT_BACKPORTS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#if ( defined ( TARGET_LSB_ID_AstraLinuxSE ) && defined ( TARGET_LSB_CODENAME_smolensk ) )
|
#if ( defined ( TARGET_LSB_ID_AstraLinuxSE ) && defined ( TARGET_LSB_CODENAME_smolensk ) )
|
||||||
|
|
||||||
#define override
|
#define override
|
||||||
|
67
src/myx/qt/translators-inl.hpp
Normal file
67
src/myx/qt/translators-inl.hpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#ifndef MYX_QT_TRANSLATORS_INL_HPP_
|
||||||
|
#define MYX_QT_TRANSLATORS_INL_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef MYXLIB_HEADER_ONLY
|
||||||
|
#include <myx/qt/translators.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QLibraryInfo>
|
||||||
|
#include <QLocale>
|
||||||
|
|
||||||
|
namespace myx {
|
||||||
|
|
||||||
|
namespace qt {
|
||||||
|
|
||||||
|
MYXLIB_INLINE void append_translators( QTranslatorsList& translators, const QString& appName )
|
||||||
|
{
|
||||||
|
auto* translator = new QTranslator( qApp );
|
||||||
|
|
||||||
|
if ( translator->load( QLocale(),
|
||||||
|
appName, QStringLiteral( "_" ), QStringLiteral( ":/qm" ) ) )
|
||||||
|
{
|
||||||
|
translators.append( translator );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
translator->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
translator = new QTranslator( qApp );
|
||||||
|
if ( translator->load( QLocale::system(),
|
||||||
|
QStringLiteral( "qt" ), QStringLiteral( "_" ),
|
||||||
|
QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ) )
|
||||||
|
{
|
||||||
|
translators.append( translator );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
translator->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
translator = new QTranslator( qApp );
|
||||||
|
if ( translator->load( "qtbase_" + QLocale::system().name(),
|
||||||
|
QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ) )
|
||||||
|
{
|
||||||
|
translators.append( translator );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
translator->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( auto* i : qAsConst( translators ) )
|
||||||
|
{
|
||||||
|
qApp->installTranslator( i );
|
||||||
|
}
|
||||||
|
} // append_translators
|
||||||
|
|
||||||
|
} // namespace qt
|
||||||
|
|
||||||
|
} // namespace myx
|
||||||
|
|
||||||
|
#endif // MYX_QT_TRANSLATORS_INL_HPP_
|
@ -1,58 +1,5 @@
|
|||||||
#include "translators.hpp"
|
#ifndef MYXLIB_BUILD_LIBRARIES
|
||||||
|
#error Define MYXLIB_BUILD_LIBRARIES to compile this file.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <myx/base/config.hpp>
|
#include <myx/qt/translators.hpp>
|
||||||
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QLibraryInfo>
|
|
||||||
#include <QLocale>
|
|
||||||
|
|
||||||
namespace myx {
|
|
||||||
|
|
||||||
namespace qt {
|
|
||||||
|
|
||||||
void append_translators( QTranslatorsList& translators, const QString& appName )
|
|
||||||
{
|
|
||||||
auto* translator = new QTranslator( qApp );
|
|
||||||
|
|
||||||
if ( translator->load( QLocale(),
|
|
||||||
appName, QStringLiteral( "_" ), QStringLiteral( ":/qm" ) ) )
|
|
||||||
{
|
|
||||||
translators.append( translator );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
translator->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
translator = new QTranslator( qApp );
|
|
||||||
if ( translator->load( QLocale::system(),
|
|
||||||
QStringLiteral( "qt" ), QStringLiteral( "_" ),
|
|
||||||
QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ) )
|
|
||||||
{
|
|
||||||
translators.append( translator );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
translator->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
translator = new QTranslator( qApp );
|
|
||||||
if ( translator->load( "qtbase_" + QLocale::system().name(),
|
|
||||||
QLibraryInfo::location( QLibraryInfo::TranslationsPath ) ) )
|
|
||||||
{
|
|
||||||
translators.append( translator );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
translator->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( auto* i : qAsConst( translators ) )
|
|
||||||
{
|
|
||||||
qApp->installTranslator( i );
|
|
||||||
}
|
|
||||||
} // append_translators
|
|
||||||
|
|
||||||
} // namespace qt
|
|
||||||
|
|
||||||
} // namespace myx
|
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef MYX_LOG_QT_TRANSLATORS_HPP_
|
#ifndef MYX_QT_TRANSLATORS_HPP_
|
||||||
#define MYX_LOG_QT_TRANSLATORS_HPP_
|
#define MYX_QT_TRANSLATORS_HPP_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <myx/base/config.hpp>
|
||||||
#include <myx/qt/backports.hpp>
|
#include <myx/qt/backports.hpp>
|
||||||
|
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
@ -17,4 +20,8 @@ void append_translators( QTranslatorsList& translators, const QString& appName )
|
|||||||
|
|
||||||
} // namespace myx
|
} // namespace myx
|
||||||
|
|
||||||
#endif // ifndef MYX_LOG_QT_TRANSLATORS_HPP_
|
#ifdef MYXLIB_HEADER_ONLY
|
||||||
|
#include "translators-inl.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // ifndef MYX_QT_TRANSLATORS_HPP_
|
||||||
|
@ -22,6 +22,12 @@ set(TRGT_moc_hpp
|
|||||||
set(TRGT_headers ${TRGT_hpp})
|
set(TRGT_headers ${TRGT_hpp})
|
||||||
# cmake-format: on
|
# cmake-format: on
|
||||||
|
|
||||||
|
add_library(${TRGT}-header-only INTERFACE)
|
||||||
|
target_include_directories(
|
||||||
|
${TRGT}-header-only SYSTEM INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
|
||||||
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
||||||
|
|
||||||
|
if(MYXLIB_BUILD_LIBRARIES)
|
||||||
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
add_common_library(${TRGT} OUTPUT_NAME myx-${TRGT} SOURCES ${TRGT_cpp} ${TRGT_headers})
|
||||||
common_target_properties(${TRGT})
|
common_target_properties(${TRGT})
|
||||||
|
|
||||||
@ -40,20 +46,21 @@ add_pvs_check(${TRGT})
|
|||||||
# Создание цели для автоматического форматирования кода
|
# Создание цели для автоматического форматирования кода
|
||||||
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
add_format_sources(${TRGT} ${TRGT_cpp} ${TRGT_headers})
|
||||||
|
|
||||||
|
target_compile_definitions(${TRGT} PUBLIC MYXLIB_BUILD_LIBRARIES)
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Core_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Network_INCLUDE_DIRS})
|
target_include_directories(${TRGT} SYSTEM PUBLIC ${Qt5Network_INCLUDE_DIRS})
|
||||||
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
target_include_directories(${TRGT} SYSTEM PRIVATE ${CMAKE_SOURCE_DIR}/src)
|
||||||
|
|
||||||
cotire(${TRGT})
|
cotire(${TRGT})
|
||||||
|
|
||||||
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
|
||||||
add_custom_target(${TRGT}-install-headers COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_COMPONENT=DEV -P
|
|
||||||
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
|
||||||
|
|
||||||
# Правила для установки
|
|
||||||
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_static COMPONENT DEV ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install(TARGETS ${TRGT}_shared COMPONENT DEV LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
endif()
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
install(FILES ${TRGT_headers} COMPONENT DEV DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/${TRGT})
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
install(FILES ${CMAKE_BINARY_DIR}/${TRGT}.pc COMPONENT DEV DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
|
||||||
|
# Цель, используемая только для установки заголовочных файлов без компиляции проекта
|
||||||
|
add_custom_target(${TRGT}-install-headers COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_COMPONENT=DEV -P
|
||||||
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
// #define MYX_REDIS_EXPORT Q_DECL_IMPORT
|
// #define MYX_REDIS_EXPORT Q_DECL_IMPORT
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
#include <myx/base/config_flags.hpp>
|
// #include <myx/base/config_flags.hpp>
|
||||||
|
|
||||||
#endif // MYX_REDIS_CONFIG_HPP_
|
#endif // MYX_REDIS_CONFIG_HPP_
|
||||||
|
Loading…
Reference in New Issue
Block a user