From c187d34ce746e88d63270ee272cb205b12cc0476 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Fri, 10 Jun 2022 16:47:56 +0200 Subject: [PATCH] vector insert ok --- headers/vector.hpp | 7 +- templates/vector.tpp | 93 ++++++++++++++++--- tests/main.cpp | 207 +++++++++++++++++++++++++++++++------------ tests/test.sh | 6 +- 4 files changed, 240 insertions(+), 73 deletions(-) diff --git a/headers/vector.hpp b/headers/vector.hpp index fbf715a..5367d3b 100644 --- a/headers/vector.hpp +++ b/headers/vector.hpp @@ -119,9 +119,10 @@ public: void pop_back(); // insert ------------------------------------ iterator insert(iterator position, const value_type& val); -// void insert(iterator position, size_type n, const value_type& val); -// template -// void insert(iterator position, InputIterator first, InputIterator last); + void insert(iterator position, size_type n, const value_type& val); + template + typename enable_if< !is_integral::value,void >::type + insert(iterator position, InputIterator first, InputIterator last); // erase ------------------------------------- iterator erase(iterator position); iterator erase(iterator first, iterator last); diff --git a/templates/vector.tpp b/templates/vector.tpp index 3cd1371..3aa3c1a 100644 --- a/templates/vector.tpp +++ b/templates/vector.tpp @@ -259,9 +259,9 @@ VT_TPL typename VT::iterator VT:: } it = end(); if (position != it) - { + { _allocator.construct(it, *(it - 1)); - while (--it != position) + while (it-- != position) *(it + 1) = *it; } _allocator.destroy(position); @@ -269,14 +269,87 @@ VT_TPL typename VT::iterator VT:: _size++; return (position); } -//VT_TPL void VT:: -// insert(iterator position, size_type n, const value_type& val) { -// -//} -//VT_TPL template void VT:: -// insert(iterator position, InputIterator first, InputIterator last) { -// -//} +VT_TPL void VT:: + insert(iterator position, size_type n, const value_type& val) { + + difference_type distance; + iterator it_end; + iterator it; + + if (_size + n > _capacity) + { + distance = position - begin(); + _increment_capacity(n); + position = begin() + distance; + } + + it_end = end(); + if (position != it_end) + { + it = it_end; + while (it + n != it_end && it != position) + { + it--; + _allocator.construct(it + n, *it); + } + while (it != position) + { + it--; + *(it + n) = *it; + } + _destroy(position, std::min(position + n, it_end)); + } + + for (size_type i = 0; i < n; i++, position++) + _allocator.construct(position, val); + _size += n; +} +VT_TPL template +typename enable_if< !is_integral::value,void >::type VT:: + insert(iterator position, InputIterator first, InputIterator last) { + + difference_type dist; + difference_type n; + iterator it_end; + iterator it; + + n = std::distance(first, last); + if (_size + n > _capacity) + { + dist = position - begin(); + _increment_capacity(n); + position = begin() + dist; + } + + it_end = end(); + if (position != it_end) + { + it = it_end; + while (it + n != it_end && it != position) + { + it--; + _allocator.construct(it + n, *it); + } + while (it != position) + { + it--; + *(it + n) = *it; + } + _destroy(position, std::min(position + n, it_end)); + } + +// for (size_type i = 0; i < n; i++, position++) +// _allocator.construct(position, val); + + while (first != last) + { + _allocator.construct(position, *first); + ++position; + ++first; + } + + _size += n; +} // erase ------------------------------------- VT_TPL typename VT::iterator VT:: erase(iterator position) { diff --git a/tests/main.cpp b/tests/main.cpp index 170a4bb..23aca65 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -11,11 +11,23 @@ #include "vector.hpp" #endif -struct mystruct { int value; }; +/**/ // struct for tests +/**/ +/**/ struct mystruct { +/**/ public: +/**/ mystruct(int data = 1) {_val = new int[1]; _val[0] = data;} +/**/ ~mystruct() {delete[] _val;} +/**/ int * get_data() const {return _val;} +/**/ private: +/**/ int * _val; +/**/ }; +/**/ std::ostream & operator<<(std::ostream & o, mystruct const & rhs) { +/**/ o << rhs.get_data()[0]; +/**/ return (o); +/**/ } int main() { -/* TEST(vector::vector (constructor)) { // title @@ -105,7 +117,6 @@ int main() { std::cout << '\n'; } TESTEND -*/ /* @@ -152,7 +163,6 @@ int main() { */ -/* TEST(vector::size) { // title @@ -623,95 +633,177 @@ int main() { std::cout << "capacity : " << myvector.capacity() << '\n'; } TESTEND -*/ TEST(vector::insert) { -// // title -// TITLE(cplusplus.com reference :) -// -// std::vector myvector (3,100); -// std::vector::iterator it; -// -// it = myvector.begin(); -// it = myvector.insert ( it , 200 ); -// -// myvector.insert (it,2,300); -// -// // "it" no longer valid, get a new one: -// it = myvector.begin(); -// -// std::vector anothervector (2,400); -// myvector.insert (it+2,anothervector.begin(),anothervector.end()); -// -// int myarray [] = { 501,502,503 }; -// myvector.insert (myvector.begin(), myarray, myarray+3); -// -// std::cout << "myvector contains:"; -// for (it=myvector.begin(); it::iterator it; + ft::vector::iterator its; + int i; + + // title + TITLE(cplusplus.com reference :) + + ft::vector myvector (3,100); + + it = myvector.begin(); + it = myvector.insert ( it , 200 ); + myvector.insert (it,2,300); + + ft::vector anothervector (2,400); + it = myvector.begin(); + myvector.insert (it+2,anothervector.begin(),anothervector.end()); + + int myarray [] = { 501,502,503 }; + myvector.insert (myvector.begin(), myarray, myarray+3); + + std::cout << "myvector contains:"; + for (it=myvector.begin(); it myvector2 (3,100); - ft::vector::iterator it2; - it2 = myvector2.begin(); - std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n"; - myvector2.insert ( it2 , 200 ); + it = myvector2.begin(); + std::cout << "size:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n"; + myvector2.insert ( it , 200 ); std::cout << "myvector contains:"; - for (it2 = myvector2.begin(); it2 < myvector2.end(); it2++) - std::cout << ' ' << *it2; + for (it = myvector2.begin(); it < myvector2.end(); it++) + std::cout << ' ' << *it; std::cout << "\nsize:" << myvector2.size() << " capacity:" << myvector2.capacity() << "\n"; ft::vector myvector3 (3,100); - ft::vector::iterator it3; - it3 = myvector3.end(); + it = myvector3.end(); std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n"; - myvector3.insert ( it3 , 200 ); + myvector3.insert ( it , 200 ); std::cout << "myvector contains:"; - for (it3 = myvector3.begin(); it3 < myvector3.end(); it3++) - std::cout << ' ' << *it3; + for (it = myvector3.begin(); it < myvector3.end(); it++) + std::cout << ' ' << *it; std::cout << "\nsize:" << myvector3.size() << " capacity:" << myvector3.capacity() << "\n"; // title TITLE(tests positions on insert(pos, value) with struct :) - mystruct s_1; - mystruct s_2; + ft::vector myvector4; + mystruct *s; - s_1.value = 1; - s_2.value = 2; + i = 0; + while (i < 3) + { + s = new mystruct(i++); + myvector4.push_back(s); + } - ft::vector myvector4 (3,s_1); - ft::vector::iterator it4; - - it4 = myvector4.begin(); - std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; - myvector4.insert ( it4 , s_2 ); + its = myvector4.begin(); + std::cout << "size:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; + s = new mystruct(i++); + myvector4.insert ( its , s ); std::cout << "myvector contains:"; - for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++) - std::cout << ' ' << (*it4).value; + for (its = myvector4.begin(); its < myvector4.end(); its++) + std::cout << ' ' << **its; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; - it4 = myvector4.begin() + 2; + its = myvector4.begin() + 2; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; - myvector4.insert ( it4 , s_2 ); + s = new mystruct(i++); + myvector4.insert ( its , s ); std::cout << "myvector contains:"; - for (it4 = myvector4.begin(); it4 < myvector4.end(); it4++) - std::cout << ' ' << (*it4).value; + for (its = myvector4.begin(); its < myvector4.end(); its++) + std::cout << ' ' << **its; std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; + + its = myvector4.end(); + std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; + s = new mystruct(i++); + myvector4.insert ( its , s ); + std::cout << "myvector contains:"; + for (its = myvector4.begin(); its < myvector4.end(); its++) + std::cout << ' ' << **its; + std::cout << "\nsize:" << myvector4.size() << " capacity:" << myvector4.capacity() << "\n"; + + + // title + TITLE(tests insert(pos, size, value) :) + + ft::vector myvector5; + + for (i = 1; i <= 5; i++) + myvector5.push_back(i * 100); + + it = myvector5.begin() + 1; + myvector5.insert ( it , 150 ); + + it = myvector5.end(); + myvector5.insert (it,2,600); + + it = myvector5.end() - 2; + myvector5.insert (it,2,550); + + std::cout << "myvector contains:"; + for (it = myvector5.begin(); it < myvector5.end(); it++) + std::cout << ' ' << *it; + std::cout << '\n'; + std::cout << "\nsize:" << myvector5.size() << " capacity:" << myvector5.capacity() << "\n"; + + + // title + TITLE(tests positions on insert(pos, value) with struct :) + + ft::vector myvector6; + + i = 1; + while (i <= 5) + { + s = new mystruct(i++ * 100); + myvector6.push_back(s); + } + + its = myvector6.begin() + 1; + s = new mystruct(150); + myvector6.insert ( its , s ); + + its = myvector6.end(); + s = new mystruct(600); + myvector6.insert ( its, 2, s ); + + its = myvector6.end() - 2; + s = new mystruct(550); + myvector6.insert ( its, 2, s ); + + std::cout << "myvector contains:"; + for (its = myvector6.begin(); its < myvector6.end(); its++) + std::cout << ' ' << **its; + std::cout << "\nsize:" << myvector6.size() << " capacity:" << myvector6.capacity() << "\n"; + + + // title + TITLE(tests insert(pos, first, last) with struct :) + + ft::vector myvector7; + + for (i = 0; i < 5; i++) + { + s = new mystruct(42); + myvector7.push_back(s); + } + + its = myvector7.begin() + 2; + myvector7.insert ( its, myvector6.begin() + 3, myvector6.end() - 2 ); + + std::cout << "myvector contains:"; + for (its = myvector7.begin(); its < myvector7.end(); its++) + std::cout << ' ' << **its; + std::cout << "\nsize:" << myvector7.size() << " capacity:" << myvector7.capacity() << "\n"; } TESTEND -/* TEST(vector::erase) { // title @@ -843,7 +935,6 @@ int main() { myvector.get_allocator().deallocate(p,5); } TESTEND -*/ // execute tests and print them : diff --git a/tests/test.sh b/tests/test.sh index f180752..edbbfec 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -2,9 +2,11 @@ # cd $(dirname $0) make stl > /dev/null -./containers > tests/output_stl.log +echo -e "\nstl :" +time ./containers > tests/output_stl.log make ft > /dev/null -./containers > tests/output_ft.log +echo -e "\nft :" +time ./containers > tests/output_ft.log diff --context=0 --color=always tests/output_stl.log tests/output_ft.log