pw_containers: Use unsigned short for Vector sizes

Since pw::Vectors are statically allocated, 65535 is a reasonable upper
limit for the number of entries in the vector.

Change-Id: I5a2fda53d522cffd70138d34b60273c6083ffe41
diff --git a/pw_containers/public/pw_containers/vector.h b/pw_containers/public/pw_containers/vector.h
index a518f28..4dea246 100644
--- a/pw_containers/public/pw_containers/vector.h
+++ b/pw_containers/public/pw_containers/vector.h
@@ -17,6 +17,7 @@
 #include <cstddef>
 #include <initializer_list>
 #include <iterator>
+#include <limits>
 #include <new>
 #include <type_traits>
 #include <utility>
@@ -46,17 +47,17 @@
 template <typename T, size_t kMaxSize = vector_impl::kGeneric>
 class Vector : public Vector<T, vector_impl::kGeneric> {
  public:
-  using value_type = T;
-  using size_type = size_t;
-  using difference_type = ptrdiff_t;
-  using reference = value_type&;
-  using const_reference = const value_type&;
-  using pointer = T*;
-  using const_pointer = const T*;
-  using iterator = T*;
-  using const_iterator = const T*;
-  using reverse_iterator = std::reverse_iterator<iterator>;
-  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+  using typename Vector<T, vector_impl::kGeneric>::value_type;
+  using typename Vector<T, vector_impl::kGeneric>::size_type;
+  using typename Vector<T, vector_impl::kGeneric>::difference_type;
+  using typename Vector<T, vector_impl::kGeneric>::reference;
+  using typename Vector<T, vector_impl::kGeneric>::const_reference;
+  using typename Vector<T, vector_impl::kGeneric>::pointer;
+  using typename Vector<T, vector_impl::kGeneric>::const_pointer;
+  using typename Vector<T, vector_impl::kGeneric>::iterator;
+  using typename Vector<T, vector_impl::kGeneric>::const_iterator;
+  using typename Vector<T, vector_impl::kGeneric>::reverse_iterator;
+  using typename Vector<T, vector_impl::kGeneric>::const_reverse_iterator;
 
   // Construct
   Vector() noexcept : Vector<T, vector_impl::kGeneric>(kMaxSize) {}
@@ -117,6 +118,8 @@
  private:
   friend class Vector<T, vector_impl::kGeneric>;
 
+  static_assert(kMaxSize <= std::numeric_limits<size_type>::max());
+
   // Provides access to the underlying array as an array of T.
   pointer array() { return std::launder(reinterpret_cast<T*>(&array_)); }
   const_pointer array() const {
@@ -135,7 +138,12 @@
 class Vector<T, vector_impl::kGeneric> {
  public:
   using value_type = T;
-  using size_type = size_t;
+
+  // Use unsigned short instead of size_t. Since Vectors are statically
+  // allocated, 65535 entries is a reasonable upper limit. This reduces Vector's
+  // overhead by packing the size and capacity into 32 bits.
+  using size_type = unsigned short;
+
   using difference_type = ptrdiff_t;
   using reference = value_type&;
   using const_reference = const value_type&;
@@ -243,11 +251,14 @@
   // (push_back, insert, etc.) will fail if full() is true.
   [[nodiscard]] bool full() const noexcept { return size() == max_size(); }
 
-  size_type size() const noexcept { return size_; }
+  // Returns the number of elements in the Vector. Uses size_t instead of
+  // size_type for consistency with other containers.
+  size_t size() const noexcept { return size_; }
 
-  size_type max_size() const noexcept { return max_size_; }
+  // Returns the maximum number of elements in this Vector.
+  size_t max_size() const noexcept { return max_size_; }
 
-  size_type capacity() const noexcept { return max_size(); }
+  size_t capacity() const noexcept { return max_size(); }
 
   // Modify
 
@@ -398,7 +409,7 @@
 void Vector<T, vector_impl::kGeneric>::resize(size_type new_size,
                                               const T& value) {
   if (size() < new_size) {
-    Append(std::min(max_size(), new_size) - size(), value);
+    Append(std::min(max_size(), size_t(new_size)) - size(), value);
   } else {
     while (size() > new_size) {
       pop_back();