diff options
author | Dennis Oberst <dennis.oberst@qt.io> | 2022-12-21 14:12:05 +0100 |
---|---|---|
committer | Dennis Oberst <dennis.oberst@qt.io> | 2023-02-08 21:13:08 +0100 |
commit | 7cbdc8abbda12488f51317313347bbc220b42fe0 (patch) | |
tree | 2babcf1fc2b0d53eaf56196477a6323935f6dc9c /tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp | |
parent | 65cda1f06aa24d9b75e81b37a5c23dcedbc53b92 (diff) |
QVarLengthArray: add STL-style assign()
Implemented assign() methods for QVarLengthArray to align
with the criteria of std::vector, addressing the previously
missing functionality.
Reference:
https://en.cppreference.com/w/cpp/container/vector/assign
[ChangeLog][QtCore][QVarLengthArray] Added assign().
Fixes: QTBUG-106200
Change-Id: If671069808ff561b0f4c77b6c7f7aca360a0c663
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Diffstat (limited to 'tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp')
-rw-r--r-- | tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp index c3a56b68ec..92d4863aab 100644 --- a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp +++ b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp @@ -332,6 +332,16 @@ private Q_SLOTS: void resize_QByteArray() { resize_impl<QByteArray>(); } private: + template<typename Container> + void assign_impl() const; + +private Q_SLOTS: + void assign_std_vector() + { assign_impl<std::vector<int>>(); }; + void assign_QVarLengthArray() + { assign_impl<QVarLengthArray<int, 4>>(); }; + +private: template <typename Container> void front_back_impl() const; @@ -760,6 +770,71 @@ void tst_ContainerApiSymmetry::resize_impl() const } template <typename Container> +void tst_ContainerApiSymmetry::assign_impl() const +{ +#define CHECK(Arr, ComparisonData, Sz_n, Sz_e, Cap_n, Cap_e) \ + QCOMPARE(Sz_n, Sz_e); \ + QCOMPARE(Cap_n, Cap_e); \ + for (const auto &e : Arr) \ + QCOMPARE(e, ComparisonData) \ + /*end*/ + using V = typename Container::value_type; + using S = typename Container::size_type; + auto tData = V(9); + { + // fill version + auto c = make<Container>(4); + c.assign(4, tData); + CHECK(c, tData, c.size(), S(4), c.capacity(), S(4)); + + c.assign(8, tData); + CHECK(c, tData, c.size(), S(8), c.capacity(), S(8)); + + c.assign(0, tData); + CHECK(c, tData, c.size(), S(0), c.capacity(), S(8)); + } + { + // range version for non input iterator + auto c = make<Container>(4); + auto iter = make<Container>(1); + + iter.assign(8, tData); + c.assign(iter.begin(), iter.end()); + CHECK(c, tData, c.size(), S(8), c.capacity(), S(8)); + } + { + // range version for input iterator + auto c = make<Container>(4); + + std::stringstream ss("9 9 "); + c.assign(std::istream_iterator<V>{ss}, std::istream_iterator<V>{}); + CHECK(c, tData, c.size(), S(2), c.capacity(), S(4)); + + ss.str(""); + ss.clear(); + ss << "9 9 9 9 "; + c.assign(std::istream_iterator<V>{ss}, std::istream_iterator<V>{}); + CHECK(c, tData, c.size(), S(4), c.capacity(), S(4)); + + ss.str(""); + ss.clear(); + ss << "9 9 9 9 9 9 9 "; + c.assign(std::istream_iterator<V>{ss}, std::istream_iterator<V>{}); + // We cannot check the capacity here because growth rates differ between implementations. + CHECK(c, tData, c.size(), S(7), 8, S(8)); + } + { + // initializer-list version + auto c = make<Container>(4); + std::initializer_list<V> list = {tData, tData, tData}; + c.assign(list); + CHECK(c, tData, c.size(), S(3), c.capacity(), S(4)); + } + +#undef CHECK +} + +template<typename Container> void tst_ContainerApiSymmetry::front_back_impl() const { using V = typename Container::value_type; |