#ifndef CONTAINERS_H
#define CONTAINERS_H
namespace std {
template <typename T>
class iterator {
public:
iterator() {}
iterator(const iterator<T> &iter) : ptr(iter.ptr) {}
typedef T value_type;
typedef T *pointer;
typedef T &reference;
reference operator*() const { return *ptr; }
pointer operator->() const { return ptr; }
iterator &operator++() {
++ptr;
return *this;
}
iterator &operator--() {
--ptr;
return *this;
}
iterator operator++(int) {
iterator res(*this);
++ptr;
return res;
}
iterator operator--(int) {
iterator res(*this);
--ptr;
return res;
}
bool operator!=(const iterator<T> &iter) const {
return ptr != iter.operator->();
}
private:
T *ptr;
};
template <class Iterator>
class const_iterator {
public:
const_iterator() {}
const_iterator(const Iterator &iter) : iter(iter) {}
const_iterator(const const_iterator<Iterator> &citer) : iter(citer.iter) {}
typedef const typename Iterator::value_type value_type;
typedef const typename Iterator::pointer pointer;
typedef const typename Iterator::reference reference;
reference operator*() const { return *iter; }
pointer operator->() const { return iter.operator->(); }
const_iterator &operator++() { return ++iter; }
const_iterator &operator--() { return --iter; }
const_iterator operator++(int) { return iter--; }
const_iterator operator--(int) { return iter--; }
bool operator!=(const Iterator &it) const {
return iter->operator->() != it.operator->();
}
bool operator!=(const const_iterator<Iterator> &it) const {
return iter.operator->() != it.operator->();
}
private:
Iterator iter;
};
template <class Iterator>
class forward_iterable {
public:
forward_iterable() {}
typedef Iterator iterator;
typedef const_iterator<Iterator> const_iterator;
iterator begin() { return _begin; }
iterator end() { return _end; }
const_iterator begin() const { return _begin; }
const_iterator end() const { return _end; }
const_iterator cbegin() const { return _begin; }
const_iterator cend() const { return _end; }
private:
iterator _begin, _end;
};
template <class Iterator>
class reverse_iterator {
public:
reverse_iterator() {}
reverse_iterator(const Iterator &iter) : iter(iter) {}
reverse_iterator(const reverse_iterator<Iterator> &rit) : iter(rit.iter) {}
typedef typename Iterator::value_type value_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
reference operator*() { return *iter; }
pointer operator->() { return iter.operator->(); }
reverse_iterator &operator++() { return --iter; }
reverse_iterator &operator--() { return ++iter; }
reverse_iterator operator++(int) { return iter--; }
reverse_iterator operator--(int) { return iter++; }
private:
Iterator iter;
};
template <class Iterator>
class backward_iterable {
public:
backward_iterable() {}
typedef reverse_iterator<Iterator> reverse_iterator;
typedef const_iterator<reverse_iterator> const_reverse_iterator;
reverse_iterator rbegin() { return _rbegin; }
reverse_iterator rend() { return _rend; }
const_reverse_iterator rbegin() const { return _rbegin; }
const_reverse_iterator rend() const { return _rend; }
const_reverse_iterator crbegin() const { return _rbegin; }
const_reverse_iterator crend() const { return _rend; }
private:
reverse_iterator _rbegin, _rend;
};
template <class Iterator>
class bidirectional_iterable : public forward_iterable<Iterator>,
public backward_iterable<Iterator> {};
template <typename A, typename B>
struct pair {
pair(A f, B s) : first(f), second(s) {}
A first;
B second;
};
class string {
public:
string() {}
string(const char *) {}
};
template <typename T, int n>
class array : public backward_iterable<iterator<T>> {
public:
array() {}
typedef T *iterator;
typedef const T *const_iterator;
iterator begin() { return &v[0]; }
iterator end() { return &v[n - 1]; }
const_iterator begin() const { return &v[0]; }
const_iterator end() const { return &v[n - 1]; }
const_iterator cbegin() const { return &v[0]; }
const_iterator cend() const { return &v[n - 1]; }
private:
T v[n];
};
template <typename T>
class deque : public bidirectional_iterable<iterator<T>> {
public:
deque() {}
};
template <typename T>
class list : public bidirectional_iterable<iterator<T>> {
public:
list() {}
};
template <typename T>
class forward_list : public forward_iterable<iterator<T>> {
public:
forward_list() {}
};
template <typename T>
class vector : public bidirectional_iterable<iterator<T>> {
public:
vector() {}
};
template <typename T>
class set : public bidirectional_iterable<iterator<T>> {
public:
set() {}
};
template <typename T>
class multiset : public bidirectional_iterable<iterator<T>> {
public:
multiset() {}
};
template <typename key, typename value>
class map : public bidirectional_iterable<iterator<pair<key, value>>> {
public:
map() {}
iterator<pair<key, value>> find(const key &) {}
const_iterator<iterator<pair<key, value>>> find(const key &) const {}
};
template <typename key, typename value>
class multimap : public bidirectional_iterable<iterator<pair<key, value>>> {
public:
multimap() {}
};
template <typename T>
class unordered_set : public forward_iterable<iterator<T>> {
public:
unordered_set() {}
};
template <typename T>
class unordered_multiset : public forward_iterable<iterator<T>> {
public:
unordered_multiset() {}
};
template <typename key, typename value>
class unordered_map : public forward_iterable<iterator<pair<key, value>>> {
public:
unordered_map() {}
};
template <typename key, typename value>
class unordered_multimap : public forward_iterable<iterator<pair<key, value>>> {
public:
unordered_multimap() {}
};
} // namespace std
#endif // CONTAINERS_H