diff --git a/include/rexy/string_base.hpp b/include/rexy/string_base.hpp index 3d7627f..611a34f 100644 --- a/include/rexy/string_base.hpp +++ b/include/rexy/string_base.hpp @@ -310,6 +310,9 @@ namespace rexy{ noexcept(noexcept(this->allocate(0)) && noexcept(this->deallocate(nullptr,0))); + REXY_CPP20_CONSTEXPR void push_back(value_type data) + noexcept(noexcept(this->allocate(0)) && + noexcept(this->deallocate(nullptr,0))); REXY_CPP20_CONSTEXPR void append(const_pointer data, size_type len) noexcept(noexcept(this->allocate(0)) && noexcept(this->deallocate(nullptr,0))); diff --git a/include/rexy/string_base.tpp b/include/rexy/string_base.tpp index cea097e..a6c6bc0 100644 --- a/include/rexy/string_base.tpp +++ b/include/rexy/string_base.tpp @@ -258,6 +258,15 @@ namespace rexy{ return false; return (*this = basic_string(this->get_pointer(), newsize)); } + + template + REXY_CPP20_CONSTEXPR void basic_string::push_back(value_type data) + noexcept(noexcept(this->allocate(0)) && + noexcept(this->deallocate(nullptr,0))) + { + append(&data, 1); + } + template REXY_CPP20_CONSTEXPR void basic_string::append(const_pointer data, size_type len) noexcept(noexcept(this->allocate(0)) && diff --git a/include/rexy/string_view.hpp b/include/rexy/string_view.hpp index 0cd9911..99e82dd 100644 --- a/include/rexy/string_view.hpp +++ b/include/rexy/string_view.hpp @@ -46,6 +46,8 @@ namespace rexy{ using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; + static constexpr size_type npos = size_type{-1}; + private: const_pointer m_data = nullptr; size_type m_length = 0; @@ -95,6 +97,16 @@ namespace rexy{ constexpr const_reverse_iterator rend(void)const{return const_reverse_iterator(m_data-1);} constexpr const_reverse_iterator crbegin(void)const{return rbegin();} constexpr const_reverse_iterator crend(void)const{return rend();} + + constexpr void remove_prefix(size_type i); + constexpr void remove_suffix(size_type i); + + constexpr size_type find_first_of(value_type v, size_type start = 0)const; + constexpr size_type find_first_of(const_pointer c, size_type pos = 0)const; + constexpr size_type find_first_of(const_pointer c, size_type pos, size_type size)const; + constexpr size_type find_last_of(value_type v, size_type start = 0)const; + constexpr size_type find_last_of(const_pointer c, size_type pos = 0)const; + constexpr size_type find_last_of(const_pointer c, size_type pos, size_type size)const; }; template diff --git a/include/rexy/string_view.tpp b/include/rexy/string_view.tpp index 1f60f1f..6c630c3 100644 --- a/include/rexy/string_view.tpp +++ b/include/rexy/string_view.tpp @@ -68,6 +68,112 @@ namespace rexy{ return *this; } + template + constexpr auto basic_string_view::search(const basic_string_view& s)const -> const_iterator{ + return two_way_search(cbegin(), cend(), s.cbegin(), s.cend()); + } + template + constexpr auto basic_string_view::search(const_pointer c)const -> const_iterator{ + basic_string_view tmp(c); + return search(tmp); + } + template + template + constexpr auto basic_string_view::search(const basic_string_view& s, const Searcher& searcher)const -> const_iterator{ + return searcher(cbegin(), cend(), s.cbegin(), s.cend()); + } + template + template + constexpr auto basic_string_view::search(const_pointer c, const Searcher& searcher)const -> const_iterator{ + basic_string_view tmp(c); + return search(tmp, searcher); + } + template + constexpr void basic_string_view::remove_prefix(size_type i){ + if(i > m_length){ + m_data = end(); + m_length = 0; + }else{ + m_data = begin() + i; + m_length -= i; + } + } + template + constexpr void basic_string_view::remove_suffix(size_type i){ + if(i > m_length){ + m_length = 0; + }else{ + m_length -= i; + } + } + template + constexpr auto basic_string_view::find_first_of(value_type v, size_type start)const -> size_type{ + if(start >= m_length){ + return npos; + } + for(auto it = begin() + start;it != end();++it){ + if(*it == v){ + return it - begin(); + } + } + return npos; + } + template + constexpr auto basic_string_view::find_first_of(const_pointer c, size_type start)const -> size_type{ + return find_first_of(c, start, ::rexy::strlen(c)); + } + template + constexpr auto basic_string_view::find_first_of(const_pointer c, size_type start, size_type size)const -> size_type{ + if(start > m_length){ + return npos; + } + for(auto it = begin() + start;it != end();++it){ + for(size_type i = 0;i < size;++i){ + if(*it == c[i]){ + return it - begin(); + } + } + } + return npos; + } + template + constexpr auto basic_string_view::find_last_of(value_type v, size_type start)const -> size_type{ + if(start >= m_length){ + return npos; + } + const auto b = end() - 1; + const auto e = begin() - 1 - start; + + for(auto it = b;it != e;--it){ + if(*it == v){ + return it - begin(); + } + } + return npos; + } + template + constexpr auto basic_string_view::find_last_of(const_pointer c, size_type start)const -> size_type{ + return find_last_of(c, start, ::rexy::strlen(c)); + } + template + constexpr auto basic_string_view::find_last_of(const_pointer c, size_type start, size_type size)const -> size_type{ + if(start > m_length){ + return npos; + } + + const auto b = end() - 1; + const auto e = begin() - 1 - start; + + for(auto it = b;it != e;--it){ + for(size_type i = 0;i < size;++i){ + if(*it == c[i]){ + return it - begin(); + } + } + } + return npos; + } + } #endif