Added iterator support to the vector class.
In iterator, implemented the iterator diff operator.
Minor renaming of some parameters in the iterator functions.
More tests to exercise the iterator arithmetic.
diff --git a/include/iterator b/include/iterator
index b983a1c..3dee58f 100644
--- a/include/iterator
+++ b/include/iterator
@@ -165,27 +165,43 @@
 // Forward iterator requirements
 template<typename _IteratorL, typename _IteratorR, typename _Container>
 inline bool
-operator==(const __wrapper_iterator<_IteratorL, _Container>& __lhs,
-	       const __wrapper_iterator<_IteratorR, _Container>& __rhs)
-{ return __lhs.base() == __rhs.base(); }
+operator==(const __wrapper_iterator<_IteratorL, _Container>& lhs,
+	       const __wrapper_iterator<_IteratorR, _Container>& rhs)
+{ return lhs.base() == rhs.base(); }
 
 template<typename _Iterator, typename _Container>
 inline bool
-operator==(const __wrapper_iterator<_Iterator, _Container>& __lhs,
-	       const __wrapper_iterator<_Iterator, _Container>& __rhs)
-{ return __lhs.base() == __rhs.base(); }
+operator==(const __wrapper_iterator<_Iterator, _Container>& lhs,
+	       const __wrapper_iterator<_Iterator, _Container>& rhs)
+{ return lhs.base() == rhs.base(); }
 
 template<typename _IteratorL, typename _IteratorR, typename _Container>
 inline bool
-operator!=(const __wrapper_iterator<_IteratorL, _Container>& __lhs,
-	       const __wrapper_iterator<_IteratorR, _Container>& __rhs)
-{ return __lhs.base() != __rhs.base(); }
+operator!=(const __wrapper_iterator<_IteratorL, _Container>& lhs,
+	       const __wrapper_iterator<_IteratorR, _Container>& rhs)
+{ return lhs.base() != rhs.base(); }
 
 template<typename _Iterator, typename _Container>
 inline bool
-operator!=(const __wrapper_iterator<_Iterator, _Container>& __lhs,
-	       const __wrapper_iterator<_Iterator, _Container>& __rhs)
-{ return __lhs.base() != __rhs.base(); }
+operator!=(const __wrapper_iterator<_Iterator, _Container>& lhs,
+	       const __wrapper_iterator<_Iterator, _Container>& rhs)
+{ return lhs.base() != rhs.base(); }
+
+// operator+ so we support 100 + iterator<>.
+template<typename _Iterator, typename _Container>
+inline __wrapper_iterator<_Iterator, _Container>
+operator+(typename __wrapper_iterator<_Iterator, _Container>::difference_type n,
+	      const __wrapper_iterator<_Iterator, _Container>& i)
+{ return __wrapper_iterator<_Iterator, _Container>(i.base() + n); }
+
+// operator- : diff is supported on iterators.
+
+template<typename _Iterator, typename _Container>
+inline typename __wrapper_iterator<_Iterator, _Container>::difference_type
+operator-(const __wrapper_iterator<_Iterator, _Container>& lhs,
+	      const __wrapper_iterator<_Iterator, _Container>& rhs)
+{ return lhs.base() - rhs.base(); }
+
 
 }  // namespace std
 
diff --git a/include/vector b/include/vector
index 978d4d1..b5f363a 100644
--- a/include/vector
+++ b/include/vector
@@ -34,6 +34,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <algorithm>
+#include <iterator>
 #include <memory>
 #include <type_traits.h>
 
@@ -58,6 +59,8 @@
 template<typename _T>
 class vector
 {
+    typedef vector<_T> vector_type;
+
   public:
     typedef _T         value_type;
     typedef _T*        pointer;
@@ -65,8 +68,8 @@
     typedef _T&        reference;
     typedef const _T&  const_reference;
 
-    typedef pointer iterator;
-    typedef const_pointer const_iterator;
+    typedef __wrapper_iterator<pointer,vector_type>  iterator;
+    typedef __wrapper_iterator<const_pointer,vector_type> const_iterator;
 
     typedef size_t    size_type;
     typedef ptrdiff_t difference_type;
@@ -112,13 +115,11 @@
     // @return A reference to the element.
     reference operator[](size_type index) { return *(mBegin + index); }
 
-    // We don't have iterator, use pointers for now.  begin and end
-    // return NULL if the vector has been cleared or not initialized.
-    iterator begin() { return mBegin; }
-    iterator end() { return mBegin + mLength; }
+    iterator begin() { return iterator(mBegin); }
+    iterator end() { return iterator(mBegin + mLength); }
 
-    const_iterator begin() const { return mBegin; }
-    const_iterator end() const { return mBegin + mLength; }
+    const_iterator begin() const { return const_iterator(mBegin); }
+    const_iterator end() const { return const_iterator(mBegin + mLength); }
 
     // Add data at the end of the vector. Constant in time if the
     // memory has been preallocated (e.g using reserve).
diff --git a/tests/test_vector.cpp b/tests/test_vector.cpp
index 99007b7..2412607 100644
--- a/tests/test_vector.cpp
+++ b/tests/test_vector.cpp
@@ -78,7 +78,6 @@
     {
         const vector<int> vec1(100, 10);
 
-        EXPECT_TRUE(vec1.end() - vec1.begin() == 100);
         for (int i = 0; i < 100; ++i)
         {
             EXPECT_TRUE(vec1[i] == 10);
@@ -239,7 +238,7 @@
     EXPECT_TRUE(vec1.size() == 0);
     EXPECT_TRUE(vec1.capacity() == 0);
     EXPECT_TRUE(vec1.begin() == vec1.end());
-    EXPECT_TRUE(vec1.begin() == NULL);
+    EXPECT_TRUE(vec1.begin().base() == NULL);
 
     CtorDtorCounter instance;
     vector<CtorDtorCounter> vec2(10, instance);
@@ -294,6 +293,28 @@
     {
         EXPECT_TRUE(c == *j);
     }
+
+    {
+        const vector<int> vec1(100, 10);
+
+        EXPECT_TRUE(vec1.end().operator-(100) == vec1.begin());
+        EXPECT_TRUE(vec1.end() - 100 == vec1.begin());
+
+        EXPECT_TRUE(100 + vec1.begin() == vec1.end());
+        EXPECT_TRUE(vec1.begin() + 100 == vec1.end());
+
+        EXPECT_TRUE(vec1.end() - vec1.begin() == 100);
+
+        for (vector<int>::const_iterator i = vec1.begin();
+             i != vec1.end(); ++i) {
+            EXPECT_TRUE(*i == 10);
+        }
+    }
+
+    {
+        const vector<int> vec2;
+        EXPECT_TRUE(vec2.begin() == vec2.end());
+    }
     return true;
 }