pw_kvs: Move KeyDescriptor from iterator to Item

- Use a KeyDescriptor* instead of an index for consistency with other
  KeyDescriptor uses.
- Move KeyDescriptor to the Item class, since Item is more closely
  associated with the KeyDescriptor.

Change-Id: I0677bb7a5d6ef36708b93da5e02ff5de09ece686
diff --git a/pw_kvs/key_value_store.cc b/pw_kvs/key_value_store.cc
index 91b80d9..0282380 100644
--- a/pw_kvs/key_value_store.cc
+++ b/pw_kvs/key_value_store.cc
@@ -393,32 +393,30 @@
       key_descriptor, KeyDescriptor::kDeleted, key, {});
 }
 
+void KeyValueStore::Item::ReadKey() {
+  key_buffer_.fill('\0');
+
+  Entry entry;
+  if (Entry::Read(kvs_.partition_, descriptor_->address(), &entry).ok()) {
+    entry.ReadKey(key_buffer_);
+  }
+}
+
 KeyValueStore::iterator& KeyValueStore::iterator::operator++() {
   // Skip to the next entry that is valid (not deleted).
-  while (++index_ < item_.kvs_.key_descriptors_.size() &&
-         descriptor().deleted()) {
+  while (++item_.descriptor_ != item_.kvs_.key_descriptors_.end() &&
+         item_.descriptor_->deleted()) {
   }
   return *this;
 }
 
-const KeyValueStore::Item& KeyValueStore::iterator::operator*() {
-  std::memset(item_.key_buffer_.data(), 0, item_.key_buffer_.size());
-
-  Entry entry;
-  if (Entry::Read(item_.kvs_.partition_, descriptor().address(), &entry).ok()) {
-    entry.ReadKey(item_.key_buffer_);
-  }
-
-  return item_;
-}
-
 KeyValueStore::iterator KeyValueStore::begin() const {
-  size_t i = 0;
+  const KeyDescriptor* descriptor = key_descriptors_.begin();
   // Skip over any deleted entries at the start of the descriptor list.
-  while (i < key_descriptors_.size() && key_descriptors_[i].deleted()) {
-    i += 1;
+  while (descriptor != key_descriptors_.end() && descriptor->deleted()) {
+    ++descriptor;
   }
-  return iterator(*this, i);
+  return iterator(*this, descriptor);
 }
 
 // TODO(hepler): The valid entry count could be tracked in the KVS to avoid the