| @@ -1,191 +0,0 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // Lol Engine is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #pragma once | |||||
| // | |||||
| // The build-time features | |||||
| // ----------------------- | |||||
| // | |||||
| /* | |||||
| * Check for C++11 and later features. | |||||
| */ | |||||
| /* These features aren't necessarily supported by all compilers */ | |||||
| #undef LOL_FEATURE_CXX11_INHERIT_CONSTRUCTORS | |||||
| #undef LOL_FEATURE_CXX11_ISNAN /* FIXME: is this the right place? */ | |||||
| #undef LOL_FEATURE_CXX11_NULLPTR | |||||
| #undef LOL_FEATURE_CXX11_TEMPLATE_ALIASES | |||||
| #undef LOL_FEATURE_CXX11_SFINAE_FOR_CTORS | |||||
| #undef LOL_FEATURE_CXX17_ATTRIBUTE_NODISCARD | |||||
| #undef LOL_FEATURE_CXX17_ATTRIBUTE_FALLTHROUGH | |||||
| /* Features detected through __has_cpp_attribute */ | |||||
| #ifdef __has_cpp_attribute | |||||
| # if __has_cpp_attribute(nodiscard) | |||||
| # define LOL_FEATURE_CXX17_ATTRIBUTE_NODISCARD 1 | |||||
| # endif | |||||
| # if __has_cpp_attribute(fallthrough) | |||||
| # define LOL_FEATURE_CXX17_ATTRIBUTE_FALLTHROUGH 1 | |||||
| # endif | |||||
| #endif | |||||
| /* Features supported by GCC */ | |||||
| #if defined __GNUC__ | |||||
| # if !defined(__GXX_EXPERIMENTAL_CXX0X) && __cplusplus < 201103L | |||||
| # error "sorry, this version of GCC does not support constexpr" | |||||
| # endif | |||||
| # define LOL_FEATURE_CXX11_INHERIT_CONSTRUCTORS 1 | |||||
| # define LOL_FEATURE_CXX11_ISNAN 1 | |||||
| # define LOL_FEATURE_CXX11_NULLPTR 1 | |||||
| # define LOL_FEATURE_CXX11_SFINAE_FOR_CTORS 1 | |||||
| # if (__GNUC__ * 100 + __GNUC_MINOR__) >= 470 | |||||
| # define LOL_FEATURE_CXX11_TEMPLATE_ALIASES 1 | |||||
| # endif | |||||
| #endif | |||||
| /* Features supported by Clang */ | |||||
| #if !defined __GNUC__ && defined __has_feature | |||||
| # define LOL_FEATURE_CXX11_INHERIT_CONSTRUCTORS 1 | |||||
| # if !__has_feature(cxx_constexpr) | |||||
| # error "sorry, this version of clang does not support constexpr" | |||||
| # endif | |||||
| # define LOL_FEATURE_CXX11_ISNAN 1 | |||||
| # if __has_feature(cxx_nullptr) | |||||
| # define LOL_FEATURE_CXX11_NULLPTR 1 | |||||
| # endif | |||||
| # define LOL_FEATURE_CXX11_TEMPLATE_ALIASES 1 | |||||
| # define LOL_FEATURE_CXX11_SFINAE_FOR_CTORS 1 | |||||
| #endif | |||||
| /* Features supported by Visual Studio */ | |||||
| #if defined _MSC_VER | |||||
| # if _MSC_VER < 1910 | |||||
| # error "sorry, Visual Studio 2017 or later is needed" | |||||
| # endif | |||||
| # define LOL_FEATURE_CXX11_TEMPLATE_ALIASES 1 | |||||
| # define LOL_FEATURE_CXX11_ISNAN 1 | |||||
| # define LOL_FEATURE_CXX11_NULLPTR 1 | |||||
| # define LOL_FEATURE_CXX11_SFINAE_FOR_CTORS 1 | |||||
| # define LOL_FEATURE_CXX11_INHERIT_CONSTRUCTORS 1 | |||||
| #endif | |||||
| /* | |||||
| * Define some attribute macros. | |||||
| */ | |||||
| #ifdef __GNUC__ | |||||
| # define LOL_ATTR_FORMAT(n, p) __attribute__((format(printf, n, p))) | |||||
| #else | |||||
| # define LOL_ATTR_FORMAT(n, p) | |||||
| #endif | |||||
| #if defined(_WIN32) | |||||
| # define LOL_ATTR_STDCALL __stdcall | |||||
| #else | |||||
| # define LOL_ATTR_STDCALL /* */ | |||||
| #endif | |||||
| #ifdef LOL_FEATURE_CXX17_ATTRIBUTE_NODISCARD | |||||
| # define LOL_ATTR_NODISCARD [[nodiscard]] | |||||
| #else | |||||
| # define LOL_ATTR_NODISCARD /* */ | |||||
| #endif | |||||
| #ifdef LOL_FEATURE_CXX17_ATTRIBUTE_FALLTHROUGH | |||||
| # define LOL_ATTR_FALLTHROUGH [[fallthrough]]; | |||||
| #else | |||||
| # define LOL_ATTR_FALLTHROUGH /* */ | |||||
| #endif | |||||
| /* | |||||
| * Ensure we have ptrdiff_t. | |||||
| */ | |||||
| #include <cstddef> | |||||
| /* | |||||
| * Ensure we have nullptr. | |||||
| */ | |||||
| #if !LOL_FEATURE_CXX11_NULLPTR | |||||
| # if defined nullptr | |||||
| /* do nothing */ | |||||
| # elif defined __GNUC__ | |||||
| # define nullptr __null | |||||
| # else | |||||
| # include <cstddef> | |||||
| # define nullptr NULL | |||||
| # endif | |||||
| #endif | |||||
| /* | |||||
| * Ensure isnan() is present even on systems that don't define it, or | |||||
| * when -ffast-math is being used. | |||||
| */ | |||||
| #include <cmath> | |||||
| #if defined __FAST_MATH__ | |||||
| # undef isnan | |||||
| #endif | |||||
| #if !defined isnan && !LOL_FEATURE_CXX11_ISNAN | |||||
| # define isnan isnan | |||||
| # include <stdint.h> | |||||
| static inline int isnan(float f) | |||||
| { | |||||
| union { float f; uint32_t x; } u = { f }; | |||||
| return (u.x << 1) > 0xff000000u; | |||||
| } | |||||
| #endif | |||||
| // | |||||
| // Some feature test functions | |||||
| // | |||||
| namespace lol | |||||
| { | |||||
| extern bool has_threads(); | |||||
| // A handy endianness test function | |||||
| static inline bool is_big_endian() | |||||
| { | |||||
| union { int i; char c; } u; | |||||
| u.i = 1; | |||||
| return u.c == 0; | |||||
| } | |||||
| } | |||||
| // | |||||
| // Ensure CreateFile2() is available on Mingw | |||||
| // | |||||
| #if defined _WIN32 && !defined _MSC_VER && \ | |||||
| (!defined _WIN32_WINNT || _WIN32_WINNT < 0x0602) | |||||
| # undef _WIN32_WINNT | |||||
| # define _WIN32_WINNT 0x0602 | |||||
| #endif | |||||
| /* XXX: workaround for X11 headers that try to #define these */ | |||||
| #undef Always | |||||
| #define Always Always | |||||
| #undef None | |||||
| #define None None | |||||
| @@ -1 +1 @@ | |||||
| Subproject commit e1ef913daa492bc03b233824aae71f2ee351fb21 | |||||
| Subproject commit f0b8cfc6f232b949c489f66479b7fc65c2c34891 | |||||
| @@ -31,7 +31,7 @@ liblol_core_headers = \ | |||||
| lol/lua.h \ | lol/lua.h \ | ||||
| \ | \ | ||||
| lol/base/all.h \ | lol/base/all.h \ | ||||
| lol/base/avl_tree.h ../legacy/features.h lol/base/tuple.h lol/base/types.h \ | |||||
| lol/base/avl_tree.h lol/base/tuple.h lol/base/types.h \ | |||||
| lol/base/array.h lol/base/assert.h lol/base/map.h lol/base/enum.h \ | lol/base/array.h lol/base/assert.h lol/base/map.h lol/base/enum.h \ | ||||
| lol/base/log.h \ | lol/base/log.h \ | ||||
| \ | \ | ||||
| @@ -89,7 +89,7 @@ liblol_core_sources = \ | |||||
| easymesh/shinydebuglighting.lolfx easymesh/shinydebugnormal.lolfx \ | easymesh/shinydebuglighting.lolfx easymesh/shinydebugnormal.lolfx \ | ||||
| easymesh/shinydebugUV.lolfx easymesh/shiny_SK.lolfx \ | easymesh/shinydebugUV.lolfx easymesh/shiny_SK.lolfx \ | ||||
| \ | \ | ||||
| base/assert.cpp base/features.cpp base/log.cpp base/string.cpp \ | |||||
| base/assert.cpp base/log.cpp base/string.cpp \ | |||||
| \ | \ | ||||
| math/half.cpp \ | math/half.cpp \ | ||||
| math/geometry.cpp \ | math/geometry.cpp \ | ||||
| @@ -1,30 +0,0 @@ | |||||
| // | |||||
| // Lol Engine | |||||
| // | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | |||||
| // Lol Engine is free software. It comes without any warranty, to | |||||
| // the extent permitted by applicable law. You can redistribute it | |||||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||||
| // See http://www.wtfpl.net/ for more details. | |||||
| // | |||||
| #include <lol/engine-internal.h> | |||||
| namespace lol | |||||
| { | |||||
| bool has_threads() | |||||
| { | |||||
| static bool const disable_threads = sys::getenv("LOL_NOTHREADS").size() > 0; | |||||
| #if defined __EMSCRIPTEN__ && !defined __EMSCRIPTEN_PTHREADS__ | |||||
| // For some reason hardware_concurrency() will return the actual number | |||||
| // of threads/cores even though the system cannot spawn threads. | |||||
| return false; | |||||
| #endif | |||||
| return !disable_threads && std::thread::hardware_concurrency() > 1; | |||||
| } | |||||
| } // namespace lol | |||||
| @@ -30,8 +30,8 @@ class ticker_data | |||||
| public: | public: | ||||
| ticker_data() | ticker_data() | ||||
| { | { | ||||
| msg::debug("platform %s threads\n", has_threads() ? "has" : "has no"); | |||||
| if (has_threads()) | |||||
| msg::debug("platform %s threads\n", thread::has_threads() ? "has" : "has no"); | |||||
| if (thread::has_threads()) | |||||
| { | { | ||||
| gamethread = std::make_unique<thread>(std::bind(&ticker_data::GameThreadMain, this)); | gamethread = std::make_unique<thread>(std::bind(&ticker_data::GameThreadMain, this)); | ||||
| drawtick.push(1); | drawtick.push(1); | ||||
| @@ -48,7 +48,7 @@ public: | |||||
| "still %d autoreleased entities\n", DEPRECATED_m_autolist.count()); | "still %d autoreleased entities\n", DEPRECATED_m_autolist.count()); | ||||
| msg::debug("%d frames required to quit\n", m_frame - m_quitframe); | msg::debug("%d frames required to quit\n", m_frame - m_quitframe); | ||||
| if (has_threads()) | |||||
| if (thread::has_threads()) | |||||
| { | { | ||||
| gametick.push(0); | gametick.push(0); | ||||
| disktick.push(0); | disktick.push(0); | ||||
| @@ -570,7 +570,7 @@ void ticker::teardown() | |||||
| void ticker::tick_draw() | void ticker::tick_draw() | ||||
| { | { | ||||
| if (has_threads()) | |||||
| if (thread::has_threads()) | |||||
| { | { | ||||
| int n = data->drawtick.pop(); | int n = data->drawtick.pop(); | ||||
| if (n == 0) | if (n == 0) | ||||
| @@ -584,7 +584,7 @@ void ticker::tick_draw() | |||||
| Profiler::Start(Profiler::STAT_TICK_BLIT); | Profiler::Start(Profiler::STAT_TICK_BLIT); | ||||
| /* Signal game thread that it can carry on */ | /* Signal game thread that it can carry on */ | ||||
| if (has_threads()) | |||||
| if (thread::has_threads()) | |||||
| data->gametick.push(1); | data->gametick.push(1); | ||||
| else | else | ||||
| ticker_data::DiskThreadTick(); | ticker_data::DiskThreadTick(); | ||||
| @@ -14,6 +14,12 @@ | |||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| #if defined(_WIN32) | |||||
| # define attr_stdcall __stdcall | |||||
| #else | |||||
| # define attr_stdcall /* */ | |||||
| #endif | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -49,7 +55,7 @@ static std::map<GLenum, char const *> gl_dbg_severity_to_str | |||||
| { GL_DEBUG_SEVERITY_NOTIFICATION, "notification" }, | { GL_DEBUG_SEVERITY_NOTIFICATION, "notification" }, | ||||
| }; | }; | ||||
| static void LOL_ATTR_STDCALL | |||||
| static void attr_stdcall | |||||
| gl_debug(GLenum source, GLenum type, GLuint id, | gl_debug(GLenum source, GLenum type, GLuint id, | ||||
| GLenum severity, GLsizei length, | GLenum severity, GLsizei length, | ||||
| const GLchar *message, const void *user_param) | const GLchar *message, const void *user_param) | ||||
| @@ -75,7 +81,7 @@ static void LOL_ATTR_STDCALL | |||||
| } | } | ||||
| #if defined LOL_USE_GLEW && !defined __APPLE__ | #if defined LOL_USE_GLEW && !defined __APPLE__ | ||||
| static void LOL_ATTR_STDCALL | |||||
| static void attr_stdcall | |||||
| gl_debug_amd(GLuint id, GLenum category, GLenum severity, | gl_debug_amd(GLuint id, GLenum category, GLenum severity, | ||||
| GLsizei length, const GLchar* message, | GLsizei length, const GLchar* message, | ||||
| GLvoid* user_param) | GLvoid* user_param) | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -991,8 +991,8 @@ std::string ShaderBuilder::Build() | |||||
| //Added shader variables | //Added shader variables | ||||
| for (int var = 0; var < ShaderVariable::InOut; var++) | for (int var = 0; var < ShaderVariable::InOut; var++) | ||||
| { | { | ||||
| array<std::string> all_keys = keys(m_parameters[prog][var]); | |||||
| if (all_keys.count()) | |||||
| auto all_keys = keys(m_parameters[prog][var]); | |||||
| if (all_keys.size()) | |||||
| { | { | ||||
| code += std::string("//- ") + Shader::GetVariableQualifier((ShaderVariable)var) + " ----\n"; | code += std::string("//- ") + Shader::GetVariableQualifier((ShaderVariable)var) + " ----\n"; | ||||
| for (auto const &key : all_keys) | for (auto const &key : all_keys) | ||||
| @@ -1028,14 +1028,9 @@ std::string ShaderBuilder::Build() | |||||
| //Add local variables | //Add local variables | ||||
| int var = ShaderVariable::InOut; | int var = ShaderVariable::InOut; | ||||
| array<std::string> all_keys = keys(m_parameters[prog][var]); | |||||
| auto all_keys = keys(m_parameters[prog][var]); | |||||
| for (auto const &key : all_keys) | for (auto const &key : all_keys) | ||||
| { | |||||
| if (all_keys.count()) | |||||
| { | |||||
| code += " " + m_parameters[prog][var][key] + " " + key + ";\n"; | |||||
| } | |||||
| } | |||||
| code += " " + m_parameters[prog][var][key] + " " + key + ";\n"; | |||||
| code += "\n"; | code += "\n"; | ||||
| //Add calls | //Add calls | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -83,7 +83,7 @@ ResourceCodecData *Imlib2ImageCodec::Load(std::string const &path) | |||||
| for (int i = 0; i < size.x * size.y; i++) | for (int i = 0; i < size.x * size.y; i++) | ||||
| { | { | ||||
| if (is_big_endian()) | |||||
| if (os::is_big_endian()) | |||||
| dstdata[i] = srcdata[i].argb; | dstdata[i] = srcdata[i].argb; | ||||
| else | else | ||||
| dstdata[i] = srcdata[i].bgra; | dstdata[i] = srcdata[i].bgra; | ||||
| @@ -113,7 +113,7 @@ bool Imlib2ImageCodec::Save(std::string const &path, ResourceCodecData *data) | |||||
| for (int i = 0; i < size.x * size.y; i++) | for (int i = 0; i < size.x * size.y; i++) | ||||
| { | { | ||||
| if (is_big_endian()) | |||||
| if (os::is_big_endian()) | |||||
| dstdata[i] = srcdata[i].argb; | dstdata[i] = srcdata[i].argb; | ||||
| else | else | ||||
| dstdata[i] = srcdata[i].bgra; | dstdata[i] = srcdata[i].bgra; | ||||
| @@ -106,7 +106,6 @@ | |||||
| <ClCompile Include="audio\sample.cpp" /> | <ClCompile Include="audio\sample.cpp" /> | ||||
| <ClCompile Include="camera.cpp" /> | <ClCompile Include="camera.cpp" /> | ||||
| <ClCompile Include="base\assert.cpp" /> | <ClCompile Include="base\assert.cpp" /> | ||||
| <ClCompile Include="base\features.cpp" /> | |||||
| <ClCompile Include="base\log.cpp" /> | <ClCompile Include="base\log.cpp" /> | ||||
| <ClCompile Include="base\string.cpp" /> | <ClCompile Include="base\string.cpp" /> | ||||
| <ClCompile Include="debug\fps.cpp" /> | <ClCompile Include="debug\fps.cpp" /> | ||||
| @@ -251,7 +250,6 @@ | |||||
| <ClInclude Include="lol\base\array.h" /> | <ClInclude Include="lol\base\array.h" /> | ||||
| <ClInclude Include="lol\base\assert.h" /> | <ClInclude Include="lol\base\assert.h" /> | ||||
| <ClInclude Include="lol\base\enum.h" /> | <ClInclude Include="lol\base\enum.h" /> | ||||
| <ClInclude Include="..\legacy\features.h" /> | |||||
| <ClInclude Include="lol\base\log.h" /> | <ClInclude Include="lol\base\log.h" /> | ||||
| <ClInclude Include="lol\base\map.h" /> | <ClInclude Include="lol\base\map.h" /> | ||||
| <ClInclude Include="lol\base\types.h" /> | <ClInclude Include="lol\base\types.h" /> | ||||
| @@ -14,9 +14,6 @@ | |||||
| <ClCompile Include="base\assert.cpp"> | <ClCompile Include="base\assert.cpp"> | ||||
| <Filter>base</Filter> | <Filter>base</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="base\features.cpp"> | |||||
| <Filter>base</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="base\log.cpp"> | <ClCompile Include="base\log.cpp"> | ||||
| <Filter>base</Filter> | <Filter>base</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| @@ -341,9 +338,6 @@ | |||||
| <ClInclude Include="lol\base\enum.h"> | <ClInclude Include="lol\base\enum.h"> | ||||
| <Filter>lol\base</Filter> | <Filter>lol\base</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\legacy\features.h"> | |||||
| <Filter>lol\base</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="lol\base\log.h"> | <ClInclude Include="lol\base\log.h"> | ||||
| <Filter>lol\base</Filter> | <Filter>lol\base</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2013 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -12,15 +12,12 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <lol/../../legacy/features.h> | |||||
| #include <lol/base/types.h> | #include <lol/base/types.h> | ||||
| #include <lol/base/log.h> | #include <lol/base/log.h> | ||||
| #include <lol/base/assert.h> | #include <lol/base/assert.h> | ||||
| #include <lol/base/tuple.h> | #include <lol/base/tuple.h> | ||||
| #include <lol/base/array.h> | #include <lol/base/array.h> | ||||
| #include <lol/base/avl_tree.h> | #include <lol/base/avl_tree.h> | ||||
| #include <lol/base/string.h> | |||||
| #include <lol/base/map.h> | |||||
| #include <lol/base/utils.h> | |||||
| #include <lol/base/enum.h> | #include <lol/base/enum.h> | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2013—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2013—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| @@ -50,7 +50,7 @@ enum class SortAlgorithm : uint8_t | |||||
| * m_count are allocated. The rest is uninitialised memory. | * m_count are allocated. The rest is uninitialised memory. | ||||
| */ | */ | ||||
| template<typename T, typename ARRAY> class LOL_ATTR_NODISCARD array_base | |||||
| template<typename T, typename ARRAY> class [[nodiscard]] array_base | |||||
| { | { | ||||
| public: | public: | ||||
| typedef T element_t; | typedef T element_t; | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -18,7 +18,9 @@ | |||||
| // The central logging system. | // The central logging system. | ||||
| // | // | ||||
| #include <stdint.h> | |||||
| #include <lol/base/private/features.h> | |||||
| #include <cstdint> | |||||
| #include <cstdarg> | #include <cstdarg> | ||||
| namespace lol | namespace lol | ||||
| @@ -27,10 +29,10 @@ namespace lol | |||||
| class msg | class msg | ||||
| { | { | ||||
| public: | public: | ||||
| static void debug(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
| static void info(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
| static void warn(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
| static void error(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
| static void debug(char const *format, ...) lol_attr_printf_format(1, 2); | |||||
| static void info(char const *format, ...) lol_attr_printf_format(1, 2); | |||||
| static void warn(char const *format, ...) lol_attr_printf_format(1, 2); | |||||
| static void error(char const *format, ...) lol_attr_printf_format(1, 2); | |||||
| enum class message_type | enum class message_type | ||||
| { | { | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -93,13 +93,13 @@ public: | |||||
| void SetWrap(WrapMode wrap_x, WrapMode wrap_y); | void SetWrap(WrapMode wrap_x, WrapMode wrap_y); | ||||
| /* Lock continuous arrays of pixels for writing */ | /* Lock continuous arrays of pixels for writing */ | ||||
| template<PixelFormat T> LOL_ATTR_NODISCARD typename PixelType<T>::type *lock(); | |||||
| LOL_ATTR_NODISCARD void *lock(); | |||||
| template<PixelFormat T> [[nodiscard]] typename PixelType<T>::type *lock(); | |||||
| [[nodiscard]] void *lock(); | |||||
| void unlock(void const *pixels); | void unlock(void const *pixels); | ||||
| /* Lock 2D arrays of pixels for writing */ | /* Lock 2D arrays of pixels for writing */ | ||||
| template<PixelFormat T> | template<PixelFormat T> | ||||
| LOL_ATTR_NODISCARD inline array2d<typename PixelType<T>::type> &lock2d() | |||||
| [[nodiscard]] inline array2d<typename PixelType<T>::type> &lock2d() | |||||
| { | { | ||||
| /* Hack: this indirection is needed because of a Visual Studio ICE */ | /* Hack: this indirection is needed because of a Visual Studio ICE */ | ||||
| return *(array2d<typename PixelType<T>::type> *)lock2d_helper(T); | return *(array2d<typename PixelType<T>::type> *)lock2d_helper(T); | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2013—2014 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2013—2014 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
| // © 2013—2014 Guillaume Bittoun <guillaume.bittoun@gmail.com> | // © 2013—2014 Guillaume Bittoun <guillaume.bittoun@gmail.com> | ||||
| // | // | ||||
| @@ -96,7 +96,7 @@ private: | |||||
| template<int N, typename... T> | template<int N, typename... T> | ||||
| class LOL_ATTR_NODISCARD arraynd : protected array<T...> | |||||
| class [[nodiscard]] arraynd : protected array<T...> | |||||
| { | { | ||||
| public: | public: | ||||
| typedef array<T...> super; | typedef array<T...> super; | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -37,7 +37,7 @@ namespace lol | |||||
| */ | */ | ||||
| template<unsigned int N = 16, typename T = uint32_t> | template<unsigned int N = 16, typename T = uint32_t> | ||||
| class LOL_ATTR_NODISCARD bigint | |||||
| class [[nodiscard]] bigint | |||||
| { | { | ||||
| static int const bits_per_digit = sizeof(T) * 8 - 1; | static int const bits_per_digit = sizeof(T) * 8 - 1; | ||||
| static T const digit_mask = ~((T)1 << bits_per_digit); | static T const digit_mask = ~((T)1 << bits_per_digit); | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -44,15 +44,15 @@ namespace lol | |||||
| // Mechanism to import standard cmath functions | // Mechanism to import standard cmath functions | ||||
| #define LOL_FORWARD_FP_1_ARG(f) \ | #define LOL_FORWARD_FP_1_ARG(f) \ | ||||
| template<typename T, typename T2 = T, typename DUMMY = LOL_T_FLOATING_POINT> \ | template<typename T, typename T2 = T, typename DUMMY = LOL_T_FLOATING_POINT> \ | ||||
| LOL_ATTR_NODISCARD static inline T2 f(T x) { return std::f(x); } | |||||
| [[nodiscard]] static inline T2 f(T x) { return std::f(x); } | |||||
| #define LOL_FORWARD_ARITH_2_ARGS(f) \ | #define LOL_FORWARD_ARITH_2_ARGS(f) \ | ||||
| template<typename T, typename T2 = T, typename DUMMY = LOL_T_ARITHMETIC> \ | template<typename T, typename T2 = T, typename DUMMY = LOL_T_ARITHMETIC> \ | ||||
| LOL_ATTR_NODISCARD static inline T2 f(T x, T y) { return std::f(x, y); } | |||||
| [[nodiscard]] static inline T2 f(T x, T y) { return std::f(x, y); } | |||||
| #define LOL_FORWARD_FP_2_ARGS(f) \ | #define LOL_FORWARD_FP_2_ARGS(f) \ | ||||
| template<typename T, typename T2 = T, typename DUMMY = LOL_T_FLOATING_POINT> \ | template<typename T, typename T2 = T, typename DUMMY = LOL_T_FLOATING_POINT> \ | ||||
| LOL_ATTR_NODISCARD static inline T2 f(T x, T y) { return std::f(x, y); } | |||||
| [[nodiscard]] static inline T2 f(T x, T y) { return std::f(x, y); } | |||||
| LOL_FORWARD_FP_1_ARG(sqrt) | LOL_FORWARD_FP_1_ARG(sqrt) | ||||
| LOL_FORWARD_FP_1_ARG(cbrt) | LOL_FORWARD_FP_1_ARG(cbrt) | ||||
| @@ -78,72 +78,72 @@ LOL_FORWARD_FP_1_ARG(round) | |||||
| // Our extensions | // Our extensions | ||||
| template<typename T, typename T2 = LOL_T_FLOATING_POINT> | template<typename T, typename T2 = LOL_T_FLOATING_POINT> | ||||
| LOL_ATTR_NODISCARD static inline T2 sincos(T x, T *s, T *c) | |||||
| [[nodiscard]] static inline T2 sincos(T x, T *s, T *c) | |||||
| { | { | ||||
| *s = std::sin(x); | *s = std::sin(x); | ||||
| *c = std::cos(x); | *c = std::cos(x); | ||||
| } | } | ||||
| // Inherited from GLSL | // Inherited from GLSL | ||||
| LOL_ATTR_NODISCARD static inline float degrees(float radians) | |||||
| [[nodiscard]] static inline float degrees(float radians) | |||||
| { | { | ||||
| return radians * (180.0f / F_PI); | return radians * (180.0f / F_PI); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD static inline double degrees(double radians) | |||||
| [[nodiscard]] static inline double degrees(double radians) | |||||
| { | { | ||||
| return radians * (180.0 / D_PI); | return radians * (180.0 / D_PI); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD static inline ldouble degrees(ldouble radians) | |||||
| [[nodiscard]] static inline ldouble degrees(ldouble radians) | |||||
| { | { | ||||
| return radians * (180.0L / LD_PI); | return radians * (180.0L / LD_PI); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD static inline float radians(float degrees) | |||||
| [[nodiscard]] static inline float radians(float degrees) | |||||
| { | { | ||||
| return degrees * (F_PI / 180.0f); | return degrees * (F_PI / 180.0f); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD static inline double radians(double degrees) | |||||
| [[nodiscard]] static inline double radians(double degrees) | |||||
| { | { | ||||
| return degrees * (D_PI / 180.0); | return degrees * (D_PI / 180.0); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD static inline ldouble radians(ldouble degrees) | |||||
| [[nodiscard]] static inline ldouble radians(ldouble degrees) | |||||
| { | { | ||||
| return degrees * (LD_PI / 180.0L); | return degrees * (LD_PI / 180.0L); | ||||
| } | } | ||||
| // The integer versions return floating point values. This avoids nasty | // The integer versions return floating point values. This avoids nasty | ||||
| // surprises when calling radians(180) instead of radians(180.0). | // surprises when calling radians(180) instead of radians(180.0). | ||||
| LOL_ATTR_NODISCARD static inline float degrees(int8_t x) { return degrees(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float degrees(uint8_t x) { return degrees(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float degrees(int16_t x) { return degrees(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float degrees(uint16_t x) { return degrees(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline double degrees(int32_t x) { return degrees(double(x)); } | |||||
| LOL_ATTR_NODISCARD static inline double degrees(uint32_t x) { return degrees(double(x)); } | |||||
| LOL_ATTR_NODISCARD static inline ldouble degrees(int64_t x) { return degrees(ldouble(x)); } | |||||
| LOL_ATTR_NODISCARD static inline ldouble degrees(uint64_t x) { return degrees(ldouble(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float radians(int8_t x) { return radians(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float radians(uint8_t x) { return radians(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float radians(int16_t x) { return radians(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline float radians(uint16_t x) { return radians(float(x)); } | |||||
| LOL_ATTR_NODISCARD static inline double radians(int32_t x) { return radians(double(x)); } | |||||
| LOL_ATTR_NODISCARD static inline double radians(uint32_t x) { return radians(double(x)); } | |||||
| LOL_ATTR_NODISCARD static inline ldouble radians(int64_t x) { return radians(ldouble(x)); } | |||||
| LOL_ATTR_NODISCARD static inline ldouble radians(uint64_t x) { return radians(ldouble(x)); } | |||||
| [[nodiscard]] static inline float degrees(int8_t x) { return degrees(float(x)); } | |||||
| [[nodiscard]] static inline float degrees(uint8_t x) { return degrees(float(x)); } | |||||
| [[nodiscard]] static inline float degrees(int16_t x) { return degrees(float(x)); } | |||||
| [[nodiscard]] static inline float degrees(uint16_t x) { return degrees(float(x)); } | |||||
| [[nodiscard]] static inline double degrees(int32_t x) { return degrees(double(x)); } | |||||
| [[nodiscard]] static inline double degrees(uint32_t x) { return degrees(double(x)); } | |||||
| [[nodiscard]] static inline ldouble degrees(int64_t x) { return degrees(ldouble(x)); } | |||||
| [[nodiscard]] static inline ldouble degrees(uint64_t x) { return degrees(ldouble(x)); } | |||||
| [[nodiscard]] static inline float radians(int8_t x) { return radians(float(x)); } | |||||
| [[nodiscard]] static inline float radians(uint8_t x) { return radians(float(x)); } | |||||
| [[nodiscard]] static inline float radians(int16_t x) { return radians(float(x)); } | |||||
| [[nodiscard]] static inline float radians(uint16_t x) { return radians(float(x)); } | |||||
| [[nodiscard]] static inline double radians(int32_t x) { return radians(double(x)); } | |||||
| [[nodiscard]] static inline double radians(uint32_t x) { return radians(double(x)); } | |||||
| [[nodiscard]] static inline ldouble radians(int64_t x) { return radians(ldouble(x)); } | |||||
| [[nodiscard]] static inline ldouble radians(uint64_t x) { return radians(ldouble(x)); } | |||||
| template<typename T, typename T2 = LOL_T_FLOATING_POINT> | template<typename T, typename T2 = LOL_T_FLOATING_POINT> | ||||
| LOL_ATTR_NODISCARD static inline T2 mix(T a, T b, T x) | |||||
| [[nodiscard]] static inline T2 mix(T a, T b, T x) | |||||
| { | { | ||||
| return a + (b - a) * x; | return a + (b - a) * x; | ||||
| } | } | ||||
| // Inherited from HLSL | // Inherited from HLSL | ||||
| template<typename T, typename T2 = LOL_T_FLOATING_POINT> | template<typename T, typename T2 = LOL_T_FLOATING_POINT> | ||||
| LOL_ATTR_NODISCARD static inline T2 lerp(T a, T b, T x) | |||||
| [[nodiscard]] static inline T2 lerp(T a, T b, T x) | |||||
| { | { | ||||
| return mix(a, b, x); | return mix(a, b, x); | ||||
| } | } | ||||
| @@ -151,35 +151,35 @@ LOL_ATTR_NODISCARD static inline T2 lerp(T a, T b, T x) | |||||
| // C++ doesn't define abs() or fmod() for all types; we add these for | // C++ doesn't define abs() or fmod() for all types; we add these for | ||||
| // convenience to avoid adding complexity to vector.h. | // convenience to avoid adding complexity to vector.h. | ||||
| template<typename T, typename T2 = LOL_T_SIGNED> | template<typename T, typename T2 = LOL_T_SIGNED> | ||||
| LOL_ATTR_NODISCARD static inline T2 abs(T x) { return std::abs(x); } | |||||
| [[nodiscard]] static inline T2 abs(T x) { return std::abs(x); } | |||||
| template<typename T, typename T2 = T, typename DUMMY = LOL_T_UNSIGNED> | template<typename T, typename T2 = T, typename DUMMY = LOL_T_UNSIGNED> | ||||
| LOL_ATTR_NODISCARD static inline T2 abs(T x) { return x; } | |||||
| [[nodiscard]] static inline T2 abs(T x) { return x; } | |||||
| template<typename T, typename T2 = LOL_T_INTEGRAL> | template<typename T, typename T2 = LOL_T_INTEGRAL> | ||||
| LOL_ATTR_NODISCARD static inline T2 fmod(T x, T y) { return x % y; } | |||||
| [[nodiscard]] static inline T2 fmod(T x, T y) { return x % y; } | |||||
| template<typename T, typename T2 = LOL_T_INTEGRAL> | template<typename T, typename T2 = LOL_T_INTEGRAL> | ||||
| LOL_ATTR_NODISCARD static inline T2 floor(T x) { return x; } | |||||
| [[nodiscard]] static inline T2 floor(T x) { return x; } | |||||
| template<typename T, typename T2 = LOL_T_INTEGRAL> | template<typename T, typename T2 = LOL_T_INTEGRAL> | ||||
| LOL_ATTR_NODISCARD static inline T2 ceil(T x) { return x; } | |||||
| [[nodiscard]] static inline T2 ceil(T x) { return x; } | |||||
| template<typename T, typename T2 = LOL_T_INTEGRAL> | template<typename T, typename T2 = LOL_T_INTEGRAL> | ||||
| LOL_ATTR_NODISCARD static inline T2 round(T x) { return x; } | |||||
| [[nodiscard]] static inline T2 round(T x) { return x; } | |||||
| template<typename T, typename T2 = LOL_T_ARITHMETIC> | template<typename T, typename T2 = LOL_T_ARITHMETIC> | ||||
| LOL_ATTR_NODISCARD static inline T2 sq(T x) { return x * x; } | |||||
| [[nodiscard]] static inline T2 sq(T x) { return x * x; } | |||||
| template<typename T, typename T2 = LOL_T_ARITHMETIC> | template<typename T, typename T2 = LOL_T_ARITHMETIC> | ||||
| LOL_ATTR_NODISCARD static inline T2 fract(T x) { return x - lol::floor(x); } | |||||
| [[nodiscard]] static inline T2 fract(T x) { return x - lol::floor(x); } | |||||
| template<typename T, typename T2 = LOL_T_ARITHMETIC> | template<typename T, typename T2 = LOL_T_ARITHMETIC> | ||||
| LOL_ATTR_NODISCARD static inline T2 clamp(T x, T y, T z) { return min(max(x, y), z); } | |||||
| [[nodiscard]] static inline T2 clamp(T x, T y, T z) { return min(max(x, y), z); } | |||||
| template<typename T, typename T2 = LOL_T_ARITHMETIC> | template<typename T, typename T2 = LOL_T_ARITHMETIC> | ||||
| LOL_ATTR_NODISCARD static inline T2 saturate(T x) { return clamp(x, (T)0, (T)1); } | |||||
| [[nodiscard]] static inline T2 saturate(T x) { return clamp(x, (T)0, (T)1); } | |||||
| template<typename T, typename T2 = LOL_T_ARITHMETIC> | template<typename T, typename T2 = LOL_T_ARITHMETIC> | ||||
| LOL_ATTR_NODISCARD static inline T2 gcd(T x, T y) { return y == (T)0 ? lol::abs(x) : lol::gcd(y, lol::fmod(x, y)); } | |||||
| [[nodiscard]] static inline T2 gcd(T x, T y) { return y == (T)0 ? lol::abs(x) : lol::gcd(y, lol::fmod(x, y)); } | |||||
| template<typename T, typename T2 = LOL_T_SIGNED> | template<typename T, typename T2 = LOL_T_SIGNED> | ||||
| LOL_ATTR_NODISCARD static inline T2 sign(T x) { return (T)(((T)0 < x) - (x < (T)0)); } | |||||
| [[nodiscard]] static inline T2 sign(T x) { return (T)(((T)0 < x) - (x < (T)0)); } | |||||
| template<typename T, typename T2 = T, typename DUMMY = LOL_T_UNSIGNED> | template<typename T, typename T2 = T, typename DUMMY = LOL_T_UNSIGNED> | ||||
| LOL_ATTR_NODISCARD static inline T2 sign(T x) { return (T)((T)0 < x); } | |||||
| [[nodiscard]] static inline T2 sign(T x) { return (T)((T)0 < x); } | |||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2010—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2010—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| @@ -91,7 +91,7 @@ T_(box_t<, C_ 4>, box4) | |||||
| #undef T_ | #undef T_ | ||||
| template<typename T, int N> | template<typename T, int N> | ||||
| struct LOL_ATTR_NODISCARD box_t | |||||
| struct [[nodiscard]] box_t | |||||
| { | { | ||||
| inline box_t() | inline box_t() | ||||
| : aa(vec_t<T, N>(T(0))), | : aa(vec_t<T, N>(T(0))), | ||||
| @@ -154,12 +154,12 @@ struct LOL_ATTR_NODISCARD box_t | |||||
| return *this = *this * s; | return *this = *this * s; | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD bool operator ==(box_t<T,N> const &box) const | |||||
| [[nodiscard]] bool operator ==(box_t<T,N> const &box) const | |||||
| { | { | ||||
| return aa == box.aa && bb == box.bb; | return aa == box.aa && bb == box.bb; | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD bool operator !=(box_t<T,N> const &box) const | |||||
| [[nodiscard]] bool operator !=(box_t<T,N> const &box) const | |||||
| { | { | ||||
| return aa != box.aa || bb != box.bb; | return aa != box.aa || bb != box.bb; | ||||
| } | } | ||||
| @@ -193,19 +193,19 @@ private: | |||||
| float Minus() const; | float Minus() const; | ||||
| float Plus() const; | float Plus() const; | ||||
| public: | public: | ||||
| LOL_ATTR_NODISCARD bool operator==(float value) const; | |||||
| LOL_ATTR_NODISCARD bool operator!=(float value) const; | |||||
| LOL_ATTR_NODISCARD bool operator<(float value) const; | |||||
| LOL_ATTR_NODISCARD bool operator<=(float value) const; | |||||
| LOL_ATTR_NODISCARD bool operator>(float value) const; | |||||
| LOL_ATTR_NODISCARD bool operator>=(float value) const; | |||||
| [[nodiscard]] bool operator==(float value) const; | |||||
| [[nodiscard]] bool operator!=(float value) const; | |||||
| [[nodiscard]] bool operator<(float value) const; | |||||
| [[nodiscard]] bool operator<=(float value) const; | |||||
| [[nodiscard]] bool operator>(float value) const; | |||||
| [[nodiscard]] bool operator>=(float value) const; | |||||
| }; | }; | ||||
| LOL_ATTR_NODISCARD bool operator==(float value, const TestEpsilon& epsilon); | |||||
| LOL_ATTR_NODISCARD bool operator!=(float value, const TestEpsilon& epsilon); | |||||
| LOL_ATTR_NODISCARD bool operator<(float value, const TestEpsilon& epsilon); | |||||
| LOL_ATTR_NODISCARD bool operator<=(float value, const TestEpsilon& epsilon); | |||||
| LOL_ATTR_NODISCARD bool operator>(float value, const TestEpsilon& epsilon); | |||||
| LOL_ATTR_NODISCARD bool operator>=(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator==(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator!=(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator<(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator<=(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator>(float value, const TestEpsilon& epsilon); | |||||
| [[nodiscard]] bool operator>=(float value, const TestEpsilon& epsilon); | |||||
| //-- | //-- | ||||
| static inline bool TestAABBVsAABB(box2 const &b1, box2 const &b2) | static inline bool TestAABBVsAABB(box2 const &b1, box2 const &b2) | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -32,7 +32,7 @@ namespace lol | |||||
| namespace half_ops { struct base {}; } | namespace half_ops { struct base {}; } | ||||
| class LOL_ATTR_NODISCARD half | |||||
| class [[nodiscard]] half | |||||
| : half_ops::base | : half_ops::base | ||||
| { | { | ||||
| public: | public: | ||||
| @@ -44,22 +44,22 @@ public: | |||||
| inline half(double f) { *this = makefast((float)f); } | inline half(double f) { *this = makefast((float)f); } | ||||
| inline half(ldouble f) { *this = makefast((float)f); } | inline half(ldouble f) { *this = makefast((float)f); } | ||||
| LOL_ATTR_NODISCARD inline int is_nan() const | |||||
| [[nodiscard]] inline int is_nan() const | |||||
| { | { | ||||
| return ((bits & 0x7c00u) == 0x7c00u) && (bits & 0x03ffu); | return ((bits & 0x7c00u) == 0x7c00u) && (bits & 0x03ffu); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD inline int is_finite() const | |||||
| [[nodiscard]] inline int is_finite() const | |||||
| { | { | ||||
| return (bits & 0x7c00u) != 0x7c00u; | return (bits & 0x7c00u) != 0x7c00u; | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD inline int is_inf() const | |||||
| [[nodiscard]] inline int is_inf() const | |||||
| { | { | ||||
| return (uint16_t)(bits << 1) == (0x7c00u << 1); | return (uint16_t)(bits << 1) == (0x7c00u << 1); | ||||
| } | } | ||||
| LOL_ATTR_NODISCARD inline int is_normal() const | |||||
| [[nodiscard]] inline int is_normal() const | |||||
| { | { | ||||
| return (is_finite() && (bits & 0x7c00u)) || ((bits & 0x7fffu) == 0); | return (is_finite() && (bits & 0x7c00u)) || ((bits & 0x7fffu) == 0); | ||||
| } | } | ||||
| @@ -69,33 +69,33 @@ public: | |||||
| inline half &operator =(float f) { return *this = makefast(f); } | inline half &operator =(float f) { return *this = makefast(f); } | ||||
| inline half &operator =(double f) { return *this = makefast((float)f); } | inline half &operator =(double f) { return *this = makefast((float)f); } | ||||
| inline half &operator =(ldouble f) { return *this = makefast((float)f); } | inline half &operator =(ldouble f) { return *this = makefast((float)f); } | ||||
| LOL_ATTR_NODISCARD inline operator int8_t() const { return (int8_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator uint8_t() const { return (uint8_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator int16_t() const { return (int16_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator uint16_t() const { return (uint16_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator int32_t() const { return (int32_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator uint32_t() const { return (uint32_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator int64_t() const { return (int64_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD inline operator uint64_t() const { return (uint64_t)(float)*this; } | |||||
| LOL_ATTR_NODISCARD operator float() const; | |||||
| LOL_ATTR_NODISCARD inline operator double() const { return (float)(*this); } | |||||
| LOL_ATTR_NODISCARD inline operator ldouble() const { return (float)(*this); } | |||||
| [[nodiscard]] inline operator int8_t() const { return (int8_t)(float)*this; } | |||||
| [[nodiscard]] inline operator uint8_t() const { return (uint8_t)(float)*this; } | |||||
| [[nodiscard]] inline operator int16_t() const { return (int16_t)(float)*this; } | |||||
| [[nodiscard]] inline operator uint16_t() const { return (uint16_t)(float)*this; } | |||||
| [[nodiscard]] inline operator int32_t() const { return (int32_t)(float)*this; } | |||||
| [[nodiscard]] inline operator uint32_t() const { return (uint32_t)(float)*this; } | |||||
| [[nodiscard]] inline operator int64_t() const { return (int64_t)(float)*this; } | |||||
| [[nodiscard]] inline operator uint64_t() const { return (uint64_t)(float)*this; } | |||||
| [[nodiscard]] operator float() const; | |||||
| [[nodiscard]] inline operator double() const { return (float)(*this); } | |||||
| [[nodiscard]] inline operator ldouble() const { return (float)(*this); } | |||||
| /* Array conversions */ | /* Array conversions */ | ||||
| static void convert(half *dst, float const *src, size_t nelem); | static void convert(half *dst, float const *src, size_t nelem); | ||||
| static void convert(float *dst, half const *src, size_t nelem); | static void convert(float *dst, half const *src, size_t nelem); | ||||
| /* Operations */ | /* Operations */ | ||||
| LOL_ATTR_NODISCARD bool operator ==(half x) const { return (float)*this == (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator !=(half x) const { return (float)*this != (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator <(half x) const { return (float)*this < (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator >(half x) const { return (float)*this > (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator <=(half x) const { return (float)*this <= (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator >=(half x) const { return (float)*this >= (float)x; } | |||||
| [[nodiscard]] bool operator ==(half x) const { return (float)*this == (float)x; } | |||||
| [[nodiscard]] bool operator !=(half x) const { return (float)*this != (float)x; } | |||||
| [[nodiscard]] bool operator <(half x) const { return (float)*this < (float)x; } | |||||
| [[nodiscard]] bool operator >(half x) const { return (float)*this > (float)x; } | |||||
| [[nodiscard]] bool operator <=(half x) const { return (float)*this <= (float)x; } | |||||
| [[nodiscard]] bool operator >=(half x) const { return (float)*this >= (float)x; } | |||||
| LOL_ATTR_NODISCARD bool operator !() const { return !(bits & 0x7fffu); } | |||||
| LOL_ATTR_NODISCARD operator bool() const { return !!*this; } | |||||
| [[nodiscard]] bool operator !() const { return !(bits & 0x7fffu); } | |||||
| [[nodiscard]] operator bool() const { return !!*this; } | |||||
| inline half operator -() const { return makebits(bits ^ 0x8000u); } | inline half operator -() const { return makebits(bits ^ 0x8000u); } | ||||
| inline half operator +() const { return *this; } | inline half operator +() const { return *this; } | ||||
| @@ -104,10 +104,10 @@ public: | |||||
| inline half &operator *=(half h) { return (*this = (half)(*this * h)); } | inline half &operator *=(half h) { return (*this = (half)(*this * h)); } | ||||
| inline half &operator /=(half h) { return (*this = (half)(*this / h)); } | inline half &operator /=(half h) { return (*this = (half)(*this / h)); } | ||||
| LOL_ATTR_NODISCARD inline float operator +(half h) const { return (float)*this + (float)h; } | |||||
| LOL_ATTR_NODISCARD inline float operator -(half h) const { return (float)*this - (float)h; } | |||||
| LOL_ATTR_NODISCARD inline float operator *(half h) const { return (float)*this * (float)h; } | |||||
| LOL_ATTR_NODISCARD inline float operator /(half h) const { return (float)*this / (float)h; } | |||||
| [[nodiscard]] inline float operator +(half h) const { return (float)*this + (float)h; } | |||||
| [[nodiscard]] inline float operator -(half h) const { return (float)*this - (float)h; } | |||||
| [[nodiscard]] inline float operator *(half h) const { return (float)*this * (float)h; } | |||||
| [[nodiscard]] inline float operator /(half h) const { return (float)*this / (float)h; } | |||||
| /* Factories */ | /* Factories */ | ||||
| static half makefast(float f); | static half makefast(float f); | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| // the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
| @@ -201,7 +201,7 @@ void SdlInput::tick(float seconds) | |||||
| sc2 = input::key::SC_NumLockClearStatus; | sc2 = input::key::SC_NumLockClearStatus; | ||||
| keyboard->internal_set_key(sc2, !keyboard->key(sc2)); | keyboard->internal_set_key(sc2, !keyboard->key(sc2)); | ||||
| } | } | ||||
| LOL_ATTR_FALLTHROUGH | |||||
| [[fallthrough]]; | |||||
| default: | default: | ||||
| // Set key updates the corresponding key | // Set key updates the corresponding key | ||||
| keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | keyboard->internal_set_key(sc, event.type == SDL_KEYDOWN); | ||||
| @@ -1,7 +1,7 @@ | |||||
| // | // | ||||
| // Lol Engine | // Lol Engine | ||||
| // | // | ||||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
| // Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
| // © 2012—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2012—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
| // | // | ||||
| // Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
| @@ -18,7 +18,7 @@ | |||||
| // ----------------------------------- | // ----------------------------------- | ||||
| // | // | ||||
| #include <lol/base/string.h> | |||||
| #include <lol/base/utils.h> | |||||
| #include <string> | #include <string> | ||||