From 05e2fa2406a6ce819ffc493753e4a11daa9358ce Mon Sep 17 00:00:00 2001 From: rexy712 Date: Thu, 6 Aug 2020 15:27:56 -0700 Subject: [PATCH 1/2] Add compare() member to string_base --- include/rexy/cx/utility.hpp | 29 ++++++++++------------------- include/rexy/string_base.hpp | 3 +++ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/include/rexy/cx/utility.hpp b/include/rexy/cx/utility.hpp index 4dcaa97..ac366da 100644 --- a/include/rexy/cx/utility.hpp +++ b/include/rexy/cx/utility.hpp @@ -80,30 +80,21 @@ namespace rexy::cx{ { return cmp(l, r) ? l : r; } - constexpr size_t strlen(const char* c)noexcept{ + template + constexpr size_t strlen(const T* c)noexcept{ size_t i = 0; for(;c[i];++i); return i; } - constexpr size_t strlen(const wchar_t* c)noexcept{ - size_t i = 0; - 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; + template + constexpr int strcmp(const T* l, const T* r)noexcept{ for(;*l == *r && *l;++l, ++r); - return (static_cast(*l)) - (static_cast(*r)); + return *l - *r; + } + template + 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){ char* ld = static_cast(l); diff --git a/include/rexy/string_base.hpp b/include/rexy/string_base.hpp index 0343edd..514de8f 100644 --- a/include/rexy/string_base.hpp +++ b/include/rexy/string_base.hpp @@ -213,6 +213,9 @@ namespace rexy{ //true if m_data is not empty 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 const_reference operator[](size_type i)const noexcept{return get_pointer()[i];} From ea8c15b27e95ad252e868a6a5f3adc81ec01ecad Mon Sep 17 00:00:00 2001 From: rexy712 Date: Thu, 6 Aug 2020 15:32:04 -0700 Subject: [PATCH 2/2] Rename m__data to m_data in string_base. Forgot to fix the temp name much earlier. Other basic readability improvements --- include/rexy/string_base.hpp | 74 ++++++++++++------------------------ 1 file changed, 24 insertions(+), 50 deletions(-) diff --git a/include/rexy/string_base.hpp b/include/rexy/string_base.hpp index 514de8f..3a7ece0 100644 --- a/include/rexy/string_base.hpp +++ b/include/rexy/string_base.hpp @@ -77,68 +77,42 @@ namespace rexy{ sdata s; constexpr combine_data(void)noexcept: l(){} - }m__data; - pointer m_raw = m__data.s.data; + }m_data; + pointer m_raw = m_data.s.data; protected: constexpr void set_islong_flag(bool b){ if(b) - m__data.l.islong = b; + m_data.l.islong = b; else - m__data.s.islong = b; + m_data.s.islong = b; } constexpr bool islong(void)const{ //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){ 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){ set_islong_flag(true); return m_raw = ptr; } - constexpr pointer get_long_ptr(void){ - return m_raw; - } - constexpr pointer get_short_ptr(void){ - return m_raw; - } - constexpr const_pointer get_long_ptr(void)const{ - return m_raw; - } - constexpr const_pointer get_short_ptr(void)const{ - return m_raw; - } - 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(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 pointer get_long_ptr(void){return m_raw;} + constexpr pointer get_short_ptr(void){return m_raw;} + constexpr const_pointer get_long_ptr(void)const{return m_raw;} + constexpr const_pointer get_short_ptr(void)const{return m_raw;} + 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(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 size_type get_long_capacity(void)const{ - return m__data.l.capacity; - } - constexpr size_type get_short_capacity(void)const{ - return MAX_SHORT_LEN; - } + constexpr size_type get_long_capacity(void)const{return m_data.l.capacity;} + constexpr size_type get_short_capacity(void)const{return MAX_SHORT_LEN;} constexpr void set_length(size_type s){ if(islong()) set_long_length(s); @@ -169,22 +143,22 @@ namespace rexy{ string_base(data, len, len){} //Copy ctor, copy length+capacity+short string, not long string value 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: - m__data(std::move(s.m__data)), - m_raw(s.islong() ? s.m_raw : m__data.s.data) + m_data(std::move(s.m_data)), + m_raw(s.islong() ? s.m_raw : m_data.s.data) { s.set_islong_flag(false); } ~string_base(void)noexcept = default; 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()) std::swap(m_raw, s.m_raw); else{ s.m_raw = m_raw; - m_raw = m__data.s.data; + m_raw = m_data.s.data; } return *this; }