From 588835d80a10ee9de5c4f4c21a21bf7c5b510a00 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sun, 19 Jun 2022 11:27:26 -0700 Subject: [PATCH] Fix strcmp not using 'if constexpr' and add strncmp --- include/rexy/utility.hpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/include/rexy/utility.hpp b/include/rexy/utility.hpp index 3e227ab..4065b87 100644 --- a/include/rexy/utility.hpp +++ b/include/rexy/utility.hpp @@ -99,15 +99,39 @@ namespace rexy{ template constexpr int strcmp(const T* l, const T* r)noexcept{ if(!std::is_constant_evaluated()){ - if(std::is_same_v,char>){ + if constexpr(std::is_same_v,char>){ return std::strcmp(l, r); - }else if(std::is_same_v,wchar_t>){ + }else if constexpr(std::is_same_v,wchar_t>){ return std::wcscmp(l, r); } } for(;*l == *r && *l;++l, ++r); return *l - *r; } + template + constexpr int strncmp(const T* l, const T* r, std::size_t max)noexcept{ + if(!std::is_constant_evaluated()){ + if constexpr(std::is_same_v,char>){ + return std::strncmp(l, r, max); + }else if constexpr (std::is_same_v,wchar_t>){ + return std::wcsncmp(l, r, max); + } + } + for(std::size_t i = 1;*l == *r && *l && i < max;++i, ++l, ++r); + return *l - *r; + } + template + constexpr int strncmp(const T* l, const T* r, std::size_t max, Compare cmp)noexcept{ + if(!std::is_constant_evaluated()){ + if constexpr(std::is_same_v,char>){ + return std::strncmp(l, r, max); + }else if constexpr (std::is_same_v,wchar_t>){ + return std::wcsncmp(l, r, max); + } + } + for(std::size_t i = 1;cmp(l, r) && *l && i < max;++i, ++l, ++r); + return *l - *r; + } template constexpr int strcmp(const T* l, const T* r, Compare cmp)noexcept{ for(;cmp(*l, *r) && *l;++l, ++r); @@ -142,6 +166,11 @@ namespace rexy{ for(;cmp(*l, *r) && *l;++l, ++r); return *l - *r; } + template + constexpr int strncmp(const T* l, const T* r, std::size_t max)noexcept{ + for(std::size_t i = 0;*l == *r && *l && i < max;++i, ++l, ++r); + return *l - *r; + } constexpr void memcpy(void* l, const void* r, size_t n){ char* ld = static_cast(l); const char* rd = static_cast(r);