Minor fixes
This commit is contained in:
parent
c7579fb9be
commit
079f153640
|
|
@ -61,6 +61,11 @@ namespace Nz
|
||||||
Music& operator=(Music&&) = delete;
|
Music& operator=(Music&&) = delete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool FillAndQueueBuffer(std::shared_ptr<AudioBuffer> buffer);
|
||||||
|
void MusicThread(std::condition_variable& cv, std::mutex& m, std::exception_ptr& err, bool startPaused);
|
||||||
|
void StartThread(bool startPaused);
|
||||||
|
void StopThread();
|
||||||
|
|
||||||
AudioFormat m_audioFormat;
|
AudioFormat m_audioFormat;
|
||||||
std::atomic_bool m_streaming;
|
std::atomic_bool m_streaming;
|
||||||
std::atomic<UInt64> m_processedSamples;
|
std::atomic<UInt64> m_processedSamples;
|
||||||
|
|
@ -72,11 +77,7 @@ namespace Nz
|
||||||
UInt32 m_sampleRate;
|
UInt32 m_sampleRate;
|
||||||
UInt64 m_streamOffset;
|
UInt64 m_streamOffset;
|
||||||
bool m_looping;
|
bool m_looping;
|
||||||
|
bool m_musicStarted;
|
||||||
bool FillAndQueueBuffer(std::shared_ptr<AudioBuffer> buffer);
|
|
||||||
void MusicThread(std::condition_variable& cv, std::mutex& m, std::exception_ptr& err, bool startPaused);
|
|
||||||
void StartThread(bool startPaused);
|
|
||||||
void StopThread();
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
#include <Nazara/Renderer/Config.hpp>
|
#include <Nazara/Renderer/Config.hpp>
|
||||||
#include <Nazara/Renderer/Enums.hpp>
|
#include <Nazara/Renderer/Enums.hpp>
|
||||||
#include <NazaraUtils/FunctionRef.hpp>
|
#include <NazaraUtils/FunctionRef.hpp>
|
||||||
#include <functional>
|
#include <concepts>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
@ -28,7 +28,7 @@ namespace Nz
|
||||||
class Releasable;
|
class Releasable;
|
||||||
class ReleasableCallback;
|
class ReleasableCallback;
|
||||||
template<typename T> class ReleasableData;
|
template<typename T> class ReleasableData;
|
||||||
template<typename T> class ReleasableLambda;
|
template<std::invocable T> class ReleasableFunctor;
|
||||||
|
|
||||||
virtual ~RenderResources();
|
virtual ~RenderResources();
|
||||||
|
|
||||||
|
|
@ -42,7 +42,7 @@ namespace Nz
|
||||||
|
|
||||||
template<typename T> void PushForRelease(const T& value) = delete;
|
template<typename T> void PushForRelease(const T& value) = delete;
|
||||||
template<typename T> void PushForRelease(T&& value);
|
template<typename T> void PushForRelease(T&& value);
|
||||||
template<typename F> void PushReleaseCallback(F&& callback);
|
template<std::invocable F> void PushReleaseCallback(F&& callback);
|
||||||
|
|
||||||
virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0;
|
virtual void SubmitCommandBuffer(CommandBuffer* commandBuffer, QueueTypeFlags queueTypeFlags) = 0;
|
||||||
|
|
||||||
|
|
@ -93,19 +93,19 @@ namespace Nz
|
||||||
T m_data;
|
T m_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<std::invocable T>
|
||||||
class RenderResources::ReleasableLambda final : public ReleasableCallback
|
class RenderResources::ReleasableFunctor final : public ReleasableCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
template<typename U> ReleasableLambda(U&& lambda);
|
template<typename U> requires(std::constructible_from<T, U&&>) ReleasableFunctor(U&& lambda);
|
||||||
ReleasableLambda(const ReleasableLambda&) = delete;
|
ReleasableFunctor(const ReleasableFunctor&) = delete;
|
||||||
ReleasableLambda(ReleasableLambda&&) = delete;
|
ReleasableFunctor(ReleasableFunctor&&) = delete;
|
||||||
~ReleasableLambda() = default;
|
~ReleasableFunctor() = default;
|
||||||
|
|
||||||
void Release() override;
|
void Release() override;
|
||||||
|
|
||||||
ReleasableLambda& operator=(const ReleasableLambda&) = delete;
|
ReleasableFunctor& operator=(const ReleasableFunctor&) = delete;
|
||||||
ReleasableLambda& operator=(ReleasableLambda&&) = delete;
|
ReleasableFunctor& operator=(ReleasableFunctor&&) = delete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
T m_lambda;
|
T m_lambda;
|
||||||
|
|
|
||||||
|
|
@ -47,10 +47,10 @@ namespace Nz
|
||||||
m_releaseQueue.push_back(releasable);
|
m_releaseQueue.push_back(releasable);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename F>
|
template<std::invocable F>
|
||||||
void RenderResources::PushReleaseCallback(F&& callback)
|
void RenderResources::PushReleaseCallback(F&& callback)
|
||||||
{
|
{
|
||||||
using ReleaseFunctor = ReleasableLambda<std::remove_cv_t<std::remove_reference_t<F>>>;
|
using ReleaseFunctor = ReleasableFunctor<std::remove_cv_t<std::remove_reference_t<F>>>;
|
||||||
|
|
||||||
ReleaseFunctor* releasable = Allocate<ReleaseFunctor>();
|
ReleaseFunctor* releasable = Allocate<ReleaseFunctor>();
|
||||||
PlacementNew(releasable, std::forward<F>(callback));
|
PlacementNew(releasable, std::forward<F>(callback));
|
||||||
|
|
@ -117,19 +117,19 @@ namespace Nz
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<std::invocable T>
|
||||||
template<typename U>
|
template<typename U>
|
||||||
RenderResources::ReleasableLambda<T>::ReleasableLambda(U&& lambda) :
|
requires(std::constructible_from<T, U&&>)
|
||||||
|
RenderResources::ReleasableFunctor<T>::ReleasableFunctor(U&& lambda) :
|
||||||
m_lambda(std::forward<U>(lambda))
|
m_lambda(std::forward<U>(lambda))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<std::invocable T>
|
||||||
void RenderResources::ReleasableLambda<T>::Release()
|
void RenderResources::ReleasableFunctor<T>::Release()
|
||||||
{
|
{
|
||||||
m_lambda();
|
m_lambda();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <Nazara/Renderer/DebugOff.hpp>
|
#include <Nazara/Renderer/DebugOff.hpp>
|
||||||
#include "RenderResources.hpp"
|
|
||||||
|
|
|
||||||
|
|
@ -153,7 +153,7 @@ namespace Nz
|
||||||
|
|
||||||
inline void OBJParser::Error(const std::string& message)
|
inline void OBJParser::Error(const std::string& message)
|
||||||
{
|
{
|
||||||
NazaraErrorFmt("{0} at line #{1}", message, m_lineCount);
|
NazaraErrorFmt("{0} on line #{1}", message, m_lineCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void OBJParser::Flush() const
|
inline void OBJParser::Flush() const
|
||||||
|
|
@ -164,7 +164,7 @@ namespace Nz
|
||||||
|
|
||||||
inline void OBJParser::Warning(const std::string& message)
|
inline void OBJParser::Warning(const std::string& message)
|
||||||
{
|
{
|
||||||
NazaraWarningFmt("{0} at line #{1}", message, m_lineCount);
|
NazaraWarningFmt("{0} on line #{1}", message, m_lineCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool OBJParser::UnrecognizedLine(bool error)
|
inline bool OBJParser::UnrecognizedLine(bool error)
|
||||||
|
|
|
||||||
|
|
@ -472,6 +472,7 @@ namespace Nz
|
||||||
// Signal we're good
|
// Signal we're good
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(m);
|
std::unique_lock<std::mutex> lock(m);
|
||||||
|
m_musicStarted = true;
|
||||||
cv.notify_all();
|
cv.notify_all();
|
||||||
} // m & cv no longer exists from here
|
} // m & cv no longer exists from here
|
||||||
|
|
||||||
|
|
@ -519,10 +520,11 @@ namespace Nz
|
||||||
std::exception_ptr exceptionPtr;
|
std::exception_ptr exceptionPtr;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lock(mutex);
|
std::unique_lock<std::mutex> lock(mutex);
|
||||||
|
m_musicStarted = false;
|
||||||
m_thread = std::thread(&Music::MusicThread, this, std::ref(cv), std::ref(mutex), std::ref(exceptionPtr), startPaused);
|
m_thread = std::thread(&Music::MusicThread, this, std::ref(cv), std::ref(mutex), std::ref(exceptionPtr), startPaused);
|
||||||
|
|
||||||
// Wait until thread signal it has properly started (or an error occurred)
|
// Wait until thread signal it has properly started (or an error occurred)
|
||||||
cv.wait(lock);
|
cv.wait(lock, [&] { return exceptionPtr || m_musicStarted; });
|
||||||
|
|
||||||
if (exceptionPtr)
|
if (exceptionPtr)
|
||||||
std::rethrow_exception(exceptionPtr);
|
std::rethrow_exception(exceptionPtr);
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,11 @@
|
||||||
|
|
||||||
#include <Nazara/Audio/OpenALLibrary.hpp>
|
#include <Nazara/Audio/OpenALLibrary.hpp>
|
||||||
#include <Nazara/Audio/OpenALDevice.hpp>
|
#include <Nazara/Audio/OpenALDevice.hpp>
|
||||||
#include <Nazara/Core/Algorithm.hpp>
|
#include <NazaraUtils/Algorithm.hpp>
|
||||||
#include <Nazara/Core/Error.hpp>
|
#include <Nazara/Core/Error.hpp>
|
||||||
#include <Nazara/Core/ErrorFlags.hpp>
|
#include <Nazara/Core/ErrorFlags.hpp>
|
||||||
#include <Nazara/Core/Log.hpp>
|
|
||||||
#include <Nazara/Core/StringExt.hpp>
|
|
||||||
#include <NazaraUtils/CallOnExit.hpp>
|
#include <NazaraUtils/CallOnExit.hpp>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstring>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <Nazara/Audio/Debug.hpp>
|
#include <Nazara/Audio/Debug.hpp>
|
||||||
|
|
@ -30,7 +27,7 @@ namespace Nz
|
||||||
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name)
|
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name)
|
||||||
#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) {
|
#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) {
|
||||||
#define NAZARA_AUDIO_AL_EXT_END() }
|
#define NAZARA_AUDIO_AL_EXT_END() }
|
||||||
#define NAZARA_AUDIO_AL_FUNCTION_EXT(name) name = reinterpret_cast<decltype(&::name)>(alGetProcAddress(#name));
|
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(alGetProcAddress(#name));
|
||||||
#include <Nazara/Audio/OpenALFunctions.hpp>
|
#include <Nazara/Audio/OpenALFunctions.hpp>
|
||||||
|
|
||||||
m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE");
|
m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE");
|
||||||
|
|
@ -67,7 +64,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
ErrorFlags disableError(ErrorMode::Silent, ~ErrorMode::ThrowException);
|
ErrorFlags disableError(ErrorMode::Silent, ~ErrorMode::ThrowException);
|
||||||
|
|
||||||
if (!m_library.Load(libname))
|
if (!m_library.Load(Utf8Path(libname)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto LoadSymbol = [this](const char* name, bool optional)
|
auto LoadSymbol = [this](const char* name, bool optional)
|
||||||
|
|
@ -82,13 +79,16 @@ namespace Nz
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(LoadSymbol(#name, false));
|
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = reinterpret_cast<decltype(&::name)>(LoadSymbol(#name, false));
|
||||||
|
#define NAZARA_AUDIO_AL_EXT_BEGIN(name)
|
||||||
|
#define NAZARA_AUDIO_AL_EXT_END(name)
|
||||||
|
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name)
|
||||||
#include <Nazara/Audio/OpenALFunctions.hpp>
|
#include <Nazara/Audio/OpenALFunctions.hpp>
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
ErrorFlags disableSilent({}, ~ErrorMode::Silent);
|
ErrorFlags disableSilent({}, ~ErrorMode::Silent);
|
||||||
|
|
||||||
NazaraWarning(std::string("failed to load ") + libname + ": " + e.what());
|
NazaraWarningFmt("failed to load {0}: {1}", libname, e.what());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,6 +104,8 @@ namespace Nz
|
||||||
|
|
||||||
// Load core
|
// Load core
|
||||||
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name;
|
#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name;
|
||||||
|
#define NAZARA_AUDIO_AL_EXT_BEGIN(name)
|
||||||
|
#define NAZARA_AUDIO_AL_EXT_END(name)
|
||||||
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name)
|
#define NAZARA_AUDIO_AL_EXT_FUNCTION(name)
|
||||||
#include <Nazara/Audio/OpenALFunctions.hpp>
|
#include <Nazara/Audio/OpenALFunctions.hpp>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
#if NAZARA_CORE_SAFE
|
#if NAZARA_CORE_SAFE
|
||||||
if (m_referenceCount > 0)
|
if (m_referenceCount > 0)
|
||||||
NazaraWarning("Resource destroyed while still referenced " + std::to_string(m_referenceCount) + " time(s)");
|
NazaraWarningFmt("Resource destroyed while still referenced {0} time(s)", m_referenceCount);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -298,7 +298,7 @@ namespace Nz
|
||||||
|
|
||||||
while (ptr < ptrEnd && *patternPtr != '*')
|
while (ptr < ptrEnd && *patternPtr != '*')
|
||||||
{
|
{
|
||||||
if (patternPtr < patternPtrEnd && *patternPtr != *ptr && *patternPtr != '?')
|
if (patternPtr >= patternPtrEnd || (*patternPtr != *ptr && *patternPtr != '?'))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
patternPtr++;
|
patternPtr++;
|
||||||
|
|
@ -307,7 +307,7 @@ namespace Nz
|
||||||
|
|
||||||
const char* cp = nullptr;
|
const char* cp = nullptr;
|
||||||
const char* mp = nullptr;
|
const char* mp = nullptr;
|
||||||
while (*ptr)
|
while (ptr < ptrEnd)
|
||||||
{
|
{
|
||||||
if (*patternPtr == '*')
|
if (*patternPtr == '*')
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ namespace Nz
|
||||||
if (it == m_materialInstances.end())
|
if (it == m_materialInstances.end())
|
||||||
{
|
{
|
||||||
auto& matPassEntry = m_materialInstances[&materialInstance];
|
auto& matPassEntry = m_materialInstances[&materialInstance];
|
||||||
matPassEntry.onMaterialInstancePipelineInvalidated.Connect(materialInstance.OnMaterialInstancePipelineInvalidated, [=](const MaterialInstance*, std::size_t passIndex)
|
matPassEntry.onMaterialInstancePipelineInvalidated.Connect(materialInstance.OnMaterialInstancePipelineInvalidated, [this](const MaterialInstance*, std::size_t passIndex)
|
||||||
{
|
{
|
||||||
if (passIndex != m_passIndex)
|
if (passIndex != m_passIndex)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ namespace Nz
|
||||||
const auto& uniformBlockData = material.GetUniformBlockData(m_uniformBlockIndex);
|
const auto& uniformBlockData = material.GetUniformBlockData(m_uniformBlockIndex);
|
||||||
|
|
||||||
const ShaderReflection::StructData* structData = reflection.GetStructByIndex(uniformBlockData.structIndex);
|
const ShaderReflection::StructData* structData = reflection.GetStructByIndex(uniformBlockData.structIndex);
|
||||||
NazaraAssert(structData, "invalid struct index " + std::to_string(uniformBlockData.structIndex));
|
NazaraAssertFmt(structData, "invalid struct index {0}", uniformBlockData.structIndex);
|
||||||
|
|
||||||
auto it = structData->members.find(m_memberTag);
|
auto it = structData->members.find(m_memberTag);
|
||||||
if (it == structData->members.end())
|
if (it == structData->members.end())
|
||||||
|
|
|
||||||
|
|
@ -475,7 +475,7 @@ namespace Nz
|
||||||
return SocketState::Connected;
|
return SocketState::Connected;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NazaraWarning("Socket " + std::to_string(handle) + " was returned by poll without POLLOUT nor error events (events: 0x" + NumberToString(descriptor.revents, 16) + ')');
|
NazaraWarningFmt("Socket {0} was returned by poll without POLLOUT nor error events (events: {1:#x})", handle, descriptor.revents);
|
||||||
return SocketState::NotConnected;
|
return SocketState::NotConnected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ namespace Nz
|
||||||
if (shaderBinding)
|
if (shaderBinding)
|
||||||
shaderBinding->Apply(*pipelineLayout, setIndex, context);
|
shaderBinding->Apply(*pipelineLayout, setIndex, context);
|
||||||
else
|
else
|
||||||
NazaraWarning("no shader binding for set #" + std::to_string(setIndex));
|
NazaraWarningFmt("no shader binding for set #{0}", setIndex);
|
||||||
|
|
||||||
setIndex++;
|
setIndex++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,17 +45,17 @@ namespace Nz::GL
|
||||||
|
|
||||||
if constexpr (std::is_same_v<Ret, void>)
|
if constexpr (std::is_same_v<Ret, void>)
|
||||||
{
|
{
|
||||||
funcPtr(std::forward<Args>(args)...);
|
funcPtr(args...);
|
||||||
|
|
||||||
if (context->ProcessErrorStack())
|
if (context->ProcessErrorStack())
|
||||||
context->PrintFunctionCall(FuncIndex, std::forward<Args>(args)...);
|
context->PrintFunctionCall(FuncIndex, args...);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Ret r = funcPtr(std::forward<Args>(args)...);
|
Ret r = funcPtr(args...);
|
||||||
|
|
||||||
if (context->ProcessErrorStack())
|
if (context->ProcessErrorStack())
|
||||||
context->PrintFunctionCall(FuncIndex, std::forward<Args>(args)...);
|
context->PrintFunctionCall(FuncIndex, args...);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -188,7 +188,7 @@ namespace Nz
|
||||||
m_byteStream >> minimumCodeSize;
|
m_byteStream >> minimumCodeSize;
|
||||||
if (minimumCodeSize > 12)
|
if (minimumCodeSize > 12)
|
||||||
{
|
{
|
||||||
NazaraInternalError("unexpected LZW Minimum Code Size (" + std::to_string(minimumCodeSize) + ")");
|
NazaraInternalErrorFmt("unexpected LZW Minimum Code Size ({0})", minimumCodeSize);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,7 @@ namespace Nz
|
||||||
|
|
||||||
void MD5MeshParser::Error(const std::string& message)
|
void MD5MeshParser::Error(const std::string& message)
|
||||||
{
|
{
|
||||||
NazaraErrorFmt("{0} at line #1", message, m_lineCount);
|
NazaraErrorFmt("{0} on line #{1}", message, m_lineCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MD5MeshParser::ParseJoints()
|
bool MD5MeshParser::ParseJoints()
|
||||||
|
|
@ -446,7 +446,7 @@ namespace Nz
|
||||||
|
|
||||||
void MD5MeshParser::Warning(const std::string& message)
|
void MD5MeshParser::Warning(const std::string& message)
|
||||||
{
|
{
|
||||||
NazaraWarning(message + " at line #" + std::to_string(m_lineCount));
|
NazaraWarningFmt("{0} on line #{1}", message, m_lineCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MD5MeshParser::UnrecognizedLine(bool error)
|
void MD5MeshParser::UnrecognizedLine(bool error)
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,7 @@ SCENARIO("String", "[CORE][STRING]")
|
||||||
CHECK(Nz::MatchPattern("Lynix", "?????"));
|
CHECK(Nz::MatchPattern("Lynix", "?????"));
|
||||||
CHECK(Nz::MatchPattern("Lynix", "*Lynix"));
|
CHECK(Nz::MatchPattern("Lynix", "*Lynix"));
|
||||||
CHECK(Nz::MatchPattern("Lynox", "*Lyn?x"));
|
CHECK(Nz::MatchPattern("Lynox", "*Lyn?x"));
|
||||||
|
CHECK_FALSE(Nz::MatchPattern("Lynix", "Ly"));
|
||||||
CHECK_FALSE(Nz::MatchPattern("", "?"));
|
CHECK_FALSE(Nz::MatchPattern("", "?"));
|
||||||
CHECK_FALSE(Nz::MatchPattern("", "*"));
|
CHECK_FALSE(Nz::MatchPattern("", "*"));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue