|  | // 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_ |