//  (C) Porkolab 2003
//
//  A.6.1.
//  Types defined in a container


template <class T, class A = allocator<T> > class std::vector {
public:
    // types:

    typedef T value_type;           // type of element
    typedef A allocator_type;       // type of memory manager
    typedef typename A::size_type size_type;
    typedef typename A::difference_type difference_type;

    typedef implementation_dependent1 iterator;         // T*
    typedef implementation_dependent2 const_iterator;   // const T*
    typedef std::reverse_iterator<iterator> reverse_iterator;
    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

    typedef typename A::pointer pointer;        // pointer to element
    typedef typename A::const_pointer const_pointer;
    typedef typename A::reference reference;    // reference to element
    typedef typename A::const_reference const_reference;

    // ...
};


/*
 *  usage of types declared in a container 
 *  makes you be able to write generic code
 *
 */

template<class C> typename C::value_type sum(const C& c)
{
    typename C::value_type s = 0;
    typename C::const_iterator p = c.begin();   // start at the beginning
    while (p!=c.end()) {                        // continue until the end
        s += *p;        // get value of element
        ++p;            // make p point to next element
    }
    return s;
}