Files
pig2014 d068332b88 feat: initial commit
Code is from cxx.uclibc.org, modified by catty to implement c++17
features
2025-03-26 09:29:24 +08:00

245 lines
5.7 KiB
C++

#include <vector>
#include <string>
#include <iostream>
#include "testframework.h"
class myclass{
private:
int num;
public:
myclass() : num(0) { }
myclass(int i): num(i) { }
~myclass() {
std::cout << "Calling destructor with num: " << num << std::endl;
num = -1;
}
void printout() const {
std::cout << num << std::endl;
}
int getNum() const {
return num;
}
void setNum(int i){
num = i;
}
};
bool canCompareConstNonConstIter() {
std::vector<long> v;
v.push_back(5);
v.push_back(6);
v.push_back(7);
std::vector<long>::const_iterator i = v.begin();
std::vector<long>::iterator j = v.begin();
std::vector<long>::iterator k = v.end();
if (i == i && i == j && j == i && j == j) {
// Do nothing
} else {
return false;
}
if (i != i || i != j || j != i || j != j) {
return false;
}
return true;
}
int main(){
std::vector<char, std::allocator<char> > ctest;
std::string stest;
ctest.push_back('t');
std::vector<int> test;
std::vector<int> test1;
unsigned int temp;
std::vector<int>::iterator i,j;
test.push_back(1);
test.push_back(2);
test.push_back(3);
test.push_back(4);
test.push_back(5);
std::cout << "Element 0: " << test[0] << std::endl;
std::cout << "Element 1: " << test[1] << std::endl;
std::cout << "Element 2: " << test[2] << std::endl;
std::cout << "Element 3: " << test[3] << std::endl;
std::cout << "Element 4: " << test[4] << std::endl;
test.pop_back();
std::cout << "Testing at(int)\n";
std::cout << "Element 0: " << test.at(0) << std::endl;
std::cout << "Element 1: " << test.at(1) << std::endl;
std::cout << "Element 2: " << test.at(2) << std::endl;
std::cout << "Element 3: " << test.at(3) << std::endl;
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << "Testing iterator insert\n";
i = test.begin();
++i;
++i;
i = test.insert(i, 12);
std::cout << "Return value points to: " << *i << ", should be 12\n";
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << "Testing iterator multi-insert\n";
i = test.begin();
++i;
temp = 23;
test.insert(i, 3, temp);
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << "Testing iterator erase\n";
i = test.begin();
++i;
++i;
test.erase(i);
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << "Testing iterator multierase\n";
i = test.begin();
j = test.begin();
++i;
++i;
j+=4;
test.erase(i, j);
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << "Testing iterator range insert\n";
test1.clear();
test1.insert(test1.begin(), test.begin(), test.end());
std::cout << "The following should be the same as the above:\n";
for(i=test.begin(); i!=test.end(); i++){
std::cout << "Element: " << *i << std::endl;
}
std::cout << std::endl << "Testing vectors of pointers\n";
myclass m1(1);
myclass m2(2);
myclass m3(3);
myclass m4(4);
myclass m5(5);
std::vector<myclass *> mcp;
mcp.push_back(&m1);
mcp.push_back(&m2);
mcp.push_back(&m3);
mcp.push_back(&m4);
mcp.push_back(&m5);
mcp[0]->printout();
mcp[1]->printout();
mcp[2]->printout();
mcp[3]->printout();
mcp[4]->printout();
std::vector<myclass *>::iterator mcpi;
mcpi = mcp.end();
while(mcpi != mcp.begin()){
--mcpi;
(*mcpi)->printout();
}
mcp.pop_back();
mcpi = mcp.end();
while(mcpi != mcp.begin()){
--mcpi;
(*mcpi)->printout();
}
mcp.clear();
std::cout << "Pushing back instances of myclass created with new" << std::endl;
mcp.push_back(new myclass());
mcp.push_back(new myclass());
mcp.push_back(new myclass());
mcp.push_back(new myclass());
mcp.push_back(new myclass());
mcp.push_back(new myclass());
std::cout << "Deleting instances of myclass directly from iterator" << std::endl;
for(mcpi = mcp.begin(); mcpi != mcp.end(); ++mcpi){
std::cout << "Deleteing myclass instance" << std::endl;
delete *mcpi;
}
std::cout << "Delete completed on myclass instances" << std::endl;
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 4" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
std::cout << "Testing resize()" << std::endl;
mcp.resize(1, &m5);
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 1" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
mcp.resize(95, &m4);
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 95" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
mcp.resize(1, &m4);
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 1" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
mcp.push_back(&m3);
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 2" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
for(int j = 0; j < 100; ++j){
mcp.push_back(&m2);
}
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 102" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
myclass * m6 = new myclass(6);
mcp.push_back(m6);
std::cout << "The following two lines should be identical:" << std::endl;
std::cout << "Vector size: 103" << std::endl;
std::cout << "Vector size: " << mcp.size() << std::endl;
mcp.clear();
delete m6;
TestFramework::init();
TestFramework::AssertReturns<bool>(canCompareConstNonConstIter, true);
TestFramework::results();
return 0;
}