Merge branch 'master' of ssh://rexy712-server:1995/var/git/repos/rexy712/rexylib

This commit is contained in:
rexy712 2020-08-11 13:34:43 -07:00
commit d90be8e1a8
2 changed files with 37 additions and 69 deletions

View File

@ -80,30 +80,21 @@ namespace rexy::cx{
{ {
return cmp(l, r) ? l : r; return cmp(l, r) ? l : r;
} }
constexpr size_t strlen(const char* c)noexcept{ template<class T>
constexpr size_t strlen(const T* c)noexcept{
size_t i = 0; size_t i = 0;
for(;c[i];++i); for(;c[i];++i);
return i; return i;
} }
constexpr size_t strlen(const wchar_t* c)noexcept{ template<class T>
size_t i = 0; constexpr int strcmp(const T* l, const T* r)noexcept{
for(;c[i];++i);
return i;
}
constexpr size_t strlen(const char16_t* c)noexcept{
size_t i = 0;
for(;c[i];++i);
return i;
}
constexpr size_t strlen(const char32_t* c)noexcept{
size_t i = 0;
for(;c[i];++i);
return i;
}
constexpr int strcmp(const char* l, const char* r)noexcept{
using uchar = unsigned char;
for(;*l == *r && *l;++l, ++r); for(;*l == *r && *l;++l, ++r);
return (static_cast<uchar>(*l)) - (static_cast<uchar>(*r)); return *l - *r;
}
template<class T, class Compare>
constexpr int strcmp(const T* l, const T* r, Compare cmp)noexcept{
for(;cmp(*l, *r) && *l;++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);

View File

@ -77,68 +77,42 @@ namespace rexy{
sdata s; sdata s;
constexpr combine_data(void)noexcept: constexpr combine_data(void)noexcept:
l(){} l(){}
}m__data; }m_data;
pointer m_raw = m__data.s.data; pointer m_raw = m_data.s.data;
protected: protected:
constexpr void set_islong_flag(bool b){ constexpr void set_islong_flag(bool b){
if(b) if(b)
m__data.l.islong = b; m_data.l.islong = b;
else else
m__data.s.islong = b; m_data.s.islong = b;
} }
constexpr bool islong(void)const{ constexpr bool islong(void)const{
//common standard layout union member subsequence, never undefined behavior //common standard layout union member subsequence, never undefined behavior
return m__data.l.islong; return m_data.l.islong;
} }
constexpr pointer set_short_ptr(void){ constexpr pointer set_short_ptr(void){
set_islong_flag(false); set_islong_flag(false);
return m_raw = m__data.s.data; return m_raw = m_data.s.data;
} }
constexpr pointer set_long_ptr(pointer ptr){ constexpr pointer set_long_ptr(pointer ptr){
set_islong_flag(true); set_islong_flag(true);
return m_raw = ptr; return m_raw = ptr;
} }
constexpr pointer get_long_ptr(void){ constexpr pointer get_long_ptr(void){return m_raw;}
return m_raw; constexpr pointer get_short_ptr(void){return m_raw;}
} constexpr const_pointer get_long_ptr(void)const{return m_raw;}
constexpr pointer get_short_ptr(void){ constexpr const_pointer get_short_ptr(void)const{return m_raw;}
return m_raw; constexpr pointer get_pointer(void){return m_raw;}
} constexpr const_pointer get_pointer(void)const{return m_raw;}
constexpr const_pointer get_long_ptr(void)const{ constexpr void set_long_length(size_type len){m_data.l.length = len;}
return m_raw; constexpr size_type get_long_length(void)const{return m_data.l.length;}
} constexpr void set_short_length(size_type len){m_data.s.length = static_cast<unsigned char>(len);}
constexpr const_pointer get_short_ptr(void)const{ constexpr size_type get_short_length(void)const{return m_data.s.length;}
return m_raw; constexpr void set_long_capacity(size_type cap){m_data.l.capacity = cap;}
}
constexpr pointer get_pointer(void){
return m_raw;
}
constexpr const_pointer get_pointer(void)const{
return m_raw;
}
constexpr void set_long_length(size_type len){
m__data.l.length = len;
}
constexpr size_type get_long_length(void)const{
return m__data.l.length;
}
constexpr void set_short_length(size_type len){
m__data.s.length = static_cast<unsigned char>(len);
}
constexpr size_type get_short_length(void)const{
return m__data.s.length;
}
constexpr void set_long_capacity(size_type cap){
m__data.l.capacity = cap;
}
constexpr void set_short_capacity(size_type){} constexpr void set_short_capacity(size_type){}
constexpr size_type get_long_capacity(void)const{ constexpr size_type get_long_capacity(void)const{return m_data.l.capacity;}
return m__data.l.capacity; constexpr size_type get_short_capacity(void)const{return MAX_SHORT_LEN;}
}
constexpr size_type get_short_capacity(void)const{
return MAX_SHORT_LEN;
}
constexpr void set_length(size_type s){ constexpr void set_length(size_type s){
if(islong()) if(islong())
set_long_length(s); set_long_length(s);
@ -169,22 +143,22 @@ namespace rexy{
string_base(data, len, len){} string_base(data, len, len){}
//Copy ctor, copy length+capacity+short string, not long string value //Copy ctor, copy length+capacity+short string, not long string value
constexpr string_base(const string_base& s)noexcept: constexpr string_base(const string_base& s)noexcept:
m__data(s.m__data){} m_data(s.m_data){}
constexpr string_base(string_base&& s)noexcept: constexpr string_base(string_base&& s)noexcept:
m__data(std::move(s.m__data)), m_data(std::move(s.m_data)),
m_raw(s.islong() ? s.m_raw : m__data.s.data) m_raw(s.islong() ? s.m_raw : m_data.s.data)
{ {
s.set_islong_flag(false); s.set_islong_flag(false);
} }
~string_base(void)noexcept = default; ~string_base(void)noexcept = default;
constexpr string_base& operator=(string_base&& s)noexcept{ constexpr string_base& operator=(string_base&& s)noexcept{
std::swap(m__data, s.m__data); std::swap(m_data, s.m_data);
if(this->islong()) if(this->islong())
std::swap(m_raw, s.m_raw); std::swap(m_raw, s.m_raw);
else{ else{
s.m_raw = m_raw; s.m_raw = m_raw;
m_raw = m__data.s.data; m_raw = m_data.s.data;
} }
return *this; return *this;
} }
@ -213,6 +187,9 @@ namespace rexy{
//true if m_data is not empty //true if m_data is not empty
constexpr bool valid(void)const noexcept{return length() > 0;} constexpr bool valid(void)const noexcept{return length() > 0;}
constexpr int compare(const string_base& s)const{return cx::strcmp(get(), s.get());}
constexpr int compare(const_pointer s)const{return cx::strcmp(get(), s);}
constexpr reference operator[](size_type i)noexcept{return get_pointer()[i];} constexpr reference operator[](size_type i)noexcept{return get_pointer()[i];}
constexpr const_reference operator[](size_type i)const noexcept{return get_pointer()[i];} constexpr const_reference operator[](size_type i)const noexcept{return get_pointer()[i];}