Skip to content

Commit

Permalink
fix linux build
Browse files Browse the repository at this point in the history
  • Loading branch information
n0lavar committed Jan 7, 2024
1 parent ae4cb75 commit 2a4a698
Show file tree
Hide file tree
Showing 12 changed files with 188 additions and 258 deletions.
1 change: 1 addition & 0 deletions include/qx/containers/components.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
**/
#pragma once

#include <qx/macros/common.h>
#include <qx/priority.h>
#include <qx/rtti/rtti.h>

Expand Down
2 changes: 1 addition & 1 deletion include/qx/containers/components.inl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ component_t* components<base_component_t>::add(
pRawComponent,
[ePriority, statusFlags, pRawComponent](SClassData& classData)
{
classData.priorityCache.emplace(ePriority, SClassData::SCacheData(pRawComponent, statusFlags));
classData.priorityCache.emplace(ePriority, typename SClassData::SCacheData(pRawComponent, statusFlags));
});
classData.components.push_back(std::move(pComponent));
return pRawComponent;
Expand Down
10 changes: 8 additions & 2 deletions include/qx/containers/string/string_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,13 @@ constexpr wchar_t choose_char_prefix<wchar_t>(char, wchar_t w) noexcept

//==============================================================================

#define _QX_TO_WSTRING(x) L##x
#define _QX_TO_WCHAR(x) L##x

#if QX_MSVC
#define _QX_TO_WSTRING(x) __LPREFIX(x)
#else
#define _QX_TO_WSTRING(x) _QX_TO_WCHAR(x)
#endif

/**
@def QX_TO_WSTRING
Expand All @@ -248,7 +254,7 @@ constexpr wchar_t choose_char_prefix<wchar_t>(char, wchar_t w) noexcept
@param value_t - char type
@param ch - string to apply
**/
#define QX_CHAR_PREFIX(value_t, ch) qx::details::choose_char_prefix<value_t>(ch, QX_TO_WSTRING(ch))
#define QX_CHAR_PREFIX(value_t, ch) qx::details::choose_char_prefix<value_t>(ch, _QX_TO_WCHAR(ch))

//==============================================================================

Expand Down
20 changes: 12 additions & 8 deletions include/qx/meta/type_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
**/
#pragma once

#include <qx/containers/string/string_utils.h>
#include <qx/containers/string/string_view.h>
#include <qx/macros/config.h>

