Merge branch 'master' of ssh://rexy712-server:1995/var/git/repos/rexy712/rexylib
This commit is contained in:
commit
d90be8e1a8
@ -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);
|
||||||
|
|||||||
@ -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];}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user