From dc68d52dd4789d6297695bdeeed5ce0280352fc6 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Tue, 11 Aug 2020 14:05:19 -0700 Subject: [PATCH] Add iterators to rexy::string_base --- include/rexy/string_base.hpp | 39 +++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/include/rexy/string_base.hpp b/include/rexy/string_base.hpp index cada039..4eecb99 100644 --- a/include/rexy/string_base.hpp +++ b/include/rexy/string_base.hpp @@ -24,6 +24,7 @@ #include //size_t,ptrdiff #include //strlen #include //CHAR_BIT +#include //reverse_iterator #include "steal.hpp" #include "cx/utility.hpp" @@ -48,14 +49,17 @@ namespace rexy{ using const_reference = const value_type&; using iterator = pointer; using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; private: static constexpr size_type EXTRA_SDATA_LEN = 0; + //represent long string struct ldata{ - unsigned char islong:1; - size_type capacity:(CHAR_BIT*sizeof(size_type)-1); - size_type length; + unsigned char islong:1; //common subsequence with short string + size_type capacity:(CHAR_BIT*sizeof(size_type)-1); //take away last bit from capacity for islong + size_type length; //length of string excluding null terminator constexpr ldata(void)noexcept: islong(0), capacity(0), @@ -63,25 +67,31 @@ namespace rexy{ }; static constexpr size_type MAX_SHORT_LEN = EXTRA_SDATA_LEN+sizeof(ldata)-2; + //represent short string struct sdata{ - unsigned char islong:1; - unsigned char length:(CHAR_BIT-1); - value_type data[MAX_SHORT_LEN+1]; + unsigned char islong:1; //common subsequenci with long string + unsigned char length:(CHAR_BIT-1); //take away last bit from length for islong, excludes null terminator + value_type data[MAX_SHORT_LEN+1]; //char array for string storage constexpr sdata(void)noexcept: islong(0), length(0), data{}{} }; + //union of short and long string representations. Default to long representation for static_string's use case. union combine_data{ ldata l; sdata s; constexpr combine_data(void)noexcept: l(){} }m_data; + + //direct access to current string data regardless of representation. Increases access speed. pointer m_raw = m_data.s.data; protected: + //Functions for handling long vs short string manipulation. Use this instead of directly modifying m_data. constexpr void set_islong_flag(bool b){ + //although well defined to set either one at any time, constexpr functions cannot change active union member. if(b) m_data.l.islong = b; else @@ -187,9 +197,6 @@ 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];} @@ -198,6 +205,20 @@ namespace rexy{ constexpr bool compare(const string_base& s)const{return *this == s;} constexpr bool compare(const_pointer c)const{return *this == c;} + constexpr iterator begin(void){return get_pointer();} + constexpr const_iterator begin(void)const{return get_pointer();} + constexpr iterator end(void){return get_pointer()+length();} + constexpr const_iterator end(void)const{return get_pointer()+length();} + constexpr const_iterator cbegin(void)const{return begin();} + constexpr const_iterator cend(void)const{return end();} + + constexpr reverse_iterator rbegin(void){return reverse_iterator(get_pointer()+length());} + constexpr const_reverse_iterator rbegin(void)const{return const_reverse_iterator(get_pointer()+length());} + constexpr reverse_iterator rend(void){return reverse_iterator(get_pointer()-1);} + constexpr const_reverse_iterator rend(void)const{return const_reverse_iterator(get_pointer()-1);} + constexpr const_reverse_iterator crbegin(void)const{return rbegin();} + constexpr const_reverse_iterator crend(void)const{return rend();} + static constexpr bool uses_sso(void){return true;} static constexpr size_type short_string_size(void){return MAX_SHORT_LEN;} };