/**
@file
@brief C++03 / C++98
@defgroup CPP03 C++03 examples
@brief C++03 / C++98
https://en.wikipedia.org/wiki/C++03
@{
*/
#include
using namespace std;
/**
@defgroup lang03 Language
@{
*/
void init_03()
{
// https://en.cppreference.com/w/cpp/language/copy_initialization
int x3 = { 3 };
double x4 = { 3.0 };
struct point {
int x, y;
};
point p1 = { 1, 2 };
(void)p1.x;
(void)p1.y;
#if gcc_extension
// designated initializers
// https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
__extension__ point gpp_ext = { .x = 1 }; // C99-like gcc extension
__extension__ point gcc_ext = { x : 1 }; // C-like gcc extension
#endif
// Mutable
struct struct_with_mutable {
struct_with_mutable() {};
mutable int m;
} const const_struct_with_mutable;
const_struct_with_mutable.m = 2;
assert(const_struct_with_mutable.m == 2);
int y = 0;
int& reference = y;
reference = 1;
assert(y == 1);
}
/**
[set](https://en.cppreference.com/w/cpp/container/set)
[map](https://en.cppreference.com/w/cpp/container/map)
[multimap](https://en.cppreference.com/w/cpp/container/multimap)
*/
void associative_containers_03()
{
set s;
s.insert(1);
s.insert(2);
assert(*s.find(1) == 1);
assert(s.find(3) == s.end());
map m;
m['a'] = 1;
m.insert(make_pair('b', 2));
++m['a'];
assert(m['a'] == 2);
multimap mm;
mm.insert(make_pair('c', 1));
mm.insert(make_pair('b', 2));
mm.insert(make_pair('a', 3));
mm.insert(make_pair('a', 4));
multimap::iterator i = mm.find('a');
assert(i->second == 3);
i++;
assert(i->second == 4);
i++;
assert(i->first == 'b');
assert(i->second == 2);
}
template
void test_generic_container(C& c)
{
assert(c.empty());
assert(c.max_size() > 1000);
c.push_back(0);
assert(c.front() == 0);
assert(c.back() == 0);
assert(c.size() == 1);
c.push_back(1);
c.push_back(2);
c.push_back(3);
assert(c.size() == 4);
for (typename C::iterator i = c.begin(); i != c.end();) {
if (*i == 1) {
i = c.erase(i);
continue;
}
if (*i == 2) {
c.erase(i++);
continue;
}
++i;
}
assert(c.size() == 2);
assert(c.front() == 0);
assert(c.back() == 3);
c.assign(4, 1);
assert(c.size() == 4);
c.clear();
}
template
void test_vector_container(V& v)
{
string err;
try {
v.at(666) = 0;
} catch (out_of_range const& exc) {
err = exc.what();
}
assert(err.length());
assert(v[0] == 1);
v.resize(4);
int arr[] = { 1, 2, 3 };
v.insert(v.begin(), arr, arr + 3);
assert(v[1] == 2);
}
/// [container](https://en.cppreference.com/w/cpp/container)
void container_03()
{
list l;
test_generic_container(l);
vector v;
test_generic_container(v);
test_vector_container(v);
v.reserve(10);
assert(v.capacity() == 10);
deque d;
test_generic_container(d);
test_vector_container(d);
stack s;
s.push(1);
assert(s.top() == 1);
s.push(2);
assert(s.top() == 2);
s.pop();
assert(s.top() == 1);
s.pop();
assert(s.empty());
queue q;
q.push(1);
q.push(2);
assert(q.front() == 1);
assert(q.back() == 2);
q.pop();
assert(q.front() == 2);
q.pop();
assert(q.empty());
priority_queue pq;
pq.push(2);
pq.push(3);
pq.push(1);
assert(pq.top() == 3);
associative_containers_03();
}
/**
@fn void sort_03()
http://www.cplusplus.com/reference/algorithm/sort/?kw=sort
Compare with @ref lambda::sort_11 and @ref sort_libc
*/
/// @private
bool func(int i, int j) { return i < j; }
/// @private
struct _ {
bool operator()(int i, int j) { return i < j; }
} functor;
void sort_03()
{
int a[] = { 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 };
list list(a, a + sizeof a / sizeof a[0]);
list.sort();
vector v(a, a + sizeof a / sizeof a[0]);
// using default comparison (operator = prev);
prev = *i;
}
}
/// [algorithm](https://en.cppreference.com/w/cpp/algorithm)
void algo_03()
{
int a[] = { 1, 2, 3 };
vector v(a, a + sizeof a / sizeof a[0]);
vector r(sizeof a / sizeof a[0]);
reverse_copy(v.begin(), v.end(), r.begin());
assert(r[0] > r[1]);
sort_03();
}
/// [reference](https://en.cppreference.com/w/cpp/language/reference)
int& a_ref(int& a) { return a; }
struct Common {
int n;
Common(int x)
: n(x)
{
}
};
/// [ref](https://en.cppreference.com/w/cpp/language/virtual)
struct Virtual_A : virtual Common {
Virtual_A()
: Common(1)
{
}
};
struct Virtual_B : virtual Common {
Virtual_B()
: Common(2)
{
}
};
struct Diamond : Virtual_A, Virtual_B {
Diamond()
: Common(3)
, Virtual_A()
, Virtual_B()
{
}
};
void types_03()
{
int a = 0;
assert(typeid(int) == typeid(a));
assert(typeid(int).name() == string("i"));
a_ref(a) = 2;
assert(a == 2);
Diamond d;
assert(d.Virtual_A::n == 3);
assert(d.Virtual_B::n == 3);
}
/// @}
int main(void)
{
assert(__cplusplus == 199711);
init_03();
container_03();
algo_03();
types_03();
assert(min(1, 2) == 1);
assert(max(1, 2) == 2);
pair p(1, 'a');
assert(p.first == 1);
assert(p.second == 'a');
p = make_pair('b', 2);
assert(p.first == 'b');
}
/// @}