| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_WIN_ENUM_VARIANT_H_ | 
 | #define BASE_WIN_ENUM_VARIANT_H_ | 
 |  | 
 | #include <unknwn.h> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/win/iunknown_impl.h" | 
 |  | 
 | namespace base { | 
 | namespace win { | 
 |  | 
 | // A simple implementation of IEnumVARIANT. | 
 | class BASE_EXPORT EnumVariant | 
 |   : public IEnumVARIANT, | 
 |     public IUnknownImpl { | 
 |  public: | 
 |   // The constructor allocates an array of size |count|. Then use | 
 |   // ItemAt to set the value of each item in the array to initialize it. | 
 |   explicit EnumVariant(unsigned long count); | 
 |  | 
 |   // Returns a mutable pointer to the item at position |index|. | 
 |   VARIANT* ItemAt(unsigned long index); | 
 |  | 
 |   // IUnknown. | 
 |   ULONG STDMETHODCALLTYPE AddRef() override; | 
 |   ULONG STDMETHODCALLTYPE Release() override; | 
 |   STDMETHODIMP QueryInterface(REFIID riid, void** ppv) override; | 
 |  | 
 |   // IEnumVARIANT. | 
 |   STDMETHODIMP Next(ULONG requested_count, | 
 |                     VARIANT* out_elements, | 
 |                     ULONG* out_elements_received) override; | 
 |   STDMETHODIMP Skip(ULONG skip_count) override; | 
 |   STDMETHODIMP Reset() override; | 
 |   STDMETHODIMP Clone(IEnumVARIANT** out_cloned_object) override; | 
 |  | 
 |  private: | 
 |   ~EnumVariant() override; | 
 |  | 
 |   std::unique_ptr<VARIANT[]> items_; | 
 |   unsigned long count_; | 
 |   unsigned long current_index_; | 
 | }; | 
 |  | 
 | }  // namespace win | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_WIN_ENUM_VARIANT_H_ |