Expand All @@ -23,32 +24,35 @@ namespace qx
including its full name, name without template parameters
and a list of template parameters separately
@details Strings are COMPILER IMPLEMENTATION DEPENDENT but can be used for a human readable output
@tparam T - type to get information for
@tparam T - type to get information for
@tparam char_t - char type to use
@author Khrapov
@date 24.09.2022
**/
template<class T>
template<class T, class char_t = char_type>
class type_strings
{
using string_view_type = basic_string_view<char_t>;

private:
static constexpr char_type lambdaMarker[] = QX_TEXT("lambda");
static constexpr string_view create_full_signature();
static constexpr string_view create_signature();
static constexpr size_t get_num_template_parameters();
static constexpr string_view_type lambdaMarker = QX_STR_PREFIX(char_t, "lambda");
static constexpr string_view_type create_full_signature();
static constexpr string_view_type create_signature();
static constexpr size_t get_num_template_parameters();

public:
/**
@brief Get type signature (full name with template parameters)
@retval - type signature
**/
static constexpr string_view get_signature();
static constexpr string_view_type get_signature();

/**
@brief Get type name (short name without template parameters)
@retval - type name
**/
static constexpr string_view get_name();
static constexpr string_view_type get_name();

/**
@brief Get type template parameters
Expand Down
118 changes: 65 additions & 53 deletions include/qx/meta/type_strings.inl
Original file line number Diff line number Diff line change
Expand Up @@ -10,50 +10,60 @@
namespace qx
{

template<class T>
constexpr string_view type_strings<T>::create_full_signature()
template<class T, class char_t>
constexpr typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_full_signature()
{
#if QX_MSVC
return QX_TEXT(__FUNCSIG__);
return QX_STR_PREFIX(char_t, __FUNCSIG__);
#elif QX_CLANG || QX_GNU
return QX_TEXT(__PRETTY_FUNCTION__);
static_assert(
std::is_same_v<char_t, char>,
"Can't use __PRETTY_FUNCTION__ with wchar_t as it is not a macro but a function");

return __PRETTY_FUNCTION__;
#endif
}

template<class T>
constexpr string_view type_strings<T>::create_signature()
template<class T, class char_t>
constexpr typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::create_signature()
{
auto functionSignature = create_full_signature();
constexpr string_view_type svFunctionSignature = create_full_signature();

#if QX_MSVC
constexpr char_type startMarker[] = QX_TEXT("type_strings<");
constexpr char_type endMarker[] = QX_TEXT(">::create_full_signature(");
constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "type_strings<");
constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ">::create_full_signature(");
#elif QX_CLANG
constexpr char_type startMarker[] = QX_TEXT("T = ");
constexpr char_type endMarker[] = QX_TEXT("]");
constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "T = ");
constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ", char_t = ");
#elif QX_GNU
constexpr char_type startMarker[] = QX_TEXT("T = ");
constexpr char_type endMarker[] = QX_TEXT(";");
constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "T = ");
constexpr string_view_type svEndMarker = QX_STR_PREFIX(char_t, ";");
#endif

size_t nStartMarker = functionSignature.find(startMarker);
size_t nStart = nStartMarker != string_view::npos ? (nStartMarker + qx::strlen(startMarker)) : 0;
size_t nStartMarker = svFunctionSignature.find(svStartMarker);
size_t nStart = nStartMarker != string_view_type::npos ? (nStartMarker + svStartMarker.size()) : 0;

constexpr string_view_type classMarker = QX_STR_PREFIX(char_t, "class ");
size_t nClassMarker = svFunctionSignature.find(classMarker, nStart);
if (nClassMarker != string_view_type::npos)
nStart = nClassMarker + classMarker.size();

constexpr char_type classMarker[] = QX_TEXT("class ");
size_t nClassMarker = functionSignature.find(classMarker, nStart);
if (nClassMarker != string_view::npos)
nStart = nClassMarker + qx::strlen(classMarker);
size_t nEndMarker = svFunctionSignature.find(svEndMarker, nStart);
size_t nEnd = nEndMarker != string_view_type::npos ? nEndMarker : svFunctionSignature.size();

size_t nEndMarker = functionSignature.find(endMarker, nStart);
size_t nEnd = nEndMarker != string_view::npos ? nEndMarker : functionSignature.size();
#if QX_MSVC
size_t nCharCommaMarker = svFunctionSignature.rfind(QX_CHAR_PREFIX(char_t, ','), nEnd);
if (nCharCommaMarker != string_view_type::npos)
nEnd = nCharCommaMarker;
#endif

return string_view(functionSignature.data() + nStart, nEnd - nStart);
return string_view_type(svFunctionSignature.data() + nStart, nEnd - nStart);
}

template<class T>
constexpr size_t type_strings<T>::get_num_template_parameters()
template<class T, class char_t>
constexpr size_t type_strings<T, char_t>::get_num_template_parameters()
{
const string_view svSignature = create_signature();
const string_view_type svSignature = create_signature();

size_t nBraceCounter = 0;
size_t nParams = 0;
Expand All @@ -63,7 +73,7 @@ constexpr size_t type_strings<T>::get_num_template_parameters()
{
switch (svSignature[i])
{
case QX_TEXT('<'):
case QX_CHAR_PREFIX(char_t, '<'):
if (!bLambda)
{
++nBraceCounter;
Expand All @@ -75,15 +85,15 @@ constexpr size_t type_strings<T>::get_num_template_parameters()
}
break;

case QX_TEXT('>'):
case QX_CHAR_PREFIX(char_t, '>'):
--nBraceCounter;

if (bLambda)
bLambda = false;

break;

case QX_TEXT(','):
case QX_CHAR_PREFIX(char_t, ','):
if (nBraceCounter == 1)
++nParams;

Expand All @@ -94,49 +104,51 @@ constexpr size_t type_strings<T>::get_num_template_parameters()
return nParams;
}

template<class T>
constexpr string_view type_strings<T>::get_signature()
template<class T, class char_t>
constexpr typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::get_signature()
{
return create_signature();
}

template<class T>
constexpr string_view type_strings<T>::get_name()
template<class T, class char_t>
constexpr typename type_strings<T, char_t>::string_view_type type_strings<T, char_t>::get_name()
{
constexpr char_type startMarker[] = QX_TEXT("<");
const string_view svSignature = create_signature();
size_t nStartMarker = svSignature.find(startMarker);
constexpr string_view_type svStartMarker = QX_STR_PREFIX(char_t, "<");
const string_view_type svSignature = create_signature();
size_t nStartMarker = svSignature.find(svStartMarker);

if (nStartMarker != string_view::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
nStartMarker = string_view::npos;
if (nStartMarker != string_view_type::npos && svSignature.find(lambdaMarker, nStartMarker) == nStartMarker + 1)
nStartMarker = string_view_type::npos;

return string_view(svSignature.data(), nStartMarker != string_view::npos ? nStartMarker : svSignature.size());
return string_view_type(
svSignature.data(),
nStartMarker != string_view_type::npos ? nStartMarker : svSignature.size());
}

template<class T>
constexpr auto type_strings<T>::get_template_parameters()
template<class T, class char_t>
constexpr auto type_strings<T, char_t>::get_template_parameters()
{
std::array<string_view, get_num_template_parameters()> tokens;
std::array<string_view_type, get_num_template_parameters()> tokens;

const string_view svSignature = create_signature();
const string_view_type svSignature = create_signature();

size_t nTokenStart = 0;
size_t nBraceCounter = 0;
size_t nParam = 0;

const auto add_token = [&tokens, &svSignature](size_t nToken, size_t nStart, size_t nEnd)
{
while (svSignature[nStart] == QX_TEXT(' '))
while (svSignature[nStart] == QX_CHAR_PREFIX(char_t, ' '))
++nStart;

while (svSignature[nEnd] == QX_TEXT(' '))
while (svSignature[nEnd] == QX_CHAR_PREFIX(char_t, ' '))
--nEnd;

constexpr char_type classMarker[] = QX_TEXT("class ");
if (string_view(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
nStart += qx::strlen(classMarker);
constexpr string_view_type classMarker = QX_STR_PREFIX(char_t, "class ");
if (string_view_type(svSignature.data() + nStart, nEnd - nStart).starts_with(classMarker))
nStart += classMarker.size();

tokens[nToken] = string_view(svSignature.data() + nStart, nEnd + 1 - nStart);
tokens[nToken] = string_view_type(svSignature.data() + nStart, nEnd + 1 - nStart);
};

bool bLambda = false;
Expand All @@ -145,7 +157,7 @@ constexpr auto type_strings<T>::get_template_parameters()
{
switch (svSignature[i])
{
case QX_TEXT('<'):
case QX_CHAR_PREFIX(char_t, '<'):
++nBraceCounter;

if (nTokenStart == 0)
Expand All @@ -155,14 +167,14 @@ constexpr auto type_strings<T>::get_template_parameters()

break;

case QX_TEXT('>'):
case QX_CHAR_PREFIX(char_t, '>'):
--nBraceCounter;
if (bLambda)
bLambda = false;

break;

case QX_TEXT(','):
case QX_CHAR_PREFIX(char_t, ','):
if (nBraceCounter == 1)
{
add_token(nParam, nTokenStart, i - 1);
Expand All @@ -177,10 +189,10 @@ constexpr auto type_strings<T>::get_template_parameters()
{
size_t nTokenEnd = svSignature.size() - 1;

if (svSignature[nTokenEnd] == QX_TEXT(' '))
if (svSignature[nTokenEnd] == QX_CHAR_PREFIX(char_t, ' '))
--nTokenEnd;

if (svSignature[nTokenEnd] == QX_TEXT('>'))
if (svSignature[nTokenEnd] == QX_CHAR_PREFIX(char_t, '>'))
--nTokenEnd;

add_token(nParam, nTokenStart, nTokenEnd);
Expand Down
13 changes: 5 additions & 8 deletions include/qx/patterns/contiguous_iterator/base_iterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,6 @@
namespace qx
{

template<class container_t, class derived_t>
class base_forward_iterator;

template<class container_t, class derived_t>
class base_reverse_iterator;

/**
@class base_iterator
Expand All @@ -37,8 +31,11 @@ template<class container_t>
class base_iterator
{
public:
friend base_forward_iterator;
friend base_reverse_iterator;
template<class container_t_, class derived_t_>
friend class base_forward_iterator;

template<class container_t_, class derived_t_>
friend class base_reverse_iterator;

using difference_type = typename container_t::difference_type;
using size_type = typename container_t::size_type;
Expand Down
Loading

0 comments on commit 2a4a698

Please sign in to comment.