项目作者: oleg-m1973

项目描述 :
C++ shared_string class implementation
高级语言: C++
项目地址: git://github.com/oleg-m1973/shared_string.git
创建时间: 2019-01-23T14:52:05Z
项目社区:https://github.com/oleg-m1973/shared_string

开源协议:MIT License

下载


shared_string

basic_shared_string
C++ implementation of shared string class with small string optimization.

basic_cow_string
C++ implementation of Copy-On-Write (COW) string class based on shared_string

  1. template <typename TChar = char, typename Traits = std::char_traits<TChar>>
  2. class basic_shared_string
  3. {
  4. public:
  5. using traits_type = Traits;
  6. using value_type = TChar;
  7. using size_type = std::size_t;
  8. using difference_type = std::ptrdiff_t;
  9. using const_pointer = const value_type *;
  10. using const_reference = const value_type &;
  11. using pointer = const_pointer;
  12. using reference = const_reference;
  13. using string_view = std::basic_string_view<value_type, traits_type>;
  14. using const_iterator = typename string_view::const_iterator;
  15. using iterator = const_iterator;
  16. using reverse_iterator = std::reverse_iterator<iterator>;
  17. using const_reverse_iterator = std::reverse_iterator<const_iterator>;
  18. static constexpr size_type npos = string_view::npos;
  19. static const size_type sso_size = (sizeof(TLargeStr) - sizeof(TSmallSize)) / sizeof(value_type);
  20. constexpr basic_shared_string() noexcept;
  21. constexpr basic_shared_string(nullptr_t) noexcept;
  22. explicit constexpr basic_shared_string(const value_type *psz, size_type sz);
  23. explicit constexpr basic_shared_string(const string_view &src);
  24. template <typename T> explicit constexpr basic_shared_string(const std::basic_string<value_type, traits_type, T> &src);
  25. explicit constexpr basic_shared_string(value_type ch) noexcept;
  26. explicit constexpr basic_shared_string(size_t n, value_type ch) noexcept;
  27. //Reserve sz characters and call func(args..., buf, sz) -> size_t
  28. template <typename TFunc, typename... TT, typename = std::enable_if_t<std::is_invocable_v<TFunc, TT..., value_type *, size_type>>>
  29. constexpr basic_shared_string(const size_t sz, TFunc &&func, TT&&... args);
  30. //Make string as concatination of vals...
  31. template <typename TMaker, typename... TT>
  32. constexpr basic_shared_string(const std::in_place_type_t<TMaker> &maker, TT&&... vals);
  33. constexpr basic_shared_string(const basic_shared_string &src) noexcept;
  34. constexpr basic_shared_string(basic_shared_string &&src) noexcept;
  35. constexpr string_view sv() const noexcept;
  36. constexpr const_pointer c_str() const noexcept;
  37. constexpr const_pointer data() const noexcept;
  38. constexpr size_t size() const noexcept;
  39. constexpr size_type length() const noexcept;
  40. constexpr const_reference front() const noexcept;
  41. const const_reference operator[](size_t pos) const noexcept;
  42. constexpr void swap(basic_shared_string &src) noexcept;
  43. constexpr void reset() noexcept;
  44. constexpr auto use_count() const noexcept;
  45. [[nodiscard]] constexpr bool is_small() const noexcept;
  46. [[nodiscard]] constexpr bool empty() const noexcept;
  47. constexpr basic_shared_string &operator =(const basic_shared_string &src) noexcept;
  48. constexpr basic_shared_string &operator =(basic_shared_string &&src) noexcept;
  49. constexpr basic_shared_string &operator =(nullptr_t) noexcept;
  50. constexpr operator string_view() const noexcept;
  51. //return {sv().substr(pos1, end1), sv().substr(pos2, end2)};
  52. constexpr std::pair<string_view, string_view> substr2(size_type pos1, size_type end1, size_type pos2, size_type end2) const;
  53. //return substr2(0, pos, pos, npos);
  54. constexpr std::pair<string_view, string_view> substr2(size_type pos) const;
  55. #define SHARED_STRING_FUNCS(name) template <typename... TT> \
  56. constexpr auto name(TT&&... args) const noexcept(noexcept(sv().name(std::forward<TT>(args)...))) \
  57. {return sv().name(std::forward<TT>(args)...);}
  58. SHARED_STRING_FUNCS(at)
  59. SHARED_STRING_FUNCS(back)
  60. SHARED_STRING_FUNCS(begin)
  61. SHARED_STRING_FUNCS(cbegin)
  62. SHARED_STRING_FUNCS(end)
  63. SHARED_STRING_FUNCS(cend)
  64. SHARED_STRING_FUNCS(rbegin)
  65. SHARED_STRING_FUNCS(crbegin)
  66. SHARED_STRING_FUNCS(rend)
  67. SHARED_STRING_FUNCS(crend)
  68. SHARED_STRING_FUNCS(copy)
  69. SHARED_STRING_FUNCS(substr)
  70. SHARED_STRING_FUNCS(compare)
  71. SHARED_STRING_FUNCS(starts_with)
  72. SHARED_STRING_FUNCS(ends_with)
  73. SHARED_STRING_FUNCS(find)
  74. SHARED_STRING_FUNCS(rfind)
  75. SHARED_STRING_FUNCS(find_first_of)
  76. SHARED_STRING_FUNCS(find_last_of)
  77. SHARED_STRING_FUNCS(find_first_not_of)
  78. SHARED_STRING_FUNCS(find_last_not_of)
  79. #undef SHARED_STRING_FUNCS
  80. };
  81. using shared_string = basic_shared_string<char>;
  82. using shared_wstring = basic_shared_string<wchar_t>;
  83. template <typename TChar> struct repeat_char : std::pair<std::size_t, TChar> {};
  84. //make shared string as concatination of vals...
  85. template <typename... TT> shared_string make_shared_string(TT&&... vals);
  86. template <typename... TT> shared_wstring make_shared_wstring(TT&&... vals);