diff --git a/include/rexy/string.hpp b/include/rexy/string.hpp index b5f4398..1eb95f5 100644 --- a/include/rexy/string.hpp +++ b/include/rexy/string.hpp @@ -27,6 +27,7 @@ namespace rexy{ //new allocated string using string = basic_string>; + using wstring = basic_string>; #ifndef LIBREXY_HEADER_ONLY extern template class basic_string>; diff --git a/include/rexy/string_base.hpp b/include/rexy/string_base.hpp index 611a34f..5306d77 100644 --- a/include/rexy/string_base.hpp +++ b/include/rexy/string_base.hpp @@ -241,7 +241,7 @@ namespace rexy{ //Supplies all functions that string_base can't implement - template + template> class basic_string : protected detail::hasallocator, public string_base { public: diff --git a/include/rexy/string_view.hpp b/include/rexy/string_view.hpp index 99e82dd..b6768b8 100644 --- a/include/rexy/string_view.hpp +++ b/include/rexy/string_view.hpp @@ -41,7 +41,7 @@ namespace rexy{ using const_pointer = const value_type*; using reference = value_type&; using const_reference = const value_type&; - using iterator = pointer; + using iterator = const_pointer; using const_iterator = const_pointer; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::reverse_iterator; @@ -53,31 +53,38 @@ namespace rexy{ size_type m_length = 0; public: - constexpr basic_string_view(void)noexcept; + constexpr basic_string_view(void)noexcept = default; constexpr basic_string_view(const_pointer str, size_type len)noexcept; constexpr basic_string_view(const_pointer c)noexcept; - constexpr basic_string_view(const basic_string_view& s)noexcept; + constexpr basic_string_view(const basic_string_view& s)noexcept = default; constexpr basic_string_view(const string_base& s)noexcept; - constexpr basic_string_view(basic_string_view&& s)noexcept; + constexpr basic_string_view(basic_string_view&& s)noexcept = default; template constexpr basic_string_view(InIter start, InIter fin)noexcept; REXY_CPP20_CONSTEXPR ~basic_string_view(void)noexcept = default; constexpr basic_string_view& operator=(const_pointer c)noexcept; - constexpr basic_string_view& operator=(const basic_string_view& s)noexcept; - constexpr basic_string_view& operator=(basic_string_view&&)noexcept; + constexpr basic_string_view& operator=(const basic_string_view& s)noexcept = default; + constexpr basic_string_view& operator=(basic_string_view&&)noexcept = default; //Length of string not including null terminator constexpr size_type length(void)const noexcept{return m_length;} + constexpr size_type size(void)const noexcept{return m_length;} + constexpr bool empty(void)const noexcept{return m_length == 0;} //direct access to managed pointer constexpr const_pointer c_str(void)const noexcept{return m_data;} + constexpr const_pointer data(void)const noexcept{return m_data;} constexpr const_pointer get(void)const noexcept{return m_data;} constexpr operator const_pointer(void)const noexcept{return m_data;} //true if m_data is not empty constexpr bool valid(void)const noexcept{return m_length > 0;} constexpr const_reference operator[](size_type i)const noexcept{return m_data[i];} + constexpr const_reference at(size_type i)const noexcept{return m_data[i];} + constexpr const_reference front(size_type i)const noexcept{return m_data[0];} + constexpr const_reference back(size_type i)const noexcept{return m_data[m_length-1];} + constexpr const_iterator it_at(size_type i)const noexcept{return m_data + i;} constexpr const_iterator search(const basic_string_view& s)const; constexpr const_iterator search(const_pointer c)const; @@ -115,6 +122,7 @@ namespace rexy{ basic_string_view(const T*, size_t) -> basic_string_view; using string_view = basic_string_view; + using wstring_view = basic_string_view; #ifndef LIBREXY_HEADER_ONLY extern template class basic_string_view; diff --git a/include/rexy/string_view.tpp b/include/rexy/string_view.tpp index 6c630c3..3d60398 100644 --- a/include/rexy/string_view.tpp +++ b/include/rexy/string_view.tpp @@ -25,33 +25,17 @@ namespace rexy{ - template - constexpr basic_string_view::basic_string_view(void)noexcept: - basic_string_view(nullptr, 0){} - template constexpr basic_string_view::basic_string_view(const_pointer str, size_type len)noexcept: m_data(str), m_length(len){} template - constexpr basic_string_view::basic_string_view(const basic_string_view& s)noexcept: - m_data(s.m_data), m_length(s.m_length){} - template constexpr basic_string_view::basic_string_view(const string_base& s)noexcept: m_data(s.c_str()), m_length(s.length()){} template - constexpr basic_string_view::basic_string_view(basic_string_view&& s)noexcept: - m_data(s.m_data), m_length(s.m_length){} - template template constexpr basic_string_view::basic_string_view(InIter start, InIter fin)noexcept: basic_string_view(compat::to_address(start), fin - start){} - template - constexpr basic_string_view& basic_string_view::operator=(const basic_string_view& s)noexcept{ - m_data = s.m_data; - m_length = s.m_length; - return *this; - } template constexpr basic_string_view::basic_string_view(const_pointer c)noexcept: basic_string_view(c, strlen(c)){} @@ -61,12 +45,6 @@ namespace rexy{ m_length = strlen(c); return *this; } - template - constexpr basic_string_view& basic_string_view::operator=(basic_string_view&& s)noexcept{ - m_data = s.m_data; - m_length = s.m_length; - return *this; - } template constexpr auto basic_string_view::search(const basic_string_view& s)const -> const_iterator{ diff --git a/include/rexy/utility.hpp b/include/rexy/utility.hpp index a9cbb77..a1d063c 100644 --- a/include/rexy/utility.hpp +++ b/include/rexy/utility.hpp @@ -106,6 +106,10 @@ namespace rexy{ ld[i] = rd[i]; } } + template + constexpr T abs(const T& val){ + return val > 0 ? val : val; + } } }