Guest User

Basic Shared String implementation, using a shared_ptr

a guest
Aug 19th, 2019
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.57 KB | None | 0 0
  1. #include <memory>
  2. #include <string>
  3. #include <utility>
  4. #include <string_view>
  5. #include <type_traits>
  6.  
  7. #include <boost/shared_ptr.hpp>
  8. #include <boost/make_shared.hpp>
  9.  
  10. template<class STRING_T>
  11. constexpr decltype(auto) string_data(const STRING_T& str)
  12. {
  13. if constexpr( std::is_array_v<STRING_T>
  14. || std::is_pointer_v<STRING_T>)
  15. {
  16. return str;
  17. }
  18. else
  19. {
  20. return str.data();
  21. }
  22. } // string_data()
  23.  
  24.  
  25. //-----------------------------------------------------------------------------
  26.  
  27. template<class STRING_T>
  28. constexpr size_t string_size(const STRING_T & str)
  29. {
  30. if constexpr(std::is_pointer_v<STRING_T>)
  31. {
  32. return std::char_traits<std::remove_pointer_t<STRING_T>>::length(str);
  33. }
  34. else if constexpr(std::is_array_v<STRING_T>)
  35. {
  36. // TODO: Throw if the array contains an embedded nul character.
  37. // TODO: Return the static size based on template deduction.
  38. return std::char_traits<std::remove_pointer_t<std::decay_t<STRING_T>>>::length(str);
  39. }
  40. else
  41. {
  42. return str.size();
  43. }
  44. } // string_size()
  45.  
  46.  
  47. //-----------------------------------------------------------------------------
  48. // Declaration of BasicSharedString
  49. //-----------------------------------------------------------------------------
  50. template<typename CHAR_T>
  51. class BasicSharedString : private boost::shared_ptr<const CHAR_T[]>
  52. , public std::basic_string_view<CHAR_T>
  53. {
  54. using SPBase_t = boost::shared_ptr<const CHAR_T[]>;
  55. using SVBase_t = std::basic_string_view<CHAR_T>;
  56.  
  57. public:
  58. using traits_type = typename SVBase_t::traits_type;
  59. using value_type = typename SVBase_t::value_type;
  60. using size_type = typename SVBase_t::size_type;
  61. using difference_type = typename SVBase_t::difference_type;
  62. using reference = typename SVBase_t::reference;
  63. using const_reference = typename SVBase_t::const_reference;
  64. using pointer = typename SVBase_t::pointer;
  65. using const_pointer = typename SVBase_t::const_pointer;
  66. using iterator = typename SVBase_t::iterator;
  67. using const_iterator = typename SVBase_t::const_iterator;
  68. using reverse_iterator = typename SVBase_t::reverse_iterator;
  69. using const_reverse_iterator = typename SVBase_t::const_reverse_iterator;
  70.  
  71. static constexpr size_type npos = SVBase_t::npos;
  72.  
  73. BasicSharedString(void);
  74. BasicSharedString(BasicSharedString &&);
  75. BasicSharedString(BasicSharedString const&);
  76. BasicSharedString& operator=(BasicSharedString &&);
  77. BasicSharedString& operator=(BasicSharedString const&);
  78.  
  79. BasicSharedString(const CHAR_T* s, size_type count);
  80. template<typename STR_T>
  81. BasicSharedString(STR_T const& str);
  82.  
  83. BasicSharedString substr(size_type offset, size_type length) const;
  84.  
  85. void swap(BasicSharedString& other);
  86.  
  87. template<typename C_T>
  88. friend void swap(BasicSharedString<C_T>& rhs, BasicSharedString<C_T>& lhs);
  89.  
  90. private:
  91. BasicSharedString(SPBase_t lifetime, SVBase_t view);
  92. BasicSharedString(SPBase_t lifetime, size_type count);
  93. }; // class BasicSharedString
  94.  
  95. /**
  96. * By default, don't instantiate this template.
  97. * We'll do this in shared_string.cpp
  98. */
  99. extern template class BasicSharedString<char>;
  100.  
  101. /**
  102. * The default implementation of a BasicSharedString.
  103. */
  104. using SharedString = BasicSharedString<char>;
  105.  
  106. //-----------------------------------------------------------------------------
  107. /**
  108. * Comparison operators.
  109. */
  110. template<typename CHAR_T>
  111. bool operator==(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  112. template<typename CHAR_T>
  113. bool operator!=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  114. template<typename CHAR_T>
  115. bool operator<(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  116. template<typename CHAR_T>
  117. bool operator<=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  118. template<typename CHAR_T>
  119. bool operator>(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  120. template<typename CHAR_T>
  121. bool operator>=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs);
  122.  
  123. template<typename CHAR_T, typename OTHER_T>
  124. bool operator==(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  125. template<typename CHAR_T, typename OTHER_T>
  126. bool operator!=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  127. template<typename CHAR_T, typename OTHER_T>
  128. bool operator<(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  129. template<typename CHAR_T, typename OTHER_T>
  130. bool operator<=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  131. template<typename CHAR_T, typename OTHER_T>
  132. bool operator>(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  133. template<typename CHAR_T, typename OTHER_T>
  134. bool operator>=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs);
  135.  
  136. template<typename OTHER_T, typename CHAR_T>
  137. bool operator==(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  138. template<typename OTHER_T, typename CHAR_T>
  139. bool operator!=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  140. template<typename OTHER_T, typename CHAR_T>
  141. bool operator<(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  142. template<typename OTHER_T, typename CHAR_T>
  143. bool operator<=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  144. template<typename OTHER_T, typename CHAR_T>
  145. bool operator>(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  146. template<typename OTHER_T, typename CHAR_T>
  147. bool operator>=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs);
  148.  
  149. template<typename OTHER_T, typename CHAR_T>
  150. OTHER_T & operator<<(OTHER_T & other, BasicSharedString<CHAR_T> const& rhs);
  151.  
  152. //-----------------------------------------------------------------------------
  153. // Implementation of BasicSharedString
  154. //-----------------------------------------------------------------------------
  155.  
  156. template<typename CHAR_T>
  157. inline BasicSharedString<CHAR_T>::BasicSharedString(void) = default;
  158.  
  159. template<typename CHAR_T>
  160. inline BasicSharedString<CHAR_T>::BasicSharedString(BasicSharedString &&) = default;
  161.  
  162. template<typename CHAR_T>
  163. inline BasicSharedString<CHAR_T>::BasicSharedString(BasicSharedString const&) = default;
  164.  
  165. template<typename CHAR_T>
  166. inline auto BasicSharedString<CHAR_T>::operator=(BasicSharedString &&) -> BasicSharedString& = default;
  167.  
  168. template<typename CHAR_T>
  169. inline auto BasicSharedString<CHAR_T>::operator=(BasicSharedString const&) -> BasicSharedString& = default;
  170.  
  171. template<typename CHAR_T>
  172. inline BasicSharedString<CHAR_T>::BasicSharedString(SPBase_t ptr, SVBase_t const view)
  173. : SPBase_t(std::move(ptr))
  174. , SVBase_t(view)
  175. { }
  176.  
  177. template<typename CHAR_T>
  178. inline BasicSharedString<CHAR_T>::BasicSharedString(SPBase_t ptr, size_type const count)
  179. : SPBase_t(std::move(ptr))
  180. , SVBase_t(SPBase_t::get(), count)
  181. { }
  182.  
  183. template<typename CHAR_T>
  184. inline BasicSharedString<CHAR_T>::BasicSharedString(const CHAR_T* const s, size_type const count)
  185. : BasicSharedString([](const CHAR_T* const s, size_type const count)
  186. {
  187. auto ptr = boost::make_shared<CHAR_T[]>(count);
  188. std::copy(s, s+count, ptr.get());
  189. return std::move(ptr);
  190. }(s, count),
  191. count)
  192. { }
  193.  
  194. template<typename CHAR_T>
  195. template<typename STR_T>
  196. inline BasicSharedString<CHAR_T>::BasicSharedString(STR_T const& str)
  197. : BasicSharedString(meshpp::core::string_data(str), meshpp::core::string_size(str))
  198. { }
  199.  
  200. template<typename CHAR_T>
  201. inline auto BasicSharedString<CHAR_T>::substr(size_type const offset, size_type const length) const -> BasicSharedString
  202. {
  203. // *this will convert to the base class, SPBase_t, so this isn't a call to the copy constructor.
  204. return BasicSharedString(*this, SVBase_t::substr(offset, length));
  205. }
  206.  
  207. template<typename CHAR_T>
  208. inline void BasicSharedString<CHAR_T>::swap(BasicSharedString & other)
  209. {
  210. using std::swap; // Allow Argument Dependent Lookup
  211. swap(static_cast<SPBase_t&>(*this), static_cast<SPBase_t&>(other));
  212. swap(static_cast<SVBase_t&>(*this), static_cast<SVBase_t&>(other));
  213. }
  214.  
  215. template<typename CHAR_T>
  216. inline void swap(BasicSharedString<CHAR_T>& rhs, BasicSharedString<CHAR_T>& lhs)
  217. {
  218. rhs.swap(lhs);
  219. }
  220.  
  221. //-----------------------------------------------------------------------------
  222.  
  223. template<typename CHAR_T>
  224. bool operator==(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  225. {
  226. return 0 == lhs.compare(rhs);
  227. }
  228.  
  229. template<typename CHAR_T>
  230. bool operator!=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  231. {
  232. return 0 != lhs.compare(rhs);
  233. }
  234.  
  235. template<typename CHAR_T>
  236. bool operator<(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  237. {
  238. return 0 < lhs.compare(rhs);
  239. }
  240.  
  241. template<typename CHAR_T>
  242. bool operator<=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  243. {
  244. return 0 <= lhs.compare(rhs);
  245. }
  246.  
  247. template<typename CHAR_T>
  248. bool operator>(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  249. {
  250. return 0 > lhs.compare(rhs);
  251. }
  252.  
  253. template<typename CHAR_T>
  254. bool operator>=(BasicSharedString<CHAR_T> const& lhs, BasicSharedString<CHAR_T> const& rhs)
  255. {
  256. return 0 >= lhs.compare(rhs);
  257. }
  258.  
  259. template<typename CHAR_T, typename OTHER_T>
  260. bool operator==(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  261. {
  262. return 0 == lhs.compare(rhs);
  263. }
  264.  
  265. template<typename CHAR_T, typename OTHER_T>
  266. bool operator!=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  267. {
  268. return 0 != lhs.compare(rhs);
  269. }
  270.  
  271. template<typename CHAR_T, typename OTHER_T>
  272. bool operator<(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  273. {
  274. return 0 < lhs.compare(rhs);
  275. }
  276.  
  277. template<typename CHAR_T, typename OTHER_T>
  278. bool operator<=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  279. {
  280. return 0 <= lhs.compare(rhs);
  281. }
  282.  
  283. template<typename CHAR_T, typename OTHER_T>
  284. bool operator>(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  285. {
  286. return 0 > lhs.compare(rhs);
  287. }
  288.  
  289. template<typename CHAR_T, typename OTHER_T>
  290. bool operator>=(BasicSharedString<CHAR_T> const& lhs, OTHER_T const& rhs)
  291. {
  292. return 0 >= lhs.compare(rhs);
  293. }
  294.  
  295. template<typename OTHER_T, typename CHAR_T>
  296. bool operator==(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  297. {
  298. return 0 == lhs.compare(rhs);
  299. }
  300.  
  301. template<typename OTHER_T, typename CHAR_T>
  302. bool operator!=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  303. {
  304. return 0 != lhs.compare(rhs);
  305. }
  306.  
  307. template<typename OTHER_T, typename CHAR_T>
  308. bool operator<(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  309. {
  310. return 0 > lhs.compare(rhs);
  311. }
  312.  
  313. template<typename OTHER_T, typename CHAR_T>
  314. bool operator<=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  315. {
  316. return 0 >= lhs.compare(rhs);
  317. }
  318.  
  319. template<typename OTHER_T, typename CHAR_T>
  320. bool operator>(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  321. {
  322. return 0 < lhs.compare(rhs);
  323. }
  324.  
  325. template<typename OTHER_T, typename CHAR_T>
  326. bool operator>=(OTHER_T const& lhs, BasicSharedString<CHAR_T> const& rhs)
  327. {
  328. return 0 <= lhs.compare(rhs);
  329. }
  330.  
  331. template<typename OTHER_T, typename CHAR_T>
  332. OTHER_T & operator<<(OTHER_T & other, BasicSharedString<CHAR_T> const& rhs)
  333. {
  334. other << static_cast<std::basic_string_view<CHAR_T> const&>(rhs);
  335. return other;
  336. }
Advertisement
Add Comment
Please, Sign In to add comment