@@ -720,6 +720,41 @@ inline constexpr void deque_grow_back_common(dequecontroltype &controller) noexc
720720 ::fast_io::containers::details::deque_grow_back_common_impl<allocator>(controller, align, blockbytes);
721721}
722722
723+
724+ template <typename allocator, typename dequecontroltype>
725+ inline constexpr void deque_clear_common_impl (dequecontroltype &controller, ::std::size_t blockbytes)
726+ {
727+ auto start_reserved_ptr{controller.controller_block .controller_start_reserved_ptr };
728+ auto after_reserved_ptr{controller.controller_block .controller_after_reserved_ptr };
729+ if (start_reserved_ptr == after_reserved_ptr)
730+ {
731+ return ;
732+ }
733+ auto const reserved_blocks_count{
734+ static_cast <::std::size_t >(after_reserved_ptr - start_reserved_ptr)};
735+ auto const half_reserved_blocks_count{
736+ static_cast <::std::size_t >(reserved_blocks_count >> 1u )};
737+ auto reserved_pivot{start_reserved_ptr + half_reserved_blocks_count};
738+ using replacetype = typename dequecontroltype::replacetype;
739+ constexpr bool isvoidplaceholder = std::same_as<replacetype, void >;
740+ using begin_ptrtype =
741+ std::conditional_t <isvoidplaceholder, std::byte *, replacetype *>;
742+ auto begin_ptr{static_cast <begin_ptrtype>(*reserved_pivot)};
743+ auto end_ptr{begin_ptr + blockbytes};
744+ auto mid_ptr{begin_ptr + static_cast <::std::size_t >(blockbytes >> 1u )};
745+ controller.back_block .controller_ptr = controller.front_block .controller_ptr = reserved_pivot;
746+ controller.back_block .begin_ptr = controller.front_block .begin_ptr = begin_ptr;
747+ controller.back_block .curr_ptr = controller.front_block .curr_ptr = mid_ptr;
748+ controller.back_block .end_ptr = controller.front_block .end_ptr = end_ptr;
749+ }
750+
751+ template <typename allocator, ::std::size_t sz, ::std::size_t block_size, typename dequecontroltype>
752+ inline constexpr void deque_clear_common (dequecontroltype &controller) noexcept
753+ {
754+ constexpr ::std::size_t blockbytes{sz * block_size};
755+ ::fast_io::containers::details::deque_clear_common_impl<allocator>(controller, blockbytes);
756+ }
757+
723758} // namespace details
724759
725760template <typename T, typename allocator>
@@ -782,7 +817,7 @@ class deque FAST_IO_TRIVIALLY_RELOCATABLE_IF_ELIGIBLE
782817 {
783818 if (__builtin_is_constant_evaluated ())
784819 {
785- ::fast_io::containers::details::deque_grow_front_common<allocator, alignof (value_type), sizeof (value_type) , block_size>(controller);
820+ ::fast_io::containers::details::deque_grow_front_common<allocator, alignof (value_type), 1u , block_size>(controller);
786821 }
787822 else
788823 {
@@ -797,7 +832,7 @@ class deque FAST_IO_TRIVIALLY_RELOCATABLE_IF_ELIGIBLE
797832 {
798833 if (__builtin_is_constant_evaluated ())
799834 {
800- ::fast_io::containers::details::deque_grow_back_common<allocator, alignof (value_type), sizeof (value_type) , block_size>(controller);
835+ ::fast_io::containers::details::deque_grow_back_common<allocator, alignof (value_type), 1u , block_size>(controller);
801836 }
802837 else
803838 {
@@ -821,20 +856,21 @@ class deque FAST_IO_TRIVIALLY_RELOCATABLE_IF_ELIGIBLE
821856 }
822857
823858public:
824- #if 0
825859 inline constexpr void clear () noexcept
826860 {
827- if (controller.controller_block.start_ptr == controller.controller_block.start_ptr )
861+ if constexpr (!::std::is_trivially_destructible_v<value_type> )
828862 {
829- return;
863+ this ->destroy_all_elements ();
864+ }
865+ if (__builtin_is_constant_evaluated ())
866+ {
867+ ::fast_io::containers::details::deque_clear_common<allocator, 1u , block_size>(controller);
868+ }
869+ else
870+ {
871+ ::fast_io::containers::details::deque_clear_common<allocator, sizeof (value_type), block_size>(*reinterpret_cast <::fast_io::containers::details::deque_controller_common *>(__builtin_addressof (controller)));
830872 }
831- this->destroy();
832- size_type n{(controller.back_block.controller_ptr - controller.front_block.controller_ptr)};
833- n >>= 1u;
834- auto mid{controller.front_block.controller_ptr + n};
835- *mid;
836873 }
837- #endif
838874 template <typename ... Args>
839875 requires ::std::constructible_from<value_type, Args...>
840876 inline constexpr reference emplace_back (Args &&...args)
0 commit comments