diff --git a/source/tinystl/iterator/iterator_traits.h b/source/tinystl/iterator/iterator_traits.h index b56f383..bc1203a 100644 --- a/source/tinystl/iterator/iterator_traits.h +++ b/source/tinystl/iterator/iterator_traits.h @@ -69,83 +69,83 @@ concept cpp17_random_access_iterator = // has nested types template -concept has_iterator_category = requires { typename Iter::iterator_category; }; +concept iter_has_iterator_category = requires { typename Iter::iterator_category; }; template -concept has_value_type = requires { typename Iter::value_type; }; +concept iter_has_value_type = requires { typename Iter::value_type; }; template -concept has_difference_type = requires { typename Iter::difference_type; }; +concept iter_has_difference_type = requires { typename Iter::difference_type; }; template -concept has_pointer = requires { typename Iter::pointer; }; +concept iter_has_pointer = requires { typename Iter::pointer; }; template -concept has_reference = requires { typename Iter::reference; }; +concept iter_has_reference = requires { typename Iter::reference; }; // get pointer type template -concept has_arrow = +concept iter_has_arrow = requires(Iter &&iter) { static_cast(iter).operator->(); }; template -struct get_pointer { +struct iter_get_pointer { using type = void; }; -template -struct get_pointer { +template +struct iter_get_pointer { using type = typename Iter::pointer; }; template - requires(!has_pointer) && (has_arrow) -struct get_pointer { + requires(!iter_has_pointer) && (iter_has_arrow) +struct iter_get_pointer { using type = decltype(std::declval().operator->()); }; // get reference type template -struct get_reference { +struct iter_get_reference { using type = std::remove_reference_t; }; -template -struct get_reference { +template +struct iter_get_reference { using type = typename Iter::reference; }; // get iterator category template -struct get_iterator_category_impl { +struct iter_get_iterator_category_impl { using type = tinystl::input_iterator_tag; }; template -struct get_iterator_category_impl { +struct iter_get_iterator_category_impl { using type = tinystl::forward_iterator_tag; }; template -struct get_iterator_category_impl { +struct iter_get_iterator_category_impl { using type = tinystl::bidirectional_iterator_tag; }; template -struct get_iterator_category_impl { +struct iter_get_iterator_category_impl { using type = tinystl::random_access_iterator_tag; }; template -struct get_iterator_category : get_iterator_category_impl {}; +struct iter_get_iterator_category : iter_get_iterator_category_impl {}; -template -struct get_iterator_category { +template +struct iter_get_iterator_category { using type = Iter::iterator_category; }; template -struct get_difference_type { +struct iter_get_difference_type { using type = void; }; @@ -153,17 +153,17 @@ template requires requires { typename std::incrementable_traits::difference_type; } -struct get_difference_type { +struct iter_get_difference_type { using type = typename std::incrementable_traits::difference_type; }; template concept specifies_members = requires { - requires has_value_type; - requires has_difference_type; - requires has_reference; - requires has_iterator_category; - requires !has_pointer; + requires iter_has_value_type; + requires iter_has_difference_type; + requires iter_has_reference; + requires iter_has_iterator_category; + requires !iter_has_pointer; }; template @@ -192,19 +192,19 @@ struct iterator_traits { template struct iterator_traits { - using iterator_category = typename detail::get_iterator_category::type; + using iterator_category = typename detail::iter_get_iterator_category::type; using value_type = typename std::indirectly_readable_traits::value_type; using difference_type = typename std::incrementable_traits::difference_type; - using pointer = typename detail::get_pointer::type; - using reference = typename detail::get_reference::type; + using pointer = typename detail::iter_get_pointer::type; + using reference = typename detail::iter_get_reference::type; }; template struct iterator_traits { using iterator_category = output_iterator_tag; using value_type = void; - using difference_type = detail::get_difference_type::type; + using difference_type = detail::iter_get_difference_type::type; using pointer = void; using reference = void; }; diff --git a/source/tinystl/memory/allocator_traits.h b/source/tinystl/memory/allocator_traits.h index b4daa8e..121c7e1 100644 --- a/source/tinystl/memory/allocator_traits.h +++ b/source/tinystl/memory/allocator_traits.h @@ -16,89 +16,89 @@ // https://en.cppreference.com/w/cpp/memory/allocator_traits.html namespace detail { -// get_pointer +// alloc_get_pointer template -struct get_pointer { +struct alloc_get_pointer { using type = typename Alloc::value_type *; }; template -struct get_pointer> { +struct alloc_get_pointer> { using type = typename Alloc::pointer; }; -// get_const_pointer +// alloc_get_const_pointer template -struct get_const_pointer { - using pointer_type = typename get_pointer::type; +struct alloc_get_const_pointer { + using pointer_type = typename alloc_get_pointer::type; using value_type = typename Alloc::value_type; using type = typename tinystl::pointer_traits::template rebind< const value_type>; }; template -struct get_const_pointer< +struct alloc_get_const_pointer< Alloc, tinystl::void_t> { using type = typename Alloc::const_pointer; }; -// get_void_pointer +// alloc_get_void_pointer template -struct get_void_pointer { - using pointer_type = typename get_pointer::type; +struct alloc_get_void_pointer { + using pointer_type = typename alloc_get_pointer::type; using type = typename tinystl::pointer_traits::template rebind; }; template -struct get_void_pointer> { +struct alloc_get_void_pointer> { using type = typename Alloc::void_pointer; }; -// get_const_void_pointer +// alloc_get_const_void_pointer template -struct get_const_void_pointer { - using pointer_type = typename get_pointer::type; +struct alloc_get_const_void_pointer { + using pointer_type = typename alloc_get_pointer::type; using type = typename tinystl::pointer_traits::template rebind; }; template -struct get_const_void_pointer< +struct alloc_get_const_void_pointer< Alloc, tinystl::void_t> { using type = typename Alloc::const_void_pointer; }; -// get_difference_type +// alloc_get_difference_type template -struct get_difference_type { - using _Ptrty = typename get_pointer::type; +struct alloc_get_difference_type { + using _Ptrty = typename alloc_get_pointer::type; using type = typename tinystl::pointer_traits<_Ptrty>::difference_type; }; template -struct get_difference_type< +struct alloc_get_difference_type< Alloc, tinystl::void_t> { using type = typename Alloc::difference_type; }; -// get_size_type +// alloc_get_size_type template -struct get_size_type { +struct alloc_get_size_type { using type = - tinystl::make_unsigned_t::type>; + tinystl::make_unsigned_t::type>; }; template -struct get_size_type> { +struct alloc_get_size_type> { using type = typename Alloc::size_type; }; // propagate_on_container_copy_assignment template -struct get_propagate_on_container_copy_assignment { +struct alloc_get_propagate_on_container_copy_assignment { using type = tinystl::false_type; }; template -struct get_propagate_on_container_copy_assignment< +struct alloc_get_propagate_on_container_copy_assignment< Alloc, tinystl::void_t> { using type = typename Alloc::propagate_on_container_copy_assignment; @@ -106,12 +106,12 @@ struct get_propagate_on_container_copy_assignment< // propagate_on_container_move_assignment template -struct get_propagate_on_container_move_assignment { +struct alloc_get_propagate_on_container_move_assignment { using type = tinystl::false_type; }; template -struct get_propagate_on_container_move_assignment< +struct alloc_get_propagate_on_container_move_assignment< Alloc, tinystl::void_t> { using type = typename Alloc::propagate_on_container_move_assignment; @@ -119,89 +119,89 @@ struct get_propagate_on_container_move_assignment< // propagate_on_container_swap template -struct get_propagate_on_container_swap { +struct alloc_get_propagate_on_container_swap { using type = tinystl::false_type; }; template -struct get_propagate_on_container_swap< +struct alloc_get_propagate_on_container_swap< Alloc, tinystl::void_t> { using type = typename Alloc::propagate_on_container_swap; }; // is_always_equal template -struct get_is_always_equal { +struct alloc_get_is_always_equal { using type = tinystl::is_empty; }; template -struct get_is_always_equal< +struct alloc_get_is_always_equal< Alloc, tinystl::void_t> { using type = typename Alloc::is_always_equal; }; // rebind_alloc template -struct get_rebind_get_impl; +struct alloc_get_rebind_alloc_impl; template < template class Alloc, class First, class... Rest, class Newfirst> -struct get_rebind_get_impl, Newfirst> { +struct alloc_get_rebind_alloc_impl, Newfirst> { // given Alloc, replace First with Newfirst using type = Alloc; }; template -struct get_rebind_alloc { - using type = typename get_rebind_get_impl::type; +struct alloc_get_rebind_alloc { + using type = typename alloc_get_rebind_alloc_impl::type; }; template -struct get_rebind_alloc< +struct alloc_get_rebind_alloc< Alloc, NewAlloc, tinystl::void_t::other>> { using type = typename Alloc::template rebind::other; }; -// has_construct +// alloc_has_construct template -const bool has_construct_impl = false; +const bool alloc_has_construct_impl = false; template -const bool has_construct_impl< +const bool alloc_has_construct_impl< decltype((void)std::declval().construct(std::declval()...)), Alloc, Args...> = true; template -const bool has_construct = has_construct_impl; +const bool alloc_has_construct = alloc_has_construct_impl; -// has_destroy +// alloc_has_destroy template -const bool has_destroy = false; +const bool alloc_has_destroy = false; template -const bool has_destroy< +const bool alloc_has_destroy< Alloc, Pointer, decltype((void)std::declval().destroy(std::declval()))> = true; -// has_max_size +// alloc_has_max_size template -const bool has_max_size = false; +const bool alloc_has_max_size = false; template const bool - has_max_size().max_size())> = + alloc_has_max_size().max_size())> = true; -// has_select_on_container_copy_construction +// alloc_has_select_on_container_copy_construction template -const bool has_select_on_container_copy_construction = false; +const bool alloc_has_select_on_container_copy_construction = false; template -const bool has_select_on_container_copy_construction< +const bool alloc_has_select_on_container_copy_construction< Alloc, decltype((void)std::declval() .select_on_container_copy_construction())> = true; @@ -215,27 +215,27 @@ struct allocator_traits { using allocator_type = Alloc; using value_type = typename Alloc::value_type; - using pointer = typename detail::get_pointer::type; - using const_pointer = typename detail::get_const_pointer::type; - using void_pointer = typename detail::get_void_pointer::type; + using pointer = typename detail::alloc_get_pointer::type; + using const_pointer = typename detail::alloc_get_const_pointer::type; + using void_pointer = typename detail::alloc_get_void_pointer::type; using const_void_pointer = - typename detail::get_const_void_pointer::type; + typename detail::alloc_get_const_void_pointer::type; - using size_type = typename detail::get_size_type::type; - using difference_type = typename detail::get_difference_type::type; + using size_type = typename detail::alloc_get_size_type::type; + using difference_type = typename detail::alloc_get_difference_type::type; using propagate_on_container_copy_assignment = - typename detail::get_propagate_on_container_copy_assignment::type; + typename detail::alloc_get_propagate_on_container_copy_assignment::type; using propagate_on_container_move_assignment = - typename detail::get_propagate_on_container_move_assignment::type; + typename detail::alloc_get_propagate_on_container_move_assignment::type; using propagate_on_container_swap = - typename detail::get_propagate_on_container_swap::type; + typename detail::alloc_get_propagate_on_container_swap::type; - using is_always_equal = typename detail::get_is_always_equal::type; + using is_always_equal = typename detail::alloc_get_is_always_equal::type; // Member alias templates template - using rebind_alloc = typename detail::get_rebind_alloc::type; + using rebind_alloc = typename detail::alloc_get_rebind_alloc::type; template using rebind_traits = allocator_traits>; @@ -253,48 +253,48 @@ struct allocator_traits { template < class T, class... Args, - enable_if_t, int> = 0> + enable_if_t, int> = 0> static void construct(Alloc &a, T *p, Args &&...args) { a.construct(p, std::forward(args)...); } template < class T, class... Args, - enable_if_t, int> = 0> + enable_if_t, int> = 0> static void construct(Alloc &, T *p, Args &&...args) { construct_at(p, std::forward(args)...); } - template , int> = 0> + template , int> = 0> static void destroy(Alloc &a, T *p) { a.destroy(p); } - template , int> = 0> + template , int> = 0> static void destroy(Alloc &, T *p) { destroy_at(p); } - template , int> = 0> + template , int> = 0> static size_type max_size(const Alloc &a) noexcept { return a.max_size(); } - template , int> = 0> + template , int> = 0> static size_type max_size(const Alloc &) noexcept { return std::numeric_limits::max() / sizeof(value_type); } template < class U = Alloc, - enable_if_t, int> = 0> + enable_if_t, int> = 0> static Alloc select_on_container_copy_construction(const Alloc &a) { return a.select_on_container_copy_construction(); } template < class U = Alloc, - enable_if_t, int> = 0> + enable_if_t, int> = 0> static Alloc select_on_container_copy_construction(const Alloc &a) { return a; }