Make string_view trivially copy-able and trivially move-able. Add wstring alias for basic_string<wchar_t>. Add constexpr version of 'abs' function.
This commit is contained in:
parent
fd22069562
commit
8ab328fcfe
@ -27,6 +27,7 @@ namespace rexy{
|
|||||||
|
|
||||||
//new allocated string
|
//new allocated string
|
||||||
using string = basic_string<char,allocator<char>>;
|
using string = basic_string<char,allocator<char>>;
|
||||||
|
using wstring = basic_string<wchar_t,allocator<wchar_t>>;
|
||||||
|
|
||||||
#ifndef LIBREXY_HEADER_ONLY
|
#ifndef LIBREXY_HEADER_ONLY
|
||||||
extern template class basic_string<char,allocator<char>>;
|
extern template class basic_string<char,allocator<char>>;
|
||||||
|
|||||||
@ -241,7 +241,7 @@ namespace rexy{
|
|||||||
|
|
||||||
|
|
||||||
//Supplies all functions that string_base can't implement
|
//Supplies all functions that string_base can't implement
|
||||||
template<class Char, REXY_ALLOCATOR_CONCEPT Alloc>
|
template<class Char, REXY_ALLOCATOR_CONCEPT Alloc = rexy::allocator<Char>>
|
||||||
class basic_string : protected detail::hasallocator<Alloc>, public string_base<Char>
|
class basic_string : protected detail::hasallocator<Alloc>, public string_base<Char>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -41,7 +41,7 @@ namespace rexy{
|
|||||||
using const_pointer = const value_type*;
|
using const_pointer = const value_type*;
|
||||||
using reference = value_type&;
|
using reference = value_type&;
|
||||||
using const_reference = const value_type&;
|
using const_reference = const value_type&;
|
||||||
using iterator = pointer;
|
using iterator = const_pointer;
|
||||||
using const_iterator = const_pointer;
|
using const_iterator = const_pointer;
|
||||||
using reverse_iterator = std::reverse_iterator<iterator>;
|
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||||
@ -53,31 +53,38 @@ namespace rexy{
|
|||||||
size_type m_length = 0;
|
size_type m_length = 0;
|
||||||
|
|
||||||
public:
|
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 str, size_type len)noexcept;
|
||||||
constexpr basic_string_view(const_pointer c)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<Char>& s)noexcept;
|
constexpr basic_string_view(const string_base<Char>& s)noexcept;
|
||||||
constexpr basic_string_view(basic_string_view&& s)noexcept;
|
constexpr basic_string_view(basic_string_view&& s)noexcept = default;
|
||||||
template<class InIter>
|
template<class InIter>
|
||||||
constexpr basic_string_view(InIter start, InIter fin)noexcept;
|
constexpr basic_string_view(InIter start, InIter fin)noexcept;
|
||||||
REXY_CPP20_CONSTEXPR ~basic_string_view(void)noexcept = default;
|
REXY_CPP20_CONSTEXPR ~basic_string_view(void)noexcept = default;
|
||||||
|
|
||||||
constexpr basic_string_view& operator=(const_pointer c)noexcept;
|
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=(const basic_string_view& s)noexcept = default;
|
||||||
constexpr basic_string_view& operator=(basic_string_view&&)noexcept;
|
constexpr basic_string_view& operator=(basic_string_view&&)noexcept = default;
|
||||||
|
|
||||||
|
|
||||||
//Length of string not including null terminator
|
//Length of string not including null terminator
|
||||||
constexpr size_type length(void)const noexcept{return m_length;}
|
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
|
//direct access to managed pointer
|
||||||
constexpr const_pointer c_str(void)const noexcept{return m_data;}
|
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 const_pointer get(void)const noexcept{return m_data;}
|
||||||
constexpr operator const_pointer(void)const noexcept{return m_data;}
|
constexpr operator const_pointer(void)const noexcept{return m_data;}
|
||||||
//true if m_data is not empty
|
//true if m_data is not empty
|
||||||
constexpr bool valid(void)const noexcept{return m_length > 0;}
|
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 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 basic_string_view& s)const;
|
||||||
constexpr const_iterator search(const_pointer c)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<T>;
|
basic_string_view(const T*, size_t) -> basic_string_view<T>;
|
||||||
|
|
||||||
using string_view = basic_string_view<char>;
|
using string_view = basic_string_view<char>;
|
||||||
|
using wstring_view = basic_string_view<wchar_t>;
|
||||||
|
|
||||||
#ifndef LIBREXY_HEADER_ONLY
|
#ifndef LIBREXY_HEADER_ONLY
|
||||||
extern template class basic_string_view<char>;
|
extern template class basic_string_view<char>;
|
||||||
|
|||||||
@ -25,33 +25,17 @@
|
|||||||
|
|
||||||
namespace rexy{
|
namespace rexy{
|
||||||
|
|
||||||
template<class Char>
|
|
||||||
constexpr basic_string_view<Char>::basic_string_view(void)noexcept:
|
|
||||||
basic_string_view(nullptr, 0){}
|
|
||||||
|
|
||||||
template<class Char>
|
template<class Char>
|
||||||
constexpr basic_string_view<Char>::basic_string_view(const_pointer str, size_type len)noexcept:
|
constexpr basic_string_view<Char>::basic_string_view(const_pointer str, size_type len)noexcept:
|
||||||
m_data(str), m_length(len){}
|
m_data(str), m_length(len){}
|
||||||
template<class Char>
|
template<class Char>
|
||||||
constexpr basic_string_view<Char>::basic_string_view(const basic_string_view& s)noexcept:
|
|
||||||
m_data(s.m_data), m_length(s.m_length){}
|
|
||||||
template<class Char>
|
|
||||||
constexpr basic_string_view<Char>::basic_string_view(const string_base<Char>& s)noexcept:
|
constexpr basic_string_view<Char>::basic_string_view(const string_base<Char>& s)noexcept:
|
||||||
m_data(s.c_str()), m_length(s.length()){}
|
m_data(s.c_str()), m_length(s.length()){}
|
||||||
template<class Char>
|
template<class Char>
|
||||||
constexpr basic_string_view<Char>::basic_string_view(basic_string_view&& s)noexcept:
|
|
||||||
m_data(s.m_data), m_length(s.m_length){}
|
|
||||||
template<class Char>
|
|
||||||
template<class InIter>
|
template<class InIter>
|
||||||
constexpr basic_string_view<Char>::basic_string_view(InIter start, InIter fin)noexcept:
|
constexpr basic_string_view<Char>::basic_string_view(InIter start, InIter fin)noexcept:
|
||||||
basic_string_view(compat::to_address(start), fin - start){}
|
basic_string_view(compat::to_address(start), fin - start){}
|
||||||
|
|
||||||
template<class Char>
|
|
||||||
constexpr basic_string_view<Char>& basic_string_view<Char>::operator=(const basic_string_view& s)noexcept{
|
|
||||||
m_data = s.m_data;
|
|
||||||
m_length = s.m_length;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
template<class Char>
|
template<class Char>
|
||||||
constexpr basic_string_view<Char>::basic_string_view(const_pointer c)noexcept:
|
constexpr basic_string_view<Char>::basic_string_view(const_pointer c)noexcept:
|
||||||
basic_string_view(c, strlen(c)){}
|
basic_string_view(c, strlen(c)){}
|
||||||
@ -61,12 +45,6 @@ namespace rexy{
|
|||||||
m_length = strlen(c);
|
m_length = strlen(c);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
template<class Char>
|
|
||||||
constexpr basic_string_view<Char>& basic_string_view<Char>::operator=(basic_string_view&& s)noexcept{
|
|
||||||
m_data = s.m_data;
|
|
||||||
m_length = s.m_length;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class Char>
|
template<class Char>
|
||||||
constexpr auto basic_string_view<Char>::search(const basic_string_view& s)const -> const_iterator{
|
constexpr auto basic_string_view<Char>::search(const basic_string_view& s)const -> const_iterator{
|
||||||
|
|||||||
@ -106,6 +106,10 @@ namespace rexy{
|
|||||||
ld[i] = rd[i];
|
ld[i] = rd[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
template<class T>
|
||||||
|
constexpr T abs(const T& val){
|
||||||
|
return val > 0 ? val : val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user