Fix strcmp not using 'if constexpr' and add strncmp
This commit is contained in:
parent
da5eb13d94
commit
588835d80a
@ -99,15 +99,39 @@ namespace rexy{
|
|||||||
template<class T>
|
template<class T>
|
||||||
constexpr int strcmp(const T* l, const T* r)noexcept{
|
constexpr int strcmp(const T* l, const T* r)noexcept{
|
||||||
if(!std::is_constant_evaluated()){
|
if(!std::is_constant_evaluated()){
|
||||||
if(std::is_same_v<std::remove_cvref_t<T>,char>){
|
if constexpr(std::is_same_v<std::remove_cvref_t<T>,char>){
|
||||||
return std::strcmp(l, r);
|
return std::strcmp(l, r);
|
||||||
}else if(std::is_same_v<std::remove_cvref_t<T>,wchar_t>){
|
}else if constexpr(std::is_same_v<std::remove_cvref_t<T>,wchar_t>){
|
||||||
return std::wcscmp(l, r);
|
return std::wcscmp(l, r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(;*l == *r && *l;++l, ++r);
|
for(;*l == *r && *l;++l, ++r);
|
||||||
return *l - *r;
|
return *l - *r;
|
||||||
}
|
}
|
||||||
|
template<class T>
|
||||||
|
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<std::remove_cvref_t<T>,char>){
|
||||||
|
return std::strncmp(l, r, max);
|
||||||
|
}else if constexpr (std::is_same_v<std::remove_cvref_t<T>,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<class T, class Compare>
|
||||||
|
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<std::remove_cvref_t<T>,char>){
|
||||||
|
return std::strncmp(l, r, max);
|
||||||
|
}else if constexpr (std::is_same_v<std::remove_cvref_t<T>,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<class T, class Compare>
|
template<class T, class Compare>
|
||||||
constexpr int strcmp(const T* l, const T* r, Compare cmp)noexcept{
|
constexpr int strcmp(const T* l, const T* r, Compare cmp)noexcept{
|
||||||
for(;cmp(*l, *r) && *l;++l, ++r);
|
for(;cmp(*l, *r) && *l;++l, ++r);
|
||||||
@ -142,6 +166,11 @@ namespace rexy{
|
|||||||
for(;cmp(*l, *r) && *l;++l, ++r);
|
for(;cmp(*l, *r) && *l;++l, ++r);
|
||||||
return *l - *r;
|
return *l - *r;
|
||||||
}
|
}
|
||||||
|
template<class T>
|
||||||
|
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){
|
constexpr void memcpy(void* l, const void* r, size_t n){
|
||||||
char* ld = static_cast<char*>(l);
|
char* ld = static_cast<char*>(l);
|
||||||
const char* rd = static_cast<const char*>(r);
|
const char* rd = static_cast<const char*>(r);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user