diff --git a/include/fmt/format.h b/include/fmt/format.h index 7d08bc26..065aa496 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -465,45 +465,16 @@ class counting_iterator { value_type operator*() const { return {}; } }; -// Used to ensure that truncating_iterator SFINAEs properly on the underlying -// iterator's default constructibility. -template ::type> -class truncating_iterator_default_construct_base; - -template -class truncating_iterator_default_construct_base { +template class truncating_iterator_base { protected: OutputIt out_; - - truncating_iterator_default_construct_base() = delete; - - explicit truncating_iterator_default_construct_base(OutputIt out) : - out_(std::move(out)) {} -}; - -template -class truncating_iterator_default_construct_base { - protected: - OutputIt out_; - - truncating_iterator_default_construct_base() : out_() {} - - explicit truncating_iterator_default_construct_base(OutputIt out) : - out_(std::move(out)) {} -}; - -template class truncating_iterator_base - : protected truncating_iterator_default_construct_base { - protected: - size_t limit_ = 0; + size_t limit_; size_t count_ = 0; - truncating_iterator_base() = default; + truncating_iterator_base() : out_(), limit_(0) {} truncating_iterator_base(OutputIt out, size_t limit) - : truncating_iterator_default_construct_base(out), - limit_(limit), count_(0) {} + : out_(out), limit_(limit) {} public: using iterator_category = std::output_iterator_tag; @@ -514,7 +485,7 @@ template class truncating_iterator_base using _Unchecked_type = truncating_iterator_base; // Mark iterator as checked. - OutputIt base() const { return this->out_; } + OutputIt base() const { return out_; } size_t count() const { return count_; } }; diff --git a/test/format-test.cc b/test/format-test.cc index ad2070b1..a71aeaf1 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -170,27 +170,6 @@ TEST(IteratorTest, TruncatingIteratorDefaultConstruct) { EXPECT_EQ(std::size_t{0}, it.count()); } -TEST(IteratorTest, TruncatingIteratorDeletedDefaultConstruct) { - struct non_default_constructible_iterator { - using iterator_category = std::output_iterator_tag; - using value_type = void; - using difference_type = std::ptrdiff_t; - using pointer = void; - using reference = void; - - non_default_constructible_iterator() = delete; - - non_default_constructible_iterator& operator++(); - non_default_constructible_iterator operator++(int); - char& operator*() const; - }; - - static_assert( - !std::is_default_constructible>::value, - ""); -} - #ifdef __cpp_lib_ranges TEST(IteratorTest, TruncatingIteratorOutputIterator) { static_assert(std::output_iterator,