2020-05-23 02:13:32 +03:00
|
|
|
/*
|
2021-01-05 13:04:05 +03:00
|
|
|
* Copyright (C) 2018-2021 QuasarApp.
|
2020-05-23 02:13:32 +03:00
|
|
|
* Distributed under the lgplv3 software license, see the accompanying
|
|
|
|
* Everyone is permitted to copy and distribute verbatim copies
|
|
|
|
* of this license document, but changing it is not allowed.
|
|
|
|
*/
|
|
|
|
|
2019-04-02 18:12:01 +03:00
|
|
|
#ifndef GLOBAL_H
|
|
|
|
#define GLOBAL_H
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <type_traits>
|
2020-05-17 23:21:12 +03:00
|
|
|
#include <string>
|
2020-09-07 10:16:55 +03:00
|
|
|
#include <typeinfo>
|
|
|
|
|
2019-04-02 18:12:01 +03:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator | (T lhs, T rhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(static_cast<int>(lhs) | static_cast<int>(rhs));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator & (T lhs, T rhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(static_cast<int>(lhs) & static_cast<int>(rhs));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator >> (T lhs, T rhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(static_cast<int>(lhs) >> static_cast<int>(rhs));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator << (T lhs, T rhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(static_cast<int>(lhs) << static_cast<int>(rhs));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator ~ (T lhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(~static_cast<int>(lhs));
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
constexpr inline T operator ^ (T lhs, T rhs)
|
|
|
|
{
|
|
|
|
|
|
|
|
static_assert(std::is_enum<T>::value,
|
|
|
|
"template parameter is not an enum type");
|
|
|
|
|
|
|
|
return static_cast<T>(static_cast<int>(lhs) ^ static_cast<int>(rhs));
|
|
|
|
}
|
|
|
|
|
2020-11-14 00:56:58 +03:00
|
|
|
|
2020-08-25 15:33:38 +03:00
|
|
|
// TO DO need to testing. I am think this is does not work.
|
|
|
|
//template <class IntegerType>
|
|
|
|
//constexpr IntegerType static_mul(const char* str, unsigned char depth, unsigned char index = 0) noexcept {
|
|
|
|
// return (str[index] && (depth > index))? str[index] * static_mul<IntegerType>(str, depth, index + 1) : 1;
|
|
|
|
//}
|
|
|
|
|
|
|
|
//template <class IntegerType>
|
|
|
|
//constexpr IntegerType static_hash(const char* str, unsigned char index = 0) noexcept {
|
|
|
|
// return (index && index % sizeof(IntegerType) == 0)?
|
|
|
|
// static_hash<IntegerType>(str, index + 1) % static_mul<IntegerType>(str, index , index - sizeof(IntegerType)):
|
|
|
|
// (str[index])?
|
|
|
|
// static_hash<IntegerType>(str, index + 1):
|
|
|
|
// static_mul<IntegerType>(str, index, index - (index % sizeof(IntegerType)));
|
|
|
|
//}
|
|
|
|
|
|
|
|
//template<class T>
|
|
|
|
//uint64_t static_type_hash_64() noexcept {
|
|
|
|
// return static_hash<uint64_t>(typeid (T).name());
|
|
|
|
//};
|
2020-05-22 22:34:06 +03:00
|
|
|
|
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_32 This function return hask code of the class T.
|
|
|
|
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
|
|
|
|
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_32(const T&) function.
|
|
|
|
* @return uint32_t hask code of the class T
|
|
|
|
*/
|
2020-06-30 13:13:08 +03:00
|
|
|
uint32_t static_type_hash_32() noexcept {
|
2020-05-23 02:12:35 +03:00
|
|
|
return typeid (T).hash_code();
|
2020-05-22 22:34:06 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_16 This function return hask code of the class T.
|
|
|
|
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
|
|
|
|
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_16(const T&) function.
|
|
|
|
* @return uint16_t hask code of the class T
|
|
|
|
*/
|
2020-06-30 13:13:08 +03:00
|
|
|
uint16_t static_type_hash_16() noexcept {
|
2020-05-23 02:12:35 +03:00
|
|
|
return typeid (T).hash_code() % 0xFFFF;
|
2020-05-22 22:34:06 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_8 This function return hask code of the class T.
|
|
|
|
* For get more information see the std [documentation](https://en.cppreference.com/w/cpp/types/type_info/hash_code).
|
|
|
|
* @note This method will create a T object on stack, so if you have a alredy created object use the static_type_hash_8(const T&) function.
|
|
|
|
* @return uint8_t hask code of the class T
|
|
|
|
*/
|
2020-06-30 13:13:08 +03:00
|
|
|
uint8_t static_type_hash_8() noexcept {
|
2020-05-23 02:12:35 +03:00
|
|
|
return typeid (T).hash_code() % 0xFF;
|
2020-05-22 22:34:06 +03:00
|
|
|
};
|
|
|
|
|
2020-09-06 00:41:32 +03:00
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_32 This function return hash code of a T type using @a object.
|
|
|
|
* @param object This is object of the T type using for generate hash.
|
|
|
|
* @return uint32_t hask code of the class T
|
|
|
|
*/
|
2020-09-06 00:41:32 +03:00
|
|
|
uint32_t static_type_hash_32(T& object) noexcept {
|
|
|
|
return typeid (object).hash_code();
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_16 This function return hash code of a T type using @a object.
|
|
|
|
* @param object This is object of the T type using for generate hash.
|
|
|
|
* @return uint16_t hask code of the class T
|
|
|
|
*/
|
2020-09-06 00:41:32 +03:00
|
|
|
uint16_t static_type_hash_16(T& object) noexcept {
|
|
|
|
return typeid (object).hash_code() % 0xFFFF;
|
|
|
|
};
|
|
|
|
|
|
|
|
template<class T>
|
2021-04-26 11:27:19 +03:00
|
|
|
/**
|
|
|
|
* @brief static_type_hash_8 This function return hash code of a T type using @a object.
|
|
|
|
* @param object This is object of the T type using for generate hash.
|
|
|
|
* @return uint8_t hask code of the class T
|
|
|
|
*/
|
2020-09-06 00:41:32 +03:00
|
|
|
uint8_t static_type_hash_8(T& object) noexcept {
|
|
|
|
return typeid (object).hash_code() % 0xFF;
|
|
|
|
};
|
|
|
|
|
2021-04-26 11:27:19 +03:00
|
|
|
/// @brief H_8 This is short wraper of the static_type_hash_8 fucntion.
|
2020-05-22 22:36:42 +03:00
|
|
|
#define H_8 static_type_hash_8
|
2021-04-26 11:27:19 +03:00
|
|
|
|
|
|
|
/// @brief H_16 This is short wraper of the static_type_hash_16 fucntion.
|
2020-05-22 22:36:42 +03:00
|
|
|
#define H_16 static_type_hash_16
|
2021-04-26 11:27:19 +03:00
|
|
|
|
|
|
|
/// @brief H_32 This is short wraper of the static_type_hash_32 fucntion.
|
2020-05-22 22:36:42 +03:00
|
|
|
#define H_32 static_type_hash_32
|
2020-05-22 22:34:06 +03:00
|
|
|
|
2020-08-21 16:03:32 +03:00
|
|
|
|
|
|
|
#ifdef RELEASE_BUILD
|
2021-03-22 19:55:56 +03:00
|
|
|
// The debug_assert it is assert that abort application only in debug mode.
|
|
|
|
// In the release mode This assert prin Error message only.
|
|
|
|
#define debug_assert(condition, msg) \
|
|
|
|
if (!condition) \
|
2021-03-22 21:08:46 +03:00
|
|
|
QuasarAppUtils::Params::log(msg, QuasarAppUtils::Error);
|
2021-03-22 19:55:56 +03:00
|
|
|
|
2020-08-21 16:03:32 +03:00
|
|
|
#else
|
2021-03-22 19:55:56 +03:00
|
|
|
// The debug_assert it is assert that abort application only in debug mode.
|
|
|
|
// In the release mode This assert prin Error message only.
|
|
|
|
#define debug_assert(condition, msg) assert(condition && msg)
|
2020-08-21 16:03:32 +03:00
|
|
|
#endif
|
|
|
|
|
2019-04-02 18:12:01 +03:00
|
|
|
#endif // GLOBAL_H
|