1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef BASE_WIN_ENUM_VARIANT_H_ 6#define BASE_WIN_ENUM_VARIANT_H_ 7 8#include <unknwn.h> 9 10#include "base/memory/scoped_ptr.h" 11#include "base/win/iunknown_impl.h" 12 13namespace base { 14namespace win { 15 16// A simple implementation of IEnumVARIANT. 17class BASE_EXPORT EnumVariant 18 : public IEnumVARIANT, 19 public IUnknownImpl { 20 public: 21 // The constructor allocates an array of size |count|. Then use 22 // ItemAt to set the value of each item in the array to initialize it. 23 explicit EnumVariant(unsigned long count); 24 25 // Returns a mutable pointer to the item at position |index|. 26 VARIANT* ItemAt(unsigned long index); 27 28 // IUnknown. 29 ULONG STDMETHODCALLTYPE AddRef() OVERRIDE; 30 ULONG STDMETHODCALLTYPE Release() OVERRIDE; 31 STDMETHODIMP QueryInterface(REFIID riid, void** ppv) OVERRIDE; 32 33 // IEnumVARIANT. 34 STDMETHODIMP Next(ULONG requested_count, 35 VARIANT* out_elements, 36 ULONG* out_elements_received); 37 STDMETHODIMP Skip(ULONG skip_count); 38 STDMETHODIMP Reset(); 39 STDMETHODIMP Clone(IEnumVARIANT** out_cloned_object); 40 41 private: 42 ~EnumVariant(); 43 44 scoped_ptr<VARIANT[]> items_; 45 unsigned long count_; 46 unsigned long current_index_; 47}; 48 49} // namespace win 50} // namespace base 51 52#endif // BASE_WIN_ENUM_VARIANT_H_ 